Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程
前言
在地理信息科學(xué)領(lǐng)域,高程數(shù)據(jù)是至關(guān)重要的基礎(chǔ)信息之一。它廣泛應(yīng)用于地形分析、城市規(guī)劃、土地管理、災(zāi)害預(yù)警與評(píng)估等多個(gè)重要方面。而數(shù)字高程模型(Digital Elevation Model,簡(jiǎn)稱DEM)作為高程數(shù)據(jù)的主要載體,以數(shù)字化的形式精確記錄了地表的高程信息,為我們理解和研究地球表面形態(tài)提供了有力支持。
隨著地理信息系統(tǒng)的不斷發(fā)展與普及,對(duì)DEM數(shù)據(jù)的高效處理和應(yīng)用成為了眾多科研工作者和工程技術(shù)人員關(guān)注的焦點(diǎn)。在實(shí)際項(xiàng)目中,常常需要從龐大的DEM數(shù)據(jù)集中快速準(zhǔn)確地讀取指定位置的高程值,以滿足諸如地形剖面分析、建筑選址評(píng)估、洪水模擬等多樣化的需求。在城市跑步或者騎行過(guò)程中,需要對(duì)路線進(jìn)行高程變化的提取,用于規(guī)劃路線的難易程度。在城市燃?xì)獾墓艿涝O(shè)計(jì)工作當(dāng)中,根據(jù)城市的輸氣管道建設(shè)時(shí),選擇一條合理的路線,可以利用自然高程和重力的作用來(lái)實(shí)現(xiàn)能耗的降低。

Geotools作為一款功能強(qiáng)大且開(kāi)源的地理工具庫(kù),為地理數(shù)據(jù)的處理和分析提供了豐富的類庫(kù)和便捷的接口。它支持多種地理數(shù)據(jù)格式的讀取與寫(xiě)入,具備完善的坐標(biāo)轉(zhuǎn)換功能以及空間分析能力,能夠很好地滿足從DEM數(shù)據(jù)中讀取高程信息這一實(shí)戰(zhàn)需求。通過(guò)運(yùn)用Geotools,可以高效地實(shí)現(xiàn)對(duì)DEM數(shù)據(jù)的解析,精準(zhǔn)定位到用戶所需的地理坐標(biāo)點(diǎn),并快速獲取該點(diǎn)的高程數(shù)據(jù),為后續(xù)的地理信息分析和決策提供堅(jiān)實(shí)的數(shù)據(jù)基礎(chǔ)。
本實(shí)戰(zhàn)內(nèi)容將深入講解如何利用Geotools這一強(qiáng)大工具,詳細(xì)闡述從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程。包括對(duì)DEM數(shù)據(jù)格式的解析、Geotools環(huán)境的搭建與配置,以及核心代碼的編寫(xiě)與調(diào)試等關(guān)鍵環(huán)節(jié)。通過(guò)本實(shí)戰(zhàn),讀者將能夠掌握使用Geotools處理DEM數(shù)據(jù)的實(shí)用技能,為在地理信息領(lǐng)域的深入研究和實(shí)際應(yīng)用奠定堅(jiān)實(shí)的基礎(chǔ)。
一、GridCoverage2D對(duì)象介紹
GridCoverage2D是Geotools庫(kù)中用于表示二維柵格覆蓋數(shù)據(jù)的核心類,廣泛應(yīng)用于地理信息系統(tǒng)(GIS)開(kāi)發(fā)中,特別是在處理遙感影像、數(shù)字高程模型(DEM)等柵格數(shù)據(jù)時(shí)發(fā)揮著關(guān)鍵作用。以下是關(guān)于GridCoverage2D的詳細(xì)介紹,包括其屬性和方法。
1、GridCoverage2D的屬性
GridCoverage2D是繼承自AbstractGridCoverage的一個(gè)子類,GridCoverage2D子類定義的屬性不多,分別是:
image:表示柵格數(shù)據(jù)的
PlanarImage對(duì)象,包含了柵格的像素?cái)?shù)據(jù)。gridGeometry:表示柵格幾何信息的
GridGeometry2D對(duì)象,包括網(wǎng)格坐標(biāo)的有效范圍和地理參考。

