JOIN

Description

Les jointures sont définies au sein d’un objet LAYER. Il est important de comprendre que les jointures sont UNIQUEMENT disponibles une fois qu’une requête a été exécutée. Vous ne pouvez pas utiliser les jointures pour modifier l’apparence d’une carte. L’objectif principal est de permettre de lier une table à des données codées (par exemple 1 => Forêt) mais d’autres utilisations sont possibles.

Formats gérés

  • fichiers DBF/XBase

  • CSV (Fichier texte délimité par des virgules)

  • tables PostgreSQL et PostGIS

  • tables MySQL

Paramètres du Mapfile

CONNECTION [string]

Paramètres nécessaires pour effectuer la jointure sur une base de données (non nécessaires pour des jointures vers DBF ou CSV). L’exemple suivant est pour PostgreSQL :

CONNECTION "host=127.0.0.1 port=5432 user=pg password=pg dbname=somename"
CONNECTIONTYPE POSTGRESQL
CONNECTIONTYPE [csv|mysql|postgresql]

Type de connexion (non nécessaire pour des jointures vers DBF). Pour PostgreSQL, utiliser postgresql, pour CSV, csv, pour MySQL, mysql.:

FOOTER [filename]

Modèle (“template”) à utiliser après qu’un jeu de résultats de couche ait été envoyé. En d’autres termes, l’en-tête HTML sera affiché après le contenu du modèle TEMPLATE HTML.

FROM [column]
Join column in the dataset. This is case sensitive.
HEADER [filename]

Modèle (“template”) à utiliser avant qu’un jeu de résultats de couche ait été envoyé. En d’autres termes, l’en-tête HTML sera affiché après le contenu du modèle TEMPLATE HTML.

NAME [string]

Nom unique de cette jointure. Obligatoire.

TABLE [filename|tablename]

Pour les jointures basées sur des fichiers, c’est le nom du XBase ou du fichier délimité (relatif à l’emplacement du mapfile) à joindre avec (TO). Pour le support de PostgreSQL, c’est le nom de la table PostgreSQL à joindre avec (TO)

TEMPLATE [filename]
Template to use with one-to-many joins. The template is processed once for each record and can only contain substitutions for columns in the joined table. Refer to the column in the joined table in your template like [joinname_columnname], where joinname is the NAME specified for the JOIN object.
TO [column]
Join column in the table to be joined. This is case sensitive.
TYPE [ONE-TO-ONE|ONE-TO-MANY]

Le type de jointure. Par défaut 1-1.

Exemple 1 : jointure d’un fichier SHP et d’un fichier DBF

Couche de Mapfile

LAYER
  NAME "prov_bound"
  TYPE POLYGON
  STATUS DEFAULT
  DATA "prov.shp"
  CLASS
    NAME "Province"
    STYLE
      OUTLINECOLOR 120 120 120
      COLOR 255 255 0
    END
  END
  TEMPLATE "../htdocs/cgi-query-templates/prov.html"
  HEADER "../htdocs/cgi-query-templates/prov-header.html"
  FOOTER "../htdocs/cgi-query-templates/footer.html"
  JOIN
    NAME "test"
    TABLE "../data/lookup.dbf"
    FROM "ID"
    TO "IDENT"
    TYPE ONE-TO-ONE
  END
END # layer

Ogrinfo

>ogrinfo lookup.dbf lookup -summary
INFO: Open of `lookup.dbf'
using driver `ESRI Shapefile' successful.

Layer name: lookup
Geometry: None
Feature Count: 12
Layer SRS WKT:
(unknown)
IDENT: Integer (2.0)
VAL: Integer (2.0)
>ogrinfo prov.shp prov -summary
INFO: Open of `prov.shp'
using driver `ESRI Shapefile' successful.

Layer name: prov
Geometry: Polygon
Feature Count: 12
Extent: (-2340603.750000, -719746.062500) - (3009430.500000, 3836605.250000)
Layer SRS WKT:
(unknown)
NAME: String (30.0)
ID: Integer (2.0)

Modèle

<tr bgcolor="#EFEFEF">
  <td align="left">[NAME]</td>
  <td align="left">[test_VAL]</td>
</tr>

Exemple 2 : jointure d’un fichier SHP et d’une table PostgreSQL

Couche de Mapfile

LAYER
  NAME "prov_bound"
  TYPE POLYGON
  STATUS DEFAULT
  DATA "prov.shp"
  CLASS
    NAME "Province"
    STYLE
      OUTLINECOLOR 120 120 120
      COLOR 255 255 0
    END
  END
  TOLERANCE 20
  TEMPLATE "../htdocs/cgi-query-templates/prov.html"
  HEADER "../htdocs/cgi-query-templates/prov-header.html"
  FOOTER "../htdocs/cgi-query-templates/footer.html"
  JOIN
    NAME "test"
    CONNECTION "host=127.0.0.1 port=5432 user=pg password=pg dbname=join"
    CONNECTIONTYPE postgresql
    TABLE "lookup"
    FROM "ID"
    TO "ident"
    TYPE ONE-TO-ONE
  END
END # layer

Ogrinfo

>ogrinfo -ro PG:"host=127.0.0.1 port=5432 user=pg password=pg dbname=join"
             lookup -summary
INFO: Open of `PG:host=127.0.0.1 port=5432 user=pg password=pg dbname=join'
using driver `PostgreSQL' successful.

Layer name: lookup
Geometry: Unknown (any)
Feature Count: 12
Layer SRS WKT:
(unknown)
ident: Integer (0.0)
val: Integer (0.0)

