当前位置:   article > 正文

获取中国省、市、区数据(调用高德API)_高德地图省市区数据

高德地图省市区数据

一、数据来源:高德开发API(后端调用接口实现数据落库)

行政区域查询-API文档-开发指南-Web服务 API | 高德地图API

二、需要用到的依赖(只附上主要依赖)

      其他依赖:MybatisPlus、SpringBoot、Mysql、Lombok等(你不会没有吧)

  1. <!--请求工具依赖-->
  2. <dependency>
  3. <groupId>com.github.kevinsawicki</groupId>
  4. <artifactId>http-request</artifactId>
  5. <version>5.6</version>
  6. </dependency>
  7. <!--JSON转换依赖-->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>fastjson</artifactId>
  11. <version>1.2.78</version>
  12. </dependency>

三、类封装

第一个,请求结果工具类(方便数据转换):

  1. package icu.liuwisdom.request.util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.github.kevinsawicki.http.HttpRequest;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Component;
  6. import java.util.Map;
  7. /**
  8. * Http请求工具
  9. *
  10. * @author LDB
  11. * @version 1.0
  12. * @date 2022-07-25 15:10
  13. */
  14. @Slf4j
  15. @Component
  16. public class HttpRequestUtil {
  17. /**
  18. * 获取最后请求到的数据
  19. *
  20. * @param request 请求后的结果
  21. * @param c 指定类类型
  22. * @return T
  23. * @author LDB
  24. * @date 2022-07-25
  25. **/
  26. public static <T> T getRequestResult(HttpRequest request, Class<T> c) {
  27. log.info(request.url().toString());
  28. if (!request.ok()) {
  29. log.error(request.message());
  30. }
  31. return JSON.parseObject(request.body(), c);
  32. }
  33. }

第二个(因为我们需要用到一些不变的数据,请求key记得替换成自己的):

  1. package icu.liuwisdom.request.gaode.common;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. /**
  5. * 高德API
  6. *
  7. * @author LDB
  8. * @version 1.0
  9. * @date 2022-07-25 15:52
  10. */
  11. public interface GaoDeApi {
  12. /**
  13. * 接口地址前缀
  14. *
  15. * @author LDB
  16. * @date 2022-07-25 15:53
  17. * @version 1.0
  18. */
  19. String URL = "https://restapi.amap.com/v3/config/district?key=" + GaoDeApi.KEY + "&subdistrict=3&extensions=base&";
  20. /**
  21. * 请求key
  22. *
  23. * @author LDB
  24. * @date 2022-07-25 15:55
  25. * @version 1.0
  26. */
  27. String KEY = "your self key!";
  28. /**
  29. * 省份关键字列表
  30. *
  31. * @author LDB
  32. * @date 2022-07-25 22:20
  33. * @version 1.0
  34. */
  35. List<String> keywords = Arrays.asList(new String[]{"河北省", "山西省", "辽宁省", "吉林省", "黑龙江省", "江苏省", "浙江省", "安徽省", "福建省", "江西省", "山东省", "河南省", "湖北省", "湖南省", "广东省", "海南省", "四川省", "贵州省", "云南省", "陕西省", "甘肃省", "青海省", "台湾省", "内蒙古自治区", "广西壮族自治区", "西藏自治区", "宁夏回族自治区", "新疆维吾尔自治区", "北京市", "天津市", "上海市", "重庆市", "香港特别行政区", "澳门特别行政区"});
  36. }

