下载xyz地图

资源

  • 下列为常用xyz路由地址
  • 为了避免图片中出现文字标注(道路名称,建筑物名称等)本文选择天地图tian-vec 作为获取资源对象
    var mapUrl = {/***** 高德地图* lang可以通过zh_cn设置中文,en设置英文,size基本无作用,scl设置标注还是底图,scl=1代表注记,* scl=2代表底图(矢量或者影像),style设置影像和路网,style=6为影像图,* vec——街道底图* img——影像底图* roadLabel---路网+标注*/"aMap-img": "http://webst0{1-4}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}","aMap-vec": "http://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}","aMap-roadLabel": "http://webst0{1-4}.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}",/**** 天地图 要key的* vec——街道底图* img——影像底图* ter——地形底图* cva——中文注记* cta/cia——道路+中文注记 ---roadLabel*/"tian-img": "http://t{0-7}.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27","tian-roadLabel": "http://t{0-7}.tianditu.gov.cn/DataServer?T=cta_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27","tian-label": "http://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27","tian-vec": "http://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27","tian-ter": "http://t{0-7}.tianditu.gov.cn/DataServer?T=ter_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27",/****geoq地图* http://cache1.arcgisonline.cn* http://map.geoq.cn* vec:标准彩色地图* gray、blue、warm* line 中国轮廓图* china 中国轮廓图+标注* Hydro 水系* green 植被*/"geoq-vec": "http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}","geoq-gray": "http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}","geoq-blue": "http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}","geoq-warm": "http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}","geoq-line": "http://cache1.arcgisonline.cn/arcgis/rest/services/SimpleFeature/ChinaBoundaryLine/MapServer/tile/{z}/{y}/{x}",//不稳定"geoq-china": "http://thematic.geoq.cn/arcgis/rest/services/ThematicMaps/administrative_division_boundaryandlabel/MapServer/tile/{z}/{y}/{x}",//不稳定"geoq-Hydro": "http://thematic.geoq.cn/arcgis/rest/services/ThematicMaps/WorldHydroMap/MapServer/tile/{z}/{y}/{x}",//不稳定"geoq-green": "http://thematic.geoq.cn/arcgis/rest/services/ThematicMaps/vegetation/MapServer/tile/{z}/{y}/{x}",//不稳定/**** Google* m 街道* s 影像*/"google-vec": "http://www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}","google-img": "http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}"};

展示资源

  • 最终效果如下,矩形框内是我们需要获取的地图也就是需要爬虫下载的

加载地图
点选选择范围
将范围绘制在地图上
  • 四个坐标转换成四至得到矩形
xsq = "120.22940239501227;30.226915680225147;120.28948387694587;30.146807031535218"xsqlist = xsq.split(";")xsq_x_list = []
xsq_y_list = []for i in range(len(xsqlist)):if i % 2 == 0:xsq_x_list.append(float(xsqlist[i]))else:xsq_y_list.append(float(xsqlist[i]))xsq_x_y_list = []for x, y in zip(xsq_x_list, xsq_y_list):xsq_x_y_list.append([float(x), float(y)])MINX = min(xsq_x_list)
MAXX = max(xsq_x_list)
MINY = min(xsq_y_list)
MAXY = max(xsq_y_list)print([MINX, MINY])
print([MINX, MAXY])
print([MAXX, MAXY])
print([MAXX, MINY])
print([MINX, MINY])
  • 地图显示
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>高德地图+ol</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/openlayers/4.6.5/ol.css"integrity="sha256-rQq4Fxpq3LlPQ8yP11i6Z2lAo82b6ACDgd35CKyNEBw=" crossorigin="anonymous"/><script src="https://cdnjs.cloudflare.com/ajax/libs/openlayers/4.6.5/ol.js"integrity="sha256-77IKwU93jwIX7zmgEBfYGHcmeO0Fx2MoWB/ooh9QkBA="crossorigin="anonymous"></script><style>#map {width: 100%;height: 100%;position: absolute;}</style>
</head><body>
<div id="map"></div>
<script type="text/javascript">var gaodeMapLayer = new ol.layer.Tile({title: "titile",source: new ol.source.XYZ({url: mapUrl["tian-vec"]})});var fa = new ol.layer.Vector({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Polygon([[[120.22940239501227, 30.146807031535218],[120.22940239501227, 30.226915680225147],[120.28948387694587, 30.226915680225147],[120.28948387694587, 30.146807031535218],[120.22940239501227, 30.146807031535218],]]),name: 'pg'})]}),});var map = new ol.Map({layers: [gaodeMapLayer, fa],view: new ol.View({center: [120, 30],projection: 'EPSG:4326',zoom: 10}),target: 'map'});// 点选地图用map.on('singleclick', function (e) {console.log(map.getEventCoordinate(e.originalEvent));})</script>
</body></html>

