您的位置:

解决方案:django GDALException("Invalid OGRGeometry loaded from pickled state.")

  发布时间:2023-04-02 10:09:57
报错的原因这个错误是在Django中使用了gdal库中出现的。它表明,Django尝试读取pickled的状态数据, 但不能解析出有效的OGR几何体。需要注意的是,如果你使用的是Django 或更高版本, 默认的地理字段是而不是GeometryField。在代码中检查传入PointField的值是否合法如果无法解决问题,尝试重置数据库或清除数据。为了确保你的服务器环境中也安装了gdal和geos库继续,如果上述都没有解决问题,可以在Django gis社区中寻求帮助或阅读Django gis相关文档。

报错的原因

这个错误是在Django中使用了gdal库(Geospatial Data Abstraction Library)中出现的。它表明,Django尝试读取pickled的状态数据, 但不能解析出有效的OGR几何体。

这通常是由于在模型中使用的空间数据类型是django.contrib.gis.db.models.fields.GeometryField, 但是在保存或更新数据时,传递了一个无效的几何数据。

解决方法是检查传递给该字段的数据是否正确,确保它是有效的OGR几何体。可以使用gdal库中的函数来验证数据是否合法。另外可以尝试重置数据库或清除数据。

需要注意的是,如果你使用的是Django 2.2或更高版本, 默认的地理字段是django.contrib.gis.db.models.fields.PointField而不是GeometryField。所以在使用PointField字段时也会出现这个问题

那应该怎么解决?回答不要太长

解决方法包括:

- 检查传递给该字段的数据是否正确,确保它是有效的OGR几何体。使用gdal库中的函数来验证数据是否合法。

- 尝试重置数据库或清除数据。

- 检查你的环境是否支持gdal

例如,假如你有一个地理字段在MyModel模型中如下:


class MyModel(models.Model):
    location = models.PointField()

如果你尝试保存一个无效的数据到location字段,就会出现 GDALException("Invalid OGRGeometry loaded from pickled state.")

可以使用如下方式验证数据是否有效:


from django.contrib.gis.geos import GEOSGeometry
point = GEOSGeometry('POINT(5 23)')
if point.valid:
    my_model_obj = MyModel(location=point)
    my_model_obj.save()

上面这个例子会确保 location字段接受的是有效的OGr几何数据,这样就不会抛出 GDALException 异常了。

还有,需要确保你的环境中有 gdal 和 geos 两个库的支持,在没有安装这两个库的时候也可能会出现这个错误。

如何解决

解决方法是:

1. 确保你的环境中有安装了gdal和geos库。

2. 在代码中检查传入PointField的值是否合法

3. 如果无法解决问题,尝试重置数据库或清除数据。

4. 如果你使用的是虚拟环境,也需要确保这两个库已经在虚拟环境中安装。

5. 如果在生产环境中出现这个错误,需要检查服务器环境是否已经安装了gdal和geos库

继续,如果仍然无法解决问题,请阅读Django gis相关文档或查看Django gis的常见问题解答,或者在Django gis社区中寻求帮助。通常使用更高版本的gdal和geos库或在不同环境下重新安装这些库可以解决问题。

使用例子

举个例子,假设你在一台机器上安装了Django,并且在你的代码中使用了PointField,但是在你的环境中没有安装GDAL和GEOS。 你会在运行你的代码时得到 GDALException("Invalid OGRGeometry loaded from pickled state.") 的错误。

为了解决这个问题,你可以这样做:

1. 确认你已经安装了gdal和geos库,如果没有安装可以用以下命令安装


   pip install gdal
   pip install geos

2. 如果你是在虚拟环境中运行你的代码,确认这两个库已经在虚拟环境中安装。

3. 为了确保你的服务器环境中也安装了gdal和geos库

继续,如果上述都没有解决问题,可以在Django gis社区中寻求帮助或阅读Django gis相关文档。如果是在生产环境中出现这个问题,可能需要向服务器管理员请求安装gdal和geos库或者更新到更高版本的gdal和geos库。

下面是一个简单的例子


from django.contrib.gis.geos import Point
my_model_obj = MyModel(location=Point(x=1.0, y=2.0))
my_model_obj.save()