我有一个带有 geodjango PointField 的 Django 模型:
geopoint = gis_models.PointField(srid=4326, verbose_name='location', geography=True, null=True)
我想查询某个纬度以北的所有点的模型。
它应该很容易,只需在点的纬度分量上添加一个 >,但在距离查询、边界框等的无穷无尽的示例中,我找不到任何示例说明如何做到这一点。
感谢#postgis IRC的乐于助人的人,我找到了一种方法来做到这一点......
首先:在PostGIS中查询一个点的纬度的方法是通过ST_y
函数。
据我所知,没有一个GeoDjango 查询集查找直接映射到该函数:(
有一个strictly_above
查找(AFAICT 'above' 的意思是 'north of')但它对我不起作用,因为我的领域有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 中无法将地理转换为几何(尽管有一张“已接受”的票可以将其添加到 geodjango)
如果我们使用extra(select={...
将点字段的转换为几何版本添加到查询集中,我们无法对其进行过滤(并且在 Django 中“不会修复”),除非添加另一个extra(where=...
子句,在这种情况下,我们是没有比上面更好的了
出于好奇,我还是想尝试strictly_above
查询。在 PostGIS 中,这是|>>
运算符和原始 SQL,将我的点字段与另一个任意点进行比较,如下所示:
SELECT COUNT(id) FROM place WHERE geopoint::geometry |>> ST_GeomFromText('Point(-0.128005 51.508129)', 4326);
它返回与其他查询相同的答案,所以我很确定意思是一样的。