Identification des relations topologiques à l'aide de PostGIS


16

J'essaie d'effectuer une analyse de typologie de base à l'aide de PostGIS. Mon objectif est de trouver tous les polygones qui touchent d'autres polygones. Pour ce faire, j'ai pensé que ST_GetFaceEdgescela fonctionnerait ( référence ). Je veux vérifier chaque polygone de ma base de données et répertorier tous les autres polygones qui le touchent. Dans l'image ci-dessous, je m'attendrais à ce que le résultat indique que deux des polygones (qui sont des bâtiments) touchent un bâtiment, et les résultats des 4 autres à dire qu'ils touchent 0 polygones.

entrez la description de l'image ici

Cependant, j'ai du mal à comprendre quoi faire. Quand j'ai essayé de copier l'exemple, il y en avait quelques parties que je ne comprenais pas.

-- 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;

Je ne sais pas s'il topologys'agit du nom d'une table, d'une colonne ou d'une partie de la fonction. J'ai supposé que c'était la table, mais je ne suis pas sûr.

-- 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;

Je ne sais pas non plus quelle est la fonction de la jointure interne - cela joint-il le résultat à l'objet d'origine?


4
Je sais que underdark a répondu à cela avec ses diagrammes d'une clarté caractéristique, mais je ne suis pas sûr de savoir si vos polygones sont liés topologiquement en premier lieu. La topologie, dans ce cas, implique une relation logique entre les entités distincte de leur représentation visuelle, et (dans PostGIS) nécessite la mise en place d'un schéma avec CreateTopologyet ainsi de suite ( bit.ly/oLk8QY ) Mais la façon dont vos bâtiments sont numérisés me semble comme ils sont topologiquement distincts malgré la proximité visuelle de leurs bords. Juste quelque chose pour les futurs questionneurs.
MerseyViking

Cela signifie-t-il que je dois ajouter un AddTopoGeometryColumnà la table avant d'exécuter la requête? Sur la base des résultats des ST_Touchesvaleurs que j'ai vérifiées, tout était logique, mais c'était peut-être par hasard.
djq

1
Non seulement vous devrez appeler AddTopoGeometryColumn, mais vos données devront être numérisées de manière topologiquement cohérente. Par exemple, traditionnellement, vous numérisiez deux maisons jumelées en deux polygones et utilisiez «aligner au sommet» dans votre SIG pour garantir les touches de mur partagées, mais il sera stocké sous la forme de deux lignes coïncidentes avec des points coïncidents à chaque extrémité. Mais leur numérisation topologique signifie que le mur partagé n'est en réalité qu'une seule ligne et deux nœuds partagés par chaque polygone. ST_Touchesfait juste une vérification spatiale de la proximité, pas topologique.
MerseyViking

Réponses:


19

Vous pouvez utiliser ST_Touches à la place:

ST_Touches - Retourne TRUE si les géométries ont au moins un point en commun, mais que leurs intérieurs ne se coupent pas.

ST_Touches renvoie VRAI pour par exemple

entrez la description de l'image ici

Obtenir les chiffres devrait fonctionner comme ceci:

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

Je voudrais savoir combien de polygones chaque polygone touche cependant. Sinon, c'est parfait, et je l'ai fait fonctionner!
djq

1
Je viens de réaliser qu'il renvoie une valeur vraie / fausse pour chaque cas, donc tout ce que j'ai à faire est de compter le nombre de valeurs vraies. Merci!
djq

5
Ajout d'une requête de comptage possible.
underdark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.