Changeset 62
- Timestamp:
- 17/03/2012 00:49:40 (13 years ago)
- Location:
- trunk/workshop-foss4g
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/workshop-foss4g/about_data.rst
r45 r62 4 4 ================================== 5 5 6 Les données utilisées dans ces travaux pratiques sont quatre shapefiles de la ville de New York, et une table attributaire des variables socio-démographiques de la ville. Nous les avons charg ersous forme de tables PostGIS et nous ajouterons les données socio-démographiques plus tard.6 Les données utilisées dans ces travaux pratiques sont quatre shapefiles de la ville de New York, et une table attributaire des variables socio-démographiques de la ville. Nous les avons chargés sous forme de tables PostGIS et nous ajouterons les données socio-démographiques plus tard. 7 7 8 8 Cette partie fournit le nombre d'enregistrements et les attributs de chacun de nos ensembles de données. Ces valeurs attributaires et les relations sont essentielles pour nos futures analyses. … … 13 13 ----------------- 14 14 15 Un bloc re ssencé est la plus petite entité géographique pour laquelle un ressencement est raporté. Toutes les couches représentant les niveaux suppérieurs (régions, zones de métro, comtés) peuvent être contruites à partir de ces blocs. Nous avons attaché des données démographiques aux blocs.15 Un bloc recensé est la plus petite entité géographique pour laquelle un recensement est rapporté. Toutes les couches représentant les niveaux supérieurs (régions, zones de métro, comtés) peuvent être contruites à partir de ces blocs. Nous avons attaché des données démographiques aux blocs. 16 16 17 17 Nombre d'enregistrements : 36592 18 18 19 19 .. list-table:: 20 :widths: 20 80 20 :widths: 20 80 21 21 22 22 * - **blkid** … … 29 29 - Nombre de personnes se déclarant comme de couleur noire 30 30 * - **popn_nativ** 31 - Nombre de personnes se déclarant comme natif d' amérique du nord31 - Nombre de personnes se déclarant comme natif d'Amérique du nord 32 32 * - **popn_asian** 33 33 - Nombre de personnes se déclarant comme asiatique … … 46 46 47 47 .. figure:: ./screenshots/nyc_census_blocks.png 48 49 *Pourcentage de la population qui est de couleur noire*50 48 51 .. note:: 49 *Pourcentage de la population qui est de couleur noire* 52 50 53 Pour disposer des données d'un recensement dans votre SIG, vous avez besoin de joindre deux informations: Les données socio-démographiques et les limites géographiques des blocs/quartiers. Il existe plusieurs moyen de se les procurer, dans notre cas elles ont été récupérées sur le site Internet du Census Bureau's `American FactFinder <http://factfinder.census.gov>`_. 54 51 .. note:: 52 53 Pour disposer des données d'un recensement dans votre SIG, vous avez besoin de joindre deux informations: Les données socio-démographiques et les limites géographiques des blocs/quartiers. Il existe plusieurs moyen de se les procurer, dans notre cas, elles ont été récupérées sur le site Internet du Census Bureau's `American FactFinder <http://factfinder.census.gov>`_. 54 55 55 nyc_neighborhoods 56 56 ----------------- 57 57 58 Les quartiers de New York 58 Les quartiers de New York 59 59 60 60 Nombre d'enregistrements: 129 61 61 62 62 .. list-table:: 63 :widths: 20 80 63 :widths: 20 80 64 64 65 65 * - **name** 66 66 - Nom du quartier 67 67 * - **boroname** 68 - N amede la section dans New York (Manhattan, The Bronx, Brooklyn, Staten Island, Queens)68 - Nom de la section dans New York (Manhattan, The Bronx, Brooklyn, Staten Island, Queens) 69 69 * - **the_geom** 70 70 - Limite polygonale du quartier 71 71 72 72 .. figure:: ./screenshots/nyc_neighborhoods.png 73 73 74 *Les quartiers de New York* 74 *Les quartiers de New York* 75 75 76 76 nyc_streets … … 82 82 83 83 .. list-table:: 84 :widths: 20 80 84 :widths: 20 80 85 85 86 86 * - **name** … … 92 92 * - **the_geom** 93 93 - Ligne du centre de la rue. 94 94 95 95 .. figure:: ./screenshots/nyc_streets.png 96 96 97 97 *Les rues de New York (les rues principales apparaissent en rouge)* 98 98 99 99 100 100 nyc_subway_stations 101 101 ------------------- … … 132 132 .. note:: 133 133 134 La donnée ``nyc_census_sociodata`` est une table attributaire. Nous devrons nous connecter aux géométries correspondant à la zone du recens sement avant de conduire toute analyse spatiale .135 134 La donnée ``nyc_census_sociodata`` est une table attributaire. Nous devrons nous connecter aux géométries correspondant à la zone du recensement avant de conduire toute analyse spatiale . 135 136 136 .. list-table:: 137 137 :widths: 20 80 138 138 139 139 * - **tractid** 140 - Un code à 11 chiffre qui identifie chaque secteur de rece ssement. **tract**. Eg: 36005000100140 - Un code à 11 chiffre qui identifie chaque secteur de recensement. **tract**. Eg: 36005000100 141 141 * - **transit_total** 142 142 - Nombre de travailleurs dans le secteur … … 146 146 - Nombre de travailleurs dans le secteur utilisant un véhicule privé 147 147 * - **transit_other** 148 - Nombre de travailleurs dans le secteur utilisant un autre moyen de transport 148 - Nombre de travailleurs dans le secteur utilisant un autre moyen de transport 149 149 * - **transit_time_mins** 150 150 - Nombre total de minutes passées dans les transports par l'ensemble des travailleurs du secteur (minutes) … … 152 152 - Nombre de familles dans le secteur 153 153 * - **family_income_median** 154 - Revenu médian tpar famille du secteur (dollars)154 - Revenu médian par famille du secteur (dollars) 155 155 * - **family_income_aggregate** 156 156 - Revenu total de toutes les familles du secteur (dollars) … … 164 164 - Nombre de personnes ayant un diplÃŽme de lycée 165 165 * - **edu_graduate_dipl** 166 - Nombre de personnes ayant un diplÃŽme de collÚge 166 - Nombre de personnes ayant un diplÃŽme de collÚge 167 167 -
trunk/workshop-foss4g/equality.rst
r52 r62 7 7 -------- 8 8 9 Ãtre en mesure de déterminer si deux geométries sont égales peut être compliqué. PostGIS met à votre disposition différentes fonctions permettant de juger de l'égalité à différents niveaux, bien que pour des raison de simplicité nous n uos contenterons ici de la définition fournie plus bas. Pour illustrer ces fonctions, nous utiliserontles polygones suivants.9 Ãtre en mesure de déterminer si deux geométries sont égales peut être compliqué. PostGIS met à votre disposition différentes fonctions permettant de juger de l'égalité à différents niveaux, bien que pour des raison de simplicité nous nous contenterons ici de la définition fournie plus bas. Pour illustrer ces fonctions, nous utiliserons les polygones suivants. 10 10 11 11 .. image:: ./equality/polygon-table.png … … 16 16 17 17 CREATE TABLE polygons (name varchar, poly geometry); 18 19 INSERT INTO polygons VALUES 18 19 INSERT INTO polygons VALUES 20 20 ('Polygon 1', 'POLYGON((-1 1.732,1 1.732,2 0,1 -1.732, 21 21 -1 -1.732,-2 0,-1 1.732))'), … … 27 27 2 0,1.5 -0.866,1 -1.732,0 -1.732,-1 -1.732,-1.5 -0.866, 28 28 -2 0,-1.5 0.866,-1 1.732))'), 29 ('Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732, 29 ('Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732, 30 30 -2 1.732,-2 -1.732))'); 31 31 32 32 SELECT Populate_Geometry_Columns(); 33 33 … … 35 35 36 36 Exactement égaux 37 ^^^^^^^^^^^^^^^^ ^^37 ^^^^^^^^^^^^^^^^ 38 38 39 L'égalité exacte est déterminée en comparant deux géométries, sommets par sommets, dans l'ordre, pour s'assurer que chacun est à une position identique. Les exemples suivant montrent comment cette méthode peut être limitée dans son éfficacité.39 L'égalité exacte est déterminée en comparant deux géométries, sommets par sommets, dans l'ordre, pour s'assurer que chacun est à une position identique. Les exemples suivant montrent comment cette méthode peut être limitée dans son efficacité. 40 40 41 41 .. code-block:: sql … … 47 47 .. image:: ./equality/start14.png 48 48 49 Dans cette exemple, les polygones sont seulement égaux à eux-même, mais jamais avec un des autres polygones (dans notre exemple les polygones de 1 à 3). Dans le cas des polygones 1, 2 et 3, les sommets sont à des position identiques mais sont définies dans un ordre différent. Le polygone 4 a des sommets en double causant la non-égalité avec le polygone 1.49 Dans cette exemple, les polygones sont seulement égaux à eux-même, mais jamais avec un des autres polygones (dans notre exemple les polygones de 1 à 3). Dans le cas des polygones 1, 2 et 3, les sommets sont à des positions identiques mais sont définis dans un ordre différent. Le polygone 4 a des sommets en double causant la non-égalité avec le polygone 1. 50 50 51 Spatial lement égaux52 ^^^^^^^^^^^^^^^ 51 Spatialement égaux 52 ^^^^^^^^^^^^^^^^^^ 53 53 54 Comme nous l'avons précédemment , l'égalité exacte ne prend pas en compte la nature spatiale des géométries. Il y a une fonction, nommée :command:`ST_Equals`, permettant de tester l'égalité spatiale ou l'équivalentdes géométries.54 Comme nous l'avons précédemment montré, l'égalité exacte ne prend pas en compte la nature spatiale des géométries. Il y a une fonction, nommée :command:`ST_Equals`, permettant de tester l'égalité spatiale ou l'équivalence des géométries. 55 55 56 56 .. code-block:: sql 57 57 58 SELECT a.name, b.name, CASE WHEN ST_Equals(a.poly, b.poly) 58 SELECT a.name, b.name, CASE WHEN ST_Equals(a.poly, b.poly) 59 59 THEN 'Spatially Equal' ELSE 'Not Equal' end 60 60 FROM polygons as a, polygons as b; … … 62 62 .. image:: ./equality/start15.png 63 63 64 Ces résultats sont plus proches de notre compréhension intuitive de l'égalité. Les polygones de 1 à 4 sont co sidérés comme égaux, puisque qu'elles recouvrent la même zone. Notez que ni la direction despolygones n'est considérée, le point de départ pour la définition du polygone, ni le nombre de points. Ce qui importe c'est que la zone géographique représentée est la même.64 Ces résultats sont plus proches de notre compréhension intuitive de l'égalité. Les polygones de 1 à 4 sont considérés comme égaux, puisque qu'ils recouvrent la même zone. Notez que ni la direction des polygones n'est considérée, ni le point de départ pour la définition du polygone, ni le nombre de points. Ce qui importe c'est que la zone géographique représentée soit la même. 65 65 66 66 Ãgalité des étendues 67 67 ^^^^^^^^^^^^^^^^^^^^^ 68 68 69 L'égalité exacte nécessite, dans le pire des cas, de comparer cha qu'un des sommets d'une géométrie pour déterminél'égalité. Ceci peut être trÚs lent, et s'avérer innaproprié pour comparer un grand nombre de géométries. Pour permettre de rendre plus rapide ces comparaison, l'opération d'égalité des étendue est fournit : :command:`=`. Cet opérateur utilise uniquement les étendues (cadre limite rectangulaire), assurant que les géométries occupent le même espace dans un repÚre cartésien en deux dimensions, mais ne représente pas nécessairement le même espace.69 L'égalité exacte nécessite, dans le pire des cas, de comparer chacun des sommets d'une géométrie pour déterminer l'égalité. Ceci peut être trÚs lent, et s'avérer innaproprié pour comparer un grand nombre de géométries. Pour permettre de rendre plus rapide ces comparaison, l'opération d'égalité des étendue est fournit : :command:`=`. Cet opérateur utilise uniquement les étendues (cadre limite rectangulaire), assurant que les géométries occupent le même espace dans un repÚre cartésien en deux dimensions, mais ne représente pas nécessairement le même espace. 70 70 71 71 .. code-block:: sql 72 72 73 SELECT a.name, b.name, CASE WHEN a.poly = b.poly 73 SELECT a.name, b.name, CASE WHEN a.poly = b.poly 74 74 THEN 'Equal Bounds' ELSE 'Non-equal Bounds' end 75 75 FROM polygons as a, polygons as b; … … 77 77 .. image:: ./equality/start17.png 78 78 79 Comme vous pouvez le constater, toutes les géométries égales ont aussi une étendue égale s. Malheureusement, le polygone 5 est aussi retourné comme étant égal avec ce test, puisqu'il partage la même étendue que les autres géométries. Mais alors, pourquoi est-ce utile ? Bien que cela soit traité en détail plus tard, la réponse courte est que cela permet l'utilisation d'indexation spatiales qui peuvent réduire drastiquement les ensembles de géométries à comparrer en utilisant des filtres utilisant cette égalité d'étendues.79 Comme vous pouvez le constater, toutes les géométries égales ont aussi une étendue égale. Malheureusement, le polygone 5 est aussi retourné comme étant égal avec ce test, puisqu'il partage la même étendue que les autres géométries. Mais alors, pourquoi est-ce utile ? Bien que cela soit traité en détail plus tard, la réponse courte est que cela permet l'utilisation d'indexations spatiales qui peuvent réduire drastiquement les ensembles de géométries à comparer en utilisant des filtres utilisant cette égalité d'étendue. 80 80 -
trunk/workshop-foss4g/geography.rst
r53 r62 4 4 ===================================== 5 5 6 Il est trÚs fréquent de manipuler des données à coordonnées "géographiques" ou de "longitude/latitude". 7 8 Au 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. 6 Il est trÚs fréquent de manipuler des données à coordonnées "géographiques" ou de "longitude/latitude". 7 8 Au 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. 9 9 10 10 .. image:: ./geography/cartesian_spherical.jpg 11 11 12 12 13 Vous 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 13 Vous 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 longueurs seront erronées. Etant donné que les coordonnées sphériques mesurent des angles, l'unité est le degré. 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 15 15 16 16 Voici par exemple les coordonnées des villes de Los Angeles et Paris. … … 18 18 * Los Angeles: ``POINT(-118.4079 33.9434)`` 19 19 * Paris: ``POINT(2.3490 48.8533)`` 20 21 La 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érence s spatiales géographiques.20 21 La 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érence spatiale géographique. 22 22 23 23 .. code-block:: sql … … 31 31 32 32 121.898285970107 33 34 Aha! 121! Mais, que veut dire cela ? 35 36 L'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 pl su 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 !37 38 Pour calculer une distance ayant du sens, nous devons traiter les coordonnées géographiques non pas com e 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 uensphÚre, comme une portion d'un grand cercle.33 34 Aha! 121! Mais, que veut dire cela ? 35 36 L'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 plus petite au fur et à mesure que l'on s'éloigne de l'équateur. Pensez par exemple aux méridiens sur le globe qui se resserrent entre eux au niveau des pÃŽles. Donc une distance de 121 degrés ne veut rien dire ! 37 38 Pour calculer une distance ayant du sens, nous devons traiter les coordonnées géographiques non pas comme 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 une sphÚre, comme une portion d'un grand cercle. 39 39 40 40 Depuis sa version 1.5, PostGIS fournit cette fonctionnalité avec le type ``geography``. … … 43 43 44 44 Différentes bases de données spatiales développent différentes approches pour manipuler les coordonnées géographiques. 45 46 * Oracle essaye de mettre à jour la différence de maniÚre transparente en lan acant 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. 45 46 * Oracle essaye de mettre à jour la différence de maniÚre transparente en lançant des calculs lorsque 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 49 * Comme SQL Server, PostGIS utilise deux types: "geometry" et "geography". 50 51 En 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)`.50 51 En utilisant le type ``geography`` plutot que ``geometry``, essayons 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)`. 52 52 53 53 .. code-block:: sql … … 66 66 Les 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. 67 67 68 Le 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?" 68 Le 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?" 69 69 70 70 .. image:: ./geography/lax_cdg.jpg 71 71 72 Ré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.72 Répondre à cette question en travaillant avec un plan cartésien fournit une trÚs mauvaise réponse en effet ! En utilisant la ligne rouge, nous obtenons une 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. 73 73 74 74 .. code-block:: sql … … 76 76 SELECT ST_Distance( 77 77 ST_GeographyFromText('LINESTRING(-118.4079 33.9434, 2.5559 49.0083)'), -- LAX-CDG 78 ST_GeographyFromText('POINT(-21.8628 64.1286)') -- Iceland 78 ST_GeographyFromText('POINT(-21.8628 64.1286)') -- Iceland 79 79 ); 80 80 … … 82 82 83 83 531773.757079116 84 85 Donc le point le plu sproche de l'Islande pendant le vol LAX-CDG est de 532 kilomÚtres.S86 87 L'approche cartésienne pour manipuler les coordonnées géographiques per t 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.84 85 Donc le point le plus proche de l'Islande pendant le vol LAX-CDG est de 532 kilomÚtres. 86 87 L'approche cartésienne pour manipuler les coordonnées géographiques perd tout son sens pour les objets situés 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 88 89 89 .. image:: ./geography/lax_nrt.png … … 94 94 ST_GeometryFromText('Point(-118.4079 33.9434)'), -- LAX 95 95 ST_GeometryFromText('Point(139.733 35.567)')) -- NRT (Tokyo/Narita) 96 AS geometry_distance, 96 AS geometry_distance, 97 97 ST_Distance( 98 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 99 ST_GeographyFromText('Point(139.733 35.567)')) -- NRT (Tokyo/Narita) 100 AS geography_distance; 101 102 :: 103 104 geometry_distance | geography_distance 105 105 -------------------+-------------------- 106 106 258.146005837336 | 8833954.76996256 … … 110 110 ---------------------------- 111 111 112 Afin 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éographieset la fonction :command:`Geography(geometry)` change le type ("cast") de géométrie à géographie.112 Afin d'importer des données dans une table de type ``geography``, les objets géographiques doivent d'abord être projetés dans le systÚme EPSG:4326 (longitude/latitude), ensuite ils doivent être convertis en objets de type ``geography``. La fonction :command:`ST_Transform(geometry,srid)` convertit les coordonnées en ``geography`` et la fonction :command:`Geography(geometry)` change le type ("cast") de géométrie à géographie. 113 113 114 114 .. code-block:: sql 115 115 116 116 CREATE TABLE nyc_subway_stations_geog AS 117 SELECT 118 Geography(ST_Transform(the_geom,4326)) AS geog, 119 name, 117 SELECT 118 Geography(ST_Transform(the_geom,4326)) AS geog, 119 name, 120 120 routes 121 121 FROM nyc_subway_stations; 122 123 La 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 :124 125 .. code-block:: sql 126 127 CREATE INDEX nyc_subway_stations_geog_gix 122 123 La construction d'une indexation spatiale sur une table stockant des objets de type ``geography`` est exactement identique à la méthode employée pour les géométries : 124 125 .. code-block:: sql 126 127 CREATE INDEX nyc_subway_stations_geog_gix 128 128 ON nyc_subway_stations_geog USING GIST (geog); 129 129 130 La 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.131 132 Il n'y a qu'un petit nombre de fonctions disponibles pour le type géographie :133 130 La différence est camouflée : l'indexation des objets de type ``geography`` gÚre correctement les requêtes qui recouvrent les pÃŽles ou traversent les fuseaux horaires, alors que les géométries ne le supporteront pas. 131 132 Il n'y a qu'un petit nombre de fonctions disponibles pour le type ``geography`` : 133 134 134 * :command:`ST_AsText(geography)` retourne la représentation ``textuelle`` 135 135 * :command:`ST_GeographyFromText(text)` retourne un objet de type ``geography`` … … 149 149 * :command:`ST_Buffer(geography, float8)` retourne ``geography`` [#Casting_note]_ 150 150 * :command:`ST_Intersection(geography, geography)` retourne ``geography`` [#Casting_note]_ 151 152 Création d'une table stockant des géogra hpies151 152 Création d'une table stockant des géographies 153 153 --------------------------------------------- 154 155 Le 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éographiepermettent de spécifier directement le type d'objet géographique à la création de la table. Par exemple :154 155 Le code SQL permettant la création d'une nouvelle table avec une colonne de type ``geography`` ressemble à la création d'une table stockant des géométries. Cependant, les objets de type ``geography`` permettent de spécifier directement le type d'objet géographique à la création de la table. Par exemple : 156 156 157 157 .. code-block:: sql … … 161 161 geog GEOGRAPHY(Point) 162 162 ); 163 163 164 164 INSERT INTO airports VALUES ('LAX', 'POINT(-118.4079 33.9434)'); 165 165 INSERT INTO airports VALUES ('CDG', 'POINT(2.5559 49.0083)'); 166 166 INSERT INTO airports VALUES ('REK', 'POINT(-21.8628 64.1286)'); 167 168 Lors de la définition n 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``.167 168 Lors de la définition le type ``GEOGRAPHY(Point)`` spécifie que nos aéroports sont des points. Le nouveau champ 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 ``geography`` s'effectue dans une vue appelée ``geography_columns`` qui est maintenue à jour automatiquement sans avoir besoin d'utiliser des fonctions comme ``geography_columns``. 169 169 170 170 .. code-block:: sql 171 171 172 172 SELECT * FROM geography_columns; 173 174 :: 175 176 f_table_name | f_geography_column | srid | type 173 174 :: 175 176 f_table_name | f_geography_column | srid | type 177 177 -------------------------------+--------------------+------+---------- 178 178 nyc_subway_stations_geography | geog | 0 | Geometry 179 179 airports | geog | 4326 | Point 180 180 181 181 .. note:: 182 182 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. 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. 184 184 185 185 Conversion de type 186 186 ------------------- 187 187 188 Bien que les fonctions de base s 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éographieset inversement.189 190 La syntaxe habituelle de PostgreSQL pour les conversion de type consiste à ajouter à la valeur la chaîne suivante ``::typename``. Donc, ``2::text`` converti ela 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.191 192 La fonction :command:`ST_X(point)` supporte seulement le type géométrique. Comment lire la coordon ée X d'une de nos géographie ?188 Bien que les fonctions de base qui s'appliquent au type ``geography`` puissent ê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étrie en des objets de types géographie et inversement. 189 190 La syntaxe habituelle de PostgreSQL pour les conversion de type consiste à ajouter à la valeur la chaîne suivante ``::typename``. Donc, ``2::text`` convertit 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. 191 192 La fonction :command:`ST_X(point)` supporte seulement le type géométrique. Comment lire la coordonnée X d'une de nos géographie ? 193 193 194 194 .. code-block:: sql … … 198 198 :: 199 199 200 code | longitude 200 code | longitude 201 201 ------+----------- 202 LAX | -118.4079 202 LAX | -118.4079 203 203 CDG | 2.5559 204 204 REK | -21.8628 205 205 206 En 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 aut emps de fonctions s'appliquant augé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.207 208 206 En 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 autant de fonctions s'appliquant aux 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. 207 208 209 209 Pourquoi (ne pas) utiliser les géographies 210 210 ------------------------------------------ 211 211 212 Les géographies ont des coordonnées universellement acceptées - chacun peut comprendre que représente la latitu e et la longitude, mais peut de personne comprennent ce que les coordonnées UTM signifient. Pourquoi ne pas tout le temps utiliserdes géographies ?213 214 * PremiÚrement, comme indiqué précédemment, il n'y a que quelques fonctions qui supportent ce type de données. Vous risque rde 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) entra ine 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.216 217 Quel conclusion en tirer ? 218 219 Si vos données sont géogra hpiquement 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Úmede projection applicables dans votre cas.220 221 Si, 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.212 Les géographies ont des coordonnées universellement acceptées - chacun peut comprendre que représente la latitude et la longitude, mais peu de personne comprennent ce que les coordonnées UTM signifient. Pourquoi ne pas tout le temps utiliser des géographies ? 213 214 * PremiÚrement, comme indiqué précédemment, il n'y a que quelques fonctions qui supportent ce type de données. Vous risquez 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) entraîne un seul appel à la fonction racine carré (sqrt()). La formule de calcul de distance sphérique (Haversine) utilise deux appels à la fonction racine carré, et un appel à arctan(), quatre appels à sin() et deux à cos(). Les fonctions trigonométriques sont trÚs coûteuses, et les calculs sphériques les utilisent massivement. 216 217 Quel conclusion en tirer ? 218 219 Si vos données sont géographiquement compactes (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 pertinente pour votre localisation. Consultez le site http://spatialreference.org et tapez le nom de votre région pour visualiser la liste des systÚmes de projection applicables dans votre cas. 220 221 Si, d'un autre coté, vous avez besoin de calculer des distances qui sont géographiquement éparses (recouvrant la plupart du monde), utilisez le type ``geography``. La complexité de l'application évitée 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ées pour ce type. 222 222 223 223 Liste des fonctions 224 224 ------------------- 225 225 226 `ST_Distance(geometry, geometry) <http://postgis.org/docs/ST_Distance.html>`_: Pour le type géométrie, renvoi t la distance cartésienne, pour les géographies la distance sphérique en métres.226 `ST_Distance(geometry, geometry) <http://postgis.org/docs/ST_Distance.html>`_: Pour le type géométrie, renvoie la distance cartésienne, pour les géographies la distance sphérique en mÚtres. 227 227 228 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. 229 229 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 fourni t.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 fourni. 231 231 232 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. 233 233 234 234 235 .. rubric:: Footnotes236 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.238 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.240 235 .. rubric:: Notes de bas de page 236 237 .. [#Casting_note] Les fonctions buffer et intersection sont actuellement construites sur le principe de conversion de type en géométries, et ne sont pas actuellement capable de gérer des coordonnées sphériques. 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. 238 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 correcte ou retourner un tampon mal formé. 240 -
trunk/workshop-foss4g/geometries.rst
r46 r62 2 2 3 3 Partie 8 : Les géometries 4 ===================== 4 ========================= 5 5 6 6 Introduction 7 7 ------------ 8 8 9 Dans :ref:`une partie précédente<loading_data>` nous avons charg er différentes données. Avant de commencer à jouer avec, commençons par regarder quelques exemples simples. Depuis pgAdmin, choisissez de nouveau la base de donnée **nyc** et ouvrez l'outil de requêtage SQL. Copiez cette exemple de code SQL (aprÚs avoir supprimerle contenu présent par défaut si nécessaire) puis exécutez-le.9 Dans :ref:`une partie précédente<loading_data>` nous avons chargé différentes données. Avant de commencer à jouer avec, commençons par regarder quelques exemples simples. Depuis pgAdmin, choisissez de nouveau la base de donnée **nyc** et ouvrez l'outil de requêtage SQL. Copiez cette exemple de code SQL (aprÚs avoir supprimé le contenu présent par défaut si nécessaire) puis exécutez-le. 10 10 11 11 .. code-block:: sql 12 12 13 13 CREATE TABLE geometries (name varchar, geom geometry); 14 15 INSERT INTO geometries VALUES 14 15 INSERT INTO geometries VALUES 16 16 ('Point', 'POINT(0 0)'), 17 17 ('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'), … … 19 19 ('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'), 20 20 ('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))'); 21 21 22 22 SELECT Populate_Geometry_Columns(); 23 23 24 24 SELECT name, ST_AsText(geom) FROM geometries; 25 25 26 26 .. image:: ./geometries/start01.png 27 27 28 L'exemple ci-dessus créé une table (**geometries**) puis y ins ertcinq géométries : un point, une ligne, un polygone, un polygone avec un trou, et une collection. Les lignes insérées sont sélectionnées et affichées dans le tableau de sortie.28 L'exemple ci-dessus créé une table (**geometries**) puis y insÚre cinq géométries : un point, une ligne, un polygone, un polygone avec un trou, et une collection. Les lignes insérées sont sélectionnées et affichées dans le tableau de sortie. 29 29 30 30 Les tables de métadonnées … … 33 33 Dans le respect de la spécification Simple Features for SQL (:term:`SFSQL`), PostGIS fournit deux tables pour récupérer et s'informer sur les types de géométries disponibles dans une base de données spécifique. 34 34 35 * La premiÚre table, ``spatial_ref_sys``, définit tou t les systÚmes de projection connus de la base de données et sera décrite plus en détails plus tard.36 * La seconde table, ``geometry_columns``, fournit une liste de toutes les "entités" (définit comme un objet avec un attribut géométrique) et les détails de base relatives à ces entités. 35 * La premiÚre table, ``spatial_ref_sys``, définit tous les systÚmes de projection connus de la base de données et sera décrite plus en détails plus tard. 36 * La seconde table, ``geometry_columns``, fournit une liste de toutes les "entités" (définit comme un objet avec un attribut géométrique) et les détails de base relatives à ces entités. 37 37 38 38 .. image:: ./geometries/table01.png 39 39 40 Dans l'exemple fou nit en introduction, la fonction :command:`Populate_Geometry_Columns()` détecte touteles colonnes de la base de données qui contiennent des géométries et met à jour la table ``geometry_columns`` pour y inclure leurs références.40 Dans l'exemple fournit en introduction, la fonction :command:`Populate_Geometry_Columns()` détecte toutes les colonnes de la base de données qui contiennent des géométries et met à jour la table ``geometry_columns`` pour y inclure leurs références. 41 41 42 42 Regardons maintenant la table ``geometry_columns`` de notre base de données. Copiez cette commande dans la fenêtre de requêtage : … … 49 49 .. image:: ./geometries/start08.png 50 50 51 * ``f_table_catalog``, ``f_table_schema``, et ``f_table_name`` fournissent le nom complet de la table contenant une géométrie donnée. Ãtant donné que PostgreSQL n'utilise pas de catalogues, ``f_table_catalog`` est toujou ts vide.51 * ``f_table_catalog``, ``f_table_schema``, et ``f_table_name`` fournissent le nom complet de la table contenant une géométrie donnée. Ãtant donné que PostgreSQL n'utilise pas de catalogues, ``f_table_catalog`` est toujours vide. 52 52 * ``f_geometry_column`` est le nom de la colonne qui contient la géométrie -- pour les tables ayant plusieurs colonnes géométriques, il y a un enregistrement dans cette table pour chacune. 53 * ``coord_dimension`` et ``srid`` définissent respectivement la dimension de la géométrie (en 2-, 3- or 4-dimensions) et le systÚme de référence s spatiales qui fait référence à la table ``spatial_ref_sys``.54 * La colonne ``type`` définit le type de géométrie comme décrit plus tÃŽt, nous avons déjà vu les points et les lignes. 53 * ``coord_dimension`` et ``srid`` définissent respectivement la dimension de la géométrie (en 2-, 3- or 4-dimensions) et le systÚme de référence spatiale qui fait référence à la table ``spatial_ref_sys``. 54 * La colonne ``type`` définit le type de géométrie comme décrit plus tÃŽt, nous avons déjà vu les points et les lignes. 55 55 56 56 En interrogeant cette table, les clients SIG et les libraires peuvent déterminer quoi attendre lors de la récupération des données et peuvent réaliser les opération de reprojection, transformation ou rendu sans avoir à inspecter chaque géométrie. 57 57 58 58 Réprésenter des objets du monde réel 59 ----------------------------------- 59 ------------------------------------ 60 60 61 61 La spécification Simple Features for SQL (:term:`SFSQL`), le standard ayant guidé le développement de PostGIS, définit comment les objets du monde réel doivent être représentés. En considérant une forme continue à une seule résolution fixe, nous obtenons une piÚtre représentation des objets. SFSQL considÚre uniquement les représentations en 2 dimensions. PostGIS a étendu cela en ajoutant les représentation en 3 et 4 dimensions. Plus récemment, la spécification SQL-Multimedia Part 3 (:term:`SQL/MM`) a officiellement définit sa propre représentation. … … 74 74 :: 75 75 76 name | st_geometrytype | st_ndims | st_srid 76 name | st_geometrytype | st_ndims | st_srid 77 77 -----------------+-----------------------+----------+--------- 78 78 Point | ST_Point | 2 | -1 … … 90 90 :align: center 91 91 92 Un **point** représente une localisation unique sur la Terre. Ce point est représenté par une seule coordonnée (incluant soit 2, 3 ou 4 dimensions). Les points sont utilisés pour représenter des objets lorsque le détail exact du contour n'est pas important à une échelle donnée. Par exemple, les villes sur une carte du monde peuvent être décrite sous la forme de points alors qu'une carte régionale utiliserait une représentation polygonale des villes.93 94 .. code-block:: sql 95 96 SELECT ST_AsText(geom) 92 Un **point** représente une localisation unique sur la Terre. Ce point est représenté par une seule coordonnée (incluant soit 2, 3 ou 4 dimensions). Les points sont utilisés pour représenter des objets lorsque le détail exact du contour n'est pas important à une échelle donnée. Par exemple, les villes sur une carte du monde peuvent être décrites sous la forme de points alors qu'une carte régionale utiliserait une représentation polygonale des villes. 93 94 .. code-block:: sql 95 96 SELECT ST_AsText(geom) 97 97 FROM geometries 98 98 WHERE name = 'Point'; … … 105 105 106 106 * :command:`ST_X(geometry)` retourne la composante X 107 * :command:`ST_Y(geometry)` retourne la composante Y 107 * :command:`ST_Y(geometry)` retourne la composante Y 108 108 109 109 Donc, nous pouvons lire les coordonnées d'un point de la maniÚre suivante : … … 124 124 125 125 126 Les lignes 126 Les lignes 127 127 ~~~~~~~~~~~ 128 128 … … 130 130 :align: center 131 131 132 Une **ligne** est un chemin entre plusieurs points. Elle prend la forme d'un tableau ordonné composé de deux (ou plusieurs) points. Les routes et les riviÚres sont typiquement représenté s sous la forme de lignes. Une ligne est dite **fermée** si elle commence et finien un même point. Elle est dite **simple** si elle ne se coupe pas ou ne se touche pas elle-même (sauf à ses extrémités si elle est fermée). Une ligne peut être à la fois **fermée** et **simple**.133 134 Le réseau des rues de New York (``nyc_streets``) a été chargé auparavant. Cet ensemble de données contient les détails comme le nom et le type des rues. Une rue du monde réel pourrait être constituée de plusieurs lignes, chacune représentant une file avecdifférents attributs.132 Une **ligne** est un chemin entre plusieurs points. Elle prend la forme d'un tableau ordonné composé de deux (ou plusieurs) points. Les routes et les riviÚres sont typiquement représentées sous la forme de lignes. Une ligne est dite **fermée** si elle commence et finit en un même point. Elle est dite **simple** si elle ne se coupe pas ou ne se touche pas elle-même (sauf à ses extrémités si elle est fermée). Une ligne peut être à la fois **fermée** et **simple**. 133 134 Le réseau des rues de New York (``nyc_streets``) a été chargé auparavant. Cet ensemble de données contient les détails comme le nom et le type des rues. Une rue du monde réel pourrait être constituée de plusieurs lignes, chacune représentant une segment de routes avec ses différents attributs. 135 135 136 136 La requête SQL suivante retourne la géométrie associée à une ligne (dans la colonne :command:`ST_AsText`) : … … 138 138 .. code-block:: sql 139 139 140 SELECT ST_AsText(geom) 140 SELECT ST_AsText(geom) 141 141 FROM geometries 142 142 WHERE name = 'Linestring'; 143 143 144 144 :: 145 145 … … 150 150 * :command:`ST_Length(geometry)` retourne la longueur d'une ligne 151 151 * :command:`ST_StartPoint(geometry)` retourne le premier point d'une ligne 152 * :command:`ST_EndPoint(geometry)` retourne le de nier point d'une ligne152 * :command:`ST_EndPoint(geometry)` retourne le dernier point d'une ligne 153 153 * :command:`ST_NPoints(geometry)` retourne le nombre de points dans une ligne 154 154 … … 157 157 .. code-block:: sql 158 158 159 SELECT ST_Length(geom) 159 SELECT ST_Length(geom) 160 160 FROM geometries 161 161 WHERE name = 'Linestring'; … … 172 172 :align: center 173 173 174 Un polygone est représenté comme une zone. Le contour externe du polygone est représenté par une ligne simple et fermée. Les trous sont représenté de la même maniÚre.175 176 Les polygones sont utilisés pour représenter les objets dont les tailles et la forme sont importants. Les limites de villes, les parcs, les bâtiments ou les cours d'eau sont habituellement représenté par des polygones lorsque l'échelle est suffisament élevée pour voir distinguer leurs zones. Les routes et les riviÚres peuvent parfois être représentécomme des polygones.174 Un polygone est représenté comme une zone. Le contour externe du polygone est représenté par une ligne simple et fermée. Les trous sont représentés de la même maniÚre. 175 176 Les polygones sont utilisés pour représenter les objets dont les tailles et la forme sont importants. Les limites de villes, les parcs, les bâtiments ou les cours d'eau sont habituellement représentés par des polygones lorsque l'échelle est suffisament élevée pour pouvoir distinguer leurs zones. Les routes et les riviÚres peuvent parfois être représentées comme des polygones. 177 177 178 178 La requête SQL suivante retournera la géométrie associée à un polygone (dans la colonne :command:`ST_AsText`). … … 180 180 .. code-block:: sql 181 181 182 SELECT ST_AsText(geom) 182 SELECT ST_AsText(geom) 183 183 FROM geometries 184 184 WHERE name LIKE 'Polygon%'; … … 203 203 * :command:`ST_ExteriorRing(geometry)` retourne le contour extérieur 204 204 * :command:`ST_InteriorRingN(geometry,n)` retourne le contour intérieur numéro n 205 * :command:`ST_Perimeter(geometry)` retourne la longueur de tou tles contours205 * :command:`ST_Perimeter(geometry)` retourne la longueur de tous les contours 206 206 207 207 Nous pouvons calculer l'aire de nos polygones en utilisant la fonction area : … … 209 209 .. code-block:: sql 210 210 211 SELECT name, ST_Area(geom) 211 SELECT name, ST_Area(geom) 212 212 FROM geometries 213 213 WHERE name LIKE 'Polygon%'; … … 221 221 222 222 Les collections 223 ~~~~~~~~~~~~~~~~ 224 225 Il y a quatre types de collections, qui regroupe ensemble plusieurs géométries simples.223 ~~~~~~~~~~~~~~~~ 224 225 Il y a quatre types de collections, qui regroupent ensemble plusieurs géométries simples. 226 226 227 227 * **MultiPoint**, une collection de points … … 230 230 * **GeometryCollection**, une collection hétérogÚne de n'importe quelle géométrie (dont d'autre collections) 231 231 232 Les collections sont un concept présents dans les logiciels SIG plus que dans les applications de rendu graphique génériques. Elles sont utiles pour directement mod eler les objets du monde réel comme des objet spatiaux. Par exemple, comment modéliser une parcelle qui a été coupée par un chemin ? Comme un **MultiPolygon**, ayant une partie de chaque coté du chemin.232 Les collections sont un concept présents dans les logiciels SIG plus que dans les applications de rendu graphique génériques. Elles sont utiles pour directement modéliser les objets du monde réel comme des objet spatiaux. Par exemple, comment modéliser une parcelle qui a été coupée par un chemin ? Comme un **MultiPolygon**, ayant une partie de chaque coté du chemin. 233 233 234 234 .. image:: ./screenshots/collection2.png … … 238 238 .. code-block:: sql 239 239 240 SELECT name, ST_AsText(geom) 240 SELECT name, ST_AsText(geom) 241 241 FROM geometries 242 242 WHERE name = 'Collection'; … … 252 252 * :command:`ST_NumGeometries(geometry)` retourne le nombre de composantes d'une collection 253 253 * :command:`ST_GeometryN(geometry,n)` retourne une composante spécifique 254 * :command:`ST_Area(geometry)` retourne l'aire totale des composantes de type s polygones255 * :command:`ST_Length(geometry)` retourne la longueur totale des composantes de type s lignes254 * :command:`ST_Area(geometry)` retourne l'aire totale des composantes de type polygone 255 * :command:`ST_Length(geometry)` retourne la longueur totale des composantes de type ligne 256 256 257 257 Entré / Sortie des géométries … … 261 261 262 262 * Format texte bien connu (Well-known text :term:`WKT`) 263 263 264 264 * :command:`ST_GeomFromText(text)` retourne une ``geometry`` 265 265 * :command:`ST_AsText(geometry)` retourne le ``texte`` 266 266 * :command:`ST_AsEWKT(geometry)` retourne le ``texte`` 267 267 268 268 * Format binaire bien connu (Well-known binary :term:`WKB`) 269 269 270 270 * :command:`ST_GeomFromWKB(bytea)` retourne ``geometry`` 271 271 * :command:`ST_AsBinary(geometry)` retourne ``bytea`` 272 272 * :command:`ST_AsEWKB(geometry)` retourne ``bytea`` 273 273 274 274 * Geographic Mark-up Language (:term:`GML`) 275 275 276 276 * :command:`ST_GeomFromGML(text)` retourne ``geometry`` 277 277 * :command:`ST_AsGML(geometry)` retourne ``text`` 278 278 279 279 * Keyhole Mark-up Language (:term:`KML`) 280 280 281 281 * :command:`ST_GeomFromKML(text)` retourne ``geometry`` 282 282 * :command:`ST_AsKML(geometry)` retourne ``text`` 283 283 284 284 * :term:`GeoJSON` 285 285 286 286 * :command:`ST_AsGeoJSON(geometry)` retourne ``text`` 287 287 288 288 * Scalable Vector Graphics (:term:`SVG`) 289 289 290 290 * :command:`ST_AsSVG(geometry)` retourne ``text`` 291 291 292 292 La requête SQL suivante montre un exemple de représentation en :term:`WKB` (l'appel à :command:`encode()` est requis pour convertir le format binaire en ASCII pour l'afficher) : 293 293 … … 295 295 296 296 SELECT encode( 297 ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)')), 297 ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)')), 298 298 'hex'); 299 299 … … 302 302 Dans le reste de ces travaux pratiques, nous utiliserons principalement le format WKT pour que vous puissiez lire et comprendre les géométries que nous voyons. Néanmoins, pour la plupart des traitement actuels, comme la visualisation des données dans une application SIG, le transfert de données à des services web, ou l'exécution distante de traitements, le format WKB est un format de choix. 303 303 304 Puisque le WKT et le WKB sont définit dans la spécification :term:`SFSQL`, elles ne prennent pas en compte les géométries à 3 ou 4 dimensions. C'est pour cette raison que PostGIS définit les formats Extended Well Known Text (EWKT) et Extended Well Known Binary (EWKB). Cela permet de gérer de façon similaire aux formats WKT et WKB les dimensions ajoutées.304 Puisque les formats WKT et le WKB sont définis dans la spécification :term:`SFSQL`, ils ne prennent pas en compte les géométries à 3 ou 4 dimensions. C'est pour cette raison que PostGIS définit les formats Extended Well Known Text (EWKT) et Extended Well Known Binary (EWKB). Cela permet de gérer de façon similaire aux formats WKT et WKB les dimensions ajoutées. 305 305 306 306 Voici un exemple de ligne 3D au format WKT : … … 330 330 ------------------- 331 331 332 `Populate_Geometry_Columns <http://postgis.org/docs/Populate_Geometry_Columns.html>`_: s'assure que les colonnes géométriques on les contraintes spatiales appropriées et qu'elles sont présentes dans la table geometry_columns.333 334 `ST_Area <http://postgis.org/docs/ST_Area.html>`_: retourne l'aire de la surface si c'est un polygon ou un multi-polygone. Pour le type "geometry" l'aire est dans l'unité du SRID. Pour les "geography" l'aire est en mÚtres carrés.335 336 `ST_AsText <http://postgis.org/docs/ST_AsText.html>`_: retourne la représentation de la geometry/geography au format Well-Known Text (WKT) sans m etadonnée correspondant au SRID.337 338 `ST_AsBinary <http://postgis.org/docs/ST_AsBinary.html>`_: retourne la représentation de la geometry/geography au format Well-Known Binary (WKB) sans m etadonnée correspondant u SRID.332 `Populate_Geometry_Columns <http://postgis.org/docs/Populate_Geometry_Columns.html>`_: s'assure que les colonnes géométriques ont les contraintes spatiales appropriées et qu'elles sont présentes dans la table geometry_columns. 333 334 `ST_Area <http://postgis.org/docs/ST_Area.html>`_: retourne l'aire de la surface si c'est un polygone ou un multi-polygone. Pour le type "geometry" l'aire est dans l'unité du SRID. Pour les "geography" l'aire est en mÚtres carrés. 335 336 `ST_AsText <http://postgis.org/docs/ST_AsText.html>`_: retourne la représentation de la geometry/geography au format Well-Known Text (WKT) sans métadonnée correspondant au SRID. 337 338 `ST_AsBinary <http://postgis.org/docs/ST_AsBinary.html>`_: retourne la représentation de la geometry/geography au format Well-Known Binary (WKB) sans métadonnée correspondant u SRID. 339 339 340 340 `ST_EndPoint <http://postgis.org/docs/ST_EndPoint.html>`_: retourne le dernier point d'une ligne. 341 341 342 `ST_AsEWKB <http://postgis.org/docs/ST_AsEWKB.html>`_: retourne la représentation de la g eometrie au format Well-Known Binary (WKB) avec la métadonnée SRID.343 344 `ST_AsEWKT <http://postgis.org/docs/ST_AsEWKT.html>`_: retourne la représentation de la g eometrie au format Well-Known Text (WKT) avec la métadonnée SRID.342 `ST_AsEWKB <http://postgis.org/docs/ST_AsEWKB.html>`_: retourne la représentation de la géometrie au format Well-Known Binary (WKB) avec la métadonnée SRID. 343 344 `ST_AsEWKT <http://postgis.org/docs/ST_AsEWKT.html>`_: retourne la représentation de la géometrie au format Well-Known Text (WKT) avec la métadonnée SRID. 345 345 346 346 `ST_AsGeoJSON <http://postgis.org/docs/ST_AsGeoJSON.html>`_: retourne la géométrie au format GeoJSON. … … 352 352 `ST_AsSVG <http://postgis.org/docs/ST_AsSVG.html>`_: retourne la géométrie au format SVG. 353 353 354 `ST_ExteriorRing <http://postgis.org/docs/ST_ExteriorRing.html>`_: retourne une ligne représentant le contour extérieur du polygone. Retourne NULL si la géométrie n'est pas un polygone. Ne fonctionne pas avec les multi-polygone .355 356 `ST_GeometryN <http://postgis.org/docs/ST_GeometryN.html>`_: retourne niÚme composante si la géométrie est du type GEOMETRYCOLLECTION, MULTIPOINT, MULTILINESTRING, MULTICURVE ou MULTIPOLYGON. Sinon, retourne NULL.354 `ST_ExteriorRing <http://postgis.org/docs/ST_ExteriorRing.html>`_: retourne une ligne représentant le contour extérieur du polygone. Retourne NULL si la géométrie n'est pas un polygone. Ne fonctionne pas avec les multi-polygones. 355 356 `ST_GeometryN <http://postgis.org/docs/ST_GeometryN.html>`_: retourne la niÚme composante si la géométrie est du type GEOMETRYCOLLECTION, MULTIPOINT, MULTILINESTRING, MULTICURVE ou MULTIPOLYGON. Sinon, retourne NULL. 357 357 358 358 `ST_GeomFromGML <http://postgis.org/docs/ST_GeomFromGML.html>`_: prend en entrée une représentation GML de la géométrie et retourne un object PostGIS de type geometry. … … 362 362 `ST_GeomFromText <http://postgis.org/docs/ST_GeomFromText.html>`_: retourne une valeur de type ST_Geometry à partir d'une représentation au format Well-Known Text (WKT). 363 363 364 `ST_GeomFromWKB <http://postgis.org/docs/ST_GeomFromWKB.html>`_: retourne une valeur de type ST_Geometry à partir d'une représen attion au format Well-Known Binary (WKB).364 `ST_GeomFromWKB <http://postgis.org/docs/ST_GeomFromWKB.html>`_: retourne une valeur de type ST_Geometry à partir d'une représentation au format Well-Known Binary (WKB). 365 365 366 366 `ST_GeometryType <http://postgis.org/docs/ST_GeometryType.html>`_: retourne le type de géométrie de la valeur de type ST_Geometry. … … 368 368 `ST_InteriorRingN <http://postgis.org/docs/ST_InteriorRingN.html>`_: retourne le niÚme contour intérieur d'un polygone. Retourne NULL si la géométrie n'est pas un polygone ou si N est hors des limites. 369 369 370 `ST_Length <http://postgis.org/docs/ST_Length.html>`_: retourne la longueur en 2-dimensions si c'est une ligne ou une multi-lignes. Les objets de type geometry sont dans l'unité du systÚme de référence s spatiales et les objet de type geography sont en metres (sphéroïde par défaut).370 `ST_Length <http://postgis.org/docs/ST_Length.html>`_: retourne la longueur en 2-dimensions si c'est une ligne ou une multi-lignes. Les objets de type geometry sont dans l'unité du systÚme de référence spatiale et les objets de type geography sont en mÚtres (sphéroïde par défaut). 371 371 372 372 `ST_NDims <http://postgis.org/docs/ST_NDims.html>`_: retourne le nombre de dimensions d'une géométrie. Les valeurs possibles sont : 2,3 ou 4. … … 378 378 `ST_NumGeometries <http://postgis.org/docs/ST_NumGeometries.html>`_: si la géométrie est du type GEOMETRYCOLLECTION (ou MULTI*) retourne le nombre de géométries, sinon retourne NULL. 379 379 380 `ST_Perimeter <http://postgis.org/docs/ST_Perimeter.html>`_: retourne la longueur du contour sextérieur d'une valeur de type ST_Surface ou ST_MultiSurface (polygone, multi-polygone).380 `ST_Perimeter <http://postgis.org/docs/ST_Perimeter.html>`_: retourne la longueur du contour extérieur d'une valeur de type ST_Surface ou ST_MultiSurface (polygone, multi-polygone). 381 381 382 382 `ST_SRID <http://postgis.org/docs/ST_SRID.html>`_: retourne l'identifiant du systÚme de référence spatiale définit dans la table spatial_ref_sys d'un objet de type ST_Geometry. -
trunk/workshop-foss4g/geometries_exercises.rst
r47 r62 2 2 3 3 Partie 9 : Exercices sur les géométries 4 ====================================== 4 ======================================= 5 5 6 6 Voici un petit rappel de toutes les fonction que nous avons abordé jusqu'à présent. Elles devraient être utiles pour les exercices ! … … 10 10 * :command:`ST_GeometryType(geometry)` retourne le type de la géométrie 11 11 * :command:`ST_NDims(geometry)` retourne le nombre de dimensions 12 * :command:`ST_SRID(geometry)` retourne l'identifiant du systÚme de référence s spatiales12 * :command:`ST_SRID(geometry)` retourne l'identifiant du systÚme de référence spatiale 13 13 * :command:`ST_X(point)` retourne la coordonnée X 14 14 * :command:`ST_Y(point)` retourne la coordonnée Y … … 19 19 * :command:`ST_Area(geometry)` retourne l'aire d'un polygone 20 20 * :command:`ST_NRings(geometry)` retourne le nombre de contours (1 ou plus si il y a des trous) 21 * :command:`ST_ExteriorRing(polygon)` retourne le contour ext erieur (ligne) d'un polygon21 * :command:`ST_ExteriorRing(polygon)` retourne le contour extérieur (ligne) d'un polygone 22 22 * :command:`ST_InteriorRingN(polygon, integer)` retourne le contour intérieur (ligne) d'un polygone 23 * :command:`ST_Perimeter(geometry)` retourne la longueur de tou tles contours23 * :command:`ST_Perimeter(geometry)` retourne la longueur de tous les contours 24 24 * :command:`ST_NumGeometries(multi/geomcollection)` retourne le nombre de composantes dans une collection 25 25 * :command:`ST_GeometryN(geometry, integer)` retourne la niÚme entité de la collection … … 39 39 Souvenez-vous aussi des tables disponibles: 40 40 41 * ``nyc_census_blocks`` 42 41 * ``nyc_census_blocks`` 42 43 43 * name, popn_total, boroname, the_geom 44 44 45 45 * ``nyc_streets`` 46 46 47 47 * name, type, the_geom 48 48 49 49 * ``nyc_subway_stations`` 50 50 51 51 * name, the_geom 52 52 53 53 * ``nyc_neighborhoods`` 54 54 55 55 * name, boroname, the_geom 56 56 … … 59 59 60 60 * **"Quelle est l'aire du quartier 'West Village'?"** 61 61 62 62 .. code-block:: sql 63 63 … … 65 65 FROM nyc_neighborhoods 66 66 WHERE name = 'West Village'; 67 68 :: 67 68 :: 69 69 70 70 1044614.53027344 … … 72 72 .. note:: 73 73 74 L'aire est donnée en m etres carrés. Pour obtenir l'aire en hectare, divisez par 10000. Pour obrenir l'aire en acres, divisez par 4047.75 76 * **"Quelle est l'aire de Manhattan en acres ?"** (Astuce: ``nyc_census_blocks`` et ``nyc_neighborhoods`` on toutes deux le champ ``boroname``.)77 74 L'aire est donnée en mÚtres carrés. Pour obtenir l'aire en hectare, divisez par 10000. Pour obtenir l'aire en acres, divisez par 4047. 75 76 * **"Quelle est l'aire de Manhattan en acres ?"** (Astuce: ``nyc_census_blocks`` et ``nyc_neighborhoods`` ont toutes les deux le champ ``boroname``.) 77 78 78 .. code-block:: sql 79 79 … … 82 82 WHERE boroname = 'Manhattan'; 83 83 84 :: 85 84 :: 85 86 86 13965.3201224118 87 87 … … 94 94 WHERE boroname = 'Manhattan'; 95 95 96 :: 97 96 :: 97 98 98 14572.1575543757 99 99 100 100 101 101 * **"Combien de blocs de la ville de New York ont des trous ?"** 102 103 .. code-block:: sql 104 105 SELECT Count(*) 102 103 .. code-block:: sql 104 105 SELECT Count(*) 106 106 FROM nyc_census_blocks 107 107 WHERE ST_NRings(the_geom) > 1; 108 108 109 :: 110 111 66 112 109 :: 110 111 66 112 113 113 * **"Quel est la longueur totale des rues (en kilomÚtres) dans la ville de New York ?"** (Astuce: l'unité de mesure des données spatiales est le mÚtre, il y a 1000 mÚtres dans un kilomÚtre.) 114 115 114 115 .. code-block:: sql 116 116 117 117 SELECT Sum(ST_Length(the_geom)) / 1000 118 118 FROM nyc_streets; 119 119 120 :: 121 120 :: 121 122 122 10418.9047172 123 123 124 124 * **"Quelle est la longueur de 'Columbus Cir' (Columbus Circle) ?"** 125 126 127 128 129 130 131 132 ::133 134 125 126 .. code-block:: sql 127 128 SELECT ST_Length(the_geom) 129 FROM nyc_streets 130 WHERE name = 'Columbus Cir'; 131 132 :: 133 134 308.34199 135 135 136 136 * **"Quelle est le contour de 'West Village' au format JSON ?"** 137 137 138 138 .. code-block:: sql 139 139 … … 143 143 144 144 :: 145 145 146 146 {"type":"MultiPolygon","coordinates": 147 147 [[[[583263.2776595836,4509242.6260239873], … … 149 149 [583263.2776595836,4509242.6260239873]]]]} 150 150 151 La géométrie de type "MultiPolygon", int erressant !152 153 151 La géométrie de type "MultiPolygon", intéressant ! 152 153 154 154 * **"Combien de polygones sont dans le multi-polygone 'West Village' ?"** 155 155 156 156 .. code-block:: sql 157 157 … … 163 163 164 164 1 165 165 166 166 .. note:: 167 167 168 168 Il n'est pas rare de trouver des éléments de type multi-polygone ne contenant qu'un seul polygone dans des tables. L'utilisation du type multi-polygone permet d'utiliser une seule table pour y stocker des géométries simples et multiples sans mélanger les types. 169 170 169 170 171 171 * **"Quel est la longueur des rues de la ville de New York, suivant leur type ?"** 172 172 173 173 .. code-block:: sql 174 174 … … 179 179 180 180 :: 181 182 type | length 181 182 type | length 183 183 --------------------------------------------------+------------------ 184 184 residential | 8629870.33786606 … … 204 204 motorway_link; residential | 215.07778911517 205 205 206 206 207 207 .. note:: 208 208 209 209 La clause ``ORDER BY length DESC`` ordonne le résultat par la valeur des longueurs dans l'ordre décroissant. Le résultat avec la plus grande valeur se retrouve au début la liste de résultats. 210 210 211 212 213 214 -
trunk/workshop-foss4g/geometry_returning.rst
r50 r62 4 4 ==================================================== 5 5 6 Toute 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)`), 6 Toute 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)`), 10 10 * une partie de l'objet (:command:`ST_RingN(geometry,n)`) ou 11 11 * un résultat vrai/faux (:command:`ST_Contains(geometry,geometry)`, :command:`ST_Intersects(geometry,geometry)`). … … 17 17 ------------------------------- 18 18 19 Un 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 es r 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 senses; le replacer par un point le forcera à être dans un seul sens, pas les deux.19 Un 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. 20 20 21 * :command:`ST_Centroid(geometry)` retourne le point qui est approximativement au centre de la masse de la géométrie passé en paramÚtre. C'est un calcul simle et rapide, mais parfois non proftable, car le point retourné peut se trouver à l'extérieur de l'entité elle-même. Si l'entité fournie est convee (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ïd .23 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 24 24 .. image:: ./geometry_returning/centroid.jpg 25 25 … … 28 28 --------- 29 29 30 L'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 sde la géométrie d'origine.30 L'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. 31 31 32 32 .. image:: ./geometry_returning/st_buffer.png 33 33 34 Par exemple, si les services des par ks américains souhaitaient renforcer la zone du traffique maritime autour de l'île 'Liberty', ils pourraient construire une zone tampon de 500 mÚtres autour de l'île. L'île de 'Liiberty' est représenté par un seul bloque dans notre table ``nyc_census_blocks`, nous pouvons donc facilement réaliser ce calcul.34 Par 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. 35 35 36 36 .. code-block:: sql … … 38 38 -- Création d'une nouvelle table avec une zone tampon de 500 m autour de 'Liberty Island' 39 39 CREATE TABLE libery_island_zone AS 40 SELECT ST_Buffer(the_geom,500) AS the_geom 41 FROM nyc_census_blocks 40 SELECT ST_Buffer(the_geom,500) AS the_geom 41 FROM nyc_census_blocks 42 42 WHERE blkid = '360610001009000'; 43 43 44 44 -- Mise à jour de la table geometry_columns 45 SELECT Populate_Geometry_Columns(); 46 45 SELECT Populate_Geometry_Columns(); 46 47 47 .. image:: ./geometry_returning/liberty_positive.jpg 48 48 49 La fonction :command:`ST_Buffer` permet aussi d'utiliser des valeur négative pour le paramÚtre distance et construit un polygone incluedans celui passé en paramÚtre. Pour les points et les lignes vous obtiendrez simplement un résultat vide.49 La 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. 50 50 51 51 .. image:: ./geometry_returning/liberty_negative.jpg … … 55 55 --------------- 56 56 57 Une autre opération classique présente dans les SIG S - le chevauchement - crée une nouvelle entité en calculant la zone correpondant à l'intersection de deux polygones supperposés. Le résultat à la propriété de permettre de reconstruire les entitéde base à l'aide de ce résultat.57 Une 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. 58 58 59 La 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 on en commun. Si les géométries sont disjointes, la fontion retourne une géométrie vide.59 La 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. 60 60 61 61 .. code-block:: sql … … 63 63 -- Quelle est l'aire que ces deux cercles ont en commun ? 64 64 -- Utilisons la fonction ST_Buffer pour créer ces cercles ! 65 65 66 66 SELECT ST_AsText(ST_Intersection( 67 67 ST_Buffer('POINT(0 0)', 2), … … 76 76 -------- 77 77 78 Dans 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 commade :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` :78 Dans 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` : 79 79 80 * :command:`ST_Union(geometry, geometry)`: une version avec deux paramÚtres qui prend les géométries et re ntourne l'union des deux. Par exemple, nos deux cercles ressembleà ce qui suit si nous utilisons l'opération union plutÃŽt que l'intersection.81 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 82 82 .. code-block:: sql 83 83 84 -- Quelle est l'aire totale de sces deux cercles ?84 -- Quelle est l'aire totale de ces deux cercles ? 85 85 -- Utilisons ST_Buffer pour créer les cercles ! 86 86 87 87 SELECT ST_AsText(ST_Union( 88 88 ST_Buffer('POINT(0 0)', 2), 89 89 ST_Buffer('POINT(3 0)', 2) 90 90 )); 91 91 92 92 .. image:: ./geometry_returning/union.jpg 93 94 93 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 égrégée ST_Union peut être utilisé grâce au SQL ``GROUP BY`` our créer un ensemble rassemblant des sous-ensembles de géométries basiques. Cela est trÚs puissant,96 94 97 Par exemple la fonction d'agrégation :command:`ST_Union`, considÚrons notre table ``nyc_census_blocks``. 98 As an example of :command:`ST_Union` aggregation, consider our ``nyc_census_blocks`` table. Census geography is carefully constructed so that larger geographies can be built up from smaller ones. So, we can create a census tracts map by merging the blocks that form each tract (as we do later in :ref:`creatingtractstable`). Or, we can create a county map by merging blocks that fall within each county. 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. 99 96 100 To carry out the merge, note that the unique key ``blkid`` actually embeds information about the higher level geographies. Here are the parts of the key for Liberty Island we used earlier: 97 Comme exemple pour la fonction d'agrégation :command:`ST_Union`, considérons notre table ``nyc_census_blocks``. 98 Les 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é. 99 100 Pour 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 101 102 102 :: 103 103 104 104 360610001009000 = 36 061 00100 9000 105 105 106 106 36 = State of New York 107 107 061 = New York County (Manhattan) … … 109 109 9 = Census Block Group 110 110 000 = Census Block 111 112 So, we can create a county map by merging all geometries that share the same first 5 digits of their``blkid``.111 112 Ainsi, nous pouvons créer une carte du comté en fusionnant toutes les géométries qui partagent les 5 premiers chiffres de ``blkid``. 113 113 114 114 .. code-block:: sql 115 115 116 -- Création d'une table nyc_census_counties en regroupant les blo ques116 -- Création d'une table nyc_census_counties en regroupant les blocs 117 117 CREATE TABLE nyc_census_counties AS 118 SELECT 119 ST_Union(the_geom) AS the_geom, 118 SELECT 119 ST_Union(the_geom) AS the_geom, 120 120 SubStr(blkid,1,5) AS countyid 121 121 FROM nyc_census_blocks 122 122 GROUP BY countyid; 123 123 124 124 -- Mise à jour de la table geometry_columns 125 125 SELECT Populate_Geometry_Columns(); 126 126 127 127 .. image:: ./geometry_returning/union_counties.png 128 128 129 An area test can confirm that our union operation did not lose any geometry. First, we calculate the area of each individual census block, and sum those areas grouping by census county id.129 Un 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. 130 130 131 131 .. code-block:: sql 132 132 133 133 SELECT SubStr(blkid,1,5) AS countyid, Sum(ST_Area(the_geom)) AS area 134 FROM nyc_census_blocks 134 FROM nyc_census_blocks 135 135 GROUP BY countyid; 136 136 137 137 :: 138 138 139 countyid | area 139 countyid | area 140 140 ----------+------------------ 141 141 36005 | 109807439.720947 … … 145 145 36085 | 149806077.958252 146 146 147 Ensuite nous calculons l'aire de chaque zone de nos nouveaux polygones de région sde la table count :147 Ensuite nous calculons l'aire de chaque zone de nos nouveaux polygones de région de la table count : 148 148 149 149 .. code-block:: sql … … 154 154 :: 155 155 156 countyid | area 156 countyid | area 157 157 ----------+------------------ 158 158 36005 | 109807439.720947 … … 167 167 ------------------- 168 168 169 `ST_AsText(text) <http://postgis.org/docs/ST_AsText.html>`_: retourne la représentation Well-Known Text (WKT) de la g eometry/geographysans métadonnée SRID.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. 170 170 171 `ST_Buffer(geometry, distance) <http://postgis.org/docs/ST_Buffer.html>`_: For geometry: Returns a geometry that represents all points whose distance from this Geometry is less than or equal to distance. Calculations are in the Spatial Reference System of this Geometry. For geography: Uses a planar transform wrapper.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. 172 172 173 `ST_Intersection(geometry A, geometry B) <http://postgis.org/docs/ST_Intersection.html>`_: Returns a geometry that represents the shared portion of geomA and geomB. The geography implementation does a transform to geometry to do the intersection and then transform back toWGS84.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. 174 174 175 `ST_Union() <http://postgis.org/docs/ST_Union.html>`_: Re turns a geometry that represents the point set union of the Geometries.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. 176 176 177 `substring(string [from int] [for int]) <http://www.postgresql.org/docs/8.1/static/functions-string.html>`_: PostgreSQL string function to extract substring matching SQL regular expression.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. 178 178 179 `sum(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: PostgreSQL aggregate function that returns the sum of records in a set of records. 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 -
trunk/workshop-foss4g/glossary.rst
r57 r62 2 2 3 3 Annexes B : Glossaire 4 ==================== 4 ===================== 5 5 6 6 .. glossary:: 7 7 8 8 CRS 9 Un "systÚme de référence s spatiales". La combinaison d'un systÚme de coordonnée géographiques et un systÚme de projection.9 Un "systÚme de référence spatiale". La combinaison d'un systÚme de coordonnéee géographiques et un systÚme de projection. 10 10 11 11 GDAL … … 13 13 14 14 GeoJSON 15 "Javascript Object Notation", un format texte qui est trÚs rapide et qui permet de représenter des objet JavaScript. En spatial, la spécification étendue `GeoJSON <http://geojson.org>`_ est courramment utilisée.16 15 "Javascript Object Notation", un format texte qui est trÚs rapide et qui permet de représenter des objets JavaScript. En spatial, la spécification étendue `GeoJSON <http://geojson.org>`_ est couramment utilisée. 16 17 17 SIG 18 `SystÚme d'Information Géographique <http://en.wikipedia.org/wiki/Geographic_information_system>`_ capture, stock , analyse, gÚre, et présente les données qui sont reliées à la zone géographique.19 18 `SystÚme d'Information Géographique <http://en.wikipedia.org/wiki/Geographic_information_system>`_ capture, stocke, analyse, gÚre, et présente les données qui sont reliées à la zone géographique. 19 20 20 GML 21 21 `Geography Markup Language <http://www.opengeospatial.org/standards/gml>`_. Le GML est un format standard XML :term:`OGC` pour représenter les données géographiques. 22 22 23 23 JSON 24 "Javascript Object Notation", un format text qui est trÚs rapide permettant de stocker les objets JavaScript. Au niveau spatial, la spécification étendu `GeoJSON <http://geojson.org>`_ est courramment utilisé.24 "Javascript Object Notation", un format texte qui est trÚs rapide et permet de stocker des objets JavaScript. Au niveau spatial, la spécification étendue `GeoJSON <http://geojson.org>`_ est couramment utilisé. 25 25 26 26 JSTL 27 "JavaServer Page Template Library", est une bibliothÚque pour :term:`JSP` qui encapsule plusieurs fonction alités de bases géré en JSP (requête de bases de données, itération, conditionnel) dans un syntaxe tiÚrce.27 "JavaServer Page Template Library", est une bibliothÚque pour :term:`JSP` qui encapsule plusieurs fonctionnalités de bases gérées en JSP (requête de bases de données, itération, conditionnel) dans un syntaxe tierce. 28 28 29 29 JSP … … 31 31 32 32 KML 33 "Keyhole Markup Language", le format XML utilisé par Google Earth. Google Earth. Il fût à l'origine développé par la société "Keyhole", ce qui expliq e sa présence (maintenant obscure) dans le nom du format.33 "Keyhole Markup Language", le format XML utilisé par Google Earth. Google Earth. Il fût à l'origine développé par la société "Keyhole", ce qui explique sa présence (maintenant obscure) dans le nom du format. 34 34 35 35 OGC 36 Open Geospatial Consortium <http://opengeospatial.org/> (OGC) est une organisation qui développentdes spécifications pour les services spatiaux.36 Open Geospatial Consortium `<http://opengeospatial.org/>`_ (OGC) est une organisation qui développe des spécifications pour les services spatiaux. 37 37 38 38 OSGeo 39 Open Source Geospatial Foundation <http://osgeo.org> (OSGeo) est une association à but non lucratif dédiéà la promotion et au support des logiciels cartographiques open source.39 Open Source Geospatial Foundation `<http://osgeo.org>`_ (OSGeo) est une association à but non lucratif dédiée à la promotion et au support des logiciels cartographiques open source. 40 40 41 41 SFSQL 42 La spécification `Simple Features for SQL <http://www.opengeospatial.org/standards/sfs>`_ (SFSQL) de l':term:`OGC` définit les types et les fonctions qui doivent être disponibles dans une base de données spatiale s.42 La spécification `Simple Features for SQL <http://www.opengeospatial.org/standards/sfs>`_ (SFSQL) de l':term:`OGC` définit les types et les fonctions qui doivent être disponibles dans une base de données spatiale. 43 43 44 44 SLD 45 Les spécifications `Styled Layer Descriptor <http://www.opengeospatial.org/standards/sld>`_ (SLD) de l':term:`OGC` définissent un format permettant de décrire la maniÚre d'afficher des données vectorielles.45 Les spécifications `Styled Layer Descriptor <http://www.opengeospatial.org/standards/sld>`_ (SLD) de l':term:`OGC` définissent un format permettant de décrire la maniÚre d'afficher des données vectorielles. 46 46 47 47 SRID 48 "Spatial reference ID" est un identifiant unique assigné à un systÚme de coordonnées géographique particulier. La table PostGIS **spatial_ref_sys** contient un loarge collection de valeurs de SRID connus.48 "Spatial reference ID" est un identifiant unique assigné à un systÚme de coordonnées géographiques particulier. La table PostGIS **spatial_ref_sys** contient une large collection de valeurs de SRID connus. 49 49 50 50 SQL 51 "Structured query language" est un standard permettant de requêter les bases de données relationnelle . Référence http://en.wikipedia.org/wiki/SQL.51 "Structured query language" est un standard permettant de requêter les bases de données relationnelles. Référence http://en.wikipedia.org/wiki/SQL. 52 52 53 53 SQL/MM 54 `SQL Multimedia <http://www.fer.hr/_download/repository/SQLMM_Spatial-_The_Standard_to_Manage_Spatial_Data_in_Relational_Database_Systems.pdf>`_; includes several sections on extended types, including a substantial section on spatial types.54 `SQL Multimedia <http://www.fer.hr/_download/repository/SQLMM_Spatial-_The_Standard_to_Manage_Spatial_Data_in_Relational_Database_Systems.pdf>`_; spécification contenant différentes sections sur les types étendues. Elle inclue une section substantielle sur les types spatiaux. 55 55 56 56 SVG 57 "Scalable vector graphics" est une famille de spécifications basé sur le format XML pour décrire des objet graphiques en 2 dimensions, aussi bien statiques que dynamiques (par exemple interacti veou animé). Réference : http://en.wikipedia.org/wiki/Scalable_Vector_Graphics.57 "Scalable vector graphics" est une famille de spécifications basé sur le format XML pour décrire des objet graphiques en 2 dimensions, aussi bien statiques que dynamiques (par exemple interactif ou animé). Réference : http://en.wikipedia.org/wiki/Scalable_Vector_Graphics. 58 58 59 59 WFS 60 L es spécifications`Web Feature Service <http://www.opengeospatial.org/standards/wfs>`_ (WFS) de l':term:`OGC` définit une interface pour lire et écrire des données géographiques à travers internet.60 La spécification `Web Feature Service <http://www.opengeospatial.org/standards/wfs>`_ (WFS) de l':term:`OGC` définit une interface pour lire et écrire des données géographiques à travers internet. 61 61 62 62 WMS 63 L es spécifications`Web Map Service <http://www.opengeospatial.org/standards/wms>`_ (WMS) de l':term:`OGC` définit une interface pour requêter une carte à travers internet.63 La spécification `Web Map Service <http://www.opengeospatial.org/standards/wms>`_ (WMS) de l':term:`OGC` définit une interface pour requêter une carte à travers internet. 64 64 65 65 WKB 66 "Well-known binary". Fait référence à la représentation binaire des géométries comme décrit dans les spécifications Simple Features for SQL (:term:`SFSQL`).67 66 "Well-known binary". Fait référence à la représentation binaire des géométries comme décrit dans les spécifications Simple Features for SQL (:term:`SFSQL`). 67 68 68 WKT 69 69 "Well-known text". Fait référence à la représentation textuelle de géométries, avec des chaînes commençant par "POINT", "LINESTRING", "POLYGON", etc. Il peut aussi faire référence à la représentation textuelle d'un :term:`CRS`, avec une chaîne commençant par "PROJCS", "GEOGCS", etc. Les représentations au format Well-known text sont des standards de l':term:`OGC`, mais n'ont pas leur propres documents de spécifications. La premiÚre description du WKT (pour les géométries et pour les CRS) apparaissent dans les spécifications :term:`SFSQL` 1.0. 70 71 70 72 -
trunk/workshop-foss4g/index.rst
r59 r62 19 19 20 20 **software/** 21 un répertoire contenant tou tles logiciels que nous installerons21 un répertoire contenant tous les logiciels que nous installerons 22 22 23 23 **data/** -
trunk/workshop-foss4g/indexing.rst
r47 r62 4 4 ================================= 5 5 6 Rapellez-vous que l'indexation spatiale est l'une des trois fonctionnalités clés d'une base de données spatiales. Les index es permettent l'utilisation de grandes quantités de données dans une base. Sans l'indexation, chaque recherche d'entité nécessitera d'accéder séquentiellement à tout les enregistrements de la base de données. L'indexation accélÚres les recherche en organisant les données dans des arbres de recherche qui peuvent être parcouruefficacement pour retrouver une entité particuliÚre.6 Rapellez-vous que l'indexation spatiale est l'une des trois fonctionnalités clés d'une base de données spatiales. Les index permettent l'utilisation de grandes quantités de données dans une base. Sans l'indexation, chaque recherche d'entité nécessitera d'accéder séquentiellement à tous les enregistrements de la base de données. L'indexation accélÚre les recherches en organisant les données dans des arbres de recherche qui peuvent être parcourus efficacement pour retrouver une entité particuliÚre. 7 7 8 L'indexation spatiale l'un des plus grands atouts de PostGIS. Dans les exemples précédents, nous avons construit nos jointures spatiales en comparant la totalité des tables. Ceci peut parfois s'av errer trÚs coûteux : Réaliser la jointure de deux tables de 10000 enregistrements sans indexation nécessitera de comparer 100000000 valeurs, les comparaisons requises ne seront plus que 20000 avec l'indexation.8 L'indexation spatiale l'un des plus grands atouts de PostGIS. Dans les exemples précédents, nous avons construit nos jointures spatiales en comparant la totalité des tables. Ceci peut parfois s'avérer trÚs coûteux : réaliser la jointure de deux tables de 10000 enregistrements sans indexation nécessitera de comparer 100000000 valeurs, les comparaisons requises ne seront plus que 20000 avec l'indexation. 9 9 10 Lorsque nous avons chargé la table ``nyc_census_blocks``, l'outil s pgShapeLoader crée automatiquement un indexespatial appelé ``nyc_census_blocks_the_geom_gist``.10 Lorsque nous avons chargé la table ``nyc_census_blocks``, l'outil pgShapeLoader crée automatiquement un index spatial appelé ``nyc_census_blocks_the_geom_gist``. 11 11 12 Pour démontrer combien il est important d'indexer ses données pour la performance des requêtes, essayons de requêter notre table ``nyc_census_blocks`` **sans** utiliser notre index e.12 Pour démontrer combien il est important d'indexer ses données pour la performance des requêtes, essayons de requêter notre table ``nyc_census_blocks`` **sans** utiliser notre index. 13 13 14 14 La premiÚre étape consiste à supprimer l'index. … … 17 17 18 18 DROP INDEX nyc_census_blocks_the_geom_gist; 19 19 20 20 .. note:: 21 21 22 22 La commande ``DROP INDEX`` supprime un index existant de la base de données. Pour de plus amples informations à ce sujet, consultez la `documentation officielle de PostgreSQL <http://docs.postgresql.fr/9.1/sql-dropindex.html>`_. 23 23 24 24 Maintenant, regardons le temps d'exécution dans le coin en bas à droite de l'interface de requêtage de pgAdmin, puis lançons la commande suivante. Notre requête recherche les blocs de la rue Broad. 25 25 … … 31 31 ON ST_Contains(blocks.the_geom, subways.the_geom) 32 32 WHERE subways.name = 'Broad St'; 33 33 34 34 :: 35 35 36 blkid 36 blkid 37 37 ----------------- 38 38 360610007003006 39 40 La table ``nyc_census_blocks`` est trÚs petite (seulement quelque millier d'enregistrements) donc même sans l'index, la requête prends **55 ms** sur l'ordinateur de test.39 40 La table ``nyc_census_blocks`` est trÚs petite (seulement quelque milliers d'enregistrements) donc même sans l'index, la requête prends **55 ms** sur l'ordinateur de test. 41 41 42 42 Maintenant remettons en place l'index et lançons de nouveau la requête. … … 48 48 .. note:: l'utilisation de la clause ``USING GIST`` spécifie à PostgreSQL de créer une structure (GIST) pour cet index. Si vous recevez un message d'erreur ressemblant à ``ERROR: index row requires 11340 bytes, maximum size is 8191`` lors de la création, cela signifie sans doute que vous avez omis la clause ``USING GIST``. 49 49 50 Sur l' rdinateur de test le temps d'exécution se réduit à **9 ms**. Plus votre table est grande, plus la différence de temps d'exécution pour une requête utilisant les indexesaugmentera.50 Sur l'ordinateur de test le temps d'exécution se réduit à **9 ms**. Plus votre table est grande, plus la différence de temps d'exécution pour une requête utilisant les index augmentera. 51 51 52 Comment les index esspatiaux fonctionnent53 --------------------------------------- --52 Comment les index spatiaux fonctionnent 53 --------------------------------------- 54 54 55 Les index es des base de données standards créent des arbres hierarchiques basés sur les valeurs des colonnes à indexer. Les indexes spatiaux sont un peu différents - ils ne sont pas capables d'indexer des entités géométriques elles-même mais indexeleur étendues.55 Les index des bases de données standards créent des arbres hiérarchiques basés sur les valeurs des colonnes à indexer. Les index spatiaux sont un peu différents - ils ne sont pas capables d'indexer des entités géométriques elles-même mais ils indexent leur étendues. 56 56 57 57 .. image:: ./indexing/bbox.png … … 59 59 Dans la figure ci-dessus, le nombre de lignes qui intersectent l'étoile jaune est *unique*, la ligne rouge. Mais l'étendue des entités qui intersectent la boîte jaune sont *deux*, la boîte rouge et la boîte bleue. 60 60 61 La maniÚre dont les bases de données répondent de maniÚre efficace à la question "Quelles lignes intersectent l'étoile jaune ?" correspond premiÚrement à répondre à la question "Quelle étendue intersecte l'étendue jaune" en utilisant les index es (ce qui est trÚs rapide) puis à calculer le résultat exact de la question "Quelles lignes intersectent l'étoile jaune ?" **seulement en utilisant les entités retournépar le premier test**.61 La maniÚre dont les bases de données répondent de maniÚre efficace à la question "Quelles lignes intersectent l'étoile jaune ?" correspond premiÚrement à répondre à la question "Quelle étendue intersecte l'étendue jaune" en utilisant les index (ce qui est trÚs rapide) puis à calculer le résultat exact de la question "Quelles lignes intersectent l'étoile jaune ?" **seulement en utilisant les entités retournées par le premier test**. 62 62 63 Pour de grandes tables, il y a un systÚme en "deux étapes" d'évaluation en utilisant dans un premier temps l'approximation à l'aide d'index es, puis en réalisant le test exact sur une quantité bien moins importante de données ce qui réduit drastiquement le temps de calcul nécessaire à cette deuxiÚme étape.63 Pour de grandes tables, il y a un systÚme en "deux étapes" d'évaluation en utilisant dans un premier temps l'approximation à l'aide d'index, puis en réalisant le test exact sur une quantité bien moins importante de données ce qui réduit drastiquement le temps de calcul nécessaire à cette deuxiÚme étape. 64 64 65 65 PotGIS et Oracle Spatial partage la même notion d'index structuré sous la forme "d'arbres R" [#RTree]_. Les arbres R classent les données sous forme de rectangles, de sous-rectangles etc. Cette structure d'index gÚre automatiquement la densité et la taille des objets. … … 67 67 .. image:: ./indexing/index-01.png 68 68 69 Requête avec seulement des index es70 -------------------------------- --69 Requête avec seulement des index 70 -------------------------------- 71 71 72 La plupart des fonctions utilisées par PostGIS (:command:`ST_Contains`, :command:`ST_Intersects`, :command:`ST_DWithin`, etc) prennent en compte les index esautomatiquement. Mais certaines fonctions (comme par exemple : :command:`ST_Relate`) ne les utilisent pas.72 La plupart des fonctions utilisées par PostGIS (:command:`ST_Contains`, :command:`ST_Intersects`, :command:`ST_DWithin`, etc) prennent en compte les index automatiquement. Mais certaines fonctions (comme par exemple : :command:`ST_Relate`) ne les utilisent pas. 73 73 74 Pour utiliser une recherche par étendue utilisant les index es(et pas de filtres), vous pouvez utiliser l'opérateur :command:`&&`. Pour les géométries, l'opérateur :command:`&&` signifie "l'étendue recouvre ou touche" de la même maniÚre que l'opérateur :command:`=` sur des entiers signifie que les valeurs sont égales.74 Pour utiliser une recherche par étendue utilisant les index (et pas de filtres), vous pouvez utiliser l'opérateur :command:`&&`. Pour les géométries, l'opérateur :command:`&&` signifie "l'étendue recouvre ou touche" de la même maniÚre que l'opérateur :command:`=` sur des entiers signifie que les valeurs sont égales. 75 75 76 Essayons de comparer une requête avec seulement un index epour la population du quartier 'West Village'. En utilisant la commande :command:`&&` notre requête ressemble à cela :76 Essayons de comparer une requête avec seulement un index pour la population du quartier 'West Village'. En utilisant la commande :command:`&&` notre requête ressemble à cela : 77 77 78 78 .. code-block:: sql 79 79 80 SELECT Sum(popn_total) 80 SELECT Sum(popn_total) 81 81 FROM nyc_neighborhoods neighborhoods 82 82 JOIN nyc_census_blocks blocks 83 83 ON neighborhoods.the_geom && blocks.the_geom 84 84 WHERE neighborhoods.name = 'West Village'; 85 85 86 86 :: 87 87 88 88 50325 89 89 90 90 Maintenant essayons la même requête en utilisant la fonction plus précise :command:`ST_Intersects`. 91 91 92 92 .. code-block:: sql 93 93 94 SELECT Sum(popn_total) 94 SELECT Sum(popn_total) 95 95 FROM nyc_neighborhoods neighborhoods 96 96 JOIN nyc_census_blocks blocks 97 97 ON ST_Intersects(neighborhoods.the_geom, blocks.the_geom) 98 98 WHERE neighborhoods.name = 'West Village'; 99 99 100 100 :: 101 101 102 102 27141 103 103 104 Un plus faible nombre de résultats ! La premiÚre requête nous renvoi t tout les blocs qui intersectent l'étendue du quartier, la seconde nous renvoitseulement les blocs qui intersectent le quartier lui-même.104 Un plus faible nombre de résultats ! La premiÚre requête nous renvoie tous les blocs qui intersectent l'étendue du quartier, la seconde nous renvoie seulement les blocs qui intersectent le quartier lui-même. 105 105 106 106 Analyse 107 107 --------- 108 108 109 Le plan nificateur de requête de PostgreSQL choisit intelligemment d'utiliser ou non les indexespour réaliser une requête. Il n'est pas toujours plus rapide d'utiliser un index pour réaliser une recherche : si la recherche doit renvoyer l'ensemble des enregistrements d'une table, parcourir l'index pour récupérer chaque valeur sera plus lent que de parcourir linéairement l'ensemble de la table.109 Le planificateur de requête de PostgreSQL choisit intelligemment d'utiliser ou non les index pour réaliser une requête. Il n'est pas toujours plus rapide d'utiliser un index pour réaliser une recherche : si la recherche doit renvoyer l'ensemble des enregistrements d'une table, parcourir l'index pour récupérer chaque valeur sera plus lent que de parcourir linéairement l'ensemble de la table. 110 110 111 Afin de savoir dans quelle situation il est nécessaire d'utiliser les i dexes (lire une petite partie de la table plutÃŽt qu'une grande partie), PostgreSQL conserve des statistiques relatives à la distribution des données dans chaque colonne indexée. Par défaut, PostgreSQL rassemble les statistiques sur une base réguliÚre. Nénamoins, si vous changez dramatiquement le contenu de vos tables dans une période courte, les statisuqes ne seront alors plus à jour.111 Afin de savoir dans quelle situation il est nécessaire d'utiliser les index (lire une petite partie de la table plutÃŽt qu'une grande partie), PostgreSQL conserve des statistiques relatives à la distribution des données dans chaque colonne indexée. Par défaut, PostgreSQL rassemble les statistiques sur une base réguliÚre. Néanmoins, si vous changez dramatiquement le contenu de vos tables dans une période courte, les statistiques ne seront alors plus à jour. 112 112 113 Pour vous assurez que les statistiques correspondent bien au contenu de la table actuelle, il est cour rant d'utiliser la commande ``ANALYZE`` aprÚs un grand nombre de modifications ou de suppression de vos données. Cela force le systÚme de gestion des statistiques à récupérer l'ensemble des données des colonnes indexées.113 Pour vous assurez que les statistiques correspondent bien au contenu de la table actuelle, il est courant d'utiliser la commande ``ANALYZE`` aprÚs un grand nombre de modifications ou de suppression de vos données. Cela force le systÚme de gestion des statistiques à récupérer l'ensemble des données des colonnes indexées. 114 114 115 La commande ``ANALYZE`` demande à PostgreSQL de parcourir la table et de mettre à jour les statistiques utilisées par le plan nificateur de requêtes (la plannification des requêtes sera traité utiltérieurement).115 La commande ``ANALYZE`` demande à PostgreSQL de parcourir la table et de mettre à jour les statistiques utilisées par le planificateur de requêtes (la planification des requêtes sera traité ultérieurement). 116 116 117 117 .. code-block:: sql 118 118 119 119 ANALYZE nyc_census_blocks; 120 120 121 121 Néttoyage 122 122 --------- 123 123 124 Il est souvent stressant de constater que la simple création d'un index e n'est pas suffisant pour que PostgreSQL l'utilise efficacement. Le nettoyage doit être réalisé aprÚs qu'un indexe soit créé ou aprÚs un grand nombre de requêtes UDATE, INSERT ou DELETE est été réalisé sur une table. La commande ``VACUUM`` demande à PostgreSQL de récupérer chaque espace non utilisé dans les pages de la table qui sont laissé en l'état lors des requêtes UPDATE ou DELETE à cause du modÚle d'estapillage multi-versions.124 Il est souvent stressant de constater que la simple création d'un index n'est pas suffisant pour que PostgreSQL l'utilise efficacement. Le nettoyage doit être réalisé aprÚs qu'un index soit créé ou aprÚs un grand nombre de requêtes UDATE, INSERT ou DELETE ait été réalisé sur une table. La commande ``VACUUM`` demande à PostgreSQL de récupérer chaque espace non utilisé dans les pages de la table qui sont laissées en l'état lors des requêtes UPDATE ou DELETE à cause du modÚle d'estampillage multi-versions. 125 125 126 126 Le nettoyage des données est tellement important pour une utilisation efficace du serveur de base de données PostgreSQL qu'il existe maintenant une option "autovacuum". 127 127 128 Activée par défaut, le processus autovacuum nettoie (récupÚre l'espace libre) et analyse (met à jour les statistiques) vos tables suivant un interval donné déterminé par l'activité des bases de données. Bien que cela fonctionne avec les bases de données hautement transactionnelles, il n'est pas supportable de devoir attendre que le processus autovacuum se lance lors de la mise à jour ou la suppression massive de données. Dans ce cas, il faut lancer la commande ``VACUUM`` manuellement.128 Activée par défaut, le processus autovacuum nettoie (récupÚre l'espace libre) et analyse (met à jour les statistiques) vos tables suivant un intervalle donné déterminé par l'activité des bases de données. Bien que cela fonctionne avec les bases de données hautement transactionnelles, il n'est pas supportable de devoir attendre que le processus autovacuum se lance lors de la mise à jour ou la suppression massive de données. Dans ce cas, il faut lancer la commande ``VACUUM`` manuellement. 129 129 130 Le nettoyage et l'analyse de la base de données peu t être réaliséséparément si nécessaire. Utiliser la commande ``VACUUM`` ne mettra pas à jour les statistiques alors que lancer la commande ``ANALYZE`` ne récupÚrera pas l'espace libre des lignes d'une table. Chacune de ces commandes peut être lancée sur l'intégralité de la base de données, sur une table ou sur une seule colonne.130 Le nettoyage et l'analyse de la base de données peuvent être réalisés séparément si nécessaire. Utiliser la commande ``VACUUM`` ne mettra pas à jour les statistiques alors que lancer la commande ``ANALYZE`` ne récupÚrera pas l'espace libre des lignes d'une table. Chacune de ces commandes peut être lancée sur l'intégralité de la base de données, sur une table ou sur une seule colonne. 131 131 132 132 .. code-block:: sql … … 137 137 ------------------- 138 138 139 `geometry_a && geometry_b <http://postgis.org/docs/ST_Geometry_Overlap.html>`_: retourne TRUE si l'étendue de A che uvauche celle de B.139 `geometry_a && geometry_b <http://postgis.org/docs/ST_Geometry_Overlap.html>`_: retourne TRUE si l'étendue de A chevauche celle de B. 140 140 141 141 `geometry_a = geometry_b <http://postgis.org/docs/ST_Geometry_EQ.html>`_: retourne TRUE si l'étendue de A est la même que celle de B. 142 142 143 `ST_Intersects(geometry_a, geometry_b) <http://postgis.org/docs/ST_Intersects.html>`_: retourne TRUE si l 'objet Geometrie/Geography "intersecte spatiallement" - (ont une partie en commun) et FALSE sinon (elles sont dijointes).143 `ST_Intersects(geometry_a, geometry_b) <http://postgis.org/docs/ST_Intersects.html>`_: retourne TRUE si la géométrie *a* "intersecte spatialement" la géométrie '*b*- (si elles ont une partie en commun) et FALSE sinon (elles sont disjointes). 144 144 145 .. rubric:: Footnotes145 .. rubric:: Notes de bas de page 146 146 147 147 .. [#RTree] http://postgis.org/support/rtree.pdf -
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/ -
trunk/workshop-foss4g/joins_advanced.rst
r54 r62 4 4 ======================================= 5 5 6 Dans la partie précédente nous avons vu les fonctions :command:`ST_Centroid(geometry)` et :command:`ST_Union( [geometry])` ainsi que quelques exemples simples. Dans cette partie nous réaliseront des choses plus éllaborées.6 Dans la partie précédente nous avons vu les fonctions :command:`ST_Centroid(geometry)` et :command:`ST_Union(geometry)` ainsi que quelques exemples simples. Dans cette partie nous réaliserons des choses plus élaborées. 7 7 8 8 .. _creatingtractstable: … … 11 11 ------------------------------------------------ 12 12 13 Dans le répertoire ``\data\`` des travaux pratiques, il y a un fichier qui contient des données attributaires, mais pas de géométries, ce fichier est nommé ``nyc_census_sociodata.sql``. La table contient des données sociaux-économiques int erressantes à propos de New York : revenus financiers, éducation .... Il y a juste un problÚme, les données sont rassembléen "trace de recensement" et nous n'avons pas de données spatiales associées !13 Dans le répertoire ``\data\`` des travaux pratiques, il y a un fichier qui contient des données attributaires, mais pas de géométries, ce fichier est nommé ``nyc_census_sociodata.sql``. La table contient des données sociaux-économiques intéressantes à propos de New York : revenus financiers, éducation .... Il y a juste un problÚme, les données sont rassemblées en "trace de recensement" et nous n'avons pas de données spatiales associées ! 14 14 15 15 Dans cette partie nous allons … … 18 18 * Créer une table spatiale pour les traces de recensement 19 19 * Joindre les données attributaires à nos données spatiales 20 * Réaliser certaines anal ises sur nos nouvelles données21 20 * Réaliser certaines analyses sur nos nouvelles données 21 22 22 Chargement du fichier nyc_census_sociodata.sql 23 23 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 24 25 25 #. Ouvrez la fenêtre de requêtage SQL depuis PgAdmin 26 #. S electionnez **File->Open** depuis le menu et naviguez jusqu'au fichier ``nyc_census_sociodata.sql``26 #. Sélectionnez **File->Open** depuis le menu et naviguez jusqu'au fichier ``nyc_census_sociodata.sql`` 27 27 #. Cliquez sur le bouton "Run Query" 28 #. Si vous cliquez sur le bouton "Refresh" depuis PgAdmin, la liste des table devrait contenir votre nouvelle table ``nyc_census_sociodata``29 28 #. Si vous cliquez sur le bouton "Refresh" depuis PgAdmin, la liste des tables devrait contenir votre nouvelle table ``nyc_census_sociodata`` 29 30 30 Création de la table traces de recensement 31 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~32 33 Comme nous l'avons dans la partie précédente, nous pouvons construire des géométries de niveau suppérieur en utilisant nos blocks de base en utilisant une partie de la clef ``blkid``. Afin de calculer les traces de recensement, nous avons besoin de regrouper les blocks en uitlisant les 11 premiers caractÚres de la colonne ``blkid``.34 31 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 33 Comme nous l'avons fait dans la partie précédente, nous pouvons construire des géométries de niveau suppérieur en utilisant nos blocs de base en utilisant une partie de la clef ``blkid``. Afin de calculer les traces de recensement, nous avons besoin de regrouper les blocs en uitlisant les 11 premiers caractÚres de la colonne ``blkid``. 34 35 35 :: 36 36 37 37 360610001009000 = 36 061 00100 9000 38 38 39 36 = State of New York 39 36 = State of New York 40 40 061 = New York County (Manhattan) 41 41 000100 = Census Tract … … 44 44 45 45 Création de la nouvelle table en utilisant la fonction d'agrégation :command:`ST_Union` : 46 47 .. code-block:: sql 48 46 47 .. code-block:: sql 48 49 49 -- Création de la table 50 50 CREATE TABLE nyc_census_tract_geoms AS 51 SELECT 52 ST_Union(the_geom) AS the_geom, 51 SELECT 52 ST_Union(the_geom) AS the_geom, 53 53 SubStr(blkid,1,11) AS tractid 54 54 FROM nyc_census_blocks 55 55 GROUP BY tractid; 56 56 57 57 -- Indexation du champ tractid 58 58 CREATE INDEX nyc_census_tract_geoms_tractid_idx ON nyc_census_tract_geoms (tractid); 59 59 60 60 -- Mise à jour de la table geometry_columns 61 61 SELECT Populate_Geometry_Columns(); … … 64 64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 65 66 L'objectif est ici de regrouper les données spatiales que nous avons créé avec les don ées attributaires que nous avions chargé initialement.67 68 .. code-block:: sql 69 66 L'objectif est ici de regrouper les données spatiales que nous avons créé avec les données attributaires que nous avions chargé initialement. 67 68 .. code-block:: sql 69 70 70 -- Création de la table 71 71 CREATE TABLE nyc_census_tracts AS 72 SELECT 72 SELECT 73 73 g.the_geom, 74 74 a.* … … 76 76 JOIN nyc_census_sociodata a 77 77 ON g.tractid = a.tractid; 78 78 79 79 -- Indexation des géométries 80 80 CREATE INDEX nyc_census_tract_gidx ON nyc_census_tracts USING GIST (the_geom); 81 81 82 82 -- Mise à jour de la table geometry_columns 83 83 SELECT Populate_Geometry_Columns(); … … 85 85 .. _interestingquestion: 86 86 87 Répondre à une question int erressante88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~89 90 Répondre à une question int erressante ! "Lister les 10 meilleurs quartiers ordonnées par la proportion de personne ayant acquis un diplome".91 92 .. code-block:: sql 93 94 SELECT 95 Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 96 n.name, n.boroname 97 FROM nyc_neighborhoods n 98 JOIN nyc_census_tracts t 99 ON ST_Intersects(n.the_geom, t.the_geom) 87 Répondre à une question intéressante 88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 89 90 Répondre à une question intéressante ! "Lister les 10 meilleurs quartiers ordonnés par la proportion de personnes ayant acquis un diplÃŽme". 91 92 .. code-block:: sql 93 94 SELECT 95 Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 96 n.name, n.boroname 97 FROM nyc_neighborhoods n 98 JOIN nyc_census_tracts t 99 ON ST_Intersects(n.the_geom, t.the_geom) 100 100 WHERE t.edu_total > 0 101 101 GROUP BY n.name, n.boroname … … 103 103 LIMIT 10; 104 104 105 Nous sommons les statistiques qui nous int erressent, nous les divisons ensuite à la fin. Afin d'aviter l'erreur de non-division par zero, nous ne prennons pas en compte les quartiers qui n'ont aucune personne ayant obtenu un diplome.106 107 :: 108 109 graduate_pct | name | boroname 105 Nous sommons les statistiques qui nous intéressent, nous les divisons ensuite à la fin. Afin d'éviter l'erreur de non-division par zéro, nous ne prenons pas en compte les quartiers qui n'ont aucune personne ayant obtenu un diplÃŽme. 106 107 :: 108 109 graduate_pct | name | boroname 110 110 --------------+-------------------+----------- 111 111 40.4 | Carnegie Hill | Manhattan … … 119 119 29.8 | West Village | Manhattan 120 120 29.7 | Central Park | Manhattan 121 122 121 122 123 123 .. _polypolyjoins: 124 124 125 125 Polygones/Jointures de polygones 126 -------------------------------- -127 128 Dans notre requête int erressante (dans :ref:`interestingquestion`) nous avons utilisé la fonction :command:`ST_Intersects(geometry_a, geometry_b)` pour déterminer quelle entité polygonale à inclure dans chaque groupe de quartier. Ce qui nous conduit à la question : que ce passe-t-il si une entité tombe ntre deux quartier ? Il intersectera chacun d'entre eux et ainsi sera inclu dans **chacun** des résultats.126 -------------------------------- 127 128 Dans notre requête intéressante (dans :ref:`interestingquestion`) nous avons utilisé la fonction :command:`ST_Intersects(geometry_a, geometry_b)` pour déterminer quelle entité polygonale à inclure dans chaque groupe de quartier. Ce qui nous conduit à la question : que ce passe-t-il si une entité tombe entre deux quartiers ? Il intersectera chacun d'entre eux et ainsi sera inclut dans **chacun** des résultats. 129 129 130 130 .. image:: ./screenshots/centroid_neighborhood.png … … 132 132 Pour éviter ce cas de double comptage il existe trois méthodes : 133 133 134 * La méthode simple consiste a s'assurer que chaque entité ne se retrouve que dans **un** seul groupe géogra hique (en utilisant :command:`ST_Centroid(geometry)`)134 * La méthode simple consiste a s'assurer que chaque entité ne se retrouve que dans **un** seul groupe géographique (en utilisant :command:`ST_Centroid(geometry)`) 135 135 * La méthode complexe consiste à disviser les parties qui se croisent en utilisant les bordures (en utilisant :command:`ST_Intersection(geometry,geometry)`) 136 136 137 137 Voici un exemple d'utilisation de la méthode simple pour éviter le double comptage dans notre requête précédente : 138 138 139 139 .. code-block:: sql 140 140 141 SELECT 142 Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 143 n.name, n.boroname 144 FROM nyc_neighborhoods n 145 JOIN nyc_census_tracts t 146 ON ST_Contains(n.the_geom, ST_Centroid(t.the_geom)) 141 SELECT 142 Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 143 n.name, n.boroname 144 FROM nyc_neighborhoods n 145 JOIN nyc_census_tracts t 146 ON ST_Contains(n.the_geom, ST_Centroid(t.the_geom)) 147 147 WHERE t.edu_total > 0 148 148 GROUP BY n.name, n.boroname 149 149 ORDER BY graduate_pct DESC 150 150 LIMIT 10; 151 151 152 152 Remarquez que la requête prend plus de temps à s'exécuter, puisque la fonction :command:`ST_Centroid` doit être effectuée pour chaque entité. 153 153 154 154 :: 155 155 156 graduate_pct | name | boroname 156 graduate_pct | name | boroname 157 157 --------------+-------------------+----------- 158 158 49.2 | Carnegie Hill | Manhattan … … 166 166 30.1 | Downtown | Brooklyn 167 167 28.4 | Cobble Hill | Brooklyn 168 168 169 169 Ãviter le double comptage change le résultat ! 170 170 … … 175 175 ---------------------------------------------- 176 176 177 Une requête qu'il est sympat de demander est : "Comment les temps de permutation des gens proches (dans un rayon de 500 metres ) des stations de métros diffÚrent de ceuxqui en viveloin ? "178 179 Néanmoins, la question rencontre les même problÚme de double comptage : plusieurs personnes seront dans un rayon de 500 metres de plusieurs stations de métros différentes. Coparons la population de New York :177 Une requête qu'il est "sympa" de demander est : "Comment les temps de permutation des gens proches (dans un rayon de 500 mÚtres ) des stations de métro diffÚrent de ceux qui en vivent loin ? " 178 179 Néanmoins, la question rencontre les mêmes problÚmes de double comptage : plusieurs personnes seront dans un rayon de 500 mÚtres de plusieurs stations de métro différentes. Comparons la population de New York : 180 180 181 181 .. code-block:: sql … … 183 183 SELECT Sum(popn_total) 184 184 FROM nyc_census_blocks; 185 185 186 186 :: 187 187 188 188 8008278 189 190 Avec la population des gens de New York dans un rayon de 500 m etres d'une station de métros:189 190 Avec la population des gens de New York dans un rayon de 500 mÚtres d'une station de métro : 191 191 192 192 .. code-block:: sql … … 196 196 JOIN nyc_subway_stations subway 197 197 ON ST_DWithin(census.the_geom, subway.the_geom, 500); 198 198 199 199 :: 200 200 201 201 10556898 202 202 203 Il y a plus de personnes proches du métro qu'il y a de per onnes ! Clairement, notre requête SQL simple rencontre un gros problÚme de double comptage. Vous pouvez voir le problÚme en regardant l'image des zones tampons créées pour les stations.203 Il y a plus de personnes proches du métro qu'il y a de personnes ! Clairement, notre requête SQL simple rencontre un gros problÚme de double comptage. Vous pouvez voir le problÚme en regardant l'image des zones tampons créées pour les stations. 204 204 205 205 .. image:: ./screenshots/subways_buffered.png 206 206 207 La solution est de s'assurer que nous avons seulement des bloc ks distincts avant de les les regrouper. Nou spouvons réaliser cela en cassant notre requête en sous-requêtes qui récupÚre les blocks distincts, regroupé ensuite pour retrouner notre réponse :207 La solution est de s'assurer que nous avons seulement des blocs distincts avant de les regrouper. Nous pouvons réaliser cela en cassant notre requête en sous-requêtes qui récupÚrent les blocs distincts, les regroupent pour ensuite retourner notre réponse : 208 208 209 209 .. code-block:: sql … … 216 216 ON ST_DWithin(census.the_geom, subway.the_geom, 500) 217 217 ) AS distinct_blocks; 218 218 219 219 :: 220 220 221 221 4953599 222 222 223 C'est mieux ! Donc un peu plus de 50 % de la population de New York vit à proximité (50m environ 5 à 7 minutes de marche) du métro. 224 225 226 223 C'est mieux ! Donc un peu plus de 50 % de la population de New York vit à proximité (500m, environ 5 à 7 minutes de marche) du métro. 224 -
trunk/workshop-foss4g/joins_exercises.rst
r47 r62 6 6 Voici un petit rappel de certaines des fonctions vues précédemment. Elles seront utiles pour les exercices ! 7 7 8 9 10 * :command:`ST_Area(geometry)` retour be l'aire d'un polygone11 * :command:`ST_AsText(geometry)` ret urns WKT ``text``12 * :command:`ST_Contains(geometry A, geometry B)` retourne vrai si la géométrie A contient la géométrie B8 * :command:`sum(expression)` agrégation retournant la somme d'un ensemble 9 * :command:`count(expression)` agrégation retournant le nombre d'éléments d'un ensemble 10 * :command:`ST_Area(geometry)` retourne l'aire d'un polygone 11 * :command:`ST_AsText(geometry)` retourne un texte WKT 12 * :command:`ST_Contains(geometry A, geometry B)` retourne TRUE si la géométrie A contient la géométrie B 13 13 * :command:`ST_Distance(geometry A, geometry B)` retourne la distance minimum entre deux géométries 14 * :command:`ST_DWithin(geometry A, geometry B, radius)` retourne vraisi la A est distante d'au plus radius de B15 * :command:`ST_GeomFromText(text)` ret urns ``geometry``16 * :command:`ST_Intersects(geometry A, geometry B)` ret urns the true if geometry A intersects geometryB17 * :command:`ST_Length(linestring)` retourne la longueur d'une li nestring18 * :command:`ST_Touches(geometry A, geometry B)` retourne vraisi le contour extérieur de A touche B19 * :command:`ST_Within(geometry A, geometry B)` retourne vraisi A est hors de B14 * :command:`ST_DWithin(geometry A, geometry B, radius)` retourne TRUE si la A est distante d'au plus radius de B 15 * :command:`ST_GeomFromText(text)` retourne une géométrie 16 * :command:`ST_Intersects(geometry A, geometry B)` retourne TRUE si la géométrie A intersecte la géométrie B 17 * :command:`ST_Length(linestring)` retourne la longueur d'une ligne 18 * :command:`ST_Touches(geometry A, geometry B)` retourne TRUE si le contour extérieur de A touche B 19 * :command:`ST_Within(geometry A, geometry B)` retourne TRUE si A est hors de B 20 20 21 Souvenez-vous aussi des tables à votre disposition : 21 Souvenez-vous aussi des tables à votre disposition : 22 22 23 * ``nyc_census_blocks`` 24 23 * ``nyc_census_blocks`` 24 25 25 * name, popn_total, boroname, the_geom 26 26 27 27 * ``nyc_streets`` 28 28 29 29 * name, type, the_geom 30 30 31 31 * ``nyc_subway_stations`` 32 32 33 33 * name, routes, the_geom 34 34 35 35 * ``nyc_neighborhoods`` 36 36 37 37 * name, boroname, the_geom 38 38 … … 40 40 --------- 41 41 42 * **"Quelle station de métro sse situe dans le quartier 'Little Italy' ? Quelle est l'itinéraire de métro à emprunter ?"**43 42 * **"Quelle station de métro se situe dans le quartier 'Little Italy' ? Quelle est l'itinéraire de métro à emprunter ?"** 43 44 44 .. code-block:: sql 45 46 SELECT s.name, s.routes 45 46 SELECT s.name, s.routes 47 47 FROM nyc_subway_stations AS s 48 JOIN nyc_neighborhoods AS n 49 ON ST_Contains(n.the_geom, s.the_geom) 48 JOIN nyc_neighborhoods AS n 49 ON ST_Contains(n.the_geom, s.the_geom) 50 50 WHERE n.name = 'Little Italy'; 51 51 52 :: 53 54 name | routes 52 :: 53 54 name | routes 55 55 -----------+-------- 56 56 Spring St | 6 57 57 58 58 * **"Quels sont les quartiers desservis pas le train numéro 6 ?"** (Astuce: la colonne ``routes`` de la table ``nyc_subway_stations`` dispose des valeurs suivantes: 'B,D,6,V' et 'C,6') 59 59 60 60 .. code-block:: sql 61 62 SELECT DISTINCT n.name, n.boroname 61 62 SELECT DISTINCT n.name, n.boroname 63 63 FROM nyc_subway_stations AS s 64 JOIN nyc_neighborhoods AS n 65 ON ST_Contains(n.the_geom, s.the_geom) 64 JOIN nyc_neighborhoods AS n 65 ON ST_Contains(n.the_geom, s.the_geom) 66 66 WHERE strpos(s.routes,'6') > 0; 67 67 68 68 :: 69 70 name | boroname 69 70 name | boroname 71 71 --------------------+----------- 72 72 Midtown | Manhattan … … 87 87 88 88 .. note:: 89 90 Nous avons utilisé le mot clef ``DISTINCT`` pour supprimer les répétitions dans notre ensemble de résultats où il y avait plus d'une seule station de métro dans le quartier. 91 89 90 Nous avons utilisé le mot clef ``DISTINCT`` pour supprimer les répétitions dans notre ensemble de résultats où il y avait plus d'une seule station de métro dans le quartier. 91 92 92 * **"AprÚs le 11 septembre, le quartier de 'Battery Park' était interdit d'accÚs pendant plusieurs jours. Combien de personnes ont dû être évacuées ?"** 93 93 94 94 .. code-block:: sql 95 95 96 96 SELECT Sum(popn_total) 97 97 FROM nyc_neighborhoods AS n 98 JOIN nyc_census_blocks AS c 99 ON ST_Intersects(n.the_geom, c.the_geom) 98 JOIN nyc_census_blocks AS c 99 ON ST_Intersects(n.the_geom, c.the_geom) 100 100 WHERE n.name = 'Battery Park'; 101 102 :: 101 102 :: 103 103 104 104 9928 105 105 106 106 * **"Quelle est la densité de population (personne / km^2) des quartiers de 'Upper West Side' et de 'Upper East Side' ?"** (Astuce: il y a 1000000 m^2 dans un km^2.) 107 107 108 108 .. code-block:: sql 109 110 SELECT 111 n.name, 109 110 SELECT 111 n.name, 112 112 Sum(c.popn_total) / (ST_Area(n.the_geom) / 1000000.0) AS popn_per_sqkm 113 113 FROM nyc_census_blocks AS c … … 117 117 OR n.name = 'Upper East Side' 118 118 GROUP BY n.name, n.the_geom; 119 119 120 120 :: 121 122 name | popn_per_sqkm 121 122 name | popn_per_sqkm 123 123 -----------------+------------------ 124 124 Upper East Side | 47943.3590089405 125 125 Upper West Side | 39729.5779474286 126 126 127 -
trunk/workshop-foss4g/postgis-functions.rst
r57 r62 5 5 6 6 Constructeurs 7 ------------ 7 ------------- 8 8 9 :command:`ST_MakePoint(Longitude, Latitude)` 10 Retourne un nouveau point. Note : ordre des coordon ées (longitude puis latitude).9 :command:`ST_MakePoint(Longitude, Latitude)` 10 Retourne un nouveau point. Note : ordre des coordonnées (longitude puis latitude). 11 11 12 12 :command:`ST_GeomFromText(WellKnownText, srid)` … … 17 17 18 18 :command:`ST_Expand(geometry, Radius)` 19 Retourne une nouvelle géométrie qui est une extension de l'étendue de la géométrie passé en argument. Cette fonction est utile pour créer des envelopes pour des recherches utilisantsles indexations.19 Retourne une nouvelle géométrie qui est une extension de l'étendue de la géométrie passée en argument. Cette fonction est utile pour créer des enveloppes pour des recherches utilisant les indexations. 20 20 21 S rotie21 Sorties 22 22 ------- 23 23 … … 31 31 Retourne une géométrie au format "standard" `GeoJSON <http://geojson.org>`_. 32 32 33 Me asures34 ------- -----33 Mesures 34 ------- 35 35 36 36 :command:`ST_Area(geometry)` 37 Retourne l'aire d'une géométrie dans l'unité du systÚme de référence s spatiales.37 Retourne l'aire d'une géométrie dans l'unité du systÚme de référence spatiale. 38 38 39 39 :command:`ST_Length(geometry)` 40 Retourne la longueur de la géométrie dans l'unité du systÚme de référence s spatiales.40 Retourne la longueur de la géométrie dans l'unité du systÚme de référence spatiale. 41 41 42 42 :command:`ST_Perimeter(geometry)` 43 Retourne le périmà ©tre de la géométrie dans l'unité du systÚme de références spatiales.43 Retourne le périmÚtre de la géométrie dans l'unité du systÚme de référence spatiale. 44 44 45 45 :command:`ST_NumPoints(linestring)` … … 49 49 Retourne le nombre de contours dans un polygone. 50 50 51 :command:`ST_NumGeometries(geometry)` 52 Retourne le nombre de géométries dans une collection sde géométries.51 :command:`ST_NumGeometries(geometry)` 52 Retourne le nombre de géométries dans une collection de géométries. 53 53 54 54 Relations 55 --------- ----55 --------- 56 56 57 57 :command:`ST_Distance(geometry, geometry)` 58 Retourne la distance entre deux géométries dans l'unité du systÚme de référence s spatiales.58 Retourne la distance entre deux géométries dans l'unité du systÚme de référence spatiale. 59 59 60 :command:`ST_DWithin(geometry, geometry, radius)` 61 Retourne vrai si les géométries sont distant d'un rayon de l'autre, sinon faux.60 :command:`ST_DWithin(geometry, geometry, radius)` 61 Retourne TRUE si les géométries sont distantes d'un rayon de l'autre, sinon FALSE. 62 62 63 63 :command:`ST_Intersects(geometry, geometry)` 64 Retourne vrai si les géométries sont disjointes, sinon faux.64 Retourne TRUE si les géométries sont disjointes, sinon FALSE. 65 65 66 66 :command:`ST_Contains(geometry, geometry)` 67 Retourne vrai si la premiÚre géométrie est totalement contenu dans la seconde, sinon faux.67 Retourne TRUE si la premiÚre géométrie est totalement contenue dans la seconde, sinon FALSE. 68 68 69 69 :command:`ST_Crosses(geometry, geometry)` 70 Retourne vrai si une ligne ou les contours d'un polygone croisent une ligne ou un contour de polygone, sinon faux. 70 Retourne TRUE si une ligne ou les contours d'un polygone croisent une ligne ou un contour de polygone, sinon FALSE. 71 -
trunk/workshop-foss4g/projection.rst
r47 r62 4 4 =================================== 5 5 6 La Terre n'est pas plate et il n'y a pas de moyen simple de la poser à plat sur une carte en papier (ou l'écran d'un ordinateur). Certaines projections préservent les aires, donc tou tles objets ont des tailles relatives aux autres, d'autre projections conservent les angles (conformes) comme la projection Mercator. Certaines projections tentent de minimiser la distorsion des différents paramÚtres. Le point commun entre toutes les projections est qu'elles transforment le monde (sphérique) en un systÚme plat de coordonnées cartésiennes, et le choix de la projection dépend de ce que vous souhaitez faire avec vos données.6 La Terre n'est pas plate et il n'y a pas de moyen simple de la poser à plat sur une carte en papier (ou l'écran d'un ordinateur). Certaines projections préservent les aires, donc tous les objets ont des tailles relatives aux autres, d'autre projections conservent les angles (conformes) comme la projection Mercator. Certaines projections tentent de minimiser la distorsion des différents paramÚtres. Le point commun entre toutes les projections est qu'elles transforment le monde (sphérique) en un systÚme plat de coordonnées cartésiennes, et le choix de la projection dépend de ce que vous souhaitez faire avec vos données. 7 7 8 Nous avons déjà re contrer des projections, lorsque nous avons charger les données de la ville de Ney York .Rappelez-vous qu'elles utilisaient le SRID 26918. Parfois, vous aurez malgré tout besoin de transformer et de reprojeter vos données d'un systÚme de projection à un autre, en utilisant la fonction :command:`ST_Transform(geometry, srid)`. Pour manipuler les identifiant de systÚmes de références spatialesà partir d'une géométrie, PostGIS fournit les fonctions :command:`ST_SRID(geometry)` et :command:`ST_SetSRID(geometry, srid)`.8 Nous avons déjà rencontré des projections, lorsque nous avons chargé les données de la ville de Ney York .Rappelez-vous qu'elles utilisaient le SRID 26918. Parfois, vous aurez malgré tout besoin de transformer et de reprojeter vos données d'un systÚme de projection à un autre, en utilisant la fonction :command:`ST_Transform(geometry, srid)`. Pour manipuler les identifiants de systÚme de référence spatiale à partir d'une géométrie, PostGIS fournit les fonctions :command:`ST_SRID(geometry)` et :command:`ST_SetSRID(geometry, srid)`. 9 9 10 10 Nous pouvons vérifier le SRID de nos données avec la commande :command:`ST_SRID` : … … 13 13 14 14 SELECT ST_SRID(the_geom) FROM nyc_streets LIMIT 1; 15 15 16 16 :: 17 17 18 18 26918 19 20 Et quelle est la définition du "26918" ? Comme nous l'avons vu lors de la partie ":ref:`chargement des données `", la définition se trouve dans la table ``spatial_ref_sys``. En fait, **deux** définitions sont présentes. La définition au format :term:`WKT` dans la colonne ``srtext``19 20 Et quelle est la définition du "26918" ? Comme nous l'avons vu lors de la partie ":ref:`chargement des données<loading_data>`", la définition se trouve dans la table ``spatial_ref_sys``. En fait, **deux** définitions sont présentes. La définition au format :term:`WKT` dans la colonne ``srtext`` 21 21 22 22 .. code-block:: sql 23 23 24 24 SELECT * FROM spatial_ref_sys WHERE srid = 26918; 25 25 26 26 En fait, pour les calculs internes de re-projection, c'est le contenu de la colonne ``proj4text`` qui est utilisé. Pour notre projection 26918, voici la définition au format proj.4 : 27 27 … … 29 29 30 30 SELECT proj4text FROM spatial_ref_sys WHERE srid = 26918; 31 31 32 32 :: 33 33 34 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 35 34 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 35 36 36 En pratique, les deux colonnes ``srtext`` et ``proj4text`` sont importantes : la colonne ``srtext`` est utilisée par les applications externes comme `GeoServer <http://geoserver.org>`_, uDig <udig.refractions.net>`_, `FME <http://www.safe.com/>`_ et autres, alors que la colonne ``proj4text`` est principalement utilisée par PostGIS en interne. 37 37 … … 54 54 ERROR: Operation on two geometries with different SRIDs 55 55 CONTEXT: SQL function "st_equals" statement 1 56 56 57 57 58 58 .. note:: 59 59 60 Faites attention de pas utiliser la transformation à la volée à l'aide de :command:`ST_Transform` trop souvent. Les index es spatiaux sont construits en utilisant le SRID inclu dans les géométries. Si la comparaison est faite avec un SRID différent, les indexesspatiaux ne seront pas (la plupart du temps) utilisés. Il est reconnu qu'il vaut mieux choisir **un SRID** pour toutes les tables de votre base de données. N'utilisez la fonction de tranformation que lorsque vous lisez ou écrivez les données depuis une application externe.60 Faites attention de pas utiliser la transformation à la volée à l'aide de :command:`ST_Transform` trop souvent. Les index spatiaux sont construits en utilisant le SRID inclus dans les géométries. Si la comparaison est faite avec un SRID différent, les index spatiaux ne seront pas (la plupart du temps) utilisés. Il est reconnu qu'il vaut mieux choisir **un SRID** pour toutes les tables de votre base de données. N'utilisez la fonction de tranformation que lorsque vous lisez ou écrivez les données depuis une application externe. 61 61 62 62 … … 64 64 ----------------------- 65 65 66 Si vous retournez à la définition au format proj4 du SRID 26918, vous pouvez voir que notre projectio in actuelle est de type UTM zone 18 (Universal Transvers Mercator), avec le mÚtre comme unité de mesure.66 Si vous retournez à la définition au format proj4 du SRID 26918, vous pouvez voir que notre projection actuelle est de type UTM zone 18 (Universal Transvers Mercator), avec le mÚtre comme unité de mesure. 67 67 68 68 :: 69 69 70 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 70 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 71 71 72 72 Essayons de convertir certaines données de notre systÚme de projection dans un systÚme de coordonnées géographiques connu comme "longitude/latitude". 73 73 74 Pour convertir les données d'un SRID à l'autre, nous devons dans un premier temps vérifier que nos géométries ont un SRID valide. une fois que nous avons vérifié cela, nous devons ensuite trouver le SRID dans lelequel nous souhaitons re-projeter. En d'autre terme, quel est le SRID des coordonnées géographiques ?74 Pour convertir les données d'un SRID à l'autre, nous devons dans un premier temps vérifier que nos géométries ont un SRID valide. Une fois que nous avons vérifié cela, nous devons ensuite trouver le SRID dans lequel nous souhaitons re-projeter. En d'autre terme, quel est le SRID des coordonnées géographiques ? 75 75 76 Le SRID le plus connu pour les coordonnées géographiques est le 4326, qui correspond au couple "longitude/latitude sur la sphéroïde WGS84". Vous pouvez voir sa définition sur le site spatialreference.org.76 Le SRID le plus connu pour les coordonnées géographiques est le 4326, qui correspond au couple "longitude/latitude sur la sphéroïde WGS84". Vous pouvez voir sa définition sur le site http://spatialreference.org. 77 77 78 78 http://spatialreference.org/ref/epsg/4326/ 79 79 80 80 Vous pouvez aussi récupérer les définitions dans la table ``spatial_ref_sys`` : 81 81 … … 83 83 84 84 SELECT srtext FROM spatial_ref_sys WHERE srid = 4326; 85 85 86 86 :: 87 87 … … 98 98 .. code-block:: sql 99 99 100 SELECT ST_AsText(ST_Transform(the_geom,4326)) 101 FROM nyc_subway_stations 100 SELECT ST_AsText(ST_Transform(the_geom,4326)) 101 FROM nyc_subway_stations 102 102 WHERE name = 'Broad St'; 103 103 104 104 :: 105 105 106 106 POINT(-74.0106714688735 40.7071048155841) 107 107 108 Si vous chargez les données ou créez une nouvelle géométrie sans spécifier de SRID, la valeur du SRID prendra alors la valeur -1. Rap ellez-vous que dans les :ref:`geometries`, lorsque nous avons créé nos tables géométriques nous n'avions pas spécifié un SRID. Si nous interrogeons la base, nous devons nous attendre à ce que toutes les tables préfixées par ``nyc_`` aient le SRID 26918, alors que la table ``geometries`` aura la valeur -1 par défaut.108 Si vous chargez les données ou créez une nouvelle géométrie sans spécifier de SRID, la valeur du SRID prendra alors la valeur -1. Rappelez-vous que dans les :ref:`geometries`, lorsque nous avons créé nos tables géométriques nous n'avions pas spécifié un SRID. Si nous interrogeons la base, nous devons nous attendre à ce que toutes les tables préfixées par ``nyc_`` aient le SRID 26918, alors que la table ``geometries`` aura la valeur -1 par défaut. 109 109 110 Pour visualiser la table d'assignation des SRID, interroge rla table ``geometry_columns`` de la base de données.110 Pour visualiser la table d'assignation des SRID, interrogez la table ``geometry_columns`` de la base de données. 111 111 112 112 .. code-block:: sql 113 113 114 SELECT f_table_name AS name, srid 114 SELECT f_table_name AS name, srid 115 115 FROM geometry_columns; 116 116 117 117 :: 118 118 119 name | srid 119 name | srid 120 120 ---------------------+------- 121 121 nyc_census_blocks | 26918 … … 125 125 geometries | -1 126 126 127 128 Néanmoins, si vous connaissez le SRID de vos données, vous pouvez l'affecter par la suite en utilisant la fonction :command:`ST_SetSRID` sur les géométries. Ensuite vous pourrez les tran former dans d'autres systÚmes de projections.127 128 Néanmoins, si vous connaissez le SRID de vos données, vous pouvez l'affecter par la suite en utilisant la fonction :command:`ST_SetSRID` sur les géométries. Ensuite vous pourrez les transformer dans d'autres systÚmes de projections. 129 129 130 130 .. code-block:: sql … … 144 144 `ST_SetSRID(geometry, srid) <http://postgis.org/docs/ST_SetSRID.html>`_: affecte une valeur au SRID d'une géométrie. 145 145 146 `ST_SRID(geometry) <http://postgis.org/docs/ST_SRID.html>`_: retourne l'i ndentifiant du systÚme de références spatialesd'un objet ST_Geometry comme définitdans la table spatial_ref_sys.146 `ST_SRID(geometry) <http://postgis.org/docs/ST_SRID.html>`_: retourne l'identifiant du systÚme de référence spatiale d'un objet ST_Geometry comme défini dans la table spatial_ref_sys. 147 147 148 `ST_Transform(geometry, srid) <http://postgis.org/docs/ST_Transform.html>`_: retourne une nouvelle géométrie aprÚs avoi re-projeté les données dans le systÚme correspondant au SRID passé en paramÚtre. 148 `ST_Transform(geometry, srid) <http://postgis.org/docs/ST_Transform.html>`_: retourne une nouvelle géométrie aprÚs avoir re-projeté les données dans le systÚme correspondant au SRID passé en paramÚtre. 149 -
trunk/workshop-foss4g/projection_exercises.rst
r47 r62 5 5 6 6 Voici un rappel de certaines fonctions que nous avons vu. Elles seront utiles pour les exercices ! 7 7 8 8 * :command:`sum(expression)` agrégation qui retourne la somme d'un ensemble de valeurs 9 9 * :command:`ST_Length(linestring)` retourne la longueur d'une ligne 10 10 * :command:`ST_SRID(geometry, srid)` retourne le SRID d'une géométrie 11 * :command:`ST_Transform(geometry, srid)` reprojette des géométries dans un autre systÚme de référence s spatiales11 * :command:`ST_Transform(geometry, srid)` reprojette des géométries dans un autre systÚme de référence spatiale 12 12 * :command:`ST_GeomFromText(text)` retourne un objet ``geometry`` 13 * :command:`ST_AsText(geometry)` retourne le WKT (``text``)14 * :command:`ST_AsGML(geometry)` retourne le GML (``text``)13 * :command:`ST_AsText(geometry)` retourne un WKT (``texte``) 14 * :command:`ST_AsGML(geometry)` retourne un GML (``texte``) 15 15 16 Rappelez-vous les ress sources en ligne :16 Rappelez-vous les ressources en ligne : 17 17 18 18 * http://spatialreference.org … … 21 21 Et les tables disponibles : 22 22 23 * ``nyc_census_blocks`` 24 23 * ``nyc_census_blocks`` 24 25 25 * name, popn_total, boroname, the_geom 26 26 27 27 * ``nyc_streets`` 28 28 29 29 * name, type, the_geom 30 30 31 31 * ``nyc_subway_stations`` 32 32 33 33 * name, the_geom 34 34 35 35 * ``nyc_neighborhoods`` 36 36 37 37 * name, boroname, the_geom 38 38 … … 41 41 42 42 * **"Quelle est la longueur des rue de New York, mesurée en UTM 18 ?"** 43 43 44 44 .. code-block:: sql 45 45 … … 47 47 FROM nyc_streets; 48 48 49 :: 50 49 :: 50 51 51 10418904.7172 52 53 * **"Quelle est la définition du SRID 2831 ?"** 54 52 53 * **"Quelle est la définition du SRID 2831 ?"** 54 55 55 .. code-block:: sql 56 56 … … 62 62 :: 63 63 64 PROJCS["NAD83(HARN) / New York Long Island", 65 GEOGCS["NAD83(HARN)", 66 DATUM["NAD83 (High Accuracy Regional Network)", 67 SPHEROID["GRS 1980", 6378137.0, 298.257222101, AUTHORITY["EPSG","7019"]], 68 TOWGS84[-0.991, 1.9072, 0.5129, 0.0257899075194932, -0.009650098960270402, -0.011659943232342112, 0.0], 69 AUTHORITY["EPSG","6152"]], 70 PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 71 UNIT["degree", 0.017453292519943295], 72 AXIS["Geodetic longitude", EAST], 73 AXIS["Geodetic latitude", NORTH], 74 AUTHORITY["EPSG","4152"]], 75 PROJECTION["Lambert Conic Conformal (2SP)", AUTHORITY["EPSG","9802"]], 76 PARAMETER["central_meridian", -74.0], 77 PARAMETER["latitude_of_origin", 40.166666666666664], 78 PARAMETER["standard_parallel_1", 41.03333333333333], 79 PARAMETER["false_easting", 300000.0], 80 PARAMETER["false_northing", 0.0], 81 PARAMETER["scale_factor", 1.0], 82 PARAMETER["standard_parallel_2", 40.666666666666664], 83 UNIT["m", 1.0], 84 AXIS["Easting", EAST], 85 AXIS["Northing", NORTH], 64 PROJCS["NAD83(HARN) / New York Long Island", 65 GEOGCS["NAD83(HARN)", 66 DATUM["NAD83 (High Accuracy Regional Network)", 67 SPHEROID["GRS 1980", 6378137.0, 298.257222101, AUTHORITY["EPSG","7019"]], 68 TOWGS84[-0.991, 1.9072, 0.5129, 0.0257899075194932, -0.009650098960270402, -0.011659943232342112, 0.0], 69 AUTHORITY["EPSG","6152"]], 70 PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 71 UNIT["degree", 0.017453292519943295], 72 AXIS["Geodetic longitude", EAST], 73 AXIS["Geodetic latitude", NORTH], 74 AUTHORITY["EPSG","4152"]], 75 PROJECTION["Lambert Conic Conformal (2SP)", AUTHORITY["EPSG","9802"]], 76 PARAMETER["central_meridian", -74.0], 77 PARAMETER["latitude_of_origin", 40.166666666666664], 78 PARAMETER["standard_parallel_1", 41.03333333333333], 79 PARAMETER["false_easting", 300000.0], 80 PARAMETER["false_northing", 0.0], 81 PARAMETER["scale_factor", 1.0], 82 PARAMETER["standard_parallel_2", 40.666666666666664], 83 UNIT["m", 1.0], 84 AXIS["Easting", EAST], 85 AXIS["Northing", NORTH], 86 86 AUTHORITY["EPSG","2831"]] 87 88 87 89 * **"Quelle est la longueur des rue de New York, mesuré en utilisant le SRID 2831 ?"** 90 88 89 * **"Quelle est la longueur des rues de New York, mesurée en utilisant le SRID 2831 ?"** 90 91 91 .. code-block:: sql 92 92 … … 94 94 FROM nyc_streets; 95 95 96 :: 97 96 :: 97 98 98 10421993.706374 99 99 100 100 .. note:: 101 102 La différence entre les mesure en UTM 18 et en Stateplane Long Island est de (10421993 - 10418904)/10418904, soit 0.02%. Calculé sur la sphéroïde en utilissant en :ref:`geography`, le total des longueurs des route est 10421999, ce qui est proche de la valeur dans l'autre systÚme de projection (Stateplane Long Island). Ce dernier est précisément calibré pour une petite zone géographique (la ville de New York) alors que le systÚme UTM 18 doit fournir un résultat raisonable pour une zone régionale beaucoup plus large.103 101 102 La différence entre les mesure en UTM 18 et en Stateplane Long Island est de (10421993 - 10418904)/10418904, soit 0.02%. Calculé sur la sphéroïde en utilissant en :ref:`geography`, le total des longueurs des routes est 10421999, ce qui est proche de la valeur dans l'autre systÚme de projection (Stateplane Long Island). Ce dernier est précisément calibré pour une petite zone géographique (la ville de New York) alors que le systÚme UTM 18 doit fournir un résultat raisonnable pour une zone régionale beaucoup plus large. 103 104 104 * **"Quelle est la représentation KML du point de la station de métris 'Broad St' ?"** 105 105 106 106 .. code-block:: sql 107 108 SELECT ST_AsKML(the_geom) 107 108 SELECT ST_AsKML(the_geom) 109 109 FROM nyc_subway_stations 110 110 WHERE name = 'Broad St'; 111 112 :: 113 111 112 :: 113 114 114 <Point><coordinates>-74.010671468873468,40.707104815584088</coordinates></Point> 115 115 116 116 Hé ! les coordonnées sont géographiques bien que nous n'ayons pas fait appel à la fonction :command:`ST_Transform`, mais pourquoi ? Parce que le standard KML spécifie que toutes les coordonnées *doivent* être géographiques (en fait, dans le systÚme EPSG:4326), donc la fonction :command:`ST_AsKML` réalise la transformation automatiquement. 117 -
trunk/workshop-foss4g/simple_sql.rst
r45 r62 4 4 =============================== 5 5 6 :term:`SQL`, pour "Structured Query Language", définit la maniÚre d'importer et d'interroger des données dans une base. Vous avez déjà rédigé du SQL lorsque nous avons créer notre premiÚre base de données. Rappel: 6 :term:`SQL`, pour "Structured Query Language", définit la maniÚre d'importer et d'interroger des données dans une base. Vous avez déjà rédigé du SQL lorsque nous avons créé notre premiÚre base de données. 7 8 Rappel: 7 9 8 10 .. code-block:: sql … … 10 12 SELECT postgis_full_version(); 11 13 12 Maintenant que nous avons charg erdes données dans notre base, essayons d'utiliser SQL pour les interroger. Par exemple,14 Maintenant que nous avons chargé des données dans notre base, essayons d'utiliser SQL pour les interroger. Par exemple, 13 15 14 "Quel sont les noms des quartiers de la ville de New York ?"15 16 "Quels sont les noms des quartiers de la ville de New York ?" 17 16 18 Ouvrez une fenêtre SQL depuis pgAdmin en cliquant sur le bouton SQL 17 19 … … 23 25 24 26 SELECT name FROM nyc_neighborhoods; 25 27 26 28 et cliquez sur le bouton **Execute Query** (le triangle vert). 27 28 .. image:: ./screenshots/pgadmin_08.png 29 30 .. image:: ./screenshots/pgadmin_08.png 29 31 30 32 La requête s'exécutera pendant quelques (mili)secondes et retournera 129 résultats. 31 33 32 .. image:: ./screenshots/pgadmin_09.png 34 .. image:: ./screenshots/pgadmin_09.png 33 35 34 Mais que c'est-il exactement passé ici ? Pour le comprendre, commençons par présenter les quatre types de requêtes du SQL :36 Mais que s'est-il exactement passé ici ? Pour le comprendre, commençons par présenter les quatre types de requêtes du SQL : 35 37 36 38 * ``SELECT``, retourne des lignes en réponse à une requête … … 38 40 * ``UPDATE``, modifie des lignes existantes d'une table 39 41 * ``DELETE``, supprime des lignes d'une table 40 41 Nous travaillerons principalement avec des requêtes de type ``SELECT`` afin d'interroger les tables en utilisant des fonctions spatiales.42 43 Nous travaillerons principalement avec des requêtes de type ``SELECT`` afin d'interroger les tables en utilisant des fonctions spatiales. 42 44 43 45 Requête de type SELECT … … 47 49 48 50 SELECT colonnes FROM données WHERE conditions; 49 51 50 52 .. note:: 51 53 52 Pour une description exhaustive des paramÚtres possible d'une requête ``SELECT``, consultez la `documentaton de PostgresSQL <http://www.postgresql.org/docs/8.1/interactive/sql-select.html>`_. 53 54 Pour une description exhaustive des paramÚtres possible d'une requête ``SELECT``, consultez la `documentation de PostgresSQL <http://www.postgresql.org/docs/8.1/interactive/sql-select.html>`_. 54 55 55 Les ``colonnes`` sont soit des noms de colonnes, soit des fonctions utilisant les valeurs des colonnes. Les ``données`` sont soit une table seule, soit plusieures tables reliées ensemble en réalisant une jointure sur une clef ou une autre condition. Les ``conditions`` représentent le filtre qui restreint le nombre de lignes à retourner. 56 57 Les ``colonnes`` sont soit des noms de colonnes, soit des fonctions utilisant les valeurs des colonnes. Les ``données`` sont soit une table seule, soit plusieurs tables reliées ensemble en réalisant une jointure sur une clef ou une autre condition. Les ``conditions`` représentent le filtre qui restreint le nombre de lignes à retourner. 56 58 57 59 "Quel sont les noms des quartiers de Brooklyn ?" 58 60 59 Nous retournons à notre table ``nyc_neighborhoods`` avec le filtre en main. La table contient tou tles quartiers de New York et nous voulons uniquement ceux de Brooklyn.61 Nous retournons à notre table ``nyc_neighborhoods`` avec le filtre en main. La table contient tous les quartiers de New York et nous voulons uniquement ceux de Brooklyn. 60 62 61 63 .. code-block:: sql 62 64 63 SELECT name 64 FROM nyc_neighborhoods 65 SELECT name 66 FROM nyc_neighborhoods 65 67 WHERE boroname = 'Brooklyn'; 66 68 67 La requête prendra à nouveau quelque (mil i)secondes et retournera les 23 éléments résultants.69 La requête prendra à nouveau quelque (milli)secondes et retournera les 23 éléments résultants. 68 70 69 Parfois nous aurons besoin d'appliquer des fonctions sur le résultatsd'une de nos requêtes. Par exemple,71 Parfois, nous aurons besoin d'appliquer des fonctions sur le résultat d'une de nos requêtes. Par exemple, 70 72 71 73 "Quel est le nombre de lettres dans les noms des quartiers de Brooklyn ?" 72 74 73 75 Heureusement PostgreSQL fournit une fonction calculant la longueur d'une chaîne de caractÚres : :command:`char_length(string)`. 74 76 75 77 .. code-block:: sql 76 78 77 SELECT char_length(name) 78 FROM nyc_neighborhoods 79 SELECT char_length(name) 80 FROM nyc_neighborhoods 79 81 WHERE boroname = 'Brooklyn'; 80 82 81 Bien souvent nous sommes moins interressés par une ligne particuliÚre mais plus par un calcul statistique sur l'ensemble résultant. Donc, connaitre la longueur des noms de quartiers est moins interressant que de calculer la moyenne des ces longueurs. Les fonctions qui renvoit un résultat unique en utilisant un ensemble de valeurs sont appeléedes "fonctions d'aggrégations".83 Bien souvent, nous sommes moins interessés par une ligne particuliÚre que par un calcul statistique sur l'ensemble résultant. Donc, connaître la longueur des noms de quartiers est moins intéressant que de calculer la moyenne de ces longueurs. Les fonctions qui renvoient un résultat unique en utilisant un ensemble de valeurs sont appelées des "fonctions d'aggrégations". 82 84 83 PostgreSQL fournit un ensemble de fonctions d'aggrégations, parmi slesquelles :command:`avg()` pour calculer la moyenne, and :command:`stddev()` pour l'écart type.85 PostgreSQL fournit un ensemble de fonctions d'aggrégations, parmi lesquelles :command:`avg()` pour calculer la moyenne, and :command:`stddev()` pour l'écart type. 84 86 85 "Quel est le nombre moyen et l'écart type du nombre de lettre dans le nomsdes quartier de Brooklyn ?"86 87 "Quel est le nombre moyen et l'écart type du nombre de lettres dans le nom des quartier de Brooklyn ?" 88 87 89 .. code-block:: sql 88 90 89 SELECT avg(char_length(name)), stddev(char_length(name)) 90 FROM nyc_neighborhoods 91 SELECT avg(char_length(name)), stddev(char_length(name)) 92 FROM nyc_neighborhoods 91 93 WHERE boroname = 'Brooklyn'; 92 94 93 95 :: 94 96 95 avg | stddev 97 avg | stddev 96 98 ---------------------+-------------------- 97 99 11.7391304347826087 | 3.9105613559407395 98 100 99 Les fonctions d'agrégation dans notre dernier exemple sont appliquées à chaque ligne de l'ensemble des résultats. Comment faire si nous voulons rassembler des données ? Pour cela nous utilisons la clause ``GROUP BY``. Les fonctions d'agrégation ont souvent besoin d'une clause ``GROUP BY`` pour regrouper les éléments en utilisant une ou plusieures colonnes.101 Les fonctions d'agrégation dans notre dernier exemple sont appliquées à chaque ligne de l'ensemble des résultats. Comment faire si nous voulons rassembler des données ? Pour cela, nous utilisons la clause ``GROUP BY``. Les fonctions d'agrégation ont souvent besoin d'une clause ``GROUP BY`` pour regrouper les éléments en utilisant une ou plusieurs colonnes. 100 102 101 "Quel est la moyenne d es les noms de quartier de New York, renvoyer par quartiers?"103 "Quel est la moyenne du nombre de caractÚres des noms de quartiers et l'écart-type du nombre de caractÚres des noms de quartiers, renvoyé par section de New York ?" 102 104 103 105 .. code-block:: sql 104 106 105 SELECT boroname, avg(char_length(name)), stddev(char_length(name)) 106 FROM nyc_neighborhoods 107 SELECT boroname, avg(char_length(name)), stddev(char_length(name)) 108 FROM nyc_neighborhoods 107 109 GROUP BY boroname; 108 109 110 110 Nous ajoutons la colonne ``boroname`` dans le résultat afin de pouvoir déterminer quelle valeur statistique s'applique à quel quartier. Dans une requête agrégée, vous pouvez seulement retourner les colonnes qui sont (a) membre de la clause de regroupement ou (b) des fonctions d'agrégation. 111 111 112 Nous ajoutons la colonne ``boroname`` dans le résultat afin de pouvoir déterminer quelle valeur statistique s'applique à quelle section. Dans une requête agrégée, vous pouvez seulement retourner les colonnes qui sont (a) membre de la clause de regroupement ou (b) des fonctions d'agrégation. 113 112 114 :: 113 115 114 boroname | avg | stddev 116 boroname | avg | stddev 115 117 ---------------+---------------------+-------------------- 116 118 Brooklyn | 11.7391304347826087 | 3.9105613559407395 … … 119 121 Queens | 11.6666666666666667 | 5.0057438272815975 120 122 Staten Island | 12.2916666666666667 | 5.2043390480959474 121 123 122 124 Liste de fonctions 123 125 ------------------ … … 125 127 `avg(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: fonction d'agrégation de PostgreSQL qui retourne la valeur moyenne d'une colonne. 126 128 127 `char_length(string) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: fonction s'appli cant aux chaînes de caractÚre de PostgreSQL qui retourne le nombre de lettres dans une chaîne.129 `char_length(string) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: fonction s'appliquant aux chaînes de caractÚre de PostgreSQL qui retourne le nombre de lettres dans une chaîne. 128 130 129 131 `stddev(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE>`_: fonction d'aggrégation de PostgreSQL qui retourne l'écart type d'un ensemble de valeurs. 130 131 132 -
trunk/workshop-foss4g/simple_sql_exercises.rst
r46 r62 4 4 =================================== 5 5 6 En utilisant la table ``nyc_census_blocks``, répondez au questions suivantes (et n'allez pas directement aux réponses ! ). 6 En utilisant la table ``nyc_census_blocks``, répondez au questions suivantes (et n'allez pas directement aux réponses ! ). 7 7 8 Vous trouverez ci-dessous des informations utiles pour commencer. Référez-vous à la partie :ref:` à propos des nos données` pour la définition de notre table ``nyc_census_blocks``.8 Vous trouverez ci-dessous des informations utiles pour commencer. Référez-vous à la partie :ref:`A propos des nos données<about_data>` pour la définition de notre table ``nyc_census_blocks``. 9 9 10 10 .. list-table:: … … 38 38 Ici se trouvent certaines des fonctions d'aggrégation qui vous seront utiles pour répondre aux questions : 39 39 40 * avg() - la moyenne des v lauers dans un ensemble d'enregistrements41 * sum() - la somme des valeurs d'un ensemb e d'enregistrements42 * count() - le nombre d'élément contenu dans un ensembe d'enregistrements.40 * avg() - la moyenne des valeurs dans un ensemble d'enregistrements 41 * sum() - la somme des valeurs d'un ensemble d'enregistrements 42 * count() - le nombre d'éléments contenus dans un ensemble d'enregistrements. 43 43 44 44 Maintenant les questions : 45 45 46 46 * **"Quelle est la population de la ville de New York ?"** 47 47 48 48 .. code-block:: sql 49 49 50 50 SELECT Sum(popn_total) AS population 51 51 FROM nyc_census_blocks; 52 53 :: 54 55 8008278 56 57 .. note:: 58 59 Qu'est-ce que ce ``AS`` dans la requête ? vous pouvez donner un nom à une table ou a des colonnes en utilisant un alias. Les alias permettent de rendre les requêtes plus simple à écrire et à lire. Donc au lieu que notre colonne résultat soit nommée ``sum`` nous utilisons le **AS** pour la renommer en ``population``.60 52 53 :: 54 55 8008278 56 57 .. note:: 58 59 Qu'est-ce que ce ``AS`` dans la requête ? vous pouvez donner un nom à une table ou à des colonnes en utilisant un alias. Les alias permettent de rendre les requêtes plus simple à écrire et à lire. Donc au lieu que notre colonne résultat soit nommée ``sum`` nous utilisons le **AS** pour la renommer en ``population``. 60 61 61 * **"Quelle est la population du Bronx ?"** 62 62 63 63 .. code-block:: sql 64 64 65 65 SELECT Sum(popn_total) AS population 66 66 FROM nyc_census_blocks 67 67 WHERE boroname = 'The Bronx'; 68 69 :: 70 71 1332650 72 73 * **"Quelle est en moyenne le nombre de personne vivant dans chaque appartement de la ville de New York ?"**74 68 69 :: 70 71 1332650 72 73 * **"Quelle est en moyenne le nombre de personnes vivant dans chaque appartement de la ville de New York ?"** 74 75 75 .. code-block:: sql 76 76 … … 78 78 FROM nyc_census_blocks; 79 79 80 :: 81 82 2.6503540522400804 83 80 :: 81 82 2.6503540522400804 83 84 84 * **"Pour chaque quartier, quel est le pourcentage de population blanche ?"** 85 85 86 86 .. code-block:: sql 87 87 88 SELECT 89 boroname, 88 SELECT 89 boroname, 90 90 100 * Sum(popn_white)/Sum(popn_total) AS white_pct 91 91 FROM nyc_census_blocks 92 92 GROUP BY boroname; 93 93 94 :: 95 96 boroname | white_pct 94 :: 95 96 boroname | white_pct 97 97 ---------------+--------------------- 98 98 Brooklyn | 41.2005552206888663 … … 101 101 Queens | 44.0806610271290794 102 102 Staten Island | 77.5968611401579346 103 103 104 104 Liste des fonctions 105 105 ------------------- 106 106 107 `avg(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: fonction d'aggrégation de PostgreSQL qui renvoi t la moyenne d'un esemble de nombres.107 `avg(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: fonction d'aggrégation de PostgreSQL qui renvoie la moyenne d'un ensemble de nombres. 108 108 109 `count(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: une fonction d'aggrégation de PostgreSQL qui retourne le nombre d'éléments dans un e semble.109 `count(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: une fonction d'aggrégation de PostgreSQL qui retourne le nombre d'éléments dans un ensemble. 110 110 111 111 `sum(expression) <http://www.postgresql.org/docs/8.2/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: une fonction d'aggrégation de PostgreSQL qui retourne la somme des valeurs numériques d'un ensemble. 112 -
trunk/workshop-foss4g/spatial_relationships.rst
r47 r62 2 2 3 3 Partie 10 : Les relations spatiales 4 ================================= 4 =================================== 5 5 6 6 Jusqu'à 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. … … 8 8 Les 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*. 9 9 10 Pour les questions comme "Quel est le plus proche garage à vélo prà ªt du parc ?" ou "Ou est l'intersection du métro avec telle rue ?", nous devrons comparer les géométries représentant les garageà vélo, les rues et les lignes de métro.10 Pour 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. 11 11 12 Le standard de l'OGC définit l'ensemble de fonctions suivant pour comparer les géométries.12 Le standard de l'OGC définit l'ensemble de fonctions suivantes pour comparer les géométries. 13 13 14 14 ST_Equals 15 15 --------- 16 17 :command:`ST_Equals(geometry A, geometry B)` teste l'égalité spatiale de deux géométries. 16 17 :command:`ST_Equals(geometry A, geometry B)` teste l'égalité spatiale de deux géométries. 18 18 19 19 .. figure:: ./spatial_relationships/st_equals.png … … 27 27 28 28 SELECT name, the_geom, ST_AsText(the_geom) 29 FROM nyc_subway_stations 30 WHERE name = 'Broad St'; 29 FROM nyc_subway_stations 30 WHERE name = 'Broad St'; 31 31 32 32 :: … … 35 35 ----------+----------------------------------------------------+----------------------- 36 36 Broad St | 0101000020266900000EEBD4CF27CF2141BC17D69516315141 | POINT(583571 4506714) 37 37 38 38 Maintenant, copiez / collez la valeur affichée pour tester la fonction :command:`ST_Equals`: 39 39 40 40 .. code-block:: sql 41 41 42 SELECT name 43 FROM nyc_subway_stations 42 SELECT name 43 FROM nyc_subway_stations 44 44 WHERE ST_Equals(the_geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141'); 45 45 … … 61 61 :align: center 62 62 63 :command:`ST_Intersects(geometry A, geometry B)` retourne t (TRUE) si l'intersection ne renvoi tpas un ensemble vide de résultats. Intersects retourne le résultat exactement inverse de la fonction disjoint.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. 64 64 65 65 .. figure:: ./spatial_relationships/st_disjoint.png 66 66 :align: center 67 67 68 L'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 éfficace de tester si deux géométries ne s'intersectent pas que de tester si elles sont dijointes du fait que le test d'intersection peut être spatialement indexé alors que le test disjoint ne le peut pas.68 L'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. 69 69 70 .. figure:: ./spatial_relationships/st_crosses.png 70 .. figure:: ./spatial_relationships/st_crosses.png 71 71 :align: center 72 72 … … 78 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. 79 79 80 Essayons de prendre la station de métro de Broad Street et de déterminer son tvoisinage en utilisant la fonction :command:`ST_Intersects` :80 Essayons de prendre la station de métro de Broad Street et de déterminer son voisinage en utilisant la fonction :command:`ST_Intersects` : 81 81 82 82 .. code-block:: sql 83 83 84 SELECT name, boroname 84 SELECT name, boroname 85 85 FROM nyc_neighborhoods 86 86 WHERE ST_Intersects(the_geom, '0101000020266900000EEBD4CF27CF2141BC17D69516315141'); … … 88 88 :: 89 89 90 name | boroname 90 name | boroname 91 91 --------------------+----------- 92 92 Financial District | Manhattan … … 102 102 :align: center 103 103 104 :command:`ST_Touches(geometry A, geometry B)` retourn 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.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. 105 105 106 106 ST_Within et ST_Contains 107 107 ------------------------- 108 108 109 :command:`ST_Within` et :command:`ST_Contains` test si une géométrie est totalement incluse dans l'autre.109 :command:`ST_Within` et :command:`ST_Contains` teste si une géométrie est totalement incluse dans l'autre. 110 110 111 111 .. figure:: ./spatial_relationships/st_within.png 112 112 :align: center 113 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 test l'exact opposé au résultat de ST_Contains.113 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 115 116 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. … … 120 120 -------------------------- 121 121 122 Une question fréquente dans le domaine du SIG est "trouver tou tles éléments qui se trouvent à une distance X de cet autre élément".122 Une 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". 123 123 124 124 La 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. … … 134 134 3 135 135 136 Pour tester si deux objets sont à la même distance d'un autre, la fonction :command:`ST_DWithin` fournit un test tirant profit des index es. Cela est trÚs utile pour répondre a une question telle que: "Combien d'arbrese 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.136 Pour 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. 137 137 138 138 .. figure:: ./spatial_relationships/st_dwithin.png 139 139 :align: center 140 140 141 141 En utilisant de nouveau notre station de métro Broad Street, nous pouvons trouver les rues voisines (à 10 mÚtres de) de la station : 142 142 143 143 .. code-block:: sql 144 144 145 SELECT name 146 FROM nyc_streets 145 SELECT name 146 FROM nyc_streets 147 147 WHERE ST_DWithin( 148 the_geom, 149 '0101000020266900000EEBD4CF27CF2141BC17D69516315141', 148 the_geom, 149 '0101000020266900000EEBD4CF27CF2141BC17D69516315141', 150 150 10 151 151 ); 152 152 153 :: 153 :: 154 154 155 name 155 name 156 156 -------------- 157 157 Wall St … … 159 159 Nassau St 160 160 161 Nous pouvons vérifier la réponse sur une carte. La station Broad St est actuellement à l'intersection des rues Wall, Broad et Nassau. 161 Nous pouvons vérifier la réponse sur une carte. La station Broad St est actuellement à l'intersection des rues Wall, Broad et Nassau. 162 162 163 163 .. image:: ./spatial_relationships/broad_st.jpg … … 170 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. 171 171 172 `ST_Disjoint(geometry A , geometry B) <http://postgis.org/docs/ST_Disjoint.html>`_ : retourne TRUE si les gé métries ness'intersectent pas - elles n'ont aucun point en commun.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. 173 173 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. 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. 175 175 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. 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. 177 177 178 `ST_Equals(geometry A, geometry B) <http://postgis.org/docs/ST_Equals.html>`_ : retourn TRUE si les géométries fournis représentent la même géométrie. L'ordre des entités n'est pas priten compte.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. 179 179 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). 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). 181 181 182 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. … … 186 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 187 187 188 189 -
trunk/workshop-foss4g/spatial_relationships_exercises.rst
r47 r62 1 1 .. _spatial_relationships_exercises: 2 2 3 Partie 11 : Exerci ses sur les relations spatiales4 =========================================== 3 Partie 11 : Exercices sur les relations spatiales 4 ================================================= 5 5 6 6 Voici un rappel des fonctions que nous avons vu dans les parties précédentes. Elles seront utiles pour les exercices ! 7 7 8 9 10 * :command:`ST_Contains(geometry A, geometry B)` retourne vrai si la géométrie A contient la géométrie B11 * :command:`ST_Crosses(geometry A, geometry B)` retourne vraisi la géométrie A croise la géométrie B12 * :command:`ST_Disjoint(geometry A , geometry B)` retourne vrai si les géométriene s'intersectent pas8 * :command:`sum(expression)` agrégation retournant la somme d'un ensemble 9 * :command:`count(expression)` agrégation retournant le nombre d'éléments d'un ensemble 10 * :command:`ST_Contains(geometry A, geometry B)` retourne TRUE si la géométrie A contient la géométrie B 11 * :command:`ST_Crosses(geometry A, geometry B)` retourne TRUE si la géométrie A croise la géométrie B 12 * :command:`ST_Disjoint(geometry A , geometry B)` retourne TRUE si les géométries ne s'intersectent pas 13 13 * :command:`ST_Distance(geometry A, geometry B)` retourne la distance minimum entre deux géométries 14 * :command:`ST_DWithin(geometry A, geometry B, radius)` retourne vraisi la A est distante d'au plus radius de B15 * :command:`ST_Equals(geometry A, geometry B)` retourne vraisi A est la même géométrie que B16 * :command:`ST_Intersects(geometry A, geometry B)` retourne vraisi A intersecte B17 * :command:`ST_Overlaps(geometry A, geometry B)` retourne vrai si A et B on un espace en commun, mais ne sont pas complétement inclus l'un dans l'autre.18 * :command:`ST_Touches(geometry A, geometry B)` retourne vraisi le contour extérieur de A touche B19 * :command:`ST_Within(geometry A, geometry B)` retourne vraisi A est hors de B14 * :command:`ST_DWithin(geometry A, geometry B, radius)` retourne TRUE si la A est distante d'au plus radius de B 15 * :command:`ST_Equals(geometry A, geometry B)` retourne TRUE si A est la même géométrie que B 16 * :command:`ST_Intersects(geometry A, geometry B)` retourne TRUE si A intersecte B 17 * :command:`ST_Overlaps(geometry A, geometry B)` retourne TRUE si A et B on un espace en commun, mais ne sont pas complÚtement incluses l'un dans l'autre. 18 * :command:`ST_Touches(geometry A, geometry B)` retourne TRUE si le contour extérieur de A touche B 19 * :command:`ST_Within(geometry A, geometry B)` retourne TRUE si A est hors de B 20 20 21 21 Souvenez-vous les tables à votre disposition : 22 22 23 * ``nyc_census_blocks`` 24 23 * ``nyc_census_blocks`` 24 25 25 * name, popn_total, boroname, the_geom 26 26 27 27 * ``nyc_streets`` 28 28 29 29 * name, type, the_geom 30 30 31 31 * ``nyc_subway_stations`` 32 32 33 33 * name, the_geom 34 34 35 35 * ``nyc_neighborhoods`` 36 36 37 37 * name, boroname, the_geom 38 38 … … 40 40 --------- 41 41 42 * **"Quel est la valeur géométrique de la rue nommée 'Atlantic Commons' ?"**43 42 * **"Quelle est la valeur géométrique de la rue nommée 'Atlantic Commons' ?"** 43 44 44 .. code-block:: sql 45 45 … … 49 49 50 50 :: 51 51 52 52 01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514170E30E0ADFE82141CB2D3EFFA52E5141 53 54 * **"Quel sont les quartiers et villes qui sont dans Atlantic Commons ?"**55 53 54 * **"Quels sont les quartiers et villes qui sont dans Atlantic Commons ?"** 55 56 56 .. code-block:: sql 57 57 58 SELECT name, boroname 59 FROM nyc_neighborhoods 58 SELECT name, boroname 59 FROM nyc_neighborhoods 60 60 WHERE ST_Intersects( 61 61 the_geom, … … 64 64 65 65 :: 66 67 name | boroname 66 67 name | boroname 68 68 ------------+---------- 69 69 Fort Green | Brooklyn 70 71 70 72 * **"Quelles rues touchent Atlantic Commons ?"** 73 71 72 * **"Quelles rues touchent Atlantic Commons ?"** 73 74 74 .. code-block:: sql 75 75 76 SELECT name 77 FROM nyc_streets 76 SELECT name 77 FROM nyc_streets 78 78 WHERE ST_Touches( 79 the_geom, 79 the_geom, 80 80 '01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514170E30E0ADFE82141CB2D3EFFA52E5141' 81 81 ); 82 82 83 83 :: 84 85 name 84 85 name 86 86 --------------- 87 87 S Oxford St … … 89 89 90 90 .. image:: ./spatial_relationships/atlantic_commons.jpg 91 92 91 93 * **"Approximativement combien de personnes vivent dans (ou dans une zone de 50 metres autour d') Atlantic Commons ?"** 94 92 93 * **"Approximativement combien de personnes vivent dans (ou dans une zone de 50 mÚtres autour d') Atlantic Commons ?"** 94 95 95 .. code-block:: sql 96 96 … … 102 102 50 103 103 ); 104 105 :: 106 107 1186 108 104 105 :: 106 107 1186 108 -
trunk/workshop-foss4g/tuning.rst
r50 r62 4 4 ================================================= 5 5 6 PostgreSQL est une base de données trÚs versatile, capable de tourner dans des environnements ayant des ressources trÚs limité s et partageant ces ressources avec un grand nombre d'autres applications. Afin d'assurer qu'il tournera convenablement dans ces environnements, la configuration par défaut est trÚs peu consomatrice de ressource mais terriblement innadapaté pour des bases de données hautes-performances en production. Ajoutez à cela le fait que les base de données spatiales ont différent type d'utilisation, et que les données sont généralement plus grandes que les autres types de données, vous en arriverez à la conclusion que les parÚtres par défaut ne sont pas approprié pour notre utilisasion.6 PostgreSQL est une base de données trÚs versatile, capable de tourner dans des environnements ayant des ressources trÚs limitées et partageant ces ressources avec un grand nombre d'autres applications. Afin d'assurer qu'elle tournera convenablement dans ces environnements, la configuration par défaut est trÚs peu consommatrice de ressources mais terriblement inadaptée pour des bases de données hautes-performances en production. Ajoutez à cela le fait que les bases de données spatiales ont différents types d'utilisation, et que les données sont généralement plus grandes que les autres types de données, vous en arriverez à la conclusion que les paramÚtres par défaut ne sont pas appropriés pour notre utilisation. 7 7 8 Tou t ces paramÚtres de configuration peuvent être édités dans le fichier de configuration de la base de données : :file:`C:\\Documents and Settings\\%USER\\.opengeo\\pgdata\\%USER`. Le contenu du fichier est du texte et il peut donc être ouvert avec l'outilsd'édition de fichiers de votre choix (Notepad par exemple). Les modifications apportées à ce fichier ne seront effectives que lors du redémarrage du serveur.8 Tous ces paramÚtres de configuration peuvent être édités dans le fichier de configuration de la base de données : :file:`C:\\Documents and Settings\\%USER\\.opengeo\\pgdata\\%USER`. Le contenu du fichier est du texte et il peut donc être ouvert avec l'outil d'édition de fichiers de votre choix (Notepad par exemple). Les modifications apportées à ce fichier ne seront effectives que lors du redémarrage du serveur. 9 9 10 10 .. image:: ./tuning/conf01.png 11 11 12 Une façon simple d'éditer ce fichier de configuration est d'utiliser l'outil snommé : "Backend Configuration Editor". Depuis pgAdmin, allez dans *File > Open postgresql.conf...*. Il vous sera demandé le chemin du fichier, naviguez dans votre arborescence jusqu'au fichier :file:`C:\\Documents and Settings\\%USER\\.opengeo\\pgdata\\%USER`.12 Une façon simple d'éditer ce fichier de configuration est d'utiliser l'outil nommé : "Backend Configuration Editor". Depuis pgAdmin, allez dans *File > Open postgresql.conf...*. Il vous sera demandé le chemin du fichier, naviguez dans votre arborescence jusqu'au fichier :file:`C:\\Documents and Settings\\%USER\\.opengeo\\pgdata\\%USER`. 13 13 14 14 .. image:: ./tuning/conf02.png … … 16 16 .. image:: ./tuning/conf03.png 17 17 18 Cette partie décrit certains des paramÚtres de configuration qui doivent être modifiés pour la mise ne place d'une base de données spatiale en production. Pour chaque partie, trouvez le bon paramÚtre s dans la liste et double cliquez dessus pour l'éditer. Changez le champs *Value* par la valeur que nous recommendons, assurez-vous que le champs est bien activé puicliquez sur **OK**.18 Cette partie décrit certains des paramÚtres de configuration qui doivent être modifiés pour la mise ne place d'une base de données spatiale en production. Pour chaque partie, trouvez le bon paramÚtre dans la liste et double cliquez dessus pour l'éditer. Changez le champ *Value* par la valeur que nous recommandons, assurez-vous que le champ est bien activé puis cliquez sur **OK**. 19 19 20 .. note:: Ces valeurs sont seulement celles que nous recomm endons, chaque environnement differera et tester les différents paramétrages est toujours nécessaire pour s'assurer d'utiliser la configuration optimale. Mais dans cette partie nous vous fournissons un bon point de départ.20 .. note:: Ces valeurs sont seulement celles que nous recommandons, chaque environnement diffÚrera et tester les différents paramétrages est toujours nécessaire pour s'assurer d'utiliser la configuration optimale. Mais dans cette partie nous vous fournissons un bon point de départ. 21 21 22 22 shared_buffers 23 23 -------------- 24 24 25 Alloue la quantité de mémoire que le serveur de bases de données utilise pour ses segments de mémoires partagées. Cela est partagé par tou t les processus serveur, comme sontnom l'indique. La valeur par défaut est affligeante et inadaptée pour une base de données en production.25 Alloue la quantité de mémoire que le serveur de bases de données utilise pour ses segments de mémoires partagées. Cela est partagé par tous les processus serveur, comme son nom l'indique. La valeur par défaut est affligeante et inadaptée pour une base de données en production. 26 26 27 27 *Valeur par défaut* : typiquement 32MB … … 34 34 -------- 35 35 36 Définit la quantité de mémoire que les opération interne d'ordonnancement et les tables de hachages peuvent consommer avec le serveur passe à des fichiers sur le disque. Cette valeur définit la mémoire disponible pour chaque opération complexe, les requêtes complexes peuvent avoir plusieurs ordres ou opération de hachage tournant en parallÚle, et chaque client s connecté peut exécuter une requête.36 Définit la quantité de mémoire que les opération internes d'ordonnancement et les tables de hachages peuvent consommer avec le serveur sur le disque. Cette valeur définit la mémoire disponible pour chaque opération complexe, les requêtes complexes peuvent avoir plusieurs ordres ou opération de hachage tournant en parallÚle, et chaque client connecté peut exécuter une requête. 37 37 38 Vous devez donc considérer combien t de connexions et quel complexité est attendu dans les requêtes avant d'augmenter cette valeur. Le bénéfice acquis par l'augmentation de cette valeur est que la plupart des opération de classification,dont les clause ORDER BY et DISTINCT, les jointures, les agrégation basé sur les hachages et l'exécution de requête imbriquées, pourront être réalisésans avoir à passer par un stockage sur disque.38 Vous devez donc considérer combien de connexions et quelle complexité est attendue dans les requêtes avant d'augmenter cette valeur. Le bénéfice acquis par l'augmentation de cette valeur est que la plupart des opération de classification, dont les clause ORDER BY et DISTINCT, les jointures, les agrégation basées sur les hachages et l'exécution de requête imbriquées, pourront être réalisées sans avoir à passer par un stockage sur disque. 39 39 40 40 *Valeur par défaut* : 1MB … … 47 47 -------------------- 48 48 49 Définit la quantité de mémoire utilisé pour les opération de maintenances, dont le néttoyage (VACUUM), les indexes et la création de clef étrangÚres. Comme ces opération sont courremment utilisées, la valeur par défaut devrait être acceptable. Ce paramÚtre peut être augmenté dynamiquement à l'exécution depuis une connexion au serveur avant l'exécution d'un grand nombre d'appels à :command:`CREATE INDEX` ou :command:`VACUUM` comme le montre la commande suivante.49 Définit la quantité de mémoire utilisée pour les opération de maintenance, dont le nettoyage (VACUUM), les index et la création de clefs étrangÚres. Comme ces opération sont couramment utilisées, la valeur par défaut devrait être acceptable. Ce paramÚtre peut être augmenté dynamiquement à l'exécution depuis une connexion au serveur avant l'exécution d'un grand nombre d'appels à :command:`CREATE INDEX` ou :command:`VACUUM` comme le montre la commande suivante. 50 50 51 51 .. code-block:: sql … … 57 57 *Valeur par défaut* : 16MB 58 58 59 *Valeur recomm endée* : 128MB59 *Valeur recommandée* : 128MB 60 60 61 61 .. image:: ./tuning/conf06.png … … 64 64 ----------- 65 65 66 Définit la quantité de mémoire utilisé pour l'écriture des données dans le journal respectant la rÚgle du défaire (WAL). Elle indique que les informations pour annuler les effets d'une opération sur un objet doivent être écrites dans le journal en mémoire stable avant que l'objet modifié ne migre sur le disque. Cette rÚgle permet d'assurer l'intégrité des données lors d'une reprise aprÚs défaillance. En effet,il suffiré de lire le journal pour retrouver l'état de la base lors de sont arrêt brutal.66 Définit la quantité de mémoire utilisée pour l'écriture des données dans le journal respectant la rÚgle du defer (WAL). Elle indique que les informations pour annuler les effets d'une opération sur un objet doivent être écrites dans le journal en mémoire stable avant que l'objet modifié ne migre sur le disque. Cette rÚgle permet d'assurer l'intégrité des données lors d'une reprise aprÚs défaillance. En effet, il suffira de lire le journal pour retrouver l'état de la base lors de son arrêt brutal. 67 67 68 La taille de ce tampon nécessite simplement d'être suffisament grand pour sto quer les données WAL pour une seule transaction. Alors que la valeur par défaut est généralement siffisante, les données spatiales tendent à être plus large. Il est donc recommendé d'augmenter la taille spécifiée dans ce paramÚtre.68 La taille de ce tampon nécessite simplement d'être suffisament grand pour stocker les données WAL pour une seule transaction. Alors que la valeur par défaut est généralement suffisante, les données spatiales tendent à être plus larges. Il est donc recommandé d'augmenter la taille spécifiée dans ce paramÚtre. 69 69 70 70 *Valeur par défaut* : 64kB 71 71 72 *Valeur recomm endée* : 1MB72 *Valeur recommandée* : 1MB 73 73 74 74 .. image:: ./tuning/conf07.png … … 77 77 ------------------- 78 78 79 Cette valeur définit le nombre maximum de seg ements des journaux (typiquement 16MB) qui doit être remplit entre chaque point de reprises WAL. Un point de reprise WAL est une partie d'une séquence de transactions pour lequel on garanti que les fichiers de données ont été mis à jour avec toutes les requêtes précédent ce point. à ce moment-là toutes les pages sont punaisées sur le disque et les point de reprises sont écrit dans le fichier de journal. Cela permet au precessus de reprise aprÚs défaillance de trouver les dernierspoints de repriseset applique toute les lignes suivantes pour récupérer l'état des données avant la défaillance.79 Cette valeur définit le nombre maximum de segments des journaux (typiquement 16MB) qui doit être remplit entre chaque point de reprise WAL. Un point de reprise WAL est une partie d'une séquence de transactions pour lequel on garantit que les fichiers de données ont été mis à jour avec toutes les requêtes précédant ce point. à ce moment-là toutes les pages sont punaisées sur le disque et les points de reprise sont écrits dans le fichier de journal. Cela permet au processus de reprise aprÚs défaillance de trouver les derniers points de reprise et applique toute les lignes suivantes pour récupérer l'état des données avant la défaillance. 80 80 81 Ãtant donné e que les point de reprises nécessitent un punaisage de toutes le pages ayant été modifiée sur le disque, cela va créer une charge d'entrées/sorties significative. Le même arguement que précédemment s'applique ici, les données spatiales sont assez grandes pour contrebalancer l'optimisation de données non spatiales. Augmenter cette valeur limitera le nombre de points de reprise, mais impliquera un plus redémarrageen cas de défaillance.81 Ãtant donné que les points de reprise nécessitent un punaisage de toutes le pages ayant été modifiées sur le disque, cela va créer une charge d'entrées/sorties significative. Le même argument que précédemment s'applique ici, les données spatiales sont assez grandes pour contrebalancer l'optimisation de données non spatiales. Augmenter cette valeur limitera le nombre de points de reprise, mais impliquera un redémarrage plus lent en cas de défaillance. 82 82 83 83 *Valeur par défaut* : 3 84 84 85 *Val auer recommendée* : 685 *Valeur recommandée* : 6 86 86 87 87 .. image:: ./tuning/conf08.png … … 90 90 ---------------- 91 91 92 Cette valeur sans unité représente le coût d'accÚs al léatoire au page du disque. Cete valeur est relative au autres paramÚtres de coût notemment l'accÚs séquentiel au pages, et le coût des opération processeur. Bien qu'il n'y aipas de valeur magique ici, la valeur par défaut est généralement trop faible. Cette valeur peut être affectée dynamiquement par session en utilisant la commande ``SET random_page_cost TO 2.0``.92 Cette valeur sans unité représente le coût d'accÚs aléatoire à une page du disque. Cette valeur est relative aux autres paramÚtres de coût notamment l'accÚs séquentiel aux pages, et le coût des opérations processeur. Bien qu'il n'y ait pas de valeur magique ici, la valeur par défaut est généralement trop faible. Cette valeur peut être affectée dynamiquement par session en utilisant la commande ``SET random_page_cost TO 2.0``. 93 93 94 94 *Valeur par défaut* : 4.0 … … 97 97 98 98 .. image:: ./tuning/conf09.png 99 99 100 100 seq_page_cost 101 101 ------------- 102 102 103 C'est une paramÚtre qui contr ole le coût des accÚs séquentiel au pages. Il n'est généralement pas nécessaire de modifier cette valeur maus la différence entre cette valeur et la valeurs ``random_page_cost`` affecte drastiquement le choix fait par le plannificateur de requêtes. Cette valeur peut aussi être affectée depuis une session.103 C'est une paramÚtre qui contrÃŽle le coût des accÚs séquentiels aux pages. Il n'est généralement pas nécessaire de modifier cette valeur mais la différence entre cette valeur et la valeur ``random_page_cost`` affecte drastiquement le choix fait par le planificateur de requêtes. Cette valeur peut aussi être affectée depuis une session. 104 104 105 105 *Valeur par défaut* : 1.0 … … 112 112 -------------------------- 113 113 114 AprÚs avoir réalisé ces changements mentionédans cette partie sauvez-les puis rechargez la configuration.114 AprÚs avoir réalisé les changements mentionnés dans cette partie sauvez-les puis rechargez la configuration. 115 115 116 * Ceci se fait en cliquant avec le bouton droit sur le nom du serveur (``PostgreSQL 8.4 on localhost:54321``) depuis pgAdmin, selectionnez *Disconnect*. 117 * Cliquez sur le bouton *Shutdown* depuis le Dashboard OpenGeo, puis cliquez sur *Start*. 116 * Ceci se fait en cliquant avec le bouton droit sur le nom du serveur (``PostgreSQL 8.4 on localhost:54321``) depuis pgAdmin, selectionnez *Disconnect*. 117 * Cliquez sur le bouton *Shutdown* depuis le Dashboard OpenGeo, puis cliquez sur *Start*. 118 118 * Pour finir reconnectez-vous au serveur depuis pgAdmin (cliquez avec le bouton droit sur le serveur puis sélectionnez *Connect*). 119 120 121 119 -
trunk/workshop-foss4g/validity.rst
r50 r62 4 4 ==================== 5 5 6 Dans 90% des cas la réponse à la question "pourquoi mes requêtes me renvoi t un message d'erreur du type 'TopologyException' error"" est : "un ou plusieurs des arguments passés sont invalides". Ce qui nous conduit à nous demander : que signifie invalide et pourquoi est-ce important ?6 Dans 90% des cas la réponse à la question "pourquoi mes requêtes me renvoient un message d'erreur du type 'TopologyException' error"" est : "un ou plusieurs des arguments passés sont invalides". Ce qui nous conduit à nous demander : que signifie invalide et pourquoi est-ce important ? 7 7 8 8 Qu'est-ce que la validité ? … … 13 13 Certaines des rÚgles de validation des polygones semble évidentes, et d'autre semblent arbitraires (et le sont vraiment). 14 14 15 * Les contours des Polygondoivent être fermés.16 * Les contours qui définissent des trous doivent être inclus dans la zone défini t par le coutour extérieur.15 * Les contours des polygones doivent être fermés. 16 * Les contours qui définissent des trous doivent être inclus dans la zone définie par le contour extérieur. 17 17 * Les contours ne doivent pas s'intersecter (ils ne doivent ni se croiser ni se toucher). 18 18 * Les contours ne doivent pas toucher les autres contours, sauf en un point unique. 19 19 20 Les deux derniÚres rÚgles font partie de la catégorie arbitraire s. Il y a d'autre moyen de définir des poygones qui sont consistentmais les rÚgles ci-dessus sont celles utilisées dans le standard :term:`OGC` :term:`SFSQL` que respecte PostGIS.20 Les deux derniÚres rÚgles font partie de la catégorie arbitraire. Il y a d'autres moyens de définir des polygones qui sont consistants mais les rÚgles ci-dessus sont celles utilisées dans le standard :term:`OGC` :term:`SFSQL` que respecte PostGIS. 21 21 22 La raison pour laquelle ces rÚgles sont important s est que les algorythmes de calcul dépendent de cette structuration consistante des arguments. Il est possible de construire des algorythmes qui n'utilise pas cette structuration, mais ces fonctions tendents à être trÚs lentes, étant donné que la premiÚre étape consistera à "analyser et construire des strcutureà l'intérieur des données".22 La raison pour laquelle ces rÚgles sont importantes est que les algorithmes de calcul dépendent de cette structuration consistante des arguments. Il est possible de construire des algorithmes qui n'utilisent pas cette structuration, mais ces fonctions tendent à être trÚs lentes, étant donné que la premiÚre étape consiste à "analyser et construire des structures à l'intérieur des données". 23 23 24 24 Voici un exemple de pourquoi cette structuration est importante. Ce polygone n'est pas valide : … … 27 27 28 28 POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0)); 29 29 30 30 Vous pouvez comprendre ce qui n'est pas valide en regardant cette figure : 31 31 32 32 .. image:: ./validity/figure_eight.png 33 33 34 Le contour externe est exactement en forme en 8 avec une intersection au milieu x. Notez que la fonction de rendu graphique est tout de même capable d'en afficher l'intérieur, don visuellement cela ressemble bien à une "aire" : deux unités quarré, donc une aire couplant ces deux unités.34 Le contour externe est exactement en forme en 8 avec une intersection au milieu. Notez que la fonction de rendu graphique est tout de même capable d'en afficher l'intérieur, donc visuellement cela ressemble bien à une "aire" : deux unités carré, donc une aire couplant ces deux unités. 35 35 36 36 Essayons maintenant de voir ce que pense la base de données de notre polygone : … … 39 39 40 40 SELECT ST_Area(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))')); 41 41 42 42 :: 43 43 44 st_area 44 st_area 45 45 --------- 46 46 0 47 47 48 Que ce passe-t-il ici ? L'algor ythme qui calcule l'aire suppose que les contours ne s'intersectent pas. Un contours normal devra toujours avoir une aire qui est bornée (l'intérieur) dans un sens de la ligne du contour (peu importe quelle sens, juste *un* sens). Néanmoins, dans notre figure en 8, le contour externe est à droite de la ligne pour un lobe et à gauche pour l'autre. Cela entraine que les airequi sont calculées pour chaque lobe annulent la précédente (l'une vaut 1 et l'autre -1) donc le résultat est une "aire de zéro".48 Que ce passe-t-il ici ? L'algorithme qui calcule l'aire suppose que les contours ne s'intersectent pas. Un contour normal devra toujours avoir une aire qui est bornée (l'intérieur) dans un sens de la ligne du contour (peu importe quelle sens, juste *un* sens). Néanmoins, dans notre figure en 8, le contour externe est à droite de la ligne pour un lobe et à gauche pour l'autre. Cela entraine que les aires qui sont calculées pour chaque lobe annulent la précédente (l'une vaut 1 et l'autre -1) donc le résultat est une "aire de zéro". 49 49 50 50 … … 52 52 -------------------- 53 53 54 Dans l'exemple précédent nous avions un polygone que nous **savions** non-valide. Comment déterminer les géométries non valides dans une tables d'un million d'enregistrements ? Avec la fonction :command:`ST_IsValid(geometry)` . Utilisé avec notre polygone précédent, nous abtenons rapidement la réponse :54 Dans l'exemple précédent nous avions un polygone que nous **savions** non-valide. Comment déterminer les géométries non valides dans une tables d'un million d'enregistrements ? Avec la fonction :command:`ST_IsValid(geometry)` utilisée avec notre polygone précédent, nous obtenons rapidement la réponse : 55 55 56 56 .. code-block:: sql … … 58 58 SELECT ST_IsValid(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))')); 59 59 60 :: 60 :: 61 61 62 62 f 63 63 64 Maintenant nous savons que l'entité est non-valide mais nous ne savons pas pourquoi. Nous pouvons utili er la fonction :command:`ST_IsValidReason(geometry)` pour trtouver la cause de non validité :64 Maintenant nous savons que l'entité est non-valide mais nous ne savons pas pourquoi. Nous pouvons utiliser la fonction :command:`ST_IsValidReason(geometry)` pour trouver la cause de non validité : 65 65 66 66 .. code-block:: sql … … 74 74 Vous remarquerez qu'en plus de la raison (intersection) la localisation de la non validité (coordonnée (1 1)) est aussi renvoyée. 75 75 76 Nous pouvons aussi utiiliser la fonction :command:`ST_IsValid(geometry)` pour tester nos tables : 76 Nous pouvons aussi utiiliser la fonction :command:`ST_IsValid(geometry)` pour tester nos tables : 77 77 78 78 .. code-block:: sql 79 79 80 -- Trouver tou t les polygones non valides et leur problÚme80 -- Trouver tous les polygones non valides et leur problÚme 81 81 SELECT name, boroname, ST_IsValidReason(the_geom) 82 82 FROM nyc_neighborhoods … … 85 85 :: 86 86 87 name | boroname | st_isvalidreason 87 name | boroname | st_isvalidreason 88 88 -------------------------+---------------+----------------------------------------------------------- 89 89 Howard Beach | Queens | Self-intersection[597264.083368305 4499924.54228856] … … 97 97 --------------------- 98 98 99 Commençons par la mauvaise nouvelle : il n'y a aucune garantie de pouvoir corriger une géométrie non valide. Dans le pire des scénarios, vous pouvez utiliser la fonction :command:`ST_IsValid(geometry)` pour identifier les entités non valides, les déplacer dans une autre table, exporter cette table et les réparer à l'aide d'un outil sextérieur.99 Commençons par la mauvaise nouvelle : il n'y a aucune garantie de pouvoir corriger une géométrie non valide. Dans le pire des scénarios, vous pouvez utiliser la fonction :command:`ST_IsValid(geometry)` pour identifier les entités non valides, les déplacer dans une autre table, exporter cette table et les réparer à l'aide d'un outil extérieur. 100 100 101 Voici un exemple de requête SQL qui déplace ntles géométries non valides hors de la table principale dans une table à part pour les exporter vers un programme de réparation.101 Voici un exemple de requête SQL qui déplace les géométries non valides hors de la table principale dans une table à part pour les exporter vers un programme de réparation. 102 102 103 103 .. code-block:: sql 104 104 105 -- Table à part des géométries non-valide 105 -- Table à part des géométries non-valides 106 106 CREATE TABLE nyc_neighborhoods_invalid AS 107 107 SELECT * FROM nyc_neighborhoods 108 108 WHERE NOT ST_IsValid(the_geom); 109 109 110 110 -- Suppression de la table principale 111 111 DELETE FROM nyc_neighborhoods 112 112 WHERE NOT ST_IsValid(the_geom); 113 114 Un bon outils pour réparer visuellemen des géométries non valide est OpenJump (http://openjump.org) qui contient un outils de validation depuis le menu **Tools->QA->Validate Selected Layers**.115 113 116 Maintenant, la bonne nouvelle : un grand nombre de non-validités **peuvent être résolues dans la base de données** en utilisant la fonction : :command:`ST_Buffer`.114 Un bon outil pour réparer visuellement des géométries non valide est OpenJump (http://openjump.org) qui contient un outils de validation depuis le menu **Tools->QA->Validate Selected Layers**. 117 115 118 Le coup du Buffer tire avantafe de la maniÚre dont les buffers sont construit : une géométrie bufferisée est une nouvelle géométrie, construite en déplaçant les lignes de la géométrie d'origine. Si vous déplacez les lignes originales par *rien* (zero) alors la nouvelle géométrie aura une structure identique à l'originale, mais puisqu'elle utilise les rÚgles topologiques de l':term:`OGC, elle sera valide. 116 Maintenant, la bonne nouvelle : un grand nombre de non-validités **peut être résolu dans la base de données** en utilisant la fonction : :command:`ST_Buffer`. 117 118 Le coup du Buffer tire avantage de la maniÚre dont les buffers sont construits : une géométrie bufferisée est une nouvelle géométrie, construite en déplaçant les lignes de la géométrie d'origine. Si vous déplacez les lignes originales par *rien* (zero) alors la nouvelle géométrie aura une structure identique à l'originale, mais puisqu'elle utilise les rÚgles topologiques de l':term:`OGC`, elle sera valide. 119 119 120 120 Par exemple, voici un cas classique de non-validité - le "polygone de la banane" - un seul contour que crée une zone mais se touche, laissant un "trou" qui n'en est pas un. 121 121 122 :: 122 :: 123 123 124 124 POLYGON((0 0, 2 0, 1 1, 2 2, 3 1, 2 0, 4 0, 4 4, 0 4, 0 0)) 125 125 126 126 .. image:: ./validity/banana.png 127 127 … … 143 143 .. note:: 144 144 145 Le "polygone banane" (ou "coquillage inversé") est un cas où le modÚle topologique de l':term:`OGC` et de ESRI diffÚrent. Le mod el ESRI considÚre que les contours quese touchent sont non valides et préfÚre la forme de banane pour ce cas de figure. Le modÚle de l'OGC est l'inverse.146 145 Le "polygone banane" (ou "coquillage inversé") est un cas où le modÚle topologique de l':term:`OGC` et de ESRI diffÚrent. Le modÚle ESRI considÚre que les contours qui se touchent sont non valides et préfÚre la forme de banane pour ce cas de figure. Le modÚle de l'OGC est l'inverse. 146 -
trunk/workshop-foss4g/welcome.rst
r60 r62 46 46 Par exemple: 47 47 48 :command:`ST_Touches(geometry A, geometry B)` retourne vrai si un des contours de géométrie intersecte l'autre contour de géométrie48 :command:`ST_Touches(geometry A, geometry B)` retourne vrai si un des contours de géométrie touche l'autre contour de géométrie 49 49 50 50 Fichiers, Tables et nom de colonne
Note: See TracChangeset
for help on using the changeset viewer.