我正在使用非常similar question的解决方案,在实施后,我发现它生成了一个带有返回坐标而不是正方形的高矩形(请参阅Matthias对其他问题的回答)。 / p>
我只需要返回一个数组,因为这可以使用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的lat / lng,函数返回这个数组:
Array
(
[max_latitude] => -4.18326890233
[min_latitude] => -4.32800049767
[max_longitude] => 55.9346130696
[min_longitude] => 55.7894813304
)
有什么想法吗?非常感谢提前。
干杯, 罗伯特
答案 0 :(得分:5)
这是您的修改功能,它将为您提供方形坐标而不是高大的矩形:
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;
}
干杯,
Rupesh Kamble
答案 1 :(得分:0)
我曾经写过这个函数来计算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);
}
答案 2 :(得分:0)
我需要相同的函数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 ;