这可能是一个简单的问题,但我并不擅长PostGIS,也不能完全理解这一切。Postgis中的2个点之间的距离以4326米为单位
基本上我有一个表(nodes
)与一个POINT列(point
)。我已经在这个专栏
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)')
加上)的坐标系统)。对于每个点,我想要找到所有的点,大致位于以该点为中心的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
/etc。所有使用的SRID单位,其中4326/WGS64是度lattitude /经度1 = 1度),但我想用米。
我试图ST_distance_sphere
和st_dwithin
可以使用米,但如果我这样做,explain
显示该索引未被使用。
我怎样才能得到大致我想要的,和使用地理索引?
UPDATE:这是在PostgreSQL 9.1和PostGIS 2.0 svn版本上。
2011-12-11 Rory
+0
的或许有些帮助:[ST_DWithin采用参数为度,而不是米,为什么?(http://stackoverflow.com/questions/8444753/st-dwithin -takes-parameter-as-degree-not-meters-why) – radek
+1
强制性问题:什么是PostGIS版本?什么PostgreSQL版本? – filiprem
A
回答
5
自写这篇文章以来,我发现了“地理”而不是PostGIS中的“几何”类型,它可能正是我想要的。
2011-12-12 12:29:32 Rory
+1
地理应该工作。你没有提到问题中的数据类型。 Geom的问题是它最终是一个2D对象。地理是一个四维物体,其中包含可以转换为米的地球参数的高度和曲率......没有这两个参数,您实际上无法估计“米”,因为不同的纬度/在这个星球上。在编写时可能看起来微不足道,但请包含一个表创建语句,以便我们知道您所指的是哪些列数据类型 – Twelfth
16
您可以使用ST_Transform来使用仪表,也记得并非所有功能都可用于地理类型,但如果您确实需要速度使用ST_DWithin,则是最快的方法。这里的度和米之间转换的aproximation:
| 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 |
评论区