Modèle

<tr bgcolor="#EFEFEF">
  <td align="left">[NAME]</td>
  <td align="left">[test_val]</td>
</tr>

Exemple 3 : jointure d’un fichier SHP et d’un fichier CSV

Couche de Mapfile

LAYER
  NAME "prov_bound"
  TYPE POLYGON
  STATUS DEFAULT
  DATA "prov.shp"
  CLASS
    NAME "Province"
    STYLE
      OUTLINECOLOR 120 120 120
      COLOR 255 255 0
    END
  END
  TOLERANCE 20
  TEMPLATE "../htdocs/cgi-query-templates/prov.html"
  HEADER "../htdocs/cgi-query-templates/prov-header.html"
  FOOTER "../htdocs/cgi-query-templates/footer.html"
  JOIN
    NAME "test"
    CONNECTIONTYPE CSV
    TABLE "../data/lookup.csv"
    FROM "ID"
    #TO "IDENT"  # see note below
    TO "1"       # see note below
    TYPE ONE-TO-ONE
  END
END # layer

Structure du fichier CSV

"IDENT","VAL"
1,12
2,11
3,10
4,9
5,8
6,7
7,6
8,5
9,4
10,3
11,2
12,1

Note

Le pilote CSV ne supporte pas pour le moment la lecture des noms de colonnes de la première ligne. Il utilise juste les index (1, 2, ... n) pour référencer les colonnes. C’est tout à fait possible de laisser les noms de colonnes dans la première ligne comme il y a peu de chances qu’elles correspondent à quoi que ce soit. Typiquement, vous verrez quelque chose du genre TO “1” dans le bloc JOIN. Alors dans le template, vous utiliserez [name_1], [name_2], etc...

Ogrinfo

>ogrinfo lookup.csv lookup -summary
INFO: Open of `lookup.csv'
using driver `CSV' successful.

Layer name: lookup
Geometry: None
Feature Count: 12
Layer SRS WKT:
(unknown)
IDENT: String (0.0)
VAL: String (0.0)

Modèle (prov.html)

Idéalement c’est ce à quoi le modèle devrait ressembler:

<!-- MapServer Template -->
<tr bgcolor="#EFEFEF">
  <td align="left">[NAME]</td>
  <td align="left">[test_VAL]</td>
</tr>

Mais comme les noms d’attributs ne sont pas supportés par les fichiers CSV (voir note ci-dessus), il faudra utiliser ce qui suit:

<!-- MapServer Template -->
<tr bgcolor="#EFEFEF">
  <td align="left">[NAME]</td>
  <td align="left">[test_2]</td>
</tr>

Exemple 4 : jointure d’un fichier SHP avec une table MySQL

Couche de Mapfile

LAYER
  NAME "prov_bound"
  TYPE POLYGON
  STATUS DEFAULT
  DATA "prov.shp"
  CLASS
    NAME "Province"
    STYLE
      OUTLINECOLOR 120 120 120
      COLOR 255 255 0
    END # style
  END # class
  TOLERANCE 20
  TEMPLATE "../htdocs/cgi-query-templates/prov.html"
  HEADER "../htdocs/cgi-query-templates/prov-header.html"
  FOOTER "../htdocs/cgi-query-templates/footer.html"
  JOIN
    NAME "mysql-join"
    CONNECTIONTYPE MYSQL
    CONNECTION 'server:user:password:database'
    TABLE "mysql-tablename"
    FROM "ID"
    TO "mysql-column"
    TYPE ONE-TO-ONE
  END # join
END # layer

Example 5: One-to-many join

In a join of type ONE-TO-MANY, the JOIN object needs to contain a TEMPLATE. This TEMPLATE is used for each matching record in the join table. Columns in the join table are referenced using <join_name>_<join_column_name>. Columns in the layer table are referenced using <column_name>.

For a one-to-many join, the LAYER TEMPLATE file has to contain a reference to the the JOIN object, as follows: [join_<join_name>].

In this example, it is assumed that the join table many.dbf contains the columns MANYFIELD1 and MANYFIELD2 in addition to the join column (IDENT).

Layer object:

LAYER
  NAME "joinonetomany"
  TYPE POLYGON
  STATUS DEFAULT
  DATA "prov.shp"
  CLASS
    NAME "Province"
    STYLE
      OUTLINECOLOR 120 120 120
      COLOR 255 255 0
    END # style
  END # class
  TEMPLATE "oneToMany.html"
  HEADER "oneToMany_header.html"
  FOOTER "oneToMany_footer.html"
  JOIN
    NAME "onetomanytest"
    TABLE "many.dbf"
    FROM "ID"
    TO "IDENT"
    TYPE ONE-TO-MANY
    TEMPLATE "oneToMany_join.html"
  END # join
END # layer

Template oneToMany_header.html:

<!-- MapServer Template -->
<html>
  <head><title>One to Many Join</title></head>
  <body>
    <h1>MapServer output</h1>
    <table>

Template oneToMany.html:

<!-- MapServer Template -->
      <tr>
        <td><strong>[ID]</strong></td>
        <td><table>
[join_onetomanytest]
        </table></td>
      </tr>

Template oneToMany_join.html:

<!-- MapServer Template -->
          <tr>
            <td>[NAME]</td>
            <td>[onetomanytest_MANYFIELD1]</td>
            <td>[onetomanytest_MANYFIELD2]</td>
          </tr>

Template oneToMany_footer.html:

<!-- MapServer Template -->
    </table>
  </body>
<html>