earthdistance
模块提供两种不同的方法来计算地球表面的大圆距离。第一种要介绍的依赖于cube
模块(必须在earthdistance
之前安装)。第二种基于内建的point
数据类型,为座标使用精度和纬度。
在这个模块中,地球被假定为完美的球型(如果这对你不够精确,你可能希望去看看PostGIS项目)。
数据被存储在立方体中,立方体的点(所有的角都一样)使用 3 个座标表示到地球中心的 x、y 和 z 距离。提供了一个cube
之上的域earth
,这包括检查值符合这些限制并且合理地接近于地球的真实表面的约束。
地球的半径获得自earth()
函数。其单位是米。但是通过改变这一个函数你能够把该模块改为使用某些其他单位,或者使用一种你认为更合适的不同半径值。
这个包也有在天文数据库中的应用。天文学家可能想要改变earth()
来返回一个180/pi()
的半径,这样距离就会是度数。
函数也被提供来支持经纬度输入(以度数)、经纬度输出、计算两点间的大圆距离以及容易地指定一个可用于索引搜索的边界框。
所提供的函数在表 F.5中描述。
表 F.5. 基于立方体的地球距离函数
这个模块的第二部分依赖于将地球位置表示为类型point
的值,其中第一部分被用来表示经度数,第二部分被用来表示纬度数。点被取做 (longitude, latitude) 并且不能反过来,因为经度更接近直观上的 x 轴,而纬度则接近 y 轴。
如表 F.6所示,这一部分只提供了一个单一操作符。
表 F.6. 基于点的地球距离操作符
操作符 | 返回 | 描述 |
---|---|---|
point <@> point | float8 | 给定地球表面两点之间的法定英里距离。 |
注意和这个模块的基于cube
的部分不同,这里的单位是被硬编码的:改变earth()
函数将不会影响这个操作符的结果。
经度/纬度表示的一个缺点是你需要小心靠近两极和靠近经度正负 180 度处的边界情况。基于cube
的表示可以避免这些不连续性。