1

我正在尝试显示靠近当前地图位置的一般商店列表。

一切正常,但我刚刚意识到,无论我将地图平移到哪里,许多离当前地图位置不远的商店都会从我的 SQL Server 数据库中调用。

例子:

我在数据库中有一家位于德国的商店:

Venue        Venue_Lat       Venue_Lng
Bookstore    51.165712       10.451547

我在我的存储过程 [GetNearbyLocations] 中使用 Haversine 公式来检索假定在当前位置 50 英里范围内的商店,假设我通过半径为 50 英里的 USA 的当前位置:

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
4

1 回答 1

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);

您需要修改它以适应

编辑 您的公式中有额外的计算。我已经编辑了我的声明以显示您应该拥有的内容。我删除了 [] 括号和afrom [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"
于 2013-01-24T11:44:25.210 回答