🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# F.13\. earthdistance `earthdistance`模块提供两个不同的方法计算地球表面上的大圆弧距离。 描述的第一个依赖于`cube`模块(_必须_在`earthdistance` 可以安装之前安装)。第二个基于内建的`point`数据类型, 使用经线和纬线作为坐标。 在这个模块,假设地球为完美的球形。(如果对你来说太不准确,你可能想查阅 [PostGIS](http://www.postgis.org/)项目。) ## F.13.1\. 基于立方体的地球距离 数据存储在立方体中,点用3个坐标表示从地球中心到表面的x, y, z的距离。 提供一个在`cube`之上的域`earth`,包含检查约束, 值必须符合限制条件并且合理的接近地球的实际表面。 地球的半径从`earth()`函数获得。以米给出。 可以通过改变模块使用其他单元来改变这个函数,或者使用你觉得更合适的半径值。 这个包也应用到了天文数据库。天文学家可能想要改变`earth()`, 使其返回一个`180/pi()`的半径,这样距离可以用角度表示。 提供函数支持经纬度(以角度方式)输入、输出、计算两个点之间大圆弧的距离, 和容易的指定用于索引查询的边界框。 提供的函数在[Table F-4](#calibre_link-532)里显示。 **Table F-4\. 基于立方体的地球距离函数** | 函数 | 返回 | 描述 | | --- | --- | --- | | `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-5](#calibre_link-533)中显示。 **Table F-5\. 基于点的地球距离操作符** | 操作符 | 返回 | 描述 | | --- | --- | --- | | `point` `<@>` `point` | `float8` | 给出地球表面两点之间的法定英里距离。 | 请注意,不像基于`cube`部分的模块,这里的单元是硬链接的: 改变`earth()`函数将不会影响这个操作符的结果。 经度/纬度表示法的一个缺点是:你必须注意靠近两极和接近+/- 180度经线的边界条件。 基于`cube`的表示法避免了这些间断点。