2015-07-21 15 views
11

Sto imparando come usare Geo Django. Quando un utente si registra risparmio il latitudine e la longitudine come si vede qui sotto:Geo Django prende le città dalla latitudine e dalla longitudine

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) 

Avanti Voglio aggiungere un nuovo campo chiamato city dove ** voglio conservare il "nome" città cioè con sede a Londra il lungo e dettagli lat forniti.

Ho guardato su django-cities dove si salva un database di città da Nome geografico, ma questo sembra eccessivo e non compatibile con Python 3 quindi un no go per me. Ho visto un pacchetto chiamato geopy ma questo sembra sostituire completamente Geo Django e utilizza l'API di Google che viene fornita con restrizioni.

Voglio rimanere con Geo Django e in qualche modo fare una ricerca per scoprire il nome della città in base al long e lat quindi quali sono le mie opzioni? cioè ..

  1. Trova un modo per installare dati http://www.geonames.org/ django-città non funziona per Python 3 e Django 1.8.x
  2. In qualche modo utilizzare Geo Django per farlo ricerca utilizzando i dati? (non si può fare così)

È sopra il modo corretto di avvicinarsi a questo? In tal caso, come faccio ad avere i dati nel mio DB e poi a cercarli su Geo Django per trovare il nome della città?

risposta

8

Sono disponibili diverse soluzioni per fare questo:

  1. Creare un altro modello di città

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

Poi si può trovare il nome della città che contiene la propria posizione con:

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

A seconda del Paese/regione a cui sei interessato, puoi trovare le geometrie della città per riempire la tabella Città in OpenData (ad esempio http://www.gadm.org/country (non testato ma sembra proporre gli shapefile aperti))

  1. Utilizzare un geocoder inverso. Google può fornire tale servizio o guardare allo http://www.geonames.org/export/reverse-geocoding.html se qualcosa può corrispondere alle tue esigenze.
+0

'' geomodel.location'' che tipo di campo è questo "PointField''? – Prometheus

+1

Sì, questo è il modello che hai definito nella tua domanda :) – stellasia

+0

Ultima domanda quindi il '' MultiPolygonField'' usato nel modello City. com'è questo aspetto? Ho deciso di utilizzare Geo Name ma non ha quel campo http://www.geonames.org/search.html?q=london&country= – Prometheus