From 6827092435f97dcd7bf557eb01711d24f437ce55 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 30 九月 2024 18:04:35 +0800
Subject: [PATCH] 1

---
 src/main/java/com/se/simu/service/ResultService.java |   50 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java
index 84c57a4..64c8645 100644
--- a/src/main/java/com/se/simu/service/ResultService.java
+++ b/src/main/java/com/se/simu/service/ResultService.java
@@ -3,9 +3,16 @@
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.json.JSONUtil;
 import com.se.simu.config.PropertiesConfig;
+import com.se.simu.domain.dto.ExtensionDto;
 import com.se.simu.domain.dto.LayerDto;
 import com.se.simu.domain.dto.ResultDto;
+import com.se.simu.helper.GdalHelper;
 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.ogr.Geometry;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -47,7 +54,48 @@
     }
 
     private void copeTerrain(ResultDto dto, LayerDto layer) {
-        //
+        Dataset ds = null;
+        try {
+            ds = gdal.Open(dto.getTerrainFile(), gdalconst.GA_ReadOnly);
+            if (null == ds || 0 == ds.getRasterCount() || null == ds.GetSpatialRef()) return;
+
+            setTerrainInfo(ds, layer);
+            setWaterInfo(dto, layer);
+            createTerrainPng(dto, ds, layer);
+        } finally {
+            if (null != ds) ds.delete();
+        }
+    }
+
+    private void setTerrainInfo(Dataset ds, LayerDto layer) {
+        Geometry minPoint = GdalHelper.getMinPoint(ds);
+        Geometry maxPoint = GdalHelper.getMaxPoint(ds);
+        double minx = getMinVal(minPoint.GetX(0), 10000000);
+        double miny = getMinVal(minPoint.GetY(0), 10000000);
+        double maxx = getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000);
+        double maxy = getMaxVal(maxPoint.GetY(0), 10000000);
+        layer.setExtension(new ExtensionDto(minx, miny, maxx, maxy, Double.MAX_VALUE, Double.MIN_VALUE));
+
+        Band band = ds.GetRasterBand(1);
+        double[] mm = new double[2];
+        band.ComputeRasterMinMax(mm, 0);
+        layer.getTerrain().setHeight(getMinVal(mm[0], 1000), getMaxVal(mm[1], 1000));
+    }
+
+    private static double getMinVal(double val, double radix) {
+        return ((long) Math.floor(val * radix)) / radix;
+    }
+
+    private static double getMaxVal(double val, double radix) {
+        return ((long) Math.ceil(val * radix)) / radix;
+    }
+
+    private void setWaterInfo(ResultDto dto, LayerDto layer) {
+
+    }
+
+    private void createTerrainPng(ResultDto dto, Dataset ds, LayerDto layer) {
+
     }
 
     private void copeBuilding(ResultDto dto, LayerDto layer) {

--
Gitblit v1.9.3