1

現在のマップ位置に近い雑貨店のリストを表示しようとしています。

すべてが正常に機能しますが、マップをどこにパンしても、現在のマップの場所に近くない多くの店舗が SQL Server DB から呼び出されることに気付きました。

例:

DBにドイツにあるストアがあります:

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

これを適切に変更する必要があります

編集 式に余分な計算があります。私はあなたが持つべきものを示すために私の声明を編集しました。[] ブラケットを削除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"
于 2013-01-24T11:44:25.210 に答える