【问题标题】:Equivalent of PostGIS ST_MakeValid in Django GEOSDjango GEOS 中 PostGIS ST_MakeValid 的等价物
【发布时间】:2018-01-19 18:34:28
【问题描述】:

在使用Objects.polygon.valid 检查多边形对象的有效性时,它抛出了GEOS_NOTICE: Self-intersection 错误。

我知道这可以通过使用 PostGIS 的 ST_MakeValid 方法来解决。
我正在使用支持 GEOS 的 Django 1.11,但在 Django 文档中找不到它的等价物。

在Django中有ST_MakeValid的等效函数吗?

【问题讨论】:

    标签: gis


    【解决方案1】:

    Django 版本 >= 1.10:

    存在数据库方法:MakeValid

    Django 版本

    您可以通过扩展 GeoFunc 类来创建自定义数据库函数,该类本身扩展了 Func() 类:

    from django.contrib.gis.db.models.functions import GeoFunc
    
    class MakeValid(GeoFunc):
        function='ST_MakeValid'
    

    MakeValid(field_name)ST_MakeValid 应用于具有field_name 的字段。


    用法:

    YourModel.objects.get(id=an_id).update(the_geom=MakeValid('the_geom'))
    

    以下是使用F() 表达式执行更新的等效查询:

    YourModel.objects.get(id=an_id)
                     .update(the_geom=GeoFunc(
                         F('the_geom'), 
                         function='ST_MakeValid'
                     ))
    

    注意: the_geom 代表您的几何领域(点、多边形等)

    【讨论】:

    • 使用这个函数还有一个疑问:当我做new_polygon_obj = MakeValid(<MultiPolygon object at 0x7fe4f5030120>)时,它不会返回一个新的多面体对象。我错过了什么?
    • 您是否真的按照此处显示的方式进行写作?如果是这种情况,您使用错了,您应该按照我在回答@ajaysingh 中的建议使用它@ajaysingh
    • @ajaysingh 我相信这超出了这个问题的范围。您可以就此问题对 SO 提出不同的问题。如果我的回答解决了您最初的问题,请考虑接受。
    • @ajaysingh 请不要 ping 别人,以便他们可以帮助您解决此类其他问题。对于 Stack 来说,这是一种非常糟糕的形式。
    • @Patrice 是的,我应该在发布之前彻底检查文档。不会重复。谢谢。
    猜你喜欢
    • 2010-11-07
    • 2017-11-22
    • 2015-02-06
    • 2021-08-24
    • 2012-02-18
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多