Postgresql 中文操作指南
F.15. earthdistance — calculate great-circle distances #
earthdistance 模块提供了两种不同的方法来计算地球表面的大圆距离。首先描述的方法依赖于 cube 模块。第二种方法基于内置的 point 数据类型,使用经度和纬度作为坐标。
在此模块中,假定地球是完美的球形。(如果对您来说这种假设太不准确,您可能想要查看 PostGIS项目。)
cube 模块必须在 earthdistance 安装之前安装(尽管你可以使用 CASCADE 选项 CREATE EXTENSION 在一个命令中安装两者)。
Caution
强烈建议在同一个模式中安装 earthdistance 和 cube,且该模式应是尚未并且不会向任何不值得信赖的用户授予 CREATE 权限的模式。如果 earthdistance 的模式包含不可信用户定义的对象,则在安装时会存在安全隐患。此外,在安装后使用 earthdistance 函数时,整个搜索路径应只包含受信任的模式。
F.15.1. Cube-Based Earth Distances #
数据存储在作为点的立方体中(两个角相同),使用从地球中心到 x、y 和 z 距离的 3 个坐标。提供了 domain earth 的 [role="bare"]glossary.html#GLOSSARY-DOMAIN cube 类型 cube ,其中包括约束检查,这些检查可确保值满足这些限制并且与地球的实际表面大致接近。
地球半径是从 earth() 函数获取的。其以米为单位。但是,通过更改此函数,你可以更改模块,以便使用其他单位,或使用你觉得更合适的不同半径值。
此包也适用于天文数据库。天文学家可能希望更改 earth() 以返回 180/pi() 半径,以便距离以度为单位。
提供函数来支持纬度和经度(以度为单位)输入,支持纬度和经度输出,计算两个点之间的最大圆周距离,并轻松指定可用于索引搜索的边界框。
提供的函数所示于 Table F.5。
Table F.5. Cube-Based Earthdistance Functions
Function Description |
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.15.2. Point-Based Earth Distances #
模块的第二部分依靠将地球位置表示为 point 类型的值,其中第一个分量代表经度,以度为单位,第二个分量代表纬度,以度为单位。采用点为 (经度、纬度),而不是相反,这是因为经度更接近于 x 轴直观概念,纬度更接近于 y 轴。
提供了一个单一运算符,如 Table F.6中所示。
Table F.6. Point-Based Earthdistance Operators
Operator Description |
point <@> point → float8 计算地球表面上任意两点间的距离(英里)。 |
请注意,与模块基于 cube 的部分不同,此处单位是固定的:更改 earth() 函数不会影响此操作符的结果。
经度/纬度表示法的一个缺点是,您需要注意极点附近以及经度 +/- 180 度附近的边缘条件。基于 cube 的表示法避免了这些不连续性。