最近遇到内网加载地图需求,全网四处搜寻瓦片地图资源,无奈要么付费,要么操作复杂。身为程序员,遂自行实现了个自动获取的nodejs脚本(手懒,交给AI代劳)。
1. 完整代码如下:
const axios = require('axios')
const fs = require('fs')
const path = require('path')
// 瓦片地图 URL 模板
const TILE_URL_TEMPLATE =
'http://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'
// 保存图片的根目录
const OUTPUT_DIR = path.join(__dirname, 'tiles')
// 下载范围
const MIN_ZOOM = 9 // 最小缩放级别
const MAX_ZOOM = 13 // 最大缩放级别
// 国内范围(经度和纬度)
const CHINA_BOUNDS = {
minLon: 73, // 最小经度
maxLon: 135, // 最大经度
minLat: 3, // 最小纬度
maxLat: 54, // 最大纬度
}
// 创建输出目录
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR, { recursive: true })
}
// 经纬度转瓦片坐标
function lon2tile(lon, z) {
return Math.floor(((lon + 180) / 360) * Math.pow(2, z))
}
function lat2tile(lat, z) {
return Math.floor(
((1 -
Math.log(Math.tan((lat * Math.PI) / 180) + 1 / Math.cos((lat * Math.PI) / 180)) / Math.PI) /
2) *
Math.pow(2, z)
)
}
// 下载单个瓦片
async function downloadTile(x, y, z) {
const url = TILE_URL_TEMPLATE.replace('{x}', x).replace('{y}', y).replace('{z}', z)
try {
const response = await axios.get(url, {
responseType: 'arraybuffer',
headers: {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
Referer: 'http://www.example.com/',
},
})
const tileDir = path.join(OUTPUT_DIR, z.toString(), x.toString())
if (!fs.existsSync(tileDir)) {
fs.mkdirSync(tileDir, { recursive: true })
}
const tilePath = path.join(tileDir, `${y}.png`)
fs.writeFileSync(tilePath, response.data)
console.log(`Downloaded: z=${z}, x=${x}, y=${y}`)
} catch (error) {
console.error(`Failed to download: z=${z}, x=${x}, y=${y}`, error.message)
}
}
// 下载指定范围内的所有瓦片
async function downloadTiles() {
for (let z = MIN_ZOOM; z <= MAX_ZOOM; z++) {
// 计算国内范围的 X 和 Y 坐标
const minX = lon2tile(CHINA_BOUNDS.minLon, z)
const maxX = lon2tile(CHINA_BOUNDS.maxLon, z)
const minY = lat2tile(CHINA_BOUNDS.maxLat, z) // 注意:纬度越大,Y 越小
const maxY = lat2tile(CHINA_BOUNDS.minLat, z) // 注意:纬度越小,Y 越大
console.log(`Downloading z=${z}, x=${minX}-${maxX}, y=${minY}-${maxY}`)
for (let x = minX; x <= maxX; x++) {
for (let y = minY; y <= maxY; y++) {
await downloadTile(x, y, z)
}
}
}
console.log('All tiles downloaded!')
}
// 启动下载
downloadTiles()
2. 安装、运行方式:
1. npm i axios
2. node index
先安装axios插件,然后运行脚本即可在根目录创建 tileDir 文件夹,获取回的瓦片资源,自动按照正确的文件夹格式保存,运行之后等待完成即可。可以在上面的缩放级别和范围中自行修改想要获取的内容。
3. 彩蛋
二更,补上网盘地址,6-13的瓦片地图压缩包。
通过网盘分享的文件:tiles.7z
链接: https://pan.baidu.com/s/1yg99wsIzyubTtYAsmla3gg?pwd=shyg 提取码: shyg