src/main/java/com/se/simu/helper/GdalHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/service/ResultService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/se/simu/helper/GdalHelper.java
@@ -5,10 +5,7 @@ import org.gdal.gdal.Dataset; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconst; import org.gdal.ogr.DataSource; import org.gdal.ogr.Driver; import org.gdal.ogr.Layer; import org.gdal.ogr.ogr; import org.gdal.ogr.*; import org.gdal.osr.SpatialReference; import org.gdal.osr.osr; @@ -143,4 +140,63 @@ log.error(ex.getMessage(), ex); } } public 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); } public static Geometry getMaxPoint(Dataset ds) { /* * transform[0] 左上角x坐标 * transform[1] 东西方向分辨率 * transform[2] 旋转角度, 0表示图像 "北方朝上" * * transform[3] 左上角y坐标 * transform[4] 旋转角度, 0表示图像 "北方朝上" * transform[5] 南北方向分辨率 */ double[] transform = new double[6]; ds.GetGeoTransform(transform); double xMax = transform[0] + (ds.getRasterYSize() * transform[1]); double yMax = transform[3]; Geometry point = new Geometry(ogr.wkbPoint); point.AddPoint(xMax, yMax, 0); return Transform(ds, point); } public 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; } } 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) {