目錄
前言
一、原生PostGIS連接介紹
1、連接參數說明
2、創建DataStore
二、工程實戰
1、Maven Pom.xml定義
2、空間數據庫表
3、讀取空間表的數據
三、總結
前言
????????在當今數字化與信息化飛速發展的時代,空間數據的處理與分析已成為眾多領域不可或缺的一環。從城市規劃到環境監測,從物流配送到災害預警,空間數據的應用場景無處不在。PostGIS 作為一款功能強大的開源空間數據庫擴展,為存儲、管理和分析地理空間數據提供了堅實的基礎設施。而 Geotools 作為 Java 領域中廣泛使用的地理信息工具庫,為開發者搭建了一座連接空間數據與應用程序的橋梁。本文將深入探討如何使用 Geotools 中的原始方法來操作 PostGIS 空間數據庫,旨在為地理信息開發者提供一套系統、全面且實用的技術指南。
????????隨著地理信息系統(GIS)技術的普及,越來越多的行業開始依賴空間數據來驅動決策。PostGIS 以其對 OpenGIS 標準的全面支持和強大的空間數據處理能力,成為了許多 GIS 應用的首選數據庫。它不僅能夠存儲復雜的幾何和地理數據類型,還能執行高效的空間查詢與分析操作。然而,要充分發揮 PostGIS 的潛力,開發者需要一種高效、靈活且易于集成的工具來與之交互。Geotools 正是這樣一款工具,它提供了豐富的 API 和功能模塊,使得開發者能夠以面向對象的方式操作空間數據。
????????在Geotools的官方方法中提供了直接調用 PostGIS 的底層功能。通過Geotools 提供的原始方法接口,允許開發者深入到 PostGIS 的核心操作層面。通過這些方法,開發者可以精確地控制數據的讀取、寫入、查詢和更新過程,從而實現高度定制化的空間數據處理流程。例如在復雜的空間分析任務中,原始方法可以更靈活地組合多種空間操作。
????????掌握 Geotools 中的原始方法來操作 PostGIS,不僅能夠提升開發效率,還能拓展應用程序的功能邊界。對于地理信息開發者而言,這是一種不可或缺的技能。本文將從 PostGIS 和 Geotools 的基礎概念入手,逐步深入到原始方法的具體實現與應用案例。通過詳細的代碼示例和操作流程,讀者將能夠全面了解如何利用 Geotools 與 PostGIS 進行高效的空間數據交互,為構建復雜的空間數據應用奠定堅實的基礎。無論是在科研項目中探索空間數據的深度分析,還是在商業應用中實現地理信息的高效管理,本文所提供的技術方法都將具有重要的參考價值。
一、原生PostGIS連接介紹
????????為了方便第一次查閱本文的朋友對Geotools中對PostGIS進行原生處理進行介紹。首先還是對原生PostGIS的連接進行介紹,首先對連接參數進行說明,其次提供一個根據連接參數創建愛DataStore的示例,讓大家對數據的處理有所了解。
1、連接參數說明
????????Geotools中直連PostGIS的連接參數如下:
參數 | 描述 |
---|---|
dbtype | 必須是字符串?postgis |
host | 要連接的機器名或 IP 地址 |
port | 要連接的端口號,默認為 5432 |
schema | 要訪問的數據庫模式 |
database | 要連接的數據庫 |
user | 用戶名 |
passwd | 密碼 |
preparedStatements | 使用預編譯語句 |
encode functions | 編碼函數 |
????????除了上面的標準配置參數意外,Geotools還提供了其它的高級參數,參數列表如下:
參數 | 描述 |
---|---|
loose bbox | 控制寬松?bbox ?比較的標志,默認為 true |
preparedStatements | 控制是否使用預編譯語句,默認為 false |
encode functions | 控制是否可以將一些常見函數編碼為它們的 SQL 等價物 |
????????默認情況下,JsonArrayContains 函數將委托給 @>
操作符。但對于 PostgreSQL 版本 >= 12,它將委托給 jsonPathExists 函數。jsonPathExists 能夠在根級別數組中搜索值。大家可以根據自己的需要來添加這些參數到參數Map中,
params.put(PostgisNGDataStoreFactory.LOOSEBBOX, true );
params.put(PostgisNGDataStoreFactory.PREPARED_STATEMENTS, true );
2、創建DataStore
????????上面介紹了使用原生的方式來操作PostGIS的連接參數信息,在掌握了以上信息之后,我們基于上面的連接參數來返回DataStore,并以此來獲取空間庫中的物理表信息的讀取方法。創建DataStore的方法代碼如下所示:
Map<String, Object> params = new HashMap<>();
params.put("dbtype", "postgis");
params.put("host", "localhost");
params.put("port", 5432);
params.put("schema", "public");
params.put("database", "database");
params.put("user", "postgres");
params.put("passwd", "postgres");
params.put("preparedStatements", true);
params.put("encode functions", true);
DataStore dataStore = DataStoreFinder.getDataStore(params);
二、工程實戰
????????本節將重點介紹如何在工程實戰中來進行讀取一個PostGIS的空間表,通過空間表的屬性字段來進行過濾,返回我們預期的空間數據,通過這個例子大家可以掌握如何使用Geotools對PostGIS的原生操作方法。本節將從以下三個方面進行講解,第一個方面是介紹需要引入的Maven資源庫,其次是介紹一下相關的空間數據庫表信息,最后提供一個實戰源碼,可以真實讀取空間表的數據信息,包括屬性信息和空間矢量信息。
1、Maven Pom.xml定義
????????要想在項目工程中使用原生的方式以來操作PostGIS數據庫,首先需要創建數據庫的連接,與傳統的數據庫連接創建方式不一樣,在Geotools中需要使用一個Map對象來緩存相關的連接,因此,需要引入的Pom.xml定義如下:
<dependency><groupId>org.geotools.jdbc</groupId><artifactId>gt-jdbc-postgis</artifactId><version>${geotools.version}</version>
</dependency>
????????博客中使用的版本是:28.2。大家可以根據自己的實際情況進行選擇對應的版本。?
2、空間數據庫表
????????作為示例,我們在一個數據庫名稱為:earthqadmin_dev,有一張省級行政區的空間表,表名叫做:biz_province。我們就以讀取這張表的數據為例,講述如何創建DataStore對象。空間表的數據如下:
? ? ? ? 在java中連接PostGIS的參數代碼如下:
/**
* -準備postGIS連接參數
* @return
*/
public static Map<String, Object> initPostGISMap () {Map<String, Object> params = new HashMap<>();params.put("dbtype", "postgis");params.put("host", "127.0.0.1");params.put("port", 5432);params.put("database", "earthqadmin_dev");params.put("schema", "public");params.put("user", "xxx");params.put("passwd", "xxx");return params;
}
????????接下來就是從上面的map中獲取DataStore對象,方法如下:
// step2、獲取數據源
DataStore dataStore = DataStoreFinder.getDataStore(params);
?????????我們先來看一下,通過datastore可以獲取哪些信息,查找所有使用服務機制注冊的 DataStoreFactory 實現,并且這些實現的相應庫在類路徑上。所有已發現的數據存儲,這些數據存儲已注冊工廠,并且其 available 方法返回 true。 方法如下:
/*** Finds all implemtaions of DataStoreFactory which have registered using the services* mechanism, and that have the appropriate libraries on the classpath.** @return An iterator over all discovered datastores which have registered factories, and whose* available method returns true.*/public static synchronized Iterator<DataStoreFactorySpi> getAvailableDataStores() {FactoryRegistry serviceRegistry = getServiceRegistry();Set<DataStoreFactorySpi> availableDS =DataAccessFinder.getAvailableDataStores(serviceRegistry, DataStoreFactorySpi.class);return availableDS.iterator();
}
????????可以在控制臺看一下可用的實現信息:
ESRI(tm) Shapefiles (*.shp)
PostGIS Database (JNDI)
Takes a directory of shapefiles and exposes it as a data store
PostGIS Database
????????到這里我們就成功的創建了DataStore對象,為接下來的空間數據讀取打下了堅實的基礎。
3、讀取空間表的數據
????????本小節將詳細的講述如何使用Geotools來進行空間屬性的過濾,以及在控制臺中輸出我們的目標數據,關于如何使用Geotools來進行空間屬性的過濾,方法多。這里介紹一種CQL的查詢語言。這里的查詢場景為,假設需要查詢所有省份類型是“直轄市”的省份,可以實現的方法如下:
// step3、指定空間表名
String typeName = "biz_province";
//step4、 創建查詢
Query query = new Query(typeName);
FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(typeName);
//step5、使用CQL(Common Query Language)表達式來定義過濾條件
Filter filter = CQL.toFilter(" type = '直轄市'");
query.setFilter(filter);
????????最后執行查詢和打印相關的屬性信息及空間字段信息,關鍵代碼如下:
// step6、執行查詢
FeatureIterator<SimpleFeature> features = featureSource.getFeatures(query).features();
CoordinateReferenceSystem crs = featureSource.getSchema().getCoordinateReferenceSystem();
System.out.println(crs);
System.out.println("**********************************************************");
while (features.hasNext()) {SimpleFeature feature = features.next();System.out.println("Feature: " + feature.getID());System.out.println("Geometry: " + feature.getDefaultGeometry());System.out.println("Attributes: " + feature.getAttributes());
}
features.close();
dataStore.dispose();
?????????一定記得打印完成后需要手動釋放資源,以免造成不必要的損害。在IDE中運行以上的代碼之后可以在控制臺中看到如下輸出:
????????可以直觀的發現,通過原生的PostGIS支持我們實現了對空間數據庫中相關表的讀取和展示。?
三、總結
????????以上就是本文的主要內容,本文將深入探討如何使用 Geotools 中的原始方法來操作 PostGIS 空間數據庫,旨在為地理信息開發者提供一套系統、全面且實用的技術指南。通過Geotools 提供的原始方法接口,允許開發者深入到 PostGIS 的核心操作層面。通過這些方法,開發者可以精確地控制數據的讀取、寫入、查詢和更新過程,從而實現高度定制化的空間數據處理流程。例如在復雜的空間分析任務中,原始方法可以更靈活地組合多種空間操作。行文倉促,難免有許多不足之處,如有不足,在此懇請各位專家博主在評論區不吝留言指出,不勝感激。
????????參考資料:
????????1、PostGIS操作指南。