2014-07-08 87 views
6

我现在正在做一个室内地图导航应用程序,我想要做的是在建筑物中建立一个地图点数据库。PostGis距离计算

我使用的所有坐标都来自Google Map(这意味着EPSG是3857)。我现在需要做的是找到米的距离以及使用D_Within米

当我尝试2点之间解压出来的距离:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857), 
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857)) 
FROM i3_building.floordata; 

对于第2排有:

鉴于
Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away) 
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away) 

结果是:

2.59422435413724e-005 
4.11096095831604e-005 

即使他们是在弧度,第二重这只是第一次的两倍。所以这让我感到困惑。 后来我试着将它输出为米:

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'), 
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')')) 
FROM i3_building.floordata; 

为同一行给出的结果是:

2.872546829 
4.572207435 

这不是我所预期的那样好。 我对PostGis和SRID并不是很熟悉,所以这个问题可能看起来很简单,但请你帮我解决,我被卡住了@@

回答

11

你的坐标参考系统(CRS)是4326,lat/lon。这是与Google地图混淆的常见原因:3857是Google Maps针对其贴图使用的CRS,并且是基于球形地球投影米。添加到Google地图中的矢量源(KML数据,GPS转储等)往往位于经度/度量单位4326中,这些度量单位是度量单位,可以即时转换。

如果您想要两个纬度/经度点之间的距离,请使用ST_Distance_Sphere。例如,对于您的第一组积分,

select st_distance_sphere(st_makepoint(103.776047, 1.292149),st_makepoint(103.77607, 1.292212)); 

这给出7.457米。根据相同的查询,您的第二组点距离彼此62.74米。

请注意,也有ST_Distance_Spheroid它需要第三个参数,测量球体,即近似的地球形状。这可能会更准确,但可能在小距离上并不显着。

ST_Distance给出了投影坐标中的距离,这可能是为什么你得到奇怪的结果堵塞纬度/经度值。

+0

感谢您的回复。 我也尝试过4326,但与3857没有太大区别。 对于第一组的距离,它距离我的办公室3米远,所以我对它非常了解。 我也尝试从这里计算它:http://boulter.com/gps/distance/ - 相同的结果,3米。 –

+0

你是什么意思没有太大的不同?我会说7.45米和62.74是完全不同的。不过,这是st_distance_sphere问题,因为这需要经纬度输入,其中st_distance需要距离投影坐标。 3857和4326是完全不同的,分别是米和度,但您必须将它们插入正确的功能才能得到正确的答案:D –

+0

对不起,只是出去试一试,大概7米左右是非常正确的。感谢您的帮助:) –