Changeset 54
- Timestamp:
- 02/10/2011 16:51:08 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/workshop-foss4g/joins_advanced.rst
r50 r54 1 1 .. _joins_advanced: 2 2 3 Section 19: Plus de jointures spatiales3 Partie 19 : Plus de jointures spatiales 4 4 ======================================= 5 5 6 In the last section we saw the :command:`ST_Centroid(geometry)` and :command:`ST_Union([geometry])` functions, and some simple examples. In this section we will do some more elaborate things with them.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. 7 7 8 8 .. _creatingtractstable: 9 9 10 Cr eating a Census Tracts Table11 ------------------------------ 12 13 In the workshop ``\data\`` directory, is a file that includes attribute data, but no geometry, ``nyc_census_sociodata.sql``. The table includes interesting socioeconomic data about New York: commute times, incomes, and education attainment. There is just one problem. The data are summarized by "census tract" and we have no census tract spatial data! 14 15 In this section we will 16 17 * Load the ``nyc_census_sociodata.sql`` table18 * Cr eate a spatial table for census tracts19 * Join the attribute data to the spatial data20 * Carry out some analysis using our new data21 22 Loadingnyc_census_sociodata.sql23 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 25 #. O pen the SQL query window inPgAdmin26 #. Select **File->Open** from the menu and browse to the ``nyc_census_sociodata.sql`` file27 #. Press the "Run Query" button28 #. If you press the "Refresh" button in PgAdmin, the list of tables should now include at ``nyc_census_sociodata`` table29 30 Cr eating a Census Tracts Table31 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 33 As we saw in the previous section, we can build up higher level geometries from the census block by summarizing on substrings of the ``blkid`` key. In order to get census tracts, we need to summarize grouping on the first 11 characters of the ``blkid``. 10 Création de la table de traçage des recensements 11 ------------------------------------------------ 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 interressantes à 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 ! 14 15 Dans cette partie nous allons 16 17 * Charger la table ``nyc_census_sociodata.sql`` 18 * Créer une table spatiale pour les traces de recensement 19 * Joindre les données attributaires à nos données spatiales 20 * Réaliser certaines analises sur nos nouvelles données 21 22 Chargement du fichier nyc_census_sociodata.sql 23 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 25 #. Ouvrez la fenêtre de requêtage SQL depuis PgAdmin 26 #. Selectionnez **File->Open** depuis le menu et naviguez jusqu'au fichier ``nyc_census_sociodata.sql`` 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 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 34 35 35 :: … … 43 43 000 = Census Block 44 44 45 Cr eate the new table using the :command:`ST_Union` aggregate:45 Création de la nouvelle table en utilisant la fonction d'agrégation :command:`ST_Union` : 46 46 47 47 .. code-block:: sql 48 48 49 -- Make the tractstable49 -- Création de la table 50 50 CREATE TABLE nyc_census_tract_geoms AS 51 51 SELECT … … 55 55 GROUP BY tractid; 56 56 57 -- Index thetractid57 -- Indexation du champ tractid 58 58 CREATE INDEX nyc_census_tract_geoms_tractid_idx ON nyc_census_tract_geoms (tractid); 59 59 60 -- Update the geometry_columns table60 -- Mise à jour de la table geometry_columns 61 61 SELECT Populate_Geometry_Columns(); 62 62 63 Join the Attributes to the Spatial Data 64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 66 Join the table of tract geometries to the table of tract attributes with a standard attribute join 67 68 .. code-block:: sql 69 70 -- Make the tractstable63 Regrouper les données attributaires et spatiales 64 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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 70 -- Création de la table 71 71 CREATE TABLE nyc_census_tracts AS 72 72 SELECT … … 77 77 ON g.tractid = a.tractid; 78 78 79 -- Index the geometries79 -- Indexation des géométries 80 80 CREATE INDEX nyc_census_tract_gidx ON nyc_census_tracts USING GIST (the_geom); 81 81 82 -- Update the geometry_columns table82 -- Mise à jour de la table geometry_columns 83 83 SELECT Populate_Geometry_Columns(); 84 84 85 85 .. _interestingquestion: 86 86 87 Answer an Interesting Question 88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 87 Répondre à une question interressante 88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 89 89 90 Answer an interesting question! "List top 10 New York neighborhoods ordered by the proportion of people who have graduate degrees." 90 Répondre à une question interressante ! "Lister les 10 meilleurs quartiers ordonnées par la proportion de personne ayant acquis un diplome". 91 91 92 92 .. code-block:: sql … … 103 103 LIMIT 10; 104 104 105 We sum up the statistics we are interested, then divide them together at the end. In order to avoid divide-by-zero errors, we don't bother bringing in tracts that have a population count of zero.105 Nous sommons les statistiques qui nous interressent, 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 106 107 107 :: … … 123 123 .. _polypolyjoins: 124 124 125 Polygon /Polygon Joins126 --------------------- 127 128 In our interesting query (in :ref:`interestingquestion`) we used the :command:`ST_Intersects(geometry_a, geometry_b)` function to determine which census tract polygons to include in each neighborhood summary. Which leads to the question: what if a tract falls on the border between two neighborhoods? It will intersect both, and so will be included in the summary statistics for **both**. 125 Polygones/Jointures de polygones 126 --------------------------------- 127 128 Dans notre requête interressante (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. 129 129 130 130 .. image:: ./screenshots/centroid_neighborhood.png 131 131 132 To avoid this kind of double counting there are two methods:133 134 * The simple method is to ensure that each tract only falls in **one** summary area (using:command:`ST_Centroid(geometry)`)135 * The complex method is to divide crossing tracts at the borders (using:command:`ST_Intersection(geometry,geometry)`)136 137 Here is an example of using the simple method to avoid double counting in our graduate education query:132 Pour éviter ce cas de double comptage il existe trois méthodes : 133 134 * La méthode simple consiste a s'assurer que chaque entité ne se retrouve que dans **un** seul groupe géograhique (en utilisant :command:`ST_Centroid(geometry)`) 135 * La méthode complexe consiste à disviser les parties qui se croisent en utilisant les bordures (en utilisant :command:`ST_Intersection(geometry,geometry)`) 136 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 … … 150 150 LIMIT 10; 151 151 152 Note that the query takes longer to run now, because the :command:`ST_Centroid` function has to be run on every census tract.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 :: … … 167 167 28.4 | Cobble Hill | Brooklyn 168 168 169 Avoiding double counting changes the results! 169 Ãviter le double comptage change le résultat ! 170 170 171 171 172 172 .. _largeradiusjoins: 173 173 174 Large Radius Distance Joins 175 --------------------------- 176 177 A query that is fun to ask is "How do the commute times of people near (within 500 meters) subway stations differ from those of people far away from subway stations?"178 179 However, the question runs into some problems of double counting: many people will be within 500 meters of multiple subway stations. Compare the population of New York:174 Jointures utilisant un large rayon de distance 175 ---------------------------------------------- 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 vive loin ? " 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 : 180 180 181 181 .. code-block:: sql … … 188 188 8008278 189 189 190 With the population of the people in New York within 500 meters of a subway station:190 Avec la population des gens de New York dans un rayon de 500 metres d'une station de métros : 191 191 192 192 .. code-block:: sql … … 201 201 10556898 202 202 203 There's more people close to the subway than there are people! Clearly, our simple SQL is making a big double-counting error. You can see the problem looking at the picture of the buffered subways.203 Il y a plus de personnes proches du métro qu'il y a de peronnes ! 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 The solution is to ensure that we have only distinct census blocks before passing them into the summarization portion of the query. We can do that by breaking our query up into a subquery that finds the distinct blocks, wrapped in a summarization query that returns our answer:207 La solution est de s'assurer que nous avons seulement des blocks 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 : 208 208 209 209 .. code-block:: sql … … 221 221 4953599 222 222 223 That's better! So a bit over half the population of New York is within 500m (about a 5-7 minute walk) of the subway.224 225 226 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
Note: See TracChangeset
for help on using the changeset viewer.