1. 程式人生 > >GDAL操作PostgreSQL(Java)

GDAL操作PostgreSQL(Java)

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檔案匯入成功!");
	}