Browse Source

1、新增城市监测接口
2、新增建成区扩张接口

ywf 3 months ago
parent
commit
8aa77d9fe1

+ 40 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/controller/yzt/UrbanMonitorController.java

@@ -0,0 +1,40 @@
+package com.onemap.apply.controller.yzt;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.onemap.common.core.web.domain.RequestResult;
+import com.onemap.apply.domain.yzt.UrbanMonitorVO;
+import com.onemap.apply.service.yzt.IUrbanMonitorService;
+
+@RestController
+@RequestMapping("/yzt/urbanMonitor")
+public class UrbanMonitorController {
+
+    @Autowired
+    private IUrbanMonitorService urbanMonitorService;
+
+    /**
+     * 获取城市监测数据
+     * 
+     * @param type buildUp_area(建成区面积) / building_area(建筑面积) / building_count(建筑数量)
+     * @param code 区域代码
+     */
+    @GetMapping("/getUrbanInfo")
+    public RequestResult getUrbanInfo(String type, String code) {
+        List<UrbanMonitorVO> list = urbanMonitorService.selectUrbanMonitorList(type, code);
+        return RequestResult.success(list);
+    }
+
+    /**
+     * 获取城市扩张图层配置
+     * 
+     * @param dimType 2d/3d
+     */
+    @GetMapping("/getUrbanExpansionInfo")
+    public RequestResult getUrbanExpansionInfo(String dimType) {
+        return RequestResult.success(urbanMonitorService.getUrbanExpansionConfig(dimType));
+    }
+}

+ 35 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/yzt/UrbanExpansionConfigVO.java

@@ -0,0 +1,35 @@
+package com.onemap.apply.domain.yzt;
+
+import lombok.Data;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 城市扩张配置响应VO
+ */
+@Data
+public class UrbanExpansionConfigVO {
+    /** 服务ID */
+    private String serviceId;
+    /** 年份列表 */
+    private List<Integer> years;
+    /** 边界图层: {"2009": {"layerName": "xxx", "data": 125.36}} */
+    private Map<String, LayerInfo> boundaryLayers;
+    /** 扩张图层: {"2009_2010": {"layerName": "xxx", "data": 7.22}} */
+    private Map<String, LayerInfo> expandLayers;
+
+    @Data
+    public static class LayerInfo {
+        private String layerName;
+        private BigDecimal data;
+
+        public LayerInfo() {
+        }
+
+        public LayerInfo(String layerName, BigDecimal data) {
+            this.layerName = layerName;
+            this.data = data;
+        }
+    }
+}

+ 25 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/yzt/UrbanExpansionLayerVO.java

@@ -0,0 +1,25 @@
+package com.onemap.apply.domain.yzt;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * 城市扩张图层配置VO
+ */
+@Data
+public class UrbanExpansionLayerVO {
+    /** 年份 */
+    private Integer year;
+    /** 图层类型: boundary-边界, expand-扩张 */
+    private String layerType;
+    /** 维度类型: 2d/3d */
+    private String dimType;
+    /** 图层名称 */
+    private String layerName;
+    /** 上一年份(扩张图层使用) */
+    private Integer prevYear;
+    /** 数据(面积或数量) */
+    private BigDecimal data;
+    /** 服务ID */
+    private String serviceId;
+}

+ 11 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/domain/yzt/UrbanMonitorVO.java

@@ -0,0 +1,11 @@
+package com.onemap.apply.domain.yzt;
+
+import lombok.Data;
+
+@Data
+public class UrbanMonitorVO {
+
+    private double data;
+    private double changeRate;
+    private Integer year;
+}

+ 26 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/mapper/yzt/UrbanMonitorMapper.java

@@ -0,0 +1,26 @@
+package com.onemap.apply.mapper.yzt;
+
+import com.onemap.apply.domain.yzt.UrbanMonitorVO;
+import com.onemap.apply.domain.yzt.UrbanExpansionLayerVO;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+/**
+ * 城市监测Mapper接口
+ */
+public interface UrbanMonitorMapper {
+    /**
+     * 查询城市监测列表
+     * 
+     * @param type buildUp_area/building_area/building_count
+     * @param code 区域代码
+     */
+    public List<UrbanMonitorVO> selectUrbanMonitorList(@Param("type") String type, @Param("code") String code);
+
+    /**
+     * 查询城市扩张图层配置
+     * 
+     * @param dimType 维度类型: 2d/3d
+     */
+    public List<UrbanExpansionLayerVO> selectUrbanExpansionList(@Param("dimType") String dimType);
+}

