问题描述
我正在尝试将shapefile读取到GeoDataFrame中.
I am trying to read in a shapefile into a GeoDataFrame.
通常我只是这样做,它可以工作:
Normally I just do this and it works:
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
df = gpd.read_file("wild_fires/nbac_2016_r2_20170707_1114.shp")
但这一次它给了我错误:b'Recode from ANSI 1252 to UTF-8 failed with the error: "Invalid argument".'
But this time it gives me the error: b'Recode from ANSI 1252 to UTF-8 failed with the error: "Invalid argument".'
完整错误:
---------------------------------------------------------------------------
CPLE_AppDefinedError Traceback (most recent call last)
<ipython-input-14-adcad0275d30> in <module>()
----> 1 df_wildfires_2016 = gpd.read_file("wild_fires/nbac_2016_r2_20170707_1114.shp")
/usr/local/lib/python3.6/site-packages/geopandas/io/file.py in read_file(filename, **kwargs)
19 """
20 bbox = kwargs.pop('bbox', None)
---> 21 with fiona.open(filename, **kwargs) as f:
22 crs = f.crs
23 if bbox is not None:
/usr/local/lib/python3.6/site-packages/fiona/__init__.py in open(path, mode, driver, schema, crs, encoding, layer, vfs, enabled_drivers, crs_wkt)
163 c = Collection(path, mode, driver=driver, encoding=encoding,
164 layer=layer, vsi=vsi, archive=archive,
--> 165 enabled_drivers=enabled_drivers)
166 elif mode == 'w':
167 if schema:
/usr/local/lib/python3.6/site-packages/fiona/collection.py in __init__(self, path, mode, driver, schema, crs, encoding, layer, vsi, archive, enabled_drivers, crs_wkt, **kwargs)
151 if self.mode == 'r':
152 self.session = Session()
--> 153 self.session.start(self)
154 elif self.mode in ('a', 'w'):
155 self.session = WritingSession()
fiona/ogrext.pyx in fiona.ogrext.Session.start (fiona/ogrext2.c:8432)()
fiona/_err.pyx in fiona._err.GDALErrCtxManager.__exit__ (fiona/_err.c:1861)()
CPLE_AppDefinedError: b'Recode from ANSI 1252 to UTF-8 failed with the error: "Invalid argument".'
我一直在试图弄清楚为什么一段时间以来我仍然收到错误,但似乎找不到答案.
I've been trying to figure out why I am getting the error for a while but can't seem to find the answer.
数据是从此网页获得的,我仅下载了2016年链接: http://cwfis.cfs.nrcan.gc.ca/datamart/download/nbac?token=78e9bd6af67f71204e18cb6fa4e47515
The data was obtained from this webpage I downloaded only the 2016 link: http://cwfis.cfs.nrcan.gc.ca/datamart/download/nbac?token=78e9bd6af67f71204e18cb6fa4e47515
有人可以帮助我吗?谢谢你.
Would anybody be able to help me? Thank you.
推荐答案
似乎您的shapefile包含导致Fiona.open()
调用失败的非UTF字符(geopandas使用Fiona打开文件).
Seems that your shapefile contains non-UTF characters that causes the Fiona.open()
call to fail (geopandas uses Fiona to open files).
我解决该错误的方法是打开Shapefile(例如,使用QGis),然后选择save as
,然后将Encoding
选项指定为"UTF-8":
What I did that solved this error was to open the Shapefile (with QGis for example), then selecting save as
, and specifying the Encoding
option as "UTF-8":
完成此操作后,调用df = gpd.read_file("convertedShape.shp")
时没有错误.
After doing this, I got no error when calling df = gpd.read_file("convertedShape.shp")
.
另一种无需使用QGis或类似方法的方法是再次读取并保存Shapefile(有效地转换为所需的格式).使用OGR,您可以执行以下操作:
Another way to do this without having to use QGis or similar, is to read and save your Shapefile again (effectively converting to the desired format). With OGR you can do something like this:
from osgeo import ogr
driver = ogr.GetDriverByName("ESRI Shapefile")
ds = driver.Open("nbac_2016_r2_20170707_1114.shp", 0) #open your shapefile
#get its layer
layer = ds.GetLayer()
#create new shapefile to convert
ds2 = driver.CreateDataSource('convertedShape.shp')
#create a Polygon layer, as the one your Shapefile has
layer2 = ds2.CreateLayer('', None, ogr.wkbPolygon)
#iterate over all features of your original shapefile
for feature in layer:
#and create a new feature on your converted shapefile with those features
layer2.CreateFeature(feature)
ds = layer = ds2 = layer2 = None
这也使您可以在转换后使用df = gpd.read_file("convertedShape.shp")
成功打开.希望这会有所帮助.
This also enabled to successfully open with df = gpd.read_file("convertedShape.shp")
after conversion. Hope this helps.
这篇关于b'从ANSI 1252重新编码为UTF-8失败,并显示错误:“无效参数". Geopandas蟒蛇的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!