2013-01-24 22 views
1

我試圖顯示一個靠近當前地圖位置的一般商店列表。谷歌地圖+從具有海峽網公式的SQL Server到當前位置附近的地方

一切工作正常,但我只是意識到,無論我在哪裏平移地圖,很多商店沒有接近當前地圖位置的地方從我的SQL Server數據庫獲取調用。

例子:

我有一個店,其居住在德國的DB:

Venue  Venue_Lat  Venue_Lng 
Bookstore 51.165712  10.451547 

我使用的半正矢公式我的存儲過程[GetNearbyLocations]來檢索假設商店距離當前位置50英里以內,例如我通過當前位置爲美國,半徑爲50英里:

Radius: 50 
USA Lat: 38.5554745 
USA Lng: -95.6649999 

在德國的商店被叫儘管它不在50英里範圍內。我理解並接受這些公式不是100%準確的,但這是否正常?任何人都可以請在此建議。謝謝。

的存儲過程的一部分:

DECLARE @intMilesModifier int 
SET @intMilesModifier = 3959 

    SELECT .... some fields, 
    [Venue_Lat], 
    [Venue_Long], 
    (@intMilesModifier*acos(cos(radians(@dmlLat))*cos(radians(Venue_Lat))*cos(radians(Venue_Long)-radians(@dmlLng))+sin(radians(@dmlLat))*sin(radians(Venue_Lat)))) AS distance 
    FROM [Stores] a 
    WHERE (@intMilesModifier*acos(cos(radians(@dmlLat))*cos(radians(Venue_Lat))*cos(radians(Venue_Long)-radians(@dmlLng))+sin(radians(@dmlLat))*sin(radians(Venue_Lat)))) < @Radius 

回答

1

這個PHP/MySQL的PDO SQL語句使用(英里6371用於公里,3959)的公式

$stmt = $dbh->prepare("SELECT name, lat, lng, (3959 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance FROM gbstn HAVING distance < ? ORDER BY distance LIMIT 0 , 20"); 
    // Assign parameters 
    $stmt->bindParam(1,$center_lat);//coordinate of center 
    $stmt->bindParam(2,$center_lng);//coordinate of center 
    $stmt->bindParam(3,$center_lat); 
    $stmt->bindParam(4,$radius); 

您將需要修改這西裝

編輯 您在公式中有額外的計算。我編輯了我的陳述以表明你應該擁有什麼。我刪除[]括號和a[Stores] a,不需要別名,但無法運行查詢,因爲我沒有SQL Server。

"SELECT Venue_Lat,Venue_Long,(@intMilesModifier * acos(cos(radians(@dmlLat)) * cos(radians(Venue_Lat)) * cos(radians(Venue_Long) - radians(@dmlLng)) + sin(radians(@dmlLat)) * sin(radians(Venue_Lat)))) AS distance FROM Stores HAVING distance < @Radius ORDER BY distance LIMIT 0 , 20" 
+0

謝謝,我的錯誤,但實際上我使用Harvesine公式以前產生相同的結果,無論如何,我編輯了我的帖子。 – k80sg

+0

謝謝。我認爲這個公式是正確的。你是否可以在你身邊嘗試一下,以確保錯誤在我的終點? – k80sg

+0

我修改了應該運行的代碼。我無法運行它,因爲我沒有SQL服務器 –

相關問題