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

news/2025/2/21 23:39:23

目录

前言

一、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 地形数据的技能具有重要的现实意义。无论是在科研领域,为环境变化研究、自然灾害预测等提供数据支持;还是在商业领域,助力城市规划、工程建设、资源勘探等项目的顺利开展,这一技能都将成为我们手中有力的工具。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。


http://www.niftyadmin.cn/n/5861419.html

相关文章

前后端项目部署服务器(传统部署和Docker部署)

内外网 开发环境连外网&#xff08;8.140.26.187&#xff09;&#xff0c;测试/生产环境连内网&#xff08;172.20.59.17&#xff09; 内外网地址不同&#xff0c;但指定的库是同一个 内网IP地址范围包括&#xff1a; 10.0.0.0 到 10.255.255.255172.16.0.0 到 172.31.2551…

【VUE面试】Vue2和Vue3的diff算法中,key的作用分别是什么?

在 Vue2 和 Vue3 的 Diff 算法里&#xff0c;key 都起着关键作用&#xff0c;但由于两个版本的 Diff 算法实现有所不同&#xff0c;key 的具体作用和使用场景也存在一些差异。以下详细介绍&#xff1a; Vue2 中 key 的作用 1. 辅助节点复用 在 Vue2 的 Diff 算法中&#xff0…

Spring IoC DI

一、IoC详解 控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;是一种软件设计原则&#xff0c;其核心思想是将程序中的对象创建、依赖管理和生命周期控制的权力从应用程序代码转移到外部容器或框架&#xff0c;从而降低组件间的耦合度&#xff0c;提升代码…

ok113i平台——多媒体播放器适配

1. 视频播放支持 1.1 在Linux平台交叉编译ffmpeg动态库&#xff0c;详情查看《ok113i平台——交叉编译音视频动态库》 提取如下动态库&#xff1a; libavcodec.so.58.134.100 libavdevice.so.58.13.100 libavfilter.so.7.110.100 libavformat.so.58.76.100 libavutil.so.56.…

AI赋能Web3.0前端开发:效率革命与ScriptEcho的实践

Web3.0浪潮席卷全球&#xff0c;前端开发作为用户体验的关键环节&#xff0c;面临着前所未有的挑战。如何高效、低成本地构建复杂的去中心化应用&#xff08;DApps&#xff09;成为行业关注的焦点。幸运的是&#xff0c;AI写代码工具的兴起为Web3.0前端开发带来了新的曙光&…

JavaScript 高级程序设计 读书笔记(第三章)

JavaScript 高级程序设计 读书笔记&#xff08;第三章&#xff09; 前几天小哆啦去参加了一场超有挑战性的面试&#xff0c;本以为凭借自己的聪明才智和平时积累的小本事&#xff0c;肯定能轻松应对。可没想到&#xff0c;面试官抛出的一些关于 JavaScript 的深入问题&#xff…

H3C交换机路由器防火墙FTP/TFTP服务器搭建。

软件介绍。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多种网络服务功能的工具软件&#xff0c;主要用于网络管理和文件传输&#xff0c;支持TFTP、FTP、Syslog等多种协议&#xff0c;广泛应用于网络设备的配置和管理。 1. 主要功能 TFTP服务器&#xff1a;支持TFTP协议…

【Scrapy】Scrapy教程7——存储数据

上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。 存储数据到文件 首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程…