我有一个带有geodjango PointField的Django模型:
geopoint = gis_models.PointField(srid=4326, verbose_name='location', geography=True, null=True)
我想查询模型中某个纬度以北的所有点。
它应该很简单,只需要一个>关于该点的纬度分量,但我找不到任何关于如何在距离查询,边界框等无穷无尽的例子中做到这一点的例子。
答案 0 :(得分:1)
感谢#postgis IRC乐于助人的人们,我找到了一种方法......
首先:在PostGIS中查询点的纬度的方法是通过ST_y
函数。
虽然我不能直接告诉GeoDjango queryset lookups地图到该功能:(
有一个strictly_above
查询(AFAICT'上方'表示'北')但它对我不起作用,因为我的字段有geography=True
并且:
ValueError: PostGIS geography does not support the "strictly_above" lookup.
感谢#postgis IRC的帮助,我了解到我可以将我的地理区域转换为几何体,从而使用ST_y
。作为原始PostGIS SQL查询,它看起来像:
SELECT COUNT(id) FROM place WHERE st_y(geopoint::geometry) > 51.508129
在Django ORM中,它看起来像:
Place.objects.extra(where=["st_y(geopoint::geometry) > %s"], params=['51.508129']).count()
遗憾的是,我们无法使用现有的strictly_above
ORM查找,因为有两个限制:
在ORM中无法将地理位置投射到几何体(尽管有an 'accepted' ticket将其添加到geodjango)
如果我们使用extra(select={...
向我们can't filter on it (and "won't fix" in Django)的查询集添加点数字段的转换为几何版本,除非添加另一个extra(where=...
子句,其中我们并没有比以上更好的
出于好奇,我想尝试strictly_above
查询。在PostGIS中,这是|>>
运算符和原始SQL,将我的点字段与另一个任意点进行比较,如下所示:
SELECT COUNT(id) FROM place WHERE geopoint::geometry |>> ST_GeomFromText('Point(-0.128005 51.508129)', 4326);
它返回与其他查询相同的答案,所以我很确定其含义是相同的。