2012-01-24 60 views
23

我有一個數據庫當前填充大約10k行。他們都有一個基於郵編中心的經度/緯度。我發現了一個我現在試圖擴展的查詢,但總的來說,它很好地適用於某一點。然而,在我下面的例子中,我試圖找到25英里範圍內的東西,這在所有方面似乎都起作用。我的大部分成績在25英里的標準範圍內都能達到標準,但是我得到了一小部分標準,從86英里到800英里。mySQL經度和緯度查詢x英里半徑內的其他行

舉例: 這是我中心經/緯度:37.2790669,-121.874722 =加利福尼亞州聖何塞, 即時得到結果,如:33.016928,-116.846046 =聖迭戈,加利福尼亞是從聖何塞約355英里。

我當前查詢的樣子:

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) 
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC" 

回答

72

下面是我在商店定位器我一起工作,使用查詢:

SELECT 
    `id`, 
    (
     6371 * 
     acos(
      cos(radians(:lat)) * 
      cos(radians(`lat`)) * 
      cos(
       radians(`long`) - radians(:long) 
      ) + 
      sin(radians(:lat)) * 
      sin(radians(`lat`)) 
     ) 
    ) `distance` 
FROM 
    `location` 
HAVING 
    `distance` < :distance 
ORDER BY 
    `distance` 
LIMIT 
    25 

:lat:long是用戶在通過點latlong是存儲在數據庫中的點。

的:距離用英里測量,在代碼的工作版本:距離實際上是從下拉從10-50英里

更改代碼公里上下班,可通過以下方式實現拉感謝joshhendo爲這一解決方案改變了3959(從地球中心到地表的距離)到6371(轉換爲公里的3959英里)。

+1

很高興爲你工作 – Gordnfreeman

+3

Gordnfreeman,你能告訴我「<25」代表什麼嗎?那是25英里還是公里?如果你不介意與我進行快速聊天,我還有另外一個問題要問你? – dcolumbus

+0

有沒有什麼辦法可以輕鬆將其轉換爲使用KM的?我認爲它在查詢開始時與3935有關,但不太確定它的功能。 – joshhendo

相關問題