如何在纯PHP中返回半径内的坐标?(没有MySQL)
我已经在MySQL中做了很多年了,但是如何在PHP中做呢 示例坐标轴: 我想返回给定坐标100英里内的所有坐标如何在纯PHP中返回半径内的坐标?(没有MySQL),php,distance,euclidean-distance,Php,Distance,Euclidean Distance,我已经在MySQL中做了很多年了,但是如何在PHP中做呢 示例坐标轴: 我想返回给定坐标100英里内的所有坐标 function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) { // return $resultArray; } 在MySQL中,我通常使用如下查询: SELECT *, ( 3959 * acos( cos( radians($latitude) ) * cos( radians
function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
//
return $resultArray;
}
在MySQL中,我通常使用如下查询:
SELECT *, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROM table HAVING distance < $radius ORDER BY distance;
如何在PHP中执行相同的操作?在下面的代码中,我假设坐标对象仅存储为一个两元素数组,用于$center参数和$coordinarray中的坐标。如果不是的话,你需要改变的应该是相当明显的
function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
$resultArray= array();
$lat1 = $center[0];
$long1 = $center[1];
foreach ($coordinateArray as $coordinate) {
$lat2 = $coordinate[0];
$long2 = $coordinate[1];
$distance = 3959 * acos(cos(radians($lat1)) * cos(radians($lat2)) * cos(radians($long2) - radians($long1)) + sin(radians($lat1)) * sin(radians($lat2)));
if ($distance < $radius) $resultArray[] = $coordinate;
}
return $resultArray;
}
这是假设坐标以度为单位。这里是James共享的更重要的函数版本
/**
* @author WPExperts
* @usange to get array of all markers within certain radius
* @param $coordinateArray
* @param $center
* @param $radius
* @return array
*/
function wpe_getCoordinatesWithinRadius ( $lat1 , $lng1 , $radius , $available_markers ) {
$stores_data = $available_markers;
$resultArray= array();
foreach ( $stores_data as $store ) {
$lat2 = $store->lat;
$lng2 = $store->lng;
$distance = 3959 * acos(cos(wpe_radians($lat1)) * cos(wpe_radians($lat2)) * cos(wpe_radians($lng2) - wpe_radians($lng1)) + sin(wpe_radians($lat1)) * sin(wpe_radians($lat2)));
if ($distance < $radius){
$resultArray[] = (object) array( 'ID' => $store->ID , 'lat' => $store->lat , 'lng' => $store->lng , 'distance' => $distance );
}
}
// need to return id,distance,lat and lng
return $resultArray;
}
/**
* @usage to convert degree into radians
* @param $deg
* @return float
*/
function wpe_radians($deg) {
return $deg * M_PI / 180;
}
希望这可以帮助社区中的其他人。使用数组过滤器并执行相同的计算。是否需要进一步澄清?在MySQL中,我处理的是列。我是否要用lat/long的数组过滤器替换这些过滤器?在PHP中,应该有一个二维数组。过滤第一个维度,filter函数接收包含lat和long的两元素数组。我得走了,所以我不能告诉你细节。这是打字错误吗?弧度$long2-弧度$long2?那不是零吗?“你是说弧度$long1-弧度$long2吗?”Ryan说得很对。那是个打字错误。但是我相信如果原始sql查询是正确的,那么它应该是cosradians$long2-radians$long1。我已经更新了答案。谢谢
/**
* @author WPExperts
* @usange to get array of all markers within certain radius
* @param $coordinateArray
* @param $center
* @param $radius
* @return array
*/
function wpe_getCoordinatesWithinRadius ( $lat1 , $lng1 , $radius , $available_markers ) {
$stores_data = $available_markers;
$resultArray= array();
foreach ( $stores_data as $store ) {
$lat2 = $store->lat;
$lng2 = $store->lng;
$distance = 3959 * acos(cos(wpe_radians($lat1)) * cos(wpe_radians($lat2)) * cos(wpe_radians($lng2) - wpe_radians($lng1)) + sin(wpe_radians($lat1)) * sin(wpe_radians($lat2)));
if ($distance < $radius){
$resultArray[] = (object) array( 'ID' => $store->ID , 'lat' => $store->lat , 'lng' => $store->lng , 'distance' => $distance );
}
}
// need to return id,distance,lat and lng
return $resultArray;
}
/**
* @usage to convert degree into radians
* @param $deg
* @return float
*/
function wpe_radians($deg) {
return $deg * M_PI / 180;
}