Лучший способ получить пользователя ближайшего города?Python / Django - PullRequest
4 голосов
/ 22 декабря 2010

У меня есть веб-сайт с ограниченным количеством городов в базе данных, и мне нужно показать пользователю ближайший город к его текущему местоположению.

Я могу получить местоположение с помощью MaxMind API, но я хочу получить ближайший город в моей базе данных для города пользователя.

Например, если у меня есть следующие города в базе данных: Los Angeles, San Francisco и New York City, и я получаю доступ из другого города, например Miami, я должен увидеть выбранный Нью-Йорк, потому что это ближайший географически .

Какой лучший способ сделать это быстро и с учетом производительности?

Ответы [ 2 ]

7 голосов
/ 22 декабря 2010

Вы должны сохранить приблизительную широту и долготу для каждого города, рассчитать широту и долготу в градусах для пользователя, а затем найти расстояние по формуле Haversine .Это реализовано в Javascript здесь .API MaxMind должен указывать широту и долготу.

0 голосов
/ 08 февраля 2012

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

Теперь, когда у вас есть все предварительно рассчитано, всякий раз, когда есть живой запрос с названием города, вы просто нажимаете на базу данных с названием города, и вы можете добраться до ближайшего города по указанной вами иностранной клавише. (город --- иностранный ключ ---> город)

Теперь это будет очень быстро, поскольку вы предварительно рассчитали ближайший город в автономном режиме и можете сразу же возвращать результат при каждом запросе в реальном времени.

Но как часто вы планируете добавить город? Вероятно, не так часто. Таким образом, предварительный расчет в автономном режиме будет редким, даже если это займет немного времени. Но живые запросы отвечают очень быстро. (другие уже рекомендовали формулу для расчета расстояния, поэтому я пропущу эту часть!)

...