GDAL操作PostgreSQL(Java)
阿新 • • 發佈:2018-12-11
GDAL操作PostgreSQL
1:GDAL預設是不支援PostgreSQL驅動的,需要我們自己重新編譯,具體可以參考
2:將PostgreSQL中的資料匯出到shp檔案:
public static void pg2shp(){ ogr.RegisterAll(); gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); gdal.SetConfigOption("SHAPE_ENCODING","CP936"); //獲取pg驅動 String pgDriverName = "PostgreSQL"; org.gdal.ogr.Driver pgDriver = ogr.GetDriverByName(pgDriverName); if(pgDriver == null){ System.out.println("不支援" + pgDriverName + "驅動"); return; } //GDAL連線PostGIS String path = "PG:dbname=test host=localhost port=5432 user=postgres password=postgres"; DataSource pgDataSource = pgDriver.Open(path, 0); if(pgDataSource == null){ System.out.println("GDAL連線PostGIS資料庫失敗!"); return; } String strSQL = "SELECT * from province WHERE area='測試'"; //獲取圖層 Layer pgLayer = pgDataSource.ExecuteSQL(strSQL); //Layer pgLayer = pgDataSource.GetLayerByName("123"); if (pgLayer == null) { System.out.println("獲取【" + "province" + "】圖層失敗!"); return; } System.out.println(pgLayer.GetFIDColumn()); //建立向量檔案 String strVectorFile ="D:\\pg2shp.shp"; //驅動 String shpDriverName = "ESRI Shapefile"; org.gdal.ogr.Driver shpDriver =ogr.GetDriverByName(shpDriverName); if (shpDriver == null) { System.out.println(shpDriverName+ " 驅動不可用!\n"); return; } //資料來源 DataSource shpDataSource = shpDriver.CreateDataSource(strVectorFile,null); if (shpDataSource == null) { System.out.println("建立向量檔案【"+ strVectorFile +"】失敗!\n" ); return; } //圖層 Layer shpLayer =shpDataSource.CreateLayer("", pgLayer.GetSpatialRef(), pgLayer.GetGeomType()); if (shpLayer == null) { System.out.println("圖層建立失敗!\n"); return; } //欄位 FeatureDefn pgDefn =pgLayer.GetLayerDefn(); int iFieldCount =pgDefn.GetFieldCount(); for (int i = 0; i <iFieldCount; i++) { FieldDefn oField =pgDefn.GetFieldDefn(i); shpLayer.CreateField(oField, 1); } //資料記錄 Feature oFeature = null; while ((oFeature = pgLayer.GetNextFeature()) != null) { System.out.println(oFeature.GetFID()); shpLayer.CreateFeature(oFeature); } //寫入檔案 shpLayer.SyncToDisk(); shpDataSource.SyncToDisk(); //刪除資料來源 pgDataSource.delete(); shpDataSource.delete(); gdal.GDALDestroyDriverManager(); System.out.println("shp檔案建立成功!"); }
3:將shp中的資料匯出到PostgreSQL中(FID會衝突,需要自己解決):
public static void shp2pg(){ ogr.RegisterAll(); gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); gdal.SetConfigOption("SHAPE_ENCODING","CP936"); String shpDriverName = "ESRI Shapefile"; org.gdal.ogr.Driver shpDriver =ogr.GetDriverByName(shpDriverName); if (shpDriver == null) { System.out.println(shpDriverName+ " 驅動不可用!\n"); return; } String strVectorFile ="D:\\pg2shp.shp"; DataSource shpDataSource = ogr.Open(strVectorFile,0); if (shpDataSource == null) { System.out.println("開啟檔案【"+ strVectorFile + "】失敗!" ); return; } Layer shpLayer = shpDataSource.GetLayerByIndex(0); if (shpLayer == null) { System.out.println("獲取shp圖層失敗!\n"); return; } System.out.println(shpLayer.GetFIDColumn()); //獲取pg驅動 String pgDriverName = "PostgreSQL"; org.gdal.ogr.Driver pgDriver = ogr.GetDriverByName(pgDriverName); if(pgDriver == null){ System.out.println("不支援" + pgDriverName + "驅動"); return; } //GDAL連線PostGIS String path = "PG:dbname=test host=localhost port=5432 user=postgres password=postgres"; DataSource pgDataSource = pgDriver.Open(path, 1); if(pgDataSource == null){ System.out.println("GDAL連線PostGIS資料庫失敗!"); return; } //獲取圖層 Layer pgLayer = pgDataSource.GetLayerByName("tablename"); if (pgLayer == null) { System.out.println("獲取【" + "tablename" + "】圖層失敗!"); return; } Feature oFeature = null; while ((oFeature = shpLayer.GetNextFeature()) != null) { oFeature.SetFID(100 + oFeature.GetFID()); System.out.println(oFeature.GetFID()); pgLayer.CreateFeature(oFeature); } //寫入檔案 pgLayer.SyncToDisk(); pgDataSource.SyncToDisk(); //刪除資料來源 pgDataSource.delete(); shpDataSource.delete(); gdal.GDALDestroyDriverManager(); System.out.println("shp檔案匯入成功!"); }