GIS 數據質檢:驗證 Geometry 有效性

前言

在GIS開發中,數據的幾何有效性直接影響分析結果的準確性。無效的幾何(如自相交、空洞或坐標錯誤)可能導致空間計算失敗或輸出偏差。無論是Shapefile、GeoJSON還是數據庫中的空間數據,幾何質檢都是數據處理中不可忽視的關鍵步驟。

本篇教程在之前文章的基礎上講解如何將使用GeoTools檢驗Shapefile數據幾何圖形的有效性。

開發環境

本文使用如下開發環境,以供參考。

時間:2025年

GeoTools:34-SNAPSHOT

IDE:IDEA2025.1.2

JDK:17

1. 安裝依賴

pom.xml文件中添加gt-shapefilegt-swing兩個依賴。其中gt-shapefile用于shp數據的轉換處理,gt-swing屬于圖形用戶界面工具庫,用于地理空間數據的可視化、交互操作和地圖應用的快速開發。

<dependencies><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-swing</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>${geotools.version}</version></dependency>
</dependencies>
<repositories><repository><id>osgeo</id><name>OSGeo Release Repository</name><url>https://repo.osgeo.org/repository/release/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository><repository><id>osgeo-snapshot</id><name>OSGeo Snapshot Repository</name><url>https://repo.osgeo.org/repository/snapshot/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>false</enabled></releases></repository>
</repositories>

2. 創建工具類

在開發工具中創建驗證GeometryValidateGeometry

main方法中調用顯示地圖方法。

