Index: /trunk/workshop-foss4g/projection.rst
===================================================================
--- /trunk/workshop-foss4g/projection.rst	(revision 30)
+++ /trunk/workshop-foss4g/projection.rst	(revision 20)
@@ -1,12 +1,12 @@
 .. _projection:
 
-Partie 15 : Projections des donnÃ©es
-===================================
+Section 15: Projecting Data
+===========================
 
-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.
+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.
 
-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)`.
+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.
 
-Nous pouvons vÃ©rifier le SRID de nos donnÃ©es avec la commande :command:`ST_SRID` :
+We can confirm the SRID of our data with the :command:`ST_SRID` command:
 
 .. code-block:: sql
@@ -18,10 +18,11 @@
   26918
   
-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 
+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.
+
 .. code-block:: sql
 
    SELECT * FROM spatial_ref_sys WHERE srid = 26918;
    
-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 :
+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:
 
 .. code-block:: sql
@@ -33,12 +34,12 @@
   +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 
   
-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.
+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.
 
-Comparaison de donnÃ©es
-----------------------
+Comparing Data
+--------------
 
-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.
+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.
 
-Si vous utilisÃ© des gÃ©omÃ©tries avec diffÃ©rents SRID vous obtiendrez une erreur du genre :
+If you feed in geometries with differing SRIDs you will just get an error:
 
 .. code-block:: sql
@@ -57,11 +58,11 @@
 .. note::
 
-   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.
+   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.
 
 
-Transformer les donnÃ©es
------------------------
+Transforming Data
+-----------------
 
-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.
+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.
 
 ::
@@ -69,13 +70,13 @@
    +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs 
 
-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".
+Let's convert some data from our working projection to geographic coordinates -- also known as "longitude/latitude". 
 
-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 ?
+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?
 
-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.
+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:
 
   http://spatialreference.org/ref/epsg/4326/
   
-Vous pouvez aussi rÃ©cupÃ©rer les dÃ©finitions dans la table  ``spatial_ref_sys`` :
+You can also pull the definitions from the ``spatial_ref_sys`` table:
 
 .. code-block:: sql
@@ -93,5 +94,5 @@
     AUTHORITY["EPSG","4326"]]
 
-Essayons de convertir les cordonnÃ©es de la station 'Broad St' :
+Let's convert the coordinates of the 'Broad St' subway station into geographics:
 
 .. code-block:: sql
@@ -105,7 +106,7 @@
   POINT(-74.0106714688735 40.7071048155841)
 
-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.
+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.
 
-Pour visualiser la table d'assignation des SRID, interroger la table ``geometry_columns`` de la base de donnÃ©es.
+To view a table's SRID assignment, query the database's ``geometry_columns`` table.
 
 .. code-block:: sql
@@ -125,5 +126,5 @@
 
   
-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.
+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.
 
 .. code-block:: sql
@@ -136,12 +137,11 @@
    FROM geometries;
 
-Liste des fonctions
--------------------
+Function List
+-------------
+`ST_AsText <http://postgis.org/docs/ST_AsText.html>`_: Returns the Well-Known Text (WKT) representation of the geometry/geography without SRID metadata.
 
-`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.
+`ST_SetSRID(geometry, srid) <http://postgis.org/docs/ST_SetSRID.html>`_: Sets the SRID on a geometry to a particular integer value.
 
-`ST_SetSRID(geometry, srid) <http://postgis.org/docs/ST_SetSRID.html>`_: affecte une valeur au SRID d'une gÃ©omÃ©trie.
+`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.
 
-`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.
-
-`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.
+`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.
Index: /trunk/workshop-foss4g/validity.rst
===================================================================
--- /trunk/workshop-foss4g/validity.rst	(revision 30)
+++ /trunk/workshop-foss4g/validity.rst	(revision 20)
@@ -1,26 +1,26 @@
 .. _validity:
 
-Partie 20 : ValiditÃ©
+Section 20: Validity
 ====================
 
-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 ?
+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?
 
-Qu'est-ce que la validitÃ©
--------------------------
+What is Validity
+----------------
 
-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 les points.
+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.
 
-Certaines des rÃšgles de validation des polygones semble Ã©videntes, et d'autre semblent arbitraires (et le sont vraiment).
+Some of the rules of polygon validity feel obvious, and others feel arbitrary (and in fact, are arbitrary).
 
- * Les contours des Polygon doivent Ãªtre fermÃ©s.
- * Les contours qui dÃ©finissent des trous doivent Ãªtre inclus dans la zone dÃ©finit par le coutour extÃ©rieur.
- * Les contours ne doivent pas s'intersecter (ils ne doivent ni se croiser ni se toucher).
- * Les contours ne doivent pas toucher les autres contours, sauf en un point unique.
+ * Polygon rings must close.
+ * Rings that define holes should be inside rings that define exterior boundaries.
+ * Rings may not self-intersect (they may neither touch nor cross one another).
+ * Rings may not touch other rings, except at a point.
 
-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.
+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.
 
-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".
+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*.
 
-Voici un exemple de pourquoi cette structuration est importante. Ce polygon n'est pas valide :
+Here's an example of why structure matters. This polygon is invalid:
 
 ::
