Bienvenue sur PostGIS.fr

Bienvenue sur PostGIS.fr , le site de la communauté des utilisateurs francophones de PostGIS.

PostGIS ajoute le support d'objets géographique à la base de données PostgreSQL. En effet, PostGIS "spatialise" le serverur PostgreSQL, ce qui permet de l'utiliser comme une base de données SIG.

Maintenu à jour, en fonction de nos disponibilités et des diverses sorties des outils que nous testons, nous vous proposons l'ensemble de nos travaux publiés en langue française.

source: trunk/workshop-foss4g/geometry_returning.rst @ 81

Revision 62, 9.5 KB checked in by thomasg, 12 years ago (diff)

Fin correction typo et orthographe V2 du document

RevLine 
[1]1.. _geometry_returning:
2
[50]3Partie 18 : Fonctions de construction de géométries
4====================================================
[1]5
[62]6Toute les fonctions que nous avons vu jusqu'à présent traitent les géométries "comme elles sont" et retournent:
7
8* une analyse des objets (:command:`ST_Length(geometry)`, :command:`ST_Area(geometry)`),
9* une sérialisation des objets (:command:`ST_AsText(geometry)`, :command:`ST_AsGML(geometry)`),
[35]10* une partie de l'objet (:command:`ST_RingN(geometry,n)`) ou
[50]11* un résultat vrai/faux (:command:`ST_Contains(geometry,geometry)`, :command:`ST_Intersects(geometry,geometry)`).
[1]12
[50]13Les "fonctions de construction de géométries" prennent des géométries en entrée et retourne de nouvelles formes.
[1]14
15
16ST_Centroid / ST_PointOnSurface
17-------------------------------
18
[62]19Un besoin commun lors de la création de requêtes spatiales est de remplacer une entité polygonale par un point représentant cette entité. Cela est utile pour les jointures spatiales (comme indiqué ici : :ref:`polypolyjoins`) car utiliser :command:`ST_Intersects(geometry,geometry)` avec deux polygones impliquera un double comptage : un polygone pour le contour externe intersectera dans les deux sens; le remplacer par un point le forcera à être dans un seul sens, pas les deux.
[1]20
[62]21 * :command:`ST_Centroid(geometry)` retourne le point qui est approximativement au centre de la masse de la géométrie passée en paramÚtre. C'est un calcul simple et rapide, mais parfois non profitable, car le point retourné peut se trouver à l'extérieur de l'entité elle-même. Si l'entité fournie est convexe (imaginez la lettre 'C') le centroïde renvoyé pourrait ne pas être à l'intérieur du polygone.
22 * :command:`ST_PointOnSurface(geometry)` retourne un point qui est obligatoirement dans l'entité passée en paramÚtre. Cette fonction coûte plus cher en ressource que le calcul du centroïde.
23
[1]24.. image:: ./geometry_returning/centroid.jpg
25
26
27ST_Buffer
28---------
29
[62]30L'opération de zone tampon est souvent disponible dans les outils SIG, il est aussi disponible dans PostGIS. La fonction :command:`ST_Buffer(geometry,distance)` prend en paramÚtre une géométrie et une distance et retourne une zone tampon dont le contour est à une distance donnée de la géométrie d'origine.
[1]31
32.. image:: ./geometry_returning/st_buffer.png
33
[62]34Par exemple, si les services des parcs américains souhaitaient renforcer la zone du traffic maritime autour de l'île 'Liberty', ils pourraient construire une zone tampon de 500 mÚtres autour de l'île. L'île de 'Liberty' est représentée par un seul bloc dans notre table ``nyc_census_blocks``, nous pouvons donc facilement réaliser ce calcul.
[1]35
36.. code-block:: sql
37
[35]38  -- Création d'une nouvelle table avec une zone tampon de 500 m autour de 'Liberty Island'
[1]39  CREATE TABLE libery_island_zone AS
[62]40  SELECT ST_Buffer(the_geom,500) AS the_geom
41  FROM nyc_census_blocks
[1]42  WHERE blkid = '360610001009000';
43
[35]44  -- Mise à jour de la table geometry_columns
[62]45  SELECT Populate_Geometry_Columns();
46
[1]47.. image:: ./geometry_returning/liberty_positive.jpg
48
[62]49La fonction :command:`ST_Buffer` permet aussi d'utiliser des valeurs négatives pour le paramÚtre distance et construit un polygone inclus dans celui passé en paramÚtre. Pour les points et les lignes vous obtiendrez simplement un résultat vide.
[1]50
51.. image:: ./geometry_returning/liberty_negative.jpg
52
53
54ST_Intersection
55---------------
56
[62]57Une autre opération classique présente dans les SIG - le chevauchement - crée une nouvelle entité en calculant la zone correspondant à l'intersection de deux polygones superposés. Le résultat à la propriété de permettre de reconstruire les entités de base à l'aide de ce résultat.
[1]58
[62]59La fonction :command:`ST_Intersection(geometry A, geometry B)` retourne la zone géographique (ou une ligne, ou un point) que les deux géométries ont en commun. Si les géométries sont disjointes, la fonction retourne une géométrie vide.
[1]60
61.. code-block:: sql
62
[35]63  -- Quelle est l'aire que ces deux cercles ont en commun ?
64  -- Utilisons la fonction ST_Buffer pour créer ces cercles !
[62]65
[1]66  SELECT ST_AsText(ST_Intersection(
67    ST_Buffer('POINT(0 0)', 2),
68    ST_Buffer('POINT(3 0)', 2)
69  ));
70
71.. image:: ./geometry_returning/intersection.jpg
72
73
74
75ST_Union
76--------
77
[62]78Dans l'exemple précédent, nous intersections des géométries, créant une nouvelle géométrie unique à partir de deux entités. La commande :command:`ST_Union` fait l'inverse, elle prend en paramÚtre des géométries et supprime les parties communes. Il y a deux versions possibles de la fonction  :command:`ST_Union` :
[1]79
[62]80 * :command:`ST_Union(geometry, geometry)`: une version avec deux paramÚtres qui prend les géométries et retourne l'union des deux. Par exemple, nos deux cercles ressemblent à ce qui suit si nous utilisons l'opération union plutÃŽt que l'intersection.
81
[1]82   .. code-block:: sql
83
[62]84     -- Quelle est l'aire totale de ces deux cercles ?
[35]85     -- Utilisons ST_Buffer pour créer les cercles !
[62]86
[1]87     SELECT ST_AsText(ST_Union(
88       ST_Buffer('POINT(0 0)', 2),
89       ST_Buffer('POINT(3 0)', 2)
90     ));
[62]91
[1]92   .. image:: ./geometry_returning/union.jpg
93
[35]94
[62]95 * :command:`ST_Union([geometry])`: une version agrégée qui prendre un ensemble de géométries et retourne une géométrie contenant l'ensemble des géométries rassemblées. La fonction agrégée ST_Union peut être utilisé grâce au SQL ``GROUP BY`` pour créer un ensemble rassemblant des sous-ensembles de géométries basiques. Cela est trÚs puissant.
[1]96
[62]97Comme exemple pour la fonction d'agrégation  :command:`ST_Union`, considérons notre table ``nyc_census_blocks``.
98Les géographie du recensement sont construites de maniÚre à ce qu'on puisse créer d'autres géographies à partir des premiÚres. ainsi, nous pouvons créer une carte des secteurs de recensement en fusionnant les blocs que forme chaque secteur (comme nous le ferons aprÚs dans :ref:`la création des tables secteurs<creatingtractstable>`). Ou, nous pouvons créer une carte du comté en fusionnant les blocs qui relÚvent de chaque comté.
[1]99
[62]100Pour effectuer la fusion, notez que la clé unique ``blkid`` incorpore des informations sur les géographies de niveau supérieur. Voici les parties de la clé pour Liberty Island que nous avons utilisé précédemment.
101
[1]102::
103
104  360610001009000 = 36 061 00100 9000
[62]105
[1]106  36     = State of New York
107  061    = New York County (Manhattan)
108  000100 = Census Tract
109  9      = Census Block Group
110  000    = Census Block
111
[62]112Ainsi, nous pouvons créer une carte du comté en fusionnant toutes les géométries qui partagent les 5 premiers chiffres de  ``blkid``.
113
[1]114.. code-block:: sql
115
[62]116  -- Création d'une table nyc_census_counties en regroupant les blocs
[1]117  CREATE TABLE nyc_census_counties AS
[62]118  SELECT
119    ST_Union(the_geom) AS the_geom,
[1]120    SubStr(blkid,1,5) AS countyid
121  FROM nyc_census_blocks
122  GROUP BY countyid;
[62]123
[35]124  -- Mise à jour de la table geometry_columns
[1]125  SELECT Populate_Geometry_Columns();
[62]126
[1]127.. image:: ./geometry_returning/union_counties.png
128
[62]129Un test de surface peut confirmer que notre opération d'union n'a pas perdu de géométries. Tout d'abord, nous calculons la surface de chacun des blocs de recensement et faisons la somme de ces surfaces en les groupant par l'identifiant de recensement des comtés.
[1]130
131.. code-block:: sql
132
133  SELECT SubStr(blkid,1,5) AS countyid, Sum(ST_Area(the_geom)) AS area
[62]134  FROM nyc_census_blocks
[1]135  GROUP BY countyid;
136
137::
138
[62]139  countyid |       area
[1]140 ----------+------------------
141  36005    | 109807439.720947
142  36047    | 184906575.839355
143  36061    | 58973521.6225586
144  36081    | 283764734.207275
145  36085    | 149806077.958252
146
[62]147Ensuite nous calculons l'aire de chaque zone de nos nouveaux polygones de région de la table count :
[1]148
149.. code-block:: sql
150
151  SELECT countyid, ST_Area(the_geom) AS area
152  FROM nyc_census_counties;
153
154::
155
[62]156  countyid |       area
[1]157 ----------+------------------
158  36005    | 109807439.720947
159  36047    | 184906575.839355
160  36061    | 58973521.6225586
161  36081    | 283764734.207275
162  36085    | 149806077.958252
163
[35]164La même réponse ! Nous avons construit avec succÚs une table des régions de NYC à partir de nos données initiales.
[1]165
[35]166Liste des fonctions
167-------------------
[1]168
[62]169`ST_AsText(text) <http://postgis.org/docs/ST_AsText.html>`_: retourne la représentation Well-Known Text (WKT) de la géométrie/géographie sans métadonnée SRID.
[1]170
[62]171`ST_Buffer(geometry, distance) <http://postgis.org/docs/ST_Buffer.html>`_: Pour les géométries: retourne une géométrie qui représente tous les points dont la distance depuis cette géométrie est inférieure ou égale à la distance utilisée. Les calculs se font dans le systÚme de référence spatial de cette géométrie. Pour les géographies: utilise une fonction de transformation planaire pour effectuer le calcul.
[1]172
[62]173`ST_Intersection(geometry A, geometry B) <http://postgis.org/docs/ST_Intersection.html>`_: retourne une géométrie qui représente la portion commune des géométries A et B. L'implémentation du type géographie fait une transformation vers une géométrie pour faire l'intersection puis reprojette le résultat en WGS84.
[1]174
[62]175`ST_Union() <http://postgis.org/docs/ST_Union.html>`_: Renvoie un objet géométrique qui représente l'ensemble d'union des objets géométriques désignés.
[1]176
[62]177`substring(string [from int] [for int]) <http://www.postgresql.org/docs/8.1/static/functions-string.html>`_: Fonction de chaîne PostgreSQL pour extraire une sous-chaîne de caractÚres.
[1]178
[62]179`sum(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: Fonction d'agrégation PostgreSQL qui retourne la somme des valeurs d'une colonne dans un ensemble d'enregistrements.
180
Note: See TracBrowser for help on using the repository browser.