开发者社区> paascloud> 正文

获取高德地图的四级地址

简介: sql CREATE 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='[]';

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9648 0
一些常用的甘特图示例地址
1、http://www.edogantt.com/project/examples/project.
814 0
函数计算助力高德地图平稳支撑亿级流量高峰
2020 年的“十一出行节”期间,高德地图创造了记录 ——截止 2020 年 10 月 1 日 13 时 27 分 27 秒,高德地图当日活跃用户突破 1 亿,比 2019 年 10 月 1 日提前 3 时 41 分达成此记录。 期间,Serverless 作为其中一个核心技术场景,平稳扛住了流量高峰期的考验。值得一提的是,由 Serverless 支撑的业务在流量高峰期的表现十分优秀,每分钟函数调用量接近两百万次。这再次验证了 Serverless 基础技术的价值,进一步拓展了技术场景。
3523 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20328 0
我的博客地址
我的博客地址: 新浪博客: http://blog.sina.com.cn/u/3483799091  网易博客: http://dicksonjin.blog.
679 0
【百度地图API】当地址解析失败时,如何调用search方法查找地址
原文:【百度地图API】当地址解析失败时,如何调用search方法查找地址 有个朋友问我,当地址解析失败时,应该如何处理呢?比如,他想搜索“南宁市青秀区”。 ----------------------------------------------------------------------------- 首先,我们需要弄明白,地址解析的原理: 使用Geocoder进行地址解析,比如“北京市海淀区上地10街”,当系统匹配到这个地址时,getPoint就会返回一个坐标点。
1213 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18608 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25038 0
获取浏览器的当前页面地址
function URLInfo(sBrowserPrgFile,sServiceName:string;NetScape:boolean;var Title:string):pchar; var     DdeClientConv:TDDEClientConv;     StartPtr,E...
568 0
百度地图根据经纬度获取国家、州市等地址相关信息
这是一个简单的经纬度转换成具体地址信息,支持国际和国内经纬度转换。 效果如下图所示: function xmlToArray2($xml) { // 将XML转为array ...
1424 0
+关注
44
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载