Java利用Geotools从DEM数据中读取指定位置的高程信息全过程

 更新时间:2025年03月27日 11:01:13   作者:夜郎king  
Geotools作为一款功能强大且开源的地理工具库,为地理数据的处理和分析提供了丰富的类库和便捷的接口,能够很好地满足从DEM数据中读取高程信息这一实战需求,本文将深入讲解如何利用Geotools从获取DEM数据到成功读取指定位置高程信息的全过程,需要的朋友可以参考下

前言

在地理信息科学领域,高程数据是至关重要的基础信息之一。它广泛应用于地形分析、城市规划、土地管理、灾害预警与评估等多个重要方面。而数字高程模型(Digital Elevation Model,简称DEM)作为高程数据的主要载体,以数字化的形式精确记录了地表的高程信息,为我们理解和研究地球表面形态提供了有力支持。

随着地理信息系统的不断发展与普及,对DEM数据的高效处理和应用成为了众多科研工作者和工程技术人员关注的焦点。在实际项目中,常常需要从庞大的DEM数据集中快速准确地读取指定位置的高程值,以满足诸如地形剖面分析、建筑选址评估、洪水模拟等多样化的需求。在城市跑步或者骑行过程中,需要对路线进行高程变化的提取,用于规划路线的难易程度。在城市燃气的管道设计工作当中,根据城市的输气管道建设时,选择一条合理的路线,可以利用自然高程和重力的作用来实现能耗的降低。

Geotools作为一款功能强大且开源的地理工具库,为地理数据的处理和分析提供了丰富的类库和便捷的接口。它支持多种地理数据格式的读取与写入,具备完善的坐标转换功能以及空间分析能力,能够很好地满足从DEM数据中读取高程信息这一实战需求。通过运用Geotools,可以高效地实现对DEM数据的解析,精准定位到用户所需的地理坐标点,并快速获取该点的高程数据,为后续的地理信息分析和决策提供坚实的数据基础。

本实战内容将深入讲解如何利用Geotools这一强大工具,详细阐述从获取DEM数据到成功读取指定位置高程信息的全过程。包括对DEM数据格式的解析、Geotools环境的搭建与配置,以及核心代码的编写与调试等关键环节。通过本实战,读者将能够掌握使用Geotools处理DEM数据的实用技能,为在地理信息领域的深入研究和实际应用奠定坚实的基础。

一、GridCoverage2D对象介绍

GridCoverage2D是Geotools库中用于表示二维栅格覆盖数据的核心类,广泛应用于地理信息系统(GIS)开发中,特别是在处理遥感影像、数字高程模型(DEM)等栅格数据时发挥着关键作用。以下是关于GridCoverage2D的详细介绍,包括其属性和方法。

1、GridCoverage2D的属性

GridCoverage2D是继承自AbstractGridCoverage的一个子类,GridCoverage2D子类定义的属性不多,分别是:

  • image:表示栅格数据的PlanarImage对象,包含了栅格的像素数据。

  • gridGeometry:表示栅格几何信息的GridGeometry2D对象,包括网格坐标的有效范围和地理参考。

2、GridCoverage2D核心方法

  • 获取坐标参考系(CRS)

    • getCoordinateReferenceSystem2D():返回栅格覆盖的二维坐标参考系。

  • 获取范围

    • getEnvelope():返回栅格覆盖在坐标参考系中的边界范围。

    • getEnvelope2D():返回栅格覆盖在坐标参考系中的二维边界范围。

  • 获取几何信息

    • getGridGeometry():返回栅格覆盖的几何信息。

  • 获取栅格数据

    • getRenderedImage():将栅格覆盖数据作为RenderedImage获取。

  • 评估指定位置的值

    • evaluate(Position point):在指定的地理坐标处获取栅格值。

    • evaluate(Point2D coord, double[] dest):在指定的地理坐标处获取double类型的栅格值。

    • evaluate(Point2D coord, float[] dest):在指定的地理坐标处获取float类型的栅格值。

    • evaluate(Point2D coord, int[] dest):在指定的地理坐标处获取int类型的栅格值。

    • evaluate(GridCoordinates2D coord, double[] dest):在指定的网格坐标处获取double类型的栅格值。

    • evaluate(GridCoordinates2D coord, float[] dest):在指定的网格坐标处获取float类型的栅格值。

    • evaluate(GridCoordinates2D coord, int[] dest):在指定的网格坐标处获取int类型的栅格值。

  • 获取样本维度信息

    • getNumSampleDimensions():获取栅格覆盖的样本维度(波段)数量。

    • getSampleDimension(int index):获取指定索引的样本维度信息。

    • getSampleDimensions():获取栅格覆盖的所有样本维度信息。

  • 获取插值方法

    • getInterpolation():获取用于所有evaluate(...)方法的插值方法

