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/spatial_relationships.rst @ 81

Revision 62, 8.8 KB checked in by thomasg, 13 years ago (diff)

Fin correction typo et orthographe V2 du document

RevLine 
[1]1.. _spatial_relationships:
2
[38]3Partie 10 : Les relations spatiales
[62]4===================================
[1]5
[47]6Jusqu'à présent, nous avons utilisé uniquement des fonctions qui permettent de mesurer (:command:`ST_Area`, :command:`ST_Length`), de sérialiser (:command:`ST_GeomFromText`) ou désérialiser (:command:`ST_AsGML`) des géométries. Ces fonctions sont toutes utilisées sur une géométrie à la fois.
[1]7
[38]8Les base de données spatiales sont puissantes car elle ne se contentent pas de stocker les géométries, elle peuvent aussi vérifier les *relations entre les géométries*.
[1]9
[62]10Pour les questions comme "Quel est le plus proche garage à vélo prÚs du parc ?" ou "Ou est l'intersection du métro avec telle rue ?", nous devrons comparer les géométries représentant les garages à vélo, les rues et les lignes de métro.
[1]11
[62]12Le standard de l'OGC définit l'ensemble de fonctions suivantes pour comparer les géométries.
[1]13
14ST_Equals
15---------
16
[62]17:command:`ST_Equals(geometry A, geometry B)` teste l'égalité spatiale de deux géométries.
18
[1]19.. figure:: ./spatial_relationships/st_equals.png
20   :align: center
21
[38]22ST_Equals retourne TRUE si les deux géométries sont du même type et ont des coordonnées x.y identiques.
[1]23
[22]24PremiÚrement, essayons de récupérer la représentation d'un point de notre table ``nyc_subway_stations``. Nous ne prendrons que l'entrée : 'Broad St'.
[1]25
26.. code-block:: sql
27
28  SELECT name, the_geom, ST_AsText(the_geom)
[62]29  FROM nyc_subway_stations
30  WHERE name = 'Broad St';
[1]31
32::
33
34     name   |                      the_geom                      |      st_astext
35  ----------+----------------------------------------------------+-----------------------
36   Broad St | 0101000020266900000EEBD4CF27CF2141BC17D69516315141 | POINT(583571 4506714)
[62]37
[38]38Maintenant, copiez / collez la valeur affichée pour tester la fonction :command:`ST_Equals`:
[1]39
40.. code-block:: sql
41
[62]42  SELECT name
43  FROM nyc_subway_stations
[1]44  WHERE ST_Equals(the_geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141');
45
46::
47
48   Broad St
49
50.. note::
51
[38]52  La représentation du point n'est pas vraiment compréhensible (``0101000020266900000EEBD4CF27CF2141BC17D69516315141``) mais c'est exactement la représentation des coordonnées. Pour tester l'égalité, l'utilisation de ce format est nécessaire.
[1]53
54
[22]55ST_Intersects, ST_Disjoint, ST_Crosses et ST_Overlaps
[1]56------------------------------------------------------
57
[38]58:command:`ST_Intersects`, :command:`ST_Crosses`, et :command:`ST_Overlaps` teste si l'intérieur des géométries s'intersecte, se croise ou se chevauche.
[1]59
60.. figure:: ./spatial_relationships/st_intersects.png
61   :align: center
62
[62]63:command:`ST_Intersects(geometry A, geometry B)` retourne t (TRUE) si l'intersection ne renvoie pas un ensemble vide de résultats. Intersects retourne le résultat exactement inverse de la fonction disjoint.
[1]64
65.. figure:: ./spatial_relationships/st_disjoint.png
66   :align: center
67
[62]68L'opposé de ST_Intersects est :command:`ST_Disjoint(geometry A , geometry B)`. Si deux géométries sont disjointes, elle ne s'intersectent pas et vice-versa. En fait, il est souvent plus efficace de tester si deux géométries ne s'intersectent pas que de tester si elles sont disjointes du fait que le test d'intersection peut être spatialement indexé alors que le test disjoint ne le peut pas.
[1]69
[62]70.. figure:: ./spatial_relationships/st_crosses.png
[1]71   :align: center
72
[47]73Pour les comparaisons de couples de types multipoint/polygon, multipoint/linestring, linestring/linestring, linestring/polygon, et linestring/multipolygon, :command:`ST_Crosses(geometry A, geometry B)` retourne t (TRUE) si les résultats de l'intersection sont à l'intérieur des deux géométries.
[22]74
[1]75.. figure:: ./spatial_relationships/st_overlaps.png
76   :align: center
77
[22]78:command:`ST_Overlaps(geometry A, geometry B)` compare deux géométries de même dimension et retourne TRUE si leur intersection est une géométrie différente des deux fournies mais de même dimension.
[1]79
[62]80Essayons de prendre la station de métro de Broad Street et de déterminer son voisinage en utilisant la fonction :command:`ST_Intersects` :
[1]81
82.. code-block:: sql
83
[62]84  SELECT name, boroname
[1]85  FROM nyc_neighborhoods
86  WHERE ST_Intersects(the_geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141');
87
88::
89
[62]90          name        | boroname
[1]91  --------------------+-----------
92   Financial District | Manhattan
93
94
95
96ST_Touches
97----------
98
[38]99:command:`ST_Touches` teste si deux géométries se touchent en leur contours extérieurs, mais leur contours intérieurs ne s'intersectent pas
[1]100
101.. figure:: ./spatial_relationships/st_touches.png
102   :align: center
103
[62]104:command:`ST_Touches(geometry A, geometry B)` retourne TRUE soit si les contours des géométries s'intersectent ou si l'un des contours intérieurs de l'une intersecte le contour extérieur de l'autre.
[1]105
[22]106ST_Within et ST_Contains
[1]107-------------------------
108
[62]109:command:`ST_Within` et :command:`ST_Contains` teste si une géométrie est totalement incluse dans l'autre.
[1]110
111.. figure:: ./spatial_relationships/st_within.png
112   :align: center
113
[62]114:command:`ST_Within(geometry A , geometry B)` retourne TRUE si la premiÚre géométrie est complÚtement contenue dans l'autre. ST_Within teste l'exact opposé au résultat de ST_Contains.
115
[38]116:command:`ST_Contains(geometry A, geometry B)` retourne TRUE si la seconde géométrie est complÚtement contenue dans la premiÚre géométrie.
[1]117
118
[22]119ST_Distance et ST_DWithin
[1]120--------------------------
121
[62]122Une question fréquente dans le domaine du SIG est "trouver tous les éléments qui se trouvent à une distance X de cet autre élément".
[1]123
[38]124La fonction :command:`ST_Distance(geometry A, geometry B)` calcule la *plus courte* distance entre deux géométries. Cela est pratique pour récupérer la distance entre les objets.
[1]125
126.. code-block:: sql
127
128  SELECT ST_Distance(
129    ST_GeometryFromText('POINT(0 5)'),
130    ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));
131
132::
133
134  3
135
[62]136Pour tester si deux objets sont à la même distance d'un autre, la fonction :command:`ST_DWithin` fournit un test tirant profit des index. Cela est trÚs utile pour répondre a une question telle que: "Combien d'arbres se situent dans un buffer de 500 mÚtres autour de cette route ?". Vous n'avez pas à calculer le buffer, vous avez simplement besoin de tester la distance entre les géométries.
[1]137
138  .. figure:: ./spatial_relationships/st_dwithin.png
139     :align: center
[62]140
[38]141En utilisant de nouveau notre station de métro Broad Street, nous pouvons trouver les rues voisines (à 10 mÚtres de) de la station :
[1]142
143.. code-block:: sql
144
[62]145  SELECT name
146  FROM nyc_streets
[1]147  WHERE ST_DWithin(
[62]148          the_geom,
149          '0101000020266900000EEBD4CF27CF2141BC17D69516315141',
[1]150          10
151        );
152
[62]153::
[1]154
[62]155       name
[1]156  --------------
157     Wall St
158     Broad St
159     Nassau St
160
[62]161Nous pouvons vérifier la réponse sur une carte. La station Broad St est actuellement à l'intersection des rues Wall, Broad et Nassau.
[1]162
163.. image:: ./spatial_relationships/broad_st.jpg
164
[22]165Liste des fonctions
166-------------------
[1]167
[22]168`ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_ : retourne TRUE si aucun des points de B n'est à l'extérieur de A, et au moins un point de l'intérieur de B est à l'intérieur de A.
[1]169
[38]170`ST_Crosses(geometry A, geometry B)  <http://postgis.org/docs/ST_Crosses.html>`_ : retourne TRUE si la géométrie A a certains, mais pas la totalité, de ses points à l'intérieur de B.
[1]171
[62]172`ST_Disjoint(geometry A , geometry B) <http://postgis.org/docs/ST_Disjoint.html>`_ : retourne TRUE si les géométries ne s'intersectent pas - elles n'ont aucun point en commun.
[1]173
[62]174`ST_Distance(geometry A, geometry B)  <http://postgis.org/docs/ST_Distance.html>`_ : retourne la distance cartésienne en 2 dimensions minimum entre deux géométries dans l'unité de la projection.
[1]175
[62]176`ST_DWithin(geometry A, geometry B, radius) <http://postgis.org/docs/ST_DWithin.html>`_ : retourne TRUE si les géométries sont distante (radius) l'une de l'autre.
[1]177
[62]178`ST_Equals(geometry A, geometry B) <http://postgis.org/docs/ST_Equals.html>`_ : retourne TRUE si les géométries fournies représentent la même géométrie. L'ordre des entités n'est pas pris en compte.
[1]179
[62]180`ST_Intersects(geometry A, geometry B) <http://postgis.org/docs/ST_Intersects.html>`_ : retourne TRUE si les géométries s'intersectent - (ont un espace en commun) et FALSE si elles n'en ont pas (elles sont disjointes).
[1]181
[47]182`ST_Overlaps(geometry A, geometry B) <http://postgis.org/docs/ST_Overlaps.html>`_ : retourne TRUE si les géométries ont un espace en commun, sont de la même dimension, mais ne sont pas complÚtement contenues l'une dans l'autre.
[1]183
[22]184`ST_Touches(geometry A, geometry B)  <http://postgis.org/docs/ST_Touches.html>`_ : retourne TRUE si les géométries ont au moins un point en commun, mais leur intérieurs ne s'intersectent pas.
[1]185
[22]186`ST_Within(geometry A , geometry B) <http://postgis.org/docs/ST_Within.html>`_ : retourne TRUE si la géométrie A est complÚtement à l'intérieur de B
[1]187
Note: See TracBrowser for help on using the repository browser.