【问题标题】:Problems combining (union) Multipolygons in geodjango在geodjango中组合(联合)多面体的问题
【发布时间】:2013-03-09 15:02:01
【问题描述】:

我正在使用 geodjango 和 postgis (1.x), 组合(联合)多面体列表的最佳方法是什么。

在我认为是相当低效的情况下,我正在像这样循环低谷

combined = multipolygon
for item in items:
    combined = combined.union(item.geom)  #geom is a multipolygon

通常这可以正常工作,但我经常收到错误错误检查从 GEOS C 函数“GEOSUnion_r”返回的几何时遇到的错误。

如果有帮助,这里是抛出错误的项目的 geo json 版本

{ "type": "MultiPolygon", "coordinates": 
[ [ [ [ -80.077576, 26.572225 ], 
      [ -80.037729, 26.571180 ], 
      [ -80.080279, 26.273744 ], 
      [ -80.147464, 26.310066 ], 
      [ -80.152851, 26.455851 ], 
      [ -80.138560, 26.538013 ], 
      [ -80.077576, 26.572225 ] 
] ] ] 
}

有人有什么想法吗?最终目标是找到属于这个 n 多边形列表的所有位置(另一个表)(使用坐标__within=combined_area)

此外,多边形在 geodjango 管理员的地图上显示良好。

【问题讨论】:

    标签: django postgis geodjango geos


    【解决方案1】:

    您始终可以使用Union 聚合方法。这应该更有效率,因为一切都是在数据库级别计算的,这意味着您不必在 Python 中循环。

    combined_area = FooModel.objects.filter(...).aggregate(area=Union('geom'))['area']
    final = BarModel.objects.filter(coordinates__within=combined_area)
    

    【讨论】:

    • 我会尝试一下,谢谢你的提示。知道为什么我会收到“检查从 GEOS C 函数“GEOSUnion_r”返回的几何时出错。当以另一种方式进行时?
    • 我唯一能想到的就是geom列是null或者空
    • 虽然更简洁,但该方法在遇到问题几何时返回 null。几何不是空的,但尝试直接在 postgres 中运行查询我得到通知:TopologyException:发现 LINESTRING 之间的非节点交集......而且它似乎只影响几何的某些组合,并且如果它的相关 POSTGIS= "1.5.3" GEOS="3.3.8-CAPI-1.7.8" PROJ="Rel. 4.7.1,2009 年 9 月 23 日" LIBXML="2.7.6" USE_STATS
    • 这很奇怪。至少你可以缩小 Django 不是问题的范围,并且在 postgres 中正在发生一些事情。
    • 好吧,再挖掘一些,我发现这个链接linfiniti.com/2010/07/cleaning-geometries-inside-postgis 这里有一个函数可以清理坏的几何图形。暂时我会,定期运行类似 update mytable set geom = cleangeometry(geom) where id in (select id from mytable where st_isvalid(geom) = false);我对此并不特别兴奋,但它应该可以帮助事情离得太远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2022-08-18
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多