第三个,实体类(po、vo,需要对照高德API给的数据来)

  1. package icu.liuwisdom.request.gaode;
  2. import lombok.Data;
  3. /**
  4. * 高德数据结果
  5. *
  6. * @author LDB
  7. * @version 1.0
  8. * @date 2022-07-25 15:56
  9. */
  10. @Data
  11. public class GaoResult {
  12. /**
  13. * 返回结果状态值
  14. *
  15. * @author LDB
  16. * @date 2022-07-25 22:12
  17. * @version 1.0
  18. */
  19. private String status;
  20. /**
  21. * 返回状态说明
  22. *
  23. * @author LDB
  24. * @date 2022-07-25 22:12
  25. * @version 1.0
  26. */
  27. private String info;
  28. /**
  29. * 状态码
  30. *
  31. * @author LDB
  32. * @date 2022-07-25 22:12
  33. * @version 1.0
  34. */
  35. private String infocode;
  36. /**
  37. * 查询个数
  38. *
  39. * @author LDB
  40. * @date 2022-07-25 22:29
  41. * @version 1.0
  42. */
  43. private String count;
  44. }
  1. package icu.liuwisdom.request.gaode.vo;
  2. import icu.liuwisdom.request.gaode.GaoResult;
  3. import icu.liuwisdom.request.gaode.po.District;
  4. import icu.liuwisdom.request.gaode.po.Districts;
  5. import icu.liuwisdom.request.gaode.po.Suggestion;
  6. import lombok.Data;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * 区域Vo
  11. *
  12. * @author LDB
  13. * @version 1.0
  14. * @date 2022-07-25 22:28
  15. */
  16. @Data
  17. public class DistrictsVo extends GaoResult {
  18. /**
  19. * 建议结果
  20. *
  21. * @author LDB
  22. * @date 2022-07-25 22:30
  23. * @version 1.0
  24. */
  25. private Suggestion suggestion;
  26. /**
  27. * 行政区列表
  28. *
  29. * @author LDB
  30. * @date 2022-07-25 22:32
  31. * @version 1.0
  32. */
  33. private List<Districts> districts = new ArrayList<>();
  34. }
  1. package icu.liuwisdom.request.gaode.po;
  2. import lombok.Data;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * 建议结果列表
  7. *
  8. * @author LDB
  9. * @version 1.0
  10. * @date 2022-07-25 22:22
  11. */
  12. @Data
  13. public class Suggestion {
  14. /**
  15. * 建议关键字列表
  16. *
  17. * @author LDB
  18. * @date 2022-07-25 22:23
  19. * @version 1.0
  20. */
  21. List<String> keywords = new ArrayList<>();
  22. /**
  23. * 建议城市列表
  24. *
  25. * @author LDB
  26. * @date 2022-07-25 22:23
  27. * @version 1.0
  28. */
  29. List<String> cites = new ArrayList<>();
  30. }
  1. package icu.liuwisdom.request.gaode.po;
  2. import icu.liuwisdom.core.modal.BaseModel;
  3. import lombok.Data;
  4. /**
  5. * 行政区信息
  6. *
  7. * @author LDB
  8. * @version 1.0
  9. * @date 2022-07-25 22:25
  10. */
  11. @Data
  12. public class District extends BaseModel {
  13. /**
  14. * 主键id
  15. *
  16. * @author LDB
  17. * @date 2022-07-25 22:46
  18. * @version 1.0
  19. */
  20. private String id;
  21. /**
  22. * 上级id
  23. *
  24. * @author LDB
  25. * @date 2022-07-25 22:46
  26. * @version 1.0
  27. */
  28. private String parentId;
  29. /**
  30. * 城市编码
  31. *
  32. * @author LDB
  33. * @date 2022-07-25 22:25
  34. * @version 1.0
  35. */
  36. private String cityCode;
  37. /**
  38. * 区域编码
  39. *
  40. * @author LDB
  41. * @date 2022-07-25 22:25
  42. * @version 1.0
  43. */
  44. private String adcode;
  45. /**
  46. * 行政区名称
  47. *
  48. * @author LDB
  49. * @date 2022-07-25 22:26
  50. * @version 1.0
  51. */
  52. private String name;
  53. /**
  54. * 行政区边界坐标点
  55. *
  56. * @author LDB
  57. * @date 2022-07-25 22:26
  58. * @version 1.0
  59. */
  60. private String polyline;
  61. /**
  62. * 区域中心点
  63. *
  64. * @author LDB
  65. * @date 2022-07-25 22:26
  66. * @version 1.0
  67. */
  68. private String center;
  69. /**
  70. * 行政区划级别
  71. * <p>
  72. * <p>
  73. * country:国家 province:省份(直辖市会在province和city显示) city:市(直辖市会在province和city显示) district:区县 street:街道
  74. * <p>
  75. *
  76. * <p>
  77. *
  78. * <p>
  79. *
  80. * <p>
  81. *
  82. * @author LDB
  83. * @date 2022-07-25 22:27
  84. * @version 1.0
  85. */
  86. private String level;
  87. public Districts toVo() {
  88. Districts vo = new Districts();
  89. vo.setId(this.id);
  90. vo.setParentId(this.parentId);
  91. vo.setCityCode(this.cityCode);
  92. vo.setAdcode(this.adcode);
  93. vo.setName(this.name);
  94. vo.setPolyline(this.polyline);
  95. vo.setCenter(this.center);
  96. vo.setLevel(this.level);
  97. return vo;
  98. }
  99. }

  1. package icu.liuwisdom.request.gaode.po;
  2. import icu.liuwisdom.core.modal.BaseModel;
  3. import lombok.Data;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * 行政区信息
  8. *
  9. * @author LDB
  10. * @version 1.0
  11. * @date 2022-07-25 22:25
  12. */
  13. @Data
  14. public class Districts extends BaseModel {
  15. /**
  16. * 主键id
  17. *
  18. * @author LDB
  19. * @date 2022-07-25 22:46
  20. * @version 1.0
  21. */
  22. private String id;
  23. /**
  24. * 上级id
  25. *
  26. * @author LDB
  27. * @date 2022-07-25 22:46
  28. * @version 1.0
  29. */
  30. private String parentId;
  31. /**
  32. * 城市编码
  33. *
  34. * @author LDB
  35. * @date 2022-07-25 22:25
  36. * @version 1.0
  37. */
  38. private String cityCode;
  39. /**
  40. * 区域编码
  41. *
  42. * @author LDB
  43. * @date 2022-07-25 22:25
  44. * @version 1.0
  45. */
  46. private String adcode;
  47. /**
  48. * 行政区名称
  49. *
  50. * @author LDB
  51. * @date 2022-07-25 22:26
  52. * @version 1.0
  53. */
  54. private String name;
  55. /**
  56. * 行政区边界坐标点
  57. *
  58. * @author LDB
  59. * @date 2022-07-25 22:26
  60. * @version 1.0
  61. */
  62. private String polyline;
  63. /**
  64. * 区域中心点
  65. *
  66. * @author LDB
  67. * @date 2022-07-25 22:26
  68. * @version 1.0
  69. */
  70. private String center;
  71. /**
  72. * 行政区划级别
  73. * <p>
  74. * <p>
  75. * country:国家 province:省份(直辖市会在province和city显示) city:市(直辖市会在province和city显示) district:区县 street:街道
  76. * <p>
  77. *
  78. * <p>
  79. *
  80. * <p>
  81. *
  82. * <p>
  83. *
  84. * @author LDB
  85. * @date 2022-07-25 22:27
  86. * @version 1.0
  87. */
  88. private String level;
  89. /**
  90. * 下级行政区列表,包含district元素
  91. *
  92. * @author LDB
  93. * @date 2022-07-25 22:28
  94. * @version 1.0
  95. */
  96. private List<Districts> districts = new ArrayList<>();
  97. public District toPo() {
  98. District po = new District();
  99. po.setId(this.id);
  100. po.setParentId(this.parentId);
  101. po.setAdcode(this.adcode);
  102. po.setCityCode(this.cityCode);
  103. po.setLevel(this.level);
  104. po.setPolyline(this.polyline);
  105. po.setCenter(this.center);
  106. po.setName(this.name);
  107. return po;
  108. }
  109. }

