11
13693261870
2024-09-29 057656be19439c26afeb37c76fc7d28fd4474d03
11
已修改2个文件
73 ■■■■■ 文件已修改
src/main/java/com/se/simu/helper/ShpHelper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/GedbService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/ShpHelper.java
@@ -6,15 +6,17 @@
import com.se.simu.domain.dto.GeField;
import com.se.simu.domain.dto.GeLayer;
import lombok.extern.slf4j.Slf4j;
import org.gdal.gdal.Dataset;
import org.gdal.ogr.*;
import org.gdal.osr.CoordinateTransformation;
import org.gdal.osr.SpatialReference;
import org.gdal.osr.osr;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Vector;
/**
@@ -37,7 +39,7 @@
        return options;
    }
    public static boolean createShp(String filePath, SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
    public static boolean createShp(String filePath, Map<String, Object> map, SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
        Driver driver = null;
        DataSource dataSource = null;
        Layer layer = null;
@@ -51,9 +53,12 @@
            layer = dataSource.CreateLayer(FileUtil.getName(filePath), sr, ogr.wkbPolygon, getOptions());
            if (null == layer) return false;
            if (null != map) createFields(layer, map);
            Feature f = new Feature(layer.GetLayerDefn());
            Geometry g = createPolygon(sr, minx, miny, maxx, maxy);
            f.SetGeometry(g);
            if (null != map) setValues(f, map);
            layer.CreateFeature(f);
@@ -66,6 +71,57 @@
        }
    }
    private static void createFields(Layer layer,Map<String, Object> map) {
        for (String key : map.keySet()) {
            Object val = map.get(key);
            switch (val.getClass().getTypeName()) {
                //case "java.math.BigDecimal":
                case "java.lang.Double":
                case "double":
                    layer.CreateField(new FieldDefn(key, ogr.OFTReal));
                    break;
                case "java.lang.Long":
                case "long":
                    layer.CreateField(new FieldDefn(key, ogr.OFTInteger64));
                    break;
                case "java.lang.Integer":
                case "int":
                    layer.CreateField(new FieldDefn(key, ogr.OFTInteger));
                    break;
                //case "java.sql.Timestamp":
                //case "java.time.LocalDate":
                //    layer.CreateField(new FieldDefn(key, ogr.OFTDateTime));
                //    break;
                default:
                    layer.CreateField(new FieldDefn(key, ogr.OFTString));
                    break;
            }
        }
    }
    private static void setValues(Feature f, Map<String, Object> map) {
        for (String key : map.keySet()) {
            Object val = map.get(key);
            switch (val.getClass().getTypeName()) {
                case "java.lang.Double":
                case "double":
                    f.SetField(key, Double.parseDouble(val.toString()));
                    break;
                case "java.lang.Long":
                case "long":
                    f.SetField(key, Long.parseLong(val.toString()));
                    break;
                case "java.lang.Integer":
                case "int":
                    f.SetField(key, Integer.parseInt(val.toString()));
                    break;
                default:
                    f.SetField(key, val.toString());
                    break;
            }
        }
    }
    private static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
        String epsg = sr.GetAuthorityCode(null);
        if (!("4326".equals(epsg) || "4490".equals(epsg))) {
src/main/java/com/se/simu/service/GedbService.java
@@ -218,8 +218,6 @@
        List<GeLayer> layers = getLayers(token, db);
        queryData(token, db, layers);
        createShps(basePath, layers);
        createZoneShp(basePath, data, db.getSpatialReference());
        if (data.getPid() > 0) {
            createFloodShp(basePath, data, db.getSpatialReference());
@@ -256,12 +254,17 @@
    }
    private void createZoneShp(String basePath, DataPo data, SpatialReference sr) {
        String filePath = basePath + File.separator + "";
        ShpHelper.createShp(filePath, sr, data.getMinx(), data.getMiny(), data.getMaxx(), data.getMaxy());
        String filePath = basePath + File.separator + config.getZoneName();
        ShpHelper.createShp(filePath,null, sr, data.getMinx(), data.getMiny(), data.getMaxx(), data.getMaxy());
    }
    private void createFloodShp(String basePath, DataPo data, SpatialReference sr) {
        //
        String filePath = basePath + File.separator + config.getBarrierName();
        Map<String, Object> map = new HashMap<>();
        map.put("height", data.getFloodHeight());
        map.put("type", data.getFloodType());
        ShpHelper.createShp(filePath, map, sr, data.getFloodMinx(), data.getFloodMiny(), data.getFloodMaxx(), data.getFloodMaxy());
    }
    public void copeDem(String token, DataPo data) throws Exception {