解决GDAL中文乱码问题--转载

转自:https://blog.csdn.net/jiaowoyege/article/details/46119003?locationNum=10 

我在使用此文中方法虽然解决了属性乱码问题,但是编码为CP936以后字段名就无法新建成中文的,字段名必须为英文。否则无法创建shp,具体原因正在寻找中。

最近在JAVA上调用GDAL来对矢量数据进行操作,中文字段和中文属性值的乱码问题困扰已经,又要被老杜说没进展啦。。。苦不堪言啊!!!!好在经过这个早上的倒腾,终于给他怼出来了。在JAVA环境下怎么配置GDAL随手百度一发吧,我就不废话了。直接贴代码:

 
  1. package shapefileProcess;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4.   
  5. import org.gdal.gdal.gdal;  
  6. import org.gdal.ogr.DataSource;  
  7. import org.gdal.ogr.Feature;  
  8. import org.gdal.ogr.FeatureDefn;  
  9. import org.gdal.ogr.FieldDefn;  
  10. import org.gdal.ogr.Layer;  
  11. import org.gdal.ogr.ogr;  
  12. import org.gdal.osr.SpatialReference;  
  13. import org.gdal.osr.osr;  
  14.   
  15. public class ShapeReader {  
  16.   
  17.     /** 
  18.      * @param args 
  19.      * @throws UnsupportedEncodingException  
  20.      */  
  21.     public static void main(String[] args) throws UnsupportedEncodingException  
  22.     {  
  23.         // TODO Auto-generated method stub  
  24.       
  25.         String hunanxsPath="E:\硕士阶段\项目\实验数据\临时测试\hunanSX_WGS84.shp";  
  26.         String hunanxPath="E:\硕士阶段\项目\实验数据\洪涝相关\湖南省.shp";  
  27.       
  28.   
  29.         ogr.RegisterAll();   
  30.         //支持中文路径  
  31.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
  32.         //String nameString=gdal.GetConfigOption("SHAPE_ENCODING");  
  33.         //支持中文字段  
  34.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");   
  35.           
  36.       
  37.           
  38.           
  39.         DataSource hunanStream=readShapeFile(hunanxsPath);  
  40.         Layer hunanSreamLayer=hunanStream.GetLayerByIndex(0);  
  41.           
  42.         DataSource hunanProvince=readShapeFile(hunanxPath);  
  43.         Layer hunanProvinceLayer=hunanProvince.GetLayer(0);  
  44.           
  45.         DataSource tempDataSource=ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("E:\gjy\Test",null);  
  46.         MyClipFeature(hunanSreamLayer, hunanProvinceLayer,tempDataSource);  
  47.     }  
  48.       
  49.   
  50.     private static DataSource readShapeFile(String path)  
  51.     {  
  52.           
  53.         ogr.RegisterAll();  
  54.         //支持中文路径  
  55.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
  56.     //  String nameString=gdal.GetConfigOption("SHAPE_ENCODING");  
  57.         //支持中文字段  
  58.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");   
  59.           
  60.         DataSource inputSource=ogr.Open(path);  
  61.         return inputSource;  
  62.     }  
  63.       
  64.   
  65.     private static void MyClipFeature(Layer inputLayer,Layer extentLayer,DataSource tempDataSource) throws UnsupportedEncodingException  
  66.     {  
  67.           
  68.   
  69.         ogr.RegisterAll();  
  70.   
  71.         gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");   
  72.   
  73.         gdal.SetConfigOption("SHAPE_ENCODING","CP936");  
  74.   
  75.           
  76.   
  77.   
  78.         for(int i=0;i<extentLayer.GetFeatureCount();i++)  
  79.         {  
  80.             Feature iFeature=extentLayer.GetFeature(0);  
  81.             FieldDefn mFieldDefn=new FieldDefn("名称", ogr.OFTString);  
  82.             mFieldDefn.SetWidth(60);  
  83.             //extentLayer.CreateField(mFieldDefn, 1);  
  84.             Layer tempLayer=tempDataSource.CreateLayer("temp3",new SpatialReference(osr.SRS_WKT_WGS84));  
  85.             tempLayer.CreateField(mFieldDefn,1);  
  86.             FeatureDefn iFeatureDefn=extentLayer.GetLayerDefn();  
  87.             Feature mFeature=new Feature(iFeatureDefn);  
  88.           
  89.             mFeature.SetField(0,iFeature.GetFieldAsString(0));  
  90.             System.out.print(iFeature.GetFieldAsString(0).getBytes().getClass().toString());  
  91.             //mFeature.SetField(1, iFeature.GetFieldAsString(1));  
  92.             mFeature.SetGeometry(iFeature.GetGeometryRef());  
  93.       
  94.               
  95.       
  96.            tempLayer.CreateFeature(mFeature);     
  97.             tempLayer.SyncToDisk();  
  98.     //  }  
  99.     }  
  100.   
  101. }  

上面这段程度的功能主要是实现矢量的裁剪功能,具体是用左图对右图实现按县级行政区划的裁切,其中行政区划字段值为中文:

注意:gdal.SetConfigOption("SHAPE_ENCODING","CP936");  

很多其他博客都没有显式指定SHAPE_ENCODING的值,直接为gdal.SetConfigOption("SHAPE_ENCODING",""); 理由是:操作系统的默认编码方式就是CP936()

然而我经过调试发现/String nameString=gdal.GetConfigOption("SHAPE_ENCODING");返回值为null,并不是传说中的CP936,因此将它设为CP936解决中文乱码问题;

原文地址:https://www.cnblogs.com/niudieyi/p/8707982.html