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/geography.rst @ 56

Revision 53, 15.2 KB checked in by djay, 13 years ago (diff)

Typo

RevLine 
[1]1.. _geography:
2
[53]3Partie 17 : Coordonnées géographiques
[48]4=====================================
[1]5
[48]6Il est trÚs fréquent de manipuler des données à coordonnées "géographiques" ou de "longitude/latitude".
[1]7
[48]8Au contraire des coordonnées de type Mercator, UTM ou Stateplane, les coordonnées géographiques ne représentent pas une distance linéaire depuis une origine, tel que dans un plan. Elles décrivent la distance angulaire entre l'équateur et les pÎles. Dans les sytÚmes de coordonnées sphériques, un point est spécifié par son rayon (distance à l'origine), son angle de rotation par rapport au méridien plan, et son angle par rapport à l'axe pÎlaire.
[1]9
10.. image:: ./geography/cartesian_spherical.jpg
11
12
[48]13Vous pouvez continuer à utiliser des coordonnées géographiques comme des coordonnées cartésiennes approximatives pour vos analyses spatiales. Par contre les mesures de distances, d'aires et de longueur seront éronées. Etant donné que les coordonnées spériques mesurent des angles, l'unité est le dégré. Par exemple, les résultats cartésien approximatifs de tests tels que 'intersects' et 'contains' peuvent s'avérer terriblement faux. Par ailleurs, plus une zone est située prÚs du pÃŽle ou de la ligne de date internationale, plus la distance entre les points est agrandie. 
14 
[1]15
[48]16Voici par exemple les coordonnées des villes de Los Angeles et Paris.
17
[1]18 * Los Angeles: ``POINT(-118.4079 33.9434)``
19 * Paris: ``POINT(2.3490 48.8533)``
20 
[48]21La requête suivante calcule la distance entre Los Angeles et Paris en utilisant le systÚme cartésien standard de PostGIS :command:`ST_Distance(geometry, geometry)`.  Notez que le SRID 4326 déclare un systÚme de références spatiales géographiques.
[1]22
23.. code-block:: sql
24
25  SELECT ST_Distance(
26    ST_GeometryFromText('POINT(-118.4079 33.9434)', 4326), -- Los Angeles (LAX)
27    ST_GeometryFromText('POINT(2.5559 49.0083)', 4326)     -- Paris (CDG)
28    );
29
30::
31
32  121.898285970107
33 
[48]34Aha! 121! Mais, que veut dire cela ?
[1]35
[48]36L'unité pour SRID 4326 est le degré. Donc la réponse signifie 121 degrés. Sur une sphÚre, la taille d'un degré "au carré" est assez variable. Elle devient plsu petite au fur et à mesure que l'on s'éloigne de l'équateur. Pensez par exemple aux méridiens sur le globe qui se ressÚrent entre eux au niveau des pÎles. Donc une distance de 121 degrés ne veut rien dire !
[1]37
[48]38Pour calculer une distance ayant du sens, nous devons traiter les coordonnées géographiques non pas come des coordonnées cartésiennes approximatives, mais plutÎt comme de réelles coordonnées sphériques. Nous devons mesurer les distances entre les points comme de vrais chemins par dessus uen sphÚre, comme une portion d'un grand cercle.
[1]39
[48]40Depuis sa version 1.5, PostGIS fournit cette fonctionnalité avec le type ``geography``.
[1]41
42.. note::
43
[48]44  Différentes bases de données spatiales développent différentes approches pour manipuler les coordonnées géographiques.
[1]45 
[48]46  * Oracle essaye de mettre à jour la différence de maniÚre transparente en lanacant des calculs lorsuqe le SRID est géographique.
47  * SQL Server utilise deux types spatiaux, "STGeometry" pour les coordonnées cartésiens et STGeography" pour les coordonnées géographqiues.
48  * Informix Spatial est une pure extension cartésienne d'Informix, alors qu'Informix Geodetic est une pure extension géographique.
49  * Comme SQL Server, PostGIS utilise deux types: "geometry" et "geography".
[1]50 
[48]51En utilisant le type ``geography`` plutot que ``geometry``, essayon sà nouveau de mesurer la distance entre Los Angeles et Paris. Au lieu de la commande :command:`ST_GeometryFromText(text)`, nous utiliserons cette fois :command:`ST_GeographyFromText(text)`.
[1]52
53.. code-block:: sql
54
55  SELECT ST_Distance(
56    ST_GeographyFromText('POINT(-118.4079 33.9434)'), -- Los Angeles (LAX)
57    ST_GeographyFromText('POINT(2.5559 49.0083)')     -- Paris (CDG)
58    );
59
60::
61
62  9124665.26917268
63
[48]64Toutes les valeurs retournées étant en mÚtres, notre réponse est donc 9124 kilomÚtres.
[1]65
[48]66Les versions plus anciennes de PostGIS supportaient uniquement des calculs sur sphÚre trÚs basiques comme la fonction :command:`ST_Distance_Spheroid(point, point, measurement)`. Celle-ci est trÚs limitée et ne fonctionne uniquement sur des  points. Elle ne supporte pas non plus l'indexation au niveau des pÃŽles ou de la ligne de date internationale.
[1]67
[48]68Le besoin du support des autres types de géométries se fit ressentir lorsqu'il s'agissait de répondre à des questions du type  "A quelle distance la ligne de vol d'un avion Los Angeles/Paris passe-t-elle de l'Islande?"
[1]69
70.. image:: ./geography/lax_cdg.jpg
71
[49]72Répondre à cette question en travaillant avec un plan cartésien fournit une trÚs mauvaise réponse en effet ! En utilisant la ligne rouge, nou sobtenon sune bien meilleure réponse. Si nous convertissons notre vol LAX-CDG en une ligne et que nous calculons la distance à un point en Islande, nous obtiendrons la réponse exacte, en mÚtres.
[1]73
74.. code-block:: sql
75
76  SELECT ST_Distance(
77    ST_GeographyFromText('LINESTRING(-118.4079 33.9434, 2.5559 49.0083)'), -- LAX-CDG
78    ST_GeographyFromText('POINT(-21.8628 64.1286)')                        -- Iceland 
79  );
80
81::
82
83  531773.757079116
84 
[49]85Donc le point le plu sproche de l'Islande pendant le vol LAX-CDG est de 532 kilomÚtres.S
[1]86
[49]87L'approche cartésienne pour manipuler les coordonnées géographiques pert tout son sens pour les objets situées au dessus de la ligne de date internationale. La route "sphérique" la plus courte entre Los-Angeles et Tokyo traverse l'océan Pacifique. La route "cartésienne" la plus courte traverse quant à elle les océans Atlantique et Indien. 
88
[1]89.. image:: ./geography/lax_nrt.png
90
91.. code-block:: sql
92
93   SELECT ST_Distance(
94     ST_GeometryFromText('Point(-118.4079 33.9434)'),  -- LAX
95     ST_GeometryFromText('Point(139.733 35.567)'))     -- NRT (Tokyo/Narita)
96       AS geometry_distance,
97   ST_Distance(
98     ST_GeographyFromText('Point(-118.4079 33.9434)'), -- LAX
99     ST_GeographyFromText('Point(139.733 35.567)'))    -- NRT (Tokyo/Narita)
100       AS geography_distance;
101   
102::
103
104   geometry_distance | geography_distance
105  -------------------+--------------------
106    258.146005837336 |   8833954.76996256
107
108
[51]109Utiliser le type 'Geography'
110----------------------------
[1]111
[51]112Afin d'importer des données dans une table de type geography, les objets géographiques doivent d'avord être projetées dans le systÚme EPSG:4326 (longitude/latitude), ensuite elles doivent être converties en objets de type géographies. La fonction :command:`ST_Transform(geometry,srid)` convertie les coordonnées en géographies et la fonction :command:`Geography(geometry)` change le type ("cast") de géométrie à géographie.
[1]113
114.. code-block:: sql
115
116  CREATE TABLE nyc_subway_stations_geog AS
117  SELECT
118    Geography(ST_Transform(the_geom,4326)) AS geog,
119    name,
120    routes
121  FROM nyc_subway_stations;
122   
[51]123La construction d'une indexation spatiale sur une table stockant des objets de type géographie est exactement identique à la méthode employée pour les géométries :   
[1]124
125.. code-block:: sql
126
127  CREATE INDEX nyc_subway_stations_geog_gix
128  ON nyc_subway_stations_geog USING GIST (geog);
129
[51]130La différence est camouflé : l'indexation des objets de type géographie gére correctement les requêtes qui recouvrent les pÎles ou traverses les fuseaux horraires, alors que les géométries ne le supporteront pas.
[1]131
[51]132Il n'y a qu'un petit nombre de fonctions disponibles pour le type géographie : 
[1]133 
[51]134 * :command:`ST_AsText(geography)` retourne la représentation ``textuelle``
135 * :command:`ST_GeographyFromText(text)` retourne un objet de type ``geography``
136 * :command:`ST_AsBinary(geography)` retourne la représentation binaire ``bytea``
137 * :command:`ST_GeogFromWKB(bytea)` retourne un objet de type ``geography``
138 * :command:`ST_AsSVG(geography)` retourne ``text``
139 * :command:`ST_AsGML(geography)` retourne ``text``
140 * :command:`ST_AsKML(geography)` retourne ``text``
141 * :command:`ST_AsGeoJson(geography)` retourne ``text``
142 * :command:`ST_Distance(geography, geography)` retourne ``double``
143 * :command:`ST_DWithin(geography, geography, float8)` retourne ``boolean``
144 * :command:`ST_Area(geography)` retourne ``double``
145 * :command:`ST_Length(geography)` retourne ``double``
146 * :command:`ST_Covers(geography, geography)` retourne ``boolean``
147 * :command:`ST_CoveredBy(geography, geography)` retourne ``boolean``
148 * :command:`ST_Intersects(geography, geography)` retourne ``boolean``
149 * :command:`ST_Buffer(geography, float8)` retourne ``geography`` [#Casting_note]_
150 * :command:`ST_Intersection(geography, geography)` retourne ``geography`` [#Casting_note]_
[1]151 
[51]152Création d'une table stockant des géograhpies
153---------------------------------------------
[1]154 
[51]155Le code SQL permettant la création d'une nouvelle table avec une colonne de type géographie ressemble à la création d'une table stockant des géométries. Cependant, les objets de type géographie permettent de spécifier directement le type d'objet géographique à la création de la table. Par exemple :
[1]156
157.. code-block:: sql
158
159  CREATE TABLE airports (
160    code VARCHAR(3),
161    geog GEOGRAPHY(Point)
162  );
163 
164  INSERT INTO airports VALUES ('LAX', 'POINT(-118.4079 33.9434)');
165  INSERT INTO airports VALUES ('CDG', 'POINT(2.5559 49.0083)');
166  INSERT INTO airports VALUES ('REK', 'POINT(-21.8628 64.1286)');
167 
[51]168Lors de la définitionn le type ``GEOGRAPHY(Point)`` spécifie que nos airoports sont des points. Les nouveau champs géographie n'est pas référencé dans la table ``geometry_columns``. Le stockage des métadonnées relatives aux données de type géograhpie sont stockées dans une vue appellée ``geography_columns`` qui est maintenue à jour automatiquement sans avoir besoin d'utiliser des fonctions comme ``geography_columns``.
[1]169
170.. code-block:: sql
171
172  SELECT * FROM geography_columns;
173 
174::
175
176           f_table_name         | f_geography_column | srid |   type   
177 -------------------------------+--------------------+------+----------
178  nyc_subway_stations_geography | geog               |    0 | Geometry
179  airports                      | geog               | 4326 | Point
180 
181.. note::
182
[51]183  La possibilité de définir les types et le SRID lors de la création de la table (requête ``CREATE``), et la mise à jour automatique des métadonnées ``geometry_columns`` sont des fonctionalités qui seront adaptées pour le type géométrie pour la version 2.0 de PostGIS. 
[1]184
[51]185Conversion de type
[1]186-------------------
187
[51]188Bien que les fonctions de bases qui s'appliquent au type géographie peuvent être utilisées dans un grand nombre de cas d'utilisation, il est parfois nécessaire d'accéder aux autres fonctions qui ne supportent que le type géométrie. Heureusement, il est possible de convertir des objets de type géométries en des objets de types géographies et inversement.
[1]189
[51]190La syntaxe habituelle de PostgreSQL pour les conversion de type  consiste à ajouter à la valeur la chaîne suivante ``::typename``. Donc, ``2::text`` convertie la valeur numérique deux en une chaîne de caractÚres '2'. La commande : ``'POINT(0 0)'::geometry`` convertira la représentation textuelle d'un point en une point géométrique.
[1]191
[51]192La fonction :command:`ST_X(point)` supporte seulement le type géométrique. Comment lire la coordonée X d'une de nos géographie ?
[1]193
194.. code-block:: sql
195
196  SELECT code, ST_X(geog::geometry) AS longitude FROM airports;
197
198::
199
200  code | longitude
201 ------+-----------
202  LAX  | -118.4079
203  CDG  |    2.5559
204  REK  |  -21.8628
205
[51]206En ajoutant la chaîne ``::geometry`` Ã  notre valeur géographique, nous la convertissons en une géographie ayant le SRID : 4326. À partir de maintenant, nous pouvons utiliser autemps de fonctions s'appliquant au géométries que nous le souhaitons. Mais, souvenez-vous - maintenant que nos objets sont des géométries, leur coordonnées seront interprétées comme des coordonnées cartésiennes, non pas sphériques.
[1]207 
208 
[51]209Pourquoi (ne pas) utiliser les géographies
210------------------------------------------
[1]211
[51]212Les géographies ont des coordonnées universellement acceptées - chacun peut comprendre que représente la latitue et la longitude, mais peut de personne comprennent ce que les coordonnées UTM signifient. Pourquoi ne pas tout le temps utiliser  des géographies ?
[1]213
[51]214 * PremiÚrement, comme indiqué précédemment, il n'y a que quelques fonctions qui supportent ce type de données. Vous risquer de perdre beaucoup de temps à contourner les problÚmes liés à la non-disponibilité de certaines fonctions.
215 * DeuxiÚmement, les calculs sur une sphÚre sont plus consomateurs en ressource que les mêmes calculs dans un systÚme cartésien. Par exemple, la formule de calcul de distance (Pythagore) entraine un seul appÚle à la fonction racine carré (sqrt()). La formule de calcul de distance sphérique (Haversine) utilise deux appÚle à la fonction racine carré, et un appÚle à arctan(), quatre appÚle à sin() et deux à cos(). Les fonctions trigonométriques sont trÚs couteuses, et les calculs sphériques les utilisent massivement.
[1]216 
[51]217Quel conclusion en tirer ?
[1]218
[51]219Si vos données sont géograhpiquement compact (contenu à l'intérieur d'un état, d'un pays ou d'une ville), utilisez le type ``geometry`` avec une projection cartésienne qui est pertinent pour votre localisation. Consultez le site http://spatialreference.org et tapez le nom de votre région pour visualiser la liste des systÚme de projection applicables dans votre cas.
[1]220
[51]221Si, d'un autre coté, vous avez besoin de calculer des distances qui est géographiquement éparse (recouvrant la plupart du monde), utiliser le type ``geography``. La compléxité de l'application que vous éviterait en travaillant avec des objets de type ``geography`` dépassera les problÚmes de performances. La conversion de type  en géométrie permettra de dépasser les limites des fonctionnalités proposé pour ce type.
[1]222
[49]223Liste des fonctions
224-------------------
[1]225
[51]226`ST_Distance(geometry, geometry) <http://postgis.org/docs/ST_Distance.html>`_: Pour le type géométrie, renvoit la distance cartésienne, pour les géographies la distance sphérique en métres.
[1]227
[51]228`ST_GeographyFromText(text) <http://postgis.org/docs/ST_GeographyFromText.html>`_: Retourne la valeur géographique à partir d'une représentation en WKT ou EWKT.
[1]229
[51]230`ST_Transform(geometry, srid) <http://postgis.org/docs/ST_Transform.html>`_: Retourne une nouvelle géométrie avec ses coordonnées reprojetées dans le systÚme de référence spatial référencé par le SRID fournit.
[1]231
[51]232`ST_X(point) <http://postgis.org/docs/ST_X.html>`_: Retourne la coordonnée X d'un point, ou NULL si non disponible. La valeur passée doit être un point.
[1]233
234
235.. rubric:: Footnotes
236
[51]237.. [#Casting_note] Les fonctions buffer et intersection sont actuellement construite sur le principe de conversion de type en géométries, et ne sont pas actuellement capable de gérer des coordonnées sphariques. Il en résulte qu'elles peuvent ne pas parvenir à retourner un résultat correcte pour des objets ayant une grande étendue qui ne peut être représenté correctement avec une représentation planaire.
[1]238 
[51]239   Par exemple, la fonction :command:`ST_Buffer(geography,distance)`  transforme les objets géographiques dans la "meilleure" projection, crée la zone tampon, puis les transforme à nouveau en des géographies. S'il n'y a pas de "meilleure" projection (l'objet est trop vaste), l'opération peut ne pas réussir à retourner une valeur correct ou retourner une one tampon mal formée.
[1]240
Note: See TracBrowser for help on using the repository browser.