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.

RyanKDalton
fonte
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.

Sean
fonte
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.

Pablo
fonte
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