Earthdistance
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
[编辑] earthdistance
earthdistance 模块提供了两个不同的方法用于计算地球表面的两点的距离。我们先描述的那个方法依赖于 cube 包(必须在 earthdistance 安装之前安装 cube 包)。第二个方法是基于内置的 point 数据类型,用经度和维度做为坐标来计算。
在这个模块里,假设地球是完美的球形。(如果你觉得这么做太不准确,那你可能会想看看 PostGIS 项目。)
[编辑] 基于 Cube 的地球距离
数据存储在 cube 里面,都是用三个分别代表到地球中心的x,y,和 z 距离的坐标点(两个对角都相同)。包提供了一个构建在 cube 之上的域 earth,它包括约束检查以保证数值符合这些约束并且与地球表面的距离合理足够地接近。
地球的半径是从 earth() 函数获取的。它是以米为单位给出的。你只要修改这个函数就可以让整个模块使用其它单位,或者使用你认为更合适的半径。
这个包也用于天文数据库。天文学家通常想把 earth() 修改成返回 180/pi() 的半径,这样距离就是以度来计算的了。
提供了几个支持以经纬度(单位是度)输入的函数、支持输出经纬度的函数,以及计算大圆上两点距离的函数以及可以比较简单地声明一个外包框用于索引搜索的函数。
提供了下列函数:
| 函数 | 返回 | 描述 |
| 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_distnce 进行复查。 |
[编辑] Point 为基础的 earthdistnce
这个模块的第二部分依赖于用类型 point 来表示地球的位置,这种表示法里头第一部分是当做经度的度数,第二部分表示纬度的度数。点用(经度,纬度)的方式表示,但是反过来不行,因为经度从概念上很像 x 坐标,纬度像 y 坐标。
提供了唯一的一个操作符:
| 操作符 | 返回值 | 描述 |
| point <@> point | float8 | 给出法定英里为单位的地球表面两点之间的距离。 |
请主意和基于 cube 的模块部分不同,这里的单位是硬编码的:修改 earth() 函数将不回影响操作符的结果。
使用经度/纬度表示的缺点是你需要在经度接近极区和 +/- 180 度的时候主意边界条件。基于 cube 的表示法避免了这些不连贯。