爬虫开始

  • 介绍XYZ 的规则

  • 有兴趣可以查看 这篇博客:openlayers-自定义瓦片

  • 根据图中描述,所需要素为 x ,y ,z 三者 ,在资源路由中不难看出 xyz 都是作为未知数

    {"tian-vec": "http://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=a4ee5c551598a1889adfabff55a5fc27"}
    

浏览器调试

  • 观察下图,我们可以发现右侧小图片中的那块内容在左侧出现

获取地址

使用同样的方式获取右下角地址

  • 左上角地址 http://t3.tianditu.gov.cn/DataServer?T=vec_w&x=27326&y=13492&l=15&tk=a4ee5c551598a1889adfabff55a5fc27
  • 右下角地址 http://t4.tianditu.gov.cn/DataServer?T=vec_w&x=27333&y=13507&l=15&tk=a4ee5c551598a1889adfabff55a5fc27

地址如何使用?

  1. 不变的是z 在天地图url中是l ,本文示例l=15

  2. 在地址中x y 存在关系: x 向右增加,y向下增加

    本文x范围 [ 27326,27333 ]

    本文y范围[ 13492, 13507 ]

到目前所有参数准备就绪

  • tips: 天地图的key 需要自己注册 ,本文已经提供了

代码怎么写?

单个图片下载

  • http://t3.tianditu.gov.cn/DataServer?T=vec_w&x=27326&y=13492&l=15&tk=a4ee5c551598a1889adfabff55a5fc27 以此为例
import requests
import os# 文件存放位置设置
BASE_PATH = os.path.join(os.path.abspath(os.curdir), 'disc')
print(BASE_PATH)# 简单反爬虫 , 可以不写
headers = {"Connection": "keep-alive","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
}# 单个图片的参数
x = 27326
y = 13492
z = 15
key = 'a4ee5c551598a1889adfabff55a5fc27'
# 完整url
url = "http://t3.tianditu.gov.cn/DataServer?T=vec_w&x={}&y={}&l={}&tk={}".format(x, y, z, key)
# 保存文件名称
fileName = os.path.join(BASE_PATH, "x={}y={}z={}.png".format(x, y, z))
# 具体下载操作
if (os.path.exists(fileName)) == False:r = requests.get(url=url, headers=headers)if r.status_code == 200:with open(fileName, 'wb') as f:for chunk in r:f.write(chunk)

下载成功

多图下载

import requests
import os
# 文件存放位置设置
BASE_PATH = os.path.join(os.path.abspath(os.curdir), 'disc')
BASE_PATH_res = os.path.join(os.path.abspath(os.curdir), 'result')# 简单反爬虫 , 可以不写
headers = {"Connection": "keep-alive","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
}def download_pic(x, y, z):try:# 下载图片key = 'a4ee5c551598a1889adfabff55a5fc27'for xi in x:for yi in y:url = "http://t3.tianditu.gov.cn/DataServer?T=vec_w&x={}&y={}&l={}&tk={}".format(xi, yi, z, key)# 保存文件名称fileName = os.path.join(BASE_PATH, "x={}y={}z={}.png".format(xi, yi, z))# 具体下载操作if (os.path.exists(fileName)) == False:r = requests.get(url=url, headers=headers)if r.status_code == 200:with open(fileName, 'wb') as f:for chunk in r:f.write(chunk)else:print("访问异常")except Exception as e:print(e)passif __name__ == '__main__':x = range(27326 - 1, 27326 + 2)  y = range(13492 - 1, 13492 + 2)  z = 15picSize = 256download_pic(x, y, z)

