как получить точное или (почти точное) расстояние между двумя местами? Mysql / PHP - PullRequest
2 голосов
/ 12 июня 2009

ВЫБРАТЬ почтовый индекс, лат, lng, усечение ( (градусы (экос (Sin (радианы (lat)) * грех (радианы ('. $ широта.')) + Cos (радианы (lat)) * cos (радианы ('. $ latitude.')) * cos (радианы (lng - ('. $ долгота.'))) ) ) * 69,172), 2) как расстояние ОТ myData
Этот запрос рассчитывает расстояние (в милях). Но когда я проверяю расстояние для того же широты и долготы на картах Google, мой результат не совпадает. Если расстояние составляет около 10 миль, то мой результат немного точный, но из-за этого он ошибается (например, мой результат показал 13 миль, а Google показал 22 мили для тех же значений почтового индекса)

Я получил этот запрос от http://forums.mysql.com/read.php?23,3868,3868#msg-3868

Как я могу получить это точно? Есть идеи? Спасибо за помощь.

UPDATE

Я попробовал @Blixt код в PHP. Подобрал 2 образца почтовых индексов и их латы длинных

//B28 9ET
$lat1 = 52.418819;
$long1 = -1.8481053;

//CV5 8BX
$lat2 = 52.4125573;
$long2 = -1.5407743;

$dtr = M_PI / 180;
$latA = $lat1 * $dtr;
$lonA = $long1 * $dtr;
$latB = $lat2 * $dtr;
$lonB = $long2 * $dtr;
$EarthRadius = 3958.76; //miles
echo $distance = $EarthRadius * acos(cos($latA) * cos($latB) * cos($lonB - $lonA) + sin($latA) * sin($latB));

Результаты:

Мое приложение - 12,95 миль

Google - 17,8 миль

Есть идеи, как сделать это правильно?

1 Ответ

1 голос
/ 12 июня 2009

Посмотрите на этот исходный код . Когда я проверил его в сравнении с другими службами измерений, он, похоже, получил те же результаты. Это C #, но математика должна быть достаточно простой для преобразования.

Вот соответствующие штуки:

public const double EarthRadius = 6371.0072; // Kilometers
//public const double EarthRadius = 3958.76; // Miles

/* ... */

const double dtr = Math.PI / 180;
double latA = this.Latitude * dtr;
double lonA = this.Longitude * dtr;
double latB = other.Latitude * dtr;
double lonB = other.Longitude * dtr;

return GpsLocation.EarthRadius * Math.Acos(Math.Cos(latA) * Math.Cos(latB) * Math.Cos(lonB - lonA) + Math.Sin(latA) * Math.Sin(latB));

Примечание: Земля не идеально сферическая, поэтому используемые константы могут отличаться. Нет простого способа сделать измерения действительно точными. См. Википедия .

...