3、GridCoverage2D中的高级操作

  • 重采样

    • Operations.DEFAULT.resample():将栅格覆盖重采样到新的网格几何或坐标参考系中。

  • 插值

    • Operations.DEFAULT.interpolate():对栅格覆盖进行插值操作,指定插值方法如双线性插值。

  • 裁剪

    • 使用裁剪操作来获取栅格覆盖的子区域,通过指定一个Envelope来定义裁剪范围。

  • isDataEditable():判断栅格数据是否可编辑。

  • getOptimalDataBlockSizes():获取访问栅格值时每个维度的最佳块大小。

  • getDebugString(Position coord):获取指定坐标的调试字符串。

以上是GridCoverage2D类的主要属性和方法的详细介绍,这些功能使其成为处理和分析栅格数据的强大工具,无论是基础的数据读取和查询,还是复杂的几何变换和数据处理,都能满足地理信息开发中的多样化需求。

二、指定位置的高程获取

在前面一节中重点介绍了GridCoverage2D的相关属性和方法,在了解了这些基本知识以后再来进行相关属性的具体获取实例以及根据一个经纬度位置获取其对应的高程(类似于海拔)信息。本节重点是相关代码的展示。

1、存储原理

在GeoTIFF格式的DEM中,高程值通常以规则格网(Regular Grid)的形式存储。具体来说,高程值被组织成一个二维的像素矩阵,每个像素代表一个特定地理坐标点的高程值。按行或列存储:高程值按行或列逐一记录,形成一个矩阵结构。每一行或列对应地理空间中的一个纬度或经度范围。数据类型:高程值可以是整数或浮点数格式,支持不同的位深度。例如,常见的有16位整数、32位浮点数等。

2、相关属性的获取

这里以GridCoverage2D中,我们来读取GridCoverage2D的相关属性信息,读取属性信息的关键方法如下:

// DEM 文件路径
File demFile = new File("C:/BaiduDownload/湖南省_DEM_30m分辨率_NASA数据.tif");
// 创建 GeoTiffReader
GeoTiffReader reader = new GeoTiffReader(demFile);
System.out.println("************************解析coverage对象开始*******************");
// 读取 GridCoverage2D
GridCoverage2D coverage = reader.read(null);
System.out.println("名称:"+coverage.getName());
for(String propertyName : coverage.getPropertyNames()) {
     System.out.println(propertyName + "<===>" + coverage.getProperty(propertyName));
}
 System.out.println("************************解析coverage对象结束*******************");

运行以上的代码后,得到的属性信息如下:

