1
13693261870
2024-10-17 4fab1da943cc36e05c9732e3b510d00137273347
src/main/java/com/se/simu/service/ResultService.java
@@ -3,6 +3,7 @@
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.se.simu.config.PropertiesConfig;
import com.se.simu.domain.dto.BuildingDto;
import com.se.simu.domain.dto.ExtensionDto;
import com.se.simu.domain.dto.LayerDto;
import com.se.simu.domain.dto.ResultDto;
@@ -14,7 +15,7 @@
import org.gdal.gdal.WarpOptions;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.ogr.Geometry;
import org.gdal.ogr.*;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -48,8 +49,7 @@
                basePath + config.getBuildingFile(),
                basePath + config.getWaterPath(),
                basePath + config.getFlowPath(),
                config.getOutPath(),
                "");
                config.getOutPath());
        LayerDto layer = new LayerDto(config.getVer(), data.getEpsg(), config.getSizes());
        process(dto, layer);
    }
@@ -209,28 +209,31 @@
     * 建筑
     */
    private void copeBuilding(ResultDto dto, LayerDto layer) {
        Dataset ds = null;
        Driver driver = null;
        DataSource dataSource = null;
        Layer shpLayer = null;
        try {
            ds = gdal.Open(dto.getBuildingFile(), gdalconst.GA_ReadOnly);
            if (null == ds || 0 == ds.getRasterCount()) return;
            driver = ogr.GetDriverByName("ESRI shapefile");
            if (null == driver) return;
            for (int[] sizes : layer.getTerrain().getSize()) {
                String tif = dto.getTemp() + File.separator + "building_" + sizes[0] + "_" + sizes[1] + ".tif";
                Resample(ds, tif, sizes[0], sizes[1], layer);
                if (!new File(tif).exists()) continue;
            dataSource = driver.Open(dto.getBuildingFile());
            if (null == dataSource) return;
                Dataset dataset = gdal.Open(tif, gdalconst.GA_ReadOnly);
                if (null == dataset || 0 == dataset.getRasterCount()) return;
            shpLayer = dataSource.GetLayer(0);
            if (shpLayer.GetFeatureCount() < 1) return;
                float[] buffer = new float[sizes[0] * sizes[1]];
                //dataset.GetRasterBand(1).ReadRaster(0, 0, sizes[0], sizes[1], buffer, sizes[0], sizes[1], 0, 0);
                dataset.GetRasterBand(1).ReadRaster(0, 0, sizes[0], sizes[1], buffer);
                dto.getBuildings().put(sizes[0] + "_" + sizes[1], buffer);
            do {
                Feature f = shpLayer.GetNextFeature();
                if (null == f) break;
                dataset.delete();
            }
                String id = f.GetFieldAsString(config.getBuildingKey());
                BuildingDto building = new BuildingDto(id, f.GetGeometryRef());
                dto.getBuildingList().add(building);
            } while (true);
        } finally {
            if (null != ds) ds.delete();
            if (null != shpLayer) shpLayer.delete();
            if (null != dataSource) dataSource.delete();
            if (null != driver) driver.delete();
        }
    }