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

时间:2011-12-11 14:24:23

标签: postgresql geospatial postgis gis

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

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

create index nodes__points on nodes using gist (point)

该列是使用

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

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

对于每个点,我想找到大约在该点上的1km框内的所有点(所以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;。它不一定是精确的,只是一个粗略的人文数字.1km bbox很好,1公里的圆圈很好。它不一定是1公里,只是那个数量级。

ST_Distance / ST_DWithin /等。所有都使用SRID的单位,4326 / WGS64是度(因此1 = 1度的纬度/经度)。但我想用米。

我尝试ST_distance_spherest_dwithin可以使用米,但如果我这样做,explain会显示索引未被使用。

如何大致得到我想要的内容,使用地理索引?

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

3 个答案:

答案 0 :(得分:21)

您可以使用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  |

答案 1 :(得分:5)

自写这篇文章以来,我发现了“地理”而不是PostGIS中的“几何”类型,这可能完全符合我的要求。

答案 2 :(得分:1)

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