Desejo cortar um conjunto de polilinhas (linhas pretas na imagem abaixo) no limite externo de um polígono. Quaisquer vazios dentro do polígono devem ser ignorados. Minha saída ideal são as linhas amarelas tracejadas. As linhas iniciais podem ou não ser retas. A imagem é um exemplo simplificado, na realidade o polígono é muito mais complexo e existem centenas de linhas. Não acho que um casco convexo funcionaria (mas posso estar errado). Estou aberto a soluções em arcgis, qgis, arcpy, bem torneado, etc. A codificação preferencialmente seria em python, pois estou aberto a outras opções, se necessário. A Arcgis também seria preferível para facilitar a partilha dos meus colegas de trabalho, mas isso não é um requisito.
O melhor que consigo pensar agora é cruzar uma linha individual com o polígono, criando um conjunto de pontos em todas as interseções de fronteira. Classifique os pontos por distância até o início da linha. Os pontos mais distantes e próximos (FAC) serão o limite externo do polígono. Em seguida, use os pontos FAC para selecionar os vértices adequados da linha original e crie a linha tracejada amarela a partir dos pontos apropriados. Deve funcionar, mas parece mais complicado do que o necessário.
Alguns pensamentos adicionais:
- As linhas são lineares "o suficiente" para que um cálculo simples da distância entre pontos funcione; a referência linear não deve ser necessária.
- Isso seria fácil no arcpy se houvesse uma ferramenta para dividir uma linha em um ponto, mas não consigo encontrar uma.
Pensamentos alguém?
fonte
Respostas:
Eu quero jogar na minha solução pyQGIS, nada mais.
Meu caso de teste - antes do recorte:
Após o recorte:
Para obter o conjunto completo de atributos das linhas originais, acho que seria melhor juntá-las ao resultado. Caso contrário, eles devem ser criados na seção de preparação e configurados no loop mais interno. Mas não testei se eles passam no processo de dissolução ou se perdem, porque em princípio eles podem ter valores diferentes.
fonte
Se você executar o Integrate com os polígonos e linhas como entradas, ele adicionará um vértice a cada onde eles cruzam. Cuidado, pois o Integrate modifica entradas em vez de produzir novas saídas.
Quando tiver certeza de que existem vértices coincidentes, você pode percorrer os vértices da linha e testar para ver se cada um deles toca o outro recurso. Na lista ordenada de vértices que tocam, tire o mínimo e o máximo do conjunto. Em seguida, faça duas linhas de cada recurso, A: (início, ..., min) e B: (máximo, ..., final).
Outra opção, embora não tenha certeza se o ArcPy preserva a ordem das peças do recurso com base na ordem dos vértices no objeto de entrada, seria executar o clipe como está. Para a linha do meio no seu exemplo, deve resultar em um recurso de várias partes com três partes. Dependendo da ordem, você pode iterar todas as linhas de várias partes produzidas pelo Clip e remover tudo, exceto a primeira e a última parte do recurso de saída múltipla.
fonte
Há três questões a serem enfrentadas neste caso:
Furos
Como qualquer linha dentro de um furo será mantida, remova os orifícios dos polígonos. No script abaixo, faço isso usando cursores e geometrias.
Linhas entre polígonos
As linhas que tocam em dois polígonos precisam ser removidas. No script abaixo, faço isso executando uma junção espacial de
one to many
, com minhas linhas como minha classe de recurso de entrada e meus polígonos como minha classe de recurso de junção. Qualquer linha que é gerada duas vezes toca em dois polígonos e é removida.Linhas finais
Para remover linhas que tocam apenas um polígono em uma extremidade, eu converto linhas em pontos finais. Utilizo então as camadas e seleções de recursos para determinar quais pontos finais são flutuantes. Eu seleciono os pontos finais que cruzam os polígonos. Eu então mudo minha seleção. Isso seleciona pontos finais que não cruzam polígonos. Seleciono qualquer linha que cruze esses pontos selecionados e os apago.
Resultado
Premissas
erase
e afeature vertices to points
)Roteiro
O script abaixo gera uma classe de recurso com o nome da sua classe de recurso de linha plus
_GreedyClip
, no mesmo banco de dados geográfico da sua classe de recurso de linha. Um local de espaço de trabalho também é necessário.fonte