使用Geotools读取DEM地形数据实战-以湖南省30米数据为例

目录

前言

一、DEM地形数据介绍

1、DEM数据简介

2、DEM应用领域

3、QGIS中读取DEM数据

二、GeoTools解析地形

1、Maven中依赖引用

2、获取数据基本信息

三、总结


前言

        随着全球数字化进程的加速,各类地理空间数据呈爆炸式增长,DEM 数据作为其中的核心组成部分,其数据量也在不断攀升。从卫星遥感获取的全球范围 DEM 数据,到针对特定区域高精度测绘所产生的 DEM 数据,这些海量的数据蕴含着丰富的地形信息等待我们去挖掘和利用。然而,如何高效、准确地读取这些 DEM 数据,将其转化为可进行进一步分析和可视化的形式,成为了 GIS 开发者和研究人员面临的一项重要任务。

       在地理信息系统(GIS)领域,数字高程模型(DEM)数据承载着关于地球表面地形起伏的关键信息,对于地形分析、水文模拟、城市规划以及众多与空间地理相关的研究和应用都有着不可替代的重要作用。而 Geotools 作为一个强大的、开源的 Java GIS 工具库,为开发者们提供了便捷且高效的操作地理空间数据的方式,其中就包括对 DEM 地形数据的读取与处理。Geotools 凭借其丰富的功能模块和良好的社区支持,在 GIS 开发领域备受青睐。它提供了对多种地理数据格式的读写支持,包括常见的 DEM 格式,如 GeoTIFF 等。通过使用 Geotools,开发者能够以简洁的代码实现对 DEM 数据的访问,无需深入了解底层复杂的数据存储结构和读取机制,大大降低了开发难度和时间成本。在实战过程中,我们将深入了解 Geotools 中与 DEM 数据读取相关的类和方法,例如如何利用 CoverageReader 来读取 DEM 数据文件,如何获取 DEM 数据的地理参考信息、高程值等关键数据内容,以及如何对读取到的数据进行初步的处理和转换,为后续的地形分析应用做好准备。

        本文将开启一场使用 Geotools 读取 DEM 地形数据的实战之旅,深入探索这一过程中的技术要点、实践技巧以及可能遇到的挑战与解决方案。这场实战之旅不仅是一次技术的探索,更是一次对 GIS 数据处理流程的深刻理解过程,掌握使用 Geotools 读取 DEM 地形数据的技能具有重要的现实意义。无论是在科研领域,为环境变化研究、自然灾害预测等提供数据支持;还是在商业领域,助力城市规划、工程建设、资源勘探等项目的顺利开展,这一技能都将成为我们手中有力的工具。让我们一同踏上这场使用 Geotools 读取 DEM 地形数据的实战征程,开启地理空间数据处理的精彩篇章。

一、DEM地形数据介绍

        本节将对DEM地形数据进行简单介绍,主要介绍Dem数据的概念,结构以及使用QGIS来读取DEM数据的基本信息。

1、DEM数据简介

        数字高程模型(DEM)是地球表面地形地貌的数字化表达方式,它以数值形式精确地记录了地表每个点的高程信息,在地理信息系统(GIS)、测绘、水利、交通、环境科学等诸多领域都有着极为广泛且关键的应用。

        数据结构与形式:DEM 数据主要有规则格网和不规则三角网(TIN)两种常见结构。规则格网 DEM 将地表划分为大小相等的正方形网格,每个网格单元对应一个高程值,这种结构简单、易于处理和可视化,适用于大面积、相对平坦或规则地形的表示;而不规则三角网 DEM 则是根据地形特征点(如山脊线、山谷线、陡坡等处的点)通过构建三角形来逼近地表形态,它能更灵活、精确地描述复杂地形,尤其在地形变化剧烈的区域,如山区、峡谷等地,能有效减少数据冗余,提高数据精度。获取 DEM 数据的途径多样。航空摄影测量是一种传统且有效的方法,通过在飞机上搭载航空相机对地面进行拍摄,利用立体像对和摄影测量原理,解算出地面点的三维坐标,进而生成 DEM 数据。卫星遥感也是重要的数据来源,如今高分辨率卫星影像层出不穷,通过对卫星影像进行几何校正、辐射校正以及立体匹配等处理,可快速获取大面积的 DEM 数据,像 SRTM( Shuttle Radar Topography Mission)数据就是利用卫星雷达技术获取的全球范围高精度 DEM 数据,在全球地形研究中广泛应用。

