问题描述
- GDAL11.1版本不支持中文路径,读取shp文件属性字段出现乱码
-
首先读取带有中文路径的shp文件,代码如下:string strShpFullName = @"G:学习资料ArcGIS空间数据ATShpBoundaryChina_Boundary.shp"; //注册Ogr Ogr.RegisterAll(); OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //读取字段属性值时设置,否则有中文乱码 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "NO"); DataSource ds = Ogr.Open(strShpFullName, 0); if (ds == null) { } Layer layer = ds.GetLayerByName(Path.GetFileName(strShpFullName)); if (layer == null) { }
将“GDAL_FILENAME_IS_UTF8”设置为“NO”,结果DataSource为空,如下图:
如果将“GDAL_FILENAME_IS_UTF8”设置为“YES”,DataSource不为空,但是DataSource得属性Name中含有乱码,如下图:这是什么问题??跪求答案。。。。。
第二个问题:读取shp文件的属性表,出现中文乱码,但是我已经设置了“OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "NO");”,为什么还会出现这种问题,在GDAl10.0中就没出现
解决方案
补充:当然 ,这句还是要的,
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "gb2312");
有的人说 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");也可以,确实也可以,这个应该返回当前默认代码页。
解决方案二:
好吧,我今天正好碰到这个问题,网上一堆办法都治标不治本,我愤怒了,给一个我的解决方法:
具体思路如下,引入命名空间,using System.Runtime.InteropServices,声明一个DllImport函数。
将所有调用GetFiledAsString的地方,修改为
因为SWIG自动包装处理的不到位,是的多字节字符串和中文字符串(双字节)之间的处理不正确。第一个函数是引入GDAL中OGR的CAPI接口,该接口为一组C的导出函数,在OGR的不同版本之间保持稳定。传入参数handle是Feature的句柄和字段索引值。handle就是C++中Feature类的指针。再看ogr.Feature.getCPtr(feature)函数。因为ogr的c#是swig包装C++而成,swig提供了由C#对象返回指向c++对象的能力,因此相当于在C++的Feature对象上调用GetFieldAsString。因为字符串指针是个地址,因此返回IntPtr,在利用Marshal直接解码就可以了。