8

私は非常によく似た質問の解決策に取り組んでいましたが、実装時に、正方形ではなく返された座標を持つ背の高い長方形を生成していることを発見しました (他の質問に対するマティアスの回答を参照してください)。

これは、独自の優先クエリメソッドを持つ WordPress で動作するため、返される配列のみが必要でした。

これが私の実装です:

function bar_get_nearby( $lat, $lng, $limit = 50, $distance = 50, $unit = 'mi' ) {
    
    // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius'
    if( $unit == 'km' ) { $radius = 6371.009; }
    elseif ( $unit == 'mi' ) { $radius = 3958.761; }

    // latitude boundaries
    $maxLat = ( float ) $lat + rad2deg( $distance / $radius );
    $minLat = ( float ) $lat - rad2deg( $distance / $radius );

    // longitude boundaries (longitude gets smaller when latitude increases)
    $maxLng = ( float ) $lng + rad2deg( $distance / $radius / cos( deg2rad( ( float ) $lat ) ) );
    $minLng = ( float ) $lng - rad2deg( $distance / $radius / cos( deg2rad( ( float ) $lat ) ) );

    $max_min_values = array(
        'max_latitude' => $maxLat,
        'min_latitude' => $minLat,
        'max_longitude' => $maxLng,
        'min_longitude' => $minLng
    );
    
    return $max_min_values;
    
}

希望する郵便番号 G2 1QX と 5 マイルの距離を (Google Maps API 経由で) ジオコーディングすると、次の配列を返す関数で緯度/経度 -4.2556347/55.8620472 が得られます。

Array
(
    [max_latitude] => -4.18326890233
    [min_latitude] => -4.32800049767
    [max_longitude] => 55.9346130696
    [min_longitude] => 55.7894813304
)

何か案は?よろしくお願いします。

乾杯、RS

4

3 に答える 3

8

これは、背の高い長方形の代わりに正方形の座標を提供する、私の変更を含む関数です。

function bar_get_nearby( $lat, $lng, $limit = 50, $distance = 50, $unit = 'mi' ) {
    // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius'
    if( $unit == 'km' ) { $radius = 6371.009; }
    elseif ( $unit == 'mi' ) { $radius = 3958.761; }

    // latitude boundaries
    $maxLat = ( float ) $lat + rad2deg( $distance / $radius );
    $minLat = ( float ) $lat - rad2deg( $distance / $radius );

    // longitude boundaries (longitude gets smaller when latitude increases)
    $maxLng = ( float ) $lng + rad2deg( $distance / $radius) / cos( deg2rad( ( float ) $lat ) );
    $minLng = ( float ) $lng - rad2deg( $distance / $radius) / cos( deg2rad( ( float ) $lat ) );

    $max_min_values = array(
        'max_latitude' => $maxLat,
        'min_latitude' => $minLat,
        'max_longitude' => $maxLng,
        'min_longitude' => $minLng
    );

    return $max_min_values;
}

乾杯、

ルペッシュ・カンブル

于 2013-11-27T09:52:22.250 に答える
0

私はかつてこの関数を作成して、マイルではなくキロメートル(km)で2点間の距離を計算しました。マイルの答えを簡単に修正しました

/**
 * The Haversine function can be used to calculate the distance between 2 points on a map
 *
 * @param  float $lat1 The longtitude value of the first point
 * @param  float $lon1 The lattitude of the frist point
 * @param  float $lat2 The longtitude value of the second point
 * @param  float $lon2 The lattitude of the second point
 * @return float       The distance between the points in mile
 *
 * @access public
 **/
public function harversineDistance($lat1, $lon1, $lat2, $lon2)
{
    $latd = deg2rad($lat2 - $lat1);
    $lond = deg2rad($lon2 - $lon1);
    $a = sin($latd / 2) * sin($latd / 2) +
        cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
        sin($lond / 2) * sin($lond / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));

    // Original return for the km answer
    //return 6371.0 * $c;

    // Return for the mile answer on 2 digits percision
    return round(((6371.0 * $c) * 0.621371192), 2);
}
于 2012-09-14T12:54:36.820 に答える