Postgis 中 2 点之间的距离,单位为 srid 4326,以米为单位

Posted

技术标签:

【中文标题】Postgis 中 2 点之间的距离,单位为 srid 4326,以米为单位【英文标题】:Distance between 2 POINTs in Postgis in srid 4326 in metres 【发布时间】:2012-01-17 21:03:24 【问题描述】:

这可能是一个简单的问题,但我不太擅长 PostGIS,也没有完全理解所有这些。

基本上我有一个带有 POINT 列 (point) 的表 (nodes)。我已经在这个列上创建了一个索引

create index nodes__points on nodes using gist (point)

该列是用

创建的
select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2)

我正在使用 srid 4326,因为我正在添加格式为(纬度、经度)的数据。 (即爱尔兰都柏林的位置坐标系 lat=53.353 lon=-6.264(我已添加 GeomFromText('POINT(-6.264 53.535)'))。

对于每个点,我想找到大约在以该点为中心的 1 公里框内的所有点(所以selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;。它不必很精确,只是一个粗略的hueristic 数字。1 公里 bbox 很好, 1km 的圆就可以了。不一定要正好是 1km,只要那个数量级就行了。

ST_Distance/ST_DWithin/等。都使用 SRID 的单位,对于 4326/WGS64 来说是度(所以 1 = 1 纬度/经度)。但我想用米。

我尝试了ST_distance_spherest_dwithin,它们可以使用米,但如果我这样做,explain 表明索引没有被使用。

我怎样才能大致得到我想要的,使用地理索引?

更新:这是在 PostgreSQL 9.1 和 PostGIS 2.0 svn build 上。

【问题讨论】:

也许有一些帮助:ST_DWithin takes parameter as degree , not meters , why? 强制性问题:什么 PostGIS 版本?什么 PostgreSQL 版本? 【参考方案1】:

您可以使用 ST_Transform 来使用仪表,还请记住,并非所有功能都适用于地理类型,但如果您真的需要速度,请使用 ST_DWithin,这是最快的方法。这是度和米之间转换的近似值:

| places | degrees    | distance |
| ------ | ---------- | -------- |
| 0      | 1.0        | 111 km   |
| 1      | 0.1        | 11.1 km  |
| 2      | 0.01       | 1.11 km  |
| 3      | 0.001      | 111 m    |
| 4      | 0.0001     | 11.1 m   |
| 5      | 0.00001    | 1.11 m   |
| 6      | 0.000001   | 0.111 m  |
| 7      | 0.0000001  | 1.11 cm  |
| 8      | 0.00000001 | 1.11 mm  |

【讨论】:

【参考方案2】:

自从写这篇文章以来,我在 PostGIS 中发现了“地理”而不是“几何”类型,这可能正是我想要的。

【讨论】:

地理应该可以。您没有在问题中提及数据类型。 Geom 的问题在于它最终是一个 2D 对象。地理是一个 4D 对象,其中包括可以转换为米的地球参数的高度和曲率......没有这两个参数,你真的无法估计“米”,因为不同的纬度/经度意味着不同的距离待定你在哪里在这个星球上。在您编写时可能看起来微不足道,但请包含一个表创建语句,以便我们知道您所指的列数据类型【参考方案3】:

老问题,但你只需要这样转换:ST_Distance(p.geom::geography, u.geom::geography) 其中 p 和 u 是两个表的别名

【讨论】:

不推荐。当您转换表中的元素时,您需要对整个表执行顺序扫描并且不能使用任何索引。所以性能会受到很大影响。

以上是关于Postgis 中 2 点之间的距离,单位为 srid 4326,以米为单位的主要内容,如果未能解决你的问题,请参考以下文章

text JS:纬度公式距离Lat,Lng点之间的距离,单位为公里

golang Golang用于计算地球上长纬度点之间的距离(以米为单位)。

如何在点云中找到任何对象的角点并以英寸/厘米/米为单位找到角点之间的距离?

利用SQL计算两个地理坐标(经纬度)之间的地表距离

mysql 下 计算 两点 经纬度 之间的距离 计算结果排序

计算iOS地图上2点之间的距离[关闭]