瓦片地图一键下载 ,支持自定义来源和下载范围

        最近遇到内网加载地图需求,全网四处搜寻瓦片地图资源,无奈要么付费,要么操作复杂。身为程序员,遂自行实现了个自动获取的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 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值