PostGIS的geometry类型及使用方法
作者:WuMY
PostGIS中矢量数据如何存储和构造,有哪些注意事项?其空间数据模型体系又遵循哪些标准规范?本文进行了详细介绍,并提供实操内容供读者参考。
此外,Yukon构建在PostGIS的基础能力之上(参见文章:Yukon及其模块简介 ),完全兼容PostGIS的矢量数据能力。
PostGIS的geometry数据类型
geometry是PostGIS的基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模型,并扩展实现了 SQL/MM ( ISO/IEC 13249-3 SQL Multimedia - Spatial ) Curver相关类型,定义了包含圆弧曲线的几何子对象类型 CircularString、 CompoundCurve、 CurvePolygon、MultiCurve、 MultiSurface。
OGC在 SFA( Simple Features Access Standard ) 中定义了几何对象的类型,其中包括原子类型的 Point、LineString、LinearRing 和 Polygon,以及集合类型 MultiPoint、MultiLineString、MultiPolygon 和 GeometryCollection。
以下为各几何对象的类型、构成及有效性限定:
对象分类 | 对象类型 | 描述 | 构成 | 有效性限定 |
---|---|---|---|---|
SFA简单对象 | POINT | 点 | 单点 | / |
MULTIPOINT | 多点 | 由n个点组成 | / | |
LINESTRING | 线,折线 | 由点串构成 | / | |
LINEARRING | 线环 | 由点串构成 | 首尾闭合,非自相交 | |
MULTILINESTRING | 点串 | 由n个线串组成 | / | |
POLYGON | 面 | 由n个首尾相交的线串组成 | 边缘为线环、内部为洞 | |
MULTIPOLYGON | 多面 | 由n个面组成 | 非覆盖、非相邻 | |
POLYHEDRALSURFACE | 多面体表面 | 由n个具有相邻边的Polygon组成 | 具有相邻边 | |
TRIANGLE | 三角形 | 由3个非共线顶点组成 | 首尾闭合、非共线 | |
TIN | 不规则三角网 | 由n个三角形组成 | 非覆盖 | |
SQL/MM参数化对象 | CIRCULARSTRING | 曲线串 | 用点串描述,三个点确定一段圆弧 | 前一个圆弧的最后一个点与后一个圆弧的第一个点共用;特别地,如果圆弧的第一个点与第三个点重合,则第二个点表示圆心,以此来表达圆形 |
COMPOUNDCURVE | 复合线 | 由 n 个部分组成,每个部分可以是LineString 或 CircularString | 前一部分的最后一个点与后续部分的第一个点重合,保证复合线对象的连续性 | |
CURVEPOLYGON | 曲面 | 由 n 个部分组成,每个部分是首尾相连的 CircularString 或 LineString 或 CompoundCurve | 与 Polygon 类似,都表达一个闭合的区域,区别在于是否有CircularString对象参与构造 | |
MULTICURVE | 多(曲)线 | 由 n 个子对象组成,每个子对象可以是CircularString 或 LineString 或 CompoundCurve | / | |
MULTISURFACE | 多面 | 由 n 个子对象组成,每个子对象可以是Polygon 或 CurvePolygon 类型 | 与 MultiPolygon类似,都表达多面对象,区别在于是否有CircularString对象参与构造 | |
GEOMETRYCOLLECTION | 复合对象 | 由n个任意子对象类型构成 | / | |
(注意:以上每种类型,可以指定是否带Z或M值。例如,点可以指定为:POINT、POINTZ、POINTM、POINTZM。)
geometry的对象构成关系
点线面几何对象的关系较为清晰,当加入新的类型 CircularString 后,衍生出带参数化对象的线和面,进而构成PostGIS的全部17种子类型,见下图:
geometry的元数据
PostGIS中geometry元数据存储在geometry_columns中,通过该表可以查询出当前数据库中有哪些表存储了geometry及geometry的类型、坐标系信息。
用户在创建geometry类型时,PostGIS自动维护该表,其定义遵循OGC SFSQL(Simple Features for SQL)规范。
geometry_columns的表结构及与其它表格的关联关系见下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aRhn004X-1647583326711)(./01_metadata.png)]
geometry_columns中字段信息描述如下:
- f_table_catalog,f_table_schema,和f_table_name提供各个几何图形(geometry)的要素表(feature table),即空间数据表 的完全限定名称,分别是数据库名、模式名、空间数据表名。
- f_geometry_column包含对应空间数据表中用于记录几何信息的属性列的列名。
- coord_dimension定义几何图形的维度(2维、3维或4维)
- srid会引用自spatial_ref_sys表的空间参考标识符
- type列定义了几何图形的类型。比如"点(Point)"和"线串(Linestring)"等类型。
示例数据通过SQL语句查看:
SELECT * FROM geometry_columns;
geometry构建示例
简单几何对象
Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon,构造示例如下:
--- 指定 srid 为 4326
CREATE TABLE testgeomobj (id serial, geom geometry NOT NULL);--- Point 对象,如下图id=1
insert into testgeomobj (geom) VALUES ('SRID=4326;POINT(-95.363151 29.763374)');--- MultiPoint 对象,如下图id=2
insert into testgeomobj (geom) VALUES ('SRID=4326;MULTIPOINT(-95.4 29.8,-96 30)');--- LineString 对象,如下图id=3
insert into testgeomobj (geom) values ('SRID=4326;LINESTRING(-71.1031880899493 42.3152774590236,-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248)');--- MultiLineString 对象,如下图id=4
insert into testgeomobj (geom) values ('SRID=4326;MultiLineString (
(-71.1031880899493 42.3152774590236,-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248),
(-71.1766585052917 42.3912909739571, -71.1766820268866 42.391370174323896, -71.1766063012595 42.3913825660754, -71.17658265830809 42.391303365353096)
)');--- Polygon 对象,如下图id=8
insert into testgeomobj(geom) values ('SRID=4326;POLYGON (
(-71.1776585052917 42.3902909739571, -71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754, -71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571)
)');--- MultiPolygon 对象,如下图id=9
insert into testgeomobj(geom) values ('SRID=4326; MultiPolygon (
((-71.1776585052917 42.3902909739571, -71.1776820268866 42.3903701743239, -71.1776063012595 42.3903825660754, -71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571)),
((-71.1766585052917 42.3912909739571, -71.1766820268866 42.391370174323896, -71.1766063012595 42.3913825660754, -71.17658265830809 42.391303365353096, -71.1766585052917 42.3912909739571))
)');
(注:可使用数据库管理工具输出SQL语句,本例使用Dbeaver,可在其面板进行几何对象可视化,也可使用SuperMMap iDesktopX或QGIS可视化)
结果如下图:
参数化几何对象
CircularString CompoundCurve CurvePolygon
以相同的方式插入,但由于大部分可视化工具不支持CURVES类型几何,因此可通过st_curvetoline 函数将CURVES转化为LINE进行可视化。
(需要特别注意的是,在转化为LINE进行面积及周长计算时,会产生一定的误差)
--- CircularString:由四段组成,如下图id=14&15
INSERT INTO testgeomobj (geom) VALUES (st_curvetoline('CIRCULARSTRING(0 2, -1 1, 0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)'));--- CompoundCurve:由圆弧和折线段组成,'LINESTRING'关键字可省略,生成的图形,id=15
INSERT INTO testgeomobj(geom) VALUES (st_curvetoline('COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),LINESTRING(1 0, 2 0))'));
结果如下图:
岛洞对象
同时还可以生成复杂岛洞类型,通过创建含有COMPOUNDCURVE(复合曲线)的CURVEPOLYGON来实现。
---Circles with triangle hole、Triangle with arcish hole,如下图id=17&18
INSERT INTO testgeomobj (geom) VALUES(st_curvetoline('CURVEPOLYGON(CIRCULARSTRING(2.5 2.5, 4.5 2.5, 4.5 3.5, 2.5 4.5, 2.5 2.5),(3.5 3.5, 3.25 2.25, 4.25 3.25, 3.5 3.5))', 4326)), (st_curvetoline('CURVEPOLYGON((-0.5 7, -1 5, 3.5 5.25, -0.5 7),CIRCULARSTRING(0.25 5.5, -0.25 6.5, -0.5 5.75, 0 5.75, 0.25 5.5))', 4326));
输入与输出格式
OGC SFA SQL规范的WKB和WKT,提供了基于geom转二进制或文本的I/O能力,但其只定义了2D几何图形,并且相关的SRID没有嵌入在I/O的表示中。
因此,PostGIS 扩展了EWKB/EWKT,在OGC的基础上,增加了对3DM坐标、3DZ坐标、4D坐标和嵌入式SRID信息的支持。
数据格式间的转换通过以下接口实现:
bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT);
此外,PostGIS还支持了多种其他常用格式的互转,满足多场景需求:
Geographic Mark-up Language (GML)
Keyhole Mark-up Language (KML)
GeoJSON、Scalable Vector Graphics (SVG)
…
本文介绍了PostGIS的基础数据类型geometry,从空间数据模型体系结构到各类对象的构造方法、注意事项等。由于Yukon完全兼容该部分能力,更多信息可参考Yukon在线帮助 。
PostGIS的geometry类型及使用方法相关推荐
- mybatis类型转换器处理PostGis数据库geometry类型转换
在入库和查询中需要自动的让geometry的类型和实体类中的类型映射. 实体类中接收参数是String类型(geoJson) PostGis中的geometry类型是十六进制的扩展WKB类型(EWKB ...
- mysql经纬度存储格式geometry_MySQL的geometry类型处理经纬度距离的方法介绍
本篇文章给大家带来的内容是关于MySQL的geometry类型处理经纬度距离的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 建表CREATE TABLE `map` ( ` ...
- PostGIS中geometry与geography的区别
作者:WuMY 摘要:除了geometry,PostGIS还定义了geography,用于不同的场景需求.以下通过实战对比介绍geometry与geography之间的差异.适用场景及互转方法. ge ...
- java mysql geometry,扩展mybatis和通用mapper,支持mysql的geometry类型字段,mybatis用mapper...
扩展mybatis和通用mapper,支持mysql的geometry类型字段,mybatis用mapper 因项目中需要用到地理位置信息的存储.查询.计算等,经过研究决定使用mysql(5.7版本) ...
- postgresql扩展Geometry类型
[需求]:最近开发项目的过程中,需要用到Geometry类型,所以对与Geometry对象进行了一点点学习.在数据库中, 地理坐标系类型是 geography:投影坐标系的类型是 geometry. ...
- 非本地类型不能定义方法 cannot define new methods on non-local type time.Duration
能够随意地为各种类型起名字,是否意味着可以在自己包里为这些类型任意添加方法 ? 参见下面的代码演示 : package mainimport "time"type MyDurati ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- 元组tuple类型内置方法
目录 元组tuple类型内置方法 用途 定义 常用操作+内置方法 优先掌握 存一个值or多个值 有序or无序 可变or不可变 元组tuple类型内置方法 元组是不可变的列表,在定义完成后后面就不可以进 ...
- 在Python中检查类型的规范方法是什么?
检查给定对象是否为给定类型的最佳方法是什么? 如何检查对象是否从给定类型继承? 假设我有一个对象o . 如何检查是否为str ? #1楼 前往雨果: 您可能是说list而不是array ,但这指向类型 ...
最新文章
- apply()智用:需要几个参数但只有一个参数数组
- 熟读《阿里巴巴java开发手册》(五、 MySQL 数据库)
- 简易HTTP协议解析
- Java程序员如何快速理解Kubernetes
- React Native使用指南-原生UI组件
- 人工智能的炒作_为什么人工智能被过度炒作?
- 如何让service不被系统杀掉
- 超70家影视传媒单位联合500余位艺人倡议:立即清理未经授权短视频
- 01背包 (dp专题)
- 关于博客改版:我的一些想法与初衷
- paip.提升用户体验---提取FLASH中图片
- ai人工智能_AI破坏已经开始
- linux上clion使用教程,linux clion使用教程
- 中国大数据产业地图,四川61家大数据企业上榜!
- api质量等级_API质量等级与机油选用指引
- 计算机图片怎么截图快捷键,电脑系统截图快捷键(电脑怎么截图)
- 实现正方形图片dct的c++代码(使用AXAT)
- QT之SQLITE3数据库
- Linux shell 交互式编程、TCL/TK 和 Expect 编译与安装、expect 编程
- 我国超级计算机历代,《决战崛起——中国超算强国之路》作品研讨会召开
热门文章
- 2021年氯化工艺报名考试及氯化工艺考试内容
- 【windows】win8.1的安装中绕过Microsoft帐户登录
- 【CQBZOJ - 1205】因式分解问题
- HNOI2005 狡猾的商人
- Java接口限流算法
- android sqlite 打包 xe,C++ Builder XE10快速开发关于sqlite数据库APP应用发布小结
- 区块链常见共识算法(consensus)
- oracle对应字符集汇总,Oracle字符集子集与超级的对应关系
- 北京汽车摩托车年检查询指南(工作时间、最近检测厂、联系电话)
- 2020-SIGIR- Lightgcn: Simplifying and powering graph convolution network for recommendation