2010-10-11 3 views
3
SELECT id, ST_Box2D(areas) AS bbox FROM mytable; 

Dans cet exemple, la table "mytable" contient deux colonnes: "id" est le numéro d'identification unique de la ligne et "zones" est un géométrie champ contenant un MULTIPOLYGON par ligne.PostGIS: boîte de limitation d'un multipolygon


Cela fonctionne bien pour multipolygones ne contenant qu'un seul polygone, mais quelques lignes ont des polygones très écartés, d'où la zone de délimitation n'est pas pertinent lorsque le multipolygone contient un polygone en Europe et un au Canada par exemple.

Donc, j'aurais besoin d'un moyen d'obtenir un box2d par polygone par multipolygon, mais je n'ai pas encore trouvé comment. Plus exactement, mon but est de renvoyer un multipolygone par ligne, contenant un box2d par polygone.


Premier exemple

  • id: 123
  • zone: un multipolygone ne contenant qu'un seul polygone ovale en Australie
  • donc bbox doit retourner un multipolygone ne contenant qu'un seul rectangle (le cadre englobant) en Australie

Deuxième exemple

  • id: 321
  • zone: un multipolygone contenant un cercle à Paris, un cercle à Toronto
  • donc bbox doit renvoyer une multipolygone contenant un rectangle à Paris, un rectangle à Toronto

Répondre

5

Hallo

Vous devez utiliser ST_Dump (http://postgis.org/documentation/manual-1.5/ST_Dump.html)

Ensuite, vous obtiendrez une ligne par polygone. Les autres champs seront dupliqués lorsque la géométrie est divisée. C'est comme une fonction agrégée mais dans l'autre sens.

La syntaxe est un peu spéciale car elle délivre en sortie un composé de type de données, donc vous devez extraire la partie de la géométrie comme ceci:.

SELECT (ST_Dump (the_geom)) geom de matable.

étant donné que cela vous donne plus de lignes dans la table, vous devriez simplement créer une nouvelle table à partir de la requête. Ensuite, vous pouvez simplement créer un index sur cette nouvelle colonne de géométrie dans la nouvelle table et il sera construit sur des boîtes de délimitation pour chaque polygone.

HTH

/Nicklas

Voulez-vous aussi vos polygones à une ligne chacun? C'est ce que je pensais, mais si vous voulez seulement une table avec des bboxes, une par ligne avec un id fait référence au multipolygon original (vous aurez le même ID répété pour chaque partie du multipolygon) alors vous pouvez faire la même chose juste extraire le bboxes quelque chose comme:

Créer la table nEWTABLE comme ID SELECT, BOX2D ((ST_Dump (the_geom)) de geom.) comme myBOX de originamTable

Je crains que je ne comprends pas vraiment ce que vous voulez , mais vous avez beaucoup de possibilités avec ST_Dump dans des cas comme celui-ci.

+0

(ST_Dump()). Geom est exactement ce dont j'avais besoin (et je suis sûr que je ne l'aurais pas trouvé dans un million d'années). Merci :) – wildpeaks

1

Vous devez encadrer les bits pertinents (disons les composantes canadienne et française) séparément. Le meilleur outil pour cela dans PostGIS est l'accesseur de géométrie ST_GeometryN(geometry,int) (référence: http://postgis.refractions.net/docs/ST_GeometryN.html). Ce lien a un bon exemple de combinaison de l'accesseur avec ST_NumGeometries.

MISE À JOUR PAR COMMENTAIRE:

Voici un exemple simple de San Francisco - cette table contient un champ de géométrie appelée the_geom, gid fiche 1 est un champ avec deux multipolygones tel que rapporté par st_numgeometries (notez le ordinale est indexé à 1 pas 0):

=> select st_box2d(st_geometryn(the_geom, 1)) from tl_2009_06075_cousub00 \ 
where gid = 1; 

           st_box2d         
------------------------------------------------------------------------- 
BOX(-123.173828125 37.6398277282715,-122.935707092285 37.8230590820312) 
(1 row) 

=> select st_box2d(st_geometryn(the_geom, 2)) from tl_2009_06075_cousub00 \ 
where gid = 1; 

            st_box2d         
---------------------------------------------------------------------------- 
BOX(-122.612289428711 37.7067184448242,-122.281776428223 37.9298248291016) 
(1 row) 
+0

Eh bien, j'ai déjà essayé cela plus tôt: SELECT numgeometries (aires) AS compte, geometryn (aires, generate_series (1, numgeometries (aires))) AS bbox FROM mytable; Cependant, je ne sais pas où je pourrais insérer l'instruction st_box2d dans l'instruction, ni comment les agglomérer par ligne (st_collect serait ma première idée, mais c'est difficile) et je ne savais pas si j'allais dans le bonne direction du tout. – wildpeaks