| | |
| | | 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; |
| | | import com.se.simu.domain.dto.*; |
| | | import com.se.simu.domain.po.DataPo; |
| | | import com.se.simu.domain.po.PondingPo; |
| | | import com.se.simu.domain.vo.BuildingDepthVo; |
| | |
| | | private List<PondingPo> copePonding(ResultDto dto, Dataset ds, LayerDto layer, List<Geometry> geometries) { |
| | | double[] transform = ds.GetGeoTransform(); |
| | | int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize(); |
| | | double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]); |
| | | |
| | | List<PondingPo> list = new ArrayList<>(); |
| | | for (Geometry geometry : geometries) { |
| | | double[] values = getValues(ds, geometry, xSize, ySize, minX, maxY, pixelWidth, pixelHeight); |
| | | List<PointDto> points = getValues(ds, geometry, transform, xSize, ySize); |
| | | if (CollectionUtils.isEmpty(points))continue; |
| | | |
| | | PointDto point = Collections.max(points); |
| | | list.add(new PondingPo(geometry, point)); |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | private double[] getValues(Dataset ds, Geometry geometry, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) { |
| | | private List<PointDto> getValues(Dataset ds, Geometry g,double[] transform, int xSize, int ySize) { |
| | | double[] env = new double[4]; |
| | | geometry.GetEnvelope(env); |
| | | g.GetEnvelope(env); |
| | | |
| | | int startX = (int) Math.floor((env[0] - minX) / pixelWidth); |
| | | int endX = (int) Math.floor((env[1] - minX) / pixelWidth); |
| | | int startY = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight)); |
| | | int endY = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight)); |
| | | int startX = (int) Math.floor((env[0] - transform[0]) / transform[1]); |
| | | int endX = (int) Math.floor((env[1] - transform[0]) / transform[1]); |
| | | int startY = (int) Math.floor((transform[3] - env[3]) / Math.abs(transform[5])); |
| | | int endY = (int) Math.floor((transform[3] - env[2]) / Math.abs(transform[5])); |
| | | if (startX < 0) startX = 0; |
| | | if (startY < 0) startY = 0; |
| | | if (endX > ds.getRasterXSize()) endX = ds.getRasterXSize(); |
| | | if (endY > ds.getRasterYSize()) endY = ds.getRasterYSize(); |
| | | if (endX - startX < 1 || endY - startY < 1) return null; |
| | | |
| | | int width = endX - startX; |
| | | int height = endY - startY; |
| | | double[] pixelValues = new double[width * height]; |
| | | ds.GetRasterBand(1).ReadRaster(startX, startY, width, height, pixelValues); |
| | | float[] values = new float[1]; |
| | | List<PointDto> points = new ArrayList<>(); |
| | | for (int x = startX; x <= endX; x++) { |
| | | for (int y = startY; y <= endY; y++) { |
| | | double X = transform[0] + x * transform[1] + y * transform[2]; |
| | | double Y = transform[3] + x * transform[4] + y * transform[5]; |
| | | ds.GetRasterBand(1).ReadRaster(startX, startY, 1, 1, values); |
| | | |
| | | return pixelValues; |
| | | if (Float.isNaN(values[0]) || values[0] < -999 || !isContains(g, X, Y)) continue; |
| | | points.add(new PointDto(X, Y, values[0])); |
| | | } |
| | | } |
| | | |
| | | return points; |
| | | } |
| | | |
| | | private boolean isContains(Geometry g, double x, double y) { |
| | | Geometry p = new Geometry(ogr.wkbPoint); |
| | | p.AddPoint_2D(x, y); |
| | | p.AssignSpatialReference(g.GetSpatialReference()); |
| | | |
| | | return g.Contains(p); |
| | | } |
| | | |
| | | private void copeFlow(ResultDto dto, LayerDto layer) { |