作者: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的区别相关推荐

  1. mysql stdistance_geometry和geography的区别

    1.先说说Sql Server中geometry和geography的区别: geometry:planar    平面坐标系[supported by SQL Server conforms to ...

  2. PostGIS的geometry类型及使用方法

    作者:WuMY PostGIS中矢量数据如何存储和构造,有哪些注意事项?其空间数据模型体系又遵循哪些标准规范?本文进行了详细介绍,并提供实操内容供读者参考. 此外,Yukon构建在PostGIS的基础 ...

  3. mysql stdistance_C#开发SQLServer的Geometry和Geography存储

    SQL Server2008推出后最大的变化就是提供了支持空间数据存储的Geometry和Geography,这个也是如果将ArcSDE和SQLServer数据库相结合后可以供用户选择的一种数据存储模 ...

  4. PostGIS 距离计算规范 - 投影 与 球 坐标系, geometry 与 geography 类型

    平面坐标,球面坐标 SRID=2369  投影坐标 SRID=4326  球面坐标 ST_Transform(ST_GeomFromText('POINT(120.08 30.96)', 4326), ...

  5. PostGIS中常用函数整理记录

    文章目录 WKT中几何对象 版本控制函数 几何对象构造函数 几何对象输出函数 几何验证函数 空间参考系统功能函数 几何属性访问函数 几何测量函数 几何图形编辑函数 几何处理函数 仿射变换函数 边界框函 ...

  6. mybatis类型转换器处理PostGis数据库geometry类型转换

    在入库和查询中需要自动的让geometry的类型和实体类中的类型映射. 实体类中接收参数是String类型(geoJson) PostGis中的geometry类型是十六进制的扩展WKB类型(EWKB ...

  7. 如何理解类型geometry和geography以及4326、3857坐标系

    一.地理坐标系和的投影坐标系 一.地理坐标系和的投影坐标系 地理坐标系(Geographic coordinate system),或称 球面坐标系: 投影坐标系(Projected coordina ...

  8. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  9. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

最新文章

  1. C语言笔记系列文章 索引目录表(持续更新中......)
  2. AI基础:数据增强方法综述
  3. Android studio .gitignore 文件的内容
  4. Django框架(15.Django中的自关联)
  5. 昨晚通宵把服务器格式化,重新配置环境。
  6. 13. PHP OPcache
  7. android模拟器多点触摸,Windows 7 多点触摸开发模拟器和多点触摸驱动
  8. Ubuntu 部分截图
  9. iphone 投android电视,手机投屏到电视上的2种方法,看完才知道原来这么简单
  10. utf8和gbk的区别
  11. 曙光服务器面板显示感叹号,磁盘阵列和磁带库面板感叹号灯橙色
  12. 谷歌浏览器无法使用谷歌翻译解决办法
  13. 手写中文文章识别(1)——问题描述
  14. 据说是原CSDN排名第一的博客,我看到内容,确实被震憾了
  15. Docker常用命令和实战演练
  16. 如何在 JavaScript 中检查数字是正数还是负数
  17. 基于微博评论的细粒度的虚假信息识别软件
  18. CS目前有哪些热门的研究方向和应用?
  19. hbase 二进制数据写入_linux 写入二进制文件内容
  20. 求助一个关于顶帖机的思路

热门文章

  1. 深入浅出富文本编辑器
  2. “优必选“杯2021中国机器人技能大赛--赛后总结
  3. 斯坦福 AI Lab 主任 Chris Manning:人工智能研究的最新趋势和挑战
  4. 庄伟雄:基于移动互联网的供应链管理
  5. 批量nii文件转换为png图像
  6. VBA+ADO查询ACCESS数据库
  7. FFA-Net: Feature Fusion Attention Network for Single Image Dehazing
  8. 数学软件GeoGebra安装
  9. 生产者消费者算法的实现
  10. Window线程安全与线程控制函数