目录
前言
在地理信息科学领域,高程数据是至关重要的基础信息之一。它广泛应用于地形分析、城市规划、土地管理、灾害预警与评估等多个重要方面。而数字高程模型(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中获取我们需要的高程信息。通过一个位置点的高程获取可以让您掌握一条线的高程信息如何获取,也就是循环坐标点,然后依次来获取相应的高程信息,从而可以得到一条路线的连续高程信息。有了数据之后,相信您一定可以快速的获取相关信息。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。