Explorar el Código

Merge branch 'f-xiaogu' into dev

gushoubang hace 9 meses
padre
commit
b70e736239

+ 11 - 1
onemap-common/onemap-common-core/src/main/java/com/onemap/common/core/utils/StringUtils.java

@@ -543,7 +543,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
      * @return
      */
     public static String xzqdm(String xzqdm) {
-        //处理行政区代码后面的00
+        // 处理行政区代码后面的00
         if (xzqdm.lastIndexOf("00") == xzqdm.length() - 2) {
             xzqdm = xzqdm.substring(0, xzqdm.length() - 2);
         }
@@ -645,4 +645,14 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
         String digits = str.replaceAll("\\D+", "");
         return digits;
     }
+
+    private static final String TEMPORARY = "temporary";
+
+    /**
+     * 获取临时表名
+     * @return
+     */
+    public static String getTemporaryTableName() {
+        return TEMPORARY +"_"+ System.currentTimeMillis()+"_"+ getUUID();
+    }
 }

+ 0 - 26
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/domain/FzxzXzyzDTO.java

@@ -1,26 +0,0 @@
-package com.onemap.analyse.domain;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import org.springframework.stereotype.Repository;
-
-// 辅助选址选址因子,任务中使用
-// @TableName("t_fzss_fzxz_xzyz")
-// @Repository
-// @Data
-// public class FzxzXzyzDTO {
-//     // 标识码
-//     private String bsm;
-//     // 选址任务标识码
-//     private String rwbsm;
-//     // 因子标识码
-//     private String yzbsm;
-//     // 影响因子名称
-//     private String yxyzmc;
-//     // 因子条件,包含:contain,n_contain,相交:identity,n_identity
-//     @TableField(value = "spatial_type")
-//     private String spatialType;
-//     // 影响值
-//     private Float yxz;
-// }

+ 21 - 0
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/mapper/vector/AlgorithmMapper.java

@@ -0,0 +1,21 @@
+package com.onemap.analyse.mapper.vector;
+
+import com.onemap.common.datasource.annotation.Slave;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 算法相关实现
+ */
+@Mapper
+public interface AlgorithmMapper {
+    /**
+     * 算法执行
+     *
+     * @param jsonArg
+     * @param systemArg block_merge('{"类型": "智能选址","版本": 1.0,"小地块最多合并块数": 4, "面积下限": 100.0,"面积上限": 200.0,"距离内合并": 200.0 }',
+     *                  '{"初步结果":"vector.初步结果", "选址结果":"vector.选址结果", "选址方式":"多地块4"}');
+     */
+    @Slave
+    void blockMerge(@Param("jsonArg") String jsonArg, @Param("systemArg") String systemArg);
+}

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

