PostgreSQL 13.1 中文入门教程 PostgreSQL earthdistance

2024-02-25 开发教程 PostgreSQL 13.1 中文入门教程 匿名 4
F.13.1. 基于立方体的地球距离
F.13.2. 基于点的地球距离

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

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

cube模块必须在earthdistance之前被安装。 (尽管你可以使用CREATE EXTENSIONCASCADE选项在一个命令中同时安装)。

小心

强烈建议将 earthdistancecube安装在同一模式中,并且该模式的 CREATE 特权尚未授予且不会授予任何不受信任的用户。 否则,如果earthdistance的模式包含由敌对用户定义的对象,则存在安装时的安全隐患。 此外,在安装后使用earthdistance的函数时,整个搜索路径应仅包含受信任的架构。

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

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

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

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

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

所提供的函数在表 F.5中描述。

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

函数

描述

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

为一个位置的给定大圆距离范围内的点使用cube@>操作符返回一个适合于索引搜索的框。 这个框中的某些点到该位置的大圆距离会超过指定的大圆距离,因此使用earth_distance的第二次检查应该被包括在查询中。

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

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

如表 F.6所示,这一部分只提供了一个单一操作符。

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

操作符

描述

point<@>pointfloat8

计算地球表面上两个点之间以法定英里计算的距离。

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

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