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

news2024/11/18 15:21:49

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

  • 1 创建秘钥
    • 1.1 登录高德地图开放平台
    • 1.2 创建应用
    • 1.3 绑定服务创建秘钥
  • 2 获取数据并插入
    • 2.1 创建数据库连接工具
    • 2.2 请求数据
    • 2.3 数据处理
    • 2.4 全部代码
  • 3 还可以打印文件到本地

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);
        }
      });
    });
  });
}

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("数据获取失败")

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}数据插入完成`)
}

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()

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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Python采集京东商品评论并保存至本地

不知道各位网购的时候,是否会去留意商品评价,有些小伙伴是很在意评价的,看到差评就不想买了,而有些小伙伴则是会对差评进行理性分析,而还有一类人不在乎这个。京东作为中国最大的电商平台之一,拥有大量的商…

如何使用ChatGPT编写更好的代码

生成代码是ChatGPT和其他遵循指令运行的大型语言模型(LLM)一个功能强大的应用。如果得到正确的提示,大型语言模型(LLM)可以生成程序员可能需要数小时才能编写的代码。 然而,大型语言模型(LLM)并不能完成程序员的所有工作。他们无法分解复杂的问题&#x…

学生用RockyLinux9.2模板虚拟机说明

“RockyLinux9.2”模板虚拟机下载地址 链接:https://pan.baidu.com/s/1xcakszIQ7Kp9Nw_NA9Znlg?pwdqzmm 提取码:qzmm 1.模板机是基于“Rocky-9.2-x86_64-minimal.iso”安装 2.模板机是2023.10.10执行dnf update && dnf upgrade更新和升级软件…

Unity_相机灵活跟随角色移动

每日一句:慢慢改变,慢慢成长,慢慢适应,慢慢优秀 目录 角色旋转、移动类 相机跟随人物移动类 角色旋转、移动类 /*旋转刚体,位移的动画驱动移动*/ using System.Collections;using System.Collections.Generic;using…

一套完整的软件测试面试流程(面试题),这些题你真的都能答上吗?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、自我介绍 2、…

外汇天眼:外汇交易商常见黑心手法大公开!投资务必留意这5种骗局

众所周知,外汇市场无论在交易量、流动性方面都是世界之最,如今随着网络科技愈来愈发达,任何人都能通过手机使用全球的经纪商,随时随地在线上进行外汇保证金交易。 然而,市面上充斥各种黑平台与假券商,投资人…

神经网络中卷积和池化的区别

1、什么叫卷积? 卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意这里是一个单独的值,不再是矩阵了)。 卷积的…

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析 7 月 30 日,因为 Vyper 部分版本中的漏洞,导致 Curve、JPEG’d 等项目陆续受到攻击,损失总计超过 5200 万美元。 Safful 对此事件第一时间进行了技术分析,并…

WebDAV之π-Disk派盘 + 书藏家

书藏家是一款书籍收藏的软件,对于喜欢阅读书籍的用户来说非常友好,记录你所阅读的书籍内容,对你所阅读的书籍内容进行全方位的管理,并且支持多种录入的方式,不管是实体书籍还是网络书籍都能够进行更为有效的管理;内置WebDAV 模块,更加便利的整理自己的文件资源;书藏家的…

三维模型3DTile格式轻量化云端处理技术方法分析

三维模型3DTile格式轻量化云端处理技术方法分析 在现代的地理信息系统 (GIS) 中,3D Tiles 是一种很重要的数据格式,用于存储和传输大规模地理空间数据。然而,由于其数据密度高,传输和加载过程中非常消耗资源,因此需要采…

element-ui的 el-option如果label为空显示value问题处理

element-ui的 el-option如果label为空显示value问题处理 问题描述我的第二项没有lable值直接取的value 处理办法定义一个函数处理一下 function toStr(str) {let data;if (str) {data encodeURI(str);} else {data 暂无名称;}data data.replace(/ /g, %20);return decod…

MySql运维篇---009:分库分表:垂直拆分、水平拆分、通过MyCat进行分片,读写分离:一主一从、 双主双从

3.分库分表 3.1 介绍 3.1.1 问题分析 使用单个数据库存储所有的数据,如果磁盘和内存和内存不足了可以增大磁盘和内存,但是对于一台服务器的磁盘和内存不可能无限制的扩张下去,它是受我们服务器的硬件影响的,如果说数据库所存储…

查看和分析 IIS 日志文件以增强 Web 服务器安全性

Microsoft IIS服务器,无论是Web还是FTP,对于企业来说都是必不可少的。但是,IT 安全管理员的工作并不止于部署 IIS 服务器。部署后,管理员必须采取安全措施来保护这些服务器,监控 IIS 服务器安全性的一种行之有效的方法…

BC v1.2充电规范

1 JEITA Reference to https://www.mianbaoban.cn/blog/post/169964 符合 JEITA 规范的锂离子电池充电器解决方案 2 Battery Fuel Gauge 2.1 Cycle Count(充放电循环次数) 此指令回传一只读字段,代表电芯组已经历的完整充放电循环数。当放电容…

Pulsar简介及其安装

Pulsar简介及其安装 简介特征Pulsar 本地安装与运行Pulsar集群安装jdk版本映射关系下载解压 Pulsar 本地安装与运行Pulsar集群安装jdk版本映射关系下载解压解压目录介绍 启动创建topic发送消息消费消息停止 简介 Apache Pulsar 是 Apache 软件基金会顶级项目,是下一…

host配置

配置host文件的作用主要是用于自定义域名与IP地址之间的映射关系。Host文件是一个操作系统用于将人类可读的域名(例如:www.example.com)映射到IP地址(例如:192.168.1.1)的文件。当你在浏览器中输入一个网址…

欠酸洗,异物压入,斑迹和脏污 学习笔记

欠酸洗: 带钢的宽度方向上,可能会出现在整个宽度或某个局部宽度区域的特殊分布。这种分布看起来像波浪或鱼鳞的痕迹。这种情况通常在带钢的开始和结束部分更为常见。 异物压入 通常,这种情况是由于圆点或小条状的粉尘和颗粒被压入所导致的…

一站式工单系统哪家好?一站式工单系统有什么特点?

伴随着高新科技的不断发展和行业竞争的加重,对于一站式工单系统这一类的公司服务系统软件有着越来越多的流程规定和可靠性的要求。一个比较完善的智能化一站式工单系统包含众多的流程,并适用更广泛性的企业信息化,接下来我们将一起看看一站式…

MyLife - Docker安装MySQL

Docker安装MySQL 个人觉得像数据库之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装mysql使用。 1. MySQL 镜像库地址 MySQL 镜像库地址:https://hub.docker.com/_/mysql/tags 这里是官…

HP打印机一点击打印就出现Windows资源管理器已停止工作问题解决

本次处理的打印机型号是HP Officejet 200 移动便携式打印机,不过其他型号如果出现类似现象,解决方法应该是一致的。 在弹出Windows资源管理器已停止工作的报错提示框后,点击左下角的详细信息,看到的内容显示是KernelBase.dll崩溃…