说明
- 从阿里云 GeoJson 资源地址获取指定省、市、区县的行政区划数据并解析
参考
参考 「fast-module-basic-mock-core」模块中 org.jeecg.modules.mock.service.DepartDataService
代码示例
引入依赖
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.0</version> </dependency>
|
java 部分代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| public static final String CHINA_DEPART_AREA_1_URL = "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json"; public static final String CHINA_DEPART_AREA_2_URL = "https://geo.datav.aliyun.com/areas_v3/bound/SHENG_CODE0000_full.json"; public static final String CHINA_DEPART_AREA_3_URL = "https://geo.datav.aliyun.com/areas_v3/bound/SHI_CODE00_full.json";
@Transactional(rollbackFor = Exception.class) public Result<?> initSysDepartAreaData(String orgCode) { Integer deptLevel = MockConstant.getDeptLevel(orgCode); if(!deptLevel.equals(MockConstant.DEPT_LEVEL_1)) { Result.error("请输入省级机构编码"); }
initData(orgCode, MockConstant.DEPT_LEVEL_1);
initData(orgCode, MockConstant.DEPT_LEVEL_2);
List<SysDepartArea> sysDepartChinasShi = sysDepartAreaService.list(new LambdaQueryWrapper<SysDepartArea>() .likeRight(SysDepartArea::getSysCode, orgCode) .ne(SysDepartArea::getSysCode, orgCode) .select(SysDepartArea::getSysCode)); for (SysDepartArea departShi : sysDepartChinasShi) { initData(departShi.getSysCode(), MockConstant.DEPT_LEVEL_3); }
return Result.OK(String.format("行政区划数据初始化完成,共计 %s 条", sysDepartAreaService.count())); }
public void initData(String orgCode, Integer deptLevel) { ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = null; try { if(MockConstant.DEPT_LEVEL_1.equals(deptLevel)) { rootNode = objectMapper.readTree(new URL(CHINA_DEPART_AREA_1_URL)); } else if(MockConstant.DEPT_LEVEL_2.equals(deptLevel)) { rootNode = objectMapper.readTree(new URL(CHINA_DEPART_AREA_2_URL.replace("SHENG_CODE", orgCode))); } else if(MockConstant.DEPT_LEVEL_3.equals(deptLevel)) { rootNode = objectMapper.readTree(new URL(CHINA_DEPART_AREA_3_URL.replace("SHI_CODE", orgCode))); }
JsonNode features = rootNode.get("features"); for (JsonNode feature : features) { JsonNode properties = feature.get("properties"); String name = String.valueOf(properties.get("name")); name = name.substring(1, name.length() - 1); if(StrUtil.isBlank(name)) { continue; }
JsonNode adcode = properties.get("adcode"); String level = String.valueOf(properties.get("level")); level = level.substring(1, level.length() - 1);
String sysCode = null; if("province".equals(level)){ deptLevel = MockConstant.DEPT_LEVEL_1; } else if("city".equals(level)){ deptLevel = MockConstant.DEPT_LEVEL_2; } else if("district".equals(level)){ deptLevel = MockConstant.DEPT_LEVEL_3; } sysCode = MockConstant.getCode(Long.valueOf(String.valueOf(adcode)).longValue(), deptLevel);
JsonNode center = properties.get("center"); String centerPoint = center.get(1) + "," + center.get(0);
JsonNode geometry = feature.get("geometry"); JsonNode coordinates = geometry.get("coordinates"); System.out.println(name + "有【" + coordinates.size() + "】个区域");
boolean izMatch = false; boolean izSave = true; if(MockConstant.DEPT_LEVEL_1.equals(deptLevel)) { if(orgCode.equals(sysCode)) { izMatch = true; izSave = true; } else { izSave = false; } }
if(izSave) { int count = 1; for (JsonNode coordinate : coordinates) { List<String> pointList = new ArrayList<>(); if(coordinate.size() == 1) { JsonNode points = coordinate.get(0); for (JsonNode point : points) { pointList.add(point.get(1) + "," + point.get(0)); } } else { for (JsonNode point : coordinate) { pointList.add(point.get(1) + "," + point.get(0)); } }
SysDepartArea sysDepartArea = new SysDepartArea(); sysDepartArea.setSysCode(sysCode); sysDepartArea.setName(name); sysDepartArea.setOrderNum(count++); String point = centerPoint + ";" + pointList.stream().collect(Collectors.joining("#")); sysDepartArea.setPoint(point); sysDepartAreaService.saveWithGeoPolygon(sysDepartArea, point); } }
if(izMatch) { break; } } } catch (IOException e) { e.printStackTrace(); } }
|