Python 需要使用GeoDjango在postGIS上实现性能

Python 需要使用GeoDjango在postGIS上实现性能,python,django,postgis,geodjango,Python,Django,Postgis,Geodjango,这是我第一次在postGIS中使用GeoDjango。在安装和一些测试之后,一切正常运行,我关心的是表行增长时的查询性能 我保存了从谷歌地理编码(WGS84,或SRID4326)获得的几何点经度和纬度。我的问题是距离运算在我的应用程序中非常常见。我经常需要靠近地标上的一些地方。几何数学是非常复杂的,所以即使我有一个空间索引,它可能会花太长的时间在未来有超过1000点在附近的地区 那么,有没有办法投影这种几何体类型以更快地进行距离运算?有人知道Django库可以呈现包含这些点的Google地图吗

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

我保存了从谷歌地理编码(WGS84,或SRID4326)获得的几何点经度和纬度。我的问题是距离运算在我的应用程序中非常常见。我经常需要靠近地标上的一些地方。几何数学是非常复杂的,所以即使我有一个空间索引,它可能会花太长的时间在未来有超过1000点在附近的地区

那么,有没有办法投影这种几何体类型以更快地进行距离运算?有人知道Django库可以呈现包含这些点的Google地图吗


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

通常,GeoDjango会在适当的情况下在几何体列上创建并使用空间索引


对于一个主要处理点之间距离的应用程序来说,(在PostGIS 1.5中引入,并由GeoDjango支持)可能是一个很好的选择。GeoDjango说,它“在WGS84距离查询上的性能要好得多。”

如果你能将你的工作区域放入地图投影中,这将总是更快,因为距离计算之类的事情所需的数学调用更少。然而,如果你有真正的全球数据,就要吸取它:使用地理信息。如果您只有美国大陆的数据,请使用类似EPSG:2163的数据


工作区域越受约束,在地图投影中得到的结果就越精确。有关美国地区的高度约束、精确的预测,请参见州平面预测。对于较大的次国家地区,请参见UTM预测。

我正在研究这个主题。据我所知,从geopy库获得的坐标是SRID4326格式,因此可以将它们存储在几何体字段类型中而不会出现问题。这是使用几何体的GeoDjango模型的一个示例:

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

   objects = models.GeoManager()
顺便说一句,要非常小心地将经度/纬度以准确的顺序传递给PointField。geopy返回纬度/经度坐标,因此需要将其反转

为了将一个坐标系中的点转换为另一个坐标系,我们可以使用GEOS和GeoDjango。在本例中,我将把4326中的一个点转换为著名的谷歌投影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地图中的点。我们可以使用


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

只是想澄清一下,您是否真的遇到了PostGIS的性能问题?如果您只是担心可能发生的事情,请抵制过早的优化!人们在使用具有数百万条记录的表进行类似于您的查询时会得到很好的结果。关于距离查询的更多信息:我不确定我会称之为过早优化(尽管我还没有遇到性能问题)。我只想知道詹戈在必要的时候会接受挑战。我知道postGIS以及如何使用&&和重叠框改进距离查询,但例如GeoDjango是否使用了此功能?另一方面,我对精度不是很挑剔,所以我不应该使用几何体,因为它是有代价的。这是真的,正如你在GeometryField.spatial_index-->中看到的那样,默认为true。为给定几何体字段创建空间索引。Django从上一个稳定版本1.2.1开始就支持地理类型,所以它非常新。在文档中你也可以读到:因为地理计算涉及更多的数学:所以我想问的是地理真的很适合吗?它能正常扩展吗?我知道投影速度更快,但我正在管理西班牙地理数据,不知道如何在GeoDjango中转换、存储和处理它。同时,不确定Google给出的点是否在SRID4326或EPSG900913中。Google API返回并使用EPSG:4326中的坐标。对于西班牙的投影系统,请尝试EPSG:25831。