2012-02-27 6 views
8

Sto creando un'applicazione geo con Google Maps e ricevo casella di delimitazione come coordinate 2:GeoDjango all'interno di una scatola, NE SW

  • nord est
  • sud ovest

ho un modello con PointField.

from django.contrib.gis.db import models 

class Place(models.Model): 
    name   = models.CharField(max_length=200) 
    address   = models.CharField(max_length=200) 

    location  = models.PointField() 

Come è possibile eseguire una query per ottenere tutti i posti all'interno del riquadro di delimitazione?

risposta

6

Supponendo che il "2 coordinate" sono x, tuple y, ad esempio:

ne = (50.0, -90) 
sw = (45.5, -95) 

è possibile estrarre le coordinate e creare un rettangolo di selezione tupla:

xmin = sw[0] 
ymin = ne[1] 
xmax = sw[1] 
ymax = ne[0] 
bbox = (xmin, ymin, xmax, ymax) 

Utilizzando il rettangolo di selezione geometria, interrogare i record posizione con un spatial lookup:

from django.contrib.gis.geos import Polygon 

geom = Polygon.from_bbox(bbox) 
queryset = Place.objects.filter(poly__contained=geom) 
+3

Grazie, funziona, ma non dovrebbe xmin e ymin essere della stessa tupla? (lo stesso con xmax/ymax) –

+6

Non dovrebbe essere la ricerca spaziale ['contenuta'] (https://docs.djangoproject.com/en/1.5/ref/contrib/gis/geoquerysets/#contained)? – borges

+0

D'accordo con borges. "objects.filter (poly__contained)" è la ricerca corretta per trovare tutti gli oggetti con il campo poly all'interno del riquadro di delimitazione. Altrimenti questa risposta mi ha fatto arrivare al 90%! –

5

@ risposta di Tyler è sbagliato in molti modi. Il codice corretto sarebbe:

ne = (latitude, longitude) 
sw = (latitude, longitude) 

xmin=sw[1] 
ymin=sw[0] 
xmax=ne[1] 
ymax=ne[0] 
bbox = (xmin, ymin, xmax, ymax) 

from django.contrib.gis.geos import Polygon 
geom = Polygon.from_bbox(bbox) 
queryset = Place.objects.filter(poly__contained=geom)