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

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

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

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

在此模块中,假定地球是完美球形的。(如果您觉得这样不够准确,可以看看 PostGIS 项目。)

必须先安装 cube 模块,然后才能安装 earthdistance(尽管您可以使用 CREATE EXTENSIONCASCADE 选项在一个命令中同时安装这两个模块)。

警告

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

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

数据存储在点立方体中(两个角相同),使用三个坐标表示从地球中心的 x、y 和 z 距离。通过类型 cube 定义了一个earth type ,此域包含约束检查,以判断值是否满足这些限制并且与地球实际表面合理吻合。

地球半径从 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 的表示避免了这些不连续性。