From ef22eddce187cfc2177e731459045c41e035b9bc Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期三, 17 七月 2024 09:15:08 +0800 Subject: [PATCH] 读取DEM数据 --- src/main/java/com/se/simu/helper/GdalHelper.java | 139 +++++++++++++++++++++++++++++++++++++++++++++- src/main/java/com/se/simu/service/WaterService.java | 15 +++-- src/main/java/com/se/simu/domain/LayerVo.java | 16 ++-- 3 files changed, 152 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/se/simu/domain/LayerVo.java b/src/main/java/com/se/simu/domain/LayerVo.java index f58afa4..3f67707 100644 --- a/src/main/java/com/se/simu/domain/LayerVo.java +++ b/src/main/java/com/se/simu/domain/LayerVo.java @@ -136,16 +136,16 @@ } public static class Terrain { - int maxHeight; - int maxWidth; + + int maxHeight; public Terrain() { } - public Terrain(int maxHeight, int maxWidth) { - this.maxHeight = maxHeight; + public Terrain(int maxWidth, int maxHeight) { this.maxWidth = maxWidth; + this.maxHeight = maxHeight; } public int getMaxHeight() { @@ -166,18 +166,18 @@ } public static class Water { - int maxHeight; - int maxWidth; + + int maxHeight; List<Long> data; public Water() { } - public Water(int maxHeight, int maxWidth, List<Long> data) { - this.maxHeight = maxHeight; + public Water(int maxWidth, int maxHeight, List<Long> data) { this.maxWidth = maxWidth; + this.maxHeight = maxHeight; this.data = data; } diff --git a/src/main/java/com/se/simu/helper/GdalHelper.java b/src/main/java/com/se/simu/helper/GdalHelper.java index 5c03481..51fe052 100644 --- a/src/main/java/com/se/simu/helper/GdalHelper.java +++ b/src/main/java/com/se/simu/helper/GdalHelper.java @@ -1,12 +1,14 @@ package com.se.simu.helper; +import com.se.simu.domain.LayerVo; import lombok.extern.slf4j.Slf4j; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconst; -import org.gdal.gdalconst.gdalconstConstants; +import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; +import org.gdal.osr.SpatialReference; import java.io.File; @@ -19,6 +21,16 @@ @Slf4j @SuppressWarnings("ALL") public class GdalHelper { + public final static int I4326 = 4326; + + public final static int I4490 = 4490; + + public static SpatialReference SR4326; + + public static SpatialReference SR4490; + + public final static String CGCS2000 = "CGCS2000"; + /** * 鍒濆鍖� */ @@ -46,19 +58,136 @@ // 娉ㄥ唽鎵�鏈夌殑椹卞姩 gdal.AllRegister(); ogr.RegisterAll(); + initSr(); + } + + /** + * 鍒濆鍖栧潗鏍囩郴 + */ + public static void initSr() { + try { + SR4326 = new SpatialReference(); + SR4326.ImportFromEPSG(I4326); + + SR4490 = new SpatialReference(); + SR4490.ImportFromEPSG(I4490); + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + } + } + + /** + * 璇诲彇DEM杈圭晫 + */ + public static LayerVo readDemExtent(String file) { + LayerVo layer = new LayerVo(); + Dataset ds = null; + + try { + File f = new File(file); + if (!f.exists() || f.isDirectory()) { + return null; + } + + ds = gdal.Open(file, gdalconst.GA_ReadOnly); + if (null == ds) { + return null; + } + + Band band = ds.GetRasterBand(1); + double[] mm = new double[2]; + band.ComputeRasterMinMax(mm); + + Geometry minPoint = getMinPoint(ds); + Geometry maxPoint = getMaxPoint(ds); + + layer.setExtension(new LayerVo.Extension(minPoint.GetX(), minPoint.GetY(), maxPoint.GetX(), maxPoint.GetY(), mm[0], mm[1])); + layer.setTerrain(new LayerVo.Terrain(band.getXSize(), band.getYSize())); + layer.setWater(new LayerVo.Water(band.getXSize(), band.getYSize(), null)); + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + } finally { + if (null != ds) { + ds.delete(); + } + } + + return layer; + } + + /** + * 鑾峰彇Dataset鐨勬渶灏忕偣 + */ + private static Geometry getMinPoint(Dataset ds) { + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + double xMin = transform[0]; + double yMin = transform[3] - ds.getRasterYSize() * transform[1]; + + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint(xMin, yMin, 0); + + return transform(ds, point); + } + + /** + * 鑾峰彇Dataset鐨勬渶澶х偣 + */ + private static Geometry getMaxPoint(Dataset ds) { + /* + * transform[0] 宸︿笂瑙抶鍧愭爣 + * transform[1] 涓滆タ鏂瑰悜鍒嗚鲸鐜� + * transform[2] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂" + * + * transform[3] 宸︿笂瑙抷鍧愭爣 + * transform[4] 鏃嬭浆瑙掑害, 0琛ㄧず鍥惧儚 "鍖楁柟鏈濅笂" + * transform[5] 鍗楀寳鏂瑰悜鍒嗚鲸鐜� + */ + double[] transform = new double[6]; + ds.GetGeoTransform(transform); + + double xMax = transform[0] + (ds.getRasterXSize() * transform[1]); + double yMax = transform[3]; + + Geometry point = new Geometry(ogr.wkbPoint); + point.AddPoint(xMax, yMax, 0); + + return transform(ds, point); + } + + /** + * 鍧愭爣杞崲 + */ + private static Geometry transform(Dataset ds, Geometry point) { + point.AssignSpatialReference(ds.GetSpatialRef()); + if (ds.GetSpatialRef().IsGeographic() > 0) { + return point; + } + + String srsName = ds.GetSpatialRef().GetName(); + if (srsName.contains(CGCS2000)) { + point.TransformTo(SR4490); + } else { + point.TransformTo(SR4326); + } + point.SwapXY(); + + return point; } /** * 鍒涘缓閲戝瓧濉� */ public static void createPyramid(String file) { + Dataset ds = null; try { File f = new File(file); if (!f.exists() || f.isDirectory()) { return; } - Dataset ds = gdal.Open(file, gdalconst.GA_ReadOnly); + ds = gdal.Open(file, gdalconst.GA_ReadOnly); if (null == ds) { return; } @@ -68,10 +197,12 @@ if (0 == band.GetOverviewCount()) { ds.BuildOverviews("nearest", new int[]{2, 4, 6, 8, 16}, null); } - - ds.delete(); } catch (Exception ex) { log.error(ex.getMessage(), ex); + } finally { + if (null != ds) { + ds.delete(); + } } } } diff --git a/src/main/java/com/se/simu/service/WaterService.java b/src/main/java/com/se/simu/service/WaterService.java index eceeb3b..4564fa1 100644 --- a/src/main/java/com/se/simu/service/WaterService.java +++ b/src/main/java/com/se/simu/service/WaterService.java @@ -35,14 +35,17 @@ String file2 = "D:/simu/test/DOM_M.tif"; GdalHelper.createPyramid(file2); - LayerVo layer = new LayerVo(); + LayerVo layer = GdalHelper.readDemExtent(file); + if (null == layer) { + return null; + } layer.setVer(ver); - layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L)); - layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83)); - layer.setTerrain(new LayerVo.Terrain(10000, 10000)); + //layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L)); + //layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83)); + //layer.setTerrain(new LayerVo.Terrain(10000, 10000)); - List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L)); - layer.setWater(new LayerVo.Water(10000, 10000, data)); + //List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L)); + //layer.setWater(new LayerVo.Water(10000, 10000, data)); return layer; } -- Gitblit v1.9.3