• 通过Node.js获取高德的省市区数据并插入数据库


    1 创建秘钥

    1.1 登录高德地图开放平台

    打开开放平台地址

    注册账号申请账后

    1.2 创建应用

    在这里插入图片描述

    1.3 绑定服务创建秘钥

    在这里插入图片描述
    在这里插入图片描述

    2 获取数据并插入

    将使用高德地图API https://restapi.amap.com/v3/config/district?parameters进行行政区域查询,API详细文档可看官方说明

    2.1 创建数据库连接工具

    const mysql = require('mysql');
    
    const pool = mysql.createPool({
      host: 'XXX',
      port: '3306',
      database: 'XXX',
      user: 'user',
      password: 'password',
    });
    function query(sql, data = {}) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err1, connection) {
          if (err1) {
            reject(err1);
          }
          connection.query(sql, data, function (err2, rows) {
            connection.release();
            if (err2) {
              reject(err2);
            } else {
              resolve(rows);
            }
          });
        });
      });
    }
    
    • 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

    2.2 请求数据

    const requestUrl = "https://restapi.amap.com/v3/config/district"
    const secretKey = "高德地图上的秘钥"
    // 仅获取到区级
      const url = `${requestUrl}?keywords=中国&subdistrict=3&key=${secretKey}`
    
      let { data } = await axios.get(encodeURI(url))
      if (
        !data.districts ||
        data.districts.length !== 1 ||
        data.districts[0].name !== "中华人民共和国"
      )
        throw Error("数据获取失败")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.3 数据处理

    for (const province of data.districts[0].districts) {
      // 排除香港、台湾、澳门。台湾、香港、澳门的数据具有一定的问题,台湾省下无具体市区(县)等行政单位,香港和澳门特别行政区仅有两级行政单位。
      if(["810000", "710000", "820000"].includes(province.adcode)) continue;
      let provinceData:Line = {
        address_code: province.adcode,
        address_name: province.name,
        parent_address_code: "0",
        create_time:new Date().getTime().toString(),
      }
      await sqlCommand('insert into t_address set ?', provinceData);
      for (const city of province.districts) {
        let cityData:Line = {
          address_code: city.adcode,
          address_name: city.name,
          parent_address_code: province.adcode,
          create_time:new Date().getTime().toString()
        }
    
        await sqlCommand('insert into t_address set ?', cityData);
        for (const area of city.districts) {
          let areaData:Line = {
            address_code: area.adcode,
            address_name: area.name,
            parent_address_code: city.adcode,
            create_time:new Date().getTime().toString()
          }
          await sqlCommand('insert into t_address set ?', areaData);
        }
      }
      console.log(`${province.name}数据插入完成`)
    }
    
    • 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

    2.4 全部代码

    import axios from "axios"
    import mysql from "mysql"
    export type Line = {
      address_code: string
      address_name: string
      parent_address_code: string
      create_time: string
    }
    const requestUrl = "https://restapi.amap.com/v3/config/district"
    const secretKey = "获取到的秘钥"
    const pool = mysql.createPool({
      host: "XXX",
      port: "3306",
      database: "XXX",
      user: "user",
      password: "password",
    });
    
    function sqlCommand(sql, data = {}) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err1, connection) {
          if (err1) {
            reject(err1);
          }
          connection.query(sql, data, function (err2, rows) {
            connection.release();
            if (err2) {
              reject(err2);
            } else {
              resolve(rows);
            }
          });
        });
      });
    }
    async function main() {
      // 仅获取到:1.省级,2.市级,3.区级
      const url = `${requestUrl}?keywords=中国&subdistrict=3&key=${secretKey}`
      let { data } = await axios.get(encodeURI(url))
      if (
        !data.districts ||
        data.districts.length !== 1 ||
        data.districts[0].name !== "中华人民共和国"
      )
        throw Error("数据获取失败")
      for (const province of data.districts[0].districts) {
        // 排除香港、台湾、澳门。台湾、香港、澳门的数据具有一定的问题,台湾省下无具体市区(县)等行政单位,香港和澳门特别行政区仅有两级行政单位。
        console.time(province.name)
        if(["810000", "710000", "820000"].includes(province.adcode)) continue;
        let provinceData:Line = {
          address_code: province.adcode,
          address_name: province.name,
          parent_address_code: "0",
          create_time:new Date().getTime().toString(),
        }
        await sqlCommand('insert into t_address set ?', provinceData);
        for (const city of province.districts) {
          let cityData:Line = {
            address_code: city.adcode,
            address_name: city.name,
            parent_address_code: province.adcode,
            create_time:new Date().getTime().toString()
          }
          await sqlCommand('insert into t_address set ?', cityData);
          for (const area of city.districts) {
            let areaData:Line = {
              address_code: area.adcode,
              address_name: area.name,
              parent_address_code: city.adcode,
              create_time:new Date().getTime().toString()
            }
            await sqlCommand('insert into t_address set ?', areaData);
          }
        }
        console.timeEnd(province.name)
      }
      console.log("所有数据处理完毕")
    }
    main()
    
    
    • 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

    3 还可以打印文件到本地

    import axios from "axios"
    import mysql from "mysql"
    export type Line = {
      address_code: string
      address_name: string
      parent_address_code: string
      create_time: string
    }
    const requestUrl = "https://restapi.amap.com/v3/config/district"
    const secretKey = "获取到的秘钥"
    const pool = mysql.createPool({
      host: "XXX",
      port: "3306",
      database: "XXX",
      user: "user",
      password: "password",
    });
    function sqlCommand(sql, data = {}) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err1, connection) {
          if (err1) {
            reject(err1);
          }
          connection.query(sql, data, function (err2, rows) {
            connection.release();
            if (err2) {
              reject(err2);
            } else {
              resolve(rows);
            }
          });
        });
      });
    }
    // 打印JSON到根目录
    function writeToJson(fileName: string, data: any) {
      if (!fs.existsSync(resolve(process.cwd(), "dist"))) {
        fs.mkdirSync(resolve(process.cwd(), "dist"));
      }
      const path = resolve(process.cwd(), "dist", fileName);
      return fs.writeFileSync(path, JSON.stringify(data));
    }
    async function main() {
      // 仅获取到:1.省级,2.市级,3.区级
      const url = `${requestUrl}?keywords=中国&subdistrict=3&key=${secretKey}`;
      let { data } = await axios.get(encodeURI(url));
      const datas = [];
      if (
        !data.districts ||
        data.districts.length !== 1 ||
        data.districts[0].name !== "中华人民共和国"
      )
        throw Error("数据获取失败");
      for (const province of data.districts[0].districts) {
        // 排除香港、台湾、澳门。台湾、香港、澳门的数据具有一定的问题,台湾省下无具体市区(县)等行政单位,香港和澳门特别行政区仅有两级行政单位。
        console.time(province.name);
        if (["810000", "710000", "820000"].includes(province.adcode)) continue;
        let provinceData: Line = {
          address_code: province.adcode,
          address_name: province.name,
          parent_address_code: "0",
          create_time: new Date().getTime().toString(),
        };
        await sqlCommand("insert into t_address set ?", provinceData);
        datas.push(provinceData);
        for (const city of province.districts) {
          let cityData: Line = {
            address_code: city.adcode,
            address_name: city.name,
            parent_address_code: province.adcode,
            create_time: new Date().getTime().toString(),
          };
          await sqlCommand("insert into t_address set ?", cityData);
          datas.push(cityData);
          for (const area of city.districts) {
            let areaData: Line = {
              address_code: area.adcode,
              address_name: area.name,
              parent_address_code: city.adcode,
              create_time: new Date().getTime().toString(),
            };
            await sqlCommand("insert into t_address set ?", areaData);
            datas.push(areaData);
          }
        }
        console.timeEnd(province.name);
      }
      writeToJson("mapData", datas);
      console.log("所有数据处理完毕");
    }
    main();
    
    • 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
  • 相关阅读:
    不做静态化,当部署到服务器上的项目刷新出现404【已解决】
    Go 语言 设计模式-适配器模式
    Spark 环境安装与案例演示
    【操作系统】内存管理
    微服务保护-初识Sentinel
    新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star
    typescript:声明文件
    Flutter 在项目中使用动画(不使用包)
    漏洞分析丨HEVD-0x9.UseAfterFree[win7x86]
    互联网Java工程师面试题·Dubbo篇·第一弹
  • 原文地址:https://blog.csdn.net/qq_39410252/article/details/133742812