2017-08-07 23 views
-1

私は、目標アドレスからいくつかの場所のうちの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のパラメータではなく、最速よりもありますルート?

+0

関連する質問:(https://stackoverflow.com/questions/11345165/how-to-find-optimal-route-to-one-of [多くのマーカーの一つに、最適なルートを見つけるには?] -many-marker) – geocodezip

+0

[Google Maps API - 郵便番号に最も近いポイントを取得する](https://stackoverflow.com/questions/17280787/google-maps-api-getting-closest-points-to-zipcode) – geocodezip

+0

関連する質問については、私が避けようとしているのはまさにその答えです。もう一つは、私のニーズに十分に対応していないZIPによるものです。 – DonP

答えて

0

私はこの機能を修正してclosestLocation()と別の関数を完全に削除しましたので、少し単純化しています。私はこれが呼び出されている場所のいくつかの他の領域を再配置する必要がありますが、時にはそれが最も速く、最も近いものではありませんが、有効な走行距離を引き出すようです。最も近い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; 
} 
+0

アドレスを入力しなかった場合、クラッシュすることを防ぐために、このビットを条件付きで更新しました。また、min()を使用する場合は配列要素をソートする必要がないので、最小の0以外の結果のみを引き出すコードを追加することに気付きました。0の値を持つ配列はクラッシュしていたので、配列がすべて0であるかどうかを検出するために修正されました。この場合、負の数はないので、array_sum()はそのトリックを行いました。 – DonP

関連する問題