Einteilige Polylinie aus mehrteiliger Polylinie machen?


11

Ich habe eine Polylinie, die in mehrere Teile unterteilt ist, und diese Teile sind nicht gut geordnet, so dass die ID des Scheitelpunkts nicht der Darstellung der Polylinie folgt.

Diese Polylinie stellt eine Buslinie dar, und ich muss die Darstellung der Fahrbahn des Busses folgen lassen. Ich möchte wissen, wie man die Multiparts dieser Polylinie zusammenführt.

Ich habe bereits versucht, Split und Unsplit sowie Multipart to Single Part, Union, Merge usw. zu erstellen, aber niemand gibt mir das gewünschte Ergebnis.


@bmoussea, hast du das Dissolve-Tool verwendet?
Artwork21

@ Artwork21 Ja, ich habe, aber es ändert nichts: Die Polylinie ist immer noch in mehrteilige
Teile

Geometrie überprüfen Vergewissern Sie sich, dass das Mehrteil richtig bestellt ist. Zuerst help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//… dann ein Kunstwerk auflösen21 Erwähnungen
Mapperz

Ich habe die Geometrie überprüft und es wurden keine Probleme gemeldet. Die mehrteiligen Teile werden in der Checkgeometrie nicht angezeigt, da sie bereits Teil der Polylinie sind.
Bmoussea

Die mehrteiligen Teile meiner Polylinie werden angezeigt, wenn Sie die Ebene bearbeiten, auf der sich meine Polylinie befindet, und dann mit der rechten Maustaste darauf klicken -> Scheitelpunkte bearbeiten und in den Skizziereigenschaften nachsehen. Hier sind die verschiedenen Teile (mehrteilige) meiner Polylinie, die ich zusammenführen möchte.
Bmoussea

Antworten:


5

Aus Ihren Tags geht hervor, dass Sie ArcGIS 10 ausführen. Für eine ähnliche Aufgabe habe ich die folgende Methode verwendet:

1) Verwenden Sie Multipart to Single Part

2) Verwenden Sie Unsplit

Damit dies funktioniert (dh damit Sie die Linien in der richtigen Reihenfolge haben), müssen Sie möglicherweise die Linie in die Endpunkte der Bestandteile aufteilen und dann die Richtung basierend auf einem Attribut ändern (z. B. 1 = Start, 2 = Ende). - Damit können Sie nur die Punkte bedingt verbinden, die unterschiedlich sind (Wenn 1 + 2, dann Verbindungslinien erstellen).

Wenn Sie mit einer IDE arbeiten, ist der Code dafür ziemlich lang, aber ich werde mein Bestes tun, um Ihnen zu helfen, wenn Sie spezielle Fragen haben.


1
Für "Unsplit Line" ist eine ArcInfo-Lizenz erforderlich. Wenn Sie nicht über diese Lizenzstufe verfügen, verwenden Sie "Auflösen". Es gibt eine Option "Zeile aufteilen".
Klewis

1

Ich musste vor einiger Zeit genau das Gleiche mit AV 3.x und Avenue tun. Ich habe schnell nach dem Code gesucht, ihn aber nicht gefunden. Wenn ich mich richtig erinnere, ging die Logik ungefähr so: (Ich hatte auch die Bushaltestellen und Terminals als ein anderes Punkt-Shapefile, damit ich die Start- und Endteile bestimmen konnte):

  1. Erstellen Sie eine leere Polylinie, um die sortierten Teile zu erhalten. Nennen wir es die "sortierte Polylinie".
  2. So erhalten Sie den ersten Teil:

    2a. Holen Sie sich das Teil, das dem Start des Terminals am nächsten liegt

    2b. Holen Sie sich die Abstände des Start- und Endknotens dieses Teils zum Startterminal. Wenn der Startscheitelpunkt der nächstgelegene ist, fügen Sie diesen Teil der 'sortierten Polylinie' hinzu. Wenn es das Ende ist, drehen Sie es um und fügen Sie es dann hinzu.

  3. Um die Mittel- und Endteile zu erhalten, beginnen Sie mit dem Teil (Polylinie), das Sie im vorherigen Schritt erstellt haben, und vergleichen Sie innerhalb einer while-Schleife (true) den Abstand zwischen dem Endknoten des ersten Teils und den anderen Teilen in der Eingabe Polylinie. Derjenige, der am nächsten ist, ist der 'nächste Teil'. Vergleichen Sie den Abstand des Start- und Endknotens des nächsten Teils, um festzustellen, ob er umgedreht werden soll oder nicht, bevor Sie ihn zur 'sortierten Polylinie' hinzufügen.
  4. Verlassen Sie die Schleife, wenn die Anzahl der Teile in der 'sortierten Polylinie' mit der in der Eingabepolylinie übereinstimmt.

