使用GeoDjango需要postGIS性能

这是我第一次在PostGIS中使用GeoDjango。 在安装和一切正常运行的测试之后,我担心表格行增长时的查询性能。

我正在保存从Google地理编码(WGS84或SRID 4326)获得的几何点经度和纬度。 我的问题是距离操作在我的应用程序中很常见。 我经常需要靠近地标附近的景点。 几何数学是非常复杂的,所以即使我有一个空间索引,未来可能需要很长的时间,在附近地区有超过1000个点。

那么有什么方法可以投影这个几何类型来更快地进行距离操作吗? 有没有人知道一个Django库可以渲染包含这些点的Google地图?

关于如何加快GeoDjango空间查询的任何建议?


如果你可以将你的工作区域放入地图投影中,那么总是会更快,因为距离计算等工作所需的数学调用更少。 但是,如果您拥有真正的全球数据,请吸取它:使用地理。 如果您只有美国大陆的数据,请使用类似EPSG的数据:2163 http://spatialreference.org/ref/epsg/2163/

工作区域越受限制,您可以在地图投影中获得更准确的结果。 参见美国国家平面预测,对美国区域地区进行高度约束,准确的预测。 或对更大的次国家地区进行UTM预测。


我正在研究这个话题。 据我发现,从geopy库获得的坐标是SRID 4326格式,因此您可以将它们存储在几何字段类型中,而不会出现任何问题。 这将是使用几何的GeoDjango模型的一个例子:

class Landmark(models.Model):
   point = models.PointField(spatial_index = True,
                           srid = 4326,
                           geography = True)

   objects = models.GeoManager()

顺便说一下,要非常小心地按照确切的顺序将经度/纬度传递给PointField。 geopy会返回纬度/经度坐标,因此您需要将其反转。

为了将一个坐标系中的点转换为另一个坐标系,我们可以使用GEOS和GeoDjango。 在这个例子中,我将把4326中的一个点转换为着名的Google投影900913:

from django.contrib.gis.geos import Point
punto = Point(40,-3)
punto.set_srid(900913)
punto.transform(4326)
punto.wkt
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)'

这样我们就可以在投影系统中存储坐标,这将会有更好的性能数学。 用于在管理站点界面中显示Google地图中的点。 我们可以使用这个伟大的文章。

我决定继续使用地理类型,我将在未来转换它们,以防我需要提高性能。


通常,GeoDjango将在适当的地方创建和使用几何列上的空间索引。

对于主要处理点之间距离的应用程序,Geography类型(在PostGIS 1.5中引入,并由GeoDjango支持)可能非常适合。 GeoDjango表示它可以“在WGS84距离查询上获得更好的性能”[链接]。

链接地址: http://www.djcxy.com/p/79491.html

上一篇: Need performance on postGIS with GeoDjango

下一篇: Are licenses relevant for small code snippets?