Zone de délimitation pour la table PostGIS

19

Existe-t-il un moyen simple d'obtenir le cadre de sélection pour une table entière dans PostGIS?

Ulrik
la source

Réponses:

26

ST_Extent devrait faire l'affaire.

ST_Extent - une fonction d'agrégation qui renvoie la boîte englobante qui délimite les lignes de géométries.

Appliqué comme ceci:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
obscur
la source
13

Comme @underdark a répondu , ST_Extent fera le travail, mais gardez à l'esprit qu'il ne renvoie pas une géométrie mais un box2d. Si vous avez besoin d'un type de géométrie, vous devez utiliser quelque chose comme

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

De plus, si ce dont vous avez besoin est d'obtenir la boîte englobante de chacune des lignes que vous pouvez également utiliser ST_Extentet un faux GROUP BY comme celui-ci:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

En supposant que gid est la clé primaire de la table

Mais ST_Envelope fera un meilleur travail comme @ bugmenot123 l'a déclaré dans les commentaires

SELECT ST_Envelope(geom) FROM your_table ;
Francisco Puga
la source
1
Si vous avez besoin d'une boîte englobante pour chaque ligne sans agrégation, utilisez-la ST_Envelope! Ce n'est pas ce qui a été demandé.
bugmenot123
1
Vous avez raison à propos de st_envelope, je mets à jour la réponse. À propos du "non demandé", parfois, essayez de donner des réponses connexes, car pour les personnes qui ne parlent pas bien l'anglais (comme moi), il est difficile de choisir le texte de recherche correct pour trouver une réponse. Je suis probablement tombé dans cette question à la recherche d'une réponse pour le deuxième sujet.
Francisco Puga
4

Une autre possibilité consiste à utiliser la ST_Envelopefonction, qui renvoie une géométrie avec SRID,

ST_Envelope - Retourne une géométrie représentant la boîte englobante de la géométrie fournie

, ainsi que la fonction d'agrégation ST_Unionpour obtenir l'union de toutes les géométries (ou l'union de leurs enveloppes respectives) comme suit:

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

ou

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

La deuxième option devrait être plus rapide car elle simplifie l'opération d'union en utilisant les enveloppes des géométries individuelles.

voir Source .

tinlyx
la source
1
L'approche ST_Extent est plus rapide en magnitudes car elle peut fonctionner uniquement sur des nombres et ne nécessite aucun calcul géométrique complexe. Évitez ST_Union chaque fois que vous le pouvez.
bugmenot123
2

Ne pas appliquer d'agrégation spatiale devrait être beaucoup plus rapide:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x
mika666
la source
1
ST_Extent n'a également rien à faire dans l'espace. C'est 2-3 fois plus rapide que votre approche pour mes données (~ 400k polygones). Probablement parce qu'il peut tout faire en une seule fois, alors que votre approche doit examiner plusieurs aspects de chaque géom, puis agréger à la fin.
bugmenot123