Index: trunk/workshop-foss4g/joins_advanced.rst
===================================================================
--- trunk/workshop-foss4g/joins_advanced.rst	(revision 81)
+++ trunk/workshop-foss4g/joins_advanced.rst	(revision 1)
@@ -1,41 +1,41 @@
 .. _joins_advanced:
 
-Partie 19 : Plus de jointures spatiales
-=======================================
-
-Dans la partie prÃ©cÃ©dente nous avons vu les fonctions :command:`ST_Centroid(geometry)` et :command:`ST_Union(geometry)` ainsi que quelques exemples simples. Dans cette partie nous rÃ©aliserons des choses plus Ã©laborÃ©es.
+Section 19: More Spatial Joins
+==============================
+
+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.
 
 .. _creatingtractstable:
 
-CrÃ©ation de la table de traÃ§age des recensements
-------------------------------------------------
-
-Dans le rÃ©pertoire ``\data\`` des travaux pratiques, il y a un fichier qui contient des donnÃ©es attributaires, mais pas de gÃ©omÃ©tries, ce fichier est nommÃ© ``nyc_census_sociodata.sql``. La table contient des donnÃ©es sociaux-Ã©conomiques intÃ©ressantes Ã  propos de New York : revenus financiers, Ã©ducation .... Il y a juste un problÃšme, les donnÃ©es sont rassemblÃ©es en "trace de recensement" et nous n'avons pas de donnÃ©es spatiales associÃ©es !
-
-Dans cette partie nous allons
-
- * Charger la table ``nyc_census_sociodata.sql``
- * CrÃ©er une table spatiale pour les traces de recensement
- * Joindre les donnÃ©es attributaires Ã  nos donnÃ©es spatiales
- * RÃ©aliser certaines analyses sur nos nouvelles donnÃ©es
-
-Chargement du fichier nyc_census_sociodata.sql
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- #. Ouvrez la fenÃªtre de requÃªtage SQL depuis PgAdmin
- #. SÃ©lectionnez **File->Open** depuis le menu et naviguez jusqu'au fichier ``nyc_census_sociodata.sql``
- #. Cliquez sur le bouton "Run Query"
- #. Si vous cliquez sur le bouton "Refresh" depuis PgAdmin, la liste des tables devrait contenir votre nouvelle table ``nyc_census_sociodata``
-
-CrÃ©ation de la table traces de recensement
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Comme nous l'avons fait dans la partie prÃ©cÃ©dente, nous pouvons construire des gÃ©omÃ©tries de niveau suppÃ©rieur en utilisant nos blocs de base en utilisant une partie de la clef ``blkid``. Afin de calculer les traces de recensement, nous avons besoin de regrouper les blocs en uitlisant les 11 premiers caractÃšres de la colonne ``blkid``.
-
+Creating a Census Tracts Table
+------------------------------
+
+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! 
+
+In this section we will
+
+ * Load the ``nyc_census_sociodata.sql`` table
+ * Create a spatial table for census tracts 
+ * Join the attribute data to the spatial data
+ * Carry out some analysis using our new data
+ 
+Loading nyc_census_sociodata.sql
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ #. Open the SQL query window in PgAdmin
+ #. Select **File->Open** from the menu and browse to the ``nyc_census_sociodata.sql`` file
+ #. Press the "Run Query" button
+ #. If you press the "Refresh" button in PgAdmin, the list of tables should now include at ``nyc_census_sociodata`` table
+ 
+Creating a Census Tracts Table
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 
+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``.
+ 
   ::
 
     360610001009000 = 36 061 00100 9000
 
-    36     = State of New York
+    36     = State of New York 
     061    = New York County (Manhattan)
     000100 = Census Tract
@@ -43,32 +43,32 @@
     000    = Census Block
 
-CrÃ©ation de la nouvelle table en utilisant la fonction d'agrÃ©gation :command:`ST_Union` :
-
-.. code-block:: sql
-
-   -- CrÃ©ation de la table
+Create the new table using the :command:`ST_Union` aggregate:
+ 
+.. code-block:: sql
+   
+   -- Make the tracts table
    CREATE TABLE nyc_census_tract_geoms AS
-   SELECT
-     ST_Union(the_geom) AS the_geom,
+   SELECT 
+     ST_Union(the_geom) AS the_geom, 
      SubStr(blkid,1,11) AS tractid
    FROM nyc_census_blocks
    GROUP BY tractid;
