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