Para cada um dos 208.781 grupos de blocos do Censo, gostaria de recuperar os IDs do FIPS de todos os seus vizinhos de primeira ordem. Eu tenho todos os limites do TIGER baixados e mesclados em um único shapefile de 1 GB.
Eu tentei um script ArcPython que usa SelectLayerByLocation para BOUNDARY_TOUCHES em seu núcleo, mas leva mais de 1 segundo para cada grupo de blocos mais lento do que eu gostaria. Isso ocorre mesmo depois de eu limitar a pesquisa SelectLayerByLocation para bloquear grupos no mesmo estado. Encontrei esse script , mas ele também usa SelectLayerByLocation internamente, para que não seja mais rápido.
A solução não precisa ser baseada em Arc - estou aberto a outros pacotes, apesar de me sentir mais confortável em codificar com Python.
Respostas:
Se você tem acesso ao ArcGIS 10.2 for Desktop, ou possivelmente mais cedo, acho que a ferramenta Polygon Neighbors (Analysis) que:
pode tornar essa tarefa muito mais fácil agora.
fonte
Para uma solução que evita o ArcGIS, use pysal . Você pode obter os pesos diretamente dos shapefiles usando:
ou
Vá para os documentos para obter mais informações.
fonte
Apenas uma atualização. Depois de seguir o conselho de Whuber, descobri que a matriz Generate Spatial Weights simplesmente usa loops e dicionários Python para determinar vizinhos. Reproduzi o processo abaixo.
A primeira parte percorre todos os vértices de cada grupo de blocos. Ele cria um dicionário com coordenadas de vértice como as chaves e uma lista de IDs de grupos de blocos que possuem um vértice nessa coordenada como valor. Observe que isso requer um conjunto de dados topologicamente limpo, pois apenas a sobreposição perfeita de vértices / vértices será registrada como um relacionamento vizinho. Felizmente, os shapefiles do grupo de blocos TIGER do Census Bureau estão bem nesse aspecto.
A segunda parte percorre todos os vértices de cada grupo de blocos novamente. Ele cria um dicionário com os IDs do grupo de blocos como as chaves e os IDs vizinhos do grupo de blocos como os valores.
Em retrospectiva, percebo que poderia ter usado um método diferente para a segunda parte que não exigisse um loop pelo shapefile novamente. Mas é isso que eu usei e funciona muito bem, mesmo para milhares de grupos de blocos de cada vez. Eu não tentei fazê-lo com os EUA inteiros, mas pode ser executado para um estado inteiro.
fonte
Uma alternativa pode ser usar o PostgreSQL e o PostGIS . Fiz algumas perguntas sobre como executar cálculos semelhantes neste site:
Descobri que havia uma curva de aprendizado acentuada para descobrir como as várias partes do software se encaixavam, mas achei maravilhoso fazer cálculos em grandes camadas vetoriais. Fiz alguns cálculos de vizinhos mais próximos em milhões de polígonos e foi rápido em comparação com o ArcGIS.
fonte
Apenas alguns comentários ... o método esri / ArcGIS atualmente usa dicionários para armazenar as informações, mas os cálculos principais são feitos em C ++ usando a ferramenta Polygon Neighbors. Essa ferramenta gera uma tabela que contém as informações de contiguidade, bem como atributos opcionais, como o comprimento do limite compartilhado. Você pode usar a Ferramenta de matriz Gerar pesos espaciais se desejar armazenar e subsequentemente reutilizar as informações repetidamente. Você também pode usar esta função no WeightsUtilities para gerar um dicionário [acesso aleatório] com as informações de contiguidade:
onde inputFC = qualquer tipo de classe de recurso de polígono, masterField é o campo "ID exclusivo" de números inteiros e contiguityType em {"ROOK", "QUEEN"}.
Há esforços na esri para ignorar o aspecto tabular dos usuários do Python e ir diretamente para um iterador que tornaria muitos casos de uso muito mais rápidos. PySAL e o pacote spdep em R são alternativas fantásticas [veja a resposta de radek] . Eu acho que você é obrigado a usar shapefiles como o formato de dados nesses pacotes que está em sintonia com este formato de entrada de threads. Não sabe ao certo como eles lidam com polígonos sobrepostos e polígonos dentro de polígonos. Gere SWM, bem como a função que descrevi contará essas relações espaciais como vizinhos "ROOK" E "QUEEN".
fonte