Справочники, инструменты, документация

PHP: Измерение расстояния между двумя координатами

Простой и совершенный код для вычисления расстояния между двумя широтами и долготами.

Способ 1

Параметры функции:

  • lat1, lon1 - широта и долгота точки 1 (в десятичных градусах),
  • lat2, lon2 - широта и долгота точки 2 (в десятичных градусах),
  • unit - единица измерения, которую вы хотите получить для получения результатов,
  • M - мили (по умолчанию),
  • K - километры,
  • N - морские мили.
<?php
function distance($lat1, $lon1, $lat2, $lon2, $unit) {
 if (($lat1 == $lat2) && ($lon1 == $lon2)) {
  return 0;
 }
 else {
  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == "K") {
   return ($miles * 1.609344);
  } else if ($unit == "N") {
   return ($miles * 0.8684);
  } else {
   return $miles;
  }
 }
}

echo distance(32.9697, -96.80322, 29.46786, -98.53506, "M") . " Miles<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "K") . " Kilometers<br>";
echo distance(32.9697, -96.80322, 29.46786, -98.53506, "N") . " Nautical Miles<br>";

?>

Способ 2

$latitudeFrom = '22.574864';
$longitudeFrom = '88.437915';

$latitudeTo = '22.568662';
$longitudeTo = '88.431918';

//Calculate distance from latitude and longitude
$theta = $longitudeFrom - $longitudeTo;
$dist = sin(deg2rad($latitudeFrom)) * sin(deg2rad($latitudeTo)) + cos(deg2rad($latitudeFrom)) * cos(deg2rad($latitudeTo)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;

$distance = ($miles * 1.609344).' km';

Способ 3

function calculateDistanceBetweenTwoPoints($latitudeOne='', $longitudeOne='', $latitudeTwo='', $longitudeTwo='',$distanceUnit ='',$round=false,$decimalPoints='')
  {
    if (empty($decimalPoints)) 
    {
      $decimalPoints = '3';
    }
    if (empty($distanceUnit)) {
      $distanceUnit = 'KM';
    }
    $distanceUnit = strtolower($distanceUnit);
    $pointDifference = $longitudeOne - $longitudeTwo;
    $toSin = (sin(deg2rad($latitudeOne)) * sin(deg2rad($latitudeTwo))) + (cos(deg2rad($latitudeOne)) * cos(deg2rad($latitudeTwo)) * cos(deg2rad($pointDifference)));
    $toAcos = acos($toSin);
    $toRad2Deg = rad2deg($toAcos);

    $toMiles = $toRad2Deg * 60 * 1.1515;
    $toKilometers = $toMiles * 1.609344;
    $toNauticalMiles = $toMiles * 0.8684;
    $toMeters = $toKilometers * 1000;
    $toFeets = $toMiles * 5280;
    $toYards = $toFeets / 3;

    switch (strtoupper($distanceUnit)) 
    {
      case 'ML'://miles
          $toMiles = ($round == true ? round($toMiles) : round($toMiles, $decimalPoints));
          return $toMiles;
        break;
      case 'KM'://Kilometers
         $toKilometers = ($round == true ? round($toKilometers) : round($toKilometers, $decimalPoints));
         return $toKilometers;
        break;
      case 'MT'://Meters
         $toMeters = ($round == true ? round($toMeters) : round($toMeters, $decimalPoints));
         return $toMeters;
        break;
      case 'FT'://feets
         $toFeets = ($round == true ? round($toFeets) : round($toFeets, $decimalPoints));
         return $toFeets;
        break;
      case 'YD'://yards
         $toYards = ($round == true ? round($toYards) : round($toYards, $decimalPoints));
         return $toYards;
        break;
      case 'NM'://Nautical miles
         $toNauticalMiles = ($round == true ? round($toNauticalMiles) : round($toNauticalMiles, $decimalPoints));
         return $toNauticalMiles;
        break;
    }
}

Затем используйте функцию как:

echo calculateDistanceBetweenTwoPoints('11.657740','77.766270','11.074820','77.002160','ML',true,5);
На этой странице