在 geodjango 中按纬度排序
sort by latitude in 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
由于您的点场是几何而不是地理,所以您很幸运。
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 仅适用于几何字段。在使用这些函数之前,需要将地理字段转换为几何。
我 运行 进入相同的 TypeError: Improper geometry input type: reported by e运行,事实上,我使用的是 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')
我有以下型号:
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
由于您的点场是几何而不是地理,所以您很幸运。
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 仅适用于几何字段。在使用这些函数之前,需要将地理字段转换为几何。
我 运行 进入相同的 TypeError: Improper geometry input type: reported by e运行,事实上,我使用的是 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')