Browse Source

随地块删除

gushoubang 8 months ago
parent
commit
9f29b0df3f

+ 2 - 0
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/mapper/vector/TableDataMapper.java

@@ -41,4 +41,6 @@ public interface TableDataMapper {
     List<String> getVectorTableS();
 
     int dropVectorTable(@Param("tableName") String tableName);
+
+    void delElongatedPolygon(@Param("tableName") String tableName, @Param("minArea") float minArea, @Param("elongationRatio") float elongationRatio);
 }

+ 2 - 0
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/ITableDateService.java

@@ -35,4 +35,6 @@ public interface ITableDateService {
     void delByColumns(String tableName, String column, List<String> values);
 
     List<String> getTableNames(String schema, String startWith);
+
+    void delElongatedPolygon(String tableName, float minArea, float elongationRatio);
 }

+ 1 - 9
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/impl/FzssServiceImpl.java

@@ -211,15 +211,7 @@ public class FzssServiceImpl implements IFzssService {
         if (rawTable.equals("")) return RequestResult.error("区域筛选条件筛选未找到符合条件数据!", null);
 
         // 5.切割地块,面积筛选
-        // // TODO 删除异常面积,临时方案
-        // tableDateService.delByAreaAnd(rawTable, 0, 1500);
-        // integer = tableDateService.getTableCount(rawTable);
-        // if (integer == 0) {
-        //     iLogService.saveLog(taskId, "辅助选址", "计算完成,未找到符合用地性质条件数据", "info");
-        //     updateFzxzStatus(taskId, Rwzt.getNoRes());
-        //     return RequestResult.error("区域筛选条件筛选未找到符合条件数据!", null);
-        // }
-
+        tableDateService.delElongatedPolygon(rawTable, 1500, 0.01f);
 
         List<Map<String, Object>> multLandList = new ArrayList<>();
         if (fzxzDTO.getUseMultiple()) {

+ 13 - 0
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/impl/TableDateServiceImpl.java

@@ -86,6 +86,19 @@ public class TableDateServiceImpl implements ITableDateService {
         return tableDataMapper.getTableNames(schema, startWith);
     }
 
+    /**
+     * 删除狭长地块
+     *
+     * @param tableName
+     * @param minArea         小于该面积的地块将被删除
+     * @param elongationRatio 面积 (A) 和周长 (P) 之间的比率 (T = 4π(A/P²)) T小于该值的地块将被删除
+     * https://pro.arcgis.com/zh-cn/pro-app/2.9/help/data/validating-data/polygon-sliver.htm
+     */
+    @Override
+    public void delElongatedPolygon(String tableName, float minArea, float elongationRatio) {
+         tableDataMapper.delElongatedPolygon(tableName, minArea, elongationRatio);
+    }
+
     @Override
     public void delByLandType(String temporaryTable, String rawTable, String landTypeCode) {
         tableDataMapper.delByLandType(temporaryTable, rawTable, landTypeCode);

+ 26 - 0
onemap-modules/onemap-analyse/src/main/resources/mapper/oracle/vector/TableDateMapper.xml

@@ -208,4 +208,30 @@
         DROP TABLE "${tableName}"
     </delete>
 
+    <delete id="delElongatedPolygon">
+        DELETE
+        FROM "${tableName}"
+        WHERE public.ST_GeometryType(geom) = 'ST_Polygon'
+          AND ((4 * pi() * public.ST_Area(geom::public.geography)) /
+               (public.ST_Perimeter(geom::public.geography) * public.ST_Perimeter(geom::public.geography)) &lt;
+               #{elongationRatio} and
+               public.ST_Area(geom::public.geography) &lt; #{minArea});
+
+        WITH split_polygons AS (SELECT (public.ST_Dump(geom)).geom AS single_geom
+        FROM "${tableName}"
+        WHERE public.ST_GeometryType(geom) = 'ST_MultiPolygon'
+            )
+            , filtered_polygons AS (
+        SELECT single_geom
+        FROM split_polygons
+        WHERE (4 * pi() * public.ST_Area(single_geom::public.geography)) / (public.ST_Perimeter(single_geom::public.geography) * public.ST_Perimeter(single_geom::public.geography))
+         &gt; #{elongationRatio}
+           OR public.ST_Area(single_geom::public.geography)
+         &gt; #{minArea}
+            )
+        UPDATE "${tableName}"
+        SET geom = (SELECT public.ST_Multi(public.ST_Collect(single_geom))
+                    FROM filtered_polygons)
+        WHERE public.ST_GeometryType(geom) = 'ST_MultiPolygon';
+    </delete>
 </mapper>