我正在尝试显示靠近当前地图位置的一般商店列表。
一切正常但我只是意识到无论我在哪里平移地图,很多不在当前地图位置附近的商店都会从我的SQL Server数据库中调用。
示例:
我在DB中有一家居住在德国的商店:
Venue Venue_Lat Venue_Lng
Bookstore 51.165712 10.451547
我在我的存储过程[GetNearbyLocations]中使用Haversine公式来检索假设在当前位置50英里范围内的商店,比如我在当前位置传递的美国半径为50英里:< / p>
Radius: 50
USA Lat: 38.5554745
USA Lng: -95.6649999
德国的商店即使不在半径50英里范围内也会被召唤。我理解并接受这些公式不是100%准确但这是通常的吗?任何人都可以请就此提出建议。感谢。
SProc的一部分:
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
答案 0 :(得分: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"