1. 程式人生 > >gdal for android 開發包,欄位屬性為中文出現亂碼

gdal for android 開發包,欄位屬性為中文出現亂碼

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 無法檢視的問題