微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过到点的距离来过滤具有LineString字段的对象?

如何解决如何通过到点的距离来过滤具有LineString字段的对象?

我有一个带有{ "compilerOptions": { "target": "es5","lib": [ "dom","dom.iterable","esnext" ],"allowJs": true,"skipLibCheck": true,"esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"forceConsistentCasingInFileNames": true,"module": "esnext","moduleResolution": "node","resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "react","types": ["cypress"],"noFallthroughCasesInSwitch": true },"include": [ "src" ] } 的模型,它代表一条路径,例如:

LinestringField

现在,我要查询线串中任意点的距离小于给定距离(例如100米)的对象。

我尝试过以下查询

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

但是,即使我将距离限制增加到几百公里(所有测试数据都在距给定纬度/经度点约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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。