2012-04-25 118 views
0

我有不同的供應商在我的數據庫中保存了自己的緯度和經度位置。20公里/英里左右,長

然後我使用谷歌地圖,以針點他們在地圖上,但你也有一個搜索功能,你可以輸入你想用5/10/20公里/英里「繞」任何地址。

因此,例如,當我搜索倫敦約10公里,我希望把所有的供應商從倫敦回來lat和長+10公里圍繞該點。

現在我有功能制定出有輕微的差異(顯然不半徑選項)

private function findServicesNearLocation($filter = array(), $lat, $lng) { 
    // set radius 
    $difference = 0.07; 

    // build filter 
    $latitude_from = floatval($lat) - $difference; 
    $latitude_to = floatval($lat) + $difference; 
    $longitude_from = floatval($lng) - $difference; 
    $longitude_to = floatval($lng) + $difference; 

    $filter[] = "a.gps_latitude >= {$latitude_from}"; 
    $filter[] = "a.gps_latitude <= {$latitude_to}"; 
    $filter[] = "a.gps_longitude >= {$longitude_from}"; 
    $filter[] = "a.gps_longitude <= {$longitude_to}"; 

    // return services 
    return $this->vendors->getVendors(implode(' AND ', $filter)); 
} 

我會如何改變上述功能進行適當的估計和選擇所有廠商從特定的「10公里左右」那些經緯度。

謝謝

+0

你可能想看看[此類似的問題(http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude - 經度 - 點)在SO上。 – eggyal 2012-04-25 14:45:53

+0

它是不相似的,人不得不計算兩點之間的距離,我只有1點的空間作爲拉,長,我需要選擇所有我的供應商周圍那個位置20公里或更多 – Highstrike 2012-04-25 15:04:24

+0

原則是相同的。但我授予你,你的問題延伸到你的情況如何應用這個原則。 – eggyal 2012-04-25 15:05:11

回答

1

我覺得這是一個答案,你的要求。經度和緯度相差大約111公里,所以你可以把它算進你的數學中。我希望這是你所問的。

private function findServicesNearLocation($filter = array(), $lat, $lng, $distanceKilometers=0) { 
    // set radius 
    $difference = 0.07; 
    $distance=$distanceKilometers!=0?ceil($distanceKilometers/111):0; 
    // build filter 
    $latitude_from = floatval($lat) - $difference - $distance; 
    $latitude_to = floatval($lat) + $difference + $distance; 
    $longitude_from = floatval($lng) - $difference - $distance; 
    $longitude_to = floatval($lng) + $difference + $distance; 

    $filter[] = "a.gps_latitude >= {$latitude_from}"; 
    $filter[] = "a.gps_latitude <= {$latitude_to}"; 
    $filter[] = "a.gps_longitude >= {$longitude_from}"; 
    $filter[] = "a.gps_longitude <= {$longitude_to}"; 

    // return services 
    return $this->vendors->getVendors(implode(' AND ', $filter)); 
} 
+1

至少,你應該介紹[Pythogras定理(HTTP:/ /en.wikipedia.org/wiki/Pythagorean_theorem)得到一個半徑而不是一個矩形... – eggyal 2012-04-25 14:57:34

+0

@eggyal你能幫我解決嗎? – Highstrike 2012-04-25 15:01:06

+1

@Highstrike:你想'(a.gps_lat- $ lat_from)^ 2 +(a.gps_long- $ long_from)^ 2 <= $ ^距離2' – eggyal 2012-04-25 15:03:00

1

看起來你正在尋找一個矩形,而不是半徑。

對於您可以使用MySQL的空間擴展和閱讀更多關於執行此:Geo-Distance-Search-with-MySQL

但對於您的信息,MongoDB的可以做一個簡單的「選擇」。給他一個位置和一個範圍,它完成了。更多相關信息:MongoDB Geospatial Indexing

+0

雖然這可能是最好的辦法,但安裝擴展是不可能的,因爲業主對此非常嚴格,不過我喜歡以下查詢 – Highstrike 2012-04-25 15:16:16

+0

'SELECT destination。*,3956 * 2 * ASIN( SQRT(POWER(SIN((ori​​g.lat -dest.lat)* pi()/ 180/2),2)+ COS(orig.lat * pi()/ 180)* COS(dest.lat * pi/180)* POWER(SIN((ori​​g.lon -dest.lon)* pi()/ 180/2),2)))asdistance FROM用戶目的地,用戶originWHERE origin.id =用戶標識 和lon1之間的destination.longitude以及具有距離 Highstrike 2012-04-25 15:17:11

+0

雖然這將是我的選擇作爲答案,因爲嚴格的業主我不能使用這個,對不起。 – Highstrike 2012-04-25 15:17:49

-2
SELECT Latitude, Longitude, 111.045* DEGREES(ACOS(COS(RADIANS(latpoint)) * COS(RADIANS(Latitude)) * COS(RADIANS(longpoint) - RADIANS(Longitude)) + SIN(RADIANS(latpoint)) * SIN(RADIANS(Latitude)))) AS distance_in_km FROM table JOIN (SELECT 42.81 AS latpoint, -70.81 AS longpoint) AS p ON 1=1 ORDER BY distance_in_km LIMIT 15 
+0

沒有任何上下文或評論的公式對任何人都沒有多大用處。 – Teepeemm 2015-07-08 14:38:27

+0

小心解釋你在那裏做了什麼?謝謝。 – Highstrike 2015-07-09 03:06:07