1

特定の場所に最も近い店舗の場所を表示する Web サイトに取り組んでいます。私は hasersine 式を使用して距離を決定していますが、XML が作成した距離フィールドを認識できないことを除いて、すべてが機能しています。

switch($unit) {
  case "km":
    $distance = 6371; // KM
    break;
  case "mi":
    $distance = 3959; // KM
    break;
}

$query = "SELECT store_id, name, address, description, longitude, latitude, 
    (? * acos(cos(radians(?)) * cos( radians(latitude)) * cos(radians(longitude)
     - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) 
    AS distanceFromLocation FROM stores";



$stmt = $mysqli->prepare($query);
$stmt->bind_param('iddd', $distance, $user_latitude, $user_longitude, $user_latitude);

$valid_statement = true;
try {
  $stmt->execute();
  $stmt->store_result();
} catch(Exception $e) {
  $valid_statement = false;
  error_log($e->getMessage());
}

if($valid_statement) {

  $stmt->bind_result($store_id, $name, $address, $description, $longitude, $latitude, $distanceFromLocation);

  while($stmt->fetch()) {
    echo $distanceFromLocation;
    $node = $dom->createElement("marker");
    $newnode = $parnode->appendChild($node);
    $newnode->setAttribute("storeid", $store_id);
    $newnode->setAttribute("name", $name);
    $newnode->setAttribute("address", $address);
    $newnode->setAttribute("lat", $latitude);
    $newnode->setAttribute("lng", $longitude);
    $newnode->setAttribute("distance", $distanceFromLocation);
  }
}

distanceFromLocation 変数は、while ループに入るときは常に空です。SQL をテストしたところ、正しい距離値が返されます。距離フィールドにアクセスできない理由はありますか? 計算フィールドだからでしょうか?

4

2 に答える 2

1

switch からの結果を最初のパラメーターとして組み込む必要があります。また、わかりやすくするために $distance を $constant に変更しました。

switch($unit) {//From User
  case "km":
    $constant = 6371; // KM
    break;
  case "mi":
    $constant = 3959; // KM
    break;
}

$query = "SELECT store_id, name, address, description, longitude, latitude, 
    (? * acos(cos(radians(?)) * cos( radians(latitude)) * cos(radians(longitude)
     - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) 
    AS distanceFromLocation FROM stores";



$stmt = $mysqli->prepare($query);
$stmt->bind_param($constant, $distance, $user_latitude, $user_longitude, $user_latitude);
etc.
于 2014-01-03T11:00:03.070 に答える
0

地理空間作業にMySQLを使用する必要がある場合は、式を自分で再実装するのではなく、地理空間サポートを参照してください。パフォーマンス ブログによると、mysql は 2 点間の距離を決定するために st_distance をサポートしています。それを除けば、 st_distance_sphere または st_distance_spheroid を調べることができます。どちらも5.1 でサポートされています。

于 2014-01-02T20:21:04.827 に答える