2016-05-22 20 views
8

tôi có mô hình sau:sắp xếp theo vĩ độ trong geodjango

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

Tôi muốn sắp xếp các điểm dừng của tôi từ Bắc vào Nam. Làm thế nào để tôi làm điều này? Stop.objects.order_by('point') sắp xếp chúng từ tây sang đông.

cảm ơn.

Đây là mô hình đầy đủ của tôi:

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

Bạn luôn có thể làm 'Stop.objects.order_by ('point__x')/Stop.objects.order_by ('- point__x')' hoặc \t 'Stop.objects.order_by ('point__y')/Dừng .objects.order_by ('- point__y') ' – trinchet

+0

cảm ơn, nhưng điều này đưa ra một lỗi: FieldError: Không thể giải quyết từ khóa 'x' vào trường. Tham gia vào 'điểm' không được phép. – eran

Trả lời

4

Kể từ lĩnh vực quan điểm của bạn là Geometry và không địa lý mà bạn là người may mắn.

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

Tôi đang sử dụng ST_X đây thay vì ST_Y vì PostGIS tốt nhất của geodjango sở dữ liệu quy ước là để lưu trữ lng,lat

Nếu bạn lĩnh vực quan điểm của bạn đã được địa lý chức năng cuộc gọi trên sẽ không làm việc vì ST_X và ST_Y chỉ khả dụng trên các trường hình học. Các trường địa lý cần được đưa vào Hình học trước khi bạn có thể sử dụng các chức năng này.

+0

Tôi không chắc chắn lý do tại sao, nhưng điều này đã cho tôi lỗi. Tôi đã kết thúc bằng cách sử dụng thêm cho điều này. Stop.objects.all(). Thêm (select = {'lat': 'ST_X (point)'}). Order_by ('- lat') – eran

+0

Ồ, xin lỗi tôi nhìn thấy nó ngay bây giờ. Tôi đã sử dụng 'vị trí' thay vì 'điểm' trong câu trả lời của tôi. – e4c5

+0

Đã cập nhật câu trả lời của tôi. Xin vui lòng xem nếu nó hoạt động ngay bây giờ, nếu không đăng lỗi và cố gắng tránh sử dụng thêm. – e4c5

0

Tôi chạy vào cùng một TypeError: Loại đầu vào hình học không đúng: được báo cáo bởi eran, và trên thực tế, tôi sử dụng PointField. Tôi giải quyết vấn đề bằng cách thêm một ExpressionWrapper để nói với Django loại đầu ra mong đợi (một phao thay vì một điểm).

Ngoài ra, trong PostGIS để có được vĩ độ, bạn nên sử dụng 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')