1

ネット上で見つけた次のスクリプトを使用して、指定された設定座標間のすべての郵便番号を取得しています。

それを使用するとき、私の懸念は、取得されているいくつかの郵便番号が入力された距離よりも大きい場合です。それほどではありません-約20キロオフ。

function GetPostalCodes($latitude, $longitude, $range) {
    $radius = 3959;
    $north = rad2deg(asin(sin(deg2rad($latitude)) * cos($range / $radius) + cos(deg2rad($latitude)) * sin($range / $radius) * cos(deg2rad(0))));
    $south = rad2deg(asin(sin(deg2rad($latitude)) * cos($range / $radius) + cos(deg2rad($latitude)) * sin($range / $radius) * cos(deg2rad(180))));
    $east = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(90)) * sin($range / $radius) * cos(deg2rad($latitude)), cos($range / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($north))));
    $west = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(270)) * sin($range / $radius) * cos(deg2rad($latitude)), cos($range / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($north))));
    $return = DBSelectAllArrays("SELECT postal FROM postalcodes WHERE (latitude <= $north AND latitude >= $south AND longitude <= $east AND longitude >= $west)");
    krsort($return);
    if (empty($return)) return false;
    return $return;
}

より正確な結果を得るために私が見逃しているものはありますか?

4

2 に答える 2

0

あなたのコメントを考えると:

$radius = 6371.0; // mean radius of Earth in km

これはウィキペディアから引用したものですが、他の情報源からは+/-3kmの許容範囲内であることがわかりました。大圏距離の計算を使用しているかどうか疑問に思い始めましたが、これは地表の曲率のため、長距離での精度にとってより重要です。

于 2012-12-01T03:10:24.463 に答える
0

ティム、最初はバウンディングボックス(長方形)を使用し、次に半正矢関数を使用すると、半径(円)が得られます。これは、特定の距離内に人がいる場合に一般的にはるかに優れています。あなたはあなたの目的を述べていませんが、あなたがあなたに一定の距離を移動するかもしれない人々を探しているなら、あなたは形が異なる大都市圏を考慮したいかもしれません。もしそうなら、見てください:カナダの大都市圏のデータ

于 2013-01-12T20:29:31.263 に答える