写点什么

震惊,PostGIS 还可以这样用!!!

发布于: 2021 年 05 月 31 日

​​​​摘要: PostGIS 为 PostgreSQL 提供了空间数据库分析能力,是目前业界主流的地理数据库之一,提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符等。在 GaussDB 中,目前已支持 PostGIS 地理数据库扩展,并已广泛应用于国内外公安、农业、安平等政企客户。


本文分享自华为云社区《震惊,PostGIS还可以这样用!!!》,原文作者:秋之语  。

一、地理数据库能做什么 


地理数据库属于空间数据库,为地理数据提供了标准的格式和存贮方法,能够方便迅速地进行检索、更新和数据分析,最终达到为多种应用服务的目的。地理数据则包括观测数据、分析测定数据、遥感数据和统计调查数据。地理数据库已广泛的应用于单车、导航,旅游、水利,农业、安平城市等应用场景,渗透到人民生活点点滴滴中。


图 1. 地理数据库典型应用场景

二、PostGIS 功能介绍


对于如上介绍的使用场景中,地理数据通常存储为点、线或者多边形的集合。在 PostgreSQL 中,已经提供了点、线、多边形等空间数据类型,但其提供的数据处理方法和性能很难达到 GIS 的要求,主要表现在:缺乏复杂的空间类型;没有提供空间分析;没有提供投影变换功能。为了使得 PostgreSQL 更好的提供空间信息服务,PostGIS 也就应运而生。


2.1 PostGIS 支持数据类型


PostGIS 完全遵循 OpenGIS 规范,支持 OpenGIS 中所有空间数据类型:


a.POINT, LINESTRING,POLYGON, MULTI-POINT,

b.MULTI-LINESTRING,MULTI-POLYGON,

c.GEOMETRY COLLECTION


除了 OpenGIS 定义的地理数据类型之外,PostGIS 还对数据类型进行了扩展,在 WKT 和 WKB 数据类型基础上扩展出 EWKT 和 EWKB 数据类型:


a.EWKT, EWKB(包含了 SRID 信息的 WKT/WKB)

b.SRID(SpatialReferencing System Identifier):每个空间实例都有一个空间引用标识符 (SRID)。SRID 对应于基于特定椭圆体的空间引用系统,可用于平面球体映射或圆球映射。


此外,PostGIS 还支持栅格数据 raster 分析,可以基于已有的影像或者卫星数据,实现影像或者卫星数据不同类别的统计分析。

 

2.2 PostGIS 支持函数类型


PostGIS 常见函数大致可以分为以下六类,对于各函数具体用法参考《PostGIS使用手册》


1.    字段处理函数

a.AddGeometryColumn 为已有的数据表增加一个地理几何数据字段;

b.DropGeometryColumn 删除一个地理数据字段的;

c.ST_SetSRID 设置 SRID 值


2.    几何关系函数

这类函数描述几何对象的距离、包含、范围、相等等几何关系,常见函数如下:ST_Distance、ST_Equals、ST_Disjoint、ST_Intersects、ST_Touches、ST_Within、 ST_Overlaps、ST_Contains。


3.    读写函数

这类函数主要用于各种数据类型之间的转换,尤其是 Geometry 数据类型与其他字符型等数据类型之间的转换,如 ST_AsText、ST_GeomFromText、ST_AsGeoJSONST_AsHEXEWKB、ST_AsKML、 ST_AsLatLonText。


4.    几何对象创建函数

这类函数用于点、线、多变形等几何对象创建,如 ST_GeomFromEWKT、ST_GeomFromEWKB、ST_MakePoint、ST_MakeBox2D、ST_LineFromText、ST_Polygon。


5.    几何对象编辑函数

这类函数提供对几何图像的平移、翻转、旋转、放大等功能,如 ST_AddPoint、ST_Reverse、ST_Rotate、ST_Scale、ST_Snap、ST_Transform、ST_Translate、ST_TransScale。


6.    空间关系及测量函数

这类函数实现几何对象最远、最近、长度、面积等计算,如 ST_3DClosestPoint、ST_3DDistance、 ST_3DDWithin、ST_3DDFullyWithin、ST_3DIntersects、ST_3DLongestLine、ST_3DMaxDistance、ST_3DShortestLine、ST_Area。

三、PostGIS 的安装:

         

3.1 基础编译环境准备:

         

GaussDB(DWS)中的 PostGISExtension 需使用 GCC 和 G++工具进行编译安装。安装前需确认 GCC 和 G++版本号大于等于 4.8.5,且两个工具可正常使用。具体可通过 gcc-v 和 g++-v 查看相关版本。



​如上图所示环境 gcc 和 g++版本为 4.3.4,不满足版本要求,需使用源码安装方式进行升级。若集群中没有低版本 gcc 和 g++编译器,可以通过挂载操作系统镜像进行安装,这里不做赘述。如需要升级则可从如下网站获取 GCC 相关安装包:


https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz

https://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.gz

https://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.gz

https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz


此外 PostGIS 安装还需要确保 zlib、autoconf 和 automake 等工具已正确安装。

       

3.2 PostGIS 依赖库安装:

       

PostGIS 依赖 Geos、 Proj、 JSON-C、 Libxml2、 Gdal 第三方开源工具。安全前首先需要下载 Geos、 Proj、 JSON-C、 Libxml2、 Gdal、 PostGIS 源码至 $GAUSSHOME 目录。

       

