获取高德地图的四级地址

简介: sqlCREATE TABLE `pc_mdc_address` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `...

sql

CREATE TABLE `pc_mdc_address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `pid` bigint(50) NOT NULL COMMENT '父ID',
  `city_code` varchar(50) DEFAULT '' COMMENT '城市编码',
  `ad_code` varchar(50) DEFAULT '' COMMENT '区域编码',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '地址名称',
  `level` tinyint(1) NOT NULL COMMENT '级别(省市区县)',
  `polyline` varchar(255) DEFAULT '' COMMENT '行政区边界坐标点',
  `center` varchar(255) DEFAULT '' COMMENT '城市中心点',
  PRIMARY KEY (`id`),
  KEY `I_PARENT_ID` (`pid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=367047247247843329 DEFAULT CHARSET=utf8;

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Application.class)
public class AddressTest {

    @Resource
    private PcMdcAddressMapper pcMdcAddressMapper;

    public String getCityData() throws IOException {
        String result = null;
        HttpPost httpPost = new HttpPost("http://restapi.amap.com/v3/config/district");
        List<NameValuePair> nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("key", "3c831a5f6d3fbf3820e067f7********"));
        nvps.add(new BasicNameValuePair("keywords", null));
        nvps.add(new BasicNameValuePair("subdistrict", "3"));
        nvps.add(new BasicNameValuePair("extensions", "base"));
        CloseableHttpClient client = HttpClients.createDefault();
        httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
        httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
        CloseableHttpResponse response = client.execute(httpPost);
        //获取结果实体
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            //按指定编码转换结果实体为String类型
            result = EntityUtils.toString(entity, "utf-8");
        }
        return result;
    }

    @Test
    public void saveAddress() throws IOException {
        String json = getCityData();
        Result result = JSON.parseObject(json, Result.class);
        System.out.println(result);
        List<Districts> districts = result.getDistricts();
        // 生成城市数据
        for (Districts district : districts) {
            buildAddressData(district, 0L);
        }
    }

    final SnowflakeIdWorker idg = new SnowflakeIdWorker(2, 31);
    private void buildAddressData(Districts district, Long pid) {
        PcMdcAddress address = new PcMdcAddress();
        BeanUtils.copyProperties(district, address, "level");
        address.setAdCode(district.getAdcode());
        address.setCityCode(district.getCitycode());
        String level = district.getLevel();
        if ("country".equals(level)) {
            address.setLevel(0);
        } else if ("province".equals(level)) {
            address.setLevel(1);
        } else if ("city".equals(level)) {
            address.setLevel(2);
        } else if ("district".equals(level)) {
            address.setLevel(3);
        } else if ("street".equals(level)) {
            address.setLevel(4);
        } else {
            throw new RuntimeException("数据异常");
        }
        long id = idg.nextId();
        address.setId(id);
        address.setPid(pid);
        pcMdcAddressMapper.insert(address);
        System.out.println(district.getCitycode() + "," + district.getName());
        List<Districts> districts1 = district.getDistricts();
        for (Districts districts2 : districts1) {
            buildAddressData(districts2, id);
        }
    }

数据实体类

@Data
public class Districts {
    private String citycode;
    private String adcode;
    private String name;
    private String polyline;
    private String center;
    private String level;
    /**
     * The Districts.
     */
    List<Districts> districts;
}
@Data
public class Result {
    private String status;
    private String info;
    private String infocode;
    private String count;
    private Suggestion suggestion;
    private List<Districts> districts;
}
@Data
public class Suggestion {
    private String[] keywords;
    private String[] cities;
}

雪花算法

package tk.mybatis.springboot.util;

/**
 * The class Snowflake id worker.
 * Created by paascloud.net@gmail.com
 */
public class SnowflakeIdWorker {
    // ==============================Fields===========================================
    /**
     * 开始时间截 (2015-01-01)
     */
    private final long twepoch = 1420041600000L;

    /**
     * 机器id所占的位数
     */
    private final long workerIdBits = 5L;

    /**
     * 数据标识id所占的位数
     */
    private final long datacenterIdBits = 5L;

    /**
     * 支持的最大机器id, 结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
     */
    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

    /**
     * 支持的最大数据标识id, 结果是31
     */
    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

    /**
     * 序列在id中占的位数
     */
    private final long sequenceBits = 12L;

    /**
     * 机器ID向左移12位
     */
    private final long workerIdShift = sequenceBits;

    /**
     * 数据标识id向左移17位(12+5)
     */
    private final long datacenterIdShift = sequenceBits + workerIdBits;

    /**
     * 时间截向左移22位(5+5+12)
     */
    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    /**
     * 生成序列的掩码, 这里为4095 (0b111111111111=0xfff=4095)
     */
    private final long sequenceMask = -1L ^ (-1L << sequenceBits);

    /**
     * 工作机器ID(0~31)
     */
    private long workerId;

    /**
     * 数据中心ID(0~31)
     */
    private long datacenterId;

    /**
     * 毫秒内序列(0~4095)
     */
    private long sequence = 0L;

    /**
     * 上次生成ID的时间截
     */
    private long lastTimestamp = -1L;

    //==============================Constructors=====================================

    /**
     * 构造函数
     *
     * @param workerId     工作ID (0~31)
     * @param datacenterId 数据中心ID (0~31)
     */
    public SnowflakeIdWorker(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    // ==============================Methods==========================================

    /**
     * 获得下一个ID (该方法是线程安全的)
     *
     * @return SnowflakeId long
     */
    public synchronized long nextId() {
        long timestamp = timeGen();

        //如果当前时间小于上一次ID生成的时间戳, 说明系统时钟回退过这个时候应当抛出异常
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(
                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        //如果是同一时间生成的, 则进行毫秒内序列
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            //毫秒内序列溢出
            if (sequence == 0) {
                //阻塞到下一个毫秒,获得新的时间戳
                timestamp = tilNextMillis(lastTimestamp);
            }
        }
        //时间戳改变, 毫秒内序列重置
        else {
            sequence = 0L;
        }

        //上次生成ID的时间截
        lastTimestamp = timestamp;

        //移位并通过或运算拼到一起组成64位的ID
        return ((timestamp - twepoch) << timestampLeftShift) //
                | (datacenterId << datacenterIdShift) //
                | (workerId << workerIdShift) //
                | sequence;
    }

    /**
     * 阻塞到下一个毫秒, 直到获得新的时间戳
     *
     * @param lastTimestamp 上次生成ID的时间截
     *
     * @return 当前时间戳
     */
    private long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    /**
     * 返回以毫秒为单位的当前时间
     *
     * @return 当前时间(毫秒)
     */
    private long timeGen() {
        return System.currentTimeMillis();
    }
}

数据库对应实体

@Data
@Table(name = "pc_mdc_address")
public class PcMdcAddress {
    /**
     * ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 地址名称
     */
    private String name;

    /**
     * 父ID
     */
    private Long pid;

    /**
     * 城市编码
     */
    @Column(name = "city_code")
    private String cityCode;

    /**
     * 级别(省市区县)
     */
    private Integer level;

    /**
     * 区域编码
     */
    @Column(name = "ad_code")
    private String adCode;

    /**
     * 行政区边界坐标点
     */
    private String polyline;

    /**
     * 城市中心点
     */
    private String center;
}

Mapper

public interface StudentMapper extends MyMapper<Student> {
}

Mapper.xml

<?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="tk.mybatis.springboot.mapper.PcMdcAddressMapper" >
  <resultMap id="BaseResultMap" type="tk.mybatis.springboot.model.PcMdcAddress" >
    <!--
      WARNING - @mbg.generated
    -->
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="pid" property="pid" jdbcType="BIGINT" />
    <result column="city_code" property="cityCode" jdbcType="VARCHAR" />
    <result column="level" property="level" jdbcType="INTEGER" />
    <result column="ad_code" property="adCode" jdbcType="VARCHAR" />
    <result column="polyline" property="polyline" jdbcType="VARCHAR" />
    <result column="center" property="center" jdbcType="VARCHAR" />
  </resultMap>
</mapper>
update pc_mdc_address set city_code='' where city_code='[]';

留个草稿, 以备不时之需, 代码有点小问题 就是一个空数组的问题

目录
相关文章
VOS3000 AXB功能使用说明
VOS AXB 模块适用于语音市场直连运营商或虚拟运营商 X 号平台的业务需求 与 VOS 系统无缝集成,无需独立服务器部署,节约硬件,网络成本 单机支持不低于 2,000 并发 AXB 呼叫,性能是市面常见 AXB 产品的 2-3 倍 支持设定在呼叫接通后任意时间提前解绑,释放 X 号码资源,无需等到呼叫挂断后释放,大幅提高 X 号码利用率 提供完备的 AXB 计费策略与报表输出,兼容全类型运营商小号接口,保障业务能够平稳开展,持久运营
1710 0
|
Python Windows
JetBrains 插件市场安装 Cloud Toolkit
通过 JetBrains 插件市场安装 Alibaba Cloud Toolkit
54310 0
JetBrains 插件市场安装 Cloud Toolkit
|
人工智能 关系型数据库 BI
算术逻辑单元ALU
算术逻辑单元ALU
3110 0
全国行政区划代码与经纬度查询免费API接口教程
该接口提供全国各行政区划代码及经纬度查询服务。通过POST或GET请求,输入用户ID、KEY及地点名称,可获取地区代码、省份、市级、区县级名称及经纬度等信息。示例URL:https://cn.apihz.cn/api/other/xzqhdm.php?id=88888888&key=88888888&sheng=北京&place=北京。返回数据包含状态码、信息提示及查询结果。
1798 14
|
JavaScript 前端开发 Java
Vue 3.3 + Vite 4.3 + TypeScript 5+ Element-Plus:从零到一构建企业级后台管理系统(前后端开源)(一)
Vue 3.3 + Vite 4.3 + TypeScript 5+ Element-Plus:从零到一构建企业级后台管理系统(前后端开源)(一)
|
消息中间件 存储 监控
解析RocketMQ:高性能分布式消息队列的原理与应用
RocketMQ是阿里开源的高性能分布式消息队列,具备低延迟、高吞吐和高可靠性,广泛应用于电商、金融等领域。其核心概念包括Topic、Producer、Consumer、Message和Name Server/Broker。RocketMQ支持异步通信、系统解耦、异步处理和流量削峰。关键特性有分布式架构、顺序消息、高可用性设计和消息事务。提供发布/订阅和点对点模型,以及消息过滤功能。通过集群模式、存储方式、发送和消费方式的选择进行性能优化。RocketMQ易于部署,可与Spring集成,并与Kafka等系统对比各有优势,拥有丰富的生态系统。
1316 4
|
移动开发 小程序 API
uniapp组件库SwipeAction 滑动操作 使用方法
uniapp组件库SwipeAction 滑动操作 使用方法
684 1
|
运维 Kubernetes 应用服务中间件
ACS(Alibaba Cloud
容器计算服务 ACS(Alibaba Cloud Container Compute Service)是阿里云提供的一种基于容器技术的计算服务,它以 Kubernetes 为使用界面,提供符合容器规范的算力资源,采用 Serverless 形态的算力交付模式。ACS 的主要目标是降低 Kubernetes 的使用和运维复杂度,解决资源和容器割裂的问题,帮助客户更好地利用云所带来的技术红利。
504 1
|
移动开发 JavaScript 小程序
uView SwipeAction 滑动单元格
uView SwipeAction 滑动单元格
371 0
|
数据库
vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?
vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?