使用Geotools中的原始方法來操作PostGIS空間數據庫

目錄

前言

一、原生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操作指南。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74656.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

訊飛語音合成(流式版)語音專業版高質量的分析

一、引言 在現代的 Web 應用開發中&#xff0c;語音合成技術為用戶提供了更加便捷和人性化的交互體驗。訊飛語音合成&#xff08;流式版&#xff09;以其高效、穩定的性能&#xff0c;成為了眾多開發者的首選。本文將詳細介紹在 Home.vue 文件中實現訊飛語音合成&#xff08;流…

走進未來的交互世界:下一代HMI設計趨勢解析

在科技日新月異的今天&#xff0c;人機交互界面&#xff08;HMI&#xff09;設計正以前所未有的速度發展&#xff0c;不斷引領著未來的交互世界。從簡單的按鈕和圖標&#xff0c;到如今的智能助手和虛擬現實&#xff0c;HMI設計不僅改變了我們的生活方式&#xff0c;還深刻影響…

洛谷題單3-P1217 [USACO1.5] 回文質數 Prime Palindromes-python-流程圖重構

題目描述 因為 151 151 151 既是一個質數又是一個回文數&#xff08;從左到右和從右到左是看一樣的&#xff09;&#xff0c;所以 151 151 151 是回文質數。 寫一個程序來找出范圍 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000…

學習筆記,DbContext context 對象是保存了所有用戶對象嗎

DbContext 并不會將所有用戶對象保存在內存中&#xff1a; DbContext 是 Entity Framework Core (EF Core) 的數據庫上下文&#xff0c;它是一個數據庫訪問的抽象層它實際上是與數據庫的一個連接會話&#xff0c;而不是數據的內存緩存當您通過 _context.Users 查詢數據時&…

本地命令行啟動服務并連接MySQL8

啟動服務命令 net start mysql8 關閉服務命令 net stop mysql8 本地連接MySQL數據庫mysql -u [用戶名] -p[密碼] 這里&#xff0c;我遇到了個問題 —— 啟動、關閉服務時&#xff0c;顯示 “發生系統錯誤 5。拒絕訪問。 ” 解法1&#xff1a;在 Windows 上以管理員身份打開…

數據蒸餾:Dataset Distillation by Matching Training Trajectories 論文翻譯和理解

一、TL&#xff1b;DR 數據集蒸餾的任務是合成一個較小的數據集&#xff0c;使得在該合成數據集上訓練的模型能夠達到在完整數據集上訓練的模型相同的測試準確率&#xff0c;號稱優于coreset的選擇方法本文中&#xff0c;對于給定的網絡&#xff0c;我們在蒸餾數據上對其進行幾…

【spring cloud Netflix】Ribbon組件

1.基本概念 SpringCloud Ribbon是基于Netflix Ribbon 實現的一套客戶端負載均衡的工具。簡單的說&#xff0c;Ribbon 是 Netflix 發布的開源項目&#xff0c;主要功能是提供客戶端的軟件負載均衡算法&#xff0c;將 Netflix 的中間層服務連接在一 起。Ribbon 的客戶端組件提供…

P1036 [NOIP 2002 普及組] 選數(DFS)

題目描述 已知 n 個整數 x1?,x2?,?,xn?&#xff0c;以及 1 個整數 k&#xff08;k<n&#xff09;。從 n 個整數中任選 k 個整數相加&#xff0c;可分別得到一系列的和。例如當 n4&#xff0c;k3&#xff0c;4 個整數分別為 3,7,12,19 時&#xff0c;可得全部的組合與它…

在響應式網頁的開發中使用固定布局、流式布局、彈性布局哪種更好

一、首先看下固定布局與流體布局的區別 &#xff08;一&#xff09;固定布局 固定布局的網頁有一個固定寬度的容器&#xff0c;內部組件寬度可以是固定像素值或百分比。其容器元素不會移動&#xff0c;無論訪客屏幕分辨率如何&#xff0c;看到的網頁寬度都相同。現代網頁設計…

二分查找與二叉樹中序遍歷——面試算法

