[1] | 1 | .. _geometries_exercises: |
---|
| 2 | |
---|
[37] | 3 | Partie 9 : Exercices sur les géométries |
---|
[21] | 4 | ====================================== |
---|
[1] | 5 | |
---|
[37] | 6 | Voici un petit rappel de toutes les fonction que nous avons abordé jusqu'à présent. Elles devraient être utiles pour les exercices ! |
---|
[1] | 7 | |
---|
[21] | 8 | * :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_GeometryType(geometry)` retourne le type de la géométrie |
---|
| 11 | * :command:`ST_NDims(geometry)` retourne le nombre de dimensions |
---|
| 12 | * :command:`ST_SRID(geometry)` retourne l'identifiant du systÚme de références spatiales |
---|
| 13 | * :command:`ST_X(point)` retourne la coordonnée X |
---|
| 14 | * :command:`ST_Y(point)` retourne la coordonnée Y |
---|
| 15 | * :command:`ST_Length(linestring)` retourne la longueur d'une ligne |
---|
| 16 | * :command:`ST_StartPoint(geometry)` retourne le premier point d'une ligne |
---|
| 17 | * :command:`ST_EndPoint(geometry)` retourne le dernier point d'une ligne |
---|
[37] | 18 | * :command:`ST_NPoints(geometry)` retourne le nombre de points d'une ligne |
---|
[21] | 19 | * :command:`ST_Area(geometry)` retourne l'aire d'un polygone |
---|
| 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 exterieur (ligne) d'un polygon |
---|
| 22 | * :command:`ST_InteriorRingN(polygon, integer)` retourne le contour intérieur (ligne) d'un polygone |
---|
| 23 | * :command:`ST_Perimeter(geometry)` retourne la longueur de tout les contours |
---|
| 24 | * :command:`ST_NumGeometries(multi/geomcollection)` retourne le nombre de composantes dans une collection |
---|
| 25 | * :command:`ST_GeometryN(geometry, integer)` retourne la niÚme entité de la collection |
---|
| 26 | * :command:`ST_GeomFromText(text)` retourne ``geometry`` |
---|
| 27 | * :command:`ST_AsText(geometry)` retourne WKT ``text`` |
---|
| 28 | * :command:`ST_AsEWKT(geometry)` retourne EWKT ``text`` |
---|
| 29 | * :command:`ST_GeomFromWKB(bytea)` retourne ``geometry`` |
---|
| 30 | * :command:`ST_AsBinary(geometry)` retourne WKB ``bytea`` |
---|
| 31 | * :command:`ST_AsEWKB(geometry)` retourne EWKB ``bytea`` |
---|
| 32 | * :command:`ST_GeomFromGML(text)` retourne ``geometry`` |
---|
| 33 | * :command:`ST_AsGML(geometry)` retourne GML ``text`` |
---|
| 34 | * :command:`ST_GeomFromKML(text)` retourne ``geometry`` |
---|
| 35 | * :command:`ST_AsKML(geometry)` retourne KML ``text`` |
---|
| 36 | * :command:`ST_AsGeoJSON(geometry)` retourne JSON ``text`` |
---|
| 37 | * :command:`ST_AsSVG(geometry)` retourne SVG ``text`` |
---|
[1] | 38 | |
---|
[37] | 39 | Souvenez-vous aussi des tables disponibles: |
---|
[1] | 40 | |
---|
| 41 | * ``nyc_census_blocks`` |
---|
| 42 | |
---|
| 43 | * name, popn_total, boroname, the_geom |
---|
| 44 | |
---|
| 45 | * ``nyc_streets`` |
---|
| 46 | |
---|
| 47 | * name, type, the_geom |
---|
| 48 | |
---|
| 49 | * ``nyc_subway_stations`` |
---|
| 50 | |
---|
| 51 | * name, the_geom |
---|
| 52 | |
---|
| 53 | * ``nyc_neighborhoods`` |
---|
| 54 | |
---|
| 55 | * name, boroname, the_geom |
---|
| 56 | |
---|
[37] | 57 | Exercices |
---|
[1] | 58 | --------- |
---|
| 59 | |
---|
[37] | 60 | * **"Quelle est l'aire du quartier 'West Village'?"** |
---|
[1] | 61 | |
---|
| 62 | .. code-block:: sql |
---|
| 63 | |
---|
| 64 | SELECT ST_Area(the_geom) |
---|
| 65 | FROM nyc_neighborhoods |
---|
| 66 | WHERE name = 'West Village'; |
---|
| 67 | |
---|
| 68 | :: |
---|
| 69 | |
---|
| 70 | 1044614.53027344 |
---|
| 71 | |
---|
| 72 | .. note:: |
---|
| 73 | |
---|
[37] | 74 | L'aire est donnée en metres carrés. Pour obtenir l'aire en hectare, divisez par 10000. Pour obrenir l'aire en acres, divisez par 4047. |
---|
[1] | 75 | |
---|
[37] | 76 | * **"Quelle est l'aire de Manhattan en acres ?"** (Astuce: ``nyc_census_blocks`` et ``nyc_neighborhoods`` on toutes deux le champ ``boroname``.) |
---|
[1] | 77 | |
---|
| 78 | .. code-block:: sql |
---|
| 79 | |
---|
| 80 | SELECT Sum(ST_Area(the_geom)) / 4047 |
---|
| 81 | FROM nyc_neighborhoods |
---|
| 82 | WHERE boroname = 'Manhattan'; |
---|
| 83 | |
---|
| 84 | :: |
---|
| 85 | |
---|
| 86 | 13965.3201224118 |
---|
| 87 | |
---|
| 88 | or... |
---|
| 89 | |
---|
| 90 | .. code-block:: sql |
---|
| 91 | |
---|
| 92 | SELECT Sum(ST_Area(the_geom)) / 4047 |
---|
| 93 | FROM nyc_census_blocks |
---|
| 94 | WHERE boroname = 'Manhattan'; |
---|
| 95 | |
---|
| 96 | :: |
---|
| 97 | |
---|
| 98 | 14572.1575543757 |
---|
| 99 | |
---|
| 100 | |
---|
[37] | 101 | * **"Combien de blocs de la ville de New York ont des trous ?"** |
---|
[1] | 102 | |
---|
| 103 | .. code-block:: sql |
---|
| 104 | |
---|
| 105 | SELECT Count(*) |
---|
| 106 | FROM nyc_census_blocks |
---|
| 107 | WHERE ST_NRings(the_geom) > 1; |
---|
| 108 | |
---|
| 109 | :: |
---|
| 110 | |
---|
| 111 | 66 |
---|
| 112 | |
---|
[21] | 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.) |
---|
[1] | 114 | |
---|
| 115 | .. code-block:: sql |
---|
| 116 | |
---|
| 117 | SELECT Sum(ST_Length(the_geom)) / 1000 |
---|
| 118 | FROM nyc_streets; |
---|
| 119 | |
---|
| 120 | :: |
---|
| 121 | |
---|
| 122 | 10418.9047172 |
---|
| 123 | |
---|
[37] | 124 | * **"Quelle est la longueur de 'Columbus Cir' (Columbus Circle) ?"** |
---|
[1] | 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 | |
---|
[21] | 136 | * **"Quelle est le contour de 'West Village' au format JSON ?"** |
---|
[1] | 137 | |
---|
| 138 | .. code-block:: sql |
---|
| 139 | |
---|
| 140 | SELECT ST_AsGeoJSON(the_geom) |
---|
| 141 | FROM nyc_neighborhoods |
---|
| 142 | WHERE name = 'West Village'; |
---|
| 143 | |
---|
| 144 | :: |
---|
| 145 | |
---|
| 146 | {"type":"MultiPolygon","coordinates": |
---|
| 147 | [[[[583263.2776595836,4509242.6260239873], |
---|
| 148 | [583276.81990686338,4509378.825446927], ... |
---|
| 149 | [583263.2776595836,4509242.6260239873]]]]} |
---|
| 150 | |
---|
[21] | 151 | La géométrie de type "MultiPolygon", interressant ! |
---|
[1] | 152 | |
---|
| 153 | |
---|
[21] | 154 | * **"Combien de polygones sont dans le multi-polygone 'West Village' ?"** |
---|
[1] | 155 | |
---|
| 156 | .. code-block:: sql |
---|
| 157 | |
---|
| 158 | SELECT ST_NumGeometries(the_geom) |
---|
| 159 | FROM nyc_neighborhoods |
---|
| 160 | WHERE name = 'West Village'; |
---|
| 161 | |
---|
| 162 | :: |
---|
| 163 | |
---|
| 164 | 1 |
---|
| 165 | |
---|
| 166 | .. note:: |
---|
| 167 | |
---|
[37] | 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. |
---|
[1] | 169 | |
---|
| 170 | |
---|
[21] | 171 | * **"Quel est la longueur des rues de la ville de New York, suivant leur type ?"** |
---|
[1] | 172 | |
---|
| 173 | .. code-block:: sql |
---|
| 174 | |
---|
| 175 | SELECT type, Sum(ST_Length(the_geom)) AS length |
---|
| 176 | FROM nyc_streets |
---|
| 177 | GROUP BY type |
---|
| 178 | ORDER BY length DESC; |
---|
| 179 | |
---|
| 180 | :: |
---|
| 181 | |
---|
| 182 | type | length |
---|
| 183 | --------------------------------------------------+------------------ |
---|
| 184 | residential | 8629870.33786606 |
---|
| 185 | motorway | 403622.478126363 |
---|
| 186 | tertiary | 360394.879051303 |
---|
| 187 | motorway_link | 294261.419479668 |
---|
| 188 | secondary | 276264.303897926 |
---|
| 189 | unclassified | 166936.371604458 |
---|
| 190 | primary | 135034.233017947 |
---|
| 191 | footway | 71798.4878378096 |
---|
| 192 | service | 28337.635038596 |
---|
| 193 | trunk | 20353.5819826076 |
---|
| 194 | cycleway | 8863.75144825929 |
---|
| 195 | pedestrian | 4867.05032825026 |
---|
| 196 | construction | 4803.08162103562 |
---|
| 197 | residential; motorway_link | 3661.57506293745 |
---|
| 198 | trunk_link | 3202.18981240201 |
---|
| 199 | primary_link | 2492.57457083536 |
---|
| 200 | living_street | 1894.63905457332 |
---|
| 201 | primary; residential; motorway_link; residential | 1367.76576941335 |
---|
| 202 | undefined | 380.53861910346 |
---|
| 203 | steps | 282.745221342127 |
---|
| 204 | motorway_link; residential | 215.07778911517 |
---|
| 205 | |
---|
| 206 | |
---|
| 207 | .. note:: |
---|
| 208 | |
---|
[47] | 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. |
---|
[1] | 210 | |
---|
| 211 | |
---|
| 212 | |
---|
| 213 | |
---|
[21] | 214 | |
---|