-
-   -- Indexation du champ tractid
+     
+   -- Index the tractid
    CREATE INDEX nyc_census_tract_geoms_tractid_idx ON nyc_census_tract_geoms (tractid);
-
-   -- Mise Ã  jour de la table geometry_columns
+     
+   -- Update the geometry_columns table
    SELECT Populate_Geometry_Columns();
 
-Regrouper les donnÃ©es attributaires et spatiales
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-L'objectif est ici de regrouper les donnÃ©es spatiales que nous avons crÃ©Ã© avec les donnÃ©es attributaires que nous avions chargÃ© initialement.
-
-.. code-block:: sql
-
-  -- CrÃ©ation de la table
+Join the Attributes to the Spatial Data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Join the table of tract geometries to the table of tract attributes with a standard attribute join
+  
+.. code-block:: sql
+  
+  -- Make the tracts table
   CREATE TABLE nyc_census_tracts AS
-  SELECT
+  SELECT 
     g.the_geom,
     a.*
@@ -76,26 +76,26 @@
   JOIN nyc_census_sociodata a
   ON g.tractid = a.tractid;
-
-  -- Indexation des gÃ©omÃ©tries
+    
+  -- Index the geometries
   CREATE INDEX nyc_census_tract_gidx ON nyc_census_tracts USING GIST (the_geom);
-
-  -- Mise Ã  jour de la table geometry_columns
+    
+  -- Update the geometry_columns table
   SELECT Populate_Geometry_Columns();
 
 .. _interestingquestion:
 
-RÃ©pondre Ã  une question intÃ©ressante
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-RÃ©pondre Ã  une question intÃ©ressante ! "Lister les 10 meilleurs quartiers ordonnÃ©s par la proportion de personnes ayant acquis un diplÃŽme".
-
-.. code-block:: sql
-
-  SELECT
-    Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct,
-    n.name, n.boroname
-  FROM nyc_neighborhoods n
-  JOIN nyc_census_tracts t
-  ON ST_Intersects(n.the_geom, t.the_geom)
+Answer an Interesting Question
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+     
+Answer an interesting question! "List top 10 New York neighborhoods ordered by the proportion of people who have graduate degrees."
+  
+.. code-block:: sql
+  
+  SELECT 
+    Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 
+    n.name, n.boroname 
+  FROM nyc_neighborhoods n 
+  JOIN nyc_census_tracts t 
+  ON ST_Intersects(n.the_geom, t.the_geom) 
   WHERE t.edu_total > 0
   GROUP BY n.name, n.boroname
@@ -103,9 +103,9 @@
   LIMIT 10;
 
-Nous sommons les statistiques qui nous intÃ©ressent, nous les divisons ensuite Ã  la fin. Afin d'Ã©viter l'erreur de non-division par zÃ©ro, nous ne prenons pas en compte les quartiers qui n'ont aucune personne ayant obtenu un diplÃŽme.
-
-::
-
-   graduate_pct |       name        | boroname
+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.
+
+::
+  
+   graduate_pct |       name        | boroname  
   --------------+-------------------+-----------
            40.4 | Carnegie Hill     | Manhattan
@@ -119,40 +119,40 @@
            29.8 | West Village      | Manhattan
            29.7 | Central Park      | Manhattan
-
-
+    
+  
 .. _polypolyjoins:
 
-Polygones/Jointures de polygones
---------------------------------
-
-Dans notre requÃªte intÃ©ressante (dans :ref:`interestingquestion`) nous avons utilisÃ© la fonction :command:`ST_Intersects(geometry_a, geometry_b)` pour dÃ©terminer quelle entitÃ© polygonale Ã  inclure dans chaque groupe de quartier. Ce qui nous conduit Ã  la question : que ce passe-t-il si une entitÃ© tombe entre deux quartiers ? Il intersectera chacun d'entre eux et ainsi sera inclut dans **chacun** des rÃ©sultats.
+Polygon/Polygon Joins
+---------------------
+
+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**.
 
 .. image:: ./screenshots/centroid_neighborhood.png
 
