本文介绍一个 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,需要手动过滤。
二、脚本功能概述
该脚本实现了以下功能:
-
创建
geo/目录用于存放下载结果 -
构建完整的
adcode列表:- 全国
- 34 个省级行政区
- 所有存在
full.json的地级市
-
过滤无
full.json的城市 -
使用
https模块逐个下载 GeoJSON 文件 -
自动保存为
{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 - 但文件体积会非常大(不推荐全量)