************************解析coverage对象开始*******************
名称:湖南省_DEM_30m分辨率_NASA数据
tile_cache_key<===>PlanarImage[minX=0 minY=0 width=19695 height=19750 tileGridXOffset=0 tileGridYOffset=0 tileWidth=19695 tileHeight=1 sampleModel=java.awt.image.PixelInterleavedSampleModel@14def00 colorModel=ColorModel: #pixelBits = 16 numComponents = 1 color space = java.awt.color.ICC_ColorSpace@6c2d4cc6 transparency = 1 has alpha = false isAlphaPre = false]
GC_NODATA<===>NoDataContainer [nodataR=RangeDouble[0.0, 0.0], array=[0.0], singleValue=0.0]
JAI.ImageReader<===>it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader@30865a90
image_height<===>19750
JAI.ImageReadParam<===>it.geosolutions.imageio.plugins.tiff.TIFFImageReadParam@6134ac4a
image_min_x_coord<===>0
PamDataset<===>it.geosolutions.imageio.pam.PAMDataset@777c9dc9
tile_cache<===>com.sun.media.jai.util.SunTileCache@71b1a49c: memoryCapacity = 1000000 memoryUsage = 0 #tilesInCache = 0
image_width<===>19695
image_min_y_coord<===>0
************************解析coverage对象结束*******************

在属性信息中,可以获取到tif文件的高度和宽度等信息。 

3、获取高程的方法

从Dem中获取指定位置经纬度的高程的方法如下:

/**
* -根据coverage求解对应经纬度的高程值
* @param coverage
* @param lon 经度
* @param lat 纬度
* @return 高程值
*/
public double getHeightValue(GridCoverage2D coverage,double lon,double lat) {
	// 获取 DEM 的坐标参考系统
    CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem2D();
    DirectPosition position = new DirectPosition2D(crs, lon, lat);
    // 评估高程值
    double[] elevation = (double[]) coverage.evaluate(position, new double[1]);
    System.out.println("Elevation at (" + lon + ", " + lat + "): " + elevation[0]);
    return elevation[0];
}

然后使用Junit方法来进行对应的位置的测试。本例中所采用的是湖南省30米的DEM数据,因此这里可以读取的高程位置范围仅限于湖南省内。为了验证这种情况,我们使用贵州省铜仁的一个经纬度,在此情况下无法获取相应的高程信息。

System.out.println("老屋背高程:" + getHeightValue(coverage,109.281998D,27.204116D));
System.out.println("岳麓山高程:" + getHeightValue(coverage,112.927952D,28.188622D));
System.out.println("楠木寺高程:" + getHeightValue(coverage,112.859802D,28.169707D));
System.out.println("武陵源高程:" + getHeightValue(coverage,110.484695D,29.342379D));
System.out.println("贵州省铜仁高程:" + getHeightValue(coverage,109.160156D,27.683528D));
System.out.println("----------------------从dem获取高程-----------------------------");

运行之后可以在控制台看到以下高程输出:

与我们的预期一致,成功的通过经纬度位置获取位置信息。 同时针对省外的铜仁地区,我们无法获取指定区域的高程信息。

三、总结

本实战内容深入讲解如何利用Geotools这一强大工具,详细阐述从获取DEM数据到成功读取指定位置高程信息的全过程。包括对DEM数据格式的解析、Geotools环境的搭建与配置,以及核心代码的编写与调试等关键环节。通过本实战,读者将能够掌握使用Geotools处理DEM数据的实用技能,为在地理信息领域的深入研究和实际应用奠定坚实的基础。通过本文的讲解,相信你一定掌握了GridCoverage2D的相关知识,同时掌握了如何读取GridCoverage2D的属性信息以及如何从DEM中获取我们需要的高程信息。通过一个位置点的高程获取可以让您掌握一条线的高程信息如何获取,也就是循环坐标点,然后依次来获取相应的高程信息,从而可以得到一条路线的连续高程信息。有了数据之后,相信您一定可以快速的获取相关信息。

以上就是Java利用Geotools从DEM数据中读取指定位置的高程信息全过程的详细内容,更多关于Java Geotools从DEM中读取位置的资料请关注脚本之家其它相关文章!

相关文章

  • Java生成随机时间的简单随机算法

    Java生成随机时间的简单随机算法

    今天小编就为大家分享一篇关于Java生成随机时间的简单随机算法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 从零开始搭建springboot+springcloud+mybatis本地项目全过程(图解)

    从零开始搭建springboot+springcloud+mybatis本地项目全过程(图解)

    这篇文章主要介绍了从零开始搭建springboot+springcloud+mybatis本地项目全过程(图解),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java软引用在浏览器使用实例讲解

    java软引用在浏览器使用实例讲解

    在本篇文章里小编给大家整理的是一篇关于java软引用在浏览器使用实例讲解内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • Java发送form-data请求实现文件上传

    Java发送form-data请求实现文件上传

    这篇文章主要为大家详细介绍了Java发送form-data请求实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java数据结构之顺序表和链表精解

    Java数据结构之顺序表和链表精解

    我在学习完顺序表后一直对顺序表和链表的概念存在一些疑问,这里给出一些分析和看法,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • 一文搞懂Java JDBC中的SQL注入问题

    一文搞懂Java JDBC中的SQL注入问题

    在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译,导致SQL语句编译后的条件为true,一直得到正确的结果,这种现象就是SQL注入,这篇文章主要介绍了一文搞懂Java JDBC中的SQL注入问题,需要的朋友可以参考下
    2022-10-10
  • IDEA编译报错:Error:(2048,1024) java: 找不到符号的解决方案

    IDEA编译报错:Error:(2048,1024) java: 找不到符号的解决方案

    在使用 Lombok 的过程中,你是否曾遇到过 IDEA 编译报错 Error:(2048,1024) java: 找不到符号?下面就让我们来深入剖析这一问题的根源,并给出相应的解决方案,需要的朋友可以参考下
    2025-02-02
  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理及相关内容

    今天小编就为大家分享一篇关于MyBatis通用Mapper实现原理及相关内容,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • spring中Mapstruct属性映射的实现

    spring中Mapstruct属性映射的实现

    本文主要介绍了spring中Mapstruct属性映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • java json与map互相转换的示例

    java json与map互相转换的示例

    这篇文章主要介绍了java json与map互相转换的示例,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10

最新评论