Python 我怎样才能为geodjango找到k个最近的邻居?
假设我有以下模型:Python 我怎样才能为geodjango找到k个最近的邻居?,python,django,postgresql,postgis,geodjango,Python,Django,Postgresql,Postgis,Geodjango,假设我有以下模型: class Person: id = models.BigAutoField(primary_key=True) name = models.CharField(max_length=150) location = models.PointField() 如何使用geodjango按位置获取k个最近邻(KNN) 我必须为此编写自定义SQL吗 我正在将PostgreSQL与PostGIS一起使用。您可以使用sql查询,通过运算
class Person:
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=150)
location = models.PointField()
如何使用geodjango按位置获取k个最近邻(KNN)我必须为此编写自定义SQL吗
我正在将PostgreSQL与PostGIS一起使用。您可以使用sql查询,通过运算符利用PostGIS
order\u:
它使用边界框的中心来计算对象之间的距离,从而获取最近的邻居
它使用边界框本身获取最近的邻居,以计算对象之间的距离
在您的例子中,您想要的似乎是
操作符,因此原始查询:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
对于这种情况(获取knn),使用地理栏是否仍然有用?或者它是没有意义的-因为我假设涉及
的计算是不同的,您可以使用地理列或几何列。加快查询速度的关键是使用spatial\u idex
。关于这个主题的进一步阅读,请看这里:Good luck@Alan:)您好,回顾您的答案,我对knn=Person.objects.raw中LIMIT 1
的目的感到困惑('SELECT*FROM myapp_person…
,我们为什么需要它?@Alan这将返回第一个最近的邻居。你可以随意更改它!我也会在我的答案中编辑它。我以为[:k]
已经处理好了这个问题?我很困惑,因为限制k
和[:k]
似乎在这里起着同样的作用
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')[:k]