Python 获取与GeoDjango中的点最近的几何体的最快方法
我在WGS84坐标系中有大量点(~150万)。这些点跨越一个很大的区域,所以我不能使用投影坐标系。我想找到离给定的一对输入坐标最近的点。我有一个工作视图,但执行起来太长(~2.5秒) 这是我的模型: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
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的集成非常好。虽然我明白你的观点,但可以肯定的是,在这个问题上转换框架有点过头了,但这是开发的早期阶段,所以它并没有看起来那么大的障碍。