目錄 二分查找與分治 循環方式 遞歸方式 元素中有重復的二分查找 基于二分查找的拓展問題 山脈數組的頂峰索引——局部有序 旋轉數字中的最小數字 找缺失數字 優化平方根 中序與搜索樹 二叉搜索樹中搜索特定值 驗證二叉搜索樹 有序數組轉化為二叉搜索樹 尋找兩個…

字符串——面試考察高頻算法題

目錄 轉換成小寫字母 字符串轉化為整數 反轉相關的問題 反轉字符串 k個一組反轉 僅僅反轉字母 反轉字符串里的單詞 驗證回文串 判斷是否互為字符重排 最長公共前綴 字符串壓縮問題 轉換成小寫字母 給你一個字符串 s &#xff0c;將該字符串中的大寫字母轉換成相同的…

現代復古電影海報品牌徽標設計襯線英文字體安裝包 Thick – Retro Vintage Cinematic Font

Thick 是一種大膽的復古字體&#xff0c;專為有影響力的標題和懷舊的視覺效果而設計。其厚實的字體、復古魅力和電影風格使其成為電影海報、產品標簽、活動品牌和編輯設計的理想選擇。無論您是在引導電影的黃金時代&#xff0c;還是在現代布局中注入復古活力&#xff0c;Thick …

[C++面試] new、delete相關面試點

一、入門 1、說說new與malloc的基本用途 int* p1 (int*)malloc(sizeof(int)); // C風格 int* p2 new int(10); // C風格&#xff0c;初始化為10 new 是 C 中的運算符&#xff0c;用于在堆上動態分配內存并調用對象的構造函數&#xff0c;會自動計算所需內存…

Unity URP管線與HDRP管線對比

1. 渲染架構與底層技術 URP 渲染路徑&#xff1a; 前向渲染&#xff08;Forward&#xff09;&#xff1a;默認單Pass前向&#xff0c;支持少量實時光源&#xff08;通常4-8個逐物體&#xff09;。 延遲渲染&#xff08;Deferred&#xff09;&#xff1a;可選但功能簡化&#…

JDK8卸載與安裝教程(超詳細)

JDK8卸載與安裝教程&#xff08;超詳細&#xff09; 最近學習一個項目&#xff0c;需要使用更高級的JDK&#xff0c;這里記錄一下卸載舊版本與安裝新版本JDK的過程。 JDK8卸載 以windows10操作系統為例&#xff0c;使用快捷鍵winR輸入cmd&#xff0c;打開控制臺窗口&#xf…

python爬蟲:DrissionPage實戰教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加強自己的基礎&#xff1a;爬蟲自動化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我們以ChromiumPage為主&#xff0c;寫代碼工具使用Pycharm&#xff08;python環境3.9-3.10&#xff09; …

07-01-自考數據結構(20331)- 排序-內部排序知識點

內部排序算法是數據結構核心內容,主要包括插入類(直接插入、希爾)、交換類(冒泡、快速)、選擇類(簡單選擇、堆)、歸并和基數五大類排序方法。 知識拓撲 知識點介紹 直接插入排序 定義:將每個待排序元素插入到已排序序列的適當位置 算法步驟: 從第二個元素開始遍歷…

Go語言-初學者日記(八):構建、部署與 Docker 化

&#x1f9f1; 一、go build&#xff1a;最基礎的構建方式 Go 的構建工具鏈是出了名的輕量、簡潔&#xff0c;直接用 go build 就能把項目編譯成二進制文件。 ? 構建當前項目 go build -o myapp-o myapp 指定輸出文件名默認會構建當前目錄下的 main.go 或 package main &a…

教程:如何使用 JSON 合并腳本

目錄 1. 介紹 2. 使用方法 3. 注意事項 4. 示例 5.完整代碼 1. 介紹 該腳本用于將多個 COCO 格式的 JSON 標注文件合并為一個 JSON 文件。COCO 格式常用于目標檢測和圖像分割任務&#xff0c;包含以下三個主要部分&#xff1a; "images"&#xff1a;圖像信息&a…

Java學習總結-緩沖流性能分析

測試用例&#xff1a; 分別使用原始的字節流&#xff0c;以及字節緩沖流復制一個很大的視頻。 測試步驟&#xff1a; 在這個分析性能需要一個記錄時間的工具&#xff1a;這個是記錄1970-1-1 00&#xff1a;00&#xff1a;00到現在的總毫秒值。 long start System.currentT…