MakeValid不适用于单个模型对象

时间:2017-08-16 08:40:52

标签: python django django-views postgis geodjango

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

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

MyModel.objects.filter(id=<id>).update(polygon=MakeValid('polygon'))

但是对于某些情况,我必须更新已在函数中实例化的单个模型对象的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'>

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

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

1 个答案:

答案 0 :(得分:14)

由于stated in the linked post MakeValiddatabase function,这意味着它只能在查询数据库时执行。

PostGIS ST_MakeValid的{​​{1}}用法类似,与表查询无法执行(不能自主存在)。

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

np.polygon = MakeValid(np.polygon)

您实际上是在尝试将数据库功能应用于&#39; MyModel&#39;的实例。不应该工作的班级! (因为它没有)

你能做什么:

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

    np = MyModel.objects.filter(id=np.id).update(polygon=MakeValid('polygon'))
    

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

  2. 您(可能)可以使用GEOSGeometry.buffer()方法:

    基于buffer使用polygon.buffer(0)(如果您使用GEOS验证多边形),并且由于Shapely也使用np.polygon.valid # False np.polygon.buffer(0) # Make valid np.polygon.valid # True ,因此可以&#34; tidy& #34;多边形如下:

    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
    
  3. 最后,您可以直接使用Shapely's并为计算创建一个形状多边形,您可以将其设为有效,如上所述:

    {{1}}