2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.14. earthdistance — 计算大圆距离 #

The earthdistance 模块提供了两种不同的方法来计算地球表面上的大圆距离。第一个描述的方法依赖于 cube 模块。第二个方法基于内置的 point 数据类型,使用经度和纬度作为坐标。

在这个模块中,地球被假设为完美的球体。(如果你觉得这个假设不够精确,你可以参考 PostGIS 项目。)

安装 earthdistance 之前必须先安装 cube 模块(虽然你可以使用 CASCADE 选项在 CREATE EXTENSION 命令中同时安装这两个模块)。

注意

强烈建议 earthdistancecube 安装在同一个模式中,并且该模式是未授予任何不可信用户 CREATE 权限的模式。否则,如果 earthdistance 的模式包含由恶意用户定义的对象,则存在安装时的安全风险。此外,在安装后使用 earthdistance 的函数时,整个搜索路径应该只包含受信任的模式。

F.14.1. 基于立方体的地球距离 #

数据存储在立方体中,这些立方体是点(两个角是相同的),使用 3 个坐标来表示相对于地球中心的 x、y 和 z 距离。提供了一个 earth,它覆盖类型 cube,其中包括约束检查,确保值符合这些限制并且与地球的实际表面非常接近。

地球的半径是从 earth() 函数中获得的。它是以米为单位。但通过更改这个函数,你可以将模块更改为使用其他单位,或者使用你认为更合适的半径值。

这个包也适用于天文数据库。天文学家可能希望更改 earth() 以返回 180/pi() 的半径,以便距离以度为单位。

提供了一些函数来支持输入纬度和经度(以度为单位),来支持输出纬度和经度,来计算两个点之间的大圆距离,以及轻松指定可用于索引搜索的边界框。

提供的函数如 表 F.4 所示。

表 F.4. 基于立方体的地球距离函数

函数

描述

earth () → float8

返回假设的地球半径。

sec_to_gc ( float8 ) → float8

将地球表面上两点之间的正常直线(割线)距离转换为它们之间的大圆距离。

gc_to_sec ( float8 ) → float8

将地球表面上两点之间的大圆距离转换为它们之间的正常直线(割线)距离。

ll_to_earth ( float8, float8 ) → earth

返回地球表面上一个点的地理位置,该点的纬度(参数 1)和经度(参数 2)以度为单位。

latitude ( earth ) → float8

返回地球表面上一个点的纬度,以度为单位。

longitude ( earth ) → float8

返回地球表面上一个点的经度,以度为单位。

earth_distance ( earth, earth ) → float8

返回地球表面上两个点之间的大圆距离。

earth_box ( earth, float8 ) → cube

返回一个适合使用 cube @> 运算符进行索引搜索的框,以查找在给定大圆距离内的点。这个框中的一些点距离该位置的距离大于指定的大圆距离,因此在查询中应该包含使用 earth_distance 进行的第二次检查。


F.14.2. 基于点的地球距离 #

模块的第二部分依赖于将地球上的位置表示为 point 类型的值,其中第一个分量表示以度为单位的经度,第二个分量表示以度为单位的纬度。点被视为(经度,纬度)而不是相反,因为经度更接近于 x 轴的直观概念,而纬度更接近于 y 轴的概念。

提供了一个运算符,如 表 F.5 所示。

表 F.5. 基于点的地球距离运算符

运算符

描述

point <@> pointfloat8

计算地球表面上两个点之间的距离,以英里为单位。


请注意,与模块的 cube 部分不同,这里单位是硬编码的: 更改 earth() 函数不会影响此运算符的结果。

经度/纬度表示法的一个缺点是,你需要注意极点附近和 +/- 180 度经度附近的边缘情况。基于 cube 的表示法避免了这些不连续性。

提交更正

如果您在文档中发现任何错误,不符合您对特定功能的体验,或者需要进一步澄清,请使用 此表格 报告文档问题。