public class ValidateGeometry {// 定義Shp源數據private File sourceFile;// 定義要素源private SimpleFeatureSource featureSource;// 定義地圖組件private MapContent map;public static void main(String[] args) throws Exception {ValidateGeometry validateGeometry = new ValidateGeometry();// 打開地圖顯示Shp文件validateGeometry.displayShapefile();}

定義Shp顯示方法,將其添加到地圖窗口。通過在JMapFrame的工具欄上添加一個按鈕來用于檢要素幾何對象是否有效(例如多邊形邊界是否閉合)。

// 顯示Shp數據
private void displayShapefile() throws Exception{sourceFile = JFileDataStoreChooser.showOpenFile("shp",null);if(sourceFile==null){System.out.println("Shp 文件未知錯誤,請重新選擇!");return;}// 數據倉庫FileDataStore dataStore = FileDataStoreFinder.getDataStore(sourceFile);// 獲取要素數據源featureSource = dataStore.getFeatureSource();// 創建地圖map = new MapContent();Style style = SLD.createSimpleStyle(featureSource.getSchema());Layer layer = new FeatureLayer(featureSource,style);// 添加圖層map.layers().add(layer);// 創建工具條JMapFrame  mapFrame = new JMapFrame(map);mapFrame.enableToolBar(true);mapFrame.enableStatusBar(true);JToolBar toolBar = mapFrame.getToolBar();toolBar.addSeparator();toolBar.add(new JButton(new ValidateGeometryAction()));// 設置地圖窗口大小mapFrame.setSize(800,600);mapFrame.setVisible(true);
}

在上面的代碼中使用JMapFrame創建了一個工具條,使用JButton創建了一個按鈕,并將其添加到工具欄中。這個按鈕的會觸發一個動作ValidateGeometryAction,檢驗幾何對象的有效性。

3. 驗證 Geometry

通過定義一個內部嵌套類ValidateGeometryAction完成幾何對象有效性的檢驗,大部分工作由父類中的輔助方法完成。

// 定義內部嵌套類
class ValidateGeometryAction extends SafeAction {ValidateGeometryAction() {super("ValidateGeometryAction");putValue(Action.SHORT_DESCRIPTION, "check each geometry");}public void action(ActionEvent e) throws Throwable{// 記錄無效 Geometry 數量int numInvalid  = validateFeatureGeometry(null);String msg;if(numInvalid==0){msg = "All feature geometries are valid";}else {msg = "Invalid feature geometries: " + numInvalid;}JOptionPane.showMessageDialog(null,msg,"Geometry Results",JOptionPane.INFORMATION_MESSAGE);}
}

當點擊該檢驗按鈕時,對Shp數據的幾何對象進行驗證,使用JOptionPane彈出框顯示輸出信息。

定義上文中的validateFeatureGeometry方法,用于統計錯誤幾何圖形的數量。此方法檢查與shapefile中的每個要素關聯的幾何對象是否存在常見問題(例如沒有閉合邊界的多邊形)。

private int validateFeatureGeometry(ProgressListener progress) throws Exception{final SimpleFeatureCollection featureCollection = featureSource.getFeatures();// 創建一個 FeatureVisitor 來檢查每個 fatureclass ValidationVisitor implements FeatureVisitor {public int numInvalidGeometries = 0;public void visit(Feature f) {SimpleFeature feature = (SimpleFeature) f;Geometry geometry = (Geometry) feature.getDefaultGeometry();if(geometry != null && !geometry.isValid()){numInvalidGeometries++;System.out.println("Invalid geometry: " + feature.getID());}}}ValidationVisitor validationVisitor = new ValidationVisitor();// 將檢驗器和進度條傳遞給要素集合featureCollection.accepts(validationVisitor,progress);return validationVisitor.numInvalidGeometries;
};

valid geometry

OpenLayers示例數據下載,請回復關鍵字:ol數據

全國信息化工程師-GIS 應用水平考試資料,請回復關鍵字:GIS考試

【GIS之路】 已經接入了智能助手,歡迎關注,歡迎提問。

歡迎訪問我的博客網站-長談GIShttp://shanhaitalk.com

都看到這了,不要忘記點贊、收藏 + 關注

本號不定時更新有關 GIS開發 相關內容,歡迎關注 !

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

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

相關文章

AI大模型學習之基礎數學:高斯分布-AI大模型概率統計的基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

HarmonyOS性能優化——耗時操作減少

耗時操作減少 在應用開發中&#xff0c;避免主線程執行冗余和耗時操作至關重要。這可以降低主線程負載&#xff0c;提升UI響應速度。 避免主線程冗余操作 冗余操作是不必要的、重復執行且對程序功能無實質性貢獻的操作。這些操作浪費計算資源&#xff0c;降低程序運行效率&a…

emscripten 編譯 wasm 版本的 openssl

搭建emscripten環境【參考&#xff1a;https://emscripten.org/docs/getting_started/downloads.html】 下載openssl解壓復制到emsdk目錄 依次執行下列命令&#xff1a; cd emsdk #激活emsdk source ./emsdk_env.shcd opensslemconfigure ./Configure linux-x32 -no-asm -sta…

uniapp 實戰新聞頁面(一)

新聞系統 一、 創建項目 創建個人中心 page.json 配置 tabar "tabBar": {"color":"#666","selectedColor": "#31C27C","list": [{"text": "首頁","pagePath": "pages/inde…

JAVA鎖機制:對象鎖與類鎖

JAVA鎖機制&#xff1a;對象鎖與類鎖 在多線程編程中&#xff0c;合理使用鎖機制是保證數據一致性和線程安全的關鍵。本文將通過示例詳細講解 Java 中的對象鎖和類鎖的原理、用法及區別。 一、未加鎖的并發問題 先看一段未加鎖的代碼&#xff1a; public class Synchronize…

maxcomputer 和 hologres中的EXTERNAL TABLE 和 FOREIGN TABLE

在阿里云的大數據和實時數倉產品中&#xff0c;MaxCompute 和 Hologres 都支持類似于 EXTERNAL TABLE 和 FOREIGN TABLE 的機制&#xff0c;但它們的實現和語義有所不同。 下面分別說明&#xff1a; ?? 一、MaxCompute 中的 EXTERNAL TABLE 和 FOREIGN TABLE 1. EXTERNAL T…

穩定幣:從支付工具到金融基礎設施的技術演進與全球競爭新格局

引言&#xff1a;穩定幣的崛起與金融體系重構 2025年6月&#xff0c;全球穩定幣市值突破2500億美元歷史大關&#xff0c;單年鏈上交易額高達35萬億美元——這一數字已超越Visa和萬事達卡交易總和。這一里程碑事件標志著穩定幣已從加密貨幣市場的邊緣實驗&#xff0c;蛻變為重構…

用 HTML、CSS 和 jQuery 打造多頁輸入框驗證功能

多頁輸入框驗證功能總結:使用 HTML、CSS 和 jQuery 實現 一、多頁表單驗證的核心概念與應用場景 多頁輸入框驗證是指將復雜表單拆分為多個頁面或步驟,逐步引導用戶完成輸入,并在每一步對用戶輸入進行驗證的功能。這種設計具有以下優勢: 提升用戶體驗:避免長表單帶來的心…

DeepSpeed 深度學習學習筆記:高效訓練大型模型

主要參考官網文檔&#xff0c;對于具體內容還需參考官方文檔 1. 引言&#xff1a;為什么需要 DeepSpeed&#xff1f; 大型模型訓練的挑戰 隨著深度學習模型規模的爆炸式增長&#xff08;從 BERT 的幾億參數到 GPT-3 的千億參數&#xff0c;再到現在的萬億參數模型&#xff09…

編程基礎:耦合

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護

基于Qt的UDP主從服務器設計與實現

概述 一個基于Qt框架實現的UDP主從服務器系統&#xff0c;該系統具備自動主機選舉、故障轉移和狀態同步等關鍵功能&#xff0c;適用于分布式能源管理系統中的設備通信與協調。 系統核心功能 1. 自動主機選舉與故障轉移 系統通過優先級機制實現自動主機選舉&#xff0c;當主機…

【51單片機2位數碼管100毫秒的9.9秒表】2022-5-16

緣由 這一題剛設計好要去回復就看到結帖了&#xff0c;好似看到我設計完成就盜竊去了&#xff0c;如此下面類似題目很容易也懶得回復了。 #include "reg52.h" sbit k0P3^0; sbit k1P3^1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111};//0-9 uns…

安裝ClickHouse

安裝ClickHouse ClickHouse是一個用于聯機分析的列式數據庫管理系統&#xff0c;主要用于在線分析處理查詢&#xff08;OLAP&#xff09;&#xff0c;能夠使用SQL查詢實時生成分析數據報告。 ClickHouse是一個完全的列式數據庫管理系統&#xff0c;允許在運行時創建表和數據庫&…

PX4無人機集成自帶的深度相機進行gazebo仿真

修改mavros_posix_sitl.launch文件 修改以下兩行代碼 <arg name"my_model" default"iris_depth_camera"/><arg name"sdf" default"$(find mavlink_sitl_gazebo)/models/$(arg my_model)/$(arg my_model).sdf"/>iris_dept…

正點原子STM32cubeide學習——TFTLCD(MCU 屏)實驗

使用的是正點原子的精英版&#xff0c;單片機是STM32F103ZET6&#xff0c;使用開發板的 MCU 屏接口連接正點原子 TFTLCD 模塊(僅限 MCU 屏模塊)&#xff0c;實現 TFTLCD 模塊的顯示。通過把 LCD 模塊插入底板上的 TFTLCD 模塊接口&#xff0c;按下復位之后&#xff0c; 就可以看…

OpenCV實現二值圖細化(骨架提取)

對二值圖進行細化&#xff08;骨架提取&#xff09;&#xff0c;也就是把每根線條細化到一個像素的寬度。有兩個比較成熟的算法實現此功能&#xff0c;分別是Zhang-Suen算法和Guo-Hall算法。 我們下面使用OpenCVSharp&#xff0c;使用C#實現上述兩個算法&#xff1a; private…

歷史的迷霧與傳承的使命:應對歷史篡改,守護中華文明

在歷史的浩瀚長河中&#xff0c;中國以悠久的文明與燦爛的文化屹立于世界東方。然而&#xff0c;滿清時期與西方勢力出于各自目的對中國歷史進行篡改&#xff0c;在真實歷史的畫卷上蒙上了層層迷霧。深入探究其背后的動機&#xff0c;思考當代人守護歷史文化的使命&#xff0c;…

【Qt】QTableWidget表格右鍵菜單

效果 1. 給QTableWidget組件添加customContextMenuRequested信號 2. 槽函數 void dataDetailForm::on_tableWidget_customContextMenuRequested(const QPoint &pos) {QMenu menu;QAction *setEnd menu.addAction(tr("設置"));connect(setEnd, SIGNAL(triggered…

MySQL 數據處理函數全面詳解

MySQL 數據處理函數全面詳解 MySQL 中的數據處理函數,包含字符串、數值、日期、條件判斷等核心函數: 一、字符串處理函數 1. 基礎操作函數 函數描述示例結果CONCAT()字符串連接CONCAT(My,SQL)‘MySQL’CONCAT_WS()帶分隔符連接CONCAT_WS(-,2023,08,15)‘2023-08-15’LENGTH…

領域驅動設計(DDD)【1】之初步理解

文章目錄 一 DDD概述二 從“沉寂”到“爆火”&#xff1a;DDD的興起背景與原因2.1 DDD早期沉寂的原因2.2 DDD近年爆火的原因2.3 總結 三 DDD深入理解3.1 方法論本質3.2 系統化價值3.3 思想內核3.4 實踐轉化3.5 總結 四 傳統面向對象方法學和DDD4.1 傳統面向對象方法學的問題4.2…