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 (не тестировалось, но кажется предлагать открытые шейп файлы))

  1. Используйте обратный геокодер. Google может предоставить такую ​​услугу или посмотреть http://www.geonames.org/export/reverse-geocoding.html, если что-то может соответствовать вашим потребностям.