13693261870
2024-11-07 c63f5c032bee42eb339cbbd95c8cee4f7132cf7e
src/main/java/com/se/simu/service/GedbService.java
@@ -19,6 +19,7 @@
import org.gdal.gdal.WarpOptions;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.ogr.Geometry;
import org.gdal.osr.SpatialReference;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -244,7 +245,7 @@
        List<GeLayer> layers = getLayers(token, db);
        queryData(token, db, layers);
        checkData(layers);
        checkData(data, db, layers);
        createShps(basePath, layers);
        createZoneShp(basePath, data, db.getSpatialReference());
        if (data.getPid() > 0) {
@@ -252,9 +253,14 @@
        }
    }
    private void checkData(List<GeLayer> layers) {
    private void checkData(DataPo data, GeDb db, List<GeLayer> layers) {
        GeLayer point = getLayerByName(layers, config.getLayerNames().get(0));
        GeLayer line = getLayerByName(layers, config.getLayerNames().get(1));
        GeLayer build = getLayerByName(layers, config.getLayerNames().get(2));
        Geometry extent = ShpHelper.createPolygon(db.getSpatialReference(), data.getMinx(), data.getMiny(), data.getMaxx(), data.getMaxy());
        checkSpatialRange(extent, point);
        checkSpatialRange(extent, build);
        List<String> bsm = getValues(point, "bsm");
        List<String> bsm2 = new ArrayList<>(bsm);
@@ -280,6 +286,21 @@
        layers.add(juncLayer);
    }
    private void checkSpatialRange(Geometry extent, GeLayer geLayer) {
        int i = 0;
        while (i < geLayer.getData().size()) {
            JSONObject geom = geLayer.getData().getJSONObject(i).getJSONObject("geometry");
            Geometry g = ShpHelper.createGeometry(geLayer, geom);
            g.AssignSpatialReference(extent.GetSpatialReference());
            if (!extent.Intersects(g)) {
                geLayer.getData().remove(i);
                continue;
            }
            i++;
        }
    }
    private GeLayer getLayerByName(List<GeLayer> layers, String name) {
        return layers.stream().filter(a -> a.getName().equals(name)).findFirst().orElse(null);
    }