Union PostGIS entre deux tables, conservation des attributs


8

J'essaie d'unir les frontières gouvernementales de niveau supérieur et inférieur des États américains de manière à générer une table PostGIS avec les noms de niveau supérieur et inférieur pour chaque forme.

Dans mon exemple ci-dessous, Uest un ensemble de données et a une colonne avec des lignes UAet UB. Lest un autre ensemble de données et a LA, LBet LC. Lorsque Lj'unis les formes ensemble, je devrais obtenir les mêmes formes que le nouvel ensemble de données réuni, mais les deux colonnes de données.

entrez la description de l'image ici

Edit : Mon exemple d'image ci-dessus est assez minable. Jusqu'à présent, les réponses ont été liées à l'interrogation des données en supposant que la géométrie est disponible. Ceci est important mais saute la partie la plus confuse de ma question. Un meilleur exemple:

image

La forme jaune vient de U, la forme orange vient de L. Notez qu'ils se chevauchent, mais certains morceaux des polygones ne sont pas complètement contenus dans une autre forme (comme dans mon exemple où LBet LCsont complètement à l'intérieur UB).

La question que j'essayais de poser est de couper correctement les deux couches afin que l'ensemble de données résultant ne se chevauche pas. Voir par exemple ce message de liste de diffusion qui se rapproche mais qui ne fonctionne pas tout à fait.


1
Commentaire secondaire: appeler cela une "union", qui est le terme ESRI pour l'opération, sera source de confusion pour les personnes PostGIS, car la fonction ST_Union fait le contraire de cela (que ESRI appelle "dissoudre") et fusionne les fonctionnalités ensemble. Un terme indépendant du fournisseur peut être "superposition".
Paul Ramsey

Je pense que ma question est très similaire à celle qui a déjà été posée et à laquelle on a assez bien répondu.
magneticMonster

Réponses:


5

Sans connaître les noms de vos colonnes, c'est ma meilleure estimation. (Je n'ai pas eu l'occasion de tester, donc ce n'est peut-être pas tout à fait ça.) J'espère que vous pourrez trouver les noms de colonnes que j'ai utilisés. En supposant que L est un sous-ensemble de U:

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);

2
C'est correct, voir également gis.stackexchange.com/a/31562/457 pour un ajustement des performances de cette approche.
Paul Ramsey

C'est parfait une fois que j'ai généré les formes, mais je dois d'abord créer les formes réunies. Mon exemple de dessin n'est pas le meilleur pour le démontrer, mais je dois d'abord couper les géométries afin qu'il n'y ait pas de chevauchements.
magneticMonster

Je pense que vous n'avez pas lu suffisamment le SQL, il génère de nouvelles formes qui se composent uniquement des zones partagées. La sortie de cette requête n'a pas de fonctionnalités qui se chevauchent.
Paul Ramsey

Vous avez absolument raison Paul - je pense que je voulais commenter la réponse de Nicklas ci-dessous.
magneticMonster

1

La réponse dépend de la netteté et de la cohérence de vos données. Si vous pouvez supposer que le centre de gravité du tableau L se trouve à l'intérieur du polygone correspondant dans le tableau U, vous pouvez écrire quelque chose comme:

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

Ensuite, vous devriez obtenir ce que vous voulez. Si vous utilisez toute la géométrie au lieu du centroïde de L, vous obtiendrez beaucoup de correspondances étranges.

HTH

Nicklas


Notez que la fonction Centroid ne garantit pas un point qui se trouve dans le polygone. ST_PointOnSurface le fait.
Scro

@Scro, vous avez absolument raison. Mlle de moi.
Nicklas Avén
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.