... oder etwas ähnliches! :-)

Lassen Sie mich wissen, ob dies für Sie sinnvoll ist, und ich kann meinen ursprünglichen Avenue-Code erneut suchen.


1

Ich habe in einem ähnlichen Projekt gearbeitet und ArcObjects verwendet. Mein Ziel war es, zwei benachbarte Polylinien zu verbinden, wenn einer der Endpunkte der Startpunkt eines anderen ist, um zwei kurze Polylinien zu einer einzigen Polylinie zu machen. Mein Prozess war:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey ist eine Klasse, die einen Punkt enthält.
  • FeatureDataList ist eine Klasse, die eine Liste von IFeatures enthält.
  • Beide Klassen überschreiben die Methoden "Equals" und "GetHashCode".

    Dictionary<PointKey, FeatureDataList> ToPointDictionary;
    Dictionary<PointKey, FeatureDataList> FromPointDictionary;
    public void CreateDictionary(IFeatureLayer featureLayer)
    {
        var featureFunctionality = new FeatureFunctionality();
        List<IFeature> features = GetAllFeatures(featureLayer.FeatureClass);
    
        foreach (var feature in features)
        {
            IPolyline polyline = GetPolylineFromFeature(feature);
            AddFeatureInDictionary(ToPointDictionary, feature, polyline.ToPoint);
            AddFeatureInDictionary(FromPointDictionary, feature, polyline.FromPoint);
        }
    }
    
    
    
    void AddFeatureInDictionary(Dictionary<PointKey, FeatureDataList> polylineDictionary, IFeature feature, IPoint point)
    {
        FeatureDataList featureDataList;
        PointKey key = PointKey.GetKey(point);
        if (!polylineDictionary.ContainsKey(key))
        {
            featureDataList = new FeatureDataList();
            featureDataList.Add(feature);
            polylineDictionary.Add(key, featureDataList);
        }
        else
        {
            featureDataList = polylineDictionary[key];
            featureDataList.Add(feature);
        }
    }
    

Durch diese Prozesse habe ich zwei Wörterbücher erstellt. Nach dem Erstellen von Wörterbüchern überprüfe ich, ob beide Wörterbücher denselben Punkt enthalten, und in beiden Wörterbüchern hat dieser Schlüssel nur ein Merkmal in der Merkmalsliste. Dann habe ich eine neue Polylinie mit diesen beiden Polylinien erstellt und zwei kurze Polylinien gelöscht.

So verbinden Sie zwei Polylinien zu einer:

   private IPolyline GetJoinedPolylineFromFeatures(List<IFeature> features)
   {
        IPolyline newPolyline = null;
        if (features.Count == 2)
        {
            IPolyline polyline1 = feature1.Shape as IPolyline;
            IPolyline polyline2 = feature2.Shape as IPolyline;
            if (PointKey.GetKey(polyline1.ToPoint).Equals(PointKey.GetKey(polyline2.FromPoint)))
            {
                var topoOperator2 = polyline1 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline2) as IPolyline;
            }
            else if (PointKey.GetKey(polyline1.FromPoint).Equals(PointKey.GetKey(polyline2.ToPoint)))
            {
                var topoOperator2 = polyline2 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline1) as IPolyline;
            }
        }
        return newPolyline;
  }

1

Ich hatte genau das gleiche Problem aufgrund von Aktualisierungen, die ich mit dem Tool "Umformungsfunktion" an Buslinien vorgenommen habe. Dissolve, Merge und Unsplit funktionierten nicht, da die mehrteiligen Funktionen nicht übereinstimmten.

Wenn Sie dies bis jetzt noch nicht bemerkt haben, schauen Sie sich die Eckpunkte genauer an, die zwischen Ihren mehrteiligen Merkmalen übereinstimmen müssen. Nach Bedarf ausfahren, trimmen oder umformen und dann eines der oben genannten Werkzeuge verwenden.


Oh, und übrigens: Mit "genauer hinsehen" meine ich SEHR SEHR NAH.
Abraham L

1
Ich hatte das gleiche Problem und sah mir die Eckpunkte des Teilendes viel genauer an, wie Abraham vorschlägt. Sie waren tatsächlich nicht verbunden. Aktivieren Sie das Einrasten des Endpunkts und schnappen Sie die Endscheitelpunkte zusammen. Das Problem ist gelöst. Für mich jedenfalls.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.