Получение координат из названий города является называемое обратным геокодированием. Карты Google имеют приятный Api fot.
Существует также Geonames проект, где вы получите огромные базы данных городов, почтовые индексы и т.д. и их cooridnates
Однако, если у вас уже есть координаты, его простой расчет, чтобы получить расстояние.
Трудная вещь - получить хорошую исполнительскую версию. Вероятно, вы сохранили его в базе данных mysql, поэтому вам нужно сделать это там и быстро.
Это абсолютно возможно. Я когда-то делал проект, включая этот код, я заберу его и отправлю сюда.
Однако, чтобы ускорить работу, я бы рекомендовал сначала сделать прямоугольный выбор вокруг центральных координат. Это очень, очень быстро, используя индексы пчелиного дерева или даже лучшие вещи, такие как многомерный поиск диапазона. Затем внутри вы можете рассчитать точные расстояния на ограниченном наборе данных. Вне этого повторного выбора направления настолько обширны, что их не нужно отображать или рассчитывать так точно. Или просто отобразите страну, континент или что-то в этом роде.
Я все еще в офисе, но когда я прихожу домой, я могу получить коды для вас. В то же время было бы хорошо, если бы вы могли сообщить мне, как вы храните свои данные.
Редактировать: в то же время здесь у вас есть функция, которая выглядит правильно для меня (я сделал это без функции в одном запросе ...)
CREATE FUNCTION `get_distance_between_geo_locations`(`lat1` FLOAT, `long1` FLOAT, `lat2` FLOAT, `long2` FLOAT)
RETURNS FLOAT
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE distance FLOAT DEFAULT -1;
DECLARE earthRadius FLOAT DEFAULT 6371.009;
-- 3958.761 --miles
-- 6371.009 --km
DECLARE axis FLOAT;
IF ((lat1 IS NOT NULL) AND (long1 IS NOT NULL) AND (lat2 IS NOT NULL) AND (long2 IS NOT NULL)) THEN -- bit of protection against bad data
SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));
SET distance = earthRadius * (2 * ATAN2(SQRT(axis), SQRT(1-axis)));
END IF;
RETURN distance;
END;
я процитировал это здесь: http://sebastian-bauer.ws/en/2010/12/12/geo-koordinaten-mysql-funktion-zur-berechnung-des-abstands.html
и вот еще одна ссылка: http://www.andrewseward.co.uk/2010/04/sql-function-to-calculate-distance.html
Вы хотите расстояние «как ворона летит», или пробег? или время вождения? они разные –