Browse Source

填挖方完成

gushoubang 7 tháng trước cách đây
mục cha
commit
ff06f6660c

+ 3 - 2
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/controller/analyse/RasterController.java

@@ -7,6 +7,7 @@ import com.onemap.common.datasource.annotation.Slave;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 @RestController
 @RequestMapping("/raster")
@@ -29,7 +30,7 @@ public class RasterController {
     @PostMapping("/cutFill")
     @Slave
     public RequestResult getCutFill(@RequestBody CutFillVo cutFillVo) {
-        iRasterService.getCutFill(cutFillVo);
-        return RequestResult.success();
+        Map<String, Object> mapRes = iRasterService.getCutFill(cutFillVo);
+        return RequestResult.success(mapRes);
     }
 }

+ 13 - 11
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/mapper/raster/RasterMapper.java

@@ -12,24 +12,26 @@ public interface RasterMapper {
     Double getAveValue(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt);
 
     /**
-     * 计算给定区域,指定高程土方的体积
+     * 计算给定区域,指定高程以上土方的体积
+     * tableName
+     * geomWkt
+     * height
      */
-    Double getDemVolume(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt,
-                        @Param("minHeight") Double minHeight, @Param("maxHeight") Double maxHeight);
+    Double getHilltopVolume(Map<String, Object> map);
 
     /**
      * 计算给定区域,指定高程填平需要的土方体积
-     *
-     * @return
+     * tableName
+     * geomWkt
+     * height
      */
-    Double getFillVolume(Map<String,Object> fillVolumeMap);
+    Double getFillVolume(Map<String, Object> fillVolumeMap);
 
     /**
      * 获取等到带的矢量数据
-     *
-     * @param tableName
-     * @param geomWkt
-     * @return
+     * tableName
+     * geomWkt
+     * height
      */
-    String getDemRing(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt, @Param("height") Double height);
+    String getDemRing(Map<String,Object> map);
 }

+ 3 - 1
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/IRasterService.java

@@ -2,11 +2,13 @@ package com.onemap.analyse.service;
 
 import com.onemap.analyse.domain.vo.CutFillVo;
 
+import java.util.Map;
+
 /**
  * 单波段栅格数据服务
  */
 public interface IRasterService {
     Double getValue(String tableName, String geomWkt, String type);
 
-    void getCutFill(CutFillVo cutFillVo);
+    Map<String,Object> getCutFill(CutFillVo cutFillVo);
 }

+ 36 - 12
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/impl/RasterServiceImpl.java

@@ -31,8 +31,8 @@ public class RasterServiceImpl implements IRasterService {
     }
 
     @Override
