我正在创建一个Android应用程序,它应该从sql表中获取数据。在我的sql表中,我有存储在其中的纬度和经度坐标。我能够将当前位置坐标从我的应用程序传递给PHP代码。现在我想获取当前位置坐标和存储的坐标之间的距离必须 <= 50千米的记录。我怎么能这样做。
我使用GET
方法从android应用程序中获取当前位置。
提前致谢。
答案 0 :(得分:0)
一般来说,您应该尽力让SQL为您完成工作。这样就可以最小化返回PHP的结果数量。
您正在寻找的是Haversine Formula。
要在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;