-Pour Ã©viter ce cas de double comptage il existe trois mÃ©thodes :
-
- * La mÃ©thode simple consiste a s'assurer que chaque entitÃ© ne se retrouve que dans **un** seul groupe gÃ©ographique (en utilisant :command:`ST_Centroid(geometry)`)
- * La mÃ©thode complexe consiste Ã  disviser les parties qui se croisent en utilisant les bordures (en utilisant :command:`ST_Intersection(geometry,geometry)`)
-
-Voici un exemple d'utilisation de la mÃ©thode simple pour Ã©viter le double comptage dans notre requÃªte prÃ©cÃ©dente :
-
-.. code-block:: sql
-
-  SELECT
-    Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct,
-    n.name, n.boroname
-  FROM nyc_neighborhoods n
-  JOIN nyc_census_tracts t
-  ON ST_Contains(n.the_geom, ST_Centroid(t.the_geom))
+To avoid this kind of double counting there are two methods:
+
+ * The simple method is to ensure that each tract only falls in **one** summary area (using :command:`ST_Centroid(geometry)`)
+ * The complex method is to divide crossing tracts at the borders (using :command:`ST_Intersection(geometry,geometry)`)
+ 
+Here is an example of using the simple method to avoid double counting in our graduate education query:
+
+.. code-block:: sql
+
+  SELECT 
+    Round(100.0 * Sum(t.edu_graduate_dipl) / Sum(t.edu_total), 1) AS graduate_pct, 
+    n.name, n.boroname 
+  FROM nyc_neighborhoods n 
+  JOIN nyc_census_tracts t 
+  ON ST_Contains(n.the_geom, ST_Centroid(t.the_geom)) 
   WHERE t.edu_total > 0
   GROUP BY n.name, n.boroname
   ORDER BY graduate_pct DESC
   LIMIT 10;
-
-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Ã©.
-
-::
-
-   graduate_pct |       name        | boroname
+  
+Note that the query takes longer to run now, because the :command:`ST_Centroid` function  has to be run on every census tract.
+
+::
+
+   graduate_pct |       name        | boroname  
   --------------+-------------------+-----------
            49.2 | Carnegie Hill     | Manhattan
@@ -166,16 +166,16 @@
            30.1 | Downtown          | Brooklyn
            28.4 | Cobble Hill       | Brooklyn
-
-Ãviter le double comptage change le rÃ©sultat !
+  
+Avoiding double counting changes the results! 
 
 
 .. _largeradiusjoins:
 
-Jointures utilisant un large rayon de distance
-----------------------------------------------
-
-Une requÃªte qu'il est "sympa" de demander est : "Comment les temps de permutation des gens proches (dans un rayon de 500 mÃštres ) des stations de mÃ©tro diffÃšrent de ceux qui en vivent loin ? "
-
-NÃ©anmoins, la question rencontre les mÃªmes problÃšmes de double comptage : plusieurs personnes seront dans un rayon de 500 mÃštres de plusieurs stations de mÃ©tro diffÃ©rentes. Comparons la population de New York :
+Large Radius Distance Joins
+---------------------------
+
+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?"
+
+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:
 
 .. code-block:: sql
@@ -183,10 +183,10 @@
   SELECT Sum(popn_total)
   FROM nyc_census_blocks;
-
+  
 ::
 
   8008278
-
-Avec la population des gens de New York dans un rayon de 500 mÃštres d'une station de mÃ©tro :
+  
+With the population of the people in New York within 500 meters of a subway station:
 
 .. code-block:: sql
@@ -196,14 +196,14 @@
   JOIN nyc_subway_stations subway
   ON ST_DWithin(census.the_geom, subway.the_geom, 500);
-
+  
 ::
 
   10556898
 
-Il y a plus de personnes proches du mÃ©tro qu'il y a de personnes ! Clairement, notre requÃªte SQL simple rencontre un gros problÃšme de double comptage. Vous pouvez voir le problÃšme en regardant l'image des zones tampons crÃ©Ã©es pour les stations.
+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.
 
 .. image:: ./screenshots/subways_buffered.png
 
-La solution est de s'assurer que nous avons seulement des blocs distincts avant de les regrouper. Nous pouvons rÃ©aliser cela en cassant notre requÃªte en sous-requÃªtes qui rÃ©cupÃšrent les blocs distincts, les regroupent pour ensuite retourner notre rÃ©ponse :
+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:
 
 .. code-block:: sql
@@ -216,9 +216,11 @@
     ON ST_DWithin(census.the_geom, subway.the_geom, 500)
   ) AS distinct_blocks;
-
+  
 ::
 
   4953599
 
-C'est mieux ! Donc un peu plus de 50 % de la population de New York vit Ã  proximitÃ© (500m, environ 5 Ã  7 minutes de marche) du mÃ©tro.
-
+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.
+
+
+
