本文包含以下内容:

  1. 关于 PostGIS
  2. Greenplum 数据库中的PostGIS 扩展
  3. 提供PostGIS能力
  4. 升级Greenplum的PostGIS扩展
  5. 迁移PostGIS 1.4到2.0
  6. 使用
  7. PostGIS 功能和限制

1. 关于 PostGIS

关于PostGIS的介绍,本文不再赘述,请参考本公众号相关专题文章。

2. Greenplum 数据库中的PostGIS 扩展

可从Pivotal Network网站(https://network.pivotal.io )获得Greenplum数据库PostGIS扩展。可以使用Greenplum软件包管理器(gppkg)安装它。 有关详细信息,请参见《 Greenplum数据库实用程序指南》中的gppkg。

  • Greenplum数据库4.3支持PostGIS扩展软件包2.0版(PostGIS 2.0.3)。
    Greenplum数据库4.2.6和更高版本支持PostGIS扩展包版本1.0和2.0(PostGIS 1.4和2.0.3)
  • 在Greenplum数据库的安装中,只能安装PostGIS扩展软件包的一个版本(1.0或2.0)。
  • 4.2.6之前的Greenplum数据库支持PostGIS扩展软件包版本1.0(PostGIS 1.4)。

重要说明:由于引入了Pivotal Query Optimizer,用于Greenplum Database 4.3.4.x和更早版本的扩展程序包与Greenplum Database 4.3.5.0和更高版本不兼容。
另外,用于Greenplum数据库4.3.5.0和更高版本的扩展程序包与Greenplum数据库4.3.4.x和更早版本不兼容。
要将扩展包与Greenplum Database 4.3.5.0及更高版本一起使用,必须安装和使用为Greenplum Database 4.3.5.0及更高版本构建的Greenplum Database扩展包(gppkg文件和contrib模块)。 对于与Greenplum Database 4.3.4.x及更早版本一起使用的自定义模块,必须重建与Greenplum Database 4.3.5.0及更高版本一起使用的模块。

从1.4.2开始的2.0.3的主要增强和更改包括:

  • Support for geographic coordinates (latitude and longitude) with a GEOGRAPHY type and related functions.
  • Input format support for these formats: GML, KML, and JSON
  • Unknown SRID changed from -1 to 0
  • 3D relationship and measurement support functions
  • Making spatial indexes 3D aware
  • KNN GiST centroid distance operator
  • Many deprecated functions are removed
  • Performance improvements

警告:PostGIS 2.0删除了许多已过时但在PostGIS 1.4中可用的功能。 使用PostGIS 1.4中已弃用的函数编写的函数和应用程序可能需要重写。 有关新功能,增强功能或已更改功能的列表,请参见PostGIS文档:
http://postgis.net/docs/manual-2.0/PostGIS_Special_Functions_Index.html#NewFunctions

Greenplum数据库不支持的PostGIS特性:

  • 拓扑
  • 栅格
  • 少数用户定义的函数和集合
  • PostGIS长事物支持
  • 几何和地理类型修改
3. 提供PostGIS能力

安装PostGIS扩展软件包后,可以为每个需要使用PostGIS的数据库启用PostGIS支持。 要启用支持,请在目标数据库中运行PostGIS软件包随附的启动器SQL脚本。
对于PosgGIS 1.4,启用程序脚本为postgis.sql

psql -f postgis.sql -d your_database

您的数据库现在已启用空间能力。
对于PostGIS 2.0.3,可以在目标数据库中运行两个SQL脚本postgis.sqlspatial_ref_sys.sql
例如:

psql -d mydatabase -f 
  $GPHOME/share/postgresql/contrib/postgis-2.0/postgis.sql
psql -d mydatabase -f 
  $GPHOME/share/postgresql/contrib/postgis-2.0/spatial_ref_sys.sql
4. 升级Greenplum的PostGIS扩展

如果从PostGIS扩展软件包2.0版(pv2.0)或更高版本升级,则必须在目标数据库中运行postgis_upgrade_20_minor.sql。 本示例升级PostGIS扩展软件包并运行脚本:

gppkg -u postgis-ossv2.0.3_pv2.0.1_gpdb4.3-rhel5-x86_64.gppkg

psql -d mydatabase -f $GPHOME/share/postgresql/contrib/postgis-2.0/postgis_upgrade_20_minor.sql
5. 迁移PostGIS 1.4到2.0

要将启用PostGIS的数据库从1.4迁移到2.0,必须执行PostGIS HARD UPGRADE。 硬升级包括转储已启用PostGIS 1.4的数据库并将该数据库的数据加载到已启用PostGIS 2.0的新数据库。

有关PostGIS 手动过程的信息,请参见PostGIS文档:http://postgis.net/docs/manual-2.0/postgis_installation.html#hard_upgrade

6. 使用

以下示例SQL语句创建非OpenGIS表和几何。

CREATE TABLE geom_test ( gid int4, geom geometry, 
  name varchar(25) );
INSERT INTO geom_test ( gid, geom, name )
  VALUES ( 1, 'POLYGON((0 0 0,0 5 0,5 5 0,5 0 0,0 0 0))', '3D Square');
INSERT INTO geom_test ( gid, geom, name ) 
  VALUES ( 2, 'LINESTRING(1 1 1,5 5 5,7 7 5)', '3D Line' );
INSERT INTO geom_test ( gid, geom, name )
  VALUES ( 3, 'MULTIPOINT(3 4,8 9)', '2D Aggregate Point' );
SELECT * from geom_test WHERE geom &&
  Box3D(ST_GeomFromEWKT('LINESTRING(2 2 0, 3 3 0)'));

下面的示例SQL语句创建一个表,并向表中添加一个几何列,该列的SRID整数值引用了SPATIAL_REF_SYS表中的一个条目。 INSERT语句将添加到表的地理位置。

CREATE TABLE geotest (id INT4, name VARCHAR(32) );
SELECT AddGeometryColumn('geotest','geopoint', 4326,'POINT',2);
INSERT INTO geotest (id, name, geopoint)
  VALUES (1, 'Olympia', ST_GeometryFromText('POINT(-122.90 46.97)', 4326));
INSERT INTO geotest (id, name, geopoint)|
  VALUES (2, 'Renton', ST_GeometryFromText('POINT(-122.22 47.50)', 4326));
SELECT name,ST_AsText(geopoint) FROM geotest;

空间索引
PostgreSQL支持GiST空间索引。
GiST方案甚至可以在大型对象上提供索引。
它使用有损索引编制系统,其中较小的对象充当索引中较大对象的代理。
在PostGIS索引系统中,所有对象都将其边界框用作索引中的代理。

建立空间索引
可以按以下方式构建GiST索引:

CREATE INDEX indexname
ON tablename
USING GIST ( geometryfield );
7. PostGIS 功能和限制

Greenplum数据库PostGIS扩展不支持以下功能:

  • 拓扑结构
  • 栅格

支持的数据类型:

  • box2d
  • box3d
  • geometry
  • geography
  • spheroid

支持的索引

Greenplum数据库PostGIS扩展支持GiST(通用搜索树)索引。

PostGIS扩展限制
本节列出了Greenplum数据库PostGIS扩展限制,包括用户定义函数(UDF),数据类型和集合。

Greenplum数据库不支持与PostGIS拓扑或栅格功能相关的数据类型和功能,例如TopoGeometry和ST_AsRaster
不支持ST_Estimated_Extent函数。该功能需要表列统计信息来显示Greenplum数据库无法提供的用户定义数据类型。
不支持ST_GeomFromGeoJSON函数。该功能需要JSON支持。 Greenplum数据库不支持JSON。
Greenplum数据库不支持以下PostGIS聚合:

  • ST_MemCollect
  • ST_MakeLine

在具有多个细分的Greenplum数据库上,如果重复调用多次,则聚合可能会返回不同的答案。

Greenplum数据库不支持PostGIS长事务。

PostGIS依赖触发器和PostGIS表public.authorization_table来提供长期事务支持。当PostGIS尝试获取长交易的锁时,Greenplum数据库会报告错误,指出该函数无法访问关系authorization_table

Greenplum数据库不支持用户定义类型的类型修饰符。
解决方法是将AddGeometryColumn函数用于PostGIS几何对象。例如,无法使用以下SQL命令创建具有PostGIS几何形状的表

CREATE TABLE geometries(id INTEGER, geom geometry(LINESTRING));

使用AddGeometryColumn函数将PostGIS几何添加到表中。 例如,以下这些SQL语句创建一个表并将PostGIS几何添加到表中:

CREATE TABLE geometries(id INTEGER);
SELECT AddGeometryColumn('public', 'geometries', 'geom', 0, 'LINESTRING', 2);