雄雄230 2015-03-06 14:55 采纳率: 0%
浏览 7034

GDAL11.1版本不支持中文路径,读取shp文件属性字段出现乱码

首先读取带有中文路径的shp文件,代码如下:

 string strShpFullName = @"G:\学习资料\ArcGIS空间数据\ATShp\Boundary\China_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中就没出现

  • 写回答

4条回答 默认 最新

  • qq_24784005 2015-08-25 19:12
    关注

    好吧,我今天正好碰到这个问题,网上一堆办法都治标不治本,我愤怒了,给一个我的解决方法:
    具体思路如下,引入命名空间,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直接解码就可以了。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料