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"类的实例,该实例不应该起作用!(因为它没有)
你可以做什么:
您可以创建查询以更新特定的表行:
np = MyModel.objects.filter(id=np.id).update(polygon=MakeValid('polygon'))
Run Code Online (Sandbox Code Playgroud)
注意: 具有id=np.id"多边形"的对象将使用该方法在数据库中永久更新.
您(也许能够)使用该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)最后,您可以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)| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |