1

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

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

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

它应该很容易,只需在点的纬度分量上添加一个 >,但在距离查询、边界框等的无穷无尽的示例中,我找不到任何示例说明如何做到这一点。

4

1 回答 1

1

感谢#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_aboveORM 查找,因为有两个限制:

  1. 在 ORM 中无法将地理转换为几何(尽管有一张“已接受”的票可以将其添加到 geodjango)

  2. 如果我们使用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);

它返回与其他查询相同的答案,所以我很确定意思是一样的。

于 2013-05-20T19:50:21.147 回答