Jeśli szukasz kodu PHP do obliczenia odległości między dwoma zestawami współrzędnych, to klasa, którą dostosowałem, będzie obliczać odległość w kilometrach. Jednakże, jeśli korzystasz z bazy danych, sugerowałbym, abyś sprawdził, czy twoja baza danych jest zdolna do obliczeń przestrzennych (wiem, że SQL Server i MySQL są, z mojej strony).
Oto interesujące łącze do rozwiązania SQL, które możesz chcieć sprawdzić. Optimising a haversine formula SQL call in PHP
class Distance
{
/**
* Mean raidus of the earth in kilometers.
* @var double
*/
const RADIUS = 6372.797;
/**
* Pi divided by 180 degrees. Calculated with PHP Pi constant.
* @var double
*/
const PI180 = 0.017453293;
/**
* Constant for converting kilometers into miles.
* @var double
*/
const MILES = 0.621371192;
/**
* Calculate distance between two points of latitude and longitude.
* @param double $lat1 The first point of latitude.
* @param double $long1 The first point of longitude.
* @param double $lat2 The second point of latitude.
* @param double $long2 The second point of longitude.
* @param bool $kilometers Set to false to return in miles.
* @return double The distance in kilometers or miles, whichever selected.
*/
public static function getDistance($lat1, $long1, $lat2, $long2, $kilometers = true)
{
$lat1 *= self::PI180;
$long1 *= self::PI180;
$lat2 *= self::PI180;
$long2 *= self::PI180;
$dlat = $lat2 - $lat1;
$dlong = $long2 - $long1;
$a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlong/2) * sin($dlong/2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = self::RADIUS * $c;
if($kilometers)
{
return $km;
}
else
{
return $km * self::MILES;
}
}
}
//example
echo Distance::getDistance(40.686748, -89.555054, 40.453078, -88.939819);
Pozdrowienia dla tego partnera –
Trochę ostrzeżenia, ponieważ to wymknie się spod kontroli, jeśli tabela z punktami zwiększy swój rozmiar. Kończysz wykonywanie obliczeń dla każdego punktu w tabeli dla każdego zapytania. –
Do tego można użyć procedury zapisanej w pamięci. – Gaurav