Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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中的点最近的几何体的最快方法_Python_Django_Geodjango - Fatal编程技术网

Python 获取与GeoDjango中的点最近的几何体的最快方法

Python 获取与GeoDjango中的点最近的几何体的最快方法,python,django,geodjango,Python,Django,Geodjango,我在WGS84坐标系中有大量点(~150万)。这些点跨越一个很大的区域,所以我不能使用投影坐标系。我想找到离给定的一对输入坐标最近的点。我有一个工作视图,但执行起来太长(~2.5秒) 这是我的模型: from django.contrib.gis.db import models class Point(models.Model): id = models.IntegerField(primary_key=True) geom = models.PointField(srid

我在WGS84坐标系中有大量点(~150万)。这些点跨越一个很大的区域,所以我不能使用投影坐标系。我想找到离给定的一对输入坐标最近的点。我有一个工作视图,但执行起来太长(~2.5秒)

这是我的模型:

from django.contrib.gis.db import models

class Point(models.Model):

    id = models.IntegerField(primary_key=True)
    geom = models.PointField(srid=4326, spatial_index=True)

    objects = models.GeoManager()
这是视图中的查询(我从另一个SO问题中得到):

有没有办法更快地做到这一点?我在SQLAlchemy/GeoAlchemy2中有一个等价的查询,执行这个查询只需不到0.5秒,所以我知道这是可能的

from geoalchemy2.elements import WKTElement

pt = WKTElement('POINT({0} {1})'.format(lon, lat), srid=4326)
q = session.query(Point).order_by(Point.geom.distance_box(pt)).first()

使用GeoDjango进行“最近点”查询有更好的方法吗?

不确定,这可能会更快。您可以使用谷歌投影(
900913
)以米为单位获取数据

from django.contrib.gis.measure import D

DISTANCE_LIMIT_METERS = 5000

input_point = Point(lon, lat, srid=4326)
input_point.transform(900913)
ModelContainingPoint.objects.filter(geom__dwithin=(input_point , D(m=DISTANCE_LIMIT_METERS)))
参考:


不确定,这可能会更快。您可以使用谷歌投影(
900913
)以米为单位获取数据

from django.contrib.gis.measure import D

DISTANCE_LIMIT_METERS = 5000

input_point = Point(lon, lat, srid=4326)
input_point.transform(900913)
ModelContainingPoint.objects.filter(geom__dwithin=(input_point , D(m=DISTANCE_LIMIT_METERS)))
参考:


很抱歉没有回应。我也试过了,但没有更快。我还尝试使用geography类型而不是geometry,文档中也建议使用geometry类型来更快地进行距离查询,但在我的例子中,它实际上要慢得多。我最终在Flask中重写了应用程序。@bananafish我很好奇迁移到Flask的结果是什么,你是如何解决性能[速度]问题的。这对其他人也有帮助。在我看来,在postgresql中进行原始sql查询或编写可调用的过程应该可以解决这个问题,否则使用单独的api会比将整个应用程序切换到其他框架更好。@ZubairAlam使用GeoAlchemy迁移到Flask对我来说非常成功,它与PostGIS的集成非常好。虽然我明白你的观点,但可以肯定的是,在这个问题上转换框架有点过头了,但它在开发阶段还很早,所以它并不像看起来那样是一个很大的障碍。很抱歉没有得到回应。我也试过了,但没有更快。我还尝试使用geography类型而不是geometry,文档中也建议使用geometry类型来更快地进行距离查询,但在我的例子中,它实际上要慢得多。我最终在Flask中重写了应用程序。@bananafish我很好奇迁移到Flask的结果是什么,你是如何解决性能[速度]问题的。这对其他人也有帮助。在我看来,在postgresql中进行原始sql查询或编写可调用的过程应该可以解决这个问题,否则使用单独的api会比将整个应用程序切换到其他框架更好。@ZubairAlam使用GeoAlchemy迁移到Flask对我来说非常成功,它与PostGIS的集成非常好。虽然我明白你的观点,但可以肯定的是,在这个问题上转换框架有点过头了,但这是开发的早期阶段,所以它并没有看起来那么大的障碍。