@@ -28,11 +28,11 @@
   POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0));
   
-Vous pouvez comprendre ce qui n'est pas valide en regardant cette figure :
+You can see the invalidity a little more clearly in this diagram:
 
 .. image:: ./validity/figure_eight.png
 
-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.
+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.
 
-Essayons maintenant de voir ce que pense la base de donnÃ©es de notre polygone :
+Let's see what the database thinks the area of our polygon is:
 
 .. code-block:: sql
@@ -46,11 +46,11 @@
           0
 
-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".
+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.
 
 
-DÃ©tectÃ© la validitÃ©
--------------------
+Detecting Validity
+------------------
 
-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 :
+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:
 
 .. code-block:: sql
@@ -62,5 +62,5 @@
   f
 
-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Ã© :
+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:
 
 .. code-block:: sql
@@ -72,11 +72,11 @@
   Self-intersection[1 1]
 
-Vous remarquerez qu'en plus de la raison (intersection) la localisation de la non validitÃ© (coordonnÃ©e (1 1)) est aussi renvoyÃ©e.
+Note that in addition to the reason (self-intersection) the location of the invalidity (coordinate (1 1)) is also returned.
 
-Nous pouvons aussi utiiliser la fonction :command:`ST_IsValid(geometry)` pour tester nos tables : 
+We can use the :command:`ST_IsValid(geometry)` function to test our tables too:
 
 .. code-block:: sql
 
-  -- Trouver tout les polygones non valides et leur problÃšme 
+  -- Find all the invalid polygons and what their problem is
   SELECT name, boroname, ST_IsValidReason(the_geom)
   FROM nyc_neighborhoods
@@ -94,29 +94,29 @@
 
 
-RÃ©parer les invalides
----------------------
+Repairing Invalidity
+--------------------
 
-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.
+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.
 
-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.
+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.
 
 .. code-block:: sql
 
-  -- Table Ã  part des gÃ©omÃ©tries non-valide
+  -- Side table of invalids
   CREATE TABLE nyc_neighborhoods_invalid AS
   SELECT * FROM nyc_neighborhoods
   WHERE NOT ST_IsValid(the_geom);
   
-  -- Suppression de la table principale
+  -- Remove them from the main table
   DELETE FROM nyc_neighborhoods
   WHERE NOT ST_IsValid(the_geom);
   