至此我们将一部分图片下载完成

拼图

  • 在上面多图下载结果中我们看到了很多一张张的图片和我们在地图上看到的不太一样,地图上的是一整张的,所以我们需要将这个图拼起来构造一张完整的图,如下图

  • 我们将图想象成下图的形式,只需要知道每一个格子里面填写什么(图片名称)

def merge_pic(x, y, z):picSize = 256try:# 构造平图矩阵li = []for xi in x:lis = []for yi in y:fileName = os.path.join(BASE_PATH, "x={}y={}z={}.png".format(xi, yi, z))lis.append(fileName)li.append(lis)oca = len(x)ocb = len(y)toImage = Image.new('RGBA', (oca * picSize, ocb * picSize))for i in range(oca):for j in range(ocb):fromImge = Image.open(li[i][j])picx = 256 * ipicy = 256 * jloc = (picx, picy)toImage.paste(fromImge, loc)toImage.save(os.path.join(BASE_PATH_res, "rs.png"))print("构造完成输出图片")except  Exception as e:print(e)pass

完整demo

#! /usr/bin/env python
# -*- coding: utf-8 -*-import requests
from PIL import Image
import os# 文件存放位置设置
BASE_PATH = os.path.join(os.path.abspath(os.curdir), 'disc')
BASE_PATH_res = os.path.join(os.path.abspath(os.curdir), 'result')# 简单反爬虫 , 可以不写
headers = {"Connection": "keep-alive","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
}def download_pic(x, y, z):try:# 下载图片key = 'a4ee5c551598a1889adfabff55a5fc27'for xi in x:for yi in y:url = "http://t3.tianditu.gov.cn/DataServer?T=vec_w&x={}&y={}&l={}&tk={}".format(xi, yi, z, key)# 保存文件名称fileName = os.path.join(BASE_PATH, "x={}y={}z={}.png".format(xi, yi, z))# 具体下载操作if (os.path.exists(fileName)) == False:r = requests.get(url=url, headers=headers)if r.status_code == 200:with open(fileName, 'wb') as f:for chunk in r:f.write(chunk)else:print("访问异常")except Exception as e:print(e)passdef merge_pic(x, y, z):picSize = 256try:# 构造平图矩阵li = []for xi in x:lis = []for yi in y:fileName = os.path.join(BASE_PATH, "x={}y={}z={}.png".format(xi, yi, z))lis.append(fileName)li.append(lis)oca = len(x)ocb = len(y)toImage = Image.new('RGBA', (oca * picSize, ocb * picSize))for i in range(oca):for j in range(ocb):fromImge = Image.open(li[i][j])picx = 256 * ipicy = 256 * jloc = (picx, picy)toImage.paste(fromImge, loc)toImage.save(os.path.join(BASE_PATH_res, "rs.png"))print("构造完成输出图片")except  Exception as e:print(e)passif __name__ == '__main__':x = range(27326 - 1, 27326 + 2)y = range(13492 - 1, 13492 + 2)z = 15download_pic(x, y, z)merge_pic(x, y, z)

本文代码及可视化代码均放在 github 欢迎star & fork