2、DEM应用领域

        在 GIS 领域,DEM 数据是进行地形分析的基础,如计算坡度、坡向、地形起伏度等基本地形因子,这些地形因子在土地利用规划、生态环境评估、自然灾害预测等方面有着重要应用。在水利水电工程中,DEM 数据用于水库淹没分析、流域水文模拟、河道演变研究等,为水利工程设计和水资源管理提供关键依据。在交通规划方面,DEM 数据可辅助进行道路选线、桥梁隧道选址等,通过分析地形对交通线路建设的影响,优化交通网络布局,降低工程建设成本和风险。在环境科学中,DEM 数据有助于研究地形对气候、植被分布、土壤侵蚀等环境要素的影响,为生态环境保护和修复提供科学支撑。总之,DEM 数据作为一种重要的空间信息数据,在现代社会的众多领域发挥着不可或缺的作用,随着技术的不断进步,其应用范围和深度还将不断拓展。

3、QGIS中读取DEM数据

        本小节将重点介绍如何使用QGIS来展示DEM数据以及查看DEM数据的基本信息,比如空间参考,高度和宽度,波段信息。实例使用的DEM数据来源于互联网。本次使用的DEM数据为湖南省30米精度地形数据。使用QGIS打开下载好的DEM数据,加载后如下所示:

        第二步,为了让地形有一些变化,我们设置DEM的样式,右键属性,点击符号化。在下面的界面中调整,如下所示:

        这里的渲染类型,我们使用山体阴影模式。 同时勾选色相,就是加上色彩信息,色彩浓度设置在100%。其它的参数保持不变,接下来点击“apply”将当前样式进行应用。经过我们的样式美化后的效果如下:

        可以局部放大地形数据后,可以看到如下的效果,这种效果看起来就已经开始有山体的棱角等信息了。

        使用信息查看工具来进行数据识别,可以看到当前坐标点的坐标和波段信息值,如下图所示:

        到此,使用QGIS来查看Dem地形数据就已经完成,接下来看一下在Qgis中查看基本的数据信息。依然在属性窗口中,点击“信息” tab页,可以看到以下信息:

序号参数名
1名称    湖南省_DEM_30m分辨率_NASA数据
2路径C:\BaiduDownload\湖南省_DEM_30m分辨率_NASA数据.tif
3坐标参照系(CRS)EPSG:4326 - WGS 84 - 地理的
4范围108.7862500000000097,24.6429166666666717 : 114.2570833333333411,30.1290277777777753
5单位
6宽度19695
7高度19750
8数据类型Int16 - 16位有符号整型
9GDAL驱动GeoTIFF
10波段1STATISTICS_MAXIMUM=2095
STATISTICS_MEAN=355.64031618431
STATISTICS_MINIMUM=-35
STATISTICS_STDDEV=297.91063586873
STATISTICS_VALID_PERCENT=64.56
11维度横坐标:19695 纵坐标:19750 波段:1
12起点108.786,30.129
13像素大小0.0002777777777777773439,-0.0002777777777777773439

        以上就是使用QGIS来读取的一些关于DEM的基本信息。下一节我们将使用GeoTools组件来进行相应参数的获取。

二、GeoTools解析地形

        本节将使用重点介绍如何使用GeoTools来对DEM数据进行解析。包括在Maven中定义相关的依赖。以及如何使用GeoTools获取数据的基本信息两个方面来进行说明。

1、Maven中依赖引用

本文使用的Dem数据是tif格式的,在Geotools中要想实现tif格式的数据解析,首先要在Maven配置中引入相应的依赖,这里直接给出pom.xml的关键性信息:

<!-- 增加geotools 引用 begin -->
	<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-main</artifactId>
		<version>${geotools.version}</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.geotools.xsd/gt-xsd-sld -->
	<dependency>
		<groupId>org.geotools.xsd</groupId>
		<artifactId>gt-xsd-sld</artifactId>
		<version>${geotools.version}</version>
    </dependency>
	<!-- https://mvnrepository.com/artifact/org.geotools.xsd/gt-xsd-core -->
	<dependency>
		<groupId>org.geotools.xsd</groupId>
		<artifactId>gt-xsd-core</artifactId>
		<version>${geotools.version}</version>
    </dependency>
	<!-- https://mvnrepository.com/artifact/org.geotools/gt-xml -->
	<dependency>
		<groupId>org.geotools</groupId>
	    <artifactId>gt-xml</artifactId>
		<version>${geotools.version}</version>
	</dependency>
	<!--  增加epsg支持 -->
	<dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-hsql</artifactId>
        <version>${geotools.version}</version>
    </dependency> 
    <!--  增加geojson支持 -->
	<dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-geojson</artifactId>
        <version>${geotools.version}</version>
    </dependency> 
    <!--  增加gt-geotiff支持 -->
    <dependency>
		 <groupId>org.geotools</groupId>
		 <artifactId>gt-geotiff</artifactId>
		 <version>${geotools.version}</version>
	</dependency>
	<dependency>
		 <groupId>org.geotools</groupId>
		 <artifactId>gt-process-raster</artifactId>
		 <version>${geotools.version}</version>
	</dependency>
	<dependency>
		 <groupId>org.geotools</groupId>
		 <artifactId>gt-process</artifactId>
		 <version>${geotools.version}</version>
	</dependency>
	<dependency>
		 <groupId>org.geotools</groupId>
		 <artifactId>gt-coverage</artifactId>
		 <version>${geotools.version}</version>
	</dependency>
	<dependency>
		 <groupId>org.geotools</groupId>
		 <artifactId>gt-swing</artifactId>
		 <version>${geotools.version}</version>
	</dependency>
<!-- 增加geotools 引用 end -->

        请注意,本文使用的jdk版本是jdk1.8,对应的Geotools的版本是28.2。如果您的相关环境是更高的版本,可以根据不同的版本选择适配的geotools。 

2、获取数据基本信息

        要想获取Dem数据的基本信息,首先需要来读取dem数据,在geotools中,读取dem的类是GeoTiffReader,使用GeoTiffReader将tif读取之后,转成GridCoverage2D,然后从GridCoverage2D对象就能获取我们需要的基本信息。关键代码如下:

@Test
public void ReadHunanDem() {
	try {
        // DEM 文件路径
        File demFile = new File("C:/BaiduDownload/湖南省_DEM_30m分辨率_NASA数据.tif");
        // 创建 GeoTiffReader
        GeoTiffReader reader = new GeoTiffReader(demFile);
        // 读取 GridCoverage2D
        GridCoverage2D coverage = reader.read(null);
        printMetadata(coverage);
        // 关闭 reader
        reader.dispose();
     } catch (IOException | MismatchedDimensionException e) {
        e.printStackTrace();
     } catch (FactoryException e) {
		e.printStackTrace();
	 } catch (TransformException e) {
		e.printStackTrace();
	}
}

        接下来看一下如何获取基本数据信息,代码如下:

private static void printMetadata(GridCoverage2D coverage) throws FactoryException, TransformException {
        // 获取坐标参考系统
        CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem2D();
        System.out.println("Coordinate Reference System: " + crs.getName().toString());

        // 获取数据范围
        Envelope2D envelope = coverage.getEnvelope2D();
        System.out.println("Envelope: " + envelope);

        // 获取影像宽度和高度
        int width = coverage.getRenderedImage().getWidth();
        int height = coverage.getRenderedImage().getHeight();
        System.out.println("Width: " + width + ", Height: " + height);

        // 获取数据类型
        int dataType = coverage.getRenderedImage().getSampleModel().getDataType();
        System.out.println("Data Type: " + dataType);
        
        GridGeometry2D gridGeometry = coverage.getGridGeometry();
        System.out.println(gridGeometry);

        // 获取图斑名称
        //String[] names = coverage.getGridGeometry().getGridSetName();
        //System.out.println("Grid Set Name: " + names[0]);

        // 获取样本维度名称
        int numSampleDimensions = coverage.getNumSampleDimensions();
        String[] sampleDimensionNames = new String[numSampleDimensions];
        for (int i = 0; i < numSampleDimensions; i++) {
            sampleDimensionNames[i] = coverage.getSampleDimension(i).getDescription().toString();
        }
        System.out.println("Sample Dimension Names: " + String.join(", ", sampleDimensionNames));
    }

        最后来看一下最终的输出结果,可以读取的信息如下:

        当然这里仅表示geotools可以用来进行数据的读取,没有读取所有的数据,基本可以看包括外包框和空间参考以及宽度和高度的基本信息都时可以通过geotools来进行获取的。 跟着本教程,您也可以实现对DEM数据的读取,为下一步的应用做进一步的分析使用。

三、总结

        以上就是本文的主要内容,本文将开启一场使用 Geotools 读取 DEM 地形数据的实战之旅,深入探索这一过程中的技术要点、实践技巧以及可能遇到的挑战与解决方案。这场实战之旅不仅是一次技术的探索,更是一次对 GIS 数据处理流程的深刻理解过程,掌握使用 Geotools 读取 DEM 地形数据的技能具有重要的现实意义。无论是在科研领域,为环境变化研究、自然灾害预测等提供数据支持;还是在商业领域,助力城市规划、工程建设、资源勘探等项目的顺利开展,这一技能都将成为我们手中有力的工具。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

登录-01.基础登录功能

一.需求分析 当前的页面不需要登录就可以进入&#xff0c;十分不安全&#xff0c;因此要设置登录功能来维护系统的安全性。登录时要根据输入的用户名和密码进行登录校验&#xff0c;如果在数据库中没有找到匹配的用户名和密码的话&#xff0c;那么就无法登录。 因此要先根据用…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

京东杀入外卖界,这波操作到底香不香?

京东杀入外卖界&#xff0c;这波操作到底香不香&#xff1f; 最近外卖圈炸了&#xff01;京东这个电商巨头&#xff0c;居然一声不吭地搞起了外卖&#xff01;一出手就是0佣金&#xff0c;品质堂食 两大杀招&#xff0c;直接把美团、饿了么整懵了。今天咱们就来唠唠&#xff0…

PTH 哈希传递攻击

参考文章&#xff1a;内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云 哈希传递攻击(Pass-the-Hash,PtH)_c 实现 pass the hash功能-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xf…

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现&#xff0c; - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…

ECMAScript6------数组扩展

ECMAScript6------数组扩展 1.扩展运算符1.1 含义1.2 应用(1)复制数组(浅拷贝)(2)合并数组(3)与解构赋值结合(4)字符串(5)实现了Iterator接口的对象(6)Map和Set结构,Generator 函数 2.Array.from和Array.of(1)Array.from(2)Array.of 3.新增的实例方法(1)copyWithin()(2)find(回…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体&#xff0c;企业内部知识库通过结构化的信息聚合与动态化的知识流动&#xff0c;为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心&#xff0c;依托数据加密技术构建多层级访问控制机制&#xff0c;确保敏感信…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网&#xff1a;www.amtme.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月21-23日 大会地点&#xff1a;中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

后端Java Stream数据流的使用=>代替for循环

API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

Java中的常用类 --String

学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型&#xff0c;也就是说String类中已经提前定义好了很多方法都是用来处理字符串的&#xff0c;所以Str…

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…

QT事件循环

文章目录 主事件循环事件循环事件调度器事件处理投递事件发送事件 事件循环的嵌套线程的事件循环deleteLater与事件循环QEventLoop类QEventLoop应用等待一段时间同步操作模拟模态对话框 参考 本文主要对QT中的事件循环做简单介绍和使用 Qt作为一个跨平台的UI框架&#xff0c;其…

3-知识图谱-知识图谱的存储与查询

基于关系型数据库的知识图谱存储 基于原生图的知识图谱存储 关系型数据库的局限性 因为关系数据库&#xff0c;不善于处理“关系” 图数据库&#xff1a; Relations Are First-class citizens 在关系数据库中&#xff0c;关系是隐藏表达的。通过外键关联实体&#xff0c;表达…