-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**.
+A good tool for visually repairing invalid geometry is OpenJump (http://openjump.org) which includes a validation routine under **Tools->QA->Validate Selected Layers**.
 
-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`.
+Now the good news: a large proportion of invalidities **can be fixed inside the database** using the :command:`ST_Buffer` function.
 
-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.
+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.
 
-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.
+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.
 
 :: 
@@ -126,5 +126,5 @@
 .. image:: ./validity/banana.png
 
-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 seul point.
+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.
 
 .. code-block:: sql
@@ -143,4 +143,4 @@
 .. note::
 
-  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.
+  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. 
   
Index: /trunk/workshop-foss4g/projection_exercises.rst
===================================================================
--- /trunk/workshop-foss4g/projection_exercises.rst	(revision 30)
+++ /trunk/workshop-foss4g/projection_exercises.rst	(revision 20)
@@ -1,23 +1,23 @@
 .. _projection_exercises:
 
-Partie 16 : Exercices de projection
-===================================
+Section 16: Projection Exercises
+================================
 
-Voici un  rappel de certaines fonctions que nous avons vu. Astuce : elles devraient Ãªtre utiles pour les exercices !
-     
-* :command:`sum(expression)` agrÃ©gation qui retourn la somme d'un esemble de valeurs
-* :command:`ST_Length(linestring)` retourne la longueur d'une ligne
-* :command:`ST_SRID(geometry, srid)` retourne le SRID d'une gÃ©omÃ©trie
-* :command:`ST_Transform(geometry, srid)` re-projette des gÃ©omÃ©tries dans un autre systÃšme de rÃ©fÃ©rences spatiales
-* :command:`ST_GeomFromText(text)` retourne un objet ``geometry``
-* :command:`ST_AsText(geometry)` retourne le WKT (``text``)
-* :command:`ST_AsGML(geometry)` retourne le GML (``text``)
+Here's a reminder of some of the functions we have seen.  Hint: they should be useful for the exercises!
 
-Rappelez-vous les resssources en ligne :
+* :command:`sum(expression)` aggregate to return a sum for a set of records
+* :command:`ST_Length(linestring)` returns the length of the linestring
+* :command:`ST_SRID(geometry, srid)` returns the SRID of the geometry
+* :command:`ST_Transform(geometry, srid)` converts geometries into different spatial reference systems
+* :command:`ST_GeomFromText(text)` returns ``geometry``
+* :command:`ST_AsText(geometry)` returns WKT ``text``
+* :command:`ST_AsGML(geometry)` returns GML ``text``
+
+Remember the online resources that are available to you:
 
 * http://spatialreference.org
 * http://prj2epsg.org
 
-Et les tables qui sont disponibles :
+Also remember the tables we have available:
 
  * ``nyc_census_blocks`` 
@@ -37,8 +37,8 @@
    * name, boroname, the_geom
 
-Exercices
+Exercises
 ---------
 
- * **"Quelle est la longueur des rue de New York, mesurÃ©e en UTM 18 ?"**
+ * **"What is the length of all streets in New York, as measured in UTM 18?"**
  
    .. code-block:: sql
@@ -51,5 +51,5 @@
      10418904.7172
       
- * **"Quelle est la dÃ©finition du SRID 2831 ?"**   
+ * **"What is the WKT definition of SRID 2831?"**   
     
    .. code-block:: sql
@@ -58,5 +58,5 @@
      WHERE SRID = 2831;
 
-Ou, via `prj2epsg <http://prj2epsg.org/epsg/2831>`_
+Or, via `prj2epsg <http://prj2epsg.org/epsg/2831>`_
 
  ::
@@ -87,5 +87,5 @@
   
 
- * **"Quelle est la longueur des rue de New York, mesurÃ© en utilisant le SRID 2831 ?"**
+ * **"What is the length of all streets in New York, as measured in SRID 2831?"**
  
    .. code-block:: sql
@@ -100,7 +100,7 @@
    .. note::
    
-     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.
+     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.
      
- * **"Quelle est la reprÃ©sentation KML du point de la station de mÃ©tris 'Broad St' ?"**
+ * **"What is the KML representation of the point at 'Broad St' subway station?"**
  
    .. code-block:: sql
@@ -114,3 +114,3 @@
      <Point><coordinates>-74.010671468873468,40.707104815584088</coordinates></Point>
      
-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.
+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.
Index: /trunk/workshop-foss4g/spatial_relationships.rst
===================================================================
--- /trunk/workshop-foss4g/spatial_relationships.rst	(revision 30)
+++ /trunk/workshop-foss4g/spatial_relationships.rst	(revision 20)
@@ -1,26 +1,26 @@
 .. _spatial_relationships:
 
-Partie 10 : relations spatiales
+Section 10: Spatial Relationships
 =================================
 
-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.
+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.
 
-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*.
+Spatial databases are powerful because they not only store geometry, they also have the ability to compare *relationships between geometries*. 
 
-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.
+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.
 
-Le standard de l'OGC dÃ©finit l'ensemble suivant de fonctions pour comparer les gÃ©omÃ©tries.
+The OGC standard defines the following set of methods to compare geometries.
 
 ST_Equals
 ---------
  
-:command:`ST_Equals(geometry A, geometry B)` test l'Ã©galitÃ© spatiale de deux gÃ©omÃ©tries. 
+:command:`ST_Equals(geometry A, geometry B)` tests the spatial equality of two geometries. 
 
 .. figure:: ./spatial_relationships/st_equals.png
    :align: center
 
-ST_Equals retourne TRUE si les deux gÃ©omÃ©tries sont du mÃªme type, ont des coordonnÃ©es x.y identiques.
+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.
 
-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'.
+First, let's retrieve a representation of a point from our ``nyc_subway_stations`` table. We'll take just the entry for 'Broad St'.
 
 .. code-block:: sql
@@ -36,5 +36,5 @@
    Broad St | 0101000020266900000EEBD4CF27CF2141BC17D69516315141 | POINT(583571 4506714)
  
-Maintenant, copiez / collez la valeur afficher pour tester la fonction :command:`ST_Equals`:
+Then, plug the geometry representation back into an :command:`ST_Equals` test:
 
 .. code-block:: sql
@@ -50,26 +50,24 @@
 .. note::
 
-  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.
+  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.
 
 
-ST_Intersects, ST_Disjoint, ST_Crosses et ST_Overlaps
+ST_Intersects, ST_Disjoint, ST_Crosses and ST_Overlaps
 ------------------------------------------------------
 
-: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.
+:command:`ST_Intersects`, :command:`ST_Crosses`, and :command:`ST_Overlaps` test whether the interiors of the geometries intersect. 
 
 .. figure:: ./spatial_relationships/st_intersects.png
    :align: center
 
-:command:`ST_Intersects(geometry A, geometry B)` retourne t (TRUE) si l'intersection ne rÃ©nvoit pas un ensemble vide de rÃ©sultats. Intersects retourne le rÃ©sultat exactement inverse de la fonction disjoint.
+: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.
 
 .. figure:: ./spatial_relationships/st_disjoint.png
    :align: center
 
-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.
+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.
 
 .. figure:: ./spatial_relationships/st_crosses.png  
    :align: center
-
-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'intersection 
 
 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,7 +76,7 @@
    :align: center
 
-: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.
+: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.
 
-Essayons de prendre la station de mÃ©tro de Broad Street et de dÃ©terminer sont voisinage en utilisant la fonction :command:`ST_Intersects` :
+Let's take our Broad Street subway station and determine its neighborhood using the :command:`ST_Intersects` function:
 
 .. code-block:: sql
@@ -99,30 +97,30 @@
 ----------
 
-:command:`ST_Touches` test si deux gÃ©omÃ©tries se touchent en leur contour extÃ©rieur, mais leur contours intÃ©rieur ne s'intersectent pas
+:command:`ST_Touches` tests whether two geometries touch at their boundaries, but do not intersect in their interiors 
 
 .. figure:: ./spatial_relationships/st_touches.png
    :align: center
 
-:command:`ST_Touches(geometry A, geometry B)` retourn TRUE soit si les contours des gÃ©omÃ©tries s'intersectent ou si l'un des contours intÃ©rieur de l'une intersecte le contour extÃ©rieur de l'autre.
+: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.
 
-ST_Within et ST_Contains
+ST_Within and ST_Contains
 -------------------------
 
-:command:`ST_Within` et :command:`ST_Contains` test si une gÃ©omÃ©trie est totalement incluse dans l'autre. 
+:command:`ST_Within` and :command:`ST_Contains` test whether one geometry is fully within the other. 
 
 .. figure:: ./spatial_relationships/st_within.png
    :align: center
     
-:command:`ST_Within(geometry A , geometry B)` retourne TRUE si la premiÃšre gÃ©omÃ©tries est complÃštement contenue dans l'autre. ST_Within test l'exact opposÃ© au rÃ©sultat de ST_Contains.  
+: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.  
 
-:command:`ST_Contains(geometry A, geometry B)` retourne TRUE si la seconde gÃ©omÃ©tries est complÃštement contenue dans la premiÃšre gÃ©omÃ©trie.
+:command:`ST_Contains(geometry A, geometry B)` returns TRUE if the second geometry is completely contained by the first geometry. 
 
 
-ST_Distance et ST_DWithin
+ST_Distance and ST_DWithin
 --------------------------
 
-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".
+An extremely common GIS question is "find all the stuff within distance X of this other stuff". 
 
-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.
+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.
 
 .. code-block:: sql
@@ -136,10 +134,10 @@
   3
 
-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.
+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.
 
   .. figure:: ./spatial_relationships/st_dwithin.png
      :align: center
     
-En utilisant de nouveau notre station de mÃ©tros Broad Street, nous pouvons trouver les rues voisines (Ã  10 mÃštres de) de la station :
+Using our Broad Street subway station again, we can find the streets nearby (within 10 meters of) the subway stop:
 
 .. code-block:: sql
@@ -161,30 +159,30 @@
      Nassau St
 
-Nous pouvons vÃ©rifier la rÃ©ponse sur une carte. La station Broad St est actuellement Ã  l'intersection des rues Wall, Broad et Nassau. 
+And we can verify the answer on a map. The Broad St station is actually at the intersection of Wall, Broad and Nassau Streets.
 
 .. image:: ./spatial_relationships/broad_st.jpg
 
-Liste des fonctions
--------------------
+Function List
+-------------
 
-`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 de A.
+`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.
 
-`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.
+`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.
 
-`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.
+`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.
 
-`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. 
+`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. 
 
-`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. 
+`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. 
 
-`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.
+`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.
 
-`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). 
+`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). 
 
