MakeValid不适用于单个模型对象

ran*_*ser -8 python django postgis django-views geodjango

我正在尝试MakeValid修复(验证)我的几何字段.
我可以通过获取和更新单行来使其工作:

from django.contrib.gis.db.models.functions import MakeValid

MyModel.objects.filter(id=<id>).update(polygon=MakeValid('polygon'))
Run Code Online (Sandbox Code Playgroud)

但是对于某些情况,我必须更新polygon已经在函数中实例化的单个模型对象(意味着我已经完成了.filter/ .get),这给了我以下错误:

// np is an object of MyModel which has a field 'polygon' which is `MultiPolygon` django model field
np.polygon = MakeValid(np.polygon)
// np.save()
TypeError: Cannot set MyModel SpatialProxy (MULTIPOLYGON) with value of type: <class 'django.contrib.gis.db.models.functions.MakeValid'>
Run Code Online (Sandbox Code Playgroud)

这里,MakeValid(np.polygon)不返回MultiPolygon对象.相反,它返回一个django.contrib.gis.db.models.functions.MakeValid包装器.

我可以从中获取Geometry对象MakeValid吗?

Joh*_*fis 15

链接帖子中所述 MakeValid数据库函数,这意味着它只能在查询数据库时执行.

它是1对1的类似,其PostGIS用法ST_MakeValid不能在表查询之外执行(不能自主存在).

创建np对象时,然后尝试执行以下操作:

np.polygon = MakeValid(np.polygon)
Run Code Online (Sandbox Code Playgroud)

您实际上是在尝试将数据库函数应用于"MyModel"类的实例,该实例不应该起作用!(因为它没有)


你可以做什么:

  1. 您可以创建查询以更新特定的表行:

    np = MyModel.objects.filter(id=np.id).update(polygon=MakeValid('polygon'))
    
    Run Code Online (Sandbox Code Playgroud)

    注意: 具有id=np.id"多边形"的对象将使用该方法在数据库中永久更新.

  2. 您(也许能够)使用该GEOSGeometry.buffer()方法:

    基于Shapely使用情况buffer(如果您使用polygon.buffer(0)验证多边形),并且由于身材匀称使用GEOS以及它也许可以'收拾’了多边形如下:

    np.polygon.valid          # False
    np.polygon.buffer(0)      # Make valid
    np.polygon.valid          # True
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,您可以Shapely直接使用并为您的计算创建一个形状多边形,您可以使其有效,如上所示:

    from shapely.geometry import Polygon
    
    # Initialize the polygon object with one of the following ways:
    np_polygon = Polygon([np.polygon.coords])
    # or
    np_polygon = Polygon(np.polygon.wkt)
    
    np_polygon.is_valid                 # False
    np_polygon = np_polygon.buffer(0)   # Make valid with buffer(0)
    np_polygon.is_valid                 # True
    
    Run Code Online (Sandbox Code Playgroud)

  • 你读过提供的链接@ajaysingh吗? (12认同)