Função de comparação do recurso PostGIS?


9

Gostaria de poder comparar os recursos da Camada 1 (origem) com os da Camada 2 (atualizações para a origem) para verificar se alguma das características e / ou atributos da geometria foram alterados. Eu também gostaria de ter um "relatório" gerado informando o que mudou.

Editar para esclarecimento: as alterações na geometria também incluem a localização de recursos que foram adicionados à nova camada de dados. As exclusões podem ser interessantes, mas as adições são mais importantes.

Eu estive examinando as funções do PostGIS e não consigo encontrar nenhuma ferramenta projetada para comparar e relatar diferenças entre os recursos de duas camadas, geometria e atributos.

Estou procurando algo semelhante à ferramenta ArcGIS " Compare Compare ".

Se não houver nada parecido no PostGIS, existem outras ferramentas de código aberto que responderão a esses tipos de perguntas? Obrigado.


Não seria mais fácil usar algum tipo de sistema de versão? Ou você já tem essas duas camadas e precisa lidar com elas agora?
— Subterrâneo

Definitivamente, seria mais fácil usar a versão, exceto que os dados não pertencem ou são mantidos por mim. São dados fornecidos em atualizações trimestrais, em uma variedade de formatos (geralmente shapefiles), e eu quero descobrir quais recursos e atributos foram alterados entre as atualizações.
— RyanKDalton

Respostas:


7

Você pode fazer comparações entre linhas no PostgreSQL com construtores de linha . Eu estou supondo que isso funcionaria com campos de geometria, mas eu não tentei.

Dadas duas tabelas em que os recursos correspondentes têm o mesmo campo de identificação em cada um, você pode fazer algo como:

select ROW(t1.att1, t1.att2, t1.geom) = ROW(t2.att1, t2.att2, t2.geom)
from t1, t2
where t1.id = t2.id

Atualização: isso funciona com campos de geometria nos meus testes.

Atualização 2: veja um exemplo mais completo com base em seus critérios.

Tabelas: t1 (id, att1, att2, geom) t2 (id, att1, att2, geom)

-- return the id and geometry from the updated table if the attributes or
-- geometry have changed or it's a new feature.

select t2.id, t2.geom
from t1, t2
where
  ( t1.id = t2.id and row(t1.att1, t1.att2, t1.geom) != row(t2.att1, t2.att2, t2.geom))
  or
  t2.id not in (select id from t1)

Isso deve lhe dar o que você está procurando. Você provavelmente desejará alterar a cláusula 'não dentro' para 'não existe' para obter melhor desempenho.


Isso ignoraria quaisquer adições ou exclusões no conjunto de dados (onde um ID está presente apenas em uma tabela), não?
— precisa

1
A pergunta não menciona exclusões ou adições, mas você pode facilmente associá-la a uma consulta para encontrar novas ou excluídas. Você também pode trabalhar na diferença entre os recursos.
— Sean

Sean, esse é um ótimo conceito que parece realmente promissor. 1) Isso encontra todos os recursos iguais, como eu encontraria todas as alterações? 2) Qual seria o melhor método para associar esse resultado aos recursos alterados (geometrias), para que você pudesse comparar visualmente os recursos alterados aos recursos de origem?
— precisa saber é o seguinte

@ Ryan: Ele encontra os dois - deve retornar se as linhas forem idênticas (Verdadeiro ou Falso) para cada par de IDs idênticos.
— relet 14/04

@Sean: Estou muito perto de fazer esse trabalho, mas quando tentei fazer uma UNIÃO (como usei na resposta ST_EQUALS) para incluir todas as novas geometrias, não consegui fazê-lo funcionar porque dizia: precisava do mesmo número de linhas na minha consulta de união. Row () = Row () cria uma coluna booleana que não existe nos meus dados de origem (parte da instrução UNION), então como criar / referenciar uma coluna "falsa" na minha consulta UNION para corresponder à ROW ( ) = ROW () selecionar instrução?
— precisa saber é o seguinte

2

A função ST_Equals(geometryA, geometryB)retornará TRUE se forem espacialmente iguais.


Isso compara duas camadas ou apenas dois recursos específicos ? Além disso, o que significa "espacialmente igual"? Isso significa que eles representam o mesmo conjunto de pontos na Terra ou significa que eles representam o mesmo conjunto de pontos exatamente da mesma maneira ? (Este último é mais rigoroso.)
— whuber

O que eu realmente queria obter como resultado foram todas as geometrias da camada A (atualizadas) que foram adicionadas ou alteradas desde a camada B (original). Consegui realizar esse resultado com a seguinte sintaxe: SELECT A.fields FROM A EXCEPT SELECT A.fields FROM A, B WHERE ST_EQUALS (A.geom, B.geom). O resultado são todas as geometrias de recursos da camada A que foram alteradas ou adicionadas. Obrigado!
— RyanKDalton
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.