[python] 下载天地图切片地图相关推荐

  1. 如何用python下载瓦片(天地图,谷歌或者其它网站)并拼接

    分两步 做这些工作前,先下个python python 3.7版本下载地址  https://pc.qq.com/detail/5/detail_24685.html 腾讯下载 还是很不错的 再来个 ...

  2. GIS开发二:批量下载和拼接地图瓦片

    文章目录 1.简介 1.1 Web墨卡托投影 1.2 经纬度坐标系 1.3 瓦片定义 1.4 瓦片编号 1.5 瓦片和像素 1.6 瓦片计算公式 1.7 网络地图服务(WMS) 1.8 切片地图服务( ...

  3. 天地图卫星地图在OpenLayers中的应用示例源码

    一.准备工作 1. 到OpenLayers的官方网站下载压缩包,如下图所示. 2.到水经注软件官方网站下载<水经注万能地图下载器>或<天地图卫星地图下载器>均可. 二.下载示例 ...

  4. python下载arcgis地图_使用下载器下载适用于arcgis的离线地图切片

    1.下载太乐地图下载器或水经注离线地图下载器(官网下载为适用版,加水印且控制下载大小) 2.地图下载器界面如下 太乐地图下载器 水经注离线地图下载器 3.两款软件操作类似,我们就以水经注离线地图下载器 ...

  5. 谷歌地图和天地图切片下载(地图爬虫)失败问题

    最近做了一个从网上下载不同源地图切片的程序,但是在下载谷歌地图时出现了图片下载错误,返回的不是图片信息是下面的html信息 We're sorry... ... but your computer o ...

  6. 【数据获取】GGGIS下载谷歌、天地图等地图数据

    ​以下文章来源于公众号:城市数据百宝箱,作者小黄鸭 在本篇文章里介绍一个还能下载谷歌.天地图的地图下载器--GGGIS,它除了能下载谷歌.天地图地图数据外,还能下载百度.高德地图数据.下面就跟我们一起 ...

  7. GGGIS地图下载器|手把手教你如何免费下载天地图和谷歌的卫星影像图以及街道地图

    一.软件下载 GGGIS官方下载网址:http://www.gggis.com/sj 点"绿色免安装版本"下载软件程序到本地,解压,双击"GGGIS地图下载器.exe&q ...

  8. Python 之谷歌瓦片地图影像批量下载

    Python 之谷歌瓦片地图影像批量下载 最近在写毕业论文,想用谷歌影像作为底图来展示研究区,然后 Google 了很多脚本,结果发现输出的影像都不带空间坐标系,所以就想自己写个小工具,通过输入空间范 ...

  9. 如何用python画出中国地图-用Python画中国地图(二)

    在上一篇文章<用Python画一个中国地图>中,我们简单描述了一下如何用Python快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它,使它看上去更有意义. 上色 ...

最新文章

  1. 计算机书籍-语音识别技术实践
  2. linux顺序合并多个文件,linux – 合并多个文件,保留unix中的原始序列
  3. python编程基础是什么-编程学习第一步,让你20天搞定Python编程
  4. C# 反射与dynamic最佳组合
  5. [原创]关于打开新窗口和关闭老窗口的2个方法!
  6. 派衰计算机,知乎:格局派和旺衰派的区别,两者各有什么优缺点?
  7. Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1
  8. 休眠事实:等于和HashCode
  9. 论文浅尝 | 变分知识图谱推理:在KG中引入变分推理框架
  10. 踩内存是什么意思啊_网络资讯:0x0000008e蓝屏代码是什么
  11. 最近碰到的一些 SSL 问题记录
  12. UGUI的image
  13. 一款局域网的聊天工具
  14. Teststand: 如何让一个测试步骤不要在报告里生成
  15. android 集成科大讯飞TTS在线语音合成
  16. 遵义二十一中2021高考成绩查询入口,遵义第二十一中学2021年招生简章
  17. linux dup作用,unix/linux中的dup()系统调用
  18. ppt模板如何更换表格颜色?
  19. C# WaitAll 等待所有线程执行完毕
  20. 树莓派Linux内核配置、编译以及烧录详细步骤

热门文章

  1. 对flutter开发的某app安全分析
  2. Python 中文分词并去除停用词
  3. rhel5.6 sssd配置方法。
  4. 【31-Redis分布式锁进化史】
  5. 【大数据分析常用算法】6.共同好友
  6. 全球与中国搅拌站燃烧器市场现状及未来发展趋势
  7. 【Reference reading】用19F标记的BPA-果糖复合物在C6老鼠胶质瘤模型的19F MRI和19F MRS来优化硼中子捕获治疗(BNCT)
  8. Linux操作系统基础知识(适用于Centos/Ubuntu)
  9. 最新的ssm毕业设计题目50例
  10. 【AI】AI 工具合集