Identificar relaciones topológicas usando PostGIS

16

Estoy tratando de realizar un análisis de tipología básica usando PostGIS. Mi objetivo es encontrar cualquier polígono que toque otros polígonos. Para hacer esto, pensé ST_GetFaceEdgesque funcionaría ( referencia ). Quiero verificar cada polígono en mi base de datos y enumerar todos los otros polígonos que lo tocan. En la imagen a continuación, esperaría que el resultado diga que dos de los polígonos (que son edificios) tocan un edificio, y los resultados de los otros 4 dicen que tocan 0 polígonos.

ingrese la descripción de la imagen aquí

Sin embargo, estoy teniendo dificultades para entender qué hacer. Cuando intenté copiar el ejemplo, había algunas partes que no entendía.

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

No estoy seguro de si topologyes el nombre de una tabla, columna o parte de la función. Supuse que era la mesa, pero no estoy seguro.

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Tampoco estoy seguro de cuál es la función de la unión interna: ¿esto une el resultado al objeto original?

djq
fuente
44
Sé que Underdark ha respondido esto con sus diagramas característicamente claros, pero algo de lo que no estoy seguro es si sus polígonos están topológicamente relacionados en primer lugar. La topología, en este caso, implica una relación lógica entre entidades separadas de su representación visual, y (en PostGIS) requiere configurar un esquema con CreateTopologyy así sucesivamente ( bit.ly/oLk8QY ) Pero me parece la forma en que sus edificios están digitalizados. como si fueran topológicamente distintos a pesar de la cercanía visual de sus bordes. Es algo para que los futuros interrogadores sean conscientes.
MerseyViking
¿Significaría esto que necesito agregar un AddTopoGeometryColumna la tabla antes de ejecutar la consulta? Con base en los resultados de ST_Toucheslos valores que verifiqué, todo tenía sentido, pero tal vez fue por casualidad.
djq
1
No solo necesitaría llamar AddTopoGeometryColumn, sino que sus datos tendrían que digitalizarse de manera topológicamente consistente. Por ejemplo, tradicionalmente digitalizaría dos casas adosadas como dos polígonos y usaría "ajustar al vértice" en su SIG para garantizar que la pared se toque, pero se almacenará como dos líneas coincidentes con puntos coincidentes en cada extremo. Pero digitalizarlos topológicamente significa que el muro compartido realmente es solo una línea y dos nodos compartidos por cada polígono. ST_Touchessolo hace una verificación espacial de cercanía, no una topológica.
MerseyViking

Respuestas:

19

En su lugar, podría usar ST_Touches :

ST_Touches: devuelve VERDADERO si las geometrías tienen al menos un punto en común, pero sus interiores no se cruzan.

ST_Touches devuelve VERDADERO por ejemplo

ingrese la descripción de la imagen aquí

Obtener los recuentos debería funcionar de la siguiente manera:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id
bajo oscuro
fuente
Sin embargo, estoy interesado en saber cuántos polígonos toca cada polígono. De lo contrario, es perfecto, ¡y lo tengo para correr!
DJ
1
Me acabo de dar cuenta de que devuelve un valor verdadero / falso para cada caso, así que todo lo que necesito hacer es contar cuántos valores verdaderos hay. ¡Gracias!
DJ
55
Se agregó una posible consulta de conteo.
oscuro