如何使用LineString字段按到点的距离过滤对象



我有一个带有LineStringField的模型,它表示一条路径,例如:

class Link(models.Model):
# Non-relevant fields omitted
geometry = models.LineStringField(srid=3067)

现在,我想查询字符串中任意点的距离小于给定距离(比如100米(的对象。

我尝试过这个查询:

lat = float(self.request.query_params['lat'])
lon = float(self.request.query_params['lon'])
point = Point(lat, lon, srid=4326)
return Link.objects.filter(geometry__distance_lt=point, 100)

然而,即使我将距离限制增加到数百公里(所有测试数据都在距离给定纬度/经度点约50公里以内(,这也不会产生任何结果。我的查询有问题吗?

为了解决这类问题,我们通常在直线周围创建一个缓冲几何体(多边形(,然后将该几何体与点相交。

DB中的缓冲区(在geodjango函数中找不到,可能就在那里。(https://postgis.net/docs/ST_Buffer.html

有关使用GEOS创建缓冲区的信息,请参阅文档https://django.readthedocs.io/en/stable/ref/contrib/gis/geos.html#django.contrib.gis.geos.GEOSGeometry.buffer

交叉点过滤器https://docs.djangoproject.com/en/3.1/ref/contrib/gis/geoquerysets/#std:fieldlookup-dwithin

经过一次令人沮丧的调试后,我发现在构建Point:时,纬度和经度必须以相反的顺序传递

lat = float(self.request.query_params['lat'])
lon = float(self.request.query_params['lon'])
point = Point(lon, lat, srid=4326)
return Link.objects.filter(geometry__distance_lt=point, 100)

最新更新