13693261870
2024-11-07 c63f5c032bee42eb339cbbd95c8cee4f7132cf7e
添加数据校验功能
已修改4个文件
54 ■■■■■ 文件已修改
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/GdalHelper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/ShpHelper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/GedbService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -141,6 +141,12 @@
            <artifactId>caffeine</artifactId>
            <version>2.9.3</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
src/main/java/com/se/simu/helper/GdalHelper.java
@@ -248,4 +248,21 @@
        return g.TransformTo(sr);
    }
    public static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
        Geometry ring = new Geometry(ogr.wkbLinearRing);
        ring.AddPoint_2D(minx, maxy);
        ring.AddPoint_2D(maxx, maxy);
        ring.AddPoint_2D(maxx, miny);
        ring.AddPoint_2D(minx, miny);
        ring.AddPoint_2D(minx, maxy);
        Geometry poly = new Geometry(ogr.wkbPolygon);
        poly.AddGeometry(ring);
        if (null != sr) {
            poly.AssignSpatialReference(sr);
        }
        return poly;
    }
}
src/main/java/com/se/simu/helper/ShpHelper.java
@@ -6,7 +6,6 @@
import com.se.simu.domain.dto.GeField;
import com.se.simu.domain.dto.GeLayer;
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;
@@ -122,7 +121,7 @@
        }
    }
    private static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
    public 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))) {
            double[] dmin = GdalHelper.fromWgs84(sr, minx, miny);
@@ -142,6 +141,7 @@
        Geometry poly = new Geometry(ogr.wkbPolygon);
        poly.AddGeometry(ring);
        poly.AssignSpatialReference(sr);
        return poly;
    }
@@ -220,7 +220,7 @@
    /**
     * 创建Geometry对象
     */
    private static Geometry createGeometry(GeLayer geLayer, JSONObject geom) {
    public static Geometry createGeometry(GeLayer geLayer, JSONObject geom) {
        String type = geom.getStr("type");
        JSONArray cs = geom.getJSONArray("coordinates");
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);
    }