Gdal是用來讀寫柵格與矢量數據的,在Gdal官網,可以下載相關的資源進行平臺的編譯。其實Arcgis底層也是用Gdal來讀取shp文件的,那在Android中可以直接讀寫shp文件嗎,是可以的。這里已經有人編譯了Android端的so ,下載地址。也可以自己嘗試編譯相關so。
新建項目,將下載的so 與相關資源導入,相關目錄結構如下:??
注意gdal的相關包名不要修改,避免so讀取不到相應的類。?
簡單寫個shp,注意導包,要導入org.gdal下面相關的類:
private void writeShp() throws UnsupportedEncodingException {//存放路徑String shpPath = basePath + "/my_line.shp";ogr.RegisterAll();gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");// 不支持中文gdal.SetConfigOption("SHAPE_ENCODING", "");String strDriverName = "ESRI Shapefile";org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);if (oDriver == null) {System.out.println(" 驅動不可用!\n");return;}// 創建數據源DataSource oDS = oDriver.CreateDataSource(shpPath, null);if (oDS == null) {return;}// 創建一個84坐標系的圖層org.gdal.osr.SpatialReference sap = new org.gdal.osr.SpatialReference();sap.SetWellKnownGeogCS("WGS84");Layer oLayer = oDS.CreateLayer("TestPolygon", sap, ogr.wkbPolygon, null);if (oLayer == null) {System.out.println("圖層創建失敗!\n");return;}// 下面創建屬性表// 先創建一個叫FieldID的整型屬性FieldDefn oFieldID = new FieldDefn("ID", ogr.OFTInteger);oLayer.CreateField(oFieldID, 1);// 再創建一個叫FeatureName的字符型屬性,字符長度為50FieldDefn oFieldName = new FieldDefn("name", ogr.OFTString);oFieldName.SetWidth(100);oLayer.CreateField(oFieldName, 1);FeatureDefn oDefn = oLayer.GetLayerDefn();// 創建要素Feature oFeatureTriangle = new Feature(oDefn);oFeatureTriangle.SetField(0, 0);oFeatureTriangle.SetField(1, "test");Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((112 45,112 30,140 30))");oFeatureTriangle.SetGeometry(geomTriangle);oLayer.CreateFeature(oFeatureTriangle);//同步到文件中,一定要寫 oLayer.SyncToDisk();}
用Arcgis MapView加載shp文件效果:?
Gdal Java相關Api
?