C# 解决GDAL读取SHP中文属性后几位乱码问题

//相信你们搜到这里的时候已经很明白自己的代码了,具体实现就不贴了,只贴关键代码

//这里引用gdal中读取属性字段转成string的函数,试过好几个版本均可以
//因为字段名可能是中文所以不能用字段名,不然会有乱码问题
[DllImport("gdal110.dll", EntryPoint = "OGR_F_GetFieldAsString", CallingConvention = CallingConvention.Cdecl)]
 public extern static System.IntPtr OGR_F_GetFieldAsString(HandleRef handle, int index);
//调用gdal方法传入feature和属性位置的index
IntPtr pStr = OGR_F_GetFieldAsString(OSGeo.OGR.Feature.getCPtr(myFeature), (int)fieldIndex);
//然后调用.net的非托转托的marshal 把指针转换成变量
string s= Marshal.PtrToStringAnsi(pStr);

此处应有掌声。对了

Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES") 这里如果是NO的话 路径会是乱码

还有

Gdal.SetConfigOption("SHAPE_ENCODING","");后边的string应该写“” 空字符串,不要写CP936  ,具体你们自己试,CP936代表codepage936  简体中文(包含繁体中文)  百度codepage 可知道具体数字代表哪种字符集。具体为什么我的shp文件不支持cp936 我也很蛋疼。

空的话应该是留给系统判断,写成null也不行,具体还是根据你们shp文件的编码你们自己试。就三种(codepage/空字符串/null),别写什么gb2312   gb18030什么的,没用,不信你随便写个字符串效果是一样的。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决GDAL读取Shapefile文件后输出中文乱码问题,可以通过设置合适的编码来处理。下面是一个示例代码,演示如何使用GDAL读取Shapefile文件并正确处理中文字符: ```python from osgeo import ogr # 打开Shapefile dataset = ogr.Open('input_shapefile.shp', 0) layer = dataset.GetLayer() # 获取属性表编码 layer_encoding = layer.GetLayerDefn().GetFieldDefn(0).GetEncoding() # 设置输出编码 output_encoding = 'utf-8' # 遍历要素并输出属性值 for feature in layer: for i in range(feature.GetFieldCount()): field_value = feature.GetField(i) # 解码属性值为Unicode字符串 field_value_unicode = field_value.decode(layer_encoding) # 编码为指定输出编码的字符串 field_value_encoded = field_value_unicode.encode(output_encoding) # 输出属性值 print(field_value_encoded) # 关闭数据集 dataset = None ``` 在上述代码中,我们首先通过`GetLayerDefn()`方法获取属性表的编码,并将其保存在`layer_encoding`变量中。然后,我们将输出编码设置为`utf-8`,可以根据需要修改为其他编码。接下来,我们遍历要素并使用`decode()`方法将属性值解码为Unicode字符串,然后使用`encode()`方法将其编码为指定的输出编码字符串。最后,我们使用`print()`语句输出属性值。 请将`input_shapefile.shp`替换为您要读取的Shapefile文件路径。如果您的Shapefile文件使用了其他编码,请在`layer.GetLayerDefn().GetFieldDefn(0).GetEncoding()`中指定正确的编码。 希望这可以解决您的问题!如果您有任何进一步的疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值