MakeValid不适用于单个模型对象

问题描述 投票:-8回答:1

我正在尝试使用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获取几何对象吗?

python django django-views postgis geodjango
1个回答
15
投票

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

PostGISST_MakeValid用法类似,它是一对一的,不能在表查询之外执行(不能自主存在)。>>

[创建np对象时,然后尝试做:

np.polygon = MakeValid(np.polygon)

您实质上是试图将数据库函数应用于“ MyModel”类的实例,该实例不起作用! (因为它没有)


您可以做什么:

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

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

    注意:

    具有id=np.id多边形的对象将在该方法将数据库永久保存。
  2. 您可以利用GEOSGeometry.buffer()

  3. 使用GEOSGeometry.buffer()可以整理大部分多边形不规则性(甚至可以解决某些类型的“领结” /自相交多边形)

    polygon.buffer(0)
  4. 最后,您可以使用np.polygon.valid # False np.polygon.buffer(0) # Make valid with buffer(0) np.polygon.valid # True 并为您的计算创建一个形状多边形,您可以使用与上述相同的方法(ShapelyShapely都使用Shapely's buffer库来使之有效)

    buffer
© www.soinside.com 2019 - 2024. All rights reserved.