JOIN¶
支持的格式¶
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>