Fazendo uma parte de polilinha a partir de polilinha multipartes?


11

Eu tenho uma polilinha que é dividida em multipartes e essas partes não são bem ordenadas para que o ID do vértice não esteja seguindo a plotagem da polilinha.

Esta polilinha representa uma linha de ônibus e eu preciso ter a plotagem seguindo a direção do ônibus. Gostaria de saber como mesclar as multipartes dessa polilinha?

Eu já tentei dividir e cancelar a divisão, assim como multipartes para peça única, união, mesclagem, etc. mas ninguém está me dando o resultado que eu quero.


@bmoussea, você usou a ferramenta Dissolve?
artwork21

@ artwork21 Sim, eu fiz, mas não muda nada: a polilinha ainda é dividido em multiparts ...
bmoussea

Verifique Geometria verificar se o multi-parte é ordenada corretamente primeira help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... seguida, dissolver uma artwork21 menciona
Mapperz

Eu verifiquei a geometria e não há nenhum problema relatado. As multipartes não aparecem na checkgeometria porque já fazem parte da polilinha.
bmoussea

As multipartes da minha polilinha aparecem ao editar a camada em que minha polilinha está e clique nela com o botão direito -> Editar vértices e procure nas Propriedades do esboço. Aqui estão as diferentes partes (multipartes) da minha polilinha que eu gostaria de mesclar.
bmoussea

Respostas:


5

Vejo pelas suas tags que você está executando o ArcGIS 10. Usei o seguinte método para uma tarefa semelhante:

1) Use Multipart para peça única

2) Use Unsplit

Para que isso funcione (ou seja, para que você tenha as linhas na ordem correta), pode ser necessário dividir a linha nos pontos finais constituintes e depois alterar a direção com base em um atributo (por exemplo, 1 = início, 2 = final) - você pode usar isso para conectar condicionalmente apenas os pontos diferentes (se 1 + 2, crie linhas de conexão).

Se você estiver trabalhando com um IDE, o código para fazer isso é bastante longo, mas farei o possível para ajudar se você tiver perguntas específicas.


1
"Linha não dividida" requer uma licença ArcInfo. Se você não possui esse nível de licença, use "Dissolver", ele possui a opção Linha não dividida.
klewis

1

Eu tive que fazer exatamente o mesmo há algum tempo, usando o AV 3.xe Avenue. Eu dei uma olhada rápida no código, mas não o encontrei. Se bem me lembro, a lógica foi mais ou menos assim: (eu também tinha os pontos de ônibus e os terminais como um shapefile de ponto diferente, para poder determinar as partes inicial e final):

  1. Crie uma polilinha vazia para receber as peças classificadas. Vamos chamá-lo de 'polilinha classificada'
  2. Para obter a primeira parte:

    2a Obter a peça mais próxima do terminal de partida

    2b. Obtenha as distâncias do nó inicial e final desta peça até o terminal inicial. Se o vértice inicial for o mais próximo, adicione esta parte à 'polilinha classificada'. Se for o final, vire-o e adicione-o.

  3. Para obter as partes intermediárias e finais, comece com a parte (polilinha) que você criou na etapa anterior e dentro de um loop while (true), comece a comparar a distância entre o nó final da primeira parte e as outras partes na entrada polilinha. O que está mais próximo é a 'próxima parte'. Compare a distância do nó inicial e final da próxima peça para determinar se é necessário invertê-lo ou não antes de adicioná-lo à 'polilinha classificada'
  4. Saia do loop quando o número de peça na 'polilinha classificada' for o mesmo que na polilinha de entrada.

... ou algo assim! :-)

Deixe-me saber se isso faz sentido para você e eu posso tentar encontrar meu código original da Avenue.


1

Eu trabalhei em um projeto parecido com isso, usei o ArcObjects. Meu objetivo era conectar duas polilinhas adjacentes se um dos pontos finais fosse o ponto de partida de outra para transformar duas polilinhas curtas em uma única polilinha. Meu processo foi:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey é uma classe que contém um ponto.
  • FeatureDataList é uma classe que contém List of IFeatures.
  • Ambas as classes substituem os métodos "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);
        }
    }
    

Por esses processos, criei dois dicionários. Depois de criar dicionários, verifico se os dois dicionários contêm o mesmo ponto e, nos dois dicionários, essa chave possui apenas um recurso na lista de recursos, criei uma nova polilinha com essas duas polilinhas e excluo duas polilinhas curtas.

Para unir duas polilinhas em uma:

   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

Eu tive exatamente o mesmo problema devido às atualizações que fiz nas rotas de ônibus usando a ferramenta "Remodelar recurso". Dissolve, Merge e Unsplit não estavam funcionando porque os recursos de várias partes não eram coincidentes.

Se você ainda não percebeu isso, dê uma olhada nos vértices que devem coincidir entre os recursos de várias partes. Estenda, apare ou reformule conforme necessário e, em seguida, use qualquer uma das ferramentas mencionadas acima.


Ah, e a propósito: por "olhar mais de perto", quero dizer MUITO MUITO PERTO.
Abraham L

1
Eu tive o mesmo problema e olhei mais de perto os vértices das extremidades, como sugere Abraham. Eles não estavam, de fato, conectados. Ative o snap-endpoint e encaixe os vértices finais juntos, problema resolvido .. para mim anyhoo.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.