【PythonRS】基于矢量范围批量下载遥感瓦片高清数据(天地图、高德、谷歌等)
这个是之前写的代码了,正好今天有空所以就和大家分享一下。我们在处理项目时,有时候需要高清底图作为辅助数据源去对比数据,所以可能会需要卫星数据。所以今天就和大家分享一下如何使用Python基于矢量范围批量下载高清遥感瓦片数据。
1 读取矢量边界
这里我们使用osgeo中的osr、ogr库去读取矢量的地理范围。之前也分享过,感兴趣的可以去Python&GIS专栏里面看一看。注意我这里只算了四至范围而不是整个矢量的边界范围,因为边界范围计算行列数不太好计算。正因如此我们下载的瓦片数据也不具备坐标系,所以也裁剪不了。
def Open_Vector(path_shp):""":param path_shp: 输入84坐标矢量:return: 返回四至范围"""ds = ogr.Open(path_shp, True)# True表示以读写方式打开layer = ds.GetLayer(0)# 获取图层feature = layer.GetFeature(0)geom = feature.GetGeometryRef()# 获取该要素的地理空间范围left, right, down, up = geom.GetEnvelope()# 获取图层的地理范围return left, right, down, up
2 通过经纬度计算航带数
这里没什么好说的,就是基础的公式,直接计算行列数即可。这个函数在整个函数作为辅助函数,主程序会自己调用它。
def calculation_tile(lat, lon, zoom):""":param lat: 84坐标纬度:param lon: 84坐标经度:param zoom: 缩放级别:return: 瓦片的行列号"""# 将经纬度从WGS84坐标系转换为GCJ02坐标系# lon_deg,lat_deg = WGS84_To_GCJ02(lon_deg,lat_deg)# 根据缩放级别计算格网数量n = 2.0 ** zoom# 将纬度从度转换为弧度lat_radio = math.radians(lat)# 计算瓦片中的x坐标tile_x = int((lon + 180.0) / 360.0 * n)# 计算瓦片中的y坐标tile_y = int((1.0 - math.log(math.tan(lat_radio) + (1 / math.cos(lat_radio))) / math.pi) / 2.0 * n)# 返回计算得到的瓦片坐标(行和列)return tile_x, tile_y
3 获取瓦片下载链接
这里使用了基础的反爬虫方法,随机调用请求头,也可以自己添加或减少请求头。即使如此有时还会爬取失败,感兴趣的可以自己改进一下反爬方法,如果不会就多运行几次。
def Get_image(url, x, y):agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari''/537.36','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari''/532.5','Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari''/532.9','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari''/534.7','Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 ''Safari/534.14','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 ''Safari/534.14','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 ''Safari/534.20',]try:# 打印下载成功的消息,显示瓦片的位置和下载状态print("瓦片" + str(x) + '_' + str(y) + '下载成功')# 创建一个请求对象,使用指定的URLrequests = urllib.request.Request(url)# 为请求添加一个随机的User-Agent头,以模拟不同的浏览器或客户端requests.add_header('User-Agent', random.choice(agents)) # 换用随机请求头# 使用指定的请求打开URL,并设置超时时间为60秒image = urllib.request.urlopen(requests, timeout=60)# 读取返回的图像数据image_io = image.read()# 使用BytesIO将图像数据转换为可处理的字节流对象image_bytes = io.BytesIO(image_io)# 使用PIL库打开图像image = Image.open(image_bytes)# 将图像从RGB格式转换为BGR格式(OpenCV需要的格式)image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)except EOFError:# 如果发生EOFError(可能由于网络问题、超时等),打印下载失败的消息并尝试重试print("瓦片" + str(x) + '_' + str(y) + '下载失败,正在重试......')Get_image(url, x, y) # 递归调用Get_image函数进行重试# 返回处理后的图像数据return image
4 主程序
这里就不过多解释了,我的代码注释非常完善,如果有什么不懂的,直接留言即可。整体就是筛选出最大的缩放级别,再调用行列数函数计算出瓦片的编号,再调运瓦片的下载链接,最后拼接起来即可。
# -*- coding: utf-8 -*-
"""
@Time : 2023/4/9 14:37
@Auth : RS迷途小书童
@File :Vector Download Remote Sensing Tile Data.py
@IDE :PyCharm
@Purpose:根据矢量范围下载三方地图瓦片
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import io
import cv2
import math
import random
import numpy as np
from osgeo import ogr
import urllib.request
from PIL import Imagedef Write_image(lat1, lon1, lat2, lon2, out_path):""":param lat1: 左上角纬度:param lon1: 左上角经度:param lat2: 右下角纬度:param lon2: 右下角经度:return: 返回瓦片影像"""zooms = list()# 创建一个空列表zooms,用于存储所有的缩放级别for i in range(1, 19):# 循环缩放级别col = calculation_tile(lat1, lon1, i)# 将经纬度转换为对应的地图瓦片编号,结果存储在col中row = calculation_tile(lat2, lon2, i)if col[0] - row[0] == 0 or col[1] - row[1] == 0:continueelse:zooms.append(i)# 如果差值不为0,将当前的缩放级别i添加到zooms列表中zoom = zooms[-1]# 获取zooms列表中的最后一个元素,即最大的缩放级别,并存储在zoom变量中left_up = calculation_tile(lat1, lon1, zoom)# 使用最大的缩放级别和第一个经纬度范围,调用函数获取左上角的地图瓦片编号,存储在left_up中right_down = calculation_tile(lat2, lon2, zoom)# 使用最大的缩放级别和第二个经纬度范围,调用函数获取右下角的地图瓦片编号,存储在right_down中images_columns = list()# 创建一个空列表images_columns,用于存储所有的地图瓦片图像列print("当前瓦片行数:", right_down[0]-left_up[0])print("当前瓦片列数:", right_down[1] - left_up[1])print("--------------------------------------数据获取--------------------------------------")for x in range(left_up[0], right_down[0]):# 循环行images_rows = list()# 创建一个空列表images_rows,用于存储所有的地图瓦片图像行for y in range(left_up[1], right_down[1]):# 循环列tile_url = 'http://t4.tianditu.com/DataServer?T=img_w&x='+str(x)+'&y='+str(y)+'&l='+str(zoom) + \'&tk=45c78b2bc2ecfa2b35a3e4e454ada5ce'image = Get_image(tile_url, x, y)cv2.imwrite(out_path + "/%s.jpg" % (str(x)+"_"+str(y)), image)images_rows.append(image)# 将获取到的瓦片图像添加到images_rows列表中,用于后续的图像合成img_column_new = np.vstack(images_rows)# 使用NumPy的v stack函数,将images_rows列表中的所有图像竖直堆叠起来,形成一个新的图像列images_columns.append(img_column_new)# 将这个新的图像列添加到images_columns列表中,用于后续的图像合成print("正在拼接瓦片数据......")result = np.hstack(images_columns)# 使用NumPy的h stack函数,将images_columns列表中的所有图像水平堆叠起来,形成一个最终的大图像print("正在保存瓦片数据......")cv2.imwrite(out_path + "/result.jpg", result)return result
5 总结
下列有一些三方底图链接,也可以查看【Python&GIS】第三方地图服务汇总。
"""
tile_url = 'http://www.google.cn/maps/vt/pb=!1m4!1m3!1i'+str(zoom)+'!2i'+str(x)+'!3i'+str(y)+'!2m3!1e0!2sm!3i345013117!3m8!2szh-CN!3scn!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0'
# Google地图瓦片
tile_url = 'http://mt3.google.cn/vt/lyrs=s@110&hl=zh-CN&gl=cn&src=app&x='+str(x)+'&y='+str(y)+'&z='+str(zoom)+'&s=G'
# Google影像瓦片
tile_url = 'http://t4.tianditu.com/DataServer?T=img_w&x='+str(x)+'&y='+str(y)+'&l='+str(zoom)+'&tk=45c78b2bc2ecfa2b35a3e4e454ada5ce'
# 天地图卫星数据,vec_w电子地图(2000坐标系)
"http://wprd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scl=1&style=6&x=" + str(x) + "&y=" + str(y) + "&z=" + str(zoom) + "<ype=3"
# 高德底图,偏移(火星坐标系)
"""
这里输入的矢量需要是WGS84坐标系的经纬度,不能是投影坐标系哦。此外如果使用高德、百度等底图可能会有一定的偏移,因为我国需要加密成火星坐标系,但是还是可以用的,略微有偏移而已作为对比图够用了。天地图就无所谓,它的坐标是准的。
相关文章:
【PythonRS】基于矢量范围批量下载遥感瓦片高清数据(天地图、高德、谷歌等)
这个是之前写的代码了,正好今天有空所以就和大家分享一下。我们在处理项目时,有时候需要高清底图作为辅助数据源去对比数据,所以可能会需要卫星数据。所以今天就和大家分享一下如何使用Python基于矢量范围批量下载高清遥感瓦片数据。 1 读取矢…...
穷举vs暴搜vs深搜vs回溯vs剪枝
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻全排列👉&#…...
Sensor Demosaic IP 手册PG286笔记
《 UG1449 Multimedia User Guide》中包含了大量的多媒体IP简介。 本IP 用于对bayer RGB(每个pixel只有单个R/G/B)做去马赛克处理,恢复成每个pixel点都有完整的RGB值。通过axi接口配置IP内部erg。 1、算法手册中的描述 提到了几种插值算法&…...
HarmonyOS —— UIAbility 页面跳转总结
HarmonyOS —— UIAbility 页面跳转总结 Author:Gorit Date:2023年12月27日 一、系统环境 HarmonOS API9SDK 3.1.0Stage 模型 二、应用内跳转 在应用内之前实现不同 page 的跳转,我们使用 router 即可,页面跳转主要支持如下…...
Spring Boot 3 集成 Jasypt详解
随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。Jasypt(Java Simplified Encryption)作为一个简化Java应用程序中数据加密的工具,为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作…...
Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能
文章目录 1. 简介2. 引入依赖3. 导入功能实现3.1 创建实体类3.2 编写导入 Controller3.3 编写导入页面 4. 导出功能实现4.1 编写导出 Controller4.2 编写导出页面 5. 启动应用 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 &…...
SQLSERVER排查CPU占用高
操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 现象 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用不太高,只占用了30个G CPU…...
uniapp:富文本回显
一、使用uniapp官方的标签 rich-text: 会出现图片无法显示的问题,可以用以下方法来过滤处理 <rich-text :nodes"question.title | formatRichHtml"></rich-text> formatRichHtml(html) {if (!html) {return html;}//控制小程序…...
flink内存配置
flink内存配置 配置 TaskManager 内存 | Apache Flink...
easyexcel 导出
在使用EasyExcel库进行数据写入时,通常我们会使用实体类来存储数据。但是当遇到动态查询,无法确定属性数量和名称时,就需要使用Map来接收数据。然而,直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来,我将…...
maven命令行安装依赖测试
mvn dependency:get -DgroupIdorg.springframework -DartifactIdspring-core -Dversion5.3.9作用:可用于测试配置环境变量后,能否下载依赖到本地仓库...
Redis 笔记
文章目录 安装 & 启动杂乱String字符串 key-valueList 有序重复列表Set 无序不重复列表SortedSet 有序集合Hash 哈希Stream 轻量级消息队列订阅模式 学习地址:https://www.bilibili.com/video/BV1Jj411D7oG/ 安装 & 启动 安装包地址: https://g…...
可穿戴智能设备应用领域以及使用意义分别有哪些?
可穿戴智能设备有哪些? 可穿戴智能设备是指可以佩戴在身上,具有智能功能和交互能力的电子设备。以下是一些常见的可穿戴智能设备: 智能手表:智能手表结合了传统手表的功能和智能设备的特性,可以显示时间、接收通知、监…...
【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用
🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…...
机器学习——主成分分析(PCA)
主成分分析(Principal Component Analysis,简称PCA)是一种常用的无监督学习算法,用于降维和数据可视化。主要目标是将高维数据转换成低维空间,同时尽可能保留原始数据的信息。 PCA的主要思想是通过线性变换将原始数据…...
论最近热门的AI绘画技术—从小白绘画到文创手账设计【文末送书-13】
文章目录 🏀前言⚽AI绘图技术栈⚾️简单的代码实现案例🏈iPad萌系简笔画:从小白绘画到文创手账设计【文末送书-13】⛳粉丝福利:文末推荐与福利免费包邮送书! 🏀前言 AI绘画技术,也称为人工智能…...
python打开文件的方式比较
open(addr,w) 打开之后文件无论以前有什么,打开后都要清空 /// open(addr,r) 文件打开后,不删除以前内容...
使用Jenkins和单个模板部署多个Kubernetes组件
前言 在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个YAML模板文件(.tpl)来部署多个类似的…...
Unity Meta Quest 一体机开发(十二):【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮
文章目录 📕教程说明📕给玩家配置 HandPokeInteractor📕用 3D 物体制作可以被点击的 UI 按钮⭐搭建物体层级⭐给物体添加脚本⭐为脚本变量赋值 📕模仿官方样例按钮的样式📕在按钮上添加文字📕修改按钮图片 …...
Vue 3 中安装并使用 Axios 详细步骤+样例代码详解
axios详细步骤 在集成终端打开,使用 npm 或 yarn 安装 Axios: npm install axios或 yarn add axios这将在您的项目中安装 Axios。 在您的 Vue 3 项目中创建一个用于发送 HTTP 请求的模块或文件,比如 http.js。 在 http.js 文件中导入 Axios…...
IDEA 控制台中文出现乱码问题解决
一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源: ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因:IDEA编码和Tomcat编码不一致,统一设置为UTF-8即可。 三、解决思路 修改…...
计算机网络(1)
计算机网络(1) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网(1)因特网概念解读服务常见的服务 协议网络边缘特点强调 网络核心特点强调 小程一言 我的计算机网络专栏,是自己在计算机网络…...
如果我想用python自动操作手机、电脑软件,应该学python哪方面的知识呢?
Python 作为一门万能语言,在各方面的表现都非常好 如果我们想使用 Python 来操作手机和电脑,那么需要学习掌握如下几个方面的知识 1. 基本的Python编程 显而易见,你需要学习Python的基本语法、数据类型、控制流和函数等基本概念。这是后面…...
关于java命令行传参
关于java命令行传参 本篇文章拓展以下java中的命令行传参😎 有时候你希望运行一个程序的时候再传递给它消息,这要靠传递命令行参数给main()方法来实现。首先我们先来创建一个数组遍历。 public class Demo {public static void main(String[] args){/…...
[LeetCode][Python]389. 找不同
简单 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s "abcd", t "abcde" 输出:"…...
鸿蒙崛起:互联网大厂加速鸿蒙原生应用开发,人才争夺战打响
随着华为鸿蒙系统的发布和不断推进,一场以鸿蒙为中心的生态竞争已经拉开帷幕。近日,网易、美团等多家互联网公司发布了与鸿蒙系统有关的岗位招聘,加速推进鸿蒙原生应用开发转型。这种趋势表明,鸿蒙系统已经引起了行业的广泛关注&a…...
OR-NeRF论文笔记
OR-NeRF论文笔记 文章目录 OR-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Background4 Method4.1 Multiview Segmentation4.2 Scene Object Removal 5 ExperimentsDatasetsMetricsMultiview SegmentationScene Object Removal 6 Conclusion 论文概述 目的&am…...
【web】vue 播放后端(flask)发送的 mp3 文件
文章目录 演示后端(flask)前端(vue3)重要说明 演示 后端(flask) 后端返回的是 mp3 文件的 url,是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…...
vmware安装openEuler 22.03 LTS操作系统
vmware安装openEuler 22.03 LTS操作系统 1、下载openEuler操作系统镜像文件2、安装openEuler操作系统3、配置openEuler操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载openEuler操作系统镜像文件 官网下载链接 链接: https://www.openeuler.or…...
Android registerForActivityResult
startActivityForResult 已经被标记为不推荐的方法,推荐的替代方案是使用 registerForActivityResult: // Activity 的 onCreate 方法中调用 registerForActivityResult val activityResultLauncher registerForActivityResult(ActivityResultContract…...
欧洲十大服务器的推荐/丁的老头seo博客
這些資源基本上都是一些免积分或只需要1個积分就能下载的資源,经过整理筛选最后分享给大家,希望大家喜欢: PHP手册(chm) http://download.csdn.net/detail/u011851645/6030287 php手册 最新版本 http://download.csdn.net/detail/fly367/5989061 从零开始学PHP http://download…...
傻瓜式网站建设/网络舆情分析报告范文
文章目录1 概述2 第三方库2.1 搜索2.2 安装3 扩展3.1 Flask 安装1 概述 1. 场景:无法使用 pip install Flask 命令直接安装,如(1) 公司内网限制(2) 电脑没有网络2. 目录切换命令(若需要) C: cd C:\Users\..\Python37\Lib 2 第…...
大连网站排名优化价格/怎样做好销售和客户交流
包括像我这样的初学者的文件操作在内的完整步骤假设您有一个.jsonl文件,如:{"reviewerID": "A2IBPI20UZIR0U", "asin": "1384719342", "reviewerName": "cassandra tu \"Yeah, well, thats…...
网站建设推广新闻/信息流优化师
AOP(面向切面编程) 基本概念 不修改源代码实现添加新的功能利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率底层原理:动态代理,两…...
郑州网站建设哪家最好/网站关键词排名优化工具
emmet的使用的参考文章:http://www.cnblogs.com/sussski/p/3544744.html html:4s、html:4t、html:5或! 、>、^:层次 *、-、3:个数、排序及起始值 $:填充 []:属性 {}:内容 #、. :id和class no…...