You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:55:18