2015-04-26 71 views
1

點:基於http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL地理SQL找到使用下面的SQL我附近位置

SELECT * , 3956 *2 * ASIN(SQRT(POWER(SIN((
- 36.8812573 - abs(stop_lat)) * pi() /180 /2) , 2) + COS(- 36.8812573 * pi() /180) * COS(abs(stop_lat) * pi() /180) * POWER(SIN((174.63832160000004 - stop_lon) * pi() /180 /2) , 2)) 
) AS distance 
FROM stops 
HAVING distance <100 
LIMIT 0 , 30 

要看到的是我當前的緯度和經度的半徑內停止。

我正在使用GTFS數據,模式如下。 (lat和lon和最後兩列)

01 7106 210 Victoria St  -36.8481990  174.7544900 
0002 7108 220 Victoria St  -36.8481710  174.7523800 
0003 7110 36 College Hill  -36.8485220  174.7485400 
0004 7112 68 College Hill  -36.8479760  174.7466700 
0005 7114 2 Jervois Rd -36.8471670  174.7437800 
0006 7116 90 Jervois Rd -36.8453760  174.7408300 
0007 7118 160 Jervois Rd -36.8453250  174.7373100 
0008 7120 206 Jervois Rd -36.8454990  174.7354500 
0009 7122 270 Jervois Rd -36.8474010  174.7321400 
0012 7121 203 Jervois Rd -36.8473770  174.7319200 
0013 7119 165 Jervois Rd -36.8454100  174.7348400 

表結構是這樣的:

enter image description here

據我所看到的,查詢應該返回了一定的成效。但事實並非如此。任何人都可以告訴我我可能會錯過什麼嗎?

***更新***********

我發現我不見了臨時輸出表名,所以現在我收到了一定的成效。但是,它們距我的位置有5000英里的距離。有任何想法嗎?

更新SQL:

SELECT * , 3956 *2 * ASIN(SQRT(POWER(SIN((
- 36.8812573 - abs(stop_lat)) * pi() /180 /2) , 2) + COS(- 36.8812573 * pi() /180) * COS(abs(stop_lat) * pi() /180) * POWER(SIN((174.63832160000004 - stop_lon) * pi() /180 /2) , 2)) 
) AS distance 
FROM stops dest 
HAVING distance <5100 
ORDER BY distance 
LIMIT 10 

感謝,

+0

請詳細說明所用的配方。有相當多的魔法數字,單位沒有指定。 –

+0

順便說一句,指定你的當前位置爲幻數也不是一個好主意(更不用說爲了理解的目的)。 –

+0

@ivan_pozdeev公式參考鏈接 – Yonkee

回答

2

我懷疑公式是罪魁禍首。即使你從可靠的來源獲得它並且在實施過程中沒有任何錯誤,也可以例如是單位混亂。

  • 出現錯誤:abs從不需要,the ‘haversine’ formula中沒有這種東西。在第二種情況下,它不會改變任何內容,因爲cos是一個偶數函數,但在第一種情況下,它確實如此。
+0

刪除ABS,它的作品。伊萬我的男人,你是一個天才。 – Yonkee