Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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 的表示法避免了这些不连续性。