Как найти ближайшую страну из списка
У меня есть список кодов стран ISO 3166 (240) и список из 8 стран / территорий / регионов (Австралия, Дания, Нидерланды, Катар, Южная Африка, ОАЭ, Великобритания и США). Я хотел бы просмотреть список кодов стран и определить для каждого из них, который является ближайшим из списка 8. Метрика (географическое расстояние, расстояние по прямой линии, время вождения и т. Д.) Не соответствует особенно важно, так как это не должно быть идеально, просто разумно.
Список из 8 мест подвержен регулярным изменениям, поэтому нецелесообразно выполнять задачу вручную. Я пытался использовать API Карт Google, но пока безуспешно. Идеальным решением было бы использование PHP и создание массива с кодом страны в качестве индекса и ближайшей страной (из списка 8) в качестве значения. Любая помощь приветствуется!
1 ответ
Проект geonames имеет открытые данные, которые вы можете использовать
Теперь вы можете узнать расстояние между географическими координатами.
function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
{
$pi80 = M_PI / 180;
$lat1 *= $pi80;
$lng1 *= $pi80;
$lat2 *= $pi80;
$lng2 *= $pi80;
$r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1;
$dlng = $lng2 - $lng1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c;
return ($miles ? ($km * 0.621371192) : $km);
}
В вашем случае вы можете использовать столицу стран. Для больших стран вы, возможно, должны добавить еще несколько стран вблизи границ.
Это одно из решений. Вы также можете хранить геометрические фигуры, которые приближают страну в базе данных и делать точные запросы...
Однако отправной точкой являются данные. Что вы на самом деле хотите? Какие данные у вас есть?
Если эффективность является проблемой, я бы порекомендовал построить график, где каждая страна хранится и связана с ее пограничными странами. Если вы посмотрите только на пограничные страны, это значительно сократит вычислительные затраты.