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