这是我第一次将GeoDjango与postGIS一起使用。在安装和一些运行正常的测试之后,当表行增长时,我担心查询性能。
我节省了从Google地理编码(WGS84或SRID 4326)获得的几何点经度和纬度。我的问题是距离操作在我的应用程序中很常见。我经常需要从地标附近找到景点。几何数学是非常复杂的,所以即使我有一个空间索引,将来可能需要太长时间才能在附近区域有超过1000个点。
那么有没有办法投影这种几何类型来更快地进行距离操作?有没有人知道一个Django库可以渲染包含其中一些点的谷歌地图?
有关如何加速GeoDjango空间查询的任何建议吗?
答案 0 :(得分:3)
如果您可以将工作区域放入地图投影中,那么总是会更快,因为距离计算等所需的数学调用次数较少。但是,如果您拥有真正的全球数据,那就吸收它:使用地理位置。如果您只有美国大陆数据,请使用类似EPSG:2163 http://spatialreference.org/ref/epsg/2163/
的内容您的工作区域越受限制,您在地图投影中获得的结果就越准确。查看州平面预测,了解美国区域的高度约束,准确的预测。或UTM对较大的次国家地区的预测。
答案 1 :(得分:3)
我正在研究这个话题。据我所知,从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地图中的点数。我们可以使用this great article。
我决定继续使用地理类型,我将在未来转换它们,以防我需要提高性能。
答案 2 :(得分:0)
通常,GeoDjango将在适当的位置在几何列上创建和使用空间索引。
对于主要处理点之间距离的应用程序,Geography type(在PostGIS 1.5中引入,并由GeoDjango支持)可能非常适合。 GeoDjango说它在WGS84距离查询上提供了“更好的性能”[link]。