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.


Ignore:
Timestamp:
17/03/2012 00:49:40 (12 years ago)
Author:
thomasg
Message:

Fin correction typo et orthographe V2 du document

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/workshop-foss4g/joins.rst

    r47 r62  
    44=================================== 
    55 
    6 Les jointures spatiales sont la cerise sur le gâteau des base de données spatiales. Elles vous pemettent de combiner les informations de plusieures tables en utilisant une relation spatiale comme clause de jointure. La plupart des "analyses SIG standards" peuvent être exprimées à l'aide de jointure spatiales. 
     6Les jointures spatiales sont la cerise sur le gâteau des base de données spatiales. Elles vous pemettent de combiner les informations de plusieurs tables en utilisant une relation spatiale comme clause de jointure. La plupart des "analyses SIG standards" peuvent être exprimées à l'aide de jointures spatiales. 
    77 
    88Dans la partie précédente, nous avons utilisé les relations spatiales en utilisant deux étapes dans nos requêtes : nous avons dans un premier temps extrait la station de métro "Broad St" puis nous avons utilisé ce résultat dans nos autres requêtes pour répondre aux questions comme "dans quel quartier se situe la station 'Broad St' ?" 
    99 
    10 En utilisant les jointures spatiales, nous pouvons répondre aux questions en une seule étape, récupérant les informations relatives à la station de métro et le quartier la contenant :  
    11  
    12 .. code-block:: sql 
    13  
    14   SELECT  
    15     subways.name AS subway_name,  
    16     neighborhoods.name AS neighborhood_name,  
     10En utilisant les jointures spatiales, nous pouvons répondre aux questions en une seule étape, récupérant les informations relatives à la station de métro et le quartier la contenant : 
     11 
     12.. code-block:: sql 
     13 
     14  SELECT 
     15    subways.name AS subway_name, 
     16    neighborhoods.name AS neighborhood_name, 
    1717    neighborhoods.boroname AS borough 
    1818  FROM nyc_neighborhoods AS neighborhoods 
     
    2121  WHERE subways.name = 'Broad St'; 
    2222 
    23 ::  
    24  
    25    subway_name | neighborhood_name  |  borough   
     23:: 
     24 
     25   subway_name | neighborhood_name  |  borough 
    2626  -------------+--------------------+----------- 
    2727   Broad St    | Financial District | Manhattan 
     
    3838.. code-block:: sql 
    3939 
    40   SELECT  
    41     neighborhoods.name AS neighborhood_name,  
     40  SELECT 
     41    neighborhoods.name AS neighborhood_name, 
    4242    Sum(census.popn_total) AS population, 
    4343    Round(100.0 * Sum(census.popn_white) / Sum(census.popn_total),1) AS white_pct, 
     
    5252:: 
    5353 
    54    neighborhood_name  | population | white_pct | black_pct  
     54   neighborhood_name  | population | white_pct | black_pct 
    5555 ---------------------+------------+-----------+----------- 
    5656  Carnegie Hill       |      19909 |      91.6 |       1.5 
     
    8787 
    8888#. La clause ``JOIN`` crée une table virtuelle qui contient les colonnes à la fois des quartiers et des recensements (tables neighborhoods et census). 
    89 #. La clause ``WHERE`` filtre la table virtuelle pour ne conserver que la ligne correspondant à Manhattan.  
    90 #. Les lignes restantes sont regroupées par le nom du quartier et sont utilisées par la fonction d'agrégation : :command:`Sum()` pour réaliser la somme des valeurs de la populations. 
    91 #. AprÚs un peu d'arythmétique et de formatage (ex: ``GROUP BY``, ``ORDER BY``)) sur le nombres finaux, notre requête calcul les pourcentages. 
    92  
    93 .. note::  
     89#. La clause ``WHERE`` filtre la table virtuelle pour ne conserver que la ligne correspondant à Manhattan. 
     90#. Les lignes restantes sont regroupées par le nom du quartier et sont utilisées par la fonction d'agrégation : :command:`Sum()` pour réaliser la somme des valeurs de la population. 
     91#. AprÚs un peu d'arithmétique et de formatage (ex: ``GROUP BY``, ``ORDER BY``)) sur le nombres finaux, notre requête calcule les pourcentages. 
     92 
     93.. note:: 
    9494 
    9595   La clause ``JOIN`` combine deux parties ``FROM``.  Par défaut, nous utilisons un jointure du type :``INNER JOIN``, mais il existe quatres autres types de jointures. Pour de plus amples informations à ce sujet, consultez la partie `type_jointure <http://docs.postgresql.fr/9.1/sql-select.html>`_ de la page de la documentation officielle de PostgreSQL. 
    9696 
    97 Nous pouvons aussi utiliser le test de la distance dans notre clef de jointure, pour créer une regroupement de "tout les éléments dans un certain rayon". Essayons d'analyser la géographie raciale de New York en utilisant les requêtes de distance. 
     97Nous pouvons aussi utiliser le test de la distance dans notre clef de jointure, pour créer une regroupement de "tous les éléments dans un certain rayon". Essayons d'analyser la géographie raciale de New York en utilisant les requêtes de distance. 
    9898 
    9999PremiÚrement, essayons d'obtenir la répartition raciale de la ville. 
     
    101101.. code-block:: sql 
    102102 
    103   SELECT  
    104     100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,  
    105     100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,  
     103  SELECT 
     104    100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct, 
     105    100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct, 
    106106    Sum(popn_total) AS popn_total 
    107107  FROM nyc_census_blocks; 
    108108 
    109 ::  
    110  
    111         white_pct      |      black_pct      | popn_total  
     109:: 
     110 
     111        white_pct      |      black_pct      | popn_total 
    112112  ---------------------+---------------------+------------ 
    113113   44.6586020115685295 | 26.5945063345703034 |    8008278 
     
    123123 
    124124  SELECT DISTINCT routes FROM nyc_subway_stations; 
    125    
    126 ::  
     125 
     126:: 
    127127 
    128128 A,C,G 
     
    137137 
    138138   Le mot clef ``DISTINCT`` permet d'éliminer les répétitions de lignes de notre résultat. Dans ce mot clef, notre requête renverrait 491 résultats au lieu de 73. 
    139     
    140 Donc pour trouver le train A, nous allons demander toutes les lignes ayant pour ``routes`` la valeur 'A'. Nous pouvons faire cela de différentes maniÚres, mais nous utiliserons aujourd'hui le fait que la fonction :command:`strpos(routes,'A')` retourne un entier différent de 0 si la lettre 'A' se trouve dans la valeur du champs route. 
    141  
    142 .. code-block:: sql 
    143  
    144    SELECT DISTINCT routes  
    145    FROM nyc_subway_stations AS subways  
     139 
     140Donc pour trouver le train A, nous allons demander toutes les lignes ayant pour ``routes`` la valeur 'A'. Nous pouvons faire cela de différentes maniÚres, mais nous utiliserons aujourd'hui le fait que la fonction :command:`strpos(routes,'A')` retourne un entier différent de 0 si la lettre 'A' se trouve dans la valeur du champ route. 
     141 
     142.. code-block:: sql 
     143 
     144   SELECT DISTINCT routes 
     145   FROM nyc_subway_stations AS subways 
    146146   WHERE strpos(subways.routes,'A') > 0; 
    147     
     147 
    148148:: 
    149149 
     
    157157  A,B,C,D 
    158158  A,C,E 
    159    
     159 
    160160Essayons de regrouper la répartition raciale dans un rayon de 200 mÚtres de la ligne du train A. 
    161161 
    162162.. code-block:: sql 
    163163 
    164   SELECT  
    165     100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct,  
    166     100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct,  
     164  SELECT 
     165    100.0 * Sum(popn_white) / Sum(popn_total) AS white_pct, 
     166    100.0 * Sum(popn_black) / Sum(popn_total) AS black_pct, 
    167167    Sum(popn_total) AS popn_total 
    168168  FROM nyc_census_blocks AS census 
     
    173173:: 
    174174 
    175         white_pct      |      black_pct      | popn_total  
     175        white_pct      |      black_pct      | popn_total 
    176176  ---------------------+---------------------+------------ 
    177177   42.0805466940877366 | 23.0936148851067964 |     185259 
    178178 
    179 La répartition raciale le long de la ligne du train A n'est pas radicallement différente de la répartition générale de la ville de New York. 
     179La répartition raciale le long de la ligne du train A n'est pas radicalement différente de la répartition générale de la ville de New York. 
    180180 
    181181Jointures avancées 
    182182------------------ 
    183183 
    184 Dans la derniÚre partie nous avons vu que le train A n'est pas utilisé par des populations si éloignées de la répartition totale du reste de la ville. Y-a-t-il des train qui passent par des parties de la ville qui ne sont pas dans la moyenne de la répartition raciale ? 
    185  
    186 Pour répondre à cette question, nous ajouterons une nouvelle jointure à notre requête, de telle maniÚre que nous puissions calculer simultanément la répartition raciale de plusieures lignes de métro à la fois. Pour faire ceci, nous créerons une table qui permettra d'énumérer toutes les lignes que nous voulons regrouper. 
     184Dans la derniÚre partie nous avons vu que le train A n'est pas utilisé par des populations si éloignées de la répartition totale du reste de la ville. Y-a-t-il des trains qui passent par des parties de la ville qui ne sont pas dans la moyenne de la répartition raciale ? 
     185 
     186Pour répondre à cette question, nous ajouterons une nouvelle jointure à notre requête, de telle maniÚre que nous puissions calculer simultanément la répartition raciale de plusieurs lignes de métro à la fois. Pour faire ceci, nous créerons une table qui permettra d'énumérer toutes les lignes que nous voulons regrouper. 
    187187 
    188188.. code-block:: sql 
    189189 
    190190    CREATE TABLE subway_lines ( route char(1) ); 
    191     INSERT INTO subway_lines (route) VALUES  
     191    INSERT INTO subway_lines (route) VALUES 
    192192      ('A'),('B'),('C'),('D'),('E'),('F'),('G'), 
    193193      ('J'),('L'),('M'),('N'),('Q'),('R'),('S'), 
     
    195195      ('7'); 
    196196 
    197 Maintenant nous pouvons joindre les tables des lignes de métros à notre requête précédente. 
    198  
    199 .. code-block:: sql 
    200  
    201     SELECT  
     197Maintenant nous pouvons joindre les tables des lignes de métro à notre requête précédente. 
     198 
     199.. code-block:: sql 
     200 
     201    SELECT 
    202202      lines.route, 
    203       Round(100.0 * Sum(popn_white) / Sum(popn_total), 1) AS white_pct,  
    204       Round(100.0 * Sum(popn_black) / Sum(popn_total), 1) AS black_pct,  
     203      Round(100.0 * Sum(popn_white) / Sum(popn_total), 1) AS white_pct, 
     204      Round(100.0 * Sum(popn_black) / Sum(popn_total), 1) AS black_pct, 
    205205      Sum(popn_total) AS popn_total 
    206206    FROM nyc_census_blocks AS census 
     
    214214:: 
    215215 
    216      route | white_pct | black_pct | popn_total  
     216     route | white_pct | black_pct | popn_total 
    217217    -------+-----------+-----------+------------ 
    218218     S     |      30.1 |      59.5 |      32730 
     
    239239 
    240240 
    241 Comme précédemment, les jointures créent une table virtuelle de toutes les combinaisons possibles et disponibles à l'aide des contraintes de type ``JOIN ON`. Ces lignes sont ensuite utilisées dans le regroupement ``GROUP``. La magie spatiale tiend dans l'utilisation de la fonction ``ST_DWithin`` qui s'assure que les blocs sont suffisamment proches des lignes de métros inclues dans le calcul. 
     241Comme précédemment, les jointures créent une table virtuelle de toutes les combinaisons possibles et disponibles à l'aide des contraintes de type ``JOIN ON`. Ces lignes sont ensuite utilisées dans le regroupement ``GROUP``. La magie spatiale tient dans l'utilisation de la fonction ``ST_DWithin`` qui s'assure que les blocs sont suffisamment proches des lignes de métros incluses dans le calcul. 
    242242 
    243243Liste de fonctions 
     
    246246`ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_: retourne TRUE si et seulement si aucun point de B est à l'extérieur de A, et si au moins un point à l'intérieur de B  est à l'intérieur de A. 
    247247 
    248 `ST_DWithin(geometry A, geometry B, radius) <http://postgis.org/docs/ST_DWithin.html>`_: retourne TRUE si les géométries sont distantes du rayon donné.  
    249  
    250 `ST_Intersects(geometry A, geometry B) <http://postgis.org/docs/ST_Intersects.html>`_: retourne TRUE si les géométries/géographies "s'intersectent spatialement" (partage une portiond de l'espace) et FALSE sinon (elles sont dijointes).  
     248`ST_DWithin(geometry A, geometry B, radius) <http://postgis.org/docs/ST_DWithin.html>`_: retourne TRUE si les géométries sont distantes du rayon donné. 
     249 
     250`ST_Intersects(geometry A, geometry B) <http://postgis.org/docs/ST_Intersects.html>`_: retourne TRUE si les géométries/géographies "s'intersectent spatialement" (partage une portion de l'espace) et FALSE sinon (elles sont disjointes). 
    251251 
    252252`round(v numeric, s integer) <http://www.postgresql.org/docs/7.4/interactive/functions-math.html>`_: fonction de PostgreSQL qui arrondit à s décimales. 
     
    256256`sum(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: fonction d'agrégation de PostgreSQL qui retourne la somme d'un ensemble de valeurs. 
    257257 
    258 .. rubric:: Footnotes 
     258.. rubric:: Notes de bas de page 
    259259 
    260260.. [#PostGIS_Doco] http://postgis.org/documentation/manual-1.5/ 
Note: See TracChangeset for help on using the changeset viewer.