F.13. earthdistance

earthdistance模块提供了两种不同的方法来计算地球表面上的大圆周距离。首先描述的模块取决于cube模块(必须安装*,然后才能安装earthdistance)。第二种基于内置的point数据类型,将经度和纬度用作坐标。

在此模块中,假定地球是完美球形。 (如果这对您来说不太准确,则您可能需要查看PostGIS项目。)

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

数据存储在点(两个角都相同)的多维数据集中,它们使用 3 个坐标表示距地球中心的 x,y 和 z 距离。提供了earth超过cube的域,其中包括约束检查,以确保该值满足这些限制并且合理地接近地球的实际表面。

地球的半径是通过earth()函数获得的。它以米为单位。但是通过更改此功能,您可以更改模块以使用其他一些单位,或者使用您认为更合适的半径值。

该软件包也适用于天文数据库。天文学家可能想更改earth()以返回180/pi()的半径,以便距离以度为单位。

提供功能以支持纬度和经度(以度为单位)的 Importing,支持纬度和经度的输出,计算两点之间的大圆距离并轻松指定可用于索引搜索的边界框。

所提供的功能在Table F.5中显示。

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

FunctionReturnsDescription
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类型的值,其中第一个分量表示度数(经度),第二个分量表示度数的纬度。点被视为(经度,纬度),反之亦然,因为经度更接近 x 轴和 y 轴的直觉性。

提供了一个操作符,如Table F.6所示。

表 F.6.基于点的地球距离 operator

OperatorReturnsDescription
point <@> pointfloat8给出地球表面两点之间的法定英里距离。

请注意,与模块中基于cube的部分不同,此处将单元进行硬接线:更改earth()函数不会影响此运算符的结果。

经度/纬度表示的一个缺点是,您需要注意极点附近和经度 180 度附近的边缘条件。基于cube的表示避免了这些不连续性。