使用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位有符号整型 |
| 9 | GDAL驱动 | GeoTIFF |
| 10 | 波段1 | STATISTICS_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");// 创建 GeoTiffReaderGeoTiffReader reader = new GeoTiffReader(demFile);// 读取 GridCoverage2DGridCoverage2D coverage = reader.read(null);printMetadata(coverage);// 关闭 readerreader.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 地形数据的技能具有重要的现实意义。无论是在科研领域,为环境变化研究、自然灾害预测等提供数据支持;还是在商业领域,助力城市规划、工程建设、资源勘探等项目的顺利开展,这一技能都将成为我们手中有力的工具。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。
相关文章:
使用Geotools读取DEM地形数据实战-以湖南省30米数据为例
目录 前言 一、DEM地形数据介绍 1、DEM数据简介 2、DEM应用领域 3、QGIS中读取DEM数据 二、GeoTools解析地形 1、Maven中依赖引用 2、获取数据基本信息 三、总结 前言 随着全球数字化进程的加速,各类地理空间数据呈爆炸式增长,DEM 数据作为其中的…...
基于WebGIS技术的校园地图导航系统架构与核心功能设计
本文专为IT技术人员、地理信息系统(GIS)开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案,旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…...
《养生方法》(一)
一、基础生活习惯 饮食管理 均衡营养:每日摄入多彩蔬果(如胡萝卜、西兰花、柑橘类)补充维生素C/E及膳食纤维;搭配鱼类、豆制品等优质蛋白质,保障免疫系统正常运作 清淡规律:减少高油盐食物…...
Python常见面试题的详解9
1. 如何找出整数数组中第二大的数 要点 定义一个函数用于在整数数组里找出第二大的数。 若数组元素少于 2 个,则返回 None。 借助两个变量 first 和 second 来跟踪最大数和第二大数。 可以添加异常处理,以应对输入非整数数组的情况。 若数组包含重复…...
MAVSDK - Custom Mavlink处理
编译命令中开启 Custom Mavlink 编译 cmake -DCMAKE_BUILD_TYPERelease -DMAVLINK_DIALECTcustom -DBUILD_CUSTOM_MAVLINKON -DCUSTOM_MAVLINK_PATH"G:/Custom_Mavlink" -DBUILD_CUSTOM_PLUGINSON -DENABLED_CUSTOM_PLUGINS"speaker" -DENABLED_PLUGINS&qu…...
java每日精进 2.13 MySql迁移人大金仓
1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…...
【R语言】回归分析与判别分析
一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系…...
ES6中Object.defineProperty 的详细用法和使用场景以及例子
ES6 Object.defineProperty() 用法总结 Object.defineProperty() 是 ES5 引入的一个方法,ES6 继续强化了该方法的使用,它允许我们为对象的属性定义或修改 属性描述符。它能够控制对象属性的行为,如读写权限、可枚举性和可配置性。 1. Objec…...
揭秘云计算 | 5、关于云计算效率的讨论
一、 公有云效率更高? 解:公有云具有更高的效率。首先我们需要知道效率到底指的是什么。这是个亟须澄清的概念。在这里效率是指云数据中心(我们将在后文中介绍其定义)中的IT设备资源利用率,其中最具有代表性的指标就是…...
【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一…...
如何查询网站是否被百度蜘蛛收录?
一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”,例如“site:example.com”(请将“example.com”替换为你实际的网站域名)。如果搜索结果显示了你的网站页面,并且显示了收录的页面数量…...
什么是网络安全审计?网络安全审计的作用...
网络安全审计通过对网络数据的采集、分析、识别,实时动态监测通信内容、网络行为和网络流量,发现和捕获各种敏感信息、违规行为,实时报警响应,全面记录网络系统中的各种会话和事件,实现对网络信息的智能关联分析、评估…...
EasyExcel实现excel导入(模版上传)
目录 效果pom.xmlapplication.ymlcontrollerservice依赖类前台vue代码某个功能如果需要添加大量的数据,通过一条条的方式添加的方式,肯定不合理,本文通过excel导入的方式来实现该功能,100条数据导入成功85条,失败15条,肯定需要返回一个表格给前台或者返回1个错误excel给前…...
Vue 3最新组件解析与实践指南:提升开发效率的利器
目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…...
【前端】如何安装配置WebStorm软件?
文章目录 前言一、前端开发工具WebStorm和VS Code对比二、官网下载三、安装1、开始安装2、选择安装路径3、安装选项4、选择开始菜单文件夹5、安装成功 四、启动WebStorm五、登录授权六、开始使用 前言 WebStorm 是一款由 JetBrains 公司开发的专业集成开发环境(IDE…...
vllm专题(一):安装-GPU
vLLM 是一个 Python 库,支持以下 GPU 变体。选择您的 GPU 类型以查看供应商特定的说明: 1. NVIDIA CUDA vLLM 包含预编译的 C++ 和 CUDA(12.1)二进制文件。 2. AMD ROCm vLLM 支持配备 ROCm 6.3 的 AMD GPU。 注意 此设备没有预构建的 wheel 包,因此您必须使用预构建的 Do…...
php文件包含
文章目录 基础概念php伪协议什么是协议协议的格式php中的协议file协议http协议ftp协议php://input协议php://filter协议php://data协议 php文件上传机制高级文件包含nginx文件日志包含临时文件包含session文件包含pear文件包含远程文件包含 基础概念 文件包含,相当…...
升级 SpringBoot3 全项目讲解 — Spring Boot 3 中如何发Http请求?
随着 Spring Boot 3 的发布,许多开发者开始考虑将他们的项目升级到这个新版本。Spring Boot 3 带来了许多新特性和改进,尤其是在 HTTP 请求处理方面。本文将详细介绍如何在 Spring Boot 3 中发送 HTTP 请求,并通过代码示例帮助你快速上手。 …...
分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现
分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现 目录 分类预测 | MFO-LSSVM飞蛾扑火算法优化最小二乘支持向量机多特征分类预测Matlab实现分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现MFO-LSSVM飞蛾扑火算法优化最小二…...
MyBatis Plus核心功能
一、条件构造器 1.为什么要学? 用于方便地构建SQL查询条件 2.如何使用? 3.实战案例 例:查询出名字中带o的,存款大于等于1000元的人的id,username,info,balance字段 数据库如图: 示例: Test void testL…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