安装时需切换至 omm 用户,并检查 GaussDB 环境变量已正确加载,且可正常登录和使用 GaussDB 环境。具体安装命令可参考产品文档,且确保安装路径与文档中给定路径完全一致,自定义路径会导致最终库文件分发失败。

       

在整个安装过程中,可使用 make -sj 和 make install -sj 命令并行加速编译,-sj 命令极低概率性出现安装错误,如果安装失败则请使用 make 和 make install 进行串行安装。此外对于 ARM 物理机,在每个安装包 configure 时需要增加如下编译参数: --build=aarch64-unknown-linuxgnu,否则会出现安装失败。同时,在三方开源库 proj 的安装过程中,可能会报错 $GAUSSHOME/install/proj/bin 目录不存在,可手动创建该目录再执行 proj 的安装。

       

安装成功后截图大致如下,其中关于 get_PlatForm_str.sh 不存在的提示信息可直接忽略。



​安装完成后则需要使用 PostGIS_install.sh 工具完成 PostGIS 相关动态链接库在集群节点中的分发。执行方式为:

sh$GAUSSHOME/share/postgis/PostGIS_install.sh

       

如若失败,可打开 PostGIS_install.sh 文件分别执行分发命令,确定是哪个文件不存在而导致分发失败,并进一步分析该库文件编译失败原因。

四、PostGIS 使用:

       

目前 GaussDB 对 PostGIS 中绝大多数函数均已支持下推至 DN 处理。因此对于绝大多数地理数据运算,都可以充分利用 GaussDB 的分布式计算优势,带来相比于 PostgreSQL 近似线性扩展比的性能加速。

       

4.1 地理数据的导入:

       

PostGIS 支持 shape 格式地理数据导入。因此对于其它地理数据库平台数据,如 Oracle 或者 ArcGIS 中的地理数据,可先将其导出为 shape 格式文件,然后使用 $GAUSSHOME/bin 目录下的 shp2pgsql 工具将 shape 文件转换为 sql 文件并进一步导入 GaussDB。如果生成 sql 文件中的地理表定义缺少分布键的话,可以手动增加一个 id 自增的分布键,使地理数据均匀分布到各个 DN,进而充分利用 GaussDB 的分布式计算优势。

     

4.2 GIS 函数使用 demo:

       

对于 GaussDB 支持各 GIS 函数的具体使用方法,请参考《 PostGIS-2.4.2用户手册》。这里给一个简单的使用 demo。

       

示例 1 :几何表的创建。

      

CREATETABLE cities ( id integer, city_name varchar(50) );
SELECTAddGeometryColumn('cities', 'position', 4326, 'POINT', 2); 
复制代码


示例 2:几何数据的插入。

    

INSERTINTO cities (id, position, city_name) VALUES (1,ST_GeomFromText('POINT(-9.523)',4326),'CityA');
INSERTINTO cities (id, position, city_name) VALUES (2,ST_GeomFromText('POINT(-10.640.3)',4326),'CityB');
INSERTINTO cities (id, position, city_name) VALUES (3,ST_GeomFromText('POINT(20.830.3)',4326), 'CityC');   
复制代码


示例 3:计算三个城市间任意两个城市距离。


SELECTp1.city_name,p2.city_name,ST_Distance(p1.position,p2.position) FROM cities ASp1, cities AS p2 WHERE p1.id > p2.id;
复制代码

       

执行结果为:



​示例 4:查询 query 执行计划,发现执行过程中 p1 表是广播到全部 DN 节点的,因此对于每个 DN,其只需要处理自己节点上的 p2 数据,通过对比本地 p2 数据与全局 p1 数据即可完成整个分析,这也是分布式数据库的优势所在。



五、PostGIS 性能介绍


目前市场上的空间数据库包括 MySQL 的 Spatial Extension、PostgreSQL 的 PostGIS、Oracle Spatial、ArcGIS 的 ArcSDE 及 MongoDB 等。对于这几款数据库的性能对比,之前有一篇文档《常用地理数据库对比测试》有一个比较详细的对比和介绍。


从图 2 至图 5 中的测试数据可以看出,对于点数据,在相同查询条件下,PostGIS 数据库的空间查询速度最快。对于线数据,PostGIS 则相比于其它数据库要慢一些,这可能与不同地理数据库使用不同索引技术有关。


图 2. 第一次点查数据结果


图 3. 第二次点查数据结果


图 4. 第一次线查数据结果


图 5. 第二次线查数据结果

GaussDB 作为分布式数据库,对 PostGIS 做了深度适配。目前 GaussDB 对 PostGIS 中绝大多数函数均已支持下推至 DN 处理。因此对于绝大多数地理数据运算,都可以充分利用 GaussDB 的分布式计算优势,带来相比于 PostgreSQL 近似线性扩展比的性能加速,满足客户在大数据场景的地理数据处理和分析需求。

六、总结

       

本篇博文简单介绍了 GaussDB 中 Postgis 的安装和使用,欢迎广大读者收藏和讨论。

想了解 GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后台还可获取众多学习资料~


点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 05 月 31 日阅读数: 326
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
震惊,PostGIS还可以这样用!!!