-`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.
+`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.
 
-`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.
+`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.
 
-`ST_Within(geometry A , geometry B) <http://postgis.org/docs/ST_Within.html>`_ : retourne TRUE si la gÃ©omÃ©trie A est complÃštement Ã  l'intÃ©rieur de B
+`ST_Within(geometry A , geometry B) <http://postgis.org/docs/ST_Within.html>`_: Returns true if the geometry A is completely inside geometry B
 
 
Index: /trunk/workshop-foss4g/spatial_relationships_exercises.rst
===================================================================
--- /trunk/workshop-foss4g/spatial_relationships_exercises.rst	(revision 30)
+++ /trunk/workshop-foss4g/spatial_relationships_exercises.rst	(revision 20)
@@ -1,23 +1,23 @@
 .. _spatial_relationships_exercises:
 
-Partie 11 : exercises sur les relations spatiales
+Section 11: Spatial Relationships Exercises
 ===========================================
 
-Voici un rappel des fonctions que nous avons vu dans les parties prÃ©cÃ©dentes. Elles seront utiles pour les exercices !
+Here's a reminder of the functions we saw in the last section. They should be useful for the exercises!
 
- * :command:`sum(expression)` agrÃ©gation retournant la somme d'un ensemble
- * :command:`count(expression)` agrÃ©gation retournant le nombre d'Ã©lÃ©ments d'un ensemble
-* :command:`ST_Contains(geometry A, geometry B)` retourne vrai si la gÃ©omÃ©trie A contient la gÃ©omÃ©trie B 
-* :command:`ST_Crosses(geometry A, geometry B)` retourne vrai si la gÃ©omÃ©trie A croise la gÃ©omÃ©trie B
-* :command:`ST_Disjoint(geometry A , geometry B)` retourne vrai si les gÃ©omÃ©trie ne s'intersectent pas
-* :command:`ST_Distance(geometry A, geometry B)` retourne la distance minimum entre deux gÃ©omÃ©tries
-* :command:`ST_DWithin(geometry A, geometry B, radius)` retourne vrai si la A est distante d'au plus radius de B
-* :command:`ST_Equals(geometry A, geometry B)` retourne vrai si A est la mÃªme gÃ©omÃ©trie que B
-* :command:`ST_Intersects(geometry A, geometry B)` retourne vrai si A intersecte B
-* :command:`ST_Overlaps(geometry A, geometry B)` retourne vrai si A et B on un espace en commun, mais ne sont pas complÃ©tement inclus l'un dans l'autre.
-* :command:`ST_Touches(geometry A, geometry B)` retourne vrai si le contour extÃ©rieur de A touche B
-* :command:`ST_Within(geometry A, geometry B)` retourne vrai si A est hors de B
+* :command:`sum(expression)` aggregate to return a sum for a set of records
+* :command:`count(expression)` aggregate to return the size of a set of records
+* :command:`ST_Contains(geometry A, geometry B)` returns true if geometry A contains geometry B 
+* :command:`ST_Crosses(geometry A, geometry B)` returns true if geometry A crosses geometry B
+* :command:`ST_Disjoint(geometry A , geometry B)` returns true if the geometries do not "spatially intersect" 
+* :command:`ST_Distance(geometry A, geometry B)` returns the minimum distance between geometry A and geometry B
+* :command:`ST_DWithin(geometry A, geometry B, radius)` returns true if geometry A is radius distance or less from geometry B
+* :command:`ST_Equals(geometry A, geometry B)` returns true if geometry A is the same as geometry B
+* :command:`ST_Intersects(geometry A, geometry B)` returns true if geometry A intersects geometry B
+* :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.
+* :command:`ST_Touches(geometry A, geometry B)` returns true if the boundary of geometry A touches geometry B
+* :command:`ST_Within(geometry A, geometry B)` returns true if geometry A is within geometry B
 
