寻找最近的驾驶距离

时间:2017-08-07 18:10:04

标签: php google-maps

我有一系列函数用于计算从目标地址到我的几个位置之一的最近行驶距离,并且在大多数情况下它运行良好。它首先获得我最近的位置,因为乌鸦飞行,然后使用该地址计算到目标地址的实际行驶距离,这就是问题所在。有时乌鸦飞行的距离离一个位置更近,但距离另一个位置更近,所以如何从头开始计算行驶距离并跳过乌鸦飞行计算?

// Provides "as the crow flies" distance from my closest location to target address
function closestLocation($Address) {
    $values = locationFromAddress($Address);
    $center_lat = $values[0];
    $center_lng = $values[1];   
    // My locations
    $query = sprintf("SELECT ID, Address, (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(lng) - radians('%s')) + sin(radians('%s')) * sin( radians(lat)))) AS Distance 
    FROM locations 
    WHERE Address > 0 AND lat <> 0 AND lng <> 0 
    ORDER BY Distance ASC
    LIMIT 1",
      $center_lat,
      $center_lng,
      $center_lat);
    $rowCat = DBConnect($query, "Select", "pchome_geoip");

    // Returns array of the location
    return $rowCat;
}

您可以看到查询只使用存储在数据库中的纬度和经度,使用locationFromAddress()函数提供的目标地址的纬度和经度来计算它:

function locationFromAddress($Address) {
    $Address = urlencode($Address);
    if ($Address) :
        $geocode = file_get_contents("http://maps.google.com/maps/api/geocode/json?address=$Address&sensor=false");
        $output = json_decode($geocode);
        $lat = $output->results[0]->geometry->location->lat;
        $long = $output->results[0]->geometry->location->lng;
        return array($lat,$long);
    else:
        return "";
  endif;
}

然后使用Google API计算驾驶距离:

function compareDistance($unit,$inLatitude,$inLongitude,$outLatitude,$outLongitude) {
    $url = "http://maps.googleapis.com/maps/api/directions/json?origin=$inLatitude,$inLongitude&destination=$outLatitude,$outLongitude&sensor=false";

    // Retrieve the URL contents
    $c = curl_init();
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_URL, $url);
    $jsonResponse = curl_exec($c);
    curl_close($c);

    $dataset = json_decode($jsonResponse);
    if(!$dataset)
        return 0;
    if(!isset($dataset->routes[0]->legs[0]->distance->value))
        return 0;
    $miles = ($dataset->routes[0]->legs[0]->distance->value * .00062);
    // Google API returns meters, multiplied by .00062 to get miles

    // Round up to nearest unit
    if ($unit == "K") :
        return ceil($miles * 1.609344);
    elseif ($unit == "N") :
        return ceil($miles * 0.8684);
    else :
        return ceil($miles);
    endif;
}

function getDrivingDistance($myAddress, $custAddress, $unit) {
    // 'M' is statute miles
    // 'K' is kilometers
    // 'N' is nautical miles
    // Get accurate latitude and longitude based on actual location
    $myValues = locationFromAddress($myAddress);
    $myLat = $myValues[0];
    $myLng = $myValues[1];  

    $custValues = locationFromAddress($custAddress);
    $custLat = $custValues[0];
    $custLng = $custValues[1];

    // Returns actual driving distance
    return compareDistance($unit,$myLat,$myLng,$custLat,$custLng);
}

此外,是否存在最接近而非最快路线的API参数?

1 个答案:

答案 0 :(得分:0)

我重写了这个函数并完全删除了nearestLocation()和另一个函数,所以它确实简化了一些事情。我需要重新安排其他几个区域的调整,但它似乎确实拉出了有效的行驶距离,尽管有时它是最快的,而不是最接近的。是否有最近的Google API切换?

function getDrivingDistance($Address,$unit="M") {
    if ($Address) :
        $values = locationFromAddress($Address);
        $inLatitude = $values[0];
        $inLongitude = $values[1];  

        // Fetch all of my locations
        $sqlLocation = "SELECT ID, Address, lat, lng 
                        FROM locations";
        $rowLocation = DBConnect($sqlLocation, "Multiple", "pchome_geoip");

        // Create array of driving distances based on latidude and longitude
        foreach ($rowLocation as $key) :
            $outLatitude = $key['lat'];
            $outLongitude = $key['lng'];
            $output[] = compareDistance($inLatitude,$inLongitude,$outLatitude,$outLongitude,$unit);
        endforeach;

        //sort($output, SORT_NUMERIC);
        if (array_sum($output) > 0) :
            return min(array_diff($output,array(0)));
        else :
            return 0;
        endif;
    endif;
}