J'ai une table de polygones PostGIS où certains s'entrecroisent. C'est ce que j'essaie de faire:
- Pour un polygone donné sélectionné par id, donnez-moi tous les polygones qui se croisent. Fondamentalement,
select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
- À partir de ces polygones, je dois créer un nouveau polygone tel que l'intersection devienne un nouveau polygone. Donc, si le polygone A coupe le polygone B, j'aurai 3 nouveaux polygones: A moins AB, AB et B moins AB.
Des idées?
postgis
polygon
intersection
atogle
la source
la source
Réponses:
Puisque vous avez dit que vous obteniez un groupe de polygones se croisant pour chaque polygone qui vous intéresse, vous pouvez créer ce que l'on appelle une "superposition de polygone".
Ce n'est pas exactement ce que fait la solution d'Adam. Pour voir la différence, regardez cette image d'une intersection ABC:
Je crois que la solution d’Adam créera un polygone "AB" couvrant à la fois les surfaces "AB! C" et "ABC", ainsi qu’un polygone "AC" recouvrant "AC! B" et "ABC", ainsi que " BC "polygone qui est" BC! A "et" ABC ". Ainsi, les polygones de sortie "AB", "AC" et "BC" chevaucheraient tous la zone "ABC".
Une superposition de polygone produit des polygones qui ne se chevauchent pas. AB! C serait donc un polygone et ABC, un polygone.
Créer une superposition de polygones dans PostGIS est en réalité assez simple.
Il y a essentiellement trois étapes.
L'étape 1 consiste à extraire le trait (notez que j'utilise l' anneau extérieur du polygone, cela devient un peu plus compliqué si vous voulez gérer correctement les trous):
L'étape 2 consiste à "nouer" le travail de ligne (produire un nœud à chaque intersection). Certaines bibliothèques comme JTS ont des classes "Noder" que vous pouvez utiliser pour cela, mais dans PostGIS, la fonction ST_Union le fait pour vous:
L'étape 3 consiste à créer tous les polygones possibles qui ne peuvent pas se chevaucher et qui peuvent provenir de toutes ces lignes, à l'aide de la fonction ST_Polygonize :
Vous pouvez enregistrer la sortie de chacune de ces étapes dans une table temporaire ou les combiner dans une seule instruction:
J'utilise ST_Dump parce que la sortie de ST_Polygonize est une collection de géométries et qu'il est (généralement) plus pratique de disposer d'un tableau dans lequel chaque ligne est l'un des polygones constituant la superposition de polygone.
la source
ST_ExteriorRing
laisse tomber tous les trous.ST_Boundary
préservera les anneaux intérieurs, mais créera également un polygone à l'intérieur.Si je comprends bien, vous voulez prendre (A est la géométrie de gauche, B est la droite):
Image de A∪B http://img838.imageshack.us/img838/3996/intersectab1.png
Et extrait:
A ∖ AB
Image de A ∖ AB http://img830.imageshack.us/img830/273/intersectab2.png
UN B
Image de l’AB http://img828.imageshack.us/img828/7413/intersectab3.png
et B ∖ AB
Image de B ∖ AB http://img839.imageshack.us/img839/5458/intersectab4.png
C’est-à-dire trois géométries différentes pour chaque paire qui se croise.
Commençons par créer une vue de toutes les géométries qui se croisent. En supposant que le nom de votre table soit
polygons_table
, nous utiliserons:Maintenant, nous avons une vue (pratiquement, une table en lecture seule) qui stocke des paires de zones géographiques se coupant, où chaque paire n'apparaît qu'une seule fois en raison de la
t1.id<t2.id
condition.Maintenant , nous allons rassembler vos intersections -
A∖AB
,AB
etB∖AB
, à l' aide de SQLUNION
sur les trois requêtes:Remarques:
&&
opérateur sert de filtre devant l'intersects
opérateur pour améliorer les performances.VIEW
requête gigantesque au lieu d'une. Ceci est pour la commodité seulement.AB
est l'union et non l'intersection deA
etB
- Utilisez ST_Union au lieu de st_intersection à laUNION
requête aux endroits appropriés.∖
signe est un signe Unicode pour Set difference; supprimez-le du code s'il confond votre base de données.la source
Ce que vous décrivez, c’est la façon dont l’ opérateur Union fonctionne dans ArcGIS, mais c’est un peu différent de celui d’Union ou d’Intersection dans le monde GEOS. Le manuel Shapely contient des exemples de fonctionnement des ensembles dans GEOS . Cependant, le wiki de PostGIS a un bon exemple en utilisant un travail au trait qui devrait faire l'affaire pour vous.
Alternativement, vous pouvez calculer trois choses:
Ceux-ci devraient être les trois polygones que vous avez mentionnés dans votre deuxième point.
la source
Quelque chose comme:
INSERT INTO new_table VALUES ((Sélectionnez id, the_geom de old_table où st_intersects (the_geom, (sélectionnez the_geom de old_table où id = '123')) = true
EDIT: vous avez besoin de l'intersection réelle du polygone.
INSERT INTO valeurs new_table ((sélectionnez id, ST_Intersection (the_geom, (sélectionnez the_geom from old où id = 123))
voir si ça marche.
la source