@@ -10,7 +10,7 @@ import java.util.Map;
 public interface IFzssService {
     FzxzCalc saveScheduleParam(SelectPilotVo selectPilotVo) throws JsonProcessingException;
 
-    RequestResult startSchedule(FzxzCalc fzxzCalc);
+    RequestResult startSchedule(FzxzCalc fzxzCalc) throws JsonProcessingException;
 
     void saveScheduleRes(Map<String, Object> resMap);
 

+ 24 - 2
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/service/impl/FzssServiceImpl.java

@@ -11,6 +11,7 @@ import com.onemap.analyse.domain.vo.*;
 import com.onemap.analyse.mapper.*;
 import com.onemap.analyse.mapper.base.FzxzResMapper;
 import com.onemap.analyse.mapper.base.ShpFileMapper;
+import com.onemap.analyse.mapper.vector.AlgorithmMapper;
 import com.onemap.analyse.mapper.vector.GhdkaMapper;
 import com.onemap.analyse.service.*;
 import com.onemap.analyse.utils.DozerUtils;
@@ -74,6 +75,8 @@ public class FzssServiceImpl implements IFzssService {
     private ITableDateService tableDateService;
     @Resource
     private AnalyseUtilsDBService analyseUtilsDBService;
+    @Resource
+    private AlgorithmMapper algorithmMapper;
     //**需要拿出来的逻辑**//
 
     /**
@@ -153,7 +156,7 @@ public class FzssServiceImpl implements IFzssService {
      * @return
      */
     @Override
-    public RequestResult startSchedule(FzxzCalc fzxzCalc) {
+    public RequestResult startSchedule(FzxzCalc fzxzCalc) throws JsonProcessingException {
         SelectionDTO fzxzDTO = fzxzCalc.getFzxzDTO();
         String taskId = fzxzDTO.getBsm();
 
@@ -209,6 +212,24 @@ public class FzssServiceImpl implements IFzssService {
         if (fzxzDTO.getUseMultiple()) {
             // 允许多地块
             int multDistanc = fzxzDTO.getMultipleDistance();
+            Map<String,Object> paramArg = new HashMap<>();
+            paramArg.put("类型", "智能选址");
+            paramArg.put("版本", 1.0);
+            paramArg.put("小地块最多合并块数", 3);
+            paramArg.put("面积下限", fzxzDTO.getYdmjbegin());
+            paramArg.put("面积上限", fzxzDTO.getYdmjend());
+            paramArg.put("距离内合并", multDistanc);
+
+            Map<String, Object> systemArg = new HashMap<>();
+            systemArg.put("初步结果", rawTable);
+            String resTableName=StringUtils.getTemporaryTableName();
+            systemArg.put("选址结果", resTableName);
+            systemArg.put("选址方式", "多地块3");
+
+            String paramJson=JsonUtils.toJson(paramArg);
+            String systemJson=JsonUtils.toJson(systemArg);
+
+            algorithmMapper.blockMerge(paramJson, systemJson);
             // TODO 添加面积筛选
         } else {
             // 不允许多地块,删除面积不符合要求的地块
@@ -466,7 +487,7 @@ public class FzssServiceImpl implements IFzssService {
         result.setGeom(geomRes.getGeom());
 
         // 3.查询分析结果地块信息
-        List<SelectionResDTO> selectionResList = fzxzResMapper.getListByRwbsm(result.getBsm(),null);
+        List<SelectionResDTO> selectionResList = fzxzResMapper.getListByRwbsm(result.getBsm(), null);
         List<Map<String, Object>> dkMaps = new ArrayList<>();
         for (SelectionResDTO selectionRes : selectionResList) {
             // 查询地块信息
@@ -503,6 +524,7 @@ public class FzssServiceImpl implements IFzssService {
 
     /**
      * 获取选址结果列表
+     *
      * @param startTime
      * @param endTime
      * @param name

+ 0 - 16
onemap-modules/onemap-analyse/src/main/java/com/onemap/analyse/utils/SuperMapAnalysisUtil.java

@@ -1,16 +0,0 @@
-package com.onemap.analyse.utils;
-
-import com.onemap.analyse.domain.SelectionDTO;
-// import com.supermap.data.Geometry;
-// import com.supermap.data.Toolkit;
-
-/**
- * 超图空间分析方法
- */
-public class SuperMapAnalysisUtil {
-    // 辅助选址计算
-    private static void fzxz(SelectionDTO fzxzDTO) {
-        // 拿到空间数据
-        // Geometry geometry = Toolkit.WKTToGeometry(fzxzDTO.getXzfw());
-    }
-}

+ 9 - 0
onemap-modules/onemap-analyse/src/main/resources/mapper/oracle/vector/AlgorithmMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.onemap.analyse.mapper.vector.AlgorithmMapper">
+    <select id="blockMerge">
+        select big_area_block(#{jsonArg}, #{systemArg})
+    </select>
+</mapper>

+ 1 - 0
onemap-modules/onemap-spatial/src/main/java/com/onemap/spatial/service/impl/ImageServiceImpl.java

@@ -52,6 +52,7 @@ public class ImageServiceImpl implements IImageService {
 
     @Override
     public String getSensingImage(WktsVo wktsVo) throws Exception {
+        System.out.println("生成图片");
         // 图片保存路径
         String fileDir = rootPath + "/images/" + UUID.randomUUID().toString() + "/";
         File dir = new File(fileDir);

+ 111 - 0
sql/pgsql/0_init.sql

@@ -23,3 +23,114 @@ base."t_fzss_fzxz_factor"
 -- 需要修改的nacos
 -- onemap-spatial-dev.yml
 -- onemap-analyse-dev.yml
+
+-- 添加多地块合并方法
+drop function if exists area_in_range;
+
+CREATE OR REPLACE FUNCTION  area_in_range(jsonarg json, systemarg json)
+RETURNS VARCHAR AS $$
+DECLARE
+sql TEXT;
+    records VARCHAR;
+begin
+execute format('
+	insert into %s
+	with t as(
+	select  array[id] idarray, st_area (st_transform(geom, 3857) ) /2000*3  area, ''%s'' feature , 0.0 weight,geom
+	from %s order by area
+	)
+	select t.* from t where  area between %s and %s
+	limit 3; ', systemarg->>'选址结果',systemarg->>'选址方式',systemarg->>'初步结果',jsonarg->>'面积下限', jsonarg->>'面积上限');
+return 'OK';
+END;
+$$ LANGUAGE plpgsql;
+
+drop function if exists block_merge;
+
+CREATE OR REPLACE FUNCTION  block_merge(jsonarg json , systemarg json)
+RETURNS VARCHAR AS $$
+DECLARE
+sql TEXT;
+    records VARCHAR;
+BEGIN
+with a as(select jsonb(jsonarg) arg),
+     an as (select  regexp_split_to_table( substring('abcdefghijklmnopqrstuvwxyz',1, cast(a.arg->>'小地块最多合并块数' as integer) ), '') alias from a),
+     t1 as ( select  string_agg( an.alias || '.id', ',') idarr,
+                     string_agg( an.alias || '.area' , ' + ') areaarr,
+                     string_agg ('t2 as ' || an.alias , ',') tblarr,
+                     string_agg( an.alias || '.geom', ',' ) geomarr
+             from an),
+     t2 as (select alias, lead(alias) over() n from an ),
+     t3 as ( select string_agg( alias || '.id < ' || n ||'.id', ' and ') cond from t2 where n notnull),
+    in_t1 as (select format('select id, st_area (st_transform(geom, 3857) ) /2000*3  area, geom from %s order by area ', systemarg->>'初步结果' ) t ) ,
+    in_t2 as (select format('select id,area,geom from t1 where area < %s', a.arg->>'面积下限') t from a) ,
+    in_t3 as (select format(
+    'select ARRAY[%s] idarray, %s area ,st_collect(ARRAY[%s]) geom
+        from %s
+        where %s', idarr, areaarr,geomarr , tblarr, cond ) t from t1,t3)
+select
+    format('insert into %s
+	with t1 as (%s),
+		 t2 as (%s),
+		 t3 as(%s)
+	select idarray,area, ''%s'' feature, 0.0 weight, geom from t3
+		where area between %s and %s
+		order by area
+		limit 3',systemarg->>'选址结果',
+           in_t1.t, in_t2.t, in_t3.t,systemarg->>'选址方式',a.arg->>'面积下限',a.arg->>'面积上限'  )  into  sql from in_t1, in_t2, in_t3,a;
+EXECUTE sql;
+return 'OK';
+END;
+$$ LANGUAGE plpgsql;
+
+
+drop function if exists big_area_block;
+CREATE OR REPLACE FUNCTION  big_area_block(jsonarg json, systemarg json)
+RETURNS VARCHAR AS $$
+DECLARE
+sql TEXT;
+    records VARCHAR;
+begin
+execute format('
+insert into %s
+with t as(
+select array[id] idarray, st_area (st_transform(geom, 3857) ) /2000*3  area, ''%s'' feature ,0 weight, geom
+from %s order by area
+)select * from t
+where area > %s order by area limit 3;
+
+with recursive cte(arealimit,tolerance, movedirection, area, grade, movescale, interarea, idarray,width,height,geom,env) as(
+select cast(arg->>''面积上限'' as float8) arealimit, (cast(arg->>''面积上限'' as float8)  - cast(arg->>''面积下限'' as float8) ) / 100.0 tolerance,
+        array[sign(cast(arg->>''截取地块X方位'' as integer)), sign(cast(arg->>''截取地块Y方位'' as integer))] movedirection,   area,
+        1 grade, 0.5::float4 movescale,
+        st_area(st_intersection(st_transform(geom,3857), st_translate(st_envelope(st_transform(geom,3857)), (st_xmax(st_transform(geom,3857)) - st_xmin(st_transform(geom,3857)))*abs(sign(cast(arg->>''截取地块X方位'' as integer)))*0.5,
+                                                        (st_ymax(st_transform(geom,3857)) - st_ymin(st_transform(geom,3857)))*abs(sign(cast(arg->>''截取地块Y方位'' as integer)))*0.5) ) ) *3/2000 interarea ,
+        idarray, (st_xmax(st_transform(geom,3857)) - st_xmin(st_transform(geom,3857))) width,
+	                     (st_ymax(st_transform(geom,3857)) - st_ymin(st_transform(geom,3857))) height,
+	                     st_transform(geom,3857) geom,
+	                     st_envelope(st_transform(geom,3857)) env
+	from vector.选址结果, jsonb(''%s'') arg
+    where feature like ''%s''
+union all
+select arealimit, tolerance, movedirection, area,  grade + 1 grade,
+          movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end)  )::float4  movescale,
+       st_area(st_intersection(geom, st_translate(env,
+            width*(movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end)  )::float4)*movedirection[1],
+            height*(movescale + (1.0/power(2, (grade + 1) )*(case when arealimit < interarea then 1 else -1 end)  )::float4)*movedirection[2])
+           )
+         ) *3/2000 interarea ,
+idarray,width,height,geom,env from cte
+where grade < 16 and abs(interarea - arealimit) > tolerance
+),
+t as(
+select idarray, st_transform( st_collectionextract(  st_intersection(geom, st_translate(env,
+            width*(movescale::float4)*movedirection[1],
+            height*(movescale::float4)*movedirection[2])
+           ) ,3), 4326) geom
+           from cte order by grade DESC limit 1)
+update %s f set geom = t.geom from t
+where  feature like ''%s'' and f.idarray = t.idarray  and t.geom is not null
+', systemarg->>'选址结果',systemarg->>'选址方式', systemarg->>'初步结果', jsonarg->>'面积上限',jsonarg, systemarg->>'选址方式', systemarg->>'选址结果', systemarg->>'选址方式' );
+return 'OK';
+END;
+$$ LANGUAGE plpgsql;