2、GridCoverage2D核心方法
獲取坐標(biāo)參考系(CRS)
getCoordinateReferenceSystem2D():返回柵格覆蓋的二維坐標(biāo)參考系。
獲取范圍
getEnvelope():返回柵格覆蓋在坐標(biāo)參考系中的邊界范圍。getEnvelope2D():返回柵格覆蓋在坐標(biāo)參考系中的二維邊界范圍。
獲取幾何信息
getGridGeometry():返回柵格覆蓋的幾何信息。
獲取柵格數(shù)據(jù)
getRenderedImage():將柵格覆蓋數(shù)據(jù)作為RenderedImage獲取。
評(píng)估指定位置的值
evaluate(Position point):在指定的地理坐標(biāo)處獲取柵格值。evaluate(Point2D coord, double[] dest):在指定的地理坐標(biāo)處獲取double類型的柵格值。evaluate(Point2D coord, float[] dest):在指定的地理坐標(biāo)處獲取float類型的柵格值。evaluate(Point2D coord, int[] dest):在指定的地理坐標(biāo)處獲取int類型的柵格值。evaluate(GridCoordinates2D coord, double[] dest):在指定的網(wǎng)格坐標(biāo)處獲取double類型的柵格值。evaluate(GridCoordinates2D coord, float[] dest):在指定的網(wǎng)格坐標(biāo)處獲取float類型的柵格值。evaluate(GridCoordinates2D coord, int[] dest):在指定的網(wǎng)格坐標(biāo)處獲取int類型的柵格值。
獲取樣本維度信息
getNumSampleDimensions():獲取柵格覆蓋的樣本維度(波段)數(shù)量。getSampleDimension(int index):獲取指定索引的樣本維度信息。getSampleDimensions():獲取柵格覆蓋的所有樣本維度信息。
獲取插值方法
getInterpolation():獲取用于所有evaluate(...)方法的插值方法
3、GridCoverage2D中的高級(jí)操作
重采樣
Operations.DEFAULT.resample():將柵格覆蓋重采樣到新的網(wǎng)格幾何或坐標(biāo)參考系中。
插值
Operations.DEFAULT.interpolate():對(duì)柵格覆蓋進(jìn)行插值操作,指定插值方法如雙線性插值。
裁剪
使用裁剪操作來(lái)獲取柵格覆蓋的子區(qū)域,通過(guò)指定一個(gè)
Envelope來(lái)定義裁剪范圍。
isDataEditable():判斷柵格數(shù)據(jù)是否可編輯。
getOptimalDataBlockSizes():獲取訪問(wèn)柵格值時(shí)每個(gè)維度的最佳塊大小。
getDebugString(Position coord):獲取指定坐標(biāo)的調(diào)試字符串。
以上是GridCoverage2D類的主要屬性和方法的詳細(xì)介紹,這些功能使其成為處理和分析柵格數(shù)據(jù)的強(qiáng)大工具,無(wú)論是基礎(chǔ)的數(shù)據(jù)讀取和查詢,還是復(fù)雜的幾何變換和數(shù)據(jù)處理,都能滿足地理信息開(kāi)發(fā)中的多樣化需求。
二、指定位置的高程獲取
在前面一節(jié)中重點(diǎn)介紹了GridCoverage2D的相關(guān)屬性和方法,在了解了這些基本知識(shí)以后再來(lái)進(jìn)行相關(guān)屬性的具體獲取實(shí)例以及根據(jù)一個(gè)經(jīng)緯度位置獲取其對(duì)應(yīng)的高程(類似于海拔)信息。本節(jié)重點(diǎn)是相關(guān)代碼的展示。
1、存儲(chǔ)原理
在GeoTIFF格式的DEM中,高程值通常以規(guī)則格網(wǎng)(Regular Grid)的形式存儲(chǔ)。具體來(lái)說(shuō),高程值被組織成一個(gè)二維的像素矩陣,每個(gè)像素代表一個(gè)特定地理坐標(biāo)點(diǎn)的高程值。按行或列存儲(chǔ):高程值按行或列逐一記錄,形成一個(gè)矩陣結(jié)構(gòu)。每一行或列對(duì)應(yīng)地理空間中的一個(gè)緯度或經(jīng)度范圍。數(shù)據(jù)類型:高程值可以是整數(shù)或浮點(diǎn)數(shù)格式,支持不同的位深度。例如,常見(jiàn)的有16位整數(shù)、32位浮點(diǎn)數(shù)等。
2、相關(guān)屬性的獲取
這里以GridCoverage2D中,我們來(lái)讀取GridCoverage2D的相關(guān)屬性信息,讀取屬性信息的關(guān)鍵方法如下:
// DEM 文件路徑
File demFile = new File("C:/BaiduDownload/湖南省_DEM_30m分辨率_NASA數(shù)據(jù).tif");
// 創(chuàng)建 GeoTiffReader
GeoTiffReader reader = new GeoTiffReader(demFile);
System.out.println("************************解析coverage對(duì)象開(kāi)始*******************");
// 讀取 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對(duì)象結(jié)束*******************");運(yùn)行以上的代碼后,得到的屬性信息如下:
************************解析coverage對(duì)象開(kāi)始******************* 名稱:湖南省_DEM_30m分辨率_NASA數(shù)據(jù) 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對(duì)象結(jié)束*******************
在屬性信息中,可以獲取到tif文件的高度和寬度等信息。
3、獲取高程的方法
從Dem中獲取指定位置經(jīng)緯度的高程的方法如下:
/**
* -根據(jù)coverage求解對(duì)應(yīng)經(jīng)緯度的高程值
* @param coverage
* @param lon 經(jīng)度
* @param lat 緯度
* @return 高程值
*/
public double getHeightValue(GridCoverage2D coverage,double lon,double lat) {
// 獲取 DEM 的坐標(biāo)參考系統(tǒng)
CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem2D();
DirectPosition position = new DirectPosition2D(crs, lon, lat);
// 評(píng)估高程值
double[] elevation = (double[]) coverage.evaluate(position, new double[1]);
System.out.println("Elevation at (" + lon + ", " + lat + "): " + elevation[0]);
return elevation[0];
}然后使用Junit方法來(lái)進(jìn)行對(duì)應(yīng)的位置的測(cè)試。本例中所采用的是湖南省30米的DEM數(shù)據(jù),因此這里可以讀取的高程位置范圍僅限于湖南省內(nèi)。為了驗(yàn)證這種情況,我們使用貴州省銅仁的一個(gè)經(jīng)緯度,在此情況下無(wú)法獲取相應(yīng)的高程信息。
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獲取高程-----------------------------");運(yùn)行之后可以在控制臺(tái)看到以下高程輸出:

