如何在纯PHP中返回半径内的坐标?(没有MySQL)

如何在纯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

我已经在MySQL中做了很多年了,但是如何在PHP中做呢

示例坐标轴:

我想返回给定坐标100英里内的所有坐标

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