Postgis/PostgreSQL¶
- 最后更新
2019-11-21
目录
数据访问/连接方法¶
Postgis由MapServer直接支持,必须编译到MapServer才能工作。
PostgreSQL客户端库(libpq.so或libpq.dll)必须存在于系统的路径环境中,才能提供功能。
connectionType参数必须设置为postgis。
连接参数用于指定连接到数据库的参数。连接参数可以是任意顺序。大多数是可选的。需要dbname。用户是必需的。主机默认为localhost,端口默认为5432(PostgreSQL的标准端口)。
数据参数用于指定用于绘制地图的数据。数据的形式是“[表名SQL U子查询]中的[几何体_列]使用唯一的[唯一的_键]使用srid=[空间_引用_id]”。绘制功能时,“使用唯一”和“使用srid=”子句是可选的,但使用它们可以提高性能。如果要对PostGIS层进行MapServer查询调用,则数据参数必须包含“using unique”。省略它将导致查询失败。
下面是一个简单的通用示例:
CONNECTIONTYPE POSTGIS
CONNECTION "host=yourhostname dbname=yourdatabasename user=yourdbusername
password=yourdbpassword port=yourpgport"
DATA "geometrycolumn from yourtablename"
此示例显示如何在数据行中指定唯一键和srid:
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=yourdatabasename user=yourdbusername"
DATA "the_geom from the_database using unique gid using srid=4326"
此示例显示如何使用SQL子查询在数据库内执行联接并将结果映射到MapServer。注意语句中的“as subquery”字符串——从“from”到“using”之间的所有内容都将发送到数据库进行评估:
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=yourdatabasename user=yourdbusername"
DATA "the_geom from (select g.gid, g.the_geom, a.attr1, a.attr2 from
geotable g join attrtable a on g.gid = a.aid) as subquery
using unique gid using srid=4326"
此示例显示如何使用几何函数和数据库排序来限制返回到MapServer的要素和顶点的数量:
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=yourdatabasename user=yourdbusername"
DATA "the_geom from (select g.gid, ST_Simplify(g.the_geom, 10.0) as
the_geom from geotable g order by ST_Area(g.the_geom) desc
limit 10) as subquery using unique gid using srid=4326"
这个例子展示了的用法!盒子!替换字符串以覆盖SQL中映射边界框的默认包含。默认情况下,空间框子句将附加到数据子句中的SQL,但您可以使用!盒子!在语句中任意位置插入它。一般来说,您不需要使用!盒子!,因为PostgreSQL规划器将从生成的SQL生成最佳计划,但在某些情况下(复杂的子查询),通过放置可以生成更好的计划!盒子!靠近查询中间:
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=yourdatabasename user=yourdbusername"
DATA "the_geom from (select g.gid, ST_Union(g.the_geom, 10.0) as
the_geom from geotable g where ST_Intersects(g.geom,!BOX!)) as
subquery using unique gid using srid=4326"
Ogrinfo示例¶
可以使用ogrinfo直接从数据库中读取关于postgis表的元数据。
首先,应使用“--formats”命令确保GDAL/OGR构建包含PostgreSQL驱动程序:
>ogrinfo --formats
Loaded OGR Format Drivers:
...
-> "PGeo" (readonly)
-> "PostgreSQL" (read/write)
-> "MySQL" (read/write)
...
如果你没有司机,你可能想试试 FWTools 或 MS4W 包,其中包括驱动程序。
一旦您有了驱动程序,就可以尝试在数据库上使用ogrinfo命令来获取空间表列表:
>ogrinfo PG:"host=127.0.0.1 user=postgres password=postgres dbname=canada port=5432"
using driver `PostgreSQL' successful.
1: province (Multi Polygon)
现在使用ogrinfo获取有关空间表结构的信息:
>ogrinfo PG:"host=127.0.0.1 user=postgres password=postgres dbname=canada port=5432"
province -summary
INFO: Open of `PG:host=127.0.0.1 user=postgres password=postgres dbname=canada'
using driver `PostgreSQL' successful.
Layer name: province
Geometry: Multi Polygon
Feature Count: 1068
Extent: (-2340603.750000, -719746.062500) - (3009430.500000, 3836605.250000)
Layer SRS WKT:
(unknown)
FID Column = gid
Geometry Column = the_geom
area: Real (0.0)
island: String (30.0)
island_e: String (30.0)
island_f: String (30.0)
name: String (30.0)
...
Mapfile 示例¶
LAYER
NAME "province"
STATUS ON
TYPE POLYGON
CONNECTIONTYPE POSTGIS
CONNECTION "host=127.0.0.1 port=5432 dbname=canada user=postgres password=postgres"
DATA "the_geom from province"
CLASS
...
END
END
有关Postgis和MapServer的更多信息,请参阅Postgis文档:http://postgis.net/documentation/
支持2.5d几何图形¶
除了水平坐标(X、Y或经度、纬度)之外,PostGIS还可以支持具有垂直分量的几何图形,通常称为2.5D几何图形。
从mapserver 7.0开始,如果mapserver是在-dwith_point_z_m=on上构建的,则会考虑这样的2.5d几何图形。
注解
WFS中2.5D几何图形的输出要求在层级别指定显式元数据项。见 WFS server 文档。
注解
通过设置以下处理选项,仍然可以强制仅从PostGIS检索二维几何图形
PROCESSING "FORCE2D=YES"
支持sql/mm曲线¶
PostGIS能够存储圆形内插曲线,作为SQL多媒体应用程序空间规范的一部分(阅读 SQL/MM specification )
有关Postgis支持的更多信息,请参见 SQL-MM Part 3 PostGIS文档中的部分,例如 here .
从mapserver 6.0开始,postgis的特点是可以通过mapserver直接绘制出循环字符串、复合曲线、曲线多边形、多曲线和多曲面。
示例1:MapServer中的循环字符串¶
以下是加载到PostGIS中的功能的已知文本:
INSERT INTO test ( g, id ) VALUES ( ST_GeomFromText('CIRCULARSTRING(0 0,
4 0, 4 4, 0 4, 0 0)', -1), 2);
MAPServer层的示例如下:
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "g from test using SRID=-1 using unique id"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
和测试 shp2img 应生成以下地图图像:
示例2:MapServer中的复合曲线¶
以下是加载到PostGIS中的功能的已知文本:
INSERT INTO test ( g, id ) VALUES ( ST_GeomFromText('COMPOUNDCURVE(
CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))', -1), 3);
MAPServer层的示例如下:
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "g from test using SRID=-1 using unique id"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
和测试 shp2img 应生成以下地图图像:
示例3:MapServer中的曲线多边形¶
以下是加载到PostGIS中的功能的已知文本:
INSERT INTO test ( g, id ) VALUES ( ST_GeomFromText('CURVEPOLYGON(
CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3,
3 1, 1 1))', -1), 4);
MAPServer层的示例如下:
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "g from test using SRID=-1 using unique id"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
和测试 shp2img 应生成以下地图图像:
示例4:MapServer中的多曲线¶
以下是加载到PostGIS中的功能的已知文本:
INSERT INTO test ( g, id ) VALUES ( ST_GeomFromText('MULTICURVE((0 0,
5 5),CIRCULARSTRING(4 0, 4 4, 8 4))', -1), 6);
MAPServer层的示例如下:
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "g from test using SRID=-1 using unique id"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
和测试 shp2img 应生成以下地图图像:
示例5:MapServer中的多曲面¶
以下是加载到PostGIS中的功能的已知文本:
INSERT INTO test ( g, id ) VALUES ( ST_GeomFromText('MULTISURFACE(
CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4,
0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10,
10 10),(11 11, 11.5 11, 11 11.5, 11 11)))', -1), 7);
MAPServer层的示例如下:
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "g from test using SRID=-1 using unique id"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
和测试 shp2img 应生成以下地图图像:
使用MapServer<6.0¶
如果无法升级到MapServer 6.0,则可以使用MapServer层中的postgis函数*st_curveToline()*绘制曲线(请注意,这要慢得多):
LAYER
NAME "curves_poly"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=postgres dbname=curves host=localhost port=5432"
DATA "wkb_geometry from (select c.id, ST_CurveToLine(c.g) as
wkb_geometry from c) as subquery using
unique id using SRID=-1"
CLASS
STYLE
COLOR 128 128 128
ANTIALIAS true
END
END
END
