如何查询某个纬度以北的点

时间:2013-05-20 15:50:46

标签: postgis geodjango

我有一个带有geodjango PointField的Django模型:

geopoint = gis_models.PointField(srid=4326, verbose_name='location', geography=True, null=True)

我想查询模型中某个纬度以北的所有点。

它应该很简单,只需要一个>关于该点的纬度分量,但我找不到任何关于如何在距离查询,边界框等无穷无尽的例子中做到这一点的例子。

1 个答案:

答案 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查找,因为有两个限制:

  1. 在ORM中无法将地理位置投射到几何体(尽管有an 'accepted' ticket将其添加到geodjango)

  2. 如果我们使用extra(select={...向我们can't filter on it (and "won't fix" in Django)的查询集添加点数字段的转换为几何版本,除非添加另一个extra(where=...子句,其中我们并没有比以上更好的

  3. 出于好奇,我想尝试strictly_above查询。在PostGIS中,这是|>>运算符和原始SQL,将我的点字段与另一个任意点进行比较,如下所示:

    SELECT COUNT(id) FROM place WHERE geopoint::geometry |>> ST_GeomFromText('Point(-0.128005 51.508129)', 4326);
    

    它返回与其他查询相同的答案,所以我很确定其含义是相同的。