【问题标题】:How to efficiently query large multi-polygons with PostGIS如何使用 PostGIS 高效查询大型多面体
【发布时间】:2023-08-24 14:37:01
【问题描述】:

我正在处理似乎过于分散而无法有效查询的无线电地图。当我询问单个点是否在多面体内时,响应时间为 20-40 秒(我已经测试了“内部”/“包含”/“重叠”)。我使用 PostGIS 和 GeoDjango 来抽象查询。

多多边形列有一个 GiST 索引,我尝试过 VACUUM ANALYZE。我使用 PostgreSQL 8.3.7。和 Django 1.2。

这些地图覆盖了广阔的地理区域。它们最初是由地形感知无线电工具生成的,the radio cells/polygons are therefore fragmented

我的目标是查询多面体中的点(即可能被信号覆盖或未覆盖的房屋)。

所有的无线电地图都由 100.000 到 300.000 个顶点(总计)组成,多边形的数量变化很大。有些地图的多边形少于 10 个。从那里它跳到 10.000 到 30.000 个多边形之间。多边形与顶点的比率似乎对完成查询所需的时间影响不大。

我使用投影坐标系,并为房屋和无线电扇区使用相同的系统。 Qgis 显示无线电扇区和地图正确放置在地形中。

我的测试查询一次只针对一张单选地图中的一所房子。我测试过“within”/“contains”/“overlaps”之类的查询,结果是一样的:

  • 如果房子“远离”无线电地图,则响应亚秒级(我猜这是因为它位于查询中自动使用的边界框之外)。

  • 如果房屋/点靠近或在无线电地图内,则响应时间为 20-40 秒。

我是否有其他方法来优化查询,或者我必须以某种方式更改/简化源材料?任何建议表示赞赏。

【问题讨论】:

  • 您可以在专用站点gis.stackexchange.com/questions找到更多有关GIS相关问题的专家解答
  • 请詹姆斯你介意在这里分享你做了什么我是新手,我面临同样的问题,我不知道该怎么做非常感谢。

标签: postgis geodjango


【解决方案1】:

你好

我要做的第一件事是将多面体分割成单个面体并创建一个新索引。然后索引将更有效地工作。现在整个多面体有一个大的边界框,索引只能判断房子是否在边界框内。因此,相对于整个数据集的多边形越小,索引使用就越有效。甚至有一些技术可以使用网格将单个多边形分割成更小的多边形,以使查询的索引部分更加有效。但是,第一件事是使用 ST_Dump() 将多个多边形拆分为单个多边形。如果您在同一个表中有很多属性,最好将其放入另一个表中,并且只保留一个 ID 来说明它属于哪个 radiomap。否则会得到大量重复的属性数据。

HTH 尼克拉斯

【讨论】:

  • 谢谢!将地图拆分为网格后,性能达到顶峰(与之前相比)。我现在可以对每个处理器内核每秒处理 100 多个房屋进行批量覆盖查询。
最近更新 更多