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

<think>好的,我需要帮助用户了解如何在Springdoc中设置全局请求参数。首先,我得回忆一下Springdoc的基本知识,它主要是用来生成OpenAPI文档的,结合Spring Boot使用。全局请求参数可能指的是那些在每个API请求中都需要传递的参数,比如认证令牌、版本号等。设置这些参数全局,可以避免在每个控制器方法里重复添加注解。 接下来,我需要确定用户的需求是什么。他们可能希望这些参数出现在所有API的文档中,并且在实际请求中被正确处理。这时候,可能需要用到OpenAPI的全局配置,或者自定义全局的OperationCustomizer。 然后,我应该考虑具体实现步骤。首先,添加Springdoc的依赖,这是基础。然后,创建一个配置类,使用@Configuration注解。在这个类里,定义一个OpenAPI的Bean,通过addOperationCustomizer方法来添加全局参数。 另外,可能需要区分参数的类型,比如查询参数、请求头、路径参数等。例如,使用Parameter的in属性来指定参数的位置。同时,要设置required属性来确定是否必填,schema定义类型,description添加描述。 还要考虑是否这些参数需要自动应用到所有接口,还是仅添加到文档中。如果只是文档显示,可能不需要修改拦截器或过滤器,但若需要实际处理这些参数,可能需要结合Spring的拦截器机制。 记得要举例子,比如添加一个名为token的请求头,或者version的查询参数,这样用户更容易理解。同时,提醒用户如果有更复杂的需求,可以参考Springdoc的官方文档,或者提供进一步的问题渠道。 最后,检查是否有遗漏的细节,比如依赖的版本,配置类的正确写法,以及参数定义的完整性。确保代码示例正确,并且符合Spring Boot和Springdoc的最新实践。</think>在Springdoc(用于生成OpenAPI 3+文档的库)中设置全局请求参数,可以通过自定义全局的`OperationCustomizer`或直接配置`OpenAPI` Bean实现。以下是具体步骤: --- ### 1. 添加依赖 确保已包含Springdoc依赖(以Maven为例): ```xml <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.1.0</version> <!-- 检查最新版本 --> </dependency> ``` --- ### 2. 配置全局参数 创建一个配置类,通过`OpenAPI` Bean添加全局参数: ```java import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.parameters.Parameter; import org.springdoc.core.customizers.OperationCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.HandlerMethod; @Configuration public class SpringdocConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .addParametersItem(createGlobalHeaderParam()); } // 示例:全局请求头参数(如token) private Parameter createGlobalHeaderParam() { return new Parameter() .in("header") // 参数位置(header/query/path等) .name("Authorization") // 参数名称 .description("JWT Token") .required(true) // 是否必填 .schema(new StringSchema().example("Bearer your_token")); } } ``` --- ### 3. 使用`OperationCustomizer`(更灵活) 若需更细粒度控制(如排除某些接口),可添加全局拦截器: ```java @Bean public OperationCustomizer globalOperationCustomizer() { return (Operation operation, HandlerMethod handlerMethod) -> { // 添加全局查询参数(如version) Parameter versionParam = new Parameter() .in("query") .name("version") .description("API版本号") .required(false) .schema(new StringSchema().example("v1")); operation.addParametersItem(versionParam); return operation; }; } ``` --- ### 4. 参数类型说明 通过`.in()`指定参数位置: - `header`:请求头参数 - `query`:URL查询参数(如`?param=value`) - `path`:路径参数(如`/users/{id}`) - `cookie`:Cookie参数 --- ### 5. 验证结果 启动应用后访问Swagger UI(默认地址:`http://localhost:8080/swagger-ui.html`),所有接口将显示全局参数。 --- ### 注意事项 - **实际参数处理**:此配置仅影响文档展示。若需参数真正生效,需结合拦截器或AOP实现逻辑处理。 - **排除特定接口**:在`OperationCustomizer`中可通过`handlerMethod`判断方法/类注解,动态排除参数。 如果需要更复杂的配置(如分组参数),可参考[Springdoc官方文档](https://springdoc.org/)。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜郎king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值