1. 程式人生 > >Gdal訪問Postgresql中的向量資料

Gdal訪問Postgresql中的向量資料

前言

        Gdal功能非常強大,不僅可以訪問shp、tif等儲存在本地的空間資料,還支援訪問儲存在空間資料庫中的空間資料。通過Gdal訪問儲存在Postgresql中的向量資料和柵格資料略有差別,本文暫不介紹如何訪問柵格資料,只介紹如何訪問向量資料。OK,下面我們來具體看下如何用Gdal訪問儲存在Postgresql中的向量資料。

1、編譯Gdal支援Postgresql驅動

        預設編譯的Gdal是不支援Postgresql驅動的,要通過Gdal訪問儲存在Postgresql中的向量資料,必須重新編譯Gdal使其支援Postgresql驅動,如果不知道該如何做,可檢視

這裡

2、訪問Postgresql中的向量資料

        本文先將一個名為test1的shp檔案匯入到postgresql中,然後利用Gdal訪問Postgresql,讀取了該資料的欄位資訊以及第一條記錄的所有屬性值,並進行了輸出,具體程式碼如下:

import org.gdal.gdal.gdal;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.Feature;
import org.gdal.ogr.FeatureDefn;
import org.gdal.ogr.FieldDefn;
import org.gdal.ogr.Geometry;
import org.gdal.ogr.Layer;
import org.gdal.ogr.ogr;

public class HelloGDAL {
	public static void readVectorSpacial(){
 	    DataSource dataSource = null;
 	    try{
 		ogr.RegisterAll();
 		gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); 
 		gdal.SetConfigOption("SHAPE_ENCODING","CP936");

 		String driverName = "PostgreSQL";
 		org.gdal.ogr.Driver driver = ogr.GetDriverByName(driverName);
 		String path = "PG:dbname=Test host=localhost port=5432 user=postgres password=postgres";
 		dataSource = driver.Open(path, 0);
 		Layer vectorLayer = dataSource.GetLayerByName("test1");

 	        FeatureDefn oDefn =vectorLayer.GetLayerDefn();
 	        int fieldCount =oDefn.GetFieldCount();
 	        System.out.println(fieldCount);
 	        for (int i = 0; i < fieldCount; i++)
 		{
 		    FieldDefn oField =oDefn.GetFieldDefn(i);
 		    System.out.println(oField.GetNameRef()+ ": " 
                        + oField.GetFieldTypeName(oField.GetFieldType()) 
                        + "(" + oField.GetWidth()+"."+ oField.GetPrecision() + ")");
 		}
 		Feature oFeature = null;
 		while ((oFeature = vectorLayer.GetNextFeature()) != null)
 		{
 		    for (int i = 0; i< fieldCount; i++)
 		    {
 		        FieldDefn oFieldDefn= oDefn.GetFieldDefn(i);
 		        int type =oFieldDefn.GetFieldType();
 		        switch (type)
 		        {
 		            case ogr.OFTString:
 		            	System.out.println(oFeature.GetFieldAsString(i)+ "\t");
 		                break;
 		            case ogr.OFTReal:
 		                System.out.println(oFeature.GetFieldAsDouble(i)+ "\t");
 		                break;
 		            case ogr.OFTInteger:
 		                System.out.println(oFeature.GetFieldAsInteger(i)+ "\t");
 		                break;
 		            default:
 		                System.out.println(oFeature.GetFieldAsString(i)+ "\t");
 		                break;
 		        }
 		    }
 		    Geometry oGeometry =oFeature.GetGeometryRef();
 		    String geomWKT = oGeometry.ExportToWkt();	        
 		    System.out.println(geomWKT);
 		    // 演示,只輸出一個要素資訊
 		    break;
 		}
            }catch(Exception e){
		e.printStackTrace();
	    }finally{
		if(dataSource != null){
		    dataSource.delete();
		}
		gdal.GDALDestroyDriverManager();
	    }
        }
	public static void main(String[] args) {
		readVectorSpacial();
	}
}

3、輸出結果

參考文獻

https://blog.csdn.net/n_sev7/article/details/46986059

https://www.gdal.org/drv_pg.html