簡體   English   中英

計算從SQL Server提取的兩個位置坐標之間的距離

[英]Calculating the distance between two location coordinates fetching from SQL server

我正在創建一個Android應用程序,它應該從sql表中獲取數據。 在我的sql表中,我存儲了緯度和經度坐標。 而且我能夠將當前位置坐標從我的應用程序傳遞到PHP代碼。 現在,我想獲取記錄,其中當前位置坐標與存儲的坐標之間的距離必須<= 50 km 我該怎么做。

我已經使用GET方法從android應用程序中獲取當前位置。

提前致謝。

一般來說,您應該盡力讓SQL為您完成工作。 這樣,您可以最大程度地減少返回到PHP的結果數。

您正在尋找的是Haversine公式

要在SQL中完成查找,您需要將兩個緯度和經度點傳遞到SQL查詢中。 這是在公里中進行距離查找所需的SQL的示例:

DECLARE @MyLat DECIMAL(18,6) = 50.066388;
DECLARE @MyLong DECIMAL(18,6) = -5.714722;

DECLARE @PointLat DECIMAL(18,6) = 58.643888;
DECLARE @PointLong DECIMAL(18,6) = -3.069999;

SELECT 6371 * ACOS(COS(RADIANS(@MyLat))
    * COS(RADIANS(@PointLat))
    * COS(RADIANS(@MyLong) - RADIANS(@PointLong))
    + SIN(RADIANS(@MyLat))
    * SIN(RADIANS(@PointLat))) AS [DISTANCE_KM];

因此,您可以像這樣來分隔數據庫查詢:

SELECT *
FROM LOOKUPTABLE
WHERE (6371 * ACOS(COS(RADIANS(@MyLat))
    * COS(RADIANS(PointLat))
    * COS(RADIANS(@MyLong) - RADIANS(PointLong))
    + SIN(RADIANS(@MyLat))
    * SIN(RADIANS(PointLat)))) <= 50

編輯:只要您正在運行SQL Server 2008或更高版本,就可以使用地理數據類型來完成此操作。 通過這種方式,您可以獲得基於地理位置的更准確結果:

DECLARE @MyLoc geography = geography::STGeomFromText('POINT(50.066388 -5.714722)', 4326);
DECLARE @MapLoc geography = geography::STGeomFromText('POINT(58.643888 -3.069999)', 4326);

SELECT @MyLoc.STDistance(@MapLoc)/1000;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM