解決GDAL中文亂碼問題--轉載

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

我在使用此文中方法雖然解決了屬性亂碼問題,可是編碼爲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. }  

上面這段程度的功能主要是實現矢量的裁剪功能,具體是用左圖對右圖實現按縣級行政區劃的裁切,其中行政區劃字段值爲中文:spa

注意:gdal.SetConfigOption("SHAPE_ENCODING","CP936");  操作系統

不少其餘博客都沒有顯式指定SHAPE_ENCODING的值,直接爲gdal.SetConfigOption("SHAPE_ENCODING",""); 理由是:操做系統的默認編碼方式就是CP936().net

然而我通過調試發現/String nameString=gdal.GetConfigOption("SHAPE_ENCODING");返回值爲null,並非傳說中的CP936,所以將它設爲CP936解決中文亂碼問題;調試

相關文章
相關標籤/搜索