Eu tenho um grande arquivo de forma que contém todos os prédios e casas da cidade em que trabalho (aproximadamente 90.000 recursos). Os dados dos prédios / casas são salvos pelos engenheiros de inspeção da cidade e, devido às práticas inadequadas e ao acesso de diferentes inspectores a esses dados, muitos prédios / casas foram salvos duas vezes e aparecem no mapa como duplicados.
Alguns deles são exatamente duplicados (eles aparecem um sobre o outro) enquanto outros são duplicados com um espaço entre os dois objetos (como um objeto está dentro do outro - veja a captura de tela anexada).
Quero limpar esses dados para ter apenas os prédios / casas corretos na cidade, então minha pergunta é:
Existe alguma análise GIS ou expressão SQL que eu possa executar para encontrar todos os recursos duplicados (exatamente os que estão localizados dentro de outros)? Como tenho o ArcGIS e o QGIS, estou aberto a todas as suas sugestões.
Respostas:
no QGIS, o plug-in Topology Checker pode resolver seu problema
fonte
Gostaria de usar do Python itertools e uma SearchCursor uma maneira muito eficiente de encontrar as relações espaciais que são depois. Você pode incorporar os métodos de geometria
overlaps
,contains
eequal
para obter as propriedades de geometria.Comece criando uma função para organizar melhor o fluxo de trabalho e para repetibilidade
def findOverlaps(x):
Abra um cursor de pesquisa para percorrer a geometria do recurso individual
with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
use
itertools.combinations()
para retornar subsequências de elementos da entrada iterávelcur
for feature1,feature2 in itertools.combinations(cur, 2):
Acessar as propriedades de geometria com os seguintes métodos:
equals()
,overlaps()
, econtains()
. Estes são configurados em uma sequência lógica - você pode ajustá-lo para atingir seus objetivos específicos, se necessário.Executá-lo...
enter code here
findOverlaps (fc)A captura de tela mostra uma variedade de recursos que se sobrepõem, se sobrepõem e são idênticos e únicos.
fonte
Eu tenho uma idéia do que pode funcionar para você. Ele será baseado em algumas suposições, mas ajudaria a restringir sua lista de possíveis recursos idênticos. Isso não seria um processo automatizado, mas exigiria uma análise manual das duplicatas. Com base nos comentários, parece que as ferramentas automatizadas não comparam atributos, o que ajudaria você a não excluir recursos de forma acidental.
Usando o ArcMap
(1) Faça uma cópia do seu arquivo shapefile, caso algo dê errado.
(2) Adicione uma coluna ao seu shapefile como um duplo.
(3) Calcule a área para cada recurso usando o formato mais descritivo (mais preciso) possível. Algo em que o arredondamento pode não ser um problema.
(4) Execute um resumo (resumo) nessa coluna. Certifique-se de selecionar um identificador exclusivo no resumo e marcar o primeiro e o último.
(5) Na sua tabela de saída, procure os registros em que o campo de contagem é maior que 1.
(6a) Verifique manualmente os recursos e repita o processo até que não haja mais duplicatas.
(6b) Você pode apenas criar uma lista desses IDs exclusivos e excluir os recursos pelo arcpy, mas corre a chance de possivelmente ter dois recursos não idênticos na mesma área.
Outra técnica usando o ArcPy
Enquanto construía a resposta acima, pensei na possibilidade de que, de alguma forma, os vários autores desses dados possam realmente usar os mesmos identificadores exclusivos para recursos duplicados. Se for esse o caso, você poderá encontrar duplicatas através de loop no arcpy.
A maneira como eu pensaria em fazer isso usando o ArcPy poderia sobrecarregar o seu sistema e demorar um pouco.
(1) Faça uma cópia do seu shapefile (no caso novamente)
(2) Adicione uma nova coluna para indicar duplicatas. Algo que leva como 'y' ou 'n' ou 0 ou 1 ou o que quer que funcione.
(3) Crie uma lista em python para armazenar o identificador exclusivo.
(4) Execute um cursor de atualização (
arcpy.UpdateCursor('LAYERNAME')
). Para cada registro, verifique a lista para ver se ele contém esse identificador e marque sua coluna para duplicatas, se houver.(5) Em seguida, você pode comparar ou fazer o que quiser com as colunas marcadas.
Provavelmente, existem maneiras melhores de fazer essas comparações, mas essas são duas que, acredito, devem funcionar ou, pelo menos, começar.
Editar
Com base no comentário de elrobis , você pode utilizar o retângulo delimitador mínimo para diminuir ainda mais a chance de remover recursos incorretos.
Usando o ArcMap, você pode executar a ferramenta Geometria Limite Mínima no Gerenciamento de Dados. Depois de verificar as opções, acho que usar a opção CONVEX_HULL provavelmente seria o melhor.
Se você comparar os campos MBG_APodX / Y1 , MBG_APod_X / Y2 e MBG_Orientation para duplicatas, poderá ter uma boa idéia dos recursos duplicados. Eu sugeriria o uso do método Summarize que descrevi acima para comparar. Escolha um dos vértices (coordenadas) do retângulo delimitador para encontrar duplicatas. Você pode receber algumas "correspondências" incidentais, mas depois de adicionar outros vértices e orientação, seria uma aposta bastante segura que os recursos dos resultados sejam duplicados.
Embora eu não o tenha usado e não tenha certeza dos resultados dessa ferramenta, talvez seja mais fácil examinar o arquivo shapefile resultante se você usou a ferramenta Summary Statistics no ArcMap. Parece que você pode resumir várias colunas dessa maneira, em vez da minha opção de coluna única.
Eu não acho que haveria uma maneira totalmente automatizada de fazer isso sem ter a preocupação de excluir um recurso não duplicado. Esses métodos devem ajudar a limitar o número de recursos que você precisaria revisar manualmente.
fonte
Você pode fazer isso no SQL usando uma associação automática espacial. Você não indica qual dialeto SQL está usando; portanto, este exemplo usa o Postgres / Postgis, mas pode ser facilmente adaptado ao Oracle ou SQL Server. Supondo uma tabela chamada edifícios, com a geometria armazenada em uma coluna chamada geom:
Isso encontrará as interseções. Se você deseja igualdade total, substitua ST_Intersects por ST_Equals. Ou, apenas combine os dois:
Observe que o a.id <b.id significa que você considera apenas metade dos casos na união automática, o que torna a) mais rápido eb) fornece uma lista que você pode usar para excluir metade dos polígonos sobrepostos sem excluir todos eles . Claramente, esse ainda é um algoritmo O (n²), mas, na prática, será muito mais rápido se você tiver um índice espacial - o que é realmente um requisito total para qualquer conjunto de dados não triviais.
Pode ser necessário massagear isso um pouco para se encaixar em alguma definição de sobreposição - você não deseja excluir as casas vizinhas que foram mal pesquisadas.
fonte
a.rowid
vez dea.id
.rowid
é uma palavra-chave no SQLite que fornecerá o ID interno do conjunto de dados.O plug-in Verificador de Topologia é uma boa ferramenta, se usado corretamente. Você ainda precisa ter um entendimento fundamental de seus dados E precisa fazer as 'correções' manualmente. O plug-in destacará o que considera erros. Cabe a você examinar cada um deles e tomar a decisão apropriada para você e seus dados. Com 90.000 itens em sua camada, você pode estar em casa no Natal!
fonte