From b9903ead016b8b1aa68eb04b48fca3b53fdab0d3 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期一, 30 十二月 2024 10:42:43 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v4' into master-v4 --- src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 152 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java new file mode 100644 index 0000000..fc0b4f5 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java @@ -0,0 +1,152 @@ +package com.mzl.flower.service.impl.map; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.http.HttpUtil; +import com.google.gson.Gson; +import com.mzl.flower.config.TengxunMapProperties; +import com.mzl.flower.dto.map.gaode.GaodeDistrict; +import com.mzl.flower.dto.map.tengxun.TengxunDistrict; +import com.mzl.flower.dto.map.tengxun.TencentMapResponse; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.service.BaseService; +import com.mzl.flower.service.district.DistrictTengxunService; +import com.mzl.flower.service.map.MapTengxunService; +import com.mzl.flower.utils.ConverterUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@Slf4j +@Service +public class MapTengxunServiceImpl extends BaseService implements MapTengxunService { + + @Autowired + private TengxunMapProperties tengxunMapProperties; + + @Autowired + private DistrictTengxunService districtTengxunService; + + @Override + public void getAdministrativeDivision() { + String administrativeDivisionsUrl = tengxunMapProperties.getAdministrativeDivisionsUrl(); + //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 + HashMap<String, Object> paramMap = new HashMap<>(); + + String result= HttpUtil.get(administrativeDivisionsUrl, paramMap); + System.out.println(result); + // 使用 Gson 解析 JSON 字符串 + Gson gson = new Gson(); + TencentMapResponse response = gson.fromJson(result, TencentMapResponse.class); + + if(response.getStatus()==0){ + + + List<TengxunDistrict> allDistricts = response.getResult(); + // 将腾讯地图返回的数据格式转换成标准的三层结构 + List<TengxunDistrict> formatterDistrict =normalizeTreeToThreeLevels(allDistricts); + + List<TengxunDistrict> allTengxunDistricts = new ArrayList<>(); + // 递归遍历所有的节点,然后把所有节点加入到 allDistricts 列表中 + for (TengxunDistrict tengxunDistrict : formatterDistrict){ + addDistrictToList(tengxunDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null + } + List<DistrictTengxunDO> districtTengxunDOList= ConverterUtil.transList(allTengxunDistricts, DistrictTengxunDO.class); + + districtTengxunService.saveRemoteDistricts(districtTengxunDOList); + + +// for (TengxunDistrict tengxunDistrict : allTengxunDistricts) { +// printDistrictInfo(tengxunDistrict); +// } + + } + + } + + public static List<TengxunDistrict> normalizeTreeToThreeLevels(List<TengxunDistrict> tree) { + List<TengxunDistrict> result = new ArrayList<>(); + for (TengxunDistrict node : tree) { + int depth = getTreeDepth(node); + if(depth<3){ + List<TengxunDistrict> childrenList=new ArrayList<>(); + childrenList.add(node); + + TengxunDistrict tengxunDistrict= new TengxunDistrict(); + BeanUtils.copyProperties(node, tengxunDistrict); + tengxunDistrict.setDistricts(childrenList); + // 虚拟的id、code + tengxunDistrict.setId(tengxunDistrict.getId()+"virtual"); + // 虚拟的层级 + tengxunDistrict.setLevel(-1); + result.add(tengxunDistrict); + continue; + }else{ + result.add(node); + } + + } + return result; + } + + /** + * 遍历树的深度 + * @param node + * @return + */ + private static int getTreeDepth(TengxunDistrict node) { + if (node == null || node.getDistricts() == null || node.getDistricts().isEmpty()) { + return 1; + } + int maxDepth = 0; + for (TengxunDistrict child : node.getDistricts()) { + maxDepth = Math.max(maxDepth, getTreeDepth(child)); + } + return maxDepth + 1; + } + + // 打印区划信息的辅助方法 + public static void printDistrictInfo(TengxunDistrict tengxunDistrict) { + System.out.println("ID: " + tengxunDistrict.getId() + ", 父节点ID: " + tengxunDistrict.getParentId()); + System.out.println("名称: " + tengxunDistrict.getName()); + System.out.println("全称: " + tengxunDistrict.getFullname()); + System.out.println("级别: " + tengxunDistrict.getLevel()); + System.out.println("拼音: " + tengxunDistrict.getPinyin()); + System.out.println("经纬度: " + tengxunDistrict.getTengxunLocation()); + System.out.println("--------------------------"); + } + + + // 递归遍历区划节点,并将它们添加到 allDistricts 列表 + public static void addDistrictToList(TengxunDistrict tengxunDistrict, String parentId, List<TengxunDistrict> allTengxunDistricts) { + // 将腾讯地图返回的id作为code存放到code中 + tengxunDistrict.setCode(tengxunDistrict.getId()); + // 如果name 是空的话,则将fullname赋值给name + if(StringUtils.isBlank(tengxunDistrict.getName())){ + tengxunDistrict.setName(tengxunDistrict.getFullname()); + } + +// tengxunDistrict.setId(IdUtil.simpleUUID()); + // 设置父节点 ID + tengxunDistrict.setParentId(parentId); + + // 将当前区划添加到结果列表 + allTengxunDistricts.add(tengxunDistrict); + + // 递归遍历子区划 + if (tengxunDistrict.getDistricts()!= null) { + for (TengxunDistrict child : tengxunDistrict.getDistricts()) { + addDistrictToList(child, tengxunDistrict.getId(), allTengxunDistricts); // 将当前节点的 ID 作为子节点的父节点 ID + } + } + } + + +} -- Gitblit v1.9.3