-Souvenez-vous les tables Ã  notre disposition :
+Also remember the tables we have available:
 
  * ``nyc_census_blocks`` 
@@ -37,8 +37,8 @@
    * name, boroname, the_geom
 
-Exercices
+Exercises
 ---------
 
- * **"Quel est la valeur gÃ©omÃ©trique de la rue nommÃ©e  'Atlantic Commons' ?"**
+ * **"What is the geometry value for the street named 'Atlantic Commons'?"**
  
    .. code-block:: sql
@@ -52,5 +52,5 @@
      01050000202669000001000000010200000002000000093235673BE82141F319CD89A22E514170E30E0ADFE82141CB2D3EFFA52E5141
      
- * **"Quel sont les quartiers et villes sont dans Atlantic Commons ?"**
+ * **"What neighborhood and borough is Atlantic Commons in?"**
      
    .. code-block:: sql
@@ -70,5 +70,5 @@
      
 
- * **"Quelles rues touchent Atlantic Commons ?"** 
+ * **"What streets does Atlantic Commons touch?"** 
  
    .. code-block:: sql
@@ -91,5 +91,5 @@
   
 
- * **"Approximativement combien de personnes vivent dans (ou Ã  un dans une zone de 50 meters autour) Atlantic Commons ?"**
+ * **"Approximately how many people live on (within 50 meters of) Atlantic Commons?"**
  
    .. code-block:: sql
Index: /trunk/workshop-foss4g/geometries_exercises.rst
===================================================================
--- /trunk/workshop-foss4g/geometries_exercises.rst	(revision 30)
+++ /trunk/workshop-foss4g/geometries_exercises.rst	(revision 20)
@@ -1,41 +1,41 @@
 .. _geometries_exercises:
 
