F.13. earthdistance

earthdistance模块提供两种不同的方法来计算地球表面的大圆距离。第一种要介绍的依赖于cube模块(必须earthdistance之前安装)。第二种基于内建的point数据类型,为座标使用精度和纬度。

在这个模块中,地球被假定为完美的球型(如果这对你不够精确,你可能希望去看看PostGIS项目)。

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

数据被存储在立方体中,立方体的点(所有的角都一样)使用 3 个座标表示到地球中心的 x、y 和 z 距离。提供了一个cube之上的域earth,这包括检查值符合这些限制并且合理地接近于地球的真实表面的约束。

地球的半径获得自earth()函数。其单位是米。但是通过改变这一个函数你能够把该模块改为使用某些其他单位,或者使用一种你认为更合适的不同半径值。

这个包也有在天文数据库中的应用。天文学家可能想要改变earth()来返回一个180/pi()的半径,这样距离就会是度数。

函数也被提供来支持经纬度输入(以度数)、经纬度输出、计算两点间的大圆距离以及容易地指定一个可用于索引搜索的边界框。

所提供的函数在表 F-6中描述。

表 F-6. 基于立方体的地球距离函数

函数返回描述
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为一个位置的给定大圆距离范围内的点使用立方体@>操作符返回一个适合于索引搜索的框。这个框中的某些点到该位置的大圆距离会超过指定的大圆距离,因此使用earth_distance的第二次检查应该被包括在查询中。

F.13.2. 基于点的地球距离

这个模块的第二部分依赖于将地球位置表示为类型point的值,其中第一部分被用来表示经度数,第二部分被用来表示纬度数。点被取做 (longitude, latitude) 并且不能反过来,因为经度更接近直观上的 x 轴,而纬度则接近 y 轴。

表 F-7所示,这一部分只提供了一个单一操作符。

表 F-7. 基于点的地球距离操作符

操作符返回描述
point <@> pointfloat8给定地球表面两点之间的法定英里距离。

注意和这个模块的基于cube的部分不同,这里的单位是被硬编码的:改变earth()函数将不会影响这个操作符的结果。

经度/纬度表示的一个缺点是你需要小心靠近两极和靠近经度正负 180 度处的边界情况。基于cube的表示可以避免这些不连续性。