Procházet zdrojové kódy

获取等高线的带

gushoubang před 7 měsíci
rodič
revize
693a8e76a5

+ 26 - 0
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/mapper/raster/RasterMapper.java

@@ -2,10 +2,36 @@ package com.onemap.analyse.mapper.raster;
 
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface RasterMapper {
     Double getMinValue(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt);
 
     Double getMaxValue(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt);
 
     Double getAveValue(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt);
+
+    /**
+     * 计算给定区域,指定高程土方的体积
+     */
+    Double getDemVolume(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt,
+                        @Param("minHeight") Double minHeight, @Param("maxHeight") Double maxHeight);
+
+    /**
+     * 计算给定区域,指定高程填平需要的土方体积
+     * @param tableName
+     * @param geomWkt
+     * @param height
+     * @return
+     */
+    Double getFillVolume(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt,
+                         @Param("height") Double height);
+
+    /**
+     * 获取等到带的矢量数据
+     * @param tableName
+     * @param geomWkt
+     * @return
+     */
+    String getDemRing(@Param("tableName") String tableName, @Param("geomWkt") String geomWkt);
 }

+ 39 - 0
onemap-modules/onemap-analyse/src/main/resources/mapper/oracle/raster/RasterMapper.xml

@@ -32,4 +32,43 @@
              LATERAL public.st_pixelaspoints(clipped_rast) AS gv
         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 (ST_SummaryStats(
+                ST_MapAlgebra(
+                        ST_Clip(rast, 1, ST_GeomFromText(#{geomWkt}, 4326)),
+                        1,
+                        'CASE WHEN [rast] &gt;= #{minHeight} AND [rast] &lt;= #{maxHeight} THEN [rast] ELSE NULL END',
+                        '32BF')
+                      )).*) AS stats,
+             (SELECT ST_PixelWidth(ST_Clip(rast, 1, ST_GeomFromText(#{geomWkt}, 4326))) as pixel_size
+              FROM ${tableName}
+              WHERE ST_Intersects(rast, ST_GeomFromText(#{geomWkt}, 4326)) LIMIT 1) AS pixel_info;
+    </select>
+    <select id="getFillVolume" resultType="Double">
+        SELECT SUM((#{height} - stats.mean) * stats.count *
+                   (pixel_info.pixel_size * pixel_info.pixel_size)) AS fill_volume
+        FROM (SELECT (ST_SummaryStats(
+                ST_MapAlgebra(
+                        ST_Clip(rast, 1, ST_GeomFromText(#{geomWkt}, 4326)),
+                        1,
+                        'CASE WHEN [rast] &lt; #{height} THEN [rast] ELSE NULL END',
+                        '32BF'
+                )
+                      )).*) AS stats,
+             (SELECT ST_PixelWidth(ST_Clip(rast, 1, ST_GeomFromText(#{geomWkt}, 4326))) as pixel_size
+              FROM ${tableName}
+              WHERE ST_Intersects(rast, ST_GeomFromText(#{geomWkt}, 4326)) LIMIT 1) AS pixel_info;
+    </select>
+
+    <select id="getDemRing" resultType="String">
+        WITH contour AS (SELECT (ST_Dump(ST_Contour(rast, 1, interval => 1))).geom AS geom, (ST_Value(rast, ST_Centroid((ST_Dump(ST_Contour(rast, 1, interval => 1))).geom)):: int) AS elevation
+        FROM ${tableName}
+        WHERE ST_Intersects(rast, ST_GeomFromText(#{geomWkt}, 4326))
+            )
+        SELECT ST_Intersection(geom, ST_GeomFromText(#{geomWkt}, 4326)) AS geom
+        FROM contour
+        WHERE elevation = #{height}
+    </select>
 </mapper>