-Partie 9 : exercices sur les gÃ©omÃ©tries
-======================================
-
-Voici un petit rappel de toute les fonction que nous avons jusqu'Ã  prÃ©sent. Elles devraient Ãªtre utiles pour les exercices !
-
- * :command:`sum(expression)` agrÃ©gation retournant la somme d'un ensemble
- * :command:`count(expression)` agrÃ©gation retournant le nombre d'Ã©lÃ©ments d'un ensemble
- * :command:`ST_GeometryType(geometry)` retourne le type de la gÃ©omÃ©trie
- * :command:`ST_NDims(geometry)` retourne le  nombre de dimensions
- * :command:`ST_SRID(geometry)` retourne l'identifiant du systÃšme de rÃ©fÃ©rences spatiales
- * :command:`ST_X(point)` retourne la coordonnÃ©e X
- * :command:`ST_Y(point)` retourne la coordonnÃ©e Y
- * :command:`ST_Length(linestring)` retourne la longueur d'une ligne
- * :command:`ST_StartPoint(geometry)` retourne le premier point d'une ligne
- * :command:`ST_EndPoint(geometry)` retourne le dernier point d'une ligne
- * :command:`ST_NPoints(geometry)` retourne le nombre point d'une ligne
- * :command:`ST_Area(geometry)` retourne l'aire d'un polygone
- * :command:`ST_NRings(geometry)` retourne le nombre de contours (1 ou plus si il y a des trous)
- * :command:`ST_ExteriorRing(polygon)` retourne le contour exterieur (ligne) d'un polygon
- * :command:`ST_InteriorRingN(polygon, integer)` retourne le contour intÃ©rieur (ligne) d'un polygone
- * :command:`ST_Perimeter(geometry)` retourne la longueur de tout les contours
- * :command:`ST_NumGeometries(multi/geomcollection)` retourne le nombre de composantes dans une collection
- * :command:`ST_GeometryN(geometry, integer)` retourne la niÃšme entitÃ© de la collection
- * :command:`ST_GeomFromText(text)` retourne ``geometry``
- * :command:`ST_AsText(geometry)` retourne WKT ``text``
- * :command:`ST_AsEWKT(geometry)` retourne EWKT ``text``
- * :command:`ST_GeomFromWKB(bytea)` retourne ``geometry``
- * :command:`ST_AsBinary(geometry)` retourne WKB ``bytea``
- * :command:`ST_AsEWKB(geometry)` retourne EWKB ``bytea``
- * :command:`ST_GeomFromGML(text)` retourne ``geometry``
- * :command:`ST_AsGML(geometry)` retourne GML ``text``
- * :command:`ST_GeomFromKML(text)` retourne ``geometry``
- * :command:`ST_AsKML(geometry)` retourne KML ``text``
- * :command:`ST_AsGeoJSON(geometry)` retourne JSON ``text``
- * :command:`ST_AsSVG(geometry)` retourne SVG ``text``
-
-Souvenez-vous aussi des tables qui sont disponibles:
+Section 9: Geometry Exercises
+=============================
+
+Here's a reminder of all the functions we have seen so far. They should be useful for the exercises!
+
+ * :command:`sum(expression)` aggregate to return a sum for a set of records
+ * :command:`count(expression)` aggregate to return the size of a set of records
+ * :command:`ST_GeometryType(geometry)` returns the type of the geometry
+ * :command:`ST_NDims(geometry)` returns the number of dimensions of the geometry
+ * :command:`ST_SRID(geometry)` returns the spatial reference identifier number of the geometry
+ * :command:`ST_X(point)` returns the X ordinate
+ * :command:`ST_Y(point)` returns the Y ordinate
+ * :command:`ST_Length(linestring)` returns the length of the linestring
+ * :command:`ST_StartPoint(geometry)` returns the first coordinate as a point
+ * :command:`ST_EndPoint(geometry)` returns the last coordinate as a point
+ * :command:`ST_NPoints(geometry)` returns the number of coordinates in the linestring
+ * :command:`ST_Area(geometry)` returns the area of the polygons
+ * :command:`ST_NRings(geometry)` returns the number of rings (usually 1, more if there are holes)
+ * :command:`ST_ExteriorRing(polygon)` returns the outer ring as a linestring
+ * :command:`ST_InteriorRingN(polygon, integer)` returns a specified interior ring as a linestring
+ * :command:`ST_Perimeter(geometry)` returns the length of all the rings
+ * :command:`ST_NumGeometries(multi/geomcollection)` returns the number of parts in the collection
+ * :command:`ST_GeometryN(geometry, integer)` returns the specified part of the collection
+ * :command:`ST_GeomFromText(text)` returns ``geometry``
+ * :command:`ST_AsText(geometry)` returns WKT ``text``
+ * :command:`ST_AsEWKT(geometry)` returns EWKT ``text``
+ * :command:`ST_GeomFromWKB(bytea)` returns ``geometry``
+ * :command:`ST_AsBinary(geometry)` returns WKB ``bytea``
+ * :command:`ST_AsEWKB(geometry)` returns EWKB ``bytea``
+ * :command:`ST_GeomFromGML(text)` returns ``geometry``
+ * :command:`ST_AsGML(geometry)` returns GML ``text``
+ * :command:`ST_GeomFromKML(text)` returns ``geometry``
+ * :command:`ST_AsKML(geometry)` returns KML ``text``
+ * :command:`ST_AsGeoJSON(geometry)` returns JSON ``text``
+ * :command:`ST_AsSVG(geometry)` returns SVG ``text``
+
+Also remember the tables we have available:
 
  * ``nyc_census_blocks`` 
@@ -72,7 +72,7 @@
    .. note::
 
-      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 par 4047.
-
- * **"Quelle est l'aire de Manhattan in acres ?"** (Astuce: ``nyc_census_blocks`` et ``nyc_neighborhoods`` on toutes deux le champ ``boroname``.)
+      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.
+
+ * **"What is the area of Manhattan in acres?"** (Hint: both ``nyc_census_blocks`` and ``nyc_neighborhoods`` have a ``boroname`` in them.)
  
    .. code-block:: sql
@@ -99,5 +99,5 @@
 
 
- * **"Combien de bloques de la ville de New York ont des trous ?"**
+ * **"How many census blocks in New York City have a hole in them?"**
  
    .. code-block:: sql
@@ -111,5 +111,5 @@
      66 
    
- * **"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.)
+ * **"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.)
   
     .. code-block:: sql
@@ -122,5 +122,5 @@
      10418.9047172
 
- * **"Quelle est la longueur de 'Columbus Cir' (Columbus Circle) ?**
+ * **"How long is 'Columbus Cir' (Columbus Circle)?**
  
      .. code-block:: sql
@@ -134,5 +134,5 @@
        308.34199
 
