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