Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我怎样才能为geodjango找到k个最近的邻居?_Python_Django_Postgresql_Postgis_Geodjango - Fatal编程技术网

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]