2010-08-16 111 views
3

想找到給定的地點或地址的所有附近的地方。有沒有谷歌地圖API?或者我們需要按照如下步驟進行:我如何找到附近的位置使用谷歌地圖api

  1. 查找該地點的經緯度。

  2. 做一些處理並獲得近似長度。

  3. 使用獲得的來自步驟2的經緯度長度對反向地理編碼進行反向地址編碼,並找到每個經緯度長度對的位置。

澄清我。另外,如果你可以提高步驟2,那就太棒了。

此方法是否有效?你能澄清一下嗎?

+0

鄰近_whats_? – SLaks 2010-08-16 17:55:59

+0

你的意思是「接近地點」是什麼意思? – 2010-08-16 17:58:22

+0

附近的地點/地理位置更精確 – nepsdotin 2010-08-17 02:59:28

回答

3

這真的取決於您所尋找的附近事物是否在Google數據庫中作爲感興趣的地方,或者它們是否是任意地址/位置。

如果它們是地址/位置,則類似於您指定的內容是正確的。你想

  1. 地理編碼的所有地方,包括並將其存儲在一個數據庫(與緯度/經度)
  2. 地理編碼你在的地方(你想要的信息)
  3. 使用數學例程球體上的距離,列出指定距離內的地方

的數學是:

  1. 獲取當前的緯度和經度弧度(LatOrLon * PI/180)
  2. 獲取弧度(LatOrLon * PI/180)
  3. 讓您的球體的半徑(在這種情況下,地球= 3963.1數)
  4. 使用目標經緯度長期複雜和混亂forumla

以下(其中LAT1和Lon1在弧度和LAT2和Lon2您當前的位置是在弧度目標):

Acos(
    Cos(Lat1) * Cos(Lon1) * Cos(Lat2) * Cos(Lon2) + 
    Cos(Lat1) * Sin(Lon1) * Cos(Lat2) * Sin(Lon2) + 
    Sin(Lat1) * Sin(Lat2) 
    ) * EarthRadiusInMiles 

這可以使用SQL F爲完成(MSSQL,但是你可以很容易地將這個邏輯編碼到大多數其他語言中)。

CREATE FUNCTION [dbo].[CoordinateDistanceMiles](
@Latitude1 float, 
@Longitude1 float, 
@Latitude2 float, 
@Longitude2 float 
) 
RETURNS float 
AS 
BEGIN 

-- SAME LOCATION, RETURN 0 
IF @Latitude1 = @Latitude2 AND @Longitude1 = @Longitude2 RETURN 0.00 

-- CONSTANTS 
DECLARE @EarthRadiusInMiles float; 
SET @EarthRadiusInMiles = 3963.1 
DECLARE @PI float; 
SET @PI = PI(); 

-- RADIANS conversion 
DECLARE @lat1Radians float; 
DECLARE @long1Radians float; 
DECLARE @lat2Radians float; 
DECLARE @long2Radians float; 

SET @lat1Radians = @Latitude1 * @PI/180; 
SET @long1Radians = @Longitude1 * @PI/180; 
SET @lat2Radians = @Latitude2 * @PI/180; 
SET @long2Radians = @Longitude2 * @PI/180; 

RETURN Acos(
Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) + 
Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) + 
Sin(@lat1Radians) * Sin(@lat2Radians) 
) * @EarthRadiusInMiles; 
END 
從任何電話查詢您可以通過距離排序,例如

然後:

CREATE PROCEDURE [dbo].[NearbyThings] 
(
@Lat float, 
@Lon float, 
@Num int = 10 
) 

AS 

SET NOCOUNT ON 

Select Top (@Num) 
'Distance' = Round(dbo.CoordinateDistanceMiles(@Lat, @Lon, Lat, Lon), 1), 
ThingId, 
Postcode, 
Lat, 
Lon 
From 
Things 
Order by 
dbo.CoordinateDistanceMiles(@Lat, @Lon, Lat, Lon) ASC 
GO 
+0

+1組織良好的答案 – amd 2012-08-02 09:44:30

相關問題