JOIN

描述

联接是在 LAYER 对象。重要的是要理解连接是 ONLY 处理完查询后可用。不能使用联接来影响地图的外观。主要目的是为编码数据(例如1=>林)启用查找表,但还有其他可能的用途。

支持的格式

  • DBF/XBASE文件

  • csv(逗号分隔的文本文件)

  • PostgreSQL 表

  • mysql 表

Mapfile 参数:

CONNECTION [string]

联接表的数据库连接所需的参数(dbf或csv联接不需要)。以下是连接示例 PostgreSQL

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

postgresql, csv, mysql.

FOOTER [filename]

发送层的一组结果后使用*的模板。换言之,此标题HTML将显示在“template”HTML的内容之后。

FROM [column]

联接数据集中的列。这是区分大小写的。

HEADER [filename]

发送层的结果集之前使用*的模板。换言之,此标题HTML将显示在“template”HTML的内容之前。

NAME [string]

此联接的唯一名称。必修的。

表[文件名表名]

对于基于文件的联接,这是要联接到的Xbase或逗号分隔文件(相对于 Mapfile 的位置)的名称。对于PostgreSQL支持,这是要加入的PostgreSQL表的名称。

模板[文件名]

用于一对多联接的模板。每个记录对模板进行一次处理,并且只能包含已联接表中列的替换。请参阅模板中联接表中的列,如[join name_column name],其中join name是为联接对象指定的名称。

TO [列]

要联接的表中的联接列。这是区分大小写的。

TYPE [ONE-TO-ONE|ONE-TO-MANY]

联接的类型。默认为一对一。

示例1:从形状数据集连接到DBF文件

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)

模板

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

示例2:从形状数据集到PostgreSQL表的联接

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)

模板

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

示例3:从形状数据集连接到csv文件

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

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

注解

csv驱动程序当前不从第一行读取列名。它只使用索引(1,2,…n)参考各列。可以将列名称保留为第一行,因为它们可能与任何内容都不匹配,但未被使用。通常,您会在连接块中看到类似于“1”的内容。然后在模板中使用[名称_1]、[名称_2]等…

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)

Template (prov.html)

理想情况下,模板应如下所示:

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

但是,由于csv文件不支持属性名(请参见上面的注释),因此必须使用以下内容:

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

示例4:从形状数据集连接到MySQL

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

示例5:一对多联接

在“一对多”类型的联接中,“join”对象需要包含“template”。此“template”用于联接表中的每个匹配记录。连接表中的列是使用<join_name>uuu column_name>引用的。使用<column_name>引用层表中的列。

对于一对多联接,“layer``template`文件必须包含对“join”对象的引用,如下所示:【join_uu<join_name>】。

在本例中,假设join table many.dbf除了join列(ident)之外还包含manyfield1和manyfield2列。

层对象:

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

模板OneTomany_header.html::

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

模板OneTomany.html::

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

模板OneTomany_join.html::

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

模板OneTomany_footer.html::

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