Changeset 62 for trunk/workshop-foss4g/joins.rst
- Timestamp:
- 17/03/2012 00:49:40 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/workshop-foss4g/joins.rst
r47 r62 4 4 =================================== 5 5 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 plusieur es tables en utilisant une relation spatiale comme clause de jointure. La plupart des "analyses SIG standards" peuvent être exprimées à l'aide de jointurespatiales.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 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. 7 7 8 8 Dans 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' ?" 9 9 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, 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, 17 17 neighborhoods.boroname AS borough 18 18 FROM nyc_neighborhoods AS neighborhoods … … 21 21 WHERE subways.name = 'Broad St'; 22 22 23 :: 24 25 subway_name | neighborhood_name | borough 23 :: 24 25 subway_name | neighborhood_name | borough 26 26 -------------+--------------------+----------- 27 27 Broad St | Financial District | Manhattan … … 38 38 .. code-block:: sql 39 39 40 SELECT 41 neighborhoods.name AS neighborhood_name, 40 SELECT 41 neighborhoods.name AS neighborhood_name, 42 42 Sum(census.popn_total) AS population, 43 43 Round(100.0 * Sum(census.popn_white) / Sum(census.popn_total),1) AS white_pct, … … 52 52 :: 53 53 54 neighborhood_name | population | white_pct | black_pct 54 neighborhood_name | population | white_pct | black_pct 55 55 ---------------------+------------+-----------+----------- 56 56 Carnegie Hill | 19909 | 91.6 | 1.5 … … 87 87 88 88 #. 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 population s.91 #. AprÚs un peu d'ar ythmétique et de formatage (ex: ``GROUP BY``, ``ORDER BY``)) sur le nombres finaux, notre requête calculles 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:: 94 94 95 95 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. 96 96 97 Nous pouvons aussi utiliser le test de la distance dans notre clef de jointure, pour créer une regroupement de "tou tles éléments dans un certain rayon". Essayons d'analyser la géographie raciale de New York en utilisant les requêtes de distance.97 Nous 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. 98 98 99 99 PremiÚrement, essayons d'obtenir la répartition raciale de la ville. … … 101 101 .. code-block:: sql 102 102 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, 106 106 Sum(popn_total) AS popn_total 107 107 FROM nyc_census_blocks; 108 108 109 :: 110 111 white_pct | black_pct | popn_total 109 :: 110 111 white_pct | black_pct | popn_total 112 112 ---------------------+---------------------+------------ 113 113 44.6586020115685295 | 26.5945063345703034 | 8008278 … … 123 123 124 124 SELECT DISTINCT routes FROM nyc_subway_stations; 125 126 :: 125 126 :: 127 127 128 128 A,C,G … … 137 137 138 138 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 champ sroute.141 142 .. code-block:: sql 143 144 SELECT DISTINCT routes 145 FROM nyc_subway_stations AS subways 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 champ route. 141 142 .. code-block:: sql 143 144 SELECT DISTINCT routes 145 FROM nyc_subway_stations AS subways 146 146 WHERE strpos(subways.routes,'A') > 0; 147 147 148 148 :: 149 149 … … 157 157 A,B,C,D 158 158 A,C,E 159 159 160 160 Essayons de regrouper la répartition raciale dans un rayon de 200 mÚtres de la ligne du train A. 161 161 162 162 .. code-block:: sql 163 163 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, 167 167 Sum(popn_total) AS popn_total 168 168 FROM nyc_census_blocks AS census … … 173 173 :: 174 174 175 white_pct | black_pct | popn_total 175 white_pct | black_pct | popn_total 176 176 ---------------------+---------------------+------------ 177 177 42.0805466940877366 | 23.0936148851067964 | 185259 178 178 179 La répartition raciale le long de la ligne du train A n'est pas radical lement différente de la répartition générale de la ville de New York.179 La 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. 180 180 181 181 Jointures avancées 182 182 ------------------ 183 183 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 plusieur es 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.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 trains 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 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. 187 187 188 188 .. code-block:: sql 189 189 190 190 CREATE TABLE subway_lines ( route char(1) ); 191 INSERT INTO subway_lines (route) VALUES 191 INSERT INTO subway_lines (route) VALUES 192 192 ('A'),('B'),('C'),('D'),('E'),('F'),('G'), 193 193 ('J'),('L'),('M'),('N'),('Q'),('R'),('S'), … … 195 195 ('7'); 196 196 197 Maintenant nous pouvons joindre les tables des lignes de métro sà notre requête précédente.198 199 .. code-block:: sql 200 201 SELECT 197 Maintenant nous pouvons joindre les tables des lignes de métro à notre requête précédente. 198 199 .. code-block:: sql 200 201 SELECT 202 202 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, 205 205 Sum(popn_total) AS popn_total 206 206 FROM nyc_census_blocks AS census … … 214 214 :: 215 215 216 route | white_pct | black_pct | popn_total 216 route | white_pct | black_pct | popn_total 217 217 -------+-----------+-----------+------------ 218 218 S | 30.1 | 59.5 | 32730 … … 239 239 240 240 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 tien d 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.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 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. 242 242 243 243 Liste de fonctions … … 246 246 `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. 247 247 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 d 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). 251 251 252 252 `round(v numeric, s integer) <http://www.postgresql.org/docs/7.4/interactive/functions-math.html>`_: fonction de PostgreSQL qui arrondit à s décimales. … … 256 256 `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. 257 257 258 .. rubric:: Footnotes258 .. rubric:: Notes de bas de page 259 259 260 260 .. [#PostGIS_Doco] http://postgis.org/documentation/manual-1.5/
Note: See TracChangeset
for help on using the changeset viewer.