资讯动态

python脚本实现下载高德离线底图瓦片并使用

发布时间:2026/9/6 6:15:42 来源:尧图企业网站定制
在内网环境中开发无法使用高德在线瓦片服务需要下载到本地或者部署到内网服务器中进行使用如何下载离线瓦片呢可以使用python脚本进行以下是完整代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129importmath# 新增这行导入math模块importrequestsimportosfromPILimportImagefromurllib.parseimportquoteimporttime# 高德瓦片下载配置classAmapTileDownloader:def__init__(self, save_pathamap_tiles, zoom_range(1,18)):初始化下载器:param save_path: 瓦片保存根路径:param zoom_range: 缩放级别范围高德瓦片缩放级1-18self.save_pathsave_pathself.zoom_rangezoom_range# 高德瓦片服务地址矢量底图可替换为卫星图# 矢量底图http://webrd0{1-4}.is.autonavi.com/appmaptile?langzh_cnsize1scale1style8x{x}y{y}z{z}# 卫星底图http://webst0{1-4}.is.autonavi.com/appmaptile?style6x{x}y{y}z{z}self.tile_url_templatehttp://webrd0{server}.is.autonavi.com/appmaptile?langzh_cnsize1scale1style8x{x}y{y}z{z}# 服务节点避免单节点请求频繁被限制self.servers[1,2,3,4]self.headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36}defmercator2tile(self, lon, lat, zoom):经纬度转瓦片坐标墨卡托投影:param lon: 经度:param lat: 纬度:param zoom: 缩放级别:return: x, y 瓦片坐标lat_radlat*3.141592653589793/180.0n2.0**zoomxint((lon180.0)/360.0*n)yint((1.0-(math.log(math.tan(lat_rad)(1/math.cos(lat_rad))))/math.pi)/2.0*n)returnx, ydefdownload_tile(self, x, y, z, server1):下载单个瓦片:param x: 瓦片x坐标:param y: 瓦片y坐标:param z: 缩放级别:param server: 服务节点1-4:return: 是否下载成功# 拼接瓦片URLtile_urlself.tile_url_template.format(serverserver, xx, yy, zz)# 构建保存路径根路径/缩放级别/x坐标/y坐标.pngtile_save_pathos.path.join(self.save_path,str(z),str(x))os.makedirs(tile_save_path, exist_okTrue)tile_fileos.path.join(tile_save_path, f{y}.png)# 避免重复下载ifos.path.exists(tile_file):print(f瓦片 {z}/{x}/{y} 已存在跳过)returnTruetry:# 发送请求添加超时和重试responserequests.get(tile_url, headersself.headers, timeout10)response.raise_for_status()# 抛出HTTP错误# 保存瓦片withopen(tile_file,wb) as f:f.write(response.content)# 校验图片是否有效try:imgImage.open(tile_file)img.verify()print(f成功下载{z}/{x}/{y})returnTrueexcept:os.remove(tile_file)print(f瓦片无效已删除{z}/{x}/{y})returnFalseexceptException as e:print(f下载失败 {z}/{x}/{y}{str(e)})returnFalsedefdownload_area(self, min_lon, min_lat, max_lon, max_lat):下载指定经纬度范围的瓦片:param min_lon: 最小经度:param max_lon: 最大经度:param min_lat: 最小纬度:param max_lat: 最大纬度importmath# 延迟导入避免初始化时依赖print(f开始下载范围[{min_lon},{min_lat}] - [{max_lon},{max_lat}])print(f缩放级别范围{self.zoom_range[0]} - {self.zoom_range[1]})forzinrange(self.zoom_range[0],self.zoom_range[1]1):# 计算范围对应的瓦片坐标min_x, min_yself.mercator2tile(min_lon, max_lat, z)# 注意lat反转max_x, max_yself.mercator2tile(max_lon, min_lat, z)print(f\n缩放级别 {z}瓦片范围 x[{min_x}-{max_x}], y[{min_y}-{max_y}])server_idx0# 轮询服务节点# 遍历所有瓦片坐标forxinrange(min_x, max_x1):foryinrange(min_y, max_y1):# 轮询服务节点serverself.servers[server_idx%len(self.servers)]server_idx1# 下载瓦片添加小延迟避免请求过快被限制self.download_tile(x, y, z, server)time.sleep(0.1)# 可根据实际情况调整print(\n所有瓦片下载完成)# ------------------- 示例使用 -------------------if__name____main__:# 初始化下载器保存路径缩放级别建议先测试1-10级级别越高瓦片越多downloaderAmapTileDownloader(save_pathamap_tiles, zoom_range(1,10))# 下载指定区域示例北京市中心经纬度范围可替换为自己需要的区域# 经纬度可从高德地图拾取https://lbs.amap.com/console/show/pickermin_lon, min_lat116.30,39.80# 左下角经纬度max_lon, max_lat116.50,40.00# 右上角经纬度downloader.download_area(min_lon, min_lat, max_lon, max_lat)以上测试代码下载的是北京市中心偏南部的核心区域离线瓦片服务具体结构如下图所示如何验证离线瓦片是否可用呢可以快速创建一个html文件使用leafle 引入./amap_tiles/{z}/{x}/{y}.png下载的离线瓦片快速实现一个基础地图展示代码如下12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849!DOCTYPE htmlhtmllangzh-CNheadmetacharsetUTF-8titleLeaflet加载高德离线瓦片/title!-- 引入Leaflet的CSS和JS在线CDN --linkrelstylesheethrefhttps://unpkg.com/leaflet1.9.4/dist/leaflet.cssrelexternal nofollow/scriptsrchttps://unpkg.com/leaflet1.9.4/dist/leaflet.js/script!-- 引入高德坐标系适配插件解决偏移问题 --scriptsrchttps://unpkg.com/leaflet.gridlayer.ChinaProvider1.0.2/dist/leaflet.ChineseTmsProviders.js/scriptstyle/* 让地图占满整个页面 */#map {width: 100vw;height: 100vh;margin: 0;padding: 0;}/style/headbodydividmap/divscript// 1. 初始化地图中心点设为你下载的区域这里是北京var map L.map(map, {// 禁用地图缩放超出瓦片范围minZoom: 1,maxZoom: 10, // 对应你下载的最大缩放级别zoomControl: true // 显示缩放控件}).setView([39.908823, 116.397470], 8); // 中心点经纬度初始缩放级别// 2. 加载本地高德离线瓦片L.tileLayer(./amap_tiles/{z}/{x}/{y}.png, { // 对应瓦片目录结构attribution: 高德离线瓦片, // 地图版权说明tileSize: 256, // 高德瓦片默认尺寸256x256noWrap: true, // 禁止地图水平循环// 瓦片加载失败时显示的占位图errorTileUrl: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIElEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg}).addTo(map);// 可选添加比例尺控件L.control.scale({imperial: false, // 不显示英制单位maxWidth: 200}).addTo(map);/script/body/html在本地服务中运行html文件到此这篇关于python脚本实现下载高德离线底图瓦片并使用的文章就介绍到这了

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价