PostGIS中geometry与geography的区别
作者:WuMY
摘要:除了geometry,PostGIS还定义了geography,用于不同的场景需求。以下通过实战对比介绍geometry与geography之间的差异、适用场景及互转方法。
geography基础介绍
与geometry不同的是,geography原生支持地理坐标(也称为大地坐标或经纬度坐标),基于球面模型进行函数分析和计算。下图为两个坐标系:
geometry与geography对比
以下列举了二者在各个维度间的对比:
对比项 | geometry | geography |
---|---|---|
名称 | 几何对象 | 地理对象 |
坐标系 | 支持平面坐标系和球面坐标系 | 仅支持球面坐标系 |
对象类型 | 支持 POINT、MULTIPOINT、LINESTRING、LINEARRING、MULTILINESTRING、POLYGON、MULTIPOLYGON、POLYHEDRALSURFACE、TRIANGLE、TIN、GEOMETRYCOLLECTION等简单对象,还支持CIRCULARSTRING、COMPOUNDCURVE、CURVEPOLYGON、MULTICURVE、MULTISURFACE | 仅支持POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION |
函数限制 | 类型较丰富 | 支持类型较少,仅支持类型转换、长度面积距离计算、交并差运算函数 |
索引局限性 | 几何索引不能正确处理极地地区查询 | 地理索引可以正确处理覆盖极点或国际日期变更线的查询 |
元数据 | geometry_columns:提供了数据库中所有空间数据表的描述信息,分别是数据库名、模式名、空间数据表名,属性列名称,几何图形维度,空间参考标识符,几何图形类型 | 无定义的元数据,需自定义 |
根据geometry与geography的特点,在使用时可根据以下情况选择:
geometry | geography |
---|---|
如果数据在地理范围上是紧凑的(包含在州、县或市内),推荐使用基于笛卡尔坐标的geometry类型 | 如果需要测量在地理范围上是分散的数据集(覆盖世界大部分地区)距离,推荐使用geography类型。 |
当做数据存储时,推荐使用geometry | 由于地理坐标较为精确,因此在进行距离、面积等量算时,建议使用geography |
如果用户较为了解投影信息知识,推荐使用geometry | geography不需要了解专业的投影知识只需要知道经纬度就可以进行计算,因此使用门槛较低 |
当场景需要运用大量复杂函数时,推荐使用geometry | geography的支持函数较少,且计算复杂,因此应用时需要占用较多计算资源。 |
geometry与geography应用实践
首先我们分别使用geometry和geography类型通过ST_Distance计算北京到昆明之间的距离,空间参考设置为SRID=4326
--geometry对象计算距离
SELECT ST_Distance('SRID=4326;POINT(116.415767 39.916042)'::geometry, -- Beijing'SRID=4326;POINT(102.833963 24.916456)'::geometry -- Kunming);
--结果
20.234944528360142
可以看到,采用geometry在平面坐标系上计算的结果并不正确
--转成geography对象计算距离SELECT ST_Distance('SRID=4326;POINT(116.415767 39.916042)'::geography, -- Beijing'SRID=4326;POINT(102.833963 24.916456)'::geography -- Kunming);--结果
2091929.28729987
计算结果是2092千米,采用geography对象在球面坐标系计算的结果正确,两点的距离量算为大圆航线的一部分。但是该函数只适用于点对象。那我们可以尝试接入构造函数解决这一问题:
-- ST_GeographyFromText(text)
SELECT ST_Distance(ST_GeographyFromText('POINT(116.415767 39.916042)'), -- BeijingST_GeographyFromText('POINT(102.833963 24.916456)') -- Kunming
);
--结果
2091929.28729987
可以看到,使用 ST_GeographyFromText(text) 函数计算,也得到了正确的结论。因此在加入其它几何对象的计算需求下,可使用这种方法进行计算,如计算北京到昆明航线离上海的最短距离时,可采用以下做法:
--北京到昆明航线离上海的最短距离,即垂线段距离:
SELECT ST_Distance(ST_GeographyFromText('LINESTRING(116.415767 39.916042, 102.833963 24.916456)'), -- Beijing to KunmingST_GeographyFromText('POINT(121.452027 31.242725)') -- Shanghai
);
--结果
988436.03069308
得到正确的结果为988千米
geometry与geography互转
为了方便进行准确运算并且可以灵活运用丰富的函数类型,PostGIS提供了二者之间的互转,满足多场景应用。
- geometry转为geography
为了将geometry数据加载到geography表中,首先需要将geometry转换到EPSG:4326(经度/纬度),然后再将其转换为geography。 ST_Transform(geometry, srid) 函数能将坐标转换为地理坐标,Geography(geometry) 函数能将基于EPSG:4326的geometry数据类型转换为geography数据类型,流程如下:
--使用ST_Transform(geometry, srid)和Geography(geometry)两个嵌套函数将nyc_subway_stations示例数据从geom转换为geog
CREATE TABLE nyc_subway_stations_geog AS
SELECTGeography(ST_Transform(geom,4326)) AS geog,name,routes
FROM nyc_subway_stations;
同时,当数据量大时,支持创建空间索引,在geography表上构建空间索引与在geometry表上构建空间索引的方法完全相同:
--创建GiST索引类型
CREATE INDEX nyc_subway_stations_geog_gix
ON nyc_subway_stations_geog USING GIST (geog);
- geography转为geometry
虽然geography类型的空间函数可以解决许多问题,但有时仍需要使用geometry类型支持的其他空间函数,需要将对象从geography转换为geometry。以下city表为例:
--GEOGRAPHY的列名为geog
CREATE TABLE city (code VARCHAR(3),geog GEOGRAPHY(Point));INSERT INTO cityVALUES ('BJ', 'POINT(116.41 39.916042)');
INSERT INTO cityVALUES ('KM', 'POINT(102.833963 24.956)');
INSERT INTO cityVALUES ('SH', 'POINT(121.452 31.245)');
利用SQL语句查询geography元数据,可以看到geography给city表的geog列指定了默认的srid=4326:
SELECT * FROM geography_columns;
结果如下:
利用类型转换方法,函数将geog转为geometry类型,并调用 ST_X 方法读取转换后的坐标:
SELECT code, ST_X(geog::geometry) AS longitude FROM city;
结果为如下图,可以看到采用类型转换的方法,并不会改变geometry本身的坐标值。
总结:
以上通过各类实战系统对比了geometry与geography从本质上的差别、二者的适用场景及相互转换的方法。更多信息可参考Yukon在线帮助 。
PostGIS中geometry与geography的区别相关推荐
- mysql stdistance_geometry和geography的区别
1.先说说Sql Server中geometry和geography的区别: geometry:planar 平面坐标系[supported by SQL Server conforms to ...
- PostGIS的geometry类型及使用方法
作者:WuMY PostGIS中矢量数据如何存储和构造,有哪些注意事项?其空间数据模型体系又遵循哪些标准规范?本文进行了详细介绍,并提供实操内容供读者参考. 此外,Yukon构建在PostGIS的基础 ...
- mysql stdistance_C#开发SQLServer的Geometry和Geography存储
SQL Server2008推出后最大的变化就是提供了支持空间数据存储的Geometry和Geography,这个也是如果将ArcSDE和SQLServer数据库相结合后可以供用户选择的一种数据存储模 ...
- PostGIS 距离计算规范 - 投影 与 球 坐标系, geometry 与 geography 类型
平面坐标,球面坐标 SRID=2369 投影坐标 SRID=4326 球面坐标 ST_Transform(ST_GeomFromText('POINT(120.08 30.96)', 4326), ...
- PostGIS中常用函数整理记录
文章目录 WKT中几何对象 版本控制函数 几何对象构造函数 几何对象输出函数 几何验证函数 空间参考系统功能函数 几何属性访问函数 几何测量函数 几何图形编辑函数 几何处理函数 仿射变换函数 边界框函 ...
- mybatis类型转换器处理PostGis数据库geometry类型转换
在入库和查询中需要自动的让geometry的类型和实体类中的类型映射. 实体类中接收参数是String类型(geoJson) PostGis中的geometry类型是十六进制的扩展WKB类型(EWKB ...
- 如何理解类型geometry和geography以及4326、3857坐标系
一.地理坐标系和的投影坐标系 一.地理坐标系和的投影坐标系 地理坐标系(Geographic coordinate system),或称 球面坐标系: 投影坐标系(Projected coordina ...
- python中break和continue的区别
python中break和continue的区别 break 结束for 或者while 循环 后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...
- java中separator_java - File.separator和路径中的斜杠之间的区别
java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...
最新文章
- C语言笔记系列文章 索引目录表(持续更新中......)
- AI基础:数据增强方法综述
- Android studio .gitignore 文件的内容
- Django框架(15.Django中的自关联)
- 昨晚通宵把服务器格式化,重新配置环境。
- 13. PHP OPcache
- android模拟器多点触摸,Windows 7 多点触摸开发模拟器和多点触摸驱动
- Ubuntu 部分截图
- iphone 投android电视,手机投屏到电视上的2种方法,看完才知道原来这么简单
- utf8和gbk的区别
- 曙光服务器面板显示感叹号,磁盘阵列和磁带库面板感叹号灯橙色
- 谷歌浏览器无法使用谷歌翻译解决办法
- 手写中文文章识别(1)——问题描述
- 据说是原CSDN排名第一的博客,我看到内容,确实被震憾了
- Docker常用命令和实战演练
- 如何在 JavaScript 中检查数字是正数还是负数
- 基于微博评论的细粒度的虚假信息识别软件
- CS目前有哪些热门的研究方向和应用?
- hbase 二进制数据写入_linux 写入二进制文件内容
- 求助一个关于顶帖机的思路