-    public void getCutFill(CutFillVo cutFillVo) {
-        String tableName = "vector.\"temp_15_3857\"";
+    public Map<String,Object> getCutFill(CutFillVo cutFillVo) {
+        String tableName = "vector.\"RASTER_DSM_BP_3857\"";
         Double midHeight = cutFillVo.getHeight();
         if (midHeight == null) {
             midHeight = rasterMapper.getAveValue(tableName, cutFillVo.getGeom());
@@ -40,19 +40,43 @@ public class RasterServiceImpl implements IRasterService {
         Double maxHeight = rasterMapper.getMaxValue(tableName, cutFillVo.getGeom());
         Double minHeight = rasterMapper.getMinValue(tableName, cutFillVo.getGeom());
 
-        Map<String,Object> fillVolumeMap = new HashMap<>();
-        fillVolumeMap.put("tableName",tableName);
-        fillVolumeMap.put("geomWkt",cutFillVo.getGeom());
-        fillVolumeMap.put("height",midHeight);
-        Double fillVolume = rasterMapper.getFillVolume(fillVolumeMap);
+        // 给定高程填平需要的土方体积
+        Map<String, Object> heightMap = new HashMap<>();
+        heightMap.put("tableName", tableName);
+        heightMap.put("geomWkt", cutFillVo.getGeom());
+        heightMap.put("height", midHeight);
 
-        Double cutVolume = rasterMapper.getDemVolume(tableName, cutFillVo.getGeom(), midHeight, maxHeight);
+        // 计算给定区域,指定高程填平需要的土方体积
+        Double fillVolume = rasterMapper.getFillVolume(heightMap);
+
+        // 计算给定区域,指定高程土方的体积
+        Double cutVolume = rasterMapper.getHilltopVolume(heightMap);
+
+        Map<String, Object> ringMap = new HashMap<>();
+        ringMap.put("tableName", tableName);
+        ringMap.put("geomWkt", cutFillVo.getGeom());
+        ringMap.put("height", (midHeight + maxHeight) / 2);
+        String midUpGeom = rasterMapper.getDemRing(ringMap);
+
+        ringMap.put("height", midHeight);
+        String midGeom = rasterMapper.getDemRing(ringMap);
+
+        ringMap.put("height", (midHeight + minHeight) / 2);
+        String midDownGeom = rasterMapper.getDemRing(ringMap);
 
-        String midUpGeom = rasterMapper.getDemRing(tableName, cutFillVo.getGeom(), (midHeight + maxHeight) / 2);
-        String midGeom = rasterMapper.getDemRing(tableName, cutFillVo.getGeom(), midHeight);
-        String midDownGeom = rasterMapper.getDemRing(tableName, cutFillVo.getGeom(), (midHeight + minHeight) / 2);
         String bottomGeom = cutFillVo.getGeom();
 
-        System.out.println("fillVolume: " + fillVolume);
+        Map<String,Object> resMap=new HashMap<>();
+
+        resMap.put("fillVolume",fillVolume);
+        resMap.put("cutVolume",cutVolume);
+        resMap.put("height",midHeight);
+
+        // resMap.put("midUpGeom",midUpGeom);
+        resMap.put("midGeom",midGeom);
+        // resMap.put("midDownGeom",midDownGeom);
+        resMap.put("bottomGeom",bottomGeom);
+
+        return  resMap;
     }
 }

+ 46 - 57
onemap-modules/onemap-analyse/src/main/resources/mapper/oracle/raster/RasterMapper.xml

@@ -3,7 +3,7 @@
 
 <mapper namespace="com.onemap.analyse.mapper.raster.RasterMapper">
     <select id="getAveValue" resultType="Double">
-        WITH poly AS (SELECT public.st_geomfromtext(#{geomWkt}, 4326) AS geom)
+        WITH poly AS (SELECT PUBLIC.st_transform(public.st_geomfromtext(#{geomWkt}, 4326), 3857) AS geom)
         SELECT AVG((gv).val) AS avg_dsm
         FROM (SELECT public.st_clip(rast, 1, geom, false) AS clipped_rast
               FROM ${tableName},
@@ -13,7 +13,7 @@
         WHERE (gv).val IS NOT NULL;
     </select>
     <select id="getMaxValue" resultType="Double">
-        WITH poly AS (SELECT public.st_geomfromtext(#{geomWkt}, 4326) AS geom)
+        WITH poly AS (SELECT PUBLIC.st_transform(public.st_geomfromtext(#{geomWkt}, 4326), 3857) AS geom)
         SELECT MAX((gv).val) AS max_dsm
         FROM (SELECT public.st_clip(rast, 1, geom, false) AS clipped_rast
               FROM ${tableName},
@@ -23,7 +23,7 @@
         WHERE (gv).val IS NOT NULL;
     </select>
     <select id="getMinValue" resultType="Double">
-        WITH poly AS (SELECT public.st_geomfromtext(#{geomWkt}, 4326) AS geom)
+        WITH poly AS (SELECT PUBLIC.st_transform(public.st_geomfromtext(#{geomWkt}, 4326), 3857) AS geom)
         SELECT MIN((gv).val) AS min_dsm
         FROM (SELECT public.st_clip(rast, 1, geom, false) AS clipped_rast
               FROM ${tableName},
@@ -33,69 +33,58 @@
         WHERE (gv).val IS NOT NULL;
     </select>
 
-    <select id="getDemVolume" resultType="Double">
-        SELECT (stats.count * (pixel_info.pixel_size * pixel_info.pixel_size) * (stats.mean - #{minHeight})) AS volume
-        FROM (SELECT (public.ST_SummaryStats(
-                public.ST_MapAlgebra(
-                        public.ST_Clip(rast, 1, public.ST_GeomFromText(#{geomWkt}, 4326)),1,
-                        'CASE WHEN [rast] &gt;= #{minHeight} AND [rast] &lt;= #{maxHeight} THEN [rast] ELSE NULL END',
-                        '32BF')
-                      )).*) AS stats,
-             (SELECT public.ST_PixelWidth(public.ST_Clip(rast, 1, public.ST_GeomFromText(#{geomWkt}, 4326))) as pixel_size
-              FROM ${tableName}
-              WHERE public.ST_Intersects(rast, public.ST_GeomFromText(#{geomWkt}, 4326)) LIMIT 1) AS pixel_info;
+    <select id="getHilltopVolume" parameterType="map" resultType="Double">
+        WITH geom AS (SELECT PUBLIC.st_transform(PUBLIC.ST_GeomFromText('${geomWkt}', 4326), 3857) AS geom),
+             pixel AS (SELECT (PUBLIC.ST_MetaData(rast)).scalex AS pixel_width
+        FROM ${tableName} LIMIT 1
+            ), clipped_raster AS (
+        SELECT PUBLIC.ST_Clip(rast, 1, geom.geom, FALSE) AS rast
+        FROM ${tableName}, geom
+        WHERE PUBLIC.ST_Intersects(rast
+            , geom.geom)
+            )
+            , stats AS (
+        SELECT (PUBLIC.ST_SummaryStats(PUBLIC.ST_MapAlgebraExpr(
+            rast, 1, '32BF', 'CASE WHEN [rast] &gt;= ${height} THEN [rast] ELSE NULL END'
+            ), 1)).*
+        FROM clipped_raster
+            )
+        SELECT SUM((stats.mean - #{height}) * stats.count * (pixel.pixel_width * pixel.pixel_width)) AS fill_volume
+        FROM stats,
+             pixel;
     </select>
 
     <select id="getFillVolume" parameterType="map" resultType="Double">
-        WITH geom AS (
-            SELECT PUBLIC.st_transform(PUBLIC.ST_GeomFromText('${geomWkt}', 4326), 3857) AS geom
-        ),
-             pixel AS (
-                 SELECT (PUBLIC.ST_MetaData(rast)).scalex AS pixel_width FROM ${tableName} LIMIT 1
-            ),
-            clipped_raster AS (
-        SELECT PUBLIC.ST_Clip(rast, 1, geom.geom, FALSE) AS rast FROM ${tableName}, geom
-        WHERE PUBLIC.ST_Intersects(rast, geom.geom)
-            ),
-            stats AS (
+        WITH geom AS (SELECT PUBLIC.st_transform(PUBLIC.ST_GeomFromText('${geomWkt}', 4326), 3857) AS geom),
+             pixel AS (SELECT (PUBLIC.ST_MetaData(rast)).scalex AS pixel_width
+        FROM ${tableName} LIMIT 1
+            ), clipped_raster AS (
+        SELECT PUBLIC.ST_Clip(rast, 1, geom.geom, FALSE) AS rast
+        FROM ${tableName}, geom
+        WHERE PUBLIC.ST_Intersects(rast
+            , geom.geom)
+            )
+            , stats AS (
         SELECT (PUBLIC.ST_SummaryStats(PUBLIC.ST_MapAlgebraExpr(
-            rast, 1, '32BF',
-            'CASE WHEN [rast] &lt; ${height} THEN [rast] ELSE NULL END'
+            rast, 1, '32BF', 'CASE WHEN [rast] &lt; ${height} THEN [rast] ELSE NULL END'
             ), 1)).*
         FROM clipped_raster
             )
         SELECT SUM((#{height} - stats.mean) * stats.count * (pixel.pixel_width * pixel.pixel_width)) AS fill_volume
-        FROM stats, pixel;
+        FROM stats,
+             pixel;
     </select>
 
-<!--    <select id="getFillVolume" parameterType="map" resultType="Double">-->
-<!--        WITH geom AS (-->
-<!--            SELECT PUBLIC.st_transform(PUBLIC.ST_GeomFromText('${geomWkt}', 4326), 3857) AS geom-->
-<!--        ),-->
-<!--             pixel AS (-->
-<!--                 SELECT (PUBLIC.ST_MetaData(rast)).scalex AS pixel_width FROM ${tableName} LIMIT 1-->
-<!--            ),-->
-<!--            clipped_raster AS (-->
-<!--        SELECT PUBLIC.ST_Clip(rast, 1, geom.geom, FALSE) AS rast FROM ${tableName}, geom-->
-<!--        WHERE PUBLIC.ST_Intersects(rast, geom.geom)-->
-<!--            ),-->
-<!--            stats AS (-->
-<!--        SELECT (PUBLIC.ST_SummaryStats(PUBLIC.ST_MapAlgebra(-->
-<!--            rast, 1, '32BF',-->
-<!--            'CASE WHEN [rast] &lt; ${height} THEN [rast] ELSE NULL END'-->
-<!--            ), 1)).*-->
-<!--        FROM clipped_raster-->
-<!--            )-->
-<!--        SELECT SUM((#{height} - stats.mean) * stats.count * (pixel.pixel_width * pixel.pixel_width)) AS fill_volume-->
-<!--        FROM stats, pixel;-->
-<!--    </select>-->
-
-    <select id="getDemRing" resultType="String">
-        WITH contour AS (SELECT (public.ST_Dump(public.ST_Contour(rast, 1, interval => 1))).geom AS geom, (public.ST_Value(rast, public.ST_Centroid((public.ST_Dump(public.ST_Contour(rast, 1, interval => 1))).geom)):: int) AS elevation
-        FROM ${tableName}
-        WHERE public.ST_Intersects(rast, public.ST_GeomFromText(#{geomWkt}, 4326)))
-        SELECT public.ST_Intersection(geom, public.ST_GeomFromText(#{geomWkt}, 4326)) AS geom
-        FROM contour
-        WHERE elevation = #{height}
+    <select id="getDemRing" parameterType="map" resultType="String">
+        WITH geom AS (SELECT PUBLIC.ST_TRANSFORM(PUBLIC.ST_GEOMFROMTEXT('${geomWkt}', 4326), 3857) AS geom),
+             clipped_raster AS (
+                 SELECT PUBLIC.ST_CLIP(rast, 1, geom.geom, FALSE) AS rast from ${tableName}, geom WHERE PUBLIC.ST_INTERSECTS(rast, geom.geom)
+             ),
+             subquery AS (
+                 SELECT PUBLIC.ST_MAPALGEBRAEXPR(rast, 1, '32BF', 'CASE WHEN [rast] &gt; ${height} THEN 1 ELSE NULL END') AS rast
+                 FROM clipped_raster
+             ),
+             res_geom AS (SELECT (PUBLIC.ST_DUMPASPOLYGONS(rast)).geom AS result_geom FROM subquery)
+        SELECT PUBLIC.ST_ASEWKT(PUBLIC.ST_TRANSFORM(PUBLIC.ST_UNION(PUBLIC.ST_MakeValid(result_geom)), 4326)) AS geom_res FROM res_geom;
     </select>
 </mapper>