Index: trunk/workshop-foss4g/joins.rst
===================================================================
--- trunk/workshop-foss4g/joins.rst	(revision 24)
+++ trunk/workshop-foss4g/joins.rst	(revision 25)
@@ -1,12 +1,12 @@
 .. _joins:
 
-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:
+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 : 
 
 .. code-block:: sql
@@ -27,12 +27,12 @@
    Broad St    | Financial District | 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.
+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.
 
 .. code-block:: sql
@@ -84,18 +84,18 @@
 
 
-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.
+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.
 
 .. note:: 
 
-   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.
+   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.
 
 .. code-block:: sql
@@ -114,9 +114,9 @@
 
 
-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.
+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.
 
 .. code-block:: sql
@@ -136,7 +136,7 @@
 .. note::
 
-   The ``DISTINCT`` keyword eliminates duplicate rows from the result.  Without the ``DISTINCT`` keyword, the query above identifies 491 results instead of 73.
+   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.
    
-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.
+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.
 
 .. code-block:: sql
@@ -158,5 +158,5 @@
   A,C,E
   
-Let's summarize the racial make-up of within 200 meters of the A-train line.
+Essayons de regrouper la répartition racialedans un rayon de 200 mètres de la ligne du train A.
 
 .. code-block:: sql
@@ -177,12 +177,12 @@
    42.0805466940877366 | 23.0936148851067964 |     185259
 
-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.
+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.
 
 .. code-block:: sql
@@ -195,5 +195,5 @@
       ('7');
 
-Now we can join the table of subway lines onto our original query.
+Maintenant nous pouvons joindre les tables des lignes de métros à notre requête précédente.
 
 .. code-block:: sql
@@ -239,20 +239,20 @@
 
 
-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.
+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.
 
 .. rubric:: Footnotes
