2015-07-21 21 views
11

Geo Django'yu nasıl kullanacağımı öğreniyorum. Aşağıda görüldüğü gibi, bir kullanıcı kayıtları Ben enlem ve boylam bilgilerini kaydettiğinizde:Geo Django, enlem ve boylamdan şehirler alır

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) 

Sonraki Ben ** Ben şehir "ad" saklamak istediğiniz city adlı yeni bir alan eklemek istediğiniz yani Londra uzun dayanır ve verilen lat detayları.

django-cities adresinde, coğrafi adlardan şehirlerin bir veritabanını kaydettim, ancak bu Python 3 uyumlu değil, bu yüzden benim için bir uyum değil. geopy adlı bir paket gördüm, ancak bu tamamen Geo Django'nun yerini alıyor ve kısıtlamalarla birlikte gelen Google API kullanıyor.

Geo Django ile uğraşmak istiyorum ve bir şekilde uzun ve Lat yönüne göre şehir adını bulmak için bir arama yapmak, böylece seçeneklerim nelerdir? yani ..

  1. bir Python 3 için çalışmaz http://www.geonames.org/ veri django-şehirler yüklemek için yol ve Django 1.8.x
  2. bul nasılsa verileri kullanarak bu arama yapmak için Coğrafi Django kullanılır? (bunu yapmak için emin olun)

Bu yaklaşıma doğru yolun üstünde mi? Öyleyse, verileri DB'mden nasıl alabilirim? Sonra şehir adını bulmak için Geo Django kullanarak bir arama yapın mı?

cevap

8

Bunu yapmak için çeşitli çözümler vardır:

  1. başka bir model Şehir Sonra

    from django.contrib.gis.db import models 
    class City(models.Model): 
        name = models.CharField(max_lenght=255) 
        geometry = models.MultiPolygonField() 
    
        objects = models.GeoManager() 
    

Konumunuzu içeren şehrin adını bulabilirsiniz oluşturun:

geomodel = GeoModel(...) 
    city = City.objects.get(geometry__contains=geomodel.location) 
    city_name = city.name 

İlgilendiğiniz ülke/bölgeye bağlı olarak, Şehir tablosunu OpenData içinde doldurmak için şehir geometrilerini bulabilirsiniz (örn. http://www.gadm.org/country (test edilmemiş, ancak açık şekil dosyaları önermektedir))

  1. Ters bir coğrafi kod kullanın. Google, bu tür bir hizmeti sağlayabilir veya ihtiyaçlarınızla eşleşen bir şey varsa http://www.geonames.org/export/reverse-geocoding.html adresine bakabilirsiniz.
+0

'' geomodel.location'' bu tür bir "PointField" alanı mı? – Prometheus

+1

Evet, bu sizin sorunuzda tanımladığınız modeldir :) – stellasia

+0

Son soru, Şehir modelinde kullanılan '' MultiPolygonField''. bu nasıl görünüyor? Geo Name kullanmaya karar verdim ama bu alana sahip değil http://www.geonames.org/search.html?q=london&country= – Prometheus

İlgili konular