+ 120 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/impl/yzt/UrbanMonitorServiceImpl.java

@@ -0,0 +1,120 @@
+package com.onemap.apply.service.impl.yzt;
+
+import java.util.List;
+import java.util.Map;
+import java.util.LinkedHashMap;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.onemap.apply.mapper.yzt.UrbanMonitorMapper;
+import com.onemap.apply.domain.yzt.UrbanMonitorVO;
+import com.onemap.apply.domain.yzt.UrbanExpansionLayerVO;
+import com.onemap.apply.domain.yzt.UrbanExpansionConfigVO;
+import com.onemap.apply.service.yzt.IUrbanMonitorService;
+
+/**
+ * 城市监测Service业务层处理
+ */
+@Service
+public class UrbanMonitorServiceImpl implements IUrbanMonitorService {
+    @Autowired
+    private UrbanMonitorMapper urbanMonitorMapper;
+
+    /**
+     * 查询城市监测列表
+     * 
+     * @param type buildUp_area/building_area/building_count
+     * @param code 区域代码
+     */
+    public List<UrbanMonitorVO> selectUrbanMonitorList(String type, String code) {
+        // 如果行政码是6位,且后两位为00,则查询全市(设为null不进行过滤)
+        if (code != null && code.length() == 6 && code.endsWith("00")) {
+            code = null;
+        }
+        List<UrbanMonitorVO> list = urbanMonitorMapper.selectUrbanMonitorList(type, code);
+        return calculateChangeRate(list);
+    }
+
+    /**
+     * 获取城市扩张图层配置
+     * 
+     * @param dimType 维度类型: 2d/3d
+     */
+    @Override
+    public UrbanExpansionConfigVO getUrbanExpansionConfig(String dimType) {
+        // 默认为 2d
+        if (dimType == null || dimType.isEmpty()) {
+            dimType = "2d";
+        }
+
+        List<UrbanExpansionLayerVO> list = urbanMonitorMapper.selectUrbanExpansionList(dimType);
+
+        UrbanExpansionConfigVO config = new UrbanExpansionConfigVO();
+        List<Integer> years = new ArrayList<>();
+        Map<String, UrbanExpansionConfigVO.LayerInfo> boundaryLayers = new LinkedHashMap<>();
+        Map<String, UrbanExpansionConfigVO.LayerInfo> expandLayers = new LinkedHashMap<>();
+
+        if (list != null && !list.isEmpty()) {
+            config.setServiceId(list.get(0).getServiceId());
+            // 提取年份并去重排序
+            years = list.stream()
+                    .map(UrbanExpansionLayerVO::getYear)
+                    .distinct()
+                    .sorted()
+                    .collect(Collectors.toList());
+
+            for (UrbanExpansionLayerVO item : list) {
+                UrbanExpansionConfigVO.LayerInfo info = new UrbanExpansionConfigVO.LayerInfo(item.getLayerName(),
+                        item.getData());
+
+                if ("boundary".equals(item.getLayerType())) {
+                    // key is year string
+                    boundaryLayers.put(String.valueOf(item.getYear()), info);
+                } else if ("expand".equals(item.getLayerType())) {
+                    // key is prevYear_year
+                    if (item.getPrevYear() != null) {
+                        String key = item.getPrevYear() + "_" + item.getYear();
+                        expandLayers.put(key, info);
+                    }
+                }
+            }
+        }
+
+        config.setYears(years);
+        config.setBoundaryLayers(boundaryLayers);
+        config.setExpandLayers(expandLayers);
+
+        return config;
+    }
+
+    /**
+     * 计算变化率
+     */
+    private List<UrbanMonitorVO> calculateChangeRate(List<UrbanMonitorVO> list) {
+        if (list == null || list.isEmpty()) {
+            return list;
+        }
+
+        for (int i = 0; i < list.size(); i++) {
+            UrbanMonitorVO current = list.get(i);
+            if (i == 0) {
+                current.setChangeRate(0);
+                continue;
+            }
+
+            UrbanMonitorVO prev = list.get(i - 1);
+            double prevData = prev.getData();
+
+            if (prevData == 0) {
+                current.setChangeRate(0);
+            } else {
+                double rate = (current.getData() - prevData) / prevData * 100;
+                rate = Math.round(rate * 100.0) / 100.0;
+                current.setChangeRate(rate);
+            }
+        }
+
+        return list;
+    }
+}

