私は、目標アドレスからいくつかの場所のうちの1つに最も近い運転距離を計算するために使用される一連の関数を持っています。まず、カラスが飛んでいくのに最も近い場所を取得し、そのアドレスを使用してターゲットアドレスまでの実際の走行距離を計算します。これが問題の場所です。時にはカラスが距離を飛ぶように1つの場所に近いが、他のドライブに近いので、私はどのように最初から運転距離を計算し、カラス飛行計算をスキップすることができますか?最も近い運転距離を見つける
// 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のパラメータではなく、最速よりもありますルート?
関連する質問:(https://stackoverflow.com/questions/11345165/how-to-find-optimal-route-to-one-of [多くのマーカーの一つに、最適なルートを見つけるには?] -many-marker) – geocodezip
[Google Maps API - 郵便番号に最も近いポイントを取得する](https://stackoverflow.com/questions/17280787/google-maps-api-getting-closest-points-to-zipcode) – geocodezip
関連する質問については、私が避けようとしているのはまさにその答えです。もう一つは、私のニーズに十分に対応していないZIPによるものです。 – DonP