支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

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

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

在这个模块中,地球被假定为完美的球体。(如果这对你来说精度太低,你可能需要查看 PostGIS 项目。)

在安装 earthdistance 之前,必须先安装 cube 模块(尽管您可以使用 CREATE EXTENSIONCASCADE 选项在一个命令中安装两者)。

注意

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

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

数据存储在立方体中,立方体是使用 3 个坐标表示距地球中心的 x、y 和 z 距离的点(两个角相同)。提供了一个类型为 cube earth,其中包含约束检查,以确保值满足这些限制并且合理地接近地球的实际表面。

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

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

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

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

表 F.4. 基于立方体的 Earthdistance 函数

函数

描述

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. 基于点的 Earthdistance 运算符

运算符

描述

point <@> pointfloat8

计算地球表面上两点之间的法定英里距离。


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

经度/纬度表示法的一个缺点是,您需要小心极点附近和经度 +/- 180 度附近的边缘条件。基于 cube 的表示法避免了这些不连续性。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。