Obtenir la géométrie de plusieurs tables à l'aide de PostGIS?


13

Je suis très nouveau sur PostGIS, PostgreSQL et SQL en général.

J'ai 44 tables dans ma base de données PostGIS, et chacune représente une couche différente de données vectorielles. Chacun a été chargé à partir d'un fichier de formes distinct et chacun a une colonne qui décrit la géométrie de cette couche, appeléewkb_geometry

Je souhaite sélectionner un polygone spécifique sur une couche, puis récupérer TOUTE la géométrie à partir d'un sous-ensemble de couches qui chevauchent le cadre de délimitation de ce polygone. Je ne me sens pas pointilleux sur l'ordre qui sort, mais il serait utile qu'il soit organisé par les tables dont chaque groupe de géométrie est issu.

Voici un exemple de mon instruction SQL:

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

qui renvoie une erreur:

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

Quel est le bon moyen de le faire?


1
Vous pourriez trouver notre SQL Primer utile. Nous l'avons conçu pour répondre aux questions des débutants SQL principalement bien qu'il couvre également certaines constructions SQL avancées. postgis.us/chapter_appendix_c Le chapitre 1 pourrait également être utile car il s'agit d'une amorce spatiale PostGIS.
LR1234567

+1. Ce sont les chapitres gratuits. Achetez le livre entier, Benjamin, c'est un investissement qui en vaut la peine. si vous voulez en savoir plus sur PostGIS et bien plus encore.
Nicklas Avén

Réponses:


8

tout d'abord, vous obtenez ce message d'erreur, car vous n'avez pas spécifié à partir de quelle table vous souhaitez sélectionner la colonne de géométrie (et comme ils ont tous le même nom, postgres devient confus). C'est pourquoi vous obtenez le message d'erreur

la référence de colonne "wkb_geometry" est ambiguë

Si vous avez le même nom de colonne dans plusieurs tables, ajoutez toujours le nom de la table devant le nom de la colonne: par exemple. table1.wkb_geometry

Pour votre requête: Si je vous comprends bien, vous voulez trouver les objets dans différents calques qui coupent un objet spécifique dans un calque spécifique.

Commencez à regarder deux tableaux à la fois au début pour rester simple:

Table1 est la table avec l'objet spécifique, table2 la table avec les autres objets

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

Maintenant, si vous souhaitez ajouter des objets supplémentaires à partir d'autres tables, vous avez besoin de UNION ALL, comme Sasa l'a déjà mentionné. Les noms de colonnes n'ont pas besoin d'être les mêmes, mais le nombre de colonnes et les types de données!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

Vous pouvez rencontrer des problèmes en ouvrant la requête dans une visionneuse, car il n'y a pas d'ID unique. Un moyen simple de résoudre ce problème consiste à enregistrer le résultat sous forme de tableau avec une colonne id.

s'amuser


6

Je n'ai pas de client SQL devant moi, donc ce n'est peut-être pas précis à 100%, mais vous voudrez quelque chose comme:

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

etc. Votre problème est que la requête sql ne sait pas à quelle table (table2 / 3/4/5) vous faites référence lorsque vous spécifiez SELECT ST_AsEWKT (wkb_geometry), donc la référence ambiguë. Vous pouvez également ajouter un ORDER BY aux résultats si vous souhaitez les commander

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.