- * **"Quelle est le contour de 'West Village' au format JSON ?"**
+ * **"What is the JSON representation of the boundary of the 'West Village'?"**
  
    .. code-block:: sql
@@ -149,8 +149,8 @@
           [583263.2776595836,4509242.6260239873]]]]}
 
-La gÃ©omÃ©trie de type "MultiPolygon", interressant !
+The geometry type is "MultiPolygon", interesting!
    
       
- * **"Combien de polygones sont dans le multi-polygone 'West Village' ?"**
+ * **"How many polygons are in the 'West Village' multipolygon?"**
  
    .. code-block:: sql
@@ -166,8 +166,8 @@
    .. note::
    
-      Il n'est pas rare de trouver des Ã©lÃ©ments de type multi-polygone ne contenant qu'un seul polygone dans des tables. L'utilisation du type multi-polygone permet d'utiliser une seule table pour y stoquer des gÃ©omÃ©tries simples et multiples sans mÃ©langer les types.
-       
-       
- * **"Quel est la longueur des rues de la ville de New York, suivant leur type ?"**
+      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.
+       
+       
+ * **"What is the length of streets in New York City, summarized by type?"**
  
    .. code-block:: sql
@@ -207,5 +207,5 @@
    .. note::
 
-      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.
+      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.
 
  
Index: /trunk/workshop-foss4g/joins.rst
===================================================================
--- /trunk/workshop-foss4g/joins.rst	(revision 30)
+++ /trunk/workshop-foss4g/joins.rst	(revision 20)
@@ -1,12 +1,12 @@
 .. _joins:
 
-Partie 12 : les jointures spatiales
-===================================
-
-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.
-
-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' ?"
-
-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 : 
+Section 12: Spatial Joins
+=========================
+
+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.
+
+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?"
+
+Using a spatial join, we can answer the question in one step, retrieving information about the subway station and the neighborhood that contains it:
 
 .. code-block:: sql
@@ -27,12 +27,12 @@
    Broad St    | Financial District | Manhattan
 
-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`.
-
-Jointure et regroupement
-------------------------
-
-La combinaison de ``JOIN`` avec ``GROUP BY`` fournit le type d'analyse qui est courramment utilisÃ© dans les systÃšmes SIG.
-
-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 de Manhattan.
+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`.
+
+Join and Summarize
+------------------
+
+The combination of a ``JOIN`` with a ``GROUP BY`` provides the kind of analysis that is usually done in a GIS system.
+
+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.
 
 .. code-block:: sql
@@ -84,18 +84,18 @@
 
 
-Que ce passe-t-il ici ?  Voici ce qui se passe (l'ordre d'Ã©valuation est optimisÃ© par la base de donnÃ©es) :
-
-#. La clause ``JOIN`` crÃ©e une table cirtuelle qui contient les colonnes Ã  la fois des quartier et des recensements (tables neighborhoods et census).
-#. La claue ``WHERE`` filtre la table virtuelle pour ne conserver que la ligne correspondant Ã  Manhattan. 
-#. 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.
-#. AprÃšs un peu d'arythmÃ©tiques et de formatage (ex: ``GROUP BY``, ``ORDER BY``)) ssur le nombres finaux, notre requÃªte calcul les porcentages.
+What's going on here? Notionally (the actual evaluation order is optimized under the covers by the database) this is what happens:
+
+#. The ``JOIN`` clause creates a virtual table that includes columns from both the neighborhoods and census tables. 
+#. The ``WHERE`` clause filters our virtual table to just rows in Manhattan. 
+#. The remaining rows are grouped by the neighborhood name and fed through the aggregation function to :command:`Sum()` the population values.
+#. After a little arithmetic and formatting (e.g., ``GROUP BY``, ``ORDER BY``) on the final numbers, our query spits out the percentages.
 
 .. note:: 
 
-   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.
-
-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.
-
-PremiÃšrement, essayons d'obtenir la rÃ©partition raciale de la ville.
+   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.
+
+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.
+
+First, let's get the baseline racial make-up of the city.
 
 .. code-block:: sql
@@ -114,9 +114,9 @@
 
 
-Donc, 8M de personnes de New York, environ 44% sont "blancs" et "26% sont "noirs".
-
-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 ?
-
-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.
+So, of the 8M people in New York, about 44% are "white" and 26% are "black". 
+
+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?
+
+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.
 
 .. code-block:: sql
@@ -136,7 +136,7 @@
 .. note::
 
-   Le mot clef ``DISTINCT`` permet d'Ã©liminer les rÃ©pÃ©titions de lignes de notre rÃ©sultat. Dans ce mot clef, notre requÃªte renverrait 491 rÃ©sultats au lieu de 73.
+   The ``DISTINCT`` keyword eliminates duplicate rows from the result.  Without the ``DISTINCT`` keyword, the query above identifies 491 results instead of 73.
    
-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.
+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.
 
 .. code-block:: sql
@@ -158,5 +158,5 @@
   A,C,E
   
-Essayons de regrouper la rÃ©partition racialedans un rayon de 200 mÃštres de la ligne du train A.
+Let's summarize the racial make-up of within 200 meters of the A-train line.
 
 .. code-block:: sql
