11 votos

¿Cómo hacer una polilínea una parte de una polilínea varias partes?

Tengo una polilínea que se divide en multipartites y estas piezas no están bien ordenadas de modo que el vértice del ID no están siguiendo la polilínea del trazado.

Esta polilínea es una representación de una línea de autobús y necesito el trazado siguiendo el estilo de la conducción del autobús. Me gustaría saber cómo combinar los multipartites de esta polilínea?

Ya he intentado separar y Unsplit, así como de Varias partes a una Sola Parte, Unión, Fusión, etc. pero nadie me está dando el resultado que quiero.

Podría alguien ayudarme? Gracias! BM

6voto

Markus Olsson Puntos 12651

Puedo ver en sus etiquetas que se están ejecutando ArcGIS 10. He utilizado el siguiente método para una tarea similar:

1) el Uso de Varias partes a una Sola Parte

2) El Uso De Unsplit

En orden para que esto funcione (es decir, de modo que usted tiene las líneas en el orden adecuado) que usted puede necesitar para romper la línea en la constituyente, puntos finales y, a continuación, cambiar la dirección basada en un atributo (por ejemplo, 1 = inicio, 2 = final) - usted puede usar esto para condicionalmente conectar sólo los puntos que son diferentes (Si 1 + 2, a continuación, crear líneas de conexión).

Si estás trabajando con un IDE el código para hacer esto es muy largo, pero voy a hacer mi mejor esfuerzo para ayudar si usted tiene preguntas específicas.

1voto

Tim C Puntos 25946

He trabajado en un proyecto algo similar a esto, he usado de ArcObjects. Mi objetivo era conectar dos adyacentes polilíneas si uno de ellos es el punto final es otro punto de partida para hacer dos breves polilíneas 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 IFeatures.
  • Ambas clases reemplaza "Igual a" y "GetHashCode" métodos.

    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);
        }
    }
    

Por estos procesos he hecho dos diccionarios. Después de la creación de diccionarios, puedo comprobar si ambos diccionarios contienen el mismo punto y en ambos diccionarios, que la clave sólo tiene una característica en función de la lista, a continuación, he creado una nueva polilínea con los dos polilíneas y eliminar dos polilíneas.

Para unir dos polilíneas en uno:

   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;
  }

1voto

Rafael Almeida Puntos 141

Tuve que hacer exactamente lo mismo bastante tiempo atrás usando AV 3.x y de la Avenida. Tuve un vistazo al código, pero no podía encontrarla. Si recuerdo correctamente la lógica, fue algo como esto: (yo también tenía las paradas de autobuses y terminales como un punto diferente shapefile con lo que yo era capaz de determinar el inicio y el final de las piezas):

  1. Crear un vacío de la polilínea para recibir la ordenada partes. Vamos a llamarlo el 'ordenado polilínea'
  2. Para obtener la primera parte:

    2a. Obtener la parte que está más cerca de iniciar terminal

    2b. Obtener las distancias de el inicio y el nodo final de esta parte para el inicio de la terminal. Si el inicio del vértice más cercano es el de un complemento de esta parte de la 'ordenado polilínea'. Si es el fin - se da la vuelta y, a continuación, agregarlo.

  3. Para obtener el medio y el final de las piezas, empezar con la parte (polilínea) que creó en el paso anterior y dentro de un while(true) bucle, empezar a comparar la distancia entre el nodo final de la primera parte a las otras partes en la entrada de la polilínea. El más cercano es el "siguiente parte". Comparar la distancia de el inicio y el nodo final de la siguiente parte para determinar si a la vuelta o no antes de añadir a la 'ordenado polilínea'
  4. Salir del bucle cuando el número de parte en el 'ordenado polilínea' es la misma que en la entrada de la polilínea.

... o algo por el estilo! :-)

Déjame saber si esto tiene sentido para usted y yo podemos tener otra oportunidad de encontrar mi original de la Avenida de código.

0voto

Learning Puntos 5386

¿Has probado con la herramienta disolver? toolboxes\system toolboxes\data gestión tools.tbx\generalization\dissolve

He utilizado la herramienta de polígonos en el pasado, y sólo hizo un buen trabajo para mí con una línea de parte de multi.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X