Función de comparación de características PostGIS?

9

Me gustaría poder comparar las características de la Capa 1 (fuente) con las características de la Capa 2 (actualizaciones de la fuente) para ver si alguna de las características de la geometría y / o atributos ha cambiado. También me gustaría tener un "informe" generado que indique lo que ha cambiado.

Editar para aclarar: los cambios en la geometría también incluyen la búsqueda de características que se han agregado a la nueva capa de datos. Puede ser interesante tener eliminaciones, pero las adiciones son más importantes.

He estado revisando las funciones de PostGIS y parece que no puedo encontrar ninguna herramienta diseñada para comparar e informar diferencias entre las características de 2 capas, tanto la geometría como los atributos.

Estoy buscando algo similar a la herramienta ArcGIS " Feature Compare ".

Si no hay nada como esto en PostGIS, ¿hay otras herramientas de código abierto que respondan a este tipo de preguntas? Gracias.

RyanKDalton
fuente
¿No sería más fácil usar algún tipo de sistema de versiones? ¿O ya tienes esas dos capas y tienes que lidiar con ellas ahora?
oscuro
Definitivamente sería más fácil usar el control de versiones, excepto que los datos no son de mi propiedad ni los mantengo. Son datos que se proporcionan en actualizaciones trimestrales, en una variedad de formatos (generalmente archivos de forma), y quiero averiguar qué características y atributos han cambiado entre las actualizaciones.
RyanKDalton

Respuestas:

7

Puede hacer comparaciones en filas en PostgreSQL con constructores de filas . Supongo que esto funcionaría con campos de geometría, pero no lo he probado.

Dadas dos tablas donde las características coincidentes tienen el mismo campo de identificación en cada una, podría hacer 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

Actualización: Esto funciona con campos de geometría en mis pruebas.

Actualización 2: Aquí hay un ejemplo más completo basado en sus criterios.

Tablas: 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)

Eso debería darte lo que estás buscando. Probablemente desee cambiar la cláusula 'no en' a 'no existe' para un mejor rendimiento.

Sean
fuente
Eso ignoraría cualquier adición o eliminación al conjunto de datos (donde una identificación solo está presente en una tabla), ¿no?
relet
1
La pregunta no menciona las eliminaciones o adiciones, pero podría unirlas fácilmente con una consulta para encontrar las que son nuevas o eliminadas. También podría trabajar en la diferencia entre las características.
Sean
Sean, este es un gran concepto que parece realmente prometedor. 1) Esto encuentra todas las características que son iguales, ¿cómo podría encontrar todos los cambios? 2) ¿Cuál sería el mejor método para unir este resultado a las características cambiadas (geometrías), para que pueda comparar visualmente las características cambiadas con las características de origen?
RyanKDalton
@Ryan: Encuentra ambos: debería regresar si las filas son idénticas (Verdadero o Falso) para cada par de identificadores idénticos.
relet
@Sean: Estoy muy cerca de hacer que esto funcione, pero cuando intenté hacer UNION (como lo usé en la respuesta ST_EQUALS) para incluir todas las nuevas geometrías, no pude hacerlo funcionar porque decía que necesitaba el mismo número de filas en mi consulta de unión. Row () = Row () crea una columna booleana que no existe en mis datos de origen (parte de la declaración UNION), entonces, ¿cómo puedo crear / hacer referencia a una columna "falsa" en mi consulta UNION para que coincida con la FILA ( ) = FILA () seleccionar sentencia?
RyanKDalton
2

La función ST_Equals(geometryA, geometryB)devuelve VERDADERO si son espacialmente iguales.

Pablo
fuente
¿Esto compara dos capas o solo dos características específicas ? Además, ¿qué significa "espacialmente igual"? ¿Significa que representan el mismo conjunto de puntos en la tierra, o significa que representan el mismo conjunto de puntos exactamente de la misma manera ? (Este último es más estricto.)
whuber
Lo que realmente quería obtener como resultado eran todas las geometrías en la capa A (actualizada) que se habían agregado o cambiado desde la capa B (original). Pude lograr ese resultado con la siguiente sintaxis: SELECCIONE A. campos de A EXCEPTO SELECCIONE A. campos de A, B DONDE ST_EQUALS (A.geom, B.geom). El resultado son todas las geometrías de entidades de la capa A que han cambiado o agregado. ¡Gracias!
RyanKDalton