+ 25 - 0
onemap-modules/onemap-apply/src/main/java/com/onemap/apply/service/yzt/IUrbanMonitorService.java

@@ -0,0 +1,25 @@
+package com.onemap.apply.service.yzt;
+
+import java.util.List;
+import com.onemap.apply.domain.yzt.UrbanMonitorVO;
+import com.onemap.apply.domain.yzt.UrbanExpansionConfigVO;
+
+/**
+ * 城市监测Service接口
+ */
+public interface IUrbanMonitorService {
+    /**
+     * 查询城市监测列表
+     * 
+     * @param type buildUp_area/building_area/building_count
+     * @param code 区域代码
+     */
+    public List<UrbanMonitorVO> selectUrbanMonitorList(String type, String code);
+
+    /**
+     * 获取城市扩张图层配置
+     * 
+     * @param dimType 维度类型: 2d/3d
+     */
+    public UrbanExpansionConfigVO getUrbanExpansionConfig(String dimType);
+}

+ 66 - 0
onemap-modules/onemap-apply/src/main/resources/mapper/postgresql/yzt/UrbanMonitorMapper.xml

@@ -0,0 +1,66 @@
+<?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.apply.mapper.yzt.UrbanMonitorMapper">
+    
+    <resultMap type="com.onemap.apply.domain.yzt.UrbanMonitorVO" id="UrbanMonitorResult">
+        <result property="year"    column="year"    />
+        <result property="data"    column="data"    />
+    </resultMap>
+
+    <!-- 
+        查询城市监测列表
+        type: buildUp_area(建成区面积) / building_area(建筑面积) / building_count(建筑数量)
+        数据库 jc_urban: type=0 建筑信息, type=1 建成区
+    -->
+    <select id="selectUrbanMonitorList" resultMap="UrbanMonitorResult">
+        SELECT 
+            "year",
+            <choose>
+                <when test="type == 'building_count'">
+                    COUNT(*) as data
+                </when>
+                <otherwise>
+                    SUM(area) as data
+                </otherwise>
+            </choose>
+        FROM "vector"."jc_urban"
+        WHERE 1=1
+        <choose>
+            <when test="type == 'buildUp_area'">
+                AND type = 1
+            </when>
+            <otherwise>
+                AND type = 0
+            </otherwise>
+        </choose>
+        <if test="code != null and code != ''">
+            AND trim(code) = trim(#{code})
+        </if>
+        GROUP BY "year"
+        ORDER BY "year" ASC
+    </select>
+
+    
+    <resultMap type="com.onemap.apply.domain.yzt.UrbanExpansionLayerVO" id="UrbanExpansionLayerResult">
+        <result property="year"       column="year"       />
+        <result property="layerType"  column="layer_type" />
+        <result property="dimType"    column="dim_type"   />
+        <result property="layerName"  column="layer_name" />
+        <result property="prevYear"   column="prev_year"  />
+        <result property="data"       column="data"       />
+        <result property="serviceId"  column="service_id" />
+    </resultMap>
+
+    <select id="selectUrbanExpansionList" resultMap="UrbanExpansionLayerResult">
+        SELECT 
+            year, layer_type, dim_type, layer_name, prev_year, data, service_id
+        FROM "vector"."jc_urban_expansion"
+        WHERE status = 1 
+        <if test="dimType != null and dimType != ''">
+            AND dim_type = #{dimType}
+        </if>
+        ORDER BY sort_order ASC, year ASC
+    </select>
+</mapper>