6

这是我第一次将 GeoDjango 与 postGIS 一起使用。在安装和一些运行良好的测试之后,我担心表行会增长时的查询性能。

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

那么有什么方法可以投影这种几何类型以更快地进行距离操作?有谁知道可以呈现包含其中一些点的 Google 地图的 Django 库?

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

4

3 回答 3

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 地图中显示点。我们可以使用这篇很棒的文章

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

于 2010-08-27T14:08:38.670 回答
3

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

您的工作区域越受限制,您在地图投影中获得的结果就越准确。有关美国偏远地区的高度受限、准确的预测,请参阅州平面投影。或更大的次国家区域的 UTM 预测。

于 2010-08-24T17:09:24.413 回答
0

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

对于主要处理点之间距离的应用程序,Geography 类型(在 PostGIS 1.5 中引入,并由 GeoDjango 支持)可能是一个不错的选择。GeoDjango 说它“在 WGS84 距离查询上提供了更好的性能” [链接]

于 2010-08-23T19:50:30.427 回答