Geo Django получает города от широты и долготы
Я изучаю, как использовать Geo Django. Когда пользователь регистрируется, я сохраняю информацию о широте и долготе, как показано ниже:
from django.contrib.gis.db import models
from django.contrib.gis.geos import Point
class GeoModel(models.Model):
"""
Abstract model to provide GEO fields.
"""
latitude = models.FloatField(blank=True, null=True, verbose_name='Latitude')
longitude = models.FloatField(blank=True, null=True, verbose_name='Longitude')
location = models.PointField(blank=True, null=True)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if self.latitude and self.longitude:
self.location = Point(float(self.latitude), float(self.longitude))
super(GeoModel, self).save(*args, **kwargs)
Далее я хочу добавить новое поле под названием city
, где ** Я хочу сохранить название города, т.е. Лондон основывал длинные и детализированные детали.
Я просмотрел django-cities
, где хранится база данных городов из Geo Name, но это кажется излишним, а не совместимым с Python 3, поэтому я не пойду за мной. Я видел пакет под названием geopy, но это, похоже, полностью заменяет Geo Django и использует Google API, который поставляется с ограничениями.
Я хочу придерживаться Geo Django и как-нибудь сделать поиск, чтобы узнать название города на основе long и lat, и каковы мои варианты? т.е...
- Найдите способ установки http://www.geonames.org/ данных django-cities
не работает для Python 3 и Django 1.8.x
- Как-то использовать Geo Django
выполнить этот поиск, используя данные? (не знаю, что делать)
Является ли выше правильный подход к этому? Если да, то как мне получить данные в моей БД, а затем просмотрите его с помощью Geo Django, чтобы найти название города?
Ответы
Ответ 1
У вас есть несколько решений для этого:
-
Создайте еще одну модель City
from django.contrib.gis.db import models
class City(models.Model):
name = models.CharField(max_lenght=255)
geometry = models.MultiPolygonField()
objects = models.GeoManager()
Затем вы можете найти название города, в котором находится ваше местоположение, с помощью
geomodel = GeoModel(...)
city = City.objects.get(geometry__contains=geomodel.location)
city_name = city.name
В зависимости от интересующей вас страны/региона, вы можете найти геометрию города для заполнения таблицы City в OpenData (например, http://www.gadm.org/country (не тестировалось, но кажется предлагать открытые шейп файлы))
- Используйте обратный геокодер. Google может предоставить такую услугу или посмотреть http://www.geonames.org/export/reverse-geocoding.html, если что-то может соответствовать вашим потребностям.