我尝试使用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对象吗?
答案 0 :(得分:14)
由于stated in the linked post MakeValid
是database function,这意味着它只能在查询数据库时执行。
与PostGIS
ST_MakeValid
的{{1}}用法类似,与表查询无法执行(不能自主存在)。
创建np
对象时,尝试执行以下操作:
np.polygon = MakeValid(np.polygon)
您实际上是在尝试将数据库功能应用于&#39; MyModel&#39;的实例。不应该工作的班级! (因为它没有)
你能做什么:
您可以创建查询以更新特定的表格行:
np = MyModel.objects.filter(id=np.id).update(polygon=MakeValid('polygon'))
注意:具有id=np.id
多边形的对象将在
数据库永久使用该方法。
您(可能)可以使用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
最后,您可以直接使用Shapely
's并为计算创建一个形状多边形,您可以将其设为有效,如上所述:
{{1}}