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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…