Postgis/PostgreSQL

最后更新

2019-11-21

Postgis/PostgreSQL

PostGIS 在空间上启用开源 PostgreSQL 数据库。

这个 PostGIS wiki page 可能包括其他信息。

数据访问/连接方法

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)
  ...

如果你没有司机,你可能想试试 FWToolsMS4W 包,其中包括驱动程序。

一旦您有了驱动程序,就可以尝试在数据库上使用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

和测试 Sp2IMG 应生成以下地图图像:

../../_images/circularstring.png

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

和测试 Sp2IMG 应生成以下地图图像:

../../_images/compoundcurve.png

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

和测试 Sp2IMG 应生成以下地图图像:

../../_images/curvepolygon.png

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

和测试 Sp2IMG 应生成以下地图图像:

../../_images/multicurve.png

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

和测试 Sp2IMG 应生成以下地图图像:

../../_images/multisurface.png

使用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