轉自:https://blog.csdn.net/jiaowoyege/article/details/46119003?locationNum=10 java
我在使用此文中方法雖然解決了屬性亂碼問題,可是編碼爲CP936之後字段名就沒法新建成中文的,字段名必須爲英文。不然沒法建立shp,具體緣由正在尋找中。測試
最近在JAVA上調用GDAL來對矢量數據進行操做,中文字段和中文屬性值的亂碼問題困擾已經,又要被老杜說沒進展啦。。。苦不堪言啊!!!!好在通過這個早上的倒騰,終於給他懟出來了。在JAVA環境下怎麼配置GDAL隨手百度一發吧,我就不廢話了。直接貼代碼:編碼
- package shapefileProcess;
- import java.io.UnsupportedEncodingException;
- import org.gdal.gdal.gdal;
- import org.gdal.ogr.DataSource;
- import org.gdal.ogr.Feature;
- import org.gdal.ogr.FeatureDefn;
- import org.gdal.ogr.FieldDefn;
- import org.gdal.ogr.Layer;
- import org.gdal.ogr.ogr;
- import org.gdal.osr.SpatialReference;
- import org.gdal.osr.osr;
- public class ShapeReader {
- /**
- * @param args
- * @throws UnsupportedEncodingException
- */
- public static void main(String[] args) throws UnsupportedEncodingException
- {
- // TODO Auto-generated method stub
- String hunanxsPath="E:\\碩士階段\\項目\\實驗數據\\臨時測試\\hunanSX_WGS84.shp";
- String hunanxPath="E:\\碩士階段\\項目\\實驗數據\\洪澇相關\\湖南省.shp";
- ogr.RegisterAll();
- //支持中文路徑
- gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
- //String nameString=gdal.GetConfigOption("SHAPE_ENCODING");
- //支持中文字段
- gdal.SetConfigOption("SHAPE_ENCODING","CP936");
- DataSource hunanStream=readShapeFile(hunanxsPath);
- Layer hunanSreamLayer=hunanStream.GetLayerByIndex(0);
- DataSource hunanProvince=readShapeFile(hunanxPath);
- Layer hunanProvinceLayer=hunanProvince.GetLayer(0);
- DataSource tempDataSource=ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("E:\\gjy\\Test",null);
- MyClipFeature(hunanSreamLayer, hunanProvinceLayer,tempDataSource);
- }
- private static DataSource readShapeFile(String path)
- {
- ogr.RegisterAll();
- //支持中文路徑
- gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
- // String nameString=gdal.GetConfigOption("SHAPE_ENCODING");
- //支持中文字段
- gdal.SetConfigOption("SHAPE_ENCODING","CP936");
- DataSource inputSource=ogr.Open(path);
- return inputSource;
- }
- private static void MyClipFeature(Layer inputLayer,Layer extentLayer,DataSource tempDataSource) throws UnsupportedEncodingException
- {
- ogr.RegisterAll();
- gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
- gdal.SetConfigOption("SHAPE_ENCODING","CP936");
- for(int i=0;i<extentLayer.GetFeatureCount();i++)
- {
- Feature iFeature=extentLayer.GetFeature(0);
- FieldDefn mFieldDefn=new FieldDefn("名稱", ogr.OFTString);
- mFieldDefn.SetWidth(60);
- //extentLayer.CreateField(mFieldDefn, 1);
- Layer tempLayer=tempDataSource.CreateLayer("temp3",new SpatialReference(osr.SRS_WKT_WGS84));
- tempLayer.CreateField(mFieldDefn,1);
- FeatureDefn iFeatureDefn=extentLayer.GetLayerDefn();
- Feature mFeature=new Feature(iFeatureDefn);
- mFeature.SetField(0,iFeature.GetFieldAsString(0));
- System.out.print(iFeature.GetFieldAsString(0).getBytes().getClass().toString());
- //mFeature.SetField(1, iFeature.GetFieldAsString(1));
- mFeature.SetGeometry(iFeature.GetGeometryRef());
- tempLayer.CreateFeature(mFeature);
- tempLayer.SyncToDisk();
- // }
- }
- }
上面這段程度的功能主要是實現矢量的裁剪功能,具體是用左圖對右圖實現按縣級行政區劃的裁切,其中行政區劃字段值爲中文:spa
注意:gdal.SetConfigOption("SHAPE_ENCODING","CP936"); 操作系統
不少其餘博客都沒有顯式指定SHAPE_ENCODING的值,直接爲gdal.SetConfigOption("SHAPE_ENCODING",""); 理由是:操做系統的默認編碼方式就是CP936().net
然而我通過調試發現/String nameString=gdal.GetConfigOption("SHAPE_ENCODING");返回值爲null,並非傳說中的CP936,所以將它設爲CP936解決中文亂碼問題;調試