Prechádzať zdrojové kódy

添加去除小锐角功能

gushoubang 7 mesiacov pred
rodič
commit
4bb5d1ff0f

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

@@ -43,4 +43,10 @@ public interface TableDataMapper {
     int dropVectorTable(@Param("tableName") String tableName);
 
     void delElongatedPolygon(@Param("tableName") String tableName, @Param("minArea") float minArea, @Param("elongationRatio") float elongationRatio);
+    /**
+     * 删除多边形中的小角度
+     * @param jsonArg
+     * {"功能": "去除多边形尾巴","输入表": "vector.\"smallAngle\"", "输出表": "vector.\"result\"","容差": 0.01,"去除平直线上的顶点": "否" }
+     */
+    void delSmallAnglePolygon(@Param("jsonArg") String jsonArg);
 }

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

@@ -234,4 +234,8 @@
                     FROM filtered_polygons)
         WHERE public.ST_GeometryType(geom) = 'ST_MultiPolygon';
     </delete>
+
+    <update id="delSmallAnglePolygon">
+        select remove_smallangle(#{jsonArg}::json)
+    </update>
 </mapper>

+ 47 - 1
sql/pgsql/0_init.sql

@@ -21,4 +21,50 @@ feign:
 -- base.t_fzss_fzxz_ai_district
 
 -- 修改
--- base.t_fzss_zhxz_file
+-- base.t_fzss_zhxz_file
+
+-- 添加函数,去除小锐角
+drop function remove_smallangle;
+
+CREATE OR REPLACE FUNCTION  remove_smallangle(jsonarg json)
+RETURNS VARCHAR AS $$
+DECLARE
+sql TEXT;
+    records VARCHAR;
+begin
+execute format('
+create table %s as
+with t0 as(select id, st_removerepeatedPoints(geom,1e-6) geom from %s sa) ,
+t1 as(
+select id,(st_dump(geom)).path polygonPath, st_dumppoints((st_dump(geom)).geom)  poly  from t0
+),t2 as (
+select id,polygonPath[1] polyID, (poly).path[1] ringId,(poly).path[2] pointID, (poly).geom from t1)
+, t3 as (
+select id,polyid, ringid, max(pointid) over (partition  by id,polyid,ringid) maxid,
+ lag(pointid) over() lagid, pointid, lead(pointid) over() leadid ,
+ st_angle(lag(geom) over() , geom, lead(geom) over() ) angle, --st_distance(lag(geom) over() , geom) dist,
+ geom
+ from t2)
+ , t4 as (
+ select * from t3
+ where angle is null or not( abs(angle) < %s or ( ''%s'' like ''是'' and abs(angle-pi()) < %s ) or abs(angle - 2*pi() ) < %s) )
+ ,t41 as(
+  select id,polyid,ringid, array_agg(geom) points from t4 group by id,polyid,ringid
+  ),t42 as (
+ select id,polyid,ringid,array_length(points, 1) cnt, st_angle(points[2], points[1],points[array_length(points, 1)-1] ) angle,points from t41)
+ , t5 as(
+  select id,polyid,ringid, st_makeline(
+     case when ( abs(angle) < %s or  ( ''%s'' like ''是'' and abs(angle-pi()) < %s ) or abs(angle - 2*pi() ) < %s )
+          then array_append( points[2:array_length(points, 1)-1], points[2]) else points end ) geom
+     from t42)
+ , t6 as(
+ select id, polyid, array_agg(geom) geom from t5 group by id, polyid)
+ ,t7 as (
+ select id, polyid, case array_length(geom,1) when 1 then st_makepolygon( geom[1]) else st_makepolygon(geom[1], geom[2:]) end  geom from t6
+ ) select id,st_collect(geom)  from t7 group by id
+', jsonarg->>'输出表',jsonarg->>'输入表',
+               jsonarg->>'容差',jsonarg->>'去除平直线上的顶点',jsonarg->>'容差',jsonarg->>'容差',jsonarg->>'容差',jsonarg->>'去除平直线上的顶点',jsonarg->>'容差',jsonarg->>'容差');
+return 'OK';
+END;
+$$ LANGUAGE plpgsql;
+