與我們的預(yù)期一致,成功的通過(guò)經(jīng)緯度位置獲取位置信息。 同時(shí)針對(duì)省外的銅仁地區(qū),我們無(wú)法獲取指定區(qū)域的高程信息。
三、總結(jié)
本實(shí)戰(zhàn)內(nèi)容深入講解如何利用Geotools這一強(qiáng)大工具,詳細(xì)闡述從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程。包括對(duì)DEM數(shù)據(jù)格式的解析、Geotools環(huán)境的搭建與配置,以及核心代碼的編寫(xiě)與調(diào)試等關(guān)鍵環(huán)節(jié)。通過(guò)本實(shí)戰(zhàn),讀者將能夠掌握使用Geotools處理DEM數(shù)據(jù)的實(shí)用技能,為在地理信息領(lǐng)域的深入研究和實(shí)際應(yīng)用奠定堅(jiān)實(shí)的基礎(chǔ)。通過(guò)本文的講解,相信你一定掌握了GridCoverage2D的相關(guān)知識(shí),同時(shí)掌握了如何讀取GridCoverage2D的屬性信息以及如何從DEM中獲取我們需要的高程信息。通過(guò)一個(gè)位置點(diǎn)的高程獲取可以讓您掌握一條線的高程信息如何獲取,也就是循環(huán)坐標(biāo)點(diǎn),然后依次來(lái)獲取相應(yīng)的高程信息,從而可以得到一條路線的連續(xù)高程信息。有了數(shù)據(jù)之后,相信您一定可以快速的獲取相關(guān)信息。
以上就是Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于Java Geotools從DEM中讀取位置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例
在Web應(yīng)用程序中,獲取客戶端的IP地址是一項(xiàng)非常常見(jiàn)的需求,本文主要介紹了SpringBoot獲取客戶端的IP地址的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)的實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Java數(shù)據(jù)結(jié)構(gòu)之KMP算法的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中KMP算法的原理與實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-11-11
別在Java代碼里亂打日志了,這才是正確的打日志姿勢(shì)
這篇文章主要介紹了別在Java代碼里亂打日志了,這才是正確的打日志姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
無(wú)感NullPointerException的值相等判斷方法
當(dāng)我們需要去判斷一個(gè)?入?yún)?查庫(kù)?返回的開(kāi)關(guān)變量(通常是個(gè)Integer類型的)時(shí),常常會(huì)寫(xiě)如下的if-else判斷語(yǔ)句。但又會(huì)為在生產(chǎn)環(huán)境看到的「NullPointerException」感到困擾,遇到這個(gè)問(wèn)題如何處理呢,下面小編通過(guò)本文給大家詳細(xì)講解,需要的朋友參考下吧2023-02-02
關(guān)于mybatis mapper類注入失敗的解決方案
這篇文章主要介紹了關(guān)于mybatis mapper類注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
基于OAuth2.0授權(quán)系統(tǒng)的驗(yàn)證碼功能的實(shí)現(xiàn)
本篇教程給大家分享基于OAuth2.0授權(quán)系統(tǒng)的驗(yàn)證碼功能的實(shí)現(xiàn),驗(yàn)證碼功能的實(shí)現(xiàn)是采用Zuul網(wǎng)關(guān)的Filter過(guò)濾器進(jìn)行校驗(yàn)驗(yàn)證碼,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-05-05

