【问题标题】:php: finding latitude and longitude boundaries based on a central lat/lng and distancephp:根据中心纬度/经度和距离查找纬度和经度边界
【发布时间】:2012-09-07 15:07:09
【问题描述】:

我正在使用similar question 的解决方案,实施后我发现它正在生成一个带有返回坐标而不是正方形的高矩形(请参阅 Matthias 对另一个问题的回答)。

我只需要返回一个数组,因为这是与 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;
    
}

如果我给我地理编码(通过谷歌地图 API)我想要的邮政编码 G2 1QX 和 5 英里的距离,我得到 -4.2556347/55.8620472 的纬度/经度,函数返回此数组:

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

有什么想法吗?非常感谢。

干杯, 回复

【问题讨论】:

    标签: php latitude-longitude


    【解决方案1】:

    这是您的函数,其中包含我的修改,它将为您提供方形坐标而不是高矩形:

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

    干杯,

    鲁佩什·坎布尔

    【讨论】:

    • 非常感谢您提供的好方法。但是这里有一个小错误:删除 maxLng 和 minLng 中除法的第一部分周围的括号。只除rad2deg( $distance / $radius) 而不是$lng 否则结果会很差。
    • 谢谢,蒂姆。正确的代码是: $maxLng = ( float ) $lng + rad2deg( $distance / $radius) / cos( deg2rad( ( float ) $lat ) ); $minLng = ( float ) $lng - rad2deg( $distance / $radius) / cos( deg2rad( ( float ) $lat ) );
    【解决方案2】:

    我曾经写过这个函数来计算两点之间的距离,单位是公里(km)而不是英里。我为英里答案写了一个快速修改

    /**
     * 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);
    }
    

    【讨论】:

    • 感谢 Bearwulf,一旦我的查询被缩减,这将非常方便:)
    【解决方案3】:

    我需要同样的函数 sql,所以我将它转换为 sql 语句 这就是我们可以使用 sql 查询调用的方式

    select bar_get_nearby(4.860416,-58.93018, 100 ,@"mi")
    

    特别感谢Rupesh K

    DELIMITER $$
    CREATE FUNCTION bar_get_nearby(lat FLOAT,lng FLOAT,distance FLOAT,unit VARCHAR(3)) RETURNS TEXT
    BEGIN
    
      DECLARE radius FLOAT;
      DECLARE maxLat FLOAT;
      DECLARE minLat FLOAT;
      DECLARE maxLng FLOAT;
      DECLARE minLng FLOAT;
      DECLARE max_min_values TEXT;
    
      CASE unit
        WHEN  'km' THEN
           SET radius = 6371.009;
        WHEN 'mi' THEN
           SET radius = 3958.761;
        ELSE
           SET radius = 3958.761;
      END CASE;
    
       SET maxLat = lat + degrees( distance / radius );
       SET minLat = lat - degrees( distance / radius );
    
    
       SET maxLng = lng + degrees( distance / radius) / COS( radians( lat ) );
       SET minLng = lng - degrees( distance / radius) / COS( radians( lat ) );
    
        SET max_min_values = concat('north=' , maxLat, '&south=' , minLat,'&east=' , maxLng, '&west=' , minLng);
    
      RETURN max_min_values;
    END$$
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多