2014-07-08 207 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米左右是非常正確的。感謝您的幫助:) –