Tworzysz jedną część polilinii z wieloczęściowej polilinii?


11

Mam polilinię, która jest podzielona na wieloczęściowe, a te części nie są dobrze uporządkowane, więc identyfikator wierzchołka nie jest zgodny z wykreśleniem polilinii.

Ta polilinia reprezentuje linię autobusu i muszę mieć fabułę podążającą drogą autobusu. Chciałbym wiedzieć, jak połączyć wieloczęściowe elementy tej polilinii?

Próbowałem już podzielić i nie wyświetlać, a także wielu części na jedną część, połączenia, scalania itp., Ale nikt nie daje mi pożądanego rezultatu.


@bmoussea, czy korzystałeś z narzędzia Dissolve?
grafika 21

@ artwork21 Tak zrobiłem, ale to nic nie zmienia: polilinia jest nadal podzielona na wiele części ...
bmoussea

Sprawdź geometrię, sprawdź, czy wieloczęściowa kolejność jest poprawnie zamówiona najpierw help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…, a następnie rozpuść grafiki 21 wspomnień
Mapperz

Sprawdziłem geometrię i nie zgłoszono żadnego problemu. Wieloczęściowe nie pojawiają się w checkgeometrii, ponieważ są już częścią polilinii.
bmoussea

Wieloczęściowe elementy mojej polilinii pojawiają się podczas edycji warstwy, na której znajduje się moja polilinia, a następnie kliknij prawym przyciskiem myszy na niej -> Edytuj wierzchołki i spójrz we właściwościach szkicu. Oto różne części (wieloczęściowe) mojej polilinii, które chciałbym scalić.
bmoussea

Odpowiedzi:


5

Z twoich tagów wynika, że ​​korzystasz z ArcGIS 10. Użyłem następującej metody do podobnego zadania:

1) Użyj Multipart do pojedynczej części

2) Użyj Unsplit

Aby to zadziałało (tzn. Aby linie były we właściwej kolejności), może być konieczne rozbicie linii na punkty końcowe składowych, a następnie zmiana kierunku na podstawie atrybutu (np. 1 = początek, 2 = koniec) - możesz tego użyć, aby warunkowo połączyć tylko te punkty, które są różne (jeśli 1 + 2, a następnie utwórz linie łączące).

Jeśli pracujesz z IDE, kod do zrobienia tego jest dość długi, ale zrobię co w mojej mocy, aby pomóc, jeśli masz konkretne pytania.


1
„Unsplit Line” wymaga licencji ArcInfo. Jeśli nie masz tego poziomu licencji, użyj „Dissolve”, ma ona opcję Unsplit Line.
klewis

1

Musiałem zrobić dokładnie to samo dość dawno temu, używając AV 3.x i Avenue. Szybko poszukałem kodu, ale nie mogłem go znaleźć. Jeśli dobrze pamiętam, logika wyglądała mniej więcej tak: (Miałem także przystanki autobusowe i terminale jako inny plik kształtu, więc mogłem określić części początkowe i końcowe):

  1. Utwórz pustą polilinię, aby otrzymać posortowane części. Nazwijmy to „posortowaną polilinią”
  2. Aby uzyskać pierwszą część:

    2a. Zdobądź część, która jest najbliższa do uruchomienia terminala

    2b. Uzyskaj odległości węzła początkowego i końcowego tej części do terminalu początkowego. Jeśli wierzchołek początkowy jest najbliższy, dodaj tę część do „posortowanej polilinii”. Jeśli to koniec - FLIP to, a następnie dodaj.

  3. Aby uzyskać środkową i końcową część, zacznij od części (polilinii), którą utworzyłeś w poprzednim kroku, aw krótkiej (prawdziwej) pętli zacznij porównywać odległość między końcowym węzłem pierwszej części do innych części na wejściu polilinia. Ten, który jest najbliższy, to „następna część”. Porównaj odległość początkowego i końcowego węzła następnej części, aby określić, czy ma być odwrócony, czy nie przed dodaniem go do „posortowanej polilinii”
  4. Wyjdź z pętli, gdy liczba części w „posortowanej polilinii” jest taka sama jak w polilinie wejściowej.

... czy jakoś tak! :-)

Daj mi znać, jeśli ma to dla Ciebie sens, a ja mogę poprosić o znalezienie mojego oryginalnego kodu Avenue.


1

Pracowałem w projekcie podobnym do tego, użyłem ArcObjects. Moim celem było połączenie dwóch sąsiadujących polilinii, jeśli jeden z jej punktów końcowych jest punktem początkowym innego, aby przekształcić dwie krótkie polilinie w jedną polilinię. Mój proces był:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey to klasa zawierająca punkt.
  • FeatureDataList to klasa zawierająca Listę IFeatures.
  • Obie klasy zastępują metody „Równa się” i „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);
        }
    }
    

Dzięki tym procesom stworzyłem dwa słowniki. Po utworzeniu słowników sprawdzam, czy oba słowniki zawierają ten sam punkt, a w obu słownikach ten klucz ma tylko jedną cechę na liście funkcji, a następnie utworzyłem nową polilinię z tymi dwiema poliliniami i usuwam dwie krótkie polilinie.

Aby połączyć dwie polilinie w jedną:

   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

Miałem dokładnie ten sam problem z powodu aktualizacji, które wprowadziłem na trasach autobusów za pomocą narzędzia „Zmień kształt”. Dissolve, Merge i Unsplit nie działały, ponieważ funkcje wieloczęściowe nie były przypadkowe.

Jeśli do tej pory tego nie zauważyłeś, przyjrzyj się bliżej wierzchołkom, które muszą pokrywać się między elementami wieloczęściowymi. W razie potrzeby rozszerz, przytnij lub zmień kształt, a następnie użyj dowolnego z wyżej wymienionych narzędzi.


Aha, a propos: „przez bliższe spojrzenie” mam na myśli BARDZO BARDZO BLISKO.
Abraham L

1
Miałem ten sam problem i znacznie bliżej przyjrzałem się końcom wierzchołków, jak sugeruje Abraham. W rzeczywistości nie byli połączeni. Włącz przyciąganie punktów końcowych i przyciągnij razem wierzchołki, problem rozwiązany .. dla mnie anyhoo.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.