2016-05-22 15 views
8

Ho il seguente modello:ordina per latitudine in geodjango

class Stop(models.Model): 
    name = models.CharField(max_length=50) 
    point = models.PointField() 
    objects = models.GeoManager() 

voglio ordinare mie tappe da nord a sud. Come faccio a fare questo? Stop.objects.order_by('point') li ordina da ovest a est.

grazie.

Questo è il mio modello completo:

from django.contrib.gis.db import models 
from django.core.urlresolvers import reverse 

class Stop(models.Model): 
    gtfs_stop_id = models.IntegerField(db_index=True, unique=True) 
    name = models.CharField(max_length=50) 
    point = models.PointField() 
    parkings = models.GeometryCollectionField(null=True, blank=True) 
    objects = models.GeoManager() 

    def get_absolute_url(self): 
     return reverse('core:stop', args=(self.id,)) 

    def __str__(self): 
     return self.name 
+0

si può sempre fare 'Stop.objects.order_by ('point__x')/Stop.objects.order_by ('- point__x')' o \t 'Stop.objects.order_by ('point__y')/Stop .objects.order_by ('- point__y') ' – trinchet

+0

grazie, ma questo dà un errore: FieldError: Impossibile risolvere la parola chiave 'x' nel campo. Partecipare al "punto" non consentito. – eran

risposta

4

Dal momento che il campo di punto è geometria e non geografia siete fortunati.

from django.db.models import F, Func 
Stop.objects.annotate(lat=Func('point',function='ST_X')).order_by('lat') 

Sto usando ST_X qui invece di ST_Y perché PostGIS il meglio della geodjango database la convenzione è quello di memorizzare lng,lat

Se il vostro campo punto fossi stato geografia la chiamata di funzione di cui sopra non avrà funzionato perché ST_X e ST_Y sono disponibili solo sui campi geometrici. I campi di geografia devono essere espressi su Geometry prima di poter utilizzare queste funzioni.

+0

Non so perché, ma questo mi ha dato un errore. Ho finito per usare extra per questo. Stop.objects.all(). Extra (selezionare = {'lat': 'ST_X (punto)'}). Order_by ('- lat') – eran

+0

Oh, scusa lo vedo ora. Nella mia risposta avevo usato "posizione" anziché "punto". – e4c5

+0

Aggiornato la mia risposta. Si prega di vedere se funziona ora, se non pubblicare l'errore e cercare di evitare l'uso di extra. – e4c5

0

Mi sono imbattuto nello stesso errore TypeError: Tipo di input di geometria improprio: riportato da eran, e in effetti utilizzavo PointField. Ho risolto il problema aggiungendo un ExpressionWrapper per dire a Django quale tipo di output aspettarsi (un float piuttosto che un punto).

Inoltre, in PostGIS per ottenere la latitudine è necessario utilizzare ST_Y.

from django.db.models import FloatField, ExpressionWrapper, Func 
Stop.objects.all().annotate(lat=ExpressionWrapper(Func('point', function='ST_Y'), output_field=FloatField())).order_by('lat')