在GeoDjango中获取最近几何体的最快方法

时间:2013-04-10 02:18:23

标签: 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=4326, spatial_index=True)

    objects = models.GeoManager()

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

input_point = GEOSGeometry('POINT({0} {1})'.format(lon, lat))
point = Point.objects.distance(input_point).order_by('distance')[0]

有没有办法更快地完成这项工作?我在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进行“最近点”查询?

1 个答案:

答案 0 :(得分:3)

不确定,这可能会更快。您可以使用Google投影(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)))

参考:

https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#distance-queries