Distinguir linhas que se cruzam das linhas que tocam?


9

Como faço para distinguir esses casos no ArcGIS 10?

  • Caso 1 : os dois pontos finais de uma linha tocam outra linha
  • Caso 2 : os dois pontos de extremidade oscilam sobre as linhas que cruzam

Eu estou olhando para a função Trim Line , mas não é isso que eu quero (destrutivo).

O caso de uso do mundo real é distinguir entre estradas de serviço que conectam ambas as estradas de uma rodovia e outros casos de estradas que cruzam com rodovias.

insira a descrição da imagem aqui insira a descrição da imagem aqui

Respostas:


13

Para um único recurso de cada vez, é possível fazer isso de maneira bastante interativa, usando a caixa de diálogo Selecionar por local normal , usando a seguinte chave como um guia para os tipos de relacionamento espacial para sobreposições de linha em linha (em Selecionar por local: exemplos gráficos ):

imagem
(fonte: arcgis.com )

Selecionar linha usando a linha

INTERSECÇÃO A, C, D, E, F, G, H, I, J

CONTÉM G, H

COMPLETELY_CONTAINS G

CONTAINS_CLEMENTINI G, H

DENTRO DE F, H

COMPLETELY_WITHIN F

DENTRO_CLEMENTINI F, H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C, E

Os tipos de relacionamento relevantes nesse caso são INTERSECTe BOUNDARY_TOUCHES. Como você pode ver a partir do diagrama acima, você pode usar BOUNDARY_TOUCHESpara selecionar as características que tocam um ponto final da linha. Se exatamente dois recursos forem selecionados, você terá o seu Caso 1. Se um recurso não for tocado por nenhum outro recurso, mas apenas cruzado por eles, ele BOUNDARY_TOUCHESnão selecionará nada. INTERSECTselecionará todos os recursos que se cruzam, independentemente de tocarem em um endpoint ou não. Portanto, se você sabe que não há recursos tocando nos pontos de extremidade, mas descobre que há recursos se cruzando, então você tem o seu Caso 2.

Para automatizar o processo, você pode usar o seguinte script Python (implementado como uma ferramenta de script, se desejar) para calcular o número de toques e interseções para cada recurso em uma classe ou camada de recurso:

import arcpy

################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################

def countTouches(layer, feature):
    """Returns the number of times the boundary of a feature touches other
    features in the same feature layer."""
    return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")

def countIntersections(layer, feature):
    """Returns the number of times a feature intersects other features in the
    same feature layer."""
    return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer

def countSpatialRelation(layer, feature, relation):
    """Returns the number of times a feature meets the specified spatial
    relationship with other features in the same feature layer."""
    arcpy.SelectLayerByLocation_management(layer, relation, feature)
    count = int(arcpy.GetCount_management(layer).getOutput(0))
    return count

def addField(table, fieldName, fieldType):
    """Adds a fields of the given name and type to a table, unless a field with
    the same name already exists."""
    desc = arcpy.Describe(table)
    fieldInfo = desc.fieldInfo
    fieldIndex = fieldInfo.findFieldByName(fieldName)
    if fieldIndex == -1:
        # Field does not exist, add it
        arcpy.AddField_management(table, fieldName, fieldType)

def countTouchesAndIntersections(layer):
    """Adds and populates fields describing the number of times each feature
    touches and intersects other features in the feature layer."""
    addField(layer, numTouchesField, "LONG")
    addField(layer, numIntersectionsField, "LONG")
    desc = arcpy.Describe(layer)
    shapeField = desc.shapeFieldName
    rows = arcpy.UpdateCursor(layer)
    for row in rows:
        feature = row.getValue(shapeField)
        row.setValue(numTouchesField, countTouches(layer, feature))
        row.setValue(numIntersectionsField, countIntersections(layer, feature))
        rows.updateRow(row)
    del row, rows

if __name__ == "__main__":
    layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
    countTouchesAndIntersections(layer)

Após a execução, é possível consultar facilmente os recursos que tocam exatamente duas vezes e se cruzam exatamente duas vezes (Caso 1) e aqueles que tocam em 0 vezes e se cruzam exatamente duas vezes (Caso 2).

Consultas de definição de exemplo:

  • Caso 1 (toca duas vezes, cruza duas vezes):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • Caso 2 (não toca, cruza duas vezes):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

Veja a captura de tela abaixo para obter uma ilustração das instâncias dos dois casos encontrados: Captura de tela do ArcMap mostrando várias relações de interseção / toque de linha

Observe que, com dados do mundo real, normalmente os segmentos das ruas são divididos nos cruzamentos, e as oscilações ocorrem apenas quando as estradas passam umas sobre as outras como em uma passagem ou ponte. Portanto, normalmente você tem o mesmo número de recursos que se cruzam com o toque.

Para o caso mais geral, convém procurar quaisquer alterações, verificando se "NUM_INTERSECTIONS" > "NUM_TOUCHES".


Obrigado pela resposta elaborada. Estou com alguns problemas para transformá-lo em uma ferramenta de script (congela quando tento selecionar uma camada), mas estou confiante de que a abordagem é válida.
Mvexel

Mais um comentário: tive que reduzir o tamanho do nome do campo para menos de 10 caracteres (provavelmente porque a fonte da camada é um shapefile).
Mvexel

Parece haver uma URL para uma imagem de documentação do ArcGIS que se perdeu no início desta resposta.
PolyGeo

@PolyGeo qual? Parece bom para mim.
precisa saber é o seguinte

Estranho, a primeira foto (no que seria sobre a quarta linha) estava aparecendo ontem como uma pequena cruz. Hoje parece bom. Acho que o vi no navegador (que estou usando agora), e não no cliente iOS que uso com frequência.
PolyGeo

2

Linha dividida em vértices (gerenciamento de dados)

"Cria uma classe de recurso que contém linhas que são geradas pela divisão de linhas de entrada ou limites de polígonos em seus vértices"

Mantenha a atribuição.

insira a descrição da imagem aqui

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000


Não tenho certeza de como isso vai me ajudar, mas sei que poderia ter esclarecido o que preciso para conseguir um pouco melhor. Editou a pergunta.
precisa saber é o seguinte

-1

Que tal copiar a camada de recurso, aparar as linhas e comparar o recurso aparado definido com o original para encontrar os recursos que foram alterados? Não é bonito, quase certamente requer o uso de Python, mas parece que deve funcionar.


-1

Você também pode extrair os nós da rede. No caso 1, você obteria 2 nós, cada um com uma valência de 4. No caso 2, não há nós.


Você pode sugerir como fazer isso no ArcGIS?
blah238

Você pode usar o script ou a ferramenta de alguém para adicionar IDs exclusivos à polilinha que são os nós de e para. Eu sei que o Archydro faz isso, mas tenho certeza de que existem scripts no site do arcscripts que fazem isso. Então, de maneira não programada, você pode executar a ferramenta de frequência no campo from e, em seguida, no campo to node e somar, isso fornece a valência do nó na qual você pode associar novamente a uma camada de ponto que representa os nós.
precisa saber é o seguinte
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.