差点忘了,还有一个uuid类

  1. package icu.liuwisdom.utils;
  2. import java.util.UUID;
  3. /**
  4. * UUID工具类
  5. * */
  6. public class IdUtils {
  7. public static String getUUID() {
  8. String id = UUID.randomUUID().toString();
  9. String[] split = id.split("-");
  10. String res = new String();
  11. for (String s : split) {
  12. res += s;
  13. }
  14. return res;
  15. }
  16. }

四、数据库设计

  1. CREATE TABLE `district` (
  2. `id` varchar(32) DEFAULT NULL COMMENT '编号',
  3. `parent_id` varchar(32) DEFAULT NULL COMMENT '上级行政区id',
  4. `city_code` varchar(500) DEFAULT NULL COMMENT '城市编码',
  5. `adcode` varchar(500) DEFAULT NULL COMMENT '区域编码',
  6. `name` varchar(500) DEFAULT NULL COMMENT '行政区名称',
  7. `polyline` varchar(5000) DEFAULT NULL COMMENT '行政区边界坐标点',
  8. `center` varchar(500) DEFAULT NULL COMMENT '区域中心点',
  9. `level` varchar(100) DEFAULT NULL COMMENT '行政区划级别 country:国家 province:省份(直辖市会在province和city显示) city:市(直辖市会在province和city显示) district:区县 street:街道',
  10. `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
  11. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  12. `last_update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
  13. `last_update_time` datetime DEFAULT NULL COMMENT '更新时间',
  14. `remarks` varchar(255) DEFAULT NULL COMMENT '备注信息',
  15. `del_flag` tinyint(4) DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常',
  16. KEY `index_1` (`id`),
  17. KEY `index_2` (`parent_id`),
  18. KEY `index_3` (`parent_id`),
  19. KEY `index_4` (`level`),
  20. KEY `index_5` (`name`)
  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='省份区域信息表';

四、核心代码

好啦,准备工作已经做完了,核心思路就是:按照省份关键字来循环调用接口,将获取到的数据新增到自己的数据库中,因为需要区分上下级关系,所以id由咱自己定!

  1. package icu.liuwisdom.request.gaode.controller;
  2. import com.github.kevinsawicki.http.HttpRequest;
  3. import icu.liuwisdom.core.http.HttpResult;
  4. import icu.liuwisdom.request.gaode.common.GaoDeApi;
  5. import icu.liuwisdom.request.gaode.query.DistrictQuery;
  6. import icu.liuwisdom.request.gaode.service.DistrictService;
  7. import icu.liuwisdom.request.gaode.vo.DistrictsVo;
  8. import icu.liuwisdom.request.util.HttpRequestUtil;
  9. import io.swagger.annotations.Api;
  10. import io.swagger.annotations.ApiOperation;
  11. import lombok.val;
  12. import org.springframework.web.bind.annotation.*;
  13. import javax.annotation.Resource;
  14. /**
  15. * <p>
  16. * 省份区域信息表 前端控制器
  17. * </p>
  18. *
  19. * @author ldb
  20. * @since 2022-07-25
  21. */
  22. @RestController
  23. @Api(tags = "省份区域信息")
  24. @RequestMapping("request/district")
  25. public class DistrictController {
  26. @Resource
  27. DistrictService districtService;
  28. @ApiOperation("请求省市区数据")
  29. @GetMapping("/")
  30. public HttpResult get() {
  31. val city = GaoDeApi.keywords;
  32. for (String c : city) {
  33. DistrictsVo vo = HttpRequestUtil.getRequestResult(HttpRequest.get(GaoDeApi.URL + "keywords=" + c), DistrictsVo.class);
  34. districtService.insert(vo);
  35. }
  36. return HttpResult.ok("获取省市区数据成功");
  37. }
  38. @ApiOperation("获取省市区")
  39. @PostMapping("/tree")
  40. public HttpResult post(@RequestBody DistrictQuery query) {
  41. return HttpResult.ok("获取省市区成功", districtService.tree(query));
  42. }
  43. }
  1. package icu.liuwisdom.request.gaode.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.github.pagehelper.PageHelper;
  5. import icu.liuwisdom.request.gaode.mapper.DistrictMapper;
  6. import icu.liuwisdom.request.gaode.po.District;
  7. import icu.liuwisdom.request.gaode.po.Districts;
  8. import icu.liuwisdom.request.gaode.query.DistrictQuery;
  9. import icu.liuwisdom.request.gaode.service.DistrictService;
  10. import icu.liuwisdom.request.gaode.vo.DistrictsVo;
  11. import icu.liuwisdom.utils.IdUtils;
  12. import lombok.val;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import javax.annotation.Resource;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Objects;
  20. import java.util.stream.Collectors;
  21. /**
  22. * <p>
  23. * 省份区域信息表 服务实现类
  24. * </p>
  25. *
  26. * @author ldb
  27. * @since 2022-07-25
  28. */
  29. @Service
  30. public class DistrictServiceImpl extends ServiceImpl<DistrictMapper, District> implements DistrictService {
  31. @Resource
  32. DistrictMapper mapper;
  33. @Override
  34. @Transactional(rollbackFor = Exception.class)
  35. public void insert(DistrictsVo vo) {
  36. // 请求到的数据为空
  37. if (Objects.isNull(vo)) {
  38. return;
  39. }
  40. // 获取区域信息
  41. List<Districts> districts = vo.getDistricts();
  42. List<Districts> districtList = new ArrayList<>();
  43. // 递归传入父id(所有id都交由用户自行定义)
  44. // 先设置所有一级的区域id
  45. for (Districts district : districts) {
  46. val parentId = IdUtils.getUUID();
  47. district.setId(parentId);
  48. // 如果有子区域,则递归设置
  49. if (!district.getDistricts().isEmpty()) {
  50. injectId(district.getDistricts(), parentId, districtList);
  51. }
  52. districtList.add(district);
  53. }
  54. if (!districtList.isEmpty()) {
  55. List<District> list = districtList.stream().map(val -> val.toPo()).collect(Collectors.toList());
  56. this.saveBatch(list);
  57. }
  58. }
  59. @Override
  60. public List<District> tree(DistrictQuery query) {
  61. PageHelper.startPage(query.getPageNum(), query.getPageSize());
  62. val wrapper = new LambdaQueryWrapper<District>()
  63. .eq(StringUtils.isNotEmpty(query.getId()), District::getId, query.getId())
  64. .eq(StringUtils.isNotEmpty(query.getParentId()), District::getParentId, query.getParentId())
  65. .eq(StringUtils.isNotEmpty(query.getCityCode()), District::getCityCode, query.getCityCode())
  66. .eq(StringUtils.isNotEmpty(query.getAdcode()), District::getAdcode, query.getAdcode())
  67. .like(StringUtils.isNotEmpty(query.getName()), District::getName, query.getName())
  68. .like(StringUtils.isNotEmpty(query.getPolyline()), District::getPolyline, query.getPolyline())
  69. .like(StringUtils.isNotEmpty(query.getCenter()), District::getCenter, query.getCenter())
  70. .eq(StringUtils.isNotEmpty(query.getLevel()), District::getLevel, query.getLevel());
  71. return mapper.selectList(wrapper);
  72. }
  73. /**
  74. * 生成子区域id数据
  75. *
  76. * @param districts 子区域列表
  77. * @param parentId 父id
  78. * @param districtList 要新增的区域数据列表
  79. * @author LDB
  80. * @date 2022-07-25
  81. **/
  82. private void injectId(List<Districts> districts, String parentId, List<Districts> districtList) {
  83. for (Districts district : districts) {
  84. String currentId = IdUtils.getUUID();
  85. district.setId(currentId);
  86. district.setParentId(parentId);
  87. districtList.add(district);
  88. if (!district.getDistricts().isEmpty()) {
  89. injectId(district.getDistricts(), currentId, districtList);
  90. }
  91. }
  92. }
  93. }

五、大功告成⛏

附录-补充信息

  1. package icu.liuwisdom.core.page;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. import lombok.Data;
  5. import java.io.Serializable;
  6. import java.util.List;
  7. /**
  8. * 分页请求对象
  9. *
  10. * @author ldb
  11. * @ClassName PageRequest.java
  12. * @Data 2022-02-19 15:10
  13. */
  14. @Data
  15. @ApiModel("分页请求对象")
  16. public class PageRequest implements Serializable {
  17. @ApiModelProperty("页码")
  18. private int pageNum = 1;
  19. @ApiModelProperty("页数")
  20. private int pageSize = 10;
  21. @ApiModelProperty("关键字")
  22. private String keyword;
  23. @ApiModelProperty("多个状态值,根据多个条件查询时用到 比如:1,2,3")
  24. private String dataStates;
  25. @ApiModelProperty(value = "主表id,一对多分页使用", hidden = true)
  26. private List<String> ids;
  27. }
  1. package icu.liuwisdom.core.http;
  2. import icu.liuwisdom.constant.ErrorCode;
  3. import icu.liuwisdom.constant.SystemConstant;
  4. import icu.liuwisdom.utils.DateUtils;
  5. import io.swagger.annotations.ApiModel;
  6. import io.swagger.annotations.ApiModelProperty;
  7. import lombok.AllArgsConstructor;
  8. import lombok.Data;
  9. import lombok.NoArgsConstructor;
  10. import org.springframework.format.annotation.DateTimeFormat;
  11. import java.time.LocalDateTime;
  12. /**
  13. * 请求结果封装类
  14. *
  15. * @author ldb
  16. * @ClassName HttpResult.java
  17. * @Data 2022-02-19 15:48
  18. */
  19. @Data
  20. @AllArgsConstructor
  21. @NoArgsConstructor
  22. @ApiModel("请求结果封装类")
  23. public class HttpResult<T> {
  24. @ApiModelProperty("响应码")
  25. private int code;
  26. @ApiModelProperty("响应消息")
  27. private String msg;
  28. @ApiModelProperty("响应数据")
  29. private T data;
  30. @ApiModelProperty("响应时间")
  31. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  32. private LocalDateTime time;
  33. public static HttpResult<Boolean> error() {
  34. return error(666, "请求失败");
  35. }
  36. public static HttpResult<Boolean> error(String msg) {
  37. return error(666, msg);
  38. }
  39. public static HttpResult<Boolean> error(int code, String msg) {
  40. return new HttpResult(code, msg, false, LocalDateTime.now());
  41. }
  42. public static HttpResult<Boolean> ok(String msg) {
  43. return new HttpResult(200, msg, true, LocalDateTime.now());
  44. }
  45. public static <D> HttpResult<D> ok(String msg, D data) {
  46. return new HttpResult<D>(200, msg, data, LocalDateTime.now());
  47. }
  48. public static <D> HttpResult<D> ok(D data) {
  49. return new HttpResult<D>(200, "请求成功", data, LocalDateTime.now());
  50. }
  51. public static HttpResult<Boolean> ok() {
  52. return ok("请求成功");
  53. }
  54. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/171896?site
推荐阅读
相关标签
  

闽ICP备14008679号