@@ -177,12 +177,12 @@
    42.0805466940877366 | 23.0936148851067964 |     185259
 
-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.
-
-Jointres avancÃ©es
------------------
-
-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 ?
-
-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.
+So the racial make-up along the A-train isn't radically different from the make-up of New York City as a whole. 
+
+Advanced Join
+-------------
+
+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?
+
+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.
 
 .. code-block:: sql
@@ -195,5 +195,5 @@
       ('7');
 
-Maintenant nous pouvons joindre les tables des lignes de mÃ©tros Ã  notre requÃªte prÃ©cÃ©dente.
+Now we can join the table of subway lines onto our original query.
 
 .. code-block:: sql
@@ -239,20 +239,20 @@
 
 
-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.
-
-Liste de fonctions
-------------------
-
-`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 de A.
-
-`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Ã©. 
-
-`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). 
-
-`round(v numeric, s integer) <http://www.postgresql.org/docs/7.4/interactive/functions-math.html>`_: fonction de PostgreSQL qui arrondit Ã  s dÃ©cimales.
-
-`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.
-
-`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.
+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.
+
+Function List
+-------------
+
+`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.
+
+`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. 
+
+`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). 
+
+`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
+
+`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.
+
+`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.
 
 .. rubric:: Footnotes
Index: /trunk/workshop-foss4g/joins_exercises.rst
===================================================================
--- /trunk/workshop-foss4g/joins_exercises.rst	(revision 30)
+++ /trunk/workshop-foss4g/joins_exercises.rst	(revision 20)
@@ -1,23 +1,23 @@
 .. _joins_exercises:
 
-Partie 13 : exercice jointures spatial
-=======================================
+Section 13: Spatial Joins Exercises
+===================================
 
-Voici un petit rappel de certaines des fonctions vues prÃ©cÃ©demment. Astuce: elles pourraient Ãªtre utiles pour les exercices !
+Here's a reminder of some of the functions we have seen.  Hint: they should be useful for the exercises!
 
- * :command:`sum(expression)` agrÃ©gation retournant la somme d'un ensemble
- * :command:`count(expression)` agrÃ©gation retournant le nombre d'Ã©lÃ©ments d'un ensemble
+* :command:`sum(expression)`: aggregate to return a sum for a set of records
+* :command:`count(expression)`: aggregate to return the size of a set of records
 * :command:`ST_Area(geometry)` returns the area of the polygons
 * :command:`ST_AsText(geometry)` returns WKT ``text``
-* :command:`ST_Contains(geometry A, geometry B)` retourne vrai si la gÃ©omÃ©trie A contient la gÃ©omÃ©trie B 
-* :command:`ST_Distance(geometry A, geometry B)` retourne la distance minimum entre deux gÃ©omÃ©tries
-* :command:`ST_DWithin(geometry A, geometry B, radius)` retourne vrai si la A est distante d'au plus radius de B
+* :command:`ST_Contains(geometry A, geometry B)` returns the true if geometry A contains geometry B 
+* :command:`ST_Distance(geometry A, geometry B)` returns the minimum distance between geometry A and geometry B
+* :command:`ST_DWithin(geometry A, geometry B, radius)` returns the true if geometry A is radius distance or less from geometry B
 * :command:`ST_GeomFromText(text)` returns ``geometry``
 * :command:`ST_Intersects(geometry A, geometry B)` returns the true if geometry A intersects geometry B
 * :command:`ST_Length(linestring)` returns the length of the linestring
-* :command:`ST_Touches(geometry A, geometry B)` retourne vrai si le contour extÃ©rieur de A touche B
-* :command:`ST_Within(geometry A, geometry B)` retourne vrai si A est hors de B
-
-Souvenez-vous des tables Ã  notre disposition : 
+* :command:`ST_Touches(geometry A, geometry B)` returns the true if the boundary of geometry A touches geometry B
+* :command:`ST_Within(geometry A, geometry B)` returns the true if geometry A is within geometry B
+ 
+Also remember the tables we have available:
 
  * ``nyc_census_blocks`` 
@@ -37,8 +37,8 @@
    * name, boroname, the_geom
 
-Exercices
+Exercises
 ---------
 
- * **"Quelle station de mÃ©tros se situe dans le quartier 'Little Italy' ? Quelle est l'itinÃ©raire de mÃ©tros Ã  emprunter ?"**
+ * **"What subway station is in 'Little Italy'? What subway route is it on?"**
  
    .. code-block:: sql
@@ -56,5 +56,5 @@
      Spring St | 6
      
- * **"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')
+ * **"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')
  
    .. code-block:: sql
@@ -88,6 +88,7 @@
    .. note::
   
-     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.    
- * **"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 ?"**
+     We used the ``DISTINCT`` keyword to remove duplicate values from our result set where there were more than one subway station in a neighborhood.
+    
+ * **"After 9/11, the 'Battery Park' neighborhood was off limits for several days. How many people had to be evacuated?"**
  
    .. code-block:: sql
@@ -103,5 +104,5 @@
      9928
     
- * **"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 un km^2.)
+ * **"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.)
  
    .. code-block:: sql
