- Location:
- /trunk/workshop-foss4g
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
/trunk/workshop-foss4g/projection.rst
r30 r20 1 1 .. _projection: 2 2 3 Partie 15 : Projections des données 4 =========================== ========3 Section 15: Projecting Data 4 =========================== 5 5 6 La Terre n'est pas plâte et il n'y a pas de moyen simple de la poser à plat sur une carte en papier (ou l'écran d'un ordinateur), donc les gens en sont arriver à fournir des solutions ingénieuses, chacunes avec des bons et des mauvais cotés. Certaines projections préservent les aires, donc tout 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.6 The earth is not flat, and there is no simple way of putting it down on a flat paper map (or computer screen), so people have come up with all sorts of ingenious solutions, each with pros and cons. Some projections preserve area, so all objects have a relative size to each other; other projections preserve angles (conformal) like the Mercator projection; some projections try to find a good intermediate mix with only little distortion on several parameters. Common to all projections is that they transform the (spherical) world onto a flat cartesian coordinate system, and which projection to choose depends on how you will be using the data. 7 7 8 Nous avonsdéjà recontrer des projections, lorsque nous avons charger les données` de la ville de Ney York <loading_data>`.Rappelez-vous qu'elles utilisaient le SRID 26918. Parfois, malgrÚs tout, vous aurez besoin de transformer et de reprojeter vos données d'un systÚme de projection à l'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 We've already encountered projections when we :ref:`loaded our nyc data <loading_data>`. (Recall that pesky SRID 26918). Sometimes, however, you need to transform and re-project between spatial reference systems. PostGIS includes built-in support for changing the projection of data, using the :command:`ST_Transform(geometry, srid)` function. For managing the spatial reference identifiers on geometries, PostGIS provides the :command:`ST_SRID(geometry)` and :command:`ST_SetSRID(geometry, srid)` functions. 9 9 10 Nous pouvons vérifier le SRID de nos données avec la commande :command:`ST_SRID`:10 We can confirm the SRID of our data with the :command:`ST_SRID` command: 11 11 12 12 .. code-block:: sql … … 18 18 26918 19 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 fromat :term:`WKT` dans la colonne ``srtext`` et il y a aussu une seconde définition correspondant au 20 And what is definition of "26918"? As we saw in ":ref:`loading data section <loading_data>`", the definition is contained in the ``spatial_ref_sys`` table. In fact, **two** definitions are there. The "well-known text" (:term:`WKT`) definition is in the ``srtext`` column, and there is a second definition in "proj.4" format in the ``proj4text`` column. 21 21 22 .. code-block:: sql 22 23 23 24 SELECT * FROM spatial_ref_sys WHERE srid = 26918; 24 25 25 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:26 In fact, for the internal PostGIS re-projection calculations, it is the contents of the ``proj4text`` column that are used. For our 26918 projection, here is the proj.4 text: 26 27 27 28 .. code-block:: sql … … 33 34 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 34 35 35 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 les autres alors que la colonne ``proj4text`` est principalement utilisée en interne.36 In practice, both the ``srtext`` and the ``proj4text`` columns are important: the ``srtext`` column is used by external programs like `GeoServer <http://geoserver.org>`_, `uDig <udig.refractions.net>`_, and `FME <http://www.safe.com/>`_ and others; the ``proj4text`` column is used internally. 36 37 37 Compar aison de données38 -------------- --------38 Comparing Data 39 -------------- 39 40 40 Combiné, une coordonnée et un SRID définissent une position sur le globe. Sans le SRID, une coordonnée est juste une notion abstraite. Un systÚme de coordonnées "cartésiennes" est définit comme un systÚme de coordonnées "plat" sur la surface de la Terre. Puisque les fonctions de PostGIS utilisent cette surface plane, les opérations de comparaison nécessitent que l'ensemble des objets géométriques soient représenté dans le même systÚme, ayant le même SRID.41 Taken together, a coordinate and an SRID define a location on the globe. Without an SRID, a coordinate is just an abstract notion. A âCartesianâ coordinate plane is defined as a âflatâ coordinate system placed on the surface of Earth. Because PostGIS functions work on such a plane, comparison operations require that both geometries be represented in the same SRID. 41 42 42 Si vous utilisé des géométries avec différents SRID vous obtiendrez une erreur du genre:43 If you feed in geometries with differing SRIDs you will just get an error: 43 44 44 45 .. code-block:: sql … … 57 58 .. note:: 58 59 59 Faites attention de pas utiliser la transformation à la volée à l'aide de :command:`ST_Transform` trpop souvent. Les indexes spatiaux sont construits en utilisant le SRID inclu dans les géométries. Si la comparaison est faite avec un SRID différent, les indexes 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 applications externe.60 Be careful of getting too happy with using :command:`ST_Transform` for on-the-fly conversion. Spatial indexes are built using SRID of the stored geometries. If comparison are done in a different SRID, spatial indexes are (often) not used. It is best practice to choose **one SRID** for all the tables in your database. Only use the transformation function when you are reading or writing data to external applications. 60 61 61 62 62 Transform er les données63 ----------------- ------63 Transforming Data 64 ----------------- 64 65 65 Si vous retournez à la définition au format proj4 du SRID 26918, vous pouvez voir que notre projectioin actuelle est de type UTM zone 18 (Universal Transvers Mercator), avec comme unité de mesure le mÚtre.66 If we return to our proj4 definition for SRID 26918, we can see that our working projection is UTM (Universal Transverse Mercator) of zone 18, with meters as the unit of measurement. 66 67 67 68 :: … … 69 70 +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 70 71 71 Essayons de convertir certaines données de notre systÚme de projection dans un systÚme de coordonnées géographiques, aussi connu comme "longitude/latitude". 72 Let's convert some data from our working projection to geographic coordinates -- also known as "longitude/latitude". 72 73 73 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é ceci, nous devons ensuite trouver le SRID dans le lequel nous souhaitons re-projeter. En d'autre terme, quel est le SRID des coordonnées géographiques?74 To convert data from one SRID to another, you must first verify that your geometry has a valid SRID. Since we have already confirmed a valid SRID, we next need the SRID of the projection to transform into. In other words, what is the SRID of geographic coordinates? 74 75 75 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 The most common SRID for geographic coordinates is 4326, which corresponds to "longitude/latitude on the WGS84 spheroid". You can see the definition at the spatialreference.org site: 76 77 77 78 http://spatialreference.org/ref/epsg/4326/ 78 79 79 Vous pouvez aussi récupérer les définitions dans la table ``spatial_ref_sys``:80 You can also pull the definitions from the ``spatial_ref_sys`` table: 80 81 81 82 .. code-block:: sql … … 93 94 AUTHORITY["EPSG","4326"]] 94 95 95 Essayons de convertir les cordonnées de la station 'Broad St':96 Let's convert the coordinates of the 'Broad St' subway station into geographics: 96 97 97 98 .. code-block:: sql … … 105 106 POINT(-74.0106714688735 40.7071048155841) 106 107 107 Si vous chargez les données ou crééez une nouvelle géométrie sans spécifier un SRID, la valeur du SRID prendra alors la valeur -1. Rapellez-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 If you load data or create a new geometry without specifying an SRID, the SRID value will be -1. Recall in :ref:`geometries`, that when we created our ``geoemetries`` table we didn't specify an SRID. If we query our database, we should expect all the ``nyc_`` tables to have an SRID of 26918, while the ``geometries`` table defaulted to an SRID of -1. 108 109 109 Pour visualiser la table d'assignation des SRID, interroger la table ``geometry_columns`` de la base de données.110 To view a table's SRID assignment, query the database's ``geometry_columns`` table. 110 111 111 112 .. code-block:: sql … … 125 126 126 127 127 Neanmoins, si vous connaissez quel est 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 tranformer dans d'autres systÚmes de projections.128 However, if you know what the SRID of the coordinates is supposed to be, you can set it post-facto, using :command:`ST_SetSRID` on the geometry. Then you will be able to transform the geometry into other systems. 128 129 129 130 .. code-block:: sql … … 136 137 FROM geometries; 137 138 138 Liste des fonctions 139 ------------------- 139 Function List 140 ------------- 141 `ST_AsText <http://postgis.org/docs/ST_AsText.html>`_: Returns the Well-Known Text (WKT) representation of the geometry/geography without SRID metadata. 140 142 141 `ST_ AsText <http://postgis.org/docs/ST_AsText.html>`_: retourne la représentation au format Well-Known Text (WKT) sans la métadonnée SRID.143 `ST_SetSRID(geometry, srid) <http://postgis.org/docs/ST_SetSRID.html>`_: Sets the SRID on a geometry to a particular integer value. 142 144 143 `ST_S etSRID(geometry, srid) <http://postgis.org/docs/ST_SetSRID.html>`_: affecte une valeur au SRID d'une géométrie.145 `ST_SRID(geometry) <http://postgis.org/docs/ST_SRID.html>`_: Returns the spatial reference identifier for the ST_Geometry as defined in spatial_ref_sys table. 144 146 145 `ST_SRID(geometry) <http://postgis.org/docs/ST_SRID.html>`_: retourne l'indentifiant du systÚme de références spatialesd'un objet ST_Geometry comme définit dans la table spatial_ref_sys. 146 147 `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. 147 `ST_Transform(geometry, srid) <http://postgis.org/docs/ST_Transform.html>`_: Returns a new geometry with its coordinates transformed to the SRID referenced by the integer parameter. -
/trunk/workshop-foss4g/validity.rst
r30 r20 1 1 .. _validity: 2 2 3 Partie 20 : Validité 3 Section 20: Validity 4 4 ==================== 5 5 6 Dans 90% des cas la réponse à question "pourquoi mes requêtes me renvoit 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 In 90% of the cases the answer to the question, "why is my query giving me a 'TopologyException' error" is "one or more of the inputs are invalid". Which begs the question: what does it mean to be invalid, and why should we care? 7 7 8 Qu'est-ce que la validité 9 ---------------- ---------8 What is Validity 9 ---------------- 10 10 11 La validité est surtout importante pour les polygones, qui définissent des aires et requiÚrent une bonne structuration. Les lignes sont vraiment simples et ne peuvent pas être invalides ainsi que lespoints.11 Validity is most important for polygons, which define bounded areas and require a good deal of structure. Lines are very simple and cannot be invalid, nor can points. 12 12 13 Certaines des rÚgles de validation des polygones semble évidentes, et d'autre semblent arbitraires (et le sont vraiment).13 Some of the rules of polygon validity feel obvious, and others feel arbitrary (and in fact, are arbitrary). 14 14 15 * Les contours des Polygon doivent être fermés.16 * Les contours qui définissent des trous doivent être inclus dans la zone définit par le coutour extérieur.17 * Les contours ne doivent pas s'intersecter (ils ne doivent ni se croiser ni se toucher).18 * Les contours ne doivent pas toucher les autres contours, sauf en un point unique.15 * Polygon rings must close. 16 * Rings that define holes should be inside rings that define exterior boundaries. 17 * Rings may not self-intersect (they may neither touch nor cross one another). 18 * Rings may not touch other rings, except at a point. 19 19 20 Les deux derniÚres rÚgles font partie de la catégorie arbitraires. Il y a d'autre moyen de définir des poygones qui sont consistent mais les rÚgles ci-dessus sont celles utilisées dans le standard :term:`OGC` :term:`SFSQL` que respecte PostGIS.20 The last two rules are in the arbitrary category. There are other ways to define polygons that are equally self-consistent but the rules above are the ones used by the :term:`OGC` :term:`SFSQL` standard that PostGIS conforms to. 21 21 22 La raison pour laquelle ces rÚgles sont importants 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 The reason the rules are important is because algorithms for geometry calculations depend on consistent structure in the inputs. It is possible to build algorithms that have no structural assumptions, but those routines tend to be very slow, because the first step in any structure-free routine is to *analyze the inputs and build structure into them*. 23 23 24 Voici un exemple de pourquoi cette structuration est importante. Ce polygon n'est pas valide:24 Here's an example of why structure matters. This polygon is invalid: 25 25 26 26 :: … … 28 28 POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0)); 29 29 30 Vous pouvez comprendre ce qui n'est pas valide en regardant cette figure:30 You can see the invalidity a little more clearly in this diagram: 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 milieux. 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 The outer ring is actually a figure-eight, with a self-intersection in the middle. Note that the graphic routines successfully render the polygon fill, so that visually it is appears to be an "area": two one-unit squares, so a total area of two units of area. 35 35 36 Essayons maintenant de voir ce que pense la base de données de notre polygone:36 Let's see what the database thinks the area of our polygon is: 37 37 38 38 .. code-block:: sql … … 46 46 0 47 47 48 Que ce passe-t-il ici ? L'algorythme 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) sur une partie de la ligne du contour (peu importe quelle partie, juste *une* parte). 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 aire qui sont calculées pour chaque lobe annule la précédente (l'une vaut 1 et l'autre -1) donc le résultat est une "aire de zéro".48 What's going on here? The algorithm that calculates area assumes that rings to not self-intersect. A well-behaved ring will always have the area that is bounded (the interior) on one side of the bounding line (it doesn't matter which side, just that it is on *one* side). However, in our (poorly behaved) figure-eight, the bounded area is to the right of the line for one lobe and to the left for the other. This causes the areas calculated for each lobe to cancel out (one comes out as 1, the other as -1) hence the "zero area" result. 49 49 50 50 51 D étecté la validité52 ------------------ -51 Detecting Validity 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 In the previous example we had one polygon that we **knew** was invalid. How do we detect invalidity in a table with millions of geometries? With the :command:`ST_IsValid(geometry)` function. Used against our figure-eight, we get a quick answer: 55 55 56 56 .. code-block:: sql … … 62 62 f 63 63 64 Maintenant nous savons que l'entité est non-valide mais nous ne savons pas pourquoi. Nous pouvons utilier la fonction :command:`ST_IsValidReason(geometry)` pour trtouver la cause de non validité:64 Now we know that the feature is invalid, but we don't know why. We can use the :command:`ST_IsValidReason(geometry)` function to find out the source of the invalidity: 65 65 66 66 .. code-block:: sql … … 72 72 Self-intersection[1 1] 73 73 74 Vous remarquerez qu'en plus de la raison (intersection) la localisation de la non validité (coordonnée (1 1)) est aussi renvoyée.74 Note that in addition to the reason (self-intersection) the location of the invalidity (coordinate (1 1)) is also returned. 75 75 76 Nous pouvons aussi utiiliser la fonction :command:`ST_IsValid(geometry)` pour tester nos tables : 76 We can use the :command:`ST_IsValid(geometry)` function to test our tables too: 77 77 78 78 .. code-block:: sql 79 79 80 -- Trouver tout les polygones non valides et leur problÚme80 -- Find all the invalid polygons and what their problem is 81 81 SELECT name, boroname, ST_IsValidReason(the_geom) 82 82 FROM nyc_neighborhoods … … 94 94 95 95 96 R éparer les invalides97 -------------------- -96 Repairing Invalidity 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 outils extérieur.99 First the bad news: there is no guaranteed way to fix invalid geometries. The worst case scenario is identifying them with the :command:`ST_IsValid(geometry)` function, moving them to a side table, exporting that table, and repairing them externally. 100 100 101 Voici un exemple de requête SQL qui déplacent les géométries non valides hors de la table principale dans une table à part pour les exporter vers un programme de réparation.101 Here's an example of SQL to move invalid geometries out of the main table into a side table suitable for dumping to an external cleaning process. 102 102 103 103 .. code-block:: sql 104 104 105 -- Table à part des géométries non-valide105 -- Side table of invalids 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 -- Suppression de la table principale110 -- Remove them from the main table 111 111 DELETE FROM nyc_neighborhoods 112 112 WHERE NOT ST_IsValid(the_geom); 113 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**.114 A good tool for visually repairing invalid geometry is OpenJump (http://openjump.org) which includes a validation routine under **Tools->QA->Validate Selected Layers**. 115 115 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`.116 Now the good news: a large proportion of invalidities **can be fixed inside the database** using the :command:`ST_Buffer` function. 117 117 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.118 The buffer trick takes advantage of the way buffers are built: a buffered geometry is a brand new geometry, constructed by offsetting lines from the original geometry. If you offset the original lines by **nothing** (zero) then the new geometry will be structurally identical to the original one, but because it is built using the :term:`OGC` topology rules, it will be valid. 119 119 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.120 For example, here's a classic invalidity -- the "banana polygon" -- a single ring that encloses an area but bends around to touch itself, leaving a "hole" which is not actually a hole. 121 121 122 122 :: … … 126 126 .. image:: ./validity/banana.png 127 127 128 En créant un buffer de zero sur le polygone retourne un polygone :term:`OGC` valide, le contour externe et un contour interne qui touche l'autre en un seulpoint.128 Running the zero-offset buffer on the polygon returns a valid :term:`OGC` polygon, consisting of an outer and inner ring that touch at one point. 129 129 130 130 .. code-block:: sql … … 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 model ESRI considÚre que les contours que 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.145 The "banana polygon" (or "inverted shell") is a case where the :term:`OGC` topology model for valid geometry and the model used internally by ESRI differ. The ESRI model considers rings that touch to be invalid, and prefers the banana form for this kind of shape. The OGC model is the reverse. 146 146 -
/trunk/workshop-foss4g/projection_exercises.rst
r30 r20 1 1 .. _projection_exercises: 2 2 3 Partie 16 : Exercices de projection 4 ================================ ===3 Section 16: Projection Exercises 4 ================================ 5 5 6 Voici un rappel de certaines fonctions que nous avons vu. Astuce : elles devraient être utiles pour les exercices ! 7 8 * :command:`sum(expression)` agrégation qui retourn la somme d'un esemble de valeurs 9 * :command:`ST_Length(linestring)` retourne la longueur d'une ligne 10 * :command:`ST_SRID(geometry, srid)` retourne le SRID d'une géométrie 11 * :command:`ST_Transform(geometry, srid)` re-projette des géométries dans un autre systÚme de références spatiales 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``) 6 Here's a reminder of some of the functions we have seen. Hint: they should be useful for the exercises! 15 7 16 Rappelez-vous les resssources en ligne : 8 * :command:`sum(expression)` aggregate to return a sum for a set of records 9 * :command:`ST_Length(linestring)` returns the length of the linestring 10 * :command:`ST_SRID(geometry, srid)` returns the SRID of the geometry 11 * :command:`ST_Transform(geometry, srid)` converts geometries into different spatial reference systems 12 * :command:`ST_GeomFromText(text)` returns ``geometry`` 13 * :command:`ST_AsText(geometry)` returns WKT ``text`` 14 * :command:`ST_AsGML(geometry)` returns GML ``text`` 15 16 Remember the online resources that are available to you: 17 17 18 18 * http://spatialreference.org 19 19 * http://prj2epsg.org 20 20 21 Et les tables qui sont disponibles:21 Also remember the tables we have available: 22 22 23 23 * ``nyc_census_blocks`` … … 37 37 * name, boroname, the_geom 38 38 39 Exerci ces39 Exercises 40 40 --------- 41 41 42 * **" Quelle est la longueur des rue de New York, mesurée en UTM 18?"**42 * **"What is the length of all streets in New York, as measured in UTM 18?"** 43 43 44 44 .. code-block:: sql … … 51 51 10418904.7172 52 52 53 * **" Quelle est la définition du SRID 2831?"**53 * **"What is the WKT definition of SRID 2831?"** 54 54 55 55 .. code-block:: sql … … 58 58 WHERE SRID = 2831; 59 59 60 O u, via `prj2epsg <http://prj2epsg.org/epsg/2831>`_60 Or, via `prj2epsg <http://prj2epsg.org/epsg/2831>`_ 61 61 62 62 :: … … 87 87 88 88 89 * **" Quelle est la longueur des rue de New York, mesuré en utilisant le SRID 2831?"**89 * **"What is the length of all streets in New York, as measured in SRID 2831?"** 90 90 91 91 .. code-block:: sql … … 100 100 .. note:: 101 101 102 La différence entre les mesure en UTM 18 et en the 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, qui est proche de la valeur dans l'autre systÚme de projection (Stateplane Long Island) 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 plus large.102 The difference between the UTM 18 and the Stateplane Long Island measurements is (10421993 - 10418904)/10418904, or 0.02%. Calculated on the spheroid using :ref:`geography` the total street length is 10421999, which is closer to the Stateplane value. This is not surprising, since the Stateplane Long Island projection is precisely calibrated for a very small area (New York City) while UTM 18 has to provide reasonable results for a large regional area. 103 103 104 * **" Quelle est la représentation KML du point de la station de métris 'Broad St'?"**104 * **"What is the KML representation of the point at 'Broad St' subway station?"** 105 105 106 106 .. code-block:: sql … … 114 114 <Point><coordinates>-74.010671468873468,40.707104815584088</coordinates></Point> 115 115 116 H é ! les coordonnées sont géographiques bien que nous n'ayons pas fait appÚle à la fonction :command:`ST_Transform`, pourquoi ? Parce que le standard KML spécifit que toutes les coordonnées *doivent* être en géographiques (en fait, dans le systÚme EPSG:4326), donc la fonction :command:`ST_AsKML` réalise la transformation automatiquement.116 Hey! The coordinates are in geographics even though we didn't call :command:`ST_Transform`, why? Because the KML standard dictates that all coordinates *must* be in geographics (ESPG:4326, in fact) so the :command:`ST_AsKML` function does the transformation automatically. -
/trunk/workshop-foss4g/spatial_relationships.rst
r30 r20 1 1 .. _spatial_relationships: 2 2 3 Partie 10 : relations spatiales3 Section 10: Spatial Relationships 4 4 ================================= 5 5 6 Jusqu'à maintenant nous n'avons utilisé que des fonctions qui permettent de mesurer (:command:`ST_Area`, :command:`ST_Length`), de serialiser (:command:`ST_GeomFromText`) ou désérialiser (:command:`ST_AsGML`) des géométries. Ces fonctions ont en commun de fonctionner uniquement sur une géométrie à la fois.6 So far we have only used spatial functions that measure (:command:`ST_Area`, :command:`ST_Length`), serialize (:command:`ST_GeomFromText`) or deserialize (:command:`ST_AsGML`) geometries. What these functions have in common is that they only work on one geometry at a time. 7 7 8 Les base de données spatiales sont puissantes car elle ne font pas que stoquer les géométries, elle ont aussi la faculté de vérifier les *relations entre les géométries*. 8 Spatial databases are powerful because they not only store geometry, they also have the ability to compare *relationships between geometries*. 9 9 10 Pour les questions comme "Quel est le plus proche garage à vélo prêt du park ?" ou "Ou est l'intersection du métros avec telle rue ?" nous devrons comparer les géométries représentant les garage à vélo, les rues et les lignes de métros.10 Questions like âWhich are the closet bike racks to a park?â or âWhere are the intersections of subway lines and streets?â can only be answered by comparing geometries representing the bike racks, streets, and subway lines. 11 11 12 Le standard de l'OGC définit l'ensemble suivant de fonctions pour comparer les géométries.12 The OGC standard defines the following set of methods to compare geometries. 13 13 14 14 ST_Equals 15 15 --------- 16 16 17 :command:`ST_Equals(geometry A, geometry B)` test l'égalité spatiale de deux géométries.17 :command:`ST_Equals(geometry A, geometry B)` tests the spatial equality of two geometries. 18 18 19 19 .. figure:: ./spatial_relationships/st_equals.png 20 20 :align: center 21 21 22 ST_Equals ret ourne TRUE si les deux géométries sont du même type, ont des coordonnées x.y identiques.22 ST_Equals returns TRUE if two geometries of the same type have identical x,y coordinate values, i.e. if the secondary shape is equal (identical) to the primary shape object. 23 23 24 PremiÚrement, essayons de récupérer la représentation d'un point de notre table ``nyc_subway_stations``. Nous ne prendrons que l'entrée :'Broad St'.24 First, let's retrieve a representation of a point from our ``nyc_subway_stations`` table. We'll take just the entry for 'Broad St'. 25 25 26 26 .. code-block:: sql … … 36 36 Broad St | 0101000020266900000EEBD4CF27CF2141BC17D69516315141 | POINT(583571 4506714) 37 37 38 Maintenant, copiez / collez la valeur afficher pour tester la fonction :command:`ST_Equals`:38 Then, plug the geometry representation back into an :command:`ST_Equals` test: 39 39 40 40 .. code-block:: sql … … 50 50 .. note:: 51 51 52 La représentation du point n'est pas vraiment compréhensible (``0101000020266900000EEBD4CF27CF2141BC17D69516315141``) mais c'est exactement la représentation des coordonnées. Pour tester l'égalité, utiliser ce format est nécessaire.52 The representation of the point was not very human readable (``0101000020266900000EEBD4CF27CF2141BC17D69516315141``) but it was an exact representation of the coordinate values. For a test like equality, using the exact coordinates in necessary. 53 53 54 54 55 ST_Intersects, ST_Disjoint, ST_Crosses etST_Overlaps55 ST_Intersects, ST_Disjoint, ST_Crosses and ST_Overlaps 56 56 ------------------------------------------------------ 57 57 58 :command:`ST_Intersects`, :command:`ST_Crosses`, et :command:`ST_Overlaps` test si l'intérieur des géométries s'intersect, se croise ou se chevauche.58 :command:`ST_Intersects`, :command:`ST_Crosses`, and :command:`ST_Overlaps` test whether the interiors of the geometries intersect. 59 59 60 60 .. figure:: ./spatial_relationships/st_intersects.png 61 61 :align: center 62 62 63 :command:`ST_Intersects(geometry A, geometry B)` ret ourne t (TRUE) si l'intersection ne rénvoit pas un ensemble vide de résultats. Intersects retourne le résultat exactement inverse de la fonctiondisjoint.63 :command:`ST_Intersects(geometry A, geometry B)` returns t (TRUE) if the intersection does not result in an empty set. Intersects returns the exact opposite result of 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 The opposite of ST_Intersects is :command:`ST_Disjoint(geometry A , geometry B)`. If two geometries are disjoint, they do not intersect, and vice-versa. In fact, it is often more efficient to test "not intersects" than to test "disjoint" because the intersects tests can be spatially indexed, while the disjoint test cannot. 69 69 70 70 .. figure:: ./spatial_relationships/st_crosses.png 71 71 :align: center 72 73 Pour les comparaisons de couples de types multipoint/polygon, multipoint/linestring, linestring/linestring, linestring/polygon, et linestring/multipolygon, :command:`ST_Crosses(geometry A, geometry B)` retourne t (TRUE) si les résultats de l'intersection74 72 75 73 For multipoint/polygon, multipoint/linestring, linestring/linestring, linestring/polygon, and linestring/multipolygon comparisons, :command:`ST_Crosses(geometry A, geometry B)` returns t (TRUE) if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries. … … 78 76 :align: center 79 77 80 :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.78 :command:`ST_Overlaps(geometry A, geometry B)` compares two geometries of the same dimension and returns TRUE if their intersection set results in a geometry different from both but of the same dimension. 81 79 82 Essayons de prendre la station de métro de Broad Street et de déterminer sont voisinage en utilisant la fonction :command:`ST_Intersects`:80 Let's take our Broad Street subway station and determine its neighborhood using the :command:`ST_Intersects` function: 83 81 84 82 .. code-block:: sql … … 99 97 ---------- 100 98 101 :command:`ST_Touches` test si deux géométries se touchent en leur contour extérieur, mais leur contours intérieur ne s'intersectent pas99 :command:`ST_Touches` tests whether two geometries touch at their boundaries, but do not intersect in their interiors 102 100 103 101 .. figure:: ./spatial_relationships/st_touches.png 104 102 :align: center 105 103 106 :command:`ST_Touches(geometry A, geometry B)` ret ourn TRUE soit si les contours des géométries s'intersectent ou si l'un des contours intérieur de l'une intersecte le contour extérieur de l'autre.104 :command:`ST_Touches(geometry A, geometry B)` returns TRUE if either of the geometries' boundaries intersect or if only one of the geometry's interiors intersects the other's boundary. 107 105 108 ST_Within etST_Contains106 ST_Within and ST_Contains 109 107 ------------------------- 110 108 111 :command:`ST_Within` et :command:`ST_Contains` test si une géométrie est totalement incluse dans l'autre.109 :command:`ST_Within` and :command:`ST_Contains` test whether one geometry is fully within the other. 112 110 113 111 .. figure:: ./spatial_relationships/st_within.png 114 112 :align: center 115 113 116 :command:`ST_Within(geometry A , geometry B)` ret ourne TRUE si la premiÚre géométries est complÚtement contenue dans l'autre. ST_Within test l'exact opposé au résultat deST_Contains.114 :command:`ST_Within(geometry A , geometry B)` returns TRUE if the first geometry is completely within the second geometry. ST_Within tests for the exact opposite result of ST_Contains. 117 115 118 :command:`ST_Contains(geometry A, geometry B)` ret ourne TRUE si la seconde géométries est complÚtement contenue dans la premiÚre géométrie.116 :command:`ST_Contains(geometry A, geometry B)` returns TRUE if the second geometry is completely contained by the first geometry. 119 117 120 118 121 ST_Distance etST_DWithin119 ST_Distance and ST_DWithin 122 120 -------------------------- 123 121 124 Une question qui arrive fréquemment dans le domaine du SIG est "trouver tout les trucs qui se trouve à une distance X de cet autre truc". 122 An extremely common GIS question is "find all the stuff within distance X of this other stuff". 125 123 126 La fonction :command:`ST_Distance(geometry A, geometry B)` calcule la *plus courte* distance entre deux géoémétries. Cela est pratique pour récupérer la distance entre les objets.124 The :command:`ST_Distance(geometry A, geometry B)` calculates the *shortest* distance between two geometries and returns it as a float. This is useful for actually reporting back the distance between objects. 127 125 128 126 .. code-block:: sql … … 136 134 3 137 135 138 Pour tester si deux obets sont à la même distance d'un autre, la fonction :command:`ST_DWithin` fournit une test tirant proffit des indexes. Cela est trÚs utile pour répondre au questions du genre : "Combien d'arbre se situe 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 For testing whether two objects are within a distance of one another, the :command:`ST_DWithin` function provides an index-accelerated true/false test. This is useful for questions like "how many trees are within a 500 meter buffer of the road?". You don't have to calculate an actual buffer, you just have to test the distance relationship. 139 137 140 138 .. figure:: ./spatial_relationships/st_dwithin.png 141 139 :align: center 142 140 143 En utilisant de nouveau notre station de métros Broad Street, nous pouvons trouver les rues voisines (à 10 mÚtres de) de la station:141 Using our Broad Street subway station again, we can find the streets nearby (within 10 meters of) the subway stop: 144 142 145 143 .. code-block:: sql … … 161 159 Nassau St 162 160 163 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 And we can verify the answer on a map. The Broad St station is actually at the intersection of Wall, Broad and Nassau Streets. 164 162 165 163 .. image:: ./spatial_relationships/broad_st.jpg 166 164 167 Liste des fonctions 168 ------------- ------165 Function List 166 ------------- 169 167 170 `ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_ : retourne TRUE si aucun des points de B n'est à l'extérieur de A, et au moins un point de l'intérieur de B est à l'intérieur deA.168 `ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_: Returns true if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A. 171 169 172 `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.170 `ST_Crosses(geometry A, geometry B) <http://postgis.org/docs/ST_Crosses.html>`_: Returns TRUE if the supplied geometries have some, but not all, interior points in common. 173 171 174 `ST_Disjoint(geometry A , geometry B) <http://postgis.org/docs/ST_Disjoint.html>`_ : retourne TRUE si les gémétries nes s'intersectent pas - elles n'ont aucun point en commun.172 `ST_Disjoint(geometry A , geometry B) <http://postgis.org/docs/ST_Disjoint.html>`_: Returns TRUE if the Geometries do not "spatially intersect" - if they do not share any space together. 175 173 176 `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>`_: Returns the 2-dimensional cartesian minimum distance (based on spatial ref) between two geometries in projected units. 177 175 178 `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>`_: Returns true if the geometries are within the specified distance (radius) of one another. 179 177 180 `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 prit en compte.178 `ST_Equals(geometry A, geometry B) <http://postgis.org/docs/ST_Equals.html>`_: Returns true if the given geometries represent the same geometry. Directionality is ignored. 181 179 182 `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>`_: Returns TRUE if the Geometries/Geography "spatially intersect" - (share any portion of space) and FALSE if they don't (they are Disjoint). 183 181 184 `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 contenu l'une dans l'autre.182 `ST_Overlaps(geometry A, geometry B) <http://postgis.org/docs/ST_Overlaps.html>`_: Returns TRUE if the Geometries share space, are of the same dimension, but are not completely contained by each other. 185 183 186 `ST_Touches(geometry A, geometry B) <http://postgis.org/docs/ST_Touches.html>`_ : retourne TRUE si les géométries ont au moins un point en commun, mais leur intérieurs ne s'intersectent pas.184 `ST_Touches(geometry A, geometry B) <http://postgis.org/docs/ST_Touches.html>`_: Returns TRUE if the geometries have at least one point in common, but their interiors do not intersect. 187 185 188 `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 deB186 `ST_Within(geometry A , geometry B) <http://postgis.org/docs/ST_Within.html>`_: Returns true if the geometry A is completely inside geometry B 189 187 190 188 -
/trunk/workshop-foss4g/spatial_relationships_exercises.rst
r30 r20 1 1 .. _spatial_relationships_exercises: 2 2 3 Partie 11 : exercises sur les relations spatiales3 Section 11: Spatial Relationships Exercises 4 4 =========================================== 5 5 6 Voici un rappel des fonctions que nous avons vu dans les parties précédentes. Elles seront utiles pour les exercices!6 Here's a reminder of the functions we saw in the last section. They should be useful for the exercises! 7 7 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_Contains(geometry A, geometry B)` ret ourne vrai si la géométrie A contient la géométrieB11 * :command:`ST_Crosses(geometry A, geometry B)` ret ourne vrai si la géométrie A croise la géométrieB12 * :command:`ST_Disjoint(geometry A , geometry B)` ret ourne vrai si les géométrie ne s'intersectent pas13 * :command:`ST_Distance(geometry A, geometry B)` ret ourne la distance minimum entre deux géométries14 * :command:`ST_DWithin(geometry A, geometry B, radius)` ret ourne vrai si la A est distante d'au plus radius deB15 * :command:`ST_Equals(geometry A, geometry B)` ret ourne vrai si A est la même géométrie queB16 * :command:`ST_Intersects(geometry A, geometry B)` ret ourne vrai si A intersecteB17 * :command:`ST_Overlaps(geometry A, geometry B)` ret ourne 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)` ret ourne vrai si le contour extérieur de A toucheB19 * :command:`ST_Within(geometry A, geometry B)` ret ourne vrai si A est hors deB8 * :command:`sum(expression)` aggregate to return a sum for a set of records 9 * :command:`count(expression)` aggregate to return the size of a set of records 10 * :command:`ST_Contains(geometry A, geometry B)` returns true if geometry A contains geometry B 11 * :command:`ST_Crosses(geometry A, geometry B)` returns true if geometry A crosses geometry B 12 * :command:`ST_Disjoint(geometry A , geometry B)` returns true if the geometries do not "spatially intersect" 13 * :command:`ST_Distance(geometry A, geometry B)` returns the minimum distance between geometry A and geometry B 14 * :command:`ST_DWithin(geometry A, geometry B, radius)` returns true if geometry A is radius distance or less from geometry B 15 * :command:`ST_Equals(geometry A, geometry B)` returns true if geometry A is the same as geometry B 16 * :command:`ST_Intersects(geometry A, geometry B)` returns true if geometry A intersects geometry B 17 * :command:`ST_Overlaps(geometry A, geometry B)` returns true if geometry A and geometry B share space, but are not completely contained by each other. 18 * :command:`ST_Touches(geometry A, geometry B)` returns true if the boundary of geometry A touches geometry B 19 * :command:`ST_Within(geometry A, geometry B)` returns true if geometry A is within geometry B 20 20 21 Souvenez-vous les tables à notre disposition:21 Also remember the tables we have available: 22 22 23 23 * ``nyc_census_blocks`` … … 37 37 * name, boroname, the_geom 38 38 39 Exerci ces39 Exercises 40 40 --------- 41 41 42 * **" Quel est la valeur géométrique de la rue nommée 'Atlantic Commons'?"**42 * **"What is the geometry value for the street named 'Atlantic Commons'?"** 43 43 44 44 .. code-block:: sql … … 52 52 01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514170E30E0ADFE82141CB2D3EFFA52E5141 53 53 54 * **" Quel sont les quartiers et villes sont dans Atlantic Commons?"**54 * **"What neighborhood and borough is Atlantic Commons in?"** 55 55 56 56 .. code-block:: sql … … 70 70 71 71 72 * **" Quelles rues touchent Atlantic Commons?"**72 * **"What streets does Atlantic Commons touch?"** 73 73 74 74 .. code-block:: sql … … 91 91 92 92 93 * **"Approximat ivement combien de personnes vivent dans (ou à un dans une zone de 50 meters autour) Atlantic Commons?"**93 * **"Approximately how many people live on (within 50 meters of) Atlantic Commons?"** 94 94 95 95 .. code-block:: sql -
/trunk/workshop-foss4g/geometries_exercises.rst
r30 r20 1 1 .. _geometries_exercises: 2 2 3 Partie 9 : exercices sur les géométries4 ============================= =========5 6 Voici un petit rappel de toute les fonction que nous avons jusqu'à présent. Elles devraient être utiles pour les exercices!7 8 * :command:`sum(expression)` ag régation retournant la somme d'un ensemble9 * :command:`count(expression)` ag régation retournant le nombre d'éléments d'un ensemble10 * :command:`ST_GeometryType(geometry)` ret ourne le type de la géométrie11 * :command:`ST_NDims(geometry)` ret ourne le nombre de dimensions12 * :command:`ST_SRID(geometry)` ret ourne l'identifiant du systÚme de références spatiales13 * :command:`ST_X(point)` ret ourne la coordonnée X14 * :command:`ST_Y(point)` ret ourne la coordonnée Y15 * :command:`ST_Length(linestring)` ret ourne la longueur d'une ligne16 * :command:`ST_StartPoint(geometry)` ret ourne le premier point d'une ligne17 * :command:`ST_EndPoint(geometry)` ret ourne le dernier point d'une ligne18 * :command:`ST_NPoints(geometry)` ret ourne le nombre point d'une ligne19 * :command:`ST_Area(geometry)` ret ourne l'aire d'un polygone20 * :command:`ST_NRings(geometry)` ret ourne le nombre de contours (1 ou plus si il y a des trous)21 * :command:`ST_ExteriorRing(polygon)` ret ourne le contour exterieur (ligne) d'un polygon22 * :command:`ST_InteriorRingN(polygon, integer)` ret ourne le contour intérieur (ligne) d'un polygone23 * :command:`ST_Perimeter(geometry)` ret ourne la longueur de tout les contours24 * :command:`ST_NumGeometries(multi/geomcollection)` ret ourne le nombre de composantes dans une collection25 * :command:`ST_GeometryN(geometry, integer)` ret ourne la niÚme entité de lacollection26 * :command:`ST_GeomFromText(text)` ret ourne``geometry``27 * :command:`ST_AsText(geometry)` ret ourneWKT ``text``28 * :command:`ST_AsEWKT(geometry)` ret ourneEWKT ``text``29 * :command:`ST_GeomFromWKB(bytea)` ret ourne``geometry``30 * :command:`ST_AsBinary(geometry)` ret ourneWKB ``bytea``31 * :command:`ST_AsEWKB(geometry)` ret ourneEWKB ``bytea``32 * :command:`ST_GeomFromGML(text)` ret ourne``geometry``33 * :command:`ST_AsGML(geometry)` ret ourneGML ``text``34 * :command:`ST_GeomFromKML(text)` ret ourne``geometry``35 * :command:`ST_AsKML(geometry)` ret ourneKML ``text``36 * :command:`ST_AsGeoJSON(geometry)` ret ourneJSON ``text``37 * :command:`ST_AsSVG(geometry)` ret ourneSVG ``text``38 39 Souvenez-vous aussi des tables qui sont disponibles:3 Section 9: Geometry Exercises 4 ============================= 5 6 Here's a reminder of all the functions we have seen so far. They should be useful for the exercises! 7 8 * :command:`sum(expression)` aggregate to return a sum for a set of records 9 * :command:`count(expression)` aggregate to return the size of a set of records 10 * :command:`ST_GeometryType(geometry)` returns the type of the geometry 11 * :command:`ST_NDims(geometry)` returns the number of dimensions of the geometry 12 * :command:`ST_SRID(geometry)` returns the spatial reference identifier number of the geometry 13 * :command:`ST_X(point)` returns the X ordinate 14 * :command:`ST_Y(point)` returns the Y ordinate 15 * :command:`ST_Length(linestring)` returns the length of the linestring 16 * :command:`ST_StartPoint(geometry)` returns the first coordinate as a point 17 * :command:`ST_EndPoint(geometry)` returns the last coordinate as a point 18 * :command:`ST_NPoints(geometry)` returns the number of coordinates in the linestring 19 * :command:`ST_Area(geometry)` returns the area of the polygons 20 * :command:`ST_NRings(geometry)` returns the number of rings (usually 1, more if there are holes) 21 * :command:`ST_ExteriorRing(polygon)` returns the outer ring as a linestring 22 * :command:`ST_InteriorRingN(polygon, integer)` returns a specified interior ring as a linestring 23 * :command:`ST_Perimeter(geometry)` returns the length of all the rings 24 * :command:`ST_NumGeometries(multi/geomcollection)` returns the number of parts in the collection 25 * :command:`ST_GeometryN(geometry, integer)` returns the specified part of the collection 26 * :command:`ST_GeomFromText(text)` returns ``geometry`` 27 * :command:`ST_AsText(geometry)` returns WKT ``text`` 28 * :command:`ST_AsEWKT(geometry)` returns EWKT ``text`` 29 * :command:`ST_GeomFromWKB(bytea)` returns ``geometry`` 30 * :command:`ST_AsBinary(geometry)` returns WKB ``bytea`` 31 * :command:`ST_AsEWKB(geometry)` returns EWKB ``bytea`` 32 * :command:`ST_GeomFromGML(text)` returns ``geometry`` 33 * :command:`ST_AsGML(geometry)` returns GML ``text`` 34 * :command:`ST_GeomFromKML(text)` returns ``geometry`` 35 * :command:`ST_AsKML(geometry)` returns KML ``text`` 36 * :command:`ST_AsGeoJSON(geometry)` returns JSON ``text`` 37 * :command:`ST_AsSVG(geometry)` returns SVG ``text`` 38 39 Also remember the tables we have available: 40 40 41 41 * ``nyc_census_blocks`` … … 72 72 .. note:: 73 73 74 L'aire est données en metres carrés. Pour obtenir l'aire en hectare, divisez par 10000. Pour obrenir l'aire en acres, divisez par4047.75 76 * **" Quelle est l'aire de Manhattan in acres ?"** (Astuce: ``nyc_census_blocks`` et ``nyc_neighborhoods`` on toutes deux le champ ``boroname``.)74 The area is given in square meters. To get an area in hectares, divide by 10000. To get an area in acres, divide by 4047. 75 76 * **"What is the area of Manhattan in acres?"** (Hint: both ``nyc_census_blocks`` and ``nyc_neighborhoods`` have a ``boroname`` in them.) 77 77 78 78 .. code-block:: sql … … 99 99 100 100 101 * **" Combien de bloques de la ville de New York ont des trous?"**101 * **"How many census blocks in New York City have a hole in them?"** 102 102 103 103 .. code-block:: sql … … 111 111 66 112 112 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.)113 * **"What is the total length of streets (in kilometers) in New York City?"** (Hint: The units of measurement of the spatial data are meters, there are 1000 meters in a kilometer.) 114 114 115 115 .. code-block:: sql … … 122 122 10418.9047172 123 123 124 * **" Quelle est la longueur de 'Columbus Cir' (Columbus Circle)?**124 * **"How long is 'Columbus Cir' (Columbus Circle)?** 125 125 126 126 .. code-block:: sql … … 134 134 308.34199 135 135 136 * **" Quelle est le contour de 'West Village' au format JSON?"**136 * **"What is the JSON representation of the boundary of the 'West Village'?"** 137 137 138 138 .. code-block:: sql … … 149 149 [583263.2776595836,4509242.6260239873]]]]} 150 150 151 La géométrie de type "MultiPolygon", interressant!151 The geometry type is "MultiPolygon", interesting! 152 152 153 153 154 * **" Combien de polygones sont dans le multi-polygone 'West Village'?"**154 * **"How many polygons are in the 'West Village' multipolygon?"** 155 155 156 156 .. code-block:: sql … … 166 166 .. note:: 167 167 168 I l 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 stoquer des géométries simples et multiples sans mélanger lestypes.169 170 171 * **" Quel est la longueur des rues de la ville de New York, suivant leur type?"**168 It is not uncommon to find single-element MultiPolygons in spatial tables. Using MultiPolygons allows a table with only one geometry type to store both single- and multi-geometries without using mixed types. 169 170 171 * **"What is the length of streets in New York City, summarized by type?"** 172 172 173 173 .. code-block:: sql … … 207 207 .. note:: 208 208 209 La clause ``ORDER BY length DESC`` ordonne le résultats par la valeurs des longueur dans l'ordre décroissant. Le résultat avec la plus grande valeur se retrouve au début la liste de résultats.209 The ``ORDER BY length DESC`` clause sorts the result by length in descending order. The result is that most prevalent types are first in the list. 210 210 211 211 -
/trunk/workshop-foss4g/joins.rst
r30 r20 1 1 .. _joins: 2 2 3 Partie 12 : les jointures spatiales4 ========================= ==========5 6 Les jointures saptiales est la cerise sur le gâteau des base de données spatiales. Elles vous pemettent de conbiner les informations de plusieures tables en utilisant une relation spatiale comme clause de jointure. Les plupart des "analyses SIG standards" peuvent être exprimées à l'aide de jointure spatiales.7 8 Dans la partie prcé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 avon utilisé ce résultat dans nos autres requêtes pour répondre aux questions comme "dans quel quartier se situ la station 'Broad St'?"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 quartie la contenant : 3 Section 12: Spatial Joins 4 ========================= 5 6 Spatial joins are the bread-and-butter of spatial databases. They allow you to combine information from different tables by using spatial relationships as the join key. Much of what we think of as "standard GIS analysis" can be expressed as spatial joins. 7 8 In the previous section, we explored spatial relationships using a two-step process: first we extracted a subway station point for 'Broad St'; then, we used that point to ask further questions such as "what neighborhood is the 'Broad St' station in?" 9 10 Using a spatial join, we can answer the question in one step, retrieving information about the subway station and the neighborhood that contains it: 11 11 12 12 .. code-block:: sql … … 27 27 Broad St | Financial District | Manhattan 28 28 29 Nous avons pu regrouper chaque station de métros avec le quartier duquel elle fait partie, mais dans ce cas nous n'en voulions qu'une. Chaque fonctionn qui envoit un résultat du type vrai/faux peut être utilisée pour joindre spatialement deux tables, mais la plupart du temps on utilise : :command:`ST_Intersects`, :command:`ST_Contains`, et:command:`ST_DWithin`.30 31 Join ture et regroupement32 ------------------ ------33 34 La combinaison de ``JOIN`` avec ``GROUP BY`` fournit le type d'analyse qui est courramment utilisé dans les systÚmes SIG.35 36 Par exemple : **Quelle est la population et la répartition raciale du quartier de Manhattan ?** Ici nous avons une question qui combine les informations relatives à la population recenssée et les contours des quartier, or nous ne voulons qu'un seul quartier, celui deManhattan.29 We could have joined every subway station to its containing neighborhood, but in this case we wanted information about just one. Any function that provides a true/false relationship between two tables can be used to drive a spatial join, but the most commonly used ones are: :command:`ST_Intersects`, :command:`ST_Contains`, and :command:`ST_DWithin`. 30 31 Join and Summarize 32 ------------------ 33 34 The combination of a ``JOIN`` with a ``GROUP BY`` provides the kind of analysis that is usually done in a GIS system. 35 36 For example: **"What is the population and racial make-up of the neighborhoods of Manhattan?"** Here we have a question that combines information from about population from the census with the boundaries of neighborhoods, with a restriction to just one borough of Manhattan. 37 37 38 38 .. code-block:: sql … … 84 84 85 85 86 Que ce passe-t-il ici ? Voici ce qui se passe (l'ordre d'évaluation est optimisé par la base de données):87 88 #. La clause ``JOIN`` crée une table cirtuelle qui contient les colonnes à la fois des quartier et des recensements (tables neighborhoods et census).89 #. La claue ``WHERE`` filtre la table virtuelle pour ne conserver que la ligne correspondant ÃManhattan.90 #. Les lignes restantes sont regroupées par le nom du quartier et sont utilisées par la fonction d'agrégation : :command:`Sum()` pour réaliser la somme des valeurs de la populations.91 #. A prÚs un peu d'arythmétiques et de formatage (ex: ``GROUP BY``, ``ORDER BY``)) ssur le nombres finaux, notre requête calcul les porcentages.86 What's going on here? Notionally (the actual evaluation order is optimized under the covers by the database) this is what happens: 87 88 #. The ``JOIN`` clause creates a virtual table that includes columns from both the neighborhoods and census tables. 89 #. The ``WHERE`` clause filters our virtual table to just rows in Manhattan. 90 #. The remaining rows are grouped by the neighborhood name and fed through the aggregation function to :command:`Sum()` the population values. 91 #. After a little arithmetic and formatting (e.g., ``GROUP BY``, ``ORDER BY``) on the final numbers, our query spits out the percentages. 92 92 93 93 .. note:: 94 94 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 97 Nous pouvons aussi utiliser le test de la distance dans notre clef de jointure, pour créer une regroupement de "tout les éléments dans un certain rayon". Essayons de regarder la géographie raciale de New York en utilisant les requêtes de distance.98 99 PremiÚrement, essayons d'obtenir la répartition raciale de la ville.95 The ``JOIN`` clause combines two ``FROM`` items. By default, we are using an ``INNER JOIN``, but there are four other types of joins. For further information see the `join_type <http://www.postgresql.org/docs/8.1/interactive/sql-select.html>`_ definition in the PostgreSQL documentation. 96 97 We can also use distance tests as a join key, to create summarized "all items within a radius" queries. Let's explore the racial geography of New York using distance queries. 98 99 First, let's get the baseline racial make-up of the city. 100 100 101 101 .. code-block:: sql … … 114 114 115 115 116 Donc, 8M de personnes de New York, environ 44% sont "blancs" et "26% sont "noirs". 117 118 Duke Ellington chantait que "You / must take the A-train / To / go to Sugar Hill way up in Harlem." Comme nous l'avons vu précédemment, Harlem est de trÚs loin le quartier ou se trouve la plus grande concentration d'africains-américains de Manhattan (80.5%). Est-il toujours vrai qu'il faut prendre le train A dont Duke parlait dans sa chanson?119 120 PremiÚrement, le contenu du champ ``routes`` de la table ``nyc_subway_stations`` va nous servir à récupérer le train A. Les valeurs de ce champs sont un peu complexes.116 So, of the 8M people in New York, about 44% are "white" and 26% are "black". 117 118 Duke Ellington once sang that "You / must take the A-train / To / go to Sugar Hill way up in Harlem." As we saw earlier, Harlem has far and away the highest African-American population in Manhattan (80.5%). Is the same true of Duke's A-train? 119 120 First, note that the contents of the ``nyc_subway_stations`` table ``routes`` field is what we are interested in to find the A-train. The values in there are a little complex. 121 121 122 122 .. code-block:: sql … … 136 136 .. note:: 137 137 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 de73.138 The ``DISTINCT`` keyword eliminates duplicate rows from the result. Without the ``DISTINCT`` keyword, the query above identifies 491 results instead of 73. 139 139 140 Donc pour trouver le train A, nous allons demander toute les lignes ayant pour ``routes`` la valeur 'A'. Nous pouvons faire cela de différentes maniÚres, mais nous utiliserons aujourd'hui le fait que la fonction :command:`strpos(routes,'A')` retourne un entier différent de 0 si la lettre 'A' se trouve dans la valeur du champs route.140 So to find the A-train, we will want any row in ``routes`` that has an 'A' in it. We can do this a number of ways, but today we will use the fact that :command:`strpos(routes,'A')` will return a non-zero number if 'A' is in the routes field. 141 141 142 142 .. code-block:: sql … … 158 158 A,C,E 159 159 160 Essayons de regrouper la répartition racialedans un rayon de 200 mÚtres de la ligne du train A.160 Let's summarize the racial make-up of within 200 meters of the A-train line. 161 161 162 162 .. code-block:: sql … … 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 radicallement différente de la répartition générale de la ville de New York. 180 181 Jointres avancées 182 ------------- ----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 plusieures lignes de métros à la fois. Pour faire ceci, nous créerons une table qui permettra d'énumérer toutes les lignes que nous voulons regrouper.179 So the racial make-up along the A-train isn't radically different from the make-up of New York City as a whole. 180 181 Advanced Join 182 ------------- 183 184 In the last section we saw that the A-train didn't serve a population that differed much from the racial make-up of the rest of the city. Are there any trains that have a non-average racial make-up? 185 186 To answer that question, we'll add another join to our query, so that we can simultaneously calculate the make-up of many subway lines at once. To do that, we'll need to create a new table that enumerates all the lines we want to summarize. 187 187 188 188 .. code-block:: sql … … 195 195 ('7'); 196 196 197 Maintenant nous pouvons joindre les tables des lignes de métros à notre requête précédente.197 Now we can join the table of subway lines onto our original query. 198 198 199 199 .. code-block:: sql … … 239 239 240 240 241 Comme précédemment, les jointure créent une table virtuelle de toutes les combinaisons possible disponibles à l'aide des contraintes de type ``JOIN ON`, ces lignes sont ensuite utilisées dans le regroupement ``GROUP``. La magie spatiale tiend dans l'utilisation de la fonction ``ST_DWithin`` qui s'assure que les bloques sont suffisamment proches des lignes de métros inclues dans le calcul.242 243 Liste de fonctions 244 ------------- -----245 246 `ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_: retourne TRUE si et seulement si aucun points de B est à l'extérieur de A, et si au moins un point à l'intérieur de B est à l'intérieur deA.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 portiond de l'espace) et FALSE sinon (elles sont dijointes).251 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.253 254 `strpos( chaîne, sous-chaîne) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: fonction de chaîne de caractÚres de PostgreSQL qui retourne la position de la sous-chaine.255 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.241 As before, the joins create a virtual table of all the possible combinations available within the constraints of the ``JOIN ON`` restrictions, and those rows are then fed into a ``GROUP`` summary. The spatial magic is in the ``ST_DWithin`` function, that ensures only census blocks close to the appropriate subway stations are included in the calculation. 242 243 Function List 244 ------------- 245 246 `ST_Contains(geometry A, geometry B) <http://postgis.org/docs/ST_Contains.html>`_: Returns true if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A. 247 248 `ST_DWithin(geometry A, geometry B, radius) <http://postgis.org/docs/ST_DWithin.html>`_: Returns true if the geometries are within the specified distance of one another. 249 250 `ST_Intersects(geometry A, geometry B) <http://postgis.org/docs/ST_Intersects.html>`_: Returns TRUE if the Geometries/Geography "spatially intersect" - (share any portion of space) and FALSE if they don't (they are Disjoint). 251 252 `round(v numeric, s integer) <http://www.postgresql.org/docs/7.4/interactive/functions-math.html>`_: PostgreSQL math function that rounds to s decimal places 253 254 `strpos(string, substring) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: PostgreSQL string function that returns an integer location of a specified substring. 255 256 `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. 257 257 258 258 .. rubric:: Footnotes -
/trunk/workshop-foss4g/joins_exercises.rst
r30 r20 1 1 .. _joins_exercises: 2 2 3 Partie 13 : exercice jointures spatial 4 =================================== ====3 Section 13: Spatial Joins Exercises 4 =================================== 5 5 6 Voici un petit rappel de certaines des fonctions vues précédemment. Astuce: elles pourraient être utiles pour les exercices!6 Here's a reminder of some of the functions we have seen. Hint: they should be useful for the exercises! 7 7 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 8 * :command:`sum(expression)`: aggregate to return a sum for a set of records 9 * :command:`count(expression)`: aggregate to return the size of a set of records 10 10 * :command:`ST_Area(geometry)` returns the area of the polygons 11 11 * :command:`ST_AsText(geometry)` returns WKT ``text`` 12 * :command:`ST_Contains(geometry A, geometry B)` ret ourne vrai si la géométrie A contient la géométrieB13 * :command:`ST_Distance(geometry A, geometry B)` ret ourne la distance minimum entre deux géométries14 * :command:`ST_DWithin(geometry A, geometry B, radius)` ret ourne vrai si la A est distante d'au plus radius deB12 * :command:`ST_Contains(geometry A, geometry B)` returns the true if geometry A contains geometry B 13 * :command:`ST_Distance(geometry A, geometry B)` returns the minimum distance between geometry A and geometry B 14 * :command:`ST_DWithin(geometry A, geometry B, radius)` returns the true if geometry A is radius distance or less from geometry B 15 15 * :command:`ST_GeomFromText(text)` returns ``geometry`` 16 16 * :command:`ST_Intersects(geometry A, geometry B)` returns the true if geometry A intersects geometry B 17 17 * :command:`ST_Length(linestring)` returns the length of the linestring 18 * :command:`ST_Touches(geometry A, geometry B)` ret ourne vrai si le contour extérieur de A toucheB19 * :command:`ST_Within(geometry A, geometry B)` ret ourne vrai si A est hors deB20 21 Souvenez-vous des tables à notre disposition : 18 * :command:`ST_Touches(geometry A, geometry B)` returns the true if the boundary of geometry A touches geometry B 19 * :command:`ST_Within(geometry A, geometry B)` returns the true if geometry A is within geometry B 20 21 Also remember the tables we have available: 22 22 23 23 * ``nyc_census_blocks`` … … 37 37 * name, boroname, the_geom 38 38 39 Exerci ces39 Exercises 40 40 --------- 41 41 42 * **" Quelle station de métros se situe dans le quartier 'Little Italy' ? Quelle est l'itinéraire de métros à emprunter?"**42 * **"What subway station is in 'Little Italy'? What subway route is it on?"** 43 43 44 44 .. code-block:: sql … … 56 56 Spring St | 6 57 57 58 * **" Quels sont les quartiers desservis pas le train numéro 6 ?"** (Astuce: la colonnes ``routes`` de la table ``nyc_subway_stations`` on les valeurs suivante 'B,D,6,V' et'C,6')58 * **"What are all the neighborhoods served by the 6-train?"** (Hint: The ``routes`` column in the ``nyc_subway_stations`` table has values like 'B,D,6,V' and 'C,6') 59 59 60 60 .. code-block:: sql … … 88 88 .. note:: 89 89 90 Nous avons utilisé le mot clef ``DISTINCT`` pour supprimer les répétitions dans notre ensemble derésultats où il y avait plus d'une seule station de métros dans le quartier. 91 * **"AprÚs le 11 septembre, le quartier de 'Battery Park' était interdit d'accÚs pendant plusieurs jours. Combien de personnes ont dût être évacués ?"** 90 We used the ``DISTINCT`` keyword to remove duplicate values from our result set where there were more than one subway station in a neighborhood. 91 92 * **"After 9/11, the 'Battery Park' neighborhood was off limits for several days. How many people had to be evacuated?"** 92 93 93 94 .. code-block:: sql … … 103 104 9928 104 105 105 * **" Quelle est la densité de population (personne / km^2) des quartier de 'Upper West Side' et de 'Upper East Side' ?"** (Astuce: il y a 1000000 m^2 dans unkm^2.)106 * **"What are the population density (people / km^2) of the 'Upper West Side' and 'Upper East Side'?"** (Hint: There are 1000000 m^2 in one km^2.) 106 107 107 108 .. code-block:: sql
Note: See TracChangeset
for help on using the changeset viewer.