¿Hacer una parte de polilínea a partir de polilínea multiparte?

11

Tengo una polilínea que se divide en imágenes prediseñadas y estas partes no están bien ordenadas, por lo que la ID del vértice no sigue el trazado de la polilínea.

Esta polilínea representa una línea de autobús y necesito que el trazado siga el camino de conducción del autobús. ¿Me gustaría saber cómo fusionar las imágenes prediseñadas de esta polilínea?

Ya he tratado de dividir y no dividir, así como de multiparte a una sola parte, unión, fusión, etc., pero nadie me está dando el resultado que quiero.

bmoussea
fuente
@bmoussea, ¿usaste la herramienta Disolver?
artwork21
@ artwork21 Sí, lo hice, pero no cambia nada: la polilínea todavía está dividida en
imágenes prediseñadas
Check Geometry verifica que la parte múltiple esté ordenada correctamente primero help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... luego disuelve una obra de arte21 menciones
Mapperz
Verifiqué la geometría y no se informaron problemas. Las imágenes prediseñadas no aparecen en la verificación de geometría porque ya son partes de la polilínea.
bmoussea
Las imágenes prediseñadas de mi polilínea aparecen cuando edito la capa donde está mi polilínea, y luego haga clic derecho sobre ella -> Editar vértices y busque en las Propiedades del boceto. Aquí están las diferentes partes (múltiples imágenes prediseñadas) de mi polilínea que me gustaría fusionar.
bmoussea

Respuestas:

5

Veo por sus etiquetas que está ejecutando ArcGIS 10. He utilizado el siguiente método para una tarea similar:

1) Usar multiparte para una sola parte

2) Use Unsplit

Para que esto funcione (es decir, para que tenga las líneas en el orden correcto), es posible que deba dividir la línea en los puntos finales constituyentes y luego cambiar la dirección en función de un atributo (por ejemplo, 1 = inicio, 2 = final) - puede usar esto para conectar condicionalmente solo aquellos puntos que son diferentes (si 1 + 2, entonces cree líneas de conexión).

Si está trabajando con un IDE, el código para hacerlo es bastante largo, pero haré todo lo posible para ayudarlo si tiene preguntas específicas.

Radar
fuente
1
"Línea no dividida" requiere una licencia de ArcInfo. Si no tiene este nivel de licencia, utilice "Disolver", tiene una opción de Línea no dividida.
klewis
1

Tuve que hacer exactamente lo mismo hace bastante tiempo usando AV 3.xy Avenue. Eché un vistazo rápido al código pero no pude encontrarlo. Si recuerdo correctamente, la lógica fue algo como esto: (también tenía las paradas de autobús y las terminales como un archivo de forma de punto diferente, por lo que pude determinar las partes inicial y final):

  1. Cree una polilínea vacía para recibir las partes ordenadas. Vamos a llamarlo la 'polilínea ordenada'
  2. Para obtener la primera parte:

    2a. Obtenga la parte más cercana a la terminal de inicio

    2b. Obtenga las distancias del nodo inicial y final de esta parte al terminal de inicio. Si el vértice de inicio es el más cercano, agregue esta parte a la 'polilínea ordenada'. Si es el final, inviértalo y luego agréguelo.

  3. Para obtener las partes intermedias y finales, comience con la parte (polilínea) que creó en el paso anterior y dentro de un ciclo while (verdadero), comience a comparar la distancia entre el nodo final de la primera parte y las otras partes en la entrada polilínea La más cercana es la 'siguiente parte'. Compare la distancia del nodo inicial y final de la siguiente parte para determinar si se debe voltear o no antes de agregarlo a la 'polilínea ordenada'
  4. Salga del bucle cuando el número de parte en la 'polilínea ordenada' sea el mismo que en la polilínea de entrada.

... ¡o algo así! :-)

Avíseme si esto tiene sentido para usted y puedo intentar encontrar mi código original de Avenue.

mapoholic
fuente
1

Trabajé en un proyecto algo similar a esto, usé ArcObjects. Mi objetivo era conectar dos polilíneas adyacentes si uno de sus puntos finales es el punto de partida de otro para hacer dos polilíneas cortas en una sola polilínea. Mi proceso fue:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey es una clase que contiene un punto.
  • FeatureDataList es una clase que contiene la Lista de características IF.
  • Ambas clases anulan los métodos "Equals" y "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);
        }
    }
    

Mediante estos procesos hice dos diccionarios. Después de crear diccionarios, verifico si ambos diccionarios contienen el mismo punto y en ambos diccionarios, esa clave solo tiene una característica en la lista de características, luego creé una nueva polilínea con esas dos polilíneas y eliminé dos polilíneas cortas.

Para unir dos polilíneas en 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;
  }
Emi
fuente
1

Tuve exactamente el mismo problema debido a las actualizaciones que realicé en las rutas de autobuses con la herramienta "Rehacer función". Disolver, fusionar y no dividir no funcionaban porque las características de varias partes no coincidían.

Si aún no se ha dado cuenta de esto, eche un vistazo más de cerca a los vértices que deben coincidir entre sus entidades multiparte. Extienda, recorte o cambie la forma según sea necesario y luego use cualquiera de las herramientas mencionadas anteriormente.

Abraham L
fuente
Ah, y por cierto: por "mirar más de cerca" me refiero a MUY MUY CERCA.
Abraham L
1
Tuve el mismo problema y eché un vistazo mucho más de cerca a los vértices del extremo de la parte como sugiere Abraham. De hecho, no estaban conectados. Active el ajuste de punto final y junte los vértices finales juntos, problema resuelto ... para mí de todos modos.