Gerar tabela próxima para o número x de vizinhos usando o arcpy

9

Existem três cenários prováveis ​​que estou tentando capturar perto de distâncias para:

  1. Uma estação de metrô de intercâmbio, que possui 2 ou mais estações vizinhas. Ou seja, a estação em questão conecta 2 ou mais rotas principais e possui 2 ou mais estações vizinhas.
  2. Uma estação de metrô terminal, que possui apenas 1 estação vizinha. Esta é a estação no final da linha.
  3. Uma estação de metrô em linha, com exatamente 2 estações vizinhas, uma das duas abordagens.

Estou tentando calcular um valor que se poderia chamar de "distância média entre estações vizinhas"

O arcpy.GenerateNearTable_analysis()pode lidar com duas opções: Distância ao recurso mais próximo e Distância entre todos os recursos.

Alguém tem um método inteligente para resolver esses cenários? Observe que cada estação é designada como "Intercâmbio", "Terminal" ou "Inline" na tabela de atributos no campo "StationType".

Adicionado:

Aqui está um código psuedo com base na sugestão do @ whuber nos comentários. Ainda não tenho tempo para descobrir isso, por isso, se alguém quiser dar uma facada, você será recompensado com uma marca de seleção! ;)

Dei uma olhada na biblioteca NetworkX e ela parece funcionar como eu quero.

Dado o gráfico:

A —― B ―― C ―― D
     |
     E

bem como os nós e links:

Nodes = ["A", "B", "C", "D", "E"]
Links = [("A", "B"), ("B", "C"), ("C", "D"), ("B", "E")]

def myFunction(node):
    identify the links that node belongs to
    count the number of links
    calculate the total link lengths
    divide the total link lengths by the number of links
    return someValue
Michael Markieta
fonte
Acho que também posso mencionar que estou usando o ArcGIS 10.1 e adoro o módulo arcpy.da (por sua velocidade). Espero que possamos usar isso.
Michael Markieta
3
FWIW, este é um problema puramente teórico de gráfico com uma solução padrão: você procura o gráfico de vizinhança de cada vértice. Está disponível quase imediatamente assim que você representa a rede em um formato padrão, como um DCEL (ou uma generalização se a rede não for plana). Isso sugere que algumas soluções Python prontas para uso podem estar disponíveis.
whuber

Respostas:

5

Acredito que seu problema, como @whuber, sugeriu que seria melhor representado em uma Matriz de Adjacência . Ou seja, se você tiver tempo e inclinação para entender a teoria por trás dela, em vez de depender de um pacote para fazer o trabalho por você.

Para um dado gráfico G, com vértices de {v 1 , v 2 , ..., v n } em que n é o número de vértices, é necessário criar uma matriz de tamanho M i, j onde i = ne j = n. Cada vértice é então representado na i- ésima linha pelo número de caminhos encontrados para vértices adjacentes na j- ésima coluna.

Exemplo abaixo:

insira a descrição da imagem aqui

Dada essa forma levemente complexa de representar seus dados relativamente simples, você precisará numerar seus vértices de maneira arbitrária, não representativa de nenhuma ordem lógica.

OBSERVAÇÃO: Assumindo que nenhuma estação faça loops, uma k- ésima linha nunca terá um valor diferente de 0 na k- ésima coluna. Todas as definições abaixo assumem que isso é verdade

NOTA: Supondo que não haja linhas simultâneas entre a mesma estação, todos os exemplos abaixo assumem que um valor de célula será apenas 1 ou 0. O exemplo acima também pressupõe que o deslocamento bidirecional seja permitido.

Regras para identificar categorias de estações:

1. Terminal

Um terminal seria identificado por uma k linha th tendo uma única coluna que não tem um valor de 0, e que o valor é 1. Ver vértices 1, 2, e 3 no exemplo 1 acima.

2. Junção

Uma junção iria ser identificado por um k -ésima linha tendo mais do que duas colunas contendo um valor de 1. Ver o vértice 4 no exemplo 1 acima, em alternativa, todos os vértices no exemplo 3 acima.

3. Inline

Uma estação em linha é significada por ter exatamente 2 colunas em uma k- ésima linha em que o valor é 1. Veja todas as vértices no exemplo 2 acima. (Ignore o fato de que {v 1 , v 3 } cruza {v 2 , v 4 }).

nagytech
fonte
Quem é você e de onde você veio! Essa foi uma das melhores respostas que recebi há muito tempo. Obrigado @Geoist.
22612 Michael Markieta
@MichaelMarkieta História engraçada, eu aprendi sobre isso duas horas antes de ver seu post.
Nagytech 17/07/2012
1

Você pode tentar usar o Shapely . Se você converter seus pontos arcpy em pontos bem torneados, poderá calcular a distância entre pontos individuais.

import arcpy
import shapely

arc_point1 = arcpy.Point(1,1)
arc_point2 = arcpy.Point(5,5)

shp_point1 = shapely.geometry.Point(arc_point1.X, arc_point1.Y)
shp_point2 = shapely.geometry.Point(arc_point2.X, arc_point2.Y)

distance = shp_point1.distance(shp_point2)
print "distance:", distance
Cyrus
fonte
Devo mencionar que Shapely só pode ser usado para recursos em um plano cartesiano, portanto esse método não funcionará se seus dados estiverem em coordenadas geográficas.
Cyrus
Essa resposta sugere uma ambiguidade na maneira como a pergunta pode ser entendida. Eu li a pergunta como indicando as distâncias conhecidas; seu cálculo não parece ser o problema. O que o OP busca, acredito, é um algoritmo para identificar um número variável de vizinhos imediatos dos vértices ao longo de uma rede, até o final de recuperar suas distâncias e calcular um resumo estatístico deles (como uma média).
whuber
@whuber Oops! Concordo, respondi à pergunta um pouco apressadamente.
Cyrus
@whuber está na marca.
hhart
Isso não vai funcionar para mim, mas obrigado!
22612 Michael Markieta