在Geodjango中按纬度排序

9

我有以下模型:

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

你可以随时使用 Stop.objects.order_by('point__x')/Stop.objects.order_by('-point__x') 或者 Stop.objects.order_by('point__y')/Stop.objects.order_by('-point__y') - trinchet
谢谢,但是这会产生一个错误: FieldError: 无法将关键字“x”解析为字段。不允许在“point”上进行连接。 - eran
2个回答

7

由于您的点字段是几何而不是地理信息,您很幸运。

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仅适用于几何类型字段。在使用这些函数之前,需要将地理类型字段转换为几何类型。


我不确定为什么,但是这给了我错误。我最终使用额外的方法解决了这个问题。 Stop.objects.all().extra(select={'lat':'ST_X(point)'}).order_by('-lat') - eran
哦,抱歉我现在看到了。我在我的回答中使用了“位置”而不是“点”。 - e4c5
已更新我的回答。请查看是否现在可行,如果不行,请发布错误并尽量避免使用额外的内容。 - e4c5
谢谢。这仍然会出现相同的错误。类型错误:不适当的几何输入类型:<class 'float'>。 - eran
那意味着你的模型中没有使用点字段!请发布您的实际模型。在发布此查询之前,我已经进行了测试。 - e4c5
这早期的提示明确表明您在查询中使用的字段不是几何类型! - middlestump

4

我遇到了和eran报告的一样的错误:TypeError: 不合适的几何输入类型,实际上,我正在使用PointField。通过添加ExpressionWrapper来告诉Django期望的输出类型(float而不是point),我解决了这个问题。

此外,在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')

这是唯一对我有效的语法。谢谢分享! - stellasia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接