Gdal訪問Postgresql中的向量資料
阿新 • • 發佈:2018-11-19
前言
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(); } }