我正在尝试使用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
获取几何对象吗?
由于stated in the linked post MakeValid
是database function,这意味着它只能在查询数据库期间执行。
与PostGIS
的ST_MakeValid
用法类似,它是一对一的,不能在表查询之外执行(不能自主存在)。>>
[创建np
对象时,然后尝试做:
np.polygon = MakeValid(np.polygon)
您实质上是试图将数据库函数应用于“ MyModel”类的实例,该实例不起作用! (因为它没有)
您可以做什么:
您可以创建查询来更新特定的表行:
具有np = MyModel.objects.filter(id=np.id).update(polygon=MakeValid('polygon'))
注意:
id=np.id
多边形的对象将在该方法将数据库永久保存。您可以利用GEOSGeometry.buffer()
:
使用GEOSGeometry.buffer()
可以整理大部分多边形不规则性(甚至可以解决某些类型的“领结” /自相交多边形)
polygon.buffer(0)
最后,您可以使用np.polygon.valid # False
np.polygon.buffer(0) # Make valid with buffer(0)
np.polygon.valid # True
并为您的计算创建一个形状多边形,您可以使用与上述相同的方法(Shapely
和Shapely
都使用Shapely's buffer
库来使之有效)
buffer