如何将KML文件中的多边形保存到GeoDjango的PolygonField字段?
解决GeoDjango导入KML多边形到PolygonField的类型不匹配问题
我明白你现在的困境——直接用GDAL返回的Polygon对象赋值给GeoDjango的PolygonField确实会遇到类型不匹配的问题,这是因为GDAL的几何类和GeoDjango依赖的GEOS几何类是两个独立的实现,不能直接互相转换。下面是具体的解决方法:
核心问题分析
你遇到的两个报错本质上是同一个原因:
- 报错
TypeError: Improper geometry input type: <class 'django.contrib.gis.gdal.geometries.Polygon'>:GEOSGeometry构造函数不接受GDAL的Polygon对象作为输入,它需要的是WKT/WKB字符串、字节流等兼容格式。 - 报错
TypeError: Cannot set School SpatialProxy (POLYGON) with value of type: <class 'django.contrib.gis.gdal.geometries.Polygon'>:GeoDjango的PolygonField只接受GEOSGeometry类型的对象,直接传入GDAL的Polygon类型不符合要求。
修正后的代码实现
我们需要通过**WKT(Well-Known Text)或者WKB(Well-Known Binary)**作为中间格式,把GDAL的几何对象转换成GEOS兼容的对象:
from django.contrib.gis.geos import GEOSGeometry from django.contrib.gis.gdal import DataSource # 获取目标School实例 i = School.objects.get(...) # 加载KML数据源 ds = DataSource('school.aspx') # 获取图层中的第一个几何对象 gdal_geom = ds[0].get_geoms()[0] # 关键步骤:将GDAL几何对象转为WKT,再构建GEOSGeometry对象 geos_geom = GEOSGeometry(gdal_geom.wkt) # 赋值并保存 i.boundaries = geos_geom i.save()
额外说明
- 如果你的KML文件中包含多个多边形(即MultiPolygon类型),只需要把模型字段改成
MultiPolygonField,上述代码依然适用,GEOSGeometry会自动识别并转换对应的类型。 - 也可以使用
gdal_geom.wkb替代gdal_geom.wkt,两者都能被GEOSGeometry正确解析,WKB在性能上会略优一些。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

