Análise GIS para encontrar geometrias duplicadas

9

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).

insira a descrição da imagem aqui

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.

GIS_DBA
fonte
Você pode tentar explorar a ferramenta Excluir identificação . No entanto, requer um nível de licença corporativa. Você pode revisar algumas outras opções disponíveis no Artigo técnico 36031. O ArcGIS fornece uma maneira de identificar ou remover recursos com geometrias duplicadas, sua melhor aposta é a extensão do revisor de dados . nenhuma dessas ferramentas abordará suas geometrias divididas
MDHald
Além disso, você precisará considerar que os componentes tabulares não serão comparados na ferramenta excluir idêntica. Eu sei que não é uma resposta, mas espero que ajude na resolução de problemas.
precisa saber é o seguinte
Os dados estão em um banco de dados? Qual tipo?
Russell no ISC
Uma opção pode estar usando a ferramenta Intersect (conforme descrito nesta resposta ) no ArcMap, que produziria qualquer local de sobreposição. Isso exigiria a verificação e a decisão manuais de qual polígono excluir, mas no caso de duplicatas não exatas, acho que você precisaria fazer isso de qualquer maneira.
Erica
4
O uso do termo "duplicado" é um pouco enganador nesta questão. No caso de cópias empilhadas exatas e idênticas, sim, elas são (ou podem ser - os atributos podem variar) duplicadas e, como outras pessoas sugeriram, a ferramenta Excluir ou Localizar idêntico pode ser útil se você tiver esse nível de licença. Mas se eles são deslocados, ou com uma forma diferente, não são realmente duplicados por si só. Se você tiver uma licença avançada, eu examinaria uma topologia de geodatabase, executando a verificação Não deve se sobrepor. Sem o Advanced, talvez o mesmo possa ser feito com o QGIS e um plugin, como sugere a resposta de Luigi.
Chris

Respostas:

4

no QGIS, o plug-in Topology Checker pode resolver seu problema

Luigi Pirelli
fonte
3
Concordo que uma topologia é provavelmente a melhor solução para o problema de limpeza dos dados. No entanto, você pode expandir um pouco sua resposta, fornecendo um link para o plug-in e uma breve descrição do que é ou faz a topologia e qual verificação você executaria. Receio que sua resposta digitada provavelmente seja sinalizada como de baixa qualidade.
Chris
ok: uma descrição do plug-in está aqui: docs.qgis.org/2.2/en/docs/user_manual/plugins/… e "não deve se sobrepor" pode abordar o problema. Um guia em vídeo do plug-in está aqui: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli
6

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 , containse equalpara obter as propriedades de geometria.

  1. Comece criando uma função para organizar melhor o fluxo de trabalho e para repetibilidade

    def findOverlaps(x):

  2. Abra um cursor de pesquisa para percorrer a geometria do recurso individual

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. use itertools.combinations()para retornar subsequências de elementos da entrada iterávelcur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Acessar as propriedades de geometria com os seguintes métodos: equals(), overlaps(), e contains(). Estes são configurados em uma sequência lógica - você pode ajustá-lo para atingir seus objetivos específicos, se necessário.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. Executá-lo...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

insira a descrição da imagem aqui

A captura de tela mostra uma variedade de recursos que se sobrepõem, se sobrepõem e são idênticos e únicos.

insira a descrição da imagem aqui

Aaron
fonte
2

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.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(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.

Branco
fonte
Estou assumindo que eram polígonos. Se forem linhas, você pode usar o comprimento. Os pontos são mais fáceis com as coordenadas X / Y.
Branco
2
Também pensei em "recursos de área igual", mas me parece provável que as pegadas de prédio tenham o mesmo tipo de formas o suficiente para criar correspondências não intencionais. Eu acho que melhoraria as chances de refinar ainda mais as coisas com uma interseção MBR dos recursos. Ou seja, se eles tiverem a mesma área (e puderem ser o mesmo recurso) E seus MBRs se cruzarem, talvez seja provável que sejam duas gerações do mesmo recurso. Isso faz sentido?
elrobis
2

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:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Isso encontrará as interseções. Se você deseja igualdade total, substitua ST_Intersects por ST_Equals. Ou, apenas combine os dois:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

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.

John Powell
fonte
Se estiver faltando um atributo exclusivo no shapefile, você poderá usar em a.rowidvez de a.id. rowidé uma palavra-chave no SQLite que fornecerá o ID interno do conjunto de dados.
LuWi
1

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!

Johanna
fonte