使用 Node.js 批量下载全国行政区 GeoJSON(含省级 + 地级市)

本文介绍一个 Node.js 脚本 ,用于从 阿里云 DataV 行政区边界接口 批量下载全国行政区划的 GeoJSON 边界文件,覆盖范围包括:

  • 全国(100000)
  • 34 个省级行政区
  • 所有存在 _full.json 的地级市

非常适合用于 地图可视化(高德 / ECharts / Mapbox)区域分析前端离线地图 等场景。


一、数据来源说明

使用的数据接口为阿里云 DataV 官方公开接口:

bash 复制代码
https://geo.datav.aliyun.com/areas_v3/bound/{adcode}_full.json
  • adcode:国家统计局行政区划代码
  • _full.json:包含完整边界数据(比 _simplified.json 更精细)

⚠️ 注意:部分地级市没有 _full.json 文件,请求会返回 404,需要手动过滤。


二、脚本功能概述

该脚本实现了以下功能:

  1. 创建 geo/ 目录用于存放下载结果

  2. 构建完整的 adcode 列表:

    • 全国
    • 34 个省级行政区
    • 所有存在 full.json 的地级市
  3. 过滤无 full.json 的城市

  4. 使用 https 模块逐个下载 GeoJSON 文件

  5. 自动保存为 {adcode}_full.json


