按geodjango中的纬度排序

时间:2016-05-22 22:21:09

标签: django geodjango

我有以下型号:

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

我想从北到南排序。我该怎么做呢? Stop.objects.order_by('point')将它们从西向东排序。

感谢。

这是我的完整模特:

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

2 个答案:

答案 0 :(得分:5)

由于您的点数字段是几何而不是地理位置,所以您很幸运。

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

我在这里使用的是ST_X而不是ST_Y,因为PostGIS是最好的geodjango数据库,约定是存储lng,lat

如果您的点数字段是地理位置,则上述函数调用将无效,因为ST_X和ST_Y仅适用于几何字段。在使用这些函数之前,需要将地理字段转换为Geometry。

答案 1 :(得分:3)

我遇到了同样的TypeError:不正确的几何输入类型:由eran报告,实际上我使用的是PointField。我通过添加一个ExpressionWrapper来告诉Django期望什么类型的输出(浮点而不是点)来解决这个问题。

另外,在PostGIS中获取纬度你应该使用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')