Creare una polilinea da una polilinea multipart?


11

Ho una polilinea che è divisa in multiparti e queste parti non sono ben ordinate in modo che l'ID del vertice non stia seguendo la trama della polilinea.

Questa polilinea rappresenta una linea di autobus e ho bisogno di avere la trama seguendo il modo di guida del bus. Vorrei sapere come unire le multiparti di questa polilinea?

Ho già provato a dividere e separare, così come Multipart in Single Part, Union, Merge, ecc. Ma nessuno mi sta dando il risultato che desidero.


@bmoussea, hai usato lo strumento Dissolve?
artwork21

@ artwork21 Sì, l'ho fatto, ma non cambia nulla: la polilinea è ancora divisa in più parti ...
bmoussea,

Controlla Geometria per verificare che l'ordinazione multipla sia stata ordinata correttamente prima help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… quindi dissolvi un'illustrazione21 menzioni
Mapperz

Ho controllato la geometria e non sono stati segnalati problemi. Le multiparti non compaiono nella checkgeometria perché fanno già parte della polilinea.
bmoussea,

Le multiparti della mia polilinea appaiono quando si modifica il livello in cui si trova la mia polilinea, quindi fare clic con il tasto destro del mouse su di essa -> Modifica vertici e guardare nelle proprietà dello schizzo. Ecco le diverse parti (multiparti) della mia polilinea che vorrei unire.
bmoussea,

Risposte:


5

Vedo dai tuoi tag che stai eseguendo ArcGIS 10. Ho usato il seguente metodo per un compito simile:

1) Usa Multipart in Single Part

2) Usa Unsplit

Affinché ciò funzioni (ovvero affinché le linee siano nell'ordine corretto) potrebbe essere necessario spezzare la linea nei punti finali costituenti e quindi cambiare la direzione in base a un attributo (ad es. 1 = inizio, 2 = fine) - puoi usarlo per connettere in modo condizionale solo quei punti che sono diversi (Se 1 + 2 quindi crea linee di collegamento).

Se stai lavorando con un IDE, il codice per farlo è piuttosto lungo, ma farò del mio meglio per aiutarti se hai domande specifiche.


1
"Unsplit Line" richiede una licenza ArcInfo. Se non si dispone di questo livello di licenza, utilizzare "Dissolve", ha un'opzione Linea non divisa.
Klewis,

1

Ho dovuto fare esattamente la stessa cosa un po 'di tempo fa usando AV 3.xe Avenue. Ho dato una rapida occhiata al codice ma non sono riuscito a trovarlo. Se ricordo bene la logica è andata in questo modo: (avevo anche le fermate e i terminali del bus come un diverso shapefile del punto così sono stato in grado di determinare le parti di inizio e fine):

  1. Creare una polilinea vuota per ricevere le parti ordinate. Chiamiamola "polilinea ordinata"
  2. Per ottenere la prima parte:

    2a. Ottieni la parte più vicina all'avvio del terminale

    2b. Prendi le distanze del nodo iniziale e finale di questa parte al terminale iniziale. Se il vertice iniziale è il più vicino, aggiungi questa parte alla "polilinea ordinata". Se è la fine, FLIP e quindi aggiungerlo.

  3. Per ottenere le parti centrali e finali, iniziare con la parte (polilinea) creata nel passaggio precedente e in un ciclo while (true), iniziare a confrontare la distanza tra il nodo finale della prima parte con le altre parti nell'input polilinea. Quello più vicino è la "parte successiva". Confronta la distanza del nodo iniziale e finale della parte successiva per determinare se capovolgerlo o meno prima di aggiungerlo alla "polilinea ordinata"
  4. Esci dal ciclo quando il numero di parti nella "polilinea ordinata" è uguale a quello nella polilinea di input.

... o qualcosa di simile! :-)

Fammi sapere se questo ha senso per te e posso fare un altro tentativo per trovare il mio codice Avenue originale.


1

Ho lavorato in un progetto qualcosa di simile, ho usato ArcObjects. Il mio obiettivo era quello di collegare due polilinee adiacenti se uno dei suoi punti finali è il punto di partenza di un altro per creare due polilinee corte in una singola polilinea. Il mio processo è stato:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey è una classe che contiene un punto.
  • FeatureDataList è una classe che contiene un elenco di funzioni IF.
  • Entrambe le classi hanno la precedenza sui metodi "Equals" e "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);
        }
    }
    

Con questi processi ho creato due dizionari. Dopo aver creato i dizionari, controllo se entrambi i dizionari contengono lo stesso punto e in entrambi i dizionari, quella chiave ha una sola funzione nell'elenco delle caratteristiche, quindi ho creato una nuova polilinea con quelle due polilinee e ho eliminato due brevi polilinee.

Per unire due polilinee in una:

   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

Ho avuto esattamente lo stesso problema a causa degli aggiornamenti che ho apportato alle linee di autobus utilizzando lo strumento "Risagoma caratteristica". Dissolve, Merge e Unsplit non funzionavano perché le funzionalità multipart non erano coincidenti.

Se non lo hai notato ormai, dai un'occhiata più da vicino ai vertici che devono coincidere tra le tue funzioni multipart. Estendere, tagliare o rimodellare secondo necessità e quindi utilizzare uno degli strumenti sopra indicati.


Oh, e comunque: per "sguardo più attento" intendo MOLTO MOLTO VICINO.
Abraham L,

1
Ho avuto lo stesso problema e ho dato un'occhiata molto più da vicino ai vertici delle parti come suggerisce Abraham. In realtà, non erano collegati. Attiva lo snap all'endpoint e aggancia i vertici finali, problema risolto .. per me anyhoo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.