Skip to content

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

F.15.1. 基于立方体的地球距离
F.15.2. 基于点的地球距离

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

在此模块中,假设地球是完美的球体。(如果这对你来说不够准确,你可能需要查看PostGIS项目。)

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

注意

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

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

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

地球半径从earth()函数中获取。它以米为单位给出。但是,通过更改此函数,你可以更改模块以使用其他单位,或使用你认为更合适的半径的不同值。

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

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

提供的函数显示在表 F.5中。

表 F.5. 基于立方的 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.15.2. 基于点的地球距离#

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

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

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

运算符

说明

point <@> pointfloat8

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

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

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