2011-01-11 3 views
1

Каждый пользователь в моей БД связан с городом (с его долгота и широта)Нахождение городов близко друг к другу, используя широту и долготу

Как бы идти о выяснить, какие города находятся близко друг к другу?

В Англии, Кембридж довольно близко к Лондону.

Так что если у меня есть пользователь, который живет в Кембридже. Близкими к ним пользователями будут пользователи, живущие в близлежащих городах, таких как Лондон, Хертфорд и т. Д.

Любые идеи о том, как я могу это сделать? А также, как бы я определил, что близко? т. е. в закрытии Соединенного Королевства было бы намного ближе, чем если бы это было в США, поскольку США гораздо более распространены.

Идеи и предложения. Кроме того, знаете ли вы какие-либо службы, предоставляющие такую ​​функциональность?

Благодаря

+0

Вы хотите расстояние «как ворона летит», или пробег? или время вождения? они разные –

ответ

0

Если вы можете вызвать внешний веб-сервис, вы можете использовать GEONAMES API для поиска близлежащих городов в пределах некоторого радиуса, которые вы определяете:

http://www.geonames.org/export/web-services.html

0

Получение координат из названий города является называемое обратным геокодированием. Карты 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

0

Самый простой способ сделать это было бы вычислить прямоугольник с широтой и долготой города и расстояния (путем преобразования расстояния до градусов долготы).

Как только у вас есть это поле (минимальная широта, максимальная широта, мин долгота, макс. Долгота), запрос для других городов, широта и долгота которых находятся в ограничительной рамке. Это даст вам приблизительный список и будет довольно быстрым, так как он сможет использовать любые индексы, которые могут иметься в столбцах широты и долготы.

Оттуда вы можете сузить список вниз, если хотите, используя реальную функцию «расстояние между точками на сфере».

0

Вам необходим пространственный индекс или функциональность ГИС. Какую базу данных вы используете? MySQL и PostgreSQL имеют поддержку GIS, которая позволит вам найти N ближайших городов с использованием SQL-запроса.

0

Другой вариант, который вы, возможно, захотите рассмотреть, - это разместить все города в дереве пространственного поиска, таком как kd-дерево. Kd-деревья эффективно поддерживают поиск ближайших соседей, а также быстрый поиск всех точек в заданной ограничивающей рамке. Затем вы можете найти близлежащие города, ища несколько ближайших соседей города, а затем, используя расстояние до этих соседей, чтобы получить размер оценку для ограничительной рамки для поиска в

Смежные вопросы