earthdistance
模块提供了两种不同的方法来计算地球表面上的大圆距离。首先描述的方法依赖于 cube
模块。第二种方法基于内置的 point
数据类型,使用经度和纬度作为坐标。
在此模块中,假设地球是完美的球体。(如果这对你来说不够准确,你可能需要查看 PostGIS 项目。)
必须在安装 earthdistance
之前安装 cube
模块(尽管你可以使用 CREATE EXTENSION
的 CASCADE
选项在一个命令中安装两者)。
强烈建议在同一模式中安装 earthdistance
和 cube
,并且该模式是尚未且不会向任何不受信任的用户授予 CREATE 权限的模式。否则,如果 earthdistance
的模式包含由恶意用户定义的对象,则在安装时存在安全隐患。此外,在安装后使用 earthdistance
的函数时,整个搜索路径应仅包含受信任的模式。
数据存储在立方体中,这些立方体是点(两个角相同),使用 3 个坐标表示与地球中心的 x、y 和 z 距离。域 earth
位于类型 cube
上,其中包括约束检查,以确保值符合这些限制并且相当接近地球的实际表面。
地球半径从 earth()
函数中获取。它以米为单位给出。但是,通过更改此函数,你可以更改模块以使用其他单位,或使用你认为更合适的半径的不同值。
此包也适用于天文数据库。天文学家可能希望更改 earth()
以返回 180/pi()
的半径,以便距离以度为单位。
提供函数以支持输入纬度和经度(以度为单位),以支持纬度和经度的输出,以计算两点之间的球面距离,并轻松指定可用于索引搜索的边界框。
提供的函数显示在 表 F.5 中。
表 F.5. 基于立方的 Earthdistance 函数
该模块的第二部分依赖于将地球位置表示为 point
类型的数值,其中第一个分量表示经度(以度为单位),第二个分量表示纬度(以度为单位)。点被视为 (经度,纬度) 而不是相反,因为经度更接近 x 轴的直观概念,而纬度更接近 y 轴。
提供了一个运算符,如 表 F.6 所示。
表 F.6. 基于点的地球距离运算符
运算符 说明 |
---|
计算地球表面上两点之间的法定英里距离。 |
请注意,与该模块基于 cube
的部分不同,此处单位是硬编码的:更改 earth()
函数不会影响此运算符的结果。
经度/纬度表示法的一个缺点是,您需要小心极点附近和经度 +/- 180 度附近的边缘条件。基于 cube
的表示法避免了这些不连续性。