使用GeoPandas读取GML文件时触发CPLE_AppDefinedError错误
解决GML文件读取时的CPLE_AppDefinedError错误
问题描述
我尝试用以下代码读取GML文件:
import geopandas as gpd G = gpd.read_file('extract/top10nl_gebouw.gml', driver='gml')
触发了如下错误:
--------------------------------------------------------------------------- CPLE_AppDefinedError Traceback (most recent call last) Input In [4], in <cell line: 3>() 1 import geopandas as gpd ----> 3 G = gpd.read_file('extract/top10nl_gebouw.gml', driver='gml') File ~/opt/anaconda3/lib/python3.9/site-packages/geopandas/io/file.py:253, in _read_file(filename, bbox, mask, rows, engine, **kwargs) 250 path_or_bytes = filename 252 if engine == "fiona": --> 253 return _read_file_fiona( 254 path_or_bytes, from_bytes, bbox=bbox, mask=mask, rows=rows, **kwargs 255 ) 256 elif engine == "pyogrio": 257 return _read_file_pyogrio( 258 path_or_bytes, bbox=bbox, mask=mask, rows=rows, **kwargs 259 ) File ~/opt/anaconda3/lib/python3.9/site-packages/geopandas/io/file.py:301, in _read_file_fiona(path_or_bytes, from_bytes, bbox, mask, rows, **kwargs) 293 with fiona_env(): 294 with reader(path_or_bytes, **kwargs) as features: 295 296 # In a future Fiona release the crs attribute of features will 297 # no longer be a dict, but will behave like a dict. So this should 298 # be forwards compatible 299 crs = ( 300 features.crs["init"] --> 301 if features.crs and "init" in features.crs 302 else features.crs_wkt 303 ) 305 # handle loading the bounding box 306 if bbox is not None: File ~/opt/anaconda3/lib/python3.9/site-packages/fiona/collection.py:215, in Collection.crs(self) 213 """Returns a Proj4 string.""" 214 if self._crs is None and self.session: --> 215 self._crs = self.session.get_crs() 216 return self._crs File fiona/ogrext.pyx:742, in fiona.ogrext.Session.get_crs() File fiona/_err.pyx:291, in fiona._err.exc_wrap_pointer() CPLE_AppDefinedError: Cannot import 28992 due to ALLOW_FILE_ACCESS=NO
已尝试安装、卸载不同版本的GeoPandas和Fiona,但问题仍未解决。使用相同代码(Fiona版本为1.8.6)的同事却未遇到该问题。
解决方案
错误核心是GDAL的ALLOW_FILE_ACCESS配置限制了读取EPSG:28992对应的投影文件,以下是可行解决方法:
- 方法1:设置GDAL环境变量允许文件访问
在读取文件前添加环境变量配置,解除文件访问限制:
import os os.environ['GDAL_ALLOW_FILE_ACCESS'] = 'YES' import geopandas as gpd G = gpd.read_file('extract/top10nl_gebouw.gml', driver='gml')
- 方法2:直接指定CRS参数
已知文件CRS为EPSG:28992时,读取时直接指定该参数,跳过GDAL自动读取CRS的步骤:
import geopandas as gpd G = gpd.read_file('extract/top10nl_gebouw.gml', driver='gml', crs='EPSG:28992')
- 方法3:检查并修正GDAL数据路径
确保GDAL能找到投影定义文件,先查看当前GDAL数据路径:
from osgeo import gdal print(gdal.GetConfigOption('GDAL_DATA'))
如果路径不正确,手动设置正确的GDAL数据路径:
import os os.environ['GDAL_DATA'] = '/path/to/your/gdal/data'
- 方法4:切换至pyogrio引擎读取
GeoPandas支持pyogrio作为文件读取引擎,可避开fiona的GDAL配置问题,使用前需先安装pyogrio:
pip install pyogrio
然后修改读取代码:
import geopandas as gpd G = gpd.read_file('extract/top10nl_gebouw.gml', driver='gml', engine='pyogrio')
补充说明
EPSG:28992是荷兰的RD New坐标系,GDAL需要读取对应的投影定义文件才能识别该坐标系。同事环境未出现问题,大概率是其GDAL默认开启了文件访问权限,或是GDAL配置路径与你的环境不同。
内容的提问来源于stack exchange,提问作者Hein de Wilde
相关产品推荐
相关产品推荐

