Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過程
前言
在地理信息科學(xué)領(lǐng)域,高程數(shù)據(jù)是至關(guān)重要的基礎(chǔ)信息之一。它廣泛應(yīng)用于地形分析、城市規(guī)劃、土地管理、災(zāi)害預(yù)警與評估等多個重要方面。而數(shù)字高程模型(Digital Elevation Model,簡稱DEM)作為高程數(shù)據(jù)的主要載體,以數(shù)字化的形式精確記錄了地表的高程信息,為我們理解和研究地球表面形態(tài)提供了有力支持。
隨著地理信息系統(tǒng)的不斷發(fā)展與普及,對DEM數(shù)據(jù)的高效處理和應(yīng)用成為了眾多科研工作者和工程技術(shù)人員關(guān)注的焦點。在實際項目中,常常需要從龐大的DEM數(shù)據(jù)集中快速準(zhǔn)確地讀取指定位置的高程值,以滿足諸如地形剖面分析、建筑選址評估、洪水模擬等多樣化的需求。在城市跑步或者騎行過程中,需要對路線進行高程變化的提取,用于規(guī)劃路線的難易程度。在城市燃氣的管道設(shè)計工作當(dāng)中,根據(jù)城市的輸氣管道建設(shè)時,選擇一條合理的路線,可以利用自然高程和重力的作用來實現(xiàn)能耗的降低。
Geotools作為一款功能強大且開源的地理工具庫,為地理數(shù)據(jù)的處理和分析提供了豐富的類庫和便捷的接口。它支持多種地理數(shù)據(jù)格式的讀取與寫入,具備完善的坐標(biāo)轉(zhuǎn)換功能以及空間分析能力,能夠很好地滿足從DEM數(shù)據(jù)中讀取高程信息這一實戰(zhàn)需求。通過運用Geotools,可以高效地實現(xiàn)對DEM數(shù)據(jù)的解析,精準(zhǔn)定位到用戶所需的地理坐標(biāo)點,并快速獲取該點的高程數(shù)據(jù),為后續(xù)的地理信息分析和決策提供堅實的數(shù)據(jù)基礎(chǔ)。
本實戰(zhàn)內(nèi)容將深入講解如何利用Geotools這一強大工具,詳細闡述從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過程。包括對DEM數(shù)據(jù)格式的解析、Geotools環(huán)境的搭建與配置,以及核心代碼的編寫與調(diào)試等關(guān)鍵環(huán)節(jié)。通過本實戰(zhàn),讀者將能夠掌握使用Geotools處理DEM數(shù)據(jù)的實用技能,為在地理信息領(lǐng)域的深入研究和實際應(yīng)用奠定堅實的基礎(chǔ)。
一、GridCoverage2D對象介紹
GridCoverage2D是Geotools庫中用于表示二維柵格覆蓋數(shù)據(jù)的核心類,廣泛應(yīng)用于地理信息系統(tǒng)(GIS)開發(fā)中,特別是在處理遙感影像、數(shù)字高程模型(DEM)等柵格數(shù)據(jù)時發(fā)揮著關(guān)鍵作用。以下是關(guān)于GridCoverage2D的詳細介紹,包括其屬性和方法。
1、GridCoverage2D的屬性
GridCoverage2D是繼承自AbstractGridCoverage的一個子類,GridCoverage2D子類定義的屬性不多,分別是:
image:表示柵格數(shù)據(jù)的
PlanarImage
對象,包含了柵格的像素數(shù)據(jù)。gridGeometry:表示柵格幾何信息的
GridGeometry2D
對象,包括網(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
獲取。
評估指定位置的值
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中的高級操作
重采樣
Operations.DEFAULT.resample()
:將柵格覆蓋重采樣到新的網(wǎng)格幾何或坐標(biāo)參考系中。
插值
Operations.DEFAULT.interpolate()
:對柵格覆蓋進行插值操作,指定插值方法如雙線性插值。
裁剪
使用裁剪操作來獲取柵格覆蓋的子區(qū)域,通過指定一個
Envelope
來定義裁剪范圍。
isDataEditable():判斷柵格數(shù)據(jù)是否可編輯。
getOptimalDataBlockSizes():獲取訪問柵格值時每個維度的最佳塊大小。
getDebugString(Position coord):獲取指定坐標(biāo)的調(diào)試字符串。
以上是GridCoverage2D類的主要屬性和方法的詳細介紹,這些功能使其成為處理和分析柵格數(shù)據(jù)的強大工具,無論是基礎(chǔ)的數(shù)據(jù)讀取和查詢,還是復(fù)雜的幾何變換和數(shù)據(jù)處理,都能滿足地理信息開發(fā)中的多樣化需求。
二、指定位置的高程獲取
在前面一節(jié)中重點介紹了GridCoverage2D的相關(guān)屬性和方法,在了解了這些基本知識以后再來進行相關(guān)屬性的具體獲取實例以及根據(jù)一個經(jīng)緯度位置獲取其對應(yīng)的高程(類似于海拔)信息。本節(jié)重點是相關(guān)代碼的展示。
1、存儲原理
在GeoTIFF格式的DEM中,高程值通常以規(guī)則格網(wǎng)(Regular Grid)的形式存儲。具體來說,高程值被組織成一個二維的像素矩陣,每個像素代表一個特定地理坐標(biāo)點的高程值。按行或列存儲:高程值按行或列逐一記錄,形成一個矩陣結(jié)構(gòu)。每一行或列對應(yīng)地理空間中的一個緯度或經(jīng)度范圍。數(shù)據(jù)類型:高程值可以是整數(shù)或浮點數(shù)格式,支持不同的位深度。例如,常見的有16位整數(shù)、32位浮點數(shù)等。
2、相關(guān)屬性的獲取
這里以GridCoverage2D中,我們來讀取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對象開始*******************"); // 讀取 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對象結(jié)束*******************");
運行以上的代碼后,得到的屬性信息如下:
************************解析coverage對象開始******************* 名稱:湖南省_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對象結(jié)束*******************
在屬性信息中,可以獲取到tif文件的高度和寬度等信息。
3、獲取高程的方法
從Dem中獲取指定位置經(jīng)緯度的高程的方法如下:
/** * -根據(jù)coverage求解對應(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); // 評估高程值 double[] elevation = (double[]) coverage.evaluate(position, new double[1]); System.out.println("Elevation at (" + lon + ", " + lat + "): " + elevation[0]); return elevation[0]; }
然后使用Junit方法來進行對應(yīng)的位置的測試。本例中所采用的是湖南省30米的DEM數(shù)據(jù),因此這里可以讀取的高程位置范圍僅限于湖南省內(nèi)。為了驗證這種情況,我們使用貴州省銅仁的一個經(jīng)緯度,在此情況下無法獲取相應(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ù)期一致,成功的通過經(jīng)緯度位置獲取位置信息。 同時針對省外的銅仁地區(qū),我們無法獲取指定區(qū)域的高程信息。
三、總結(jié)
本實戰(zhàn)內(nèi)容深入講解如何利用Geotools這一強大工具,詳細闡述從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過程。包括對DEM數(shù)據(jù)格式的解析、Geotools環(huán)境的搭建與配置,以及核心代碼的編寫與調(diào)試等關(guān)鍵環(huán)節(jié)。通過本實戰(zhàn),讀者將能夠掌握使用Geotools處理DEM數(shù)據(jù)的實用技能,為在地理信息領(lǐng)域的深入研究和實際應(yīng)用奠定堅實的基礎(chǔ)。通過本文的講解,相信你一定掌握了GridCoverage2D的相關(guān)知識,同時掌握了如何讀取GridCoverage2D的屬性信息以及如何從DEM中獲取我們需要的高程信息。通過一個位置點的高程獲取可以讓您掌握一條線的高程信息如何獲取,也就是循環(huán)坐標(biāo)點,然后依次來獲取相應(yīng)的高程信息,從而可以得到一條路線的連續(xù)高程信息。有了數(shù)據(jù)之后,相信您一定可以快速的獲取相關(guān)信息。
以上就是Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過程的詳細內(nèi)容,更多關(guān)于Java Geotools從DEM中讀取位置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解)
這篇文章主要介紹了從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Java發(fā)送form-data請求實現(xiàn)文件上傳
這篇文章主要為大家詳細介紹了Java發(fā)送form-data請求實現(xiàn)文件上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
我在學(xué)習(xí)完順序表后一直對順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-09-09IDEA編譯報錯:Error:(2048,1024) java: 找不到符號的解決方案
在使用 Lombok 的過程中,你是否曾遇到過 IDEA 編譯報錯 Error:(2048,1024) java: 找不到符號?下面就讓我們來深入剖析這一問題的根源,并給出相應(yīng)的解決方案,需要的朋友可以參考下2025-02-02MyBatis通用Mapper實現(xiàn)原理及相關(guān)內(nèi)容
今天小編就為大家分享一篇關(guān)于MyBatis通用Mapper實現(xiàn)原理及相關(guān)內(nèi)容,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12