JOIN

描述

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

支持的格式

  • DBF/XBASE文件

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

  • PostgreSQL表

  • mysql表

映射文件参数:

连接[字符串]

联接表的数据库连接所需的参数(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.

从[栏目]

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

头[文件名]

模板使用 before TEMPLATE

名称[字符串]

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

表[文件名表名]

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

模板[文件名]

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

到[列]

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

类型[一对一一对多]

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

示例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)

模板(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:一对多联接

ONE-TO-MANY, 这个 JOIN TEMPLATE. 这个 TEMPLATE

LAYER JOIN

在本例中,假设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>