Adr*_*ián 5 gis django postgis geolocation geodjango
我在具有 GeoDjango 的默认 SRID、WGS84 的 Postgis 数据库中有几何图形,并且发现直接以度为单位的查找比以公里为单位要快得多,因为数据库可以跳过我认为的投影。
基本上,Place.objects.filter(location__distance__lte=(point, D(km=10)))比Place.objects.filter(location__dwithin=(point, 10))第一个查询产生表的完整扫描慢几个数量级。但有时我需要查找以公里为单位的距离阈值的地方。
是否有某种精确的方法将 10 公里转换为查询的度数?也许我应该使用另一个具有相同性能的等效查找?
您有多种方法可以解决您的问题,以下是其中两种:
如果您不太关心精度,您可以使用dwithin简单的米到度的转换degree(x meters) -> x / 40000000 * 360。在赤道附近你会得到几乎精确的结果,但当你向北或向南时,你的距离会缩小(我们生活在一个球体上)。想象一个区域,一开始是圆形,后来缩小到接近其中一个极点的无限窄椭圆。
如果您关心精度,可以使用:
max_distance = 10000 # distance in meter
buffer_width = max_distance / 40000000. * 360. / math.cos(point.y / 360. * math.pi)
buffered_point = point.buffer(buffer_width)
Place.objects.filter(
location__distance__lte=(point, D(m=max_distance)),
location__overlaps=buffered_point
)
Run Code Online (Sandbox Code Playgroud)
基本思想是查询在point度数周围的圆圈内的所有点。这部分的性能非常好,因为圆的单位是度,并且可以使用地理索引。但圆圈有时有点太大,因此我们将过滤器保留为米,以过滤掉可能比允许的距离稍远的地方max_distance。
| 归档时间: |
|
| 查看次数: |
1349 次 |
| 最近记录: |