三、完整 Node.js 脚本(无任何省略

ini 复制代码
const fs = require("fs");
const https = require("https");
const path = require("path");

// 输出目录
const outDir = path.join(__dirname, "geo");
fs.mkdirSync(outDir, { recursive: true });

// ----------------------------
// 全国 + 省级 + 地级市 adcode 列表
// ----------------------------

// 全国
const adcodes = ["100000"];

// 省级(34 个)
const provinces = [
  "110000","120000","130000","140000","150000",
  "210000","220000","230000",
  "310000","320000","330000","340000","350000","360000","370000",
  "410000","420000","430000","440000","450000","460000",
  "500000","510000","520000","530000","540000",
  "610000","620000","630000","640000","650000",
  "710000","810000","820000"
];
adcodes.push(...provinces);

// ----------------------------
// 地级市(全国所有有 full.json 的)
// ----------------------------

// 直接用官方完整 adcode 列表(过滤掉无 full.json 的地级市)
// cities值过大,也可以从同级文件引入cities.json,本文章选择直接给cities赋值
const cities = [
  "110100","120100",
  "130100","130200","130300","130400","130500","130600","130700","130800","130900","131000","131100",
  "140100","140200","140300","140400","140500","140600","140700","140800","140900","141000","141100",
  "150100","150200","150300","150400","150500","150600","150700","150800","150900","152200","152500","152900",
  "210100","210200","210300","210400","210500","210600","210700","210800","210900","211000","211100","211200",
  "220100","220200","220300","220400","220500","220600","220700","220800","222400","222600",
  "230100","230200","230300","230400","230500","230600","230700","230800","230900","231000","231100","231200","232700",
  "310100",
  "320100","320200","320300","320400","320500","320600","320700","320800","320900","321000","321100","321200","321300",
  "330100","330200","330300","330400","330500","330600","330700","330800","330900","331000","331100",
  "340100","340200","340300","340400","340500","340600","341000","341100","341200","341300","341500",
  "350100","350200","350300","350400","350500","350600","350700","350800","350900","351000",
  "360100","360200","360300","360400","360500","360600","360700","360800","360900","361000","361100",
  "370100","370200","370300","370400","370500","370600","370700","370800","370900","371000","371100","371200","371300","371400","371500","371600","371700",
  "410100","410200","410300","410400","410500","410600","410700","410800","410900","411000","411100","411200","411300","411400","411500","411600","411700","411800","411900","412700",
  "420100","420200","420300","420500","420600","420700","420800","429004","429005","429006",
  "430100","430200","430300","430400","430500","430600","430700","430800","430900","431000","431100","431200","433100",
  "440100","440200","440300","440400","440500","440600","440700","440800","440900","441200","441300","441400","441500","441600","441700","441800","441900","442000",
  "445100","445200","445300",
  "450100","450200","450300","450400","450500","450600","450700","450800","450900","451000","451100","451200",
  "460100","460200","460300","460400",
  "469001","469002","469003","469005","469006","469007","469021","469022","469023","469024","469025","469026","469027","469028",
  "500100","500200","500300","500400",
  "510100","510300","510400","510500","510600","510700","510800","510900","511000","511100","511300","511400","511500","511600","511700","511800","511900","512000",
  "513200","513300","513400","513500","513600","513700",
  "520100","520200","520300","520400",
  "522200","522300","522400","522600","522700","522800","522900","523200",
  "530100","530300","530400","530500","530600","530700","530800","530900",
  "532300","532500","532600","532800","532900",
  "533100","533300","533400",
  "540100","540200","540300","540400",
  "542200","542300","542400","542500","542600","542700",
  "610100","610200","610300","610400","610500","610600","610700","610800","610900","611000",
  "620100","620200","620300","620400","620500","620600","620700","620800","620900","621000","621100","621200",
  "622900","623000",
  "630100","630200","632200","632300","632500","632600","632700","632800","632900",
  "640100","640200","640300","640400",
  "650100","650200","650400","650500",
  "652300","652700","652800","652900","653000","653100","653200",
  "654000","654200","654300",
  "659001","659002","659003","659004"
];

// 排除无 full.json 的城市
const NO_FULL = ["441900","442000","460400","620200"];
const filteredCities = cities.filter(c => !NO_FULL.includes(c));

adcodes.push(...filteredCities);

// ----------------------------
// 下载函数
// ----------------------------
function downloadGeoJson(code) {
  const url = `https://geo.datav.aliyun.com/areas_v3/bound/${code}_full.json`;
  const filePath = path.join(outDir, `${code}_full.json`);

  https.get(url, res => {
    if (res.statusCode !== 200) {
      console.log("下载失败:", code, res.statusCode);
      return;
    }
    const fileStream = fs.createWriteStream(filePath);
    res.pipe(fileStream);
    fileStream.on("finish", () => {
      console.log("下载完成:", code);
    });
  }).on("error", err => {
    console.log("下载错误:", code, err.message);
  });
}

// ----------------------------
// 执行下载
// ----------------------------
adcodes.forEach(code => downloadGeoJson(code));

console.log("开始下载所有 GeoJSON 文件,可能需要几分钟,请耐心等待...");

四、生成结果说明

执行完成后,目录结构如下:

bash 复制代码
geo/
├── 100000_full.json        # 全国
├── 110000_full.json        # 北京
├── 110100_full.json        # 北京市
├── 440100_full.json        # 广州市
├── ...

每个文件都可直接用于:

  • ECharts map 注册
  • 高德地图 GeoJSON 覆盖物
  • Mapbox source

五、注意事项与优化建议(本次为全量数据,可参考下方优化建议)

1️⃣ 请求较多,避免频繁运行

  • 总请求数 ≈ 400+
  • 不建议频繁执行,容易被限流

2️⃣ 可加并发控制(推荐)

  • 使用 p-limit 或队列下载
  • 避免同时发起过多 HTTPS 请求

3️⃣ 可扩展区县级

  • 接口支持 区/县 adcode
  • 但文件体积会非常大(不推荐全量)
相关推荐
_Kayo_4 小时前
Node.JS 学习笔记7
笔记·学习·node.js
程序员爱钓鱼6 小时前
Node.js 编程实战:博客系统 —— 用户注册登录与文章管理
前端·后端·node.js
JaredYe7 小时前
用 Node.js 从旧版 PPT 中提取文本:轻量开源工具 ppt-to-text
node.js·powerpoint·ppt
TDengine (老段)7 小时前
TDengine Node.js 语言连接器入门指南
大数据·开发语言·物联网·node.js·vim·时序数据库·tdengine
余道各努力,千里自同风7 小时前
node.js 操作 MongoDB
数据库·mongodb·node.js
爱敲代码的婷婷婷.7 小时前
patch-package 修改 node_modules流程以及注意点
前端·react native·前端框架·node.js
一念一花一世界7 小时前
Arbess项目实战 - 基于GitLab搭建Node.js项目自动化流水线
ci/cd·node.js·自动化·gitlab·arbess
全栈前端老曹8 小时前
【包管理】npm最常见的10大问题故障和解决方案
前端·javascript·rust·npm·node.js·json·最佳实践
咔咔一顿操作8 小时前
nvm安装Node后node -v正常,npm -v提示“无法加载文件”问题解决
前端·npm·node.js