gdal for android 開發包,欄位屬性為中文出現亂碼
阿新 • • 發佈:2018-12-21
GDAL Android庫,建立shp,如果欄位屬性需要中文,網上的解決方法都是
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8");
測試發現,沒有作用。
public void SetField(int id, String value) { ogrJNI.Feature_SetField__SWIG_0(this.swigCPtr, this, id, value); } public void SetField(String name, String value) { ogrJNI.Feature_SetField__SWIG_1(this.swigCPtr, this, name, value); }
為什麼會亂碼,編碼不對。
如果直接使用SetField沒幾個能對得,所以轉換思路,從編碼方式入手。
解決思路——>SetFieldBinaryFromHexString
Feature.SetFieldBinaryFromHexString(1,Until.str2HexStr("測試","GBK"));
new String(oFeature.GetFieldAsBinary(iField),"GBK") ;
以下是所有用到的方法
1.這兩句加上,不然不能用中文路徑
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8");
2.String——>Byte[]——>HexString
//charsetName="GBK" public static String str2HexStr(String origin,String charsetName) throws UnsupportedEncodingException { byte[] bytes = origin.getBytes(charsetName); String hex = bytesToHexString(bytes); return hex; }
private static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); }
3.讀取的時候
new String(oFeature.GetFieldAsBinary(iField),"GBK") ;
這樣就保證了,ArcGIS 和Android shp檔案顯示都不是亂碼
最後附上完整程式碼和GDAL Android庫,不要問我怎麼編譯,我也不會,還在學習中
private void writeShp() throws UnsupportedEncodingException { ogr.RegisterAll(); gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8"); String strDriverName = "ESRI Shapefile"; org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName); if (oDriver == null) { System.out.println(strDriverName + " 驅動不可用!\n"); return; } //shpPath為shp儲存位置:記憶體/test.shp DataSource oDS = oDriver.CreateDataSource(shpPath, null); if (oDS == null) { System.out.println("建立向量檔案【" + shpPath + "】失敗!\n"); return; } Layer oLayer = oDS.CreateLayer("TestPolygon", null, ogr.wkbPolygon, null); if (oLayer == null) { System.out.println("圖層建立失敗!\n"); return; } // 下面建立屬性表 // 先建立一個叫FieldID的整型屬性 FieldDefn oFieldID = new FieldDefn("FieldID", ogr.OFTInteger); oLayer.CreateField(oFieldID); // 再建立一個叫FeatureName的字元型屬性,字元長度為50 FieldDefn oFieldName = new FieldDefn("FieldName", ogr.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 建立三角形要素 Feature oFeatureTriangle = new Feature(oDefn); oFeatureTriangle.SetField(0, 0); oFeatureTriangle.SetFieldBinaryFromHexString(1, Until.str2HexStr("中文測試","GBK")); Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))"); oFeatureTriangle.SetGeometry(geomTriangle); oLayer.CreateFeature(oFeatureTriangle); // 建立矩形要素 Feature oFeatureRectangle = new Feature(oDefn); oFeatureRectangle.SetField(0, 1); oFeatureRectangle.SetFieldBinaryFromHexString(1,Until.str2HexStr("測試","GBK")); Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))"); oFeatureRectangle.SetGeometry(geomRectangle); oLayer.CreateFeature(oFeatureRectangle); // 建立五角形要素 Feature oFeaturePentagon = new Feature(oDefn); oFeaturePentagon.SetField(0, 2); oFeaturePentagon.SetFieldBinaryFromHexString(1, Until.str2HexStr("中文","GBK")); Geometry geomPentagon = Geometry.CreateFromWkt("POLYGON ((70 0,85 0,90 15,80 30,65 15,70 0))"); oFeaturePentagon.SetGeometry(geomPentagon); oLayer.CreateFeature(oFeaturePentagon); try { oLayer.SyncToDisk(); oDS.SyncToDisk(); } catch (Exception e) { e.printStackTrace(); } System.out.println("\n資料集建立完成!\n"); }
本人使用的資原始檔GDAL Android 2.2.3
ArcGIS 中文亂碼登錄檔10.2
這個就不上傳了,直接貼出來,把以下內容新建txt,字尾改為reg使用
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\ESRI\Desktop10.2\Common\CodePage]
"dbfDefault"="UTF-8"
以上就是解決GDAL Android 建立shp檔案中文亂碼,ArcGIS 無法檢視的問題