Python爬取Google高清遥感瓦片地图

news2024/9/27 15:27:28

Python爬取Google高清遥感瓦片地图

这是一个能直接从Google地图服务下载瓦片地图的程序,非常稳定,只需要设置需要下载的左上角和右下角的经纬度坐标即可下载。当然总所周知的原因,下载google地图需要先打开梯子。
下面放上一个下载的高清遥感图像(zoom=20),可以看到地面的车辆等清晰可见:
在这里插入图片描述
下面即为Python代码,下载的小图和合并后的大图均为png格式:

import urllib.request

import os
import cv2
import numpy as np
import random
import re
import math
from tqdm import tqdm

def dms2dd(degrees, minutes, seconds, direction):
    dd = float(degrees) + float(minutes) / 60 + float(seconds) / (60 * 60)
    if direction == 'E' or direction == 'N':
        dd *= -1
    return dd


def parse_dms(dms):
    parts = re.split('[^\d\w]+', dms)
    lat = dms2dd(parts[0], parts[1], parts[2], parts[3])
    return (lat)


count = 0  # 用于getimg异常次数过多退出计数

agents = [
    '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',
    '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; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1']


# 经纬度反算切片行列号 3857坐标系
def deg2num(lat_deg, lon_deg, zoom):
    lat_rad = math.radians(lat_deg)
    n = 2.0 ** zoom
    xtile = int((lon_deg + 180.0) / 360.0 * n)
    ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
    return (xtile, ytile)


# 下载图片
def getimg(Tpath, Spath, x, y):
    global count
    count = 0  # 清零
    try:
        f = open(Spath, 'wb')
        req = urllib.request.Request(Tpath)
        req.add_header('User-Agent', random.choice(agents))  # 换用随机的请求头
        pic = urllib.request.urlopen(req, timeout=60)
        f.write(pic.read())
        f.close()
        # print(str(x) + '_' + str(y) + '下载成功')
    except Exception:
        print(str(x) + '_' + str(y) + '下载失败,重试')  # 存在一直失败不跳出的bug
        getimg(Tpath, Spath, x, y)
        count = count + 1
        if count > 100:
            return


def download(zoom, LTlat, LTlon, RBlat, RBlon, rootDir):

    lefttop = deg2num(LTlat, LTlon, zoom)  # 下载切片的左上角角点
    rightbottom = deg2num(RBlat, RBlon, zoom)

    print("共{:d}张图像".format((lefttop[0] - rightbottom[0]) * (lefttop[1] - rightbottom[1])))

    for x in range(lefttop[0], rightbottom[0]):

        path = rootDir + str(zoom) + "\\" + str(x)  # 文件夹检查

        if not os.path.exists(path):
            os.makedirs(path)
        with tqdm(range(lefttop[1], rightbottom[1])) as pbar:
            for y in pbar:
                pbar.set_description(f"Schedule {x-lefttop[0]+1}/{rightbottom[0]-lefttop[0]}")
                tilepath = "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=s&x=" + str(x) + "&y=" + str(y) + "&z=" + str(zoom)

                filepath = path + "\\" + str(y) + ".png"  # 文件检查

                if not os.path.isfile(filepath):
                    getimg(tilepath, os.path.join(path, str(y) + ".png"), x, y)

    print('地图下载完成')

def merge(x1, y1, x2, y2, z, path):
    row_list = list()
    for i in range(x1, x2 + 1):
        col_list = list()
        for j in range(y1, y2 + 1):
            path_img = path + "\\{z}\\{i}\\{j}.png".format(i=i, j=j, z=z)
            img = cv2.imread(path_img)
            col_list.append(img)
        k = np.vstack(col_list)
        row_list.append(k)
    result = np.hstack(row_list)
    cv2.imwrite(path + "//merge.png", result)
    print("地图合并完成,保存为:{:s}".format(path + "//merge.png", result))


if __name__ == "__main__":
    rootDir = "D:\\satellite\\"
    # 瓦片地图的放大倍数
    zoom = 20
    # 这里定义下载范围
    LT_lat = '23^09^39.9898N'  # 左上角的纬度
    LT_lon = '113^25^56.3031E'  # 左上角的经度
    RB_lat = '23^09^00.9898N'  # 右下角的纬度
    RB_lon = '113^26^57.3031E'  # 右下角的经度

    # WGS84转墨卡托投影
    LT_lat = parse_dms(LT_lat)
    LT_lon = parse_dms(LT_lon)
    RB_lat = parse_dms(RB_lat)
    RB_lon = parse_dms(RB_lon)

    delta_lat = LT_lat - RB_lat
    delta_lon = RB_lon - LT_lon

    if zoom > 15:
        LT_lat = LT_lat - delta_lat * 1 / 4
        LT_lon = LT_lon + delta_lon * 1 / 4
        RB_lat = RB_lat + delta_lat * 1 / 4
        RB_lon = RB_lon - delta_lon * 1 / 4
    download(zoom, LT_lat, LT_lon, RB_lat, RB_lon, rootDir)

    print("开始合并地图......")
    # 合并保存为大图
    lefttop = deg2num(LT_lat, LT_lon, zoom)  # 下载切片的左上角角点
    rightbottom = deg2num(RB_lat, RB_lon, zoom)
    merge(lefttop[0], lefttop[1], rightbottom[0] - 2, rightbottom[1] - 2, zoom, rootDir)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

目录 回溯算法一、什么是回溯算法1、基本思想:2、一般步骤: 二、题目带练1、全排列2、组合3、子集 三、公式总结 回溯算法 一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决组合问题、排列问题、选择问题等一类问…

Python“牵手”淘宝商品详情数据采集方法,淘宝API申请步骤说明

淘宝平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 淘宝API接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问淘宝平台的数据,包括商品信息、店铺信息、物流信息等,从而实现淘宝平台的数据开…

Android开发基础知识总结(一)初识安卓Android Studio

一.基础理论知识 1.Linux相当于是地基。 MIUI,EMUI等操作系统,是基于安卓的改版——且裁掉了一部分Google的服务。 (鸿蒙虽然是改版,但和安卓的架构基本上一致) 2.Kotlin和Java都是JVM语言,必须先复习好…

Python数据分析实战-给定JSON格式的数据提取所需字段并转换为DataFrame(附源码和实现效果)

实现功能 给定JSON格式的数据提取所需字段并转换为DataFrame 实现代码 import pandas as pd import json# 假设给定的JSON数据已经存储在data变量中 data [{"title": "Data Source Adapter for Excel Sheets","project_code_url": "htt…

Mac下Jmeter安装及基本使用

本篇文章只是简单的介绍下Jmeter的下载安装和最基本使用 1、初识Jmeter 前一段时间客户端app自测的过程中,有偶现请求某个接口返回数据为空的问题,领导让我循环100次请求这个接口,看看有没有结果为空的问题。听同事说有Jmeter的专业测试工具…

Java数据结构学习和源码阅读(线性数据结构)

线性数据结构 链表 LinkList 链表的数据结构 一组由节点组成的数据结构,每个元素指向下一个元素,是线性序列。 最简单的链表结构: 数据指针(存放执行下一个节点的指针) 不适合的场景: 需要循环遍历将…

【C++】 使用红黑树模拟实现STL中的map与set

文章目录 前言1. 对之前实现的红黑树进行一些补充和完善1.1 析构1.2 查找 2. STL源码中map和set的实现3. 改造红黑树封装map和set3.1 红黑树结构修改3.2 map、set的结构定义3.3 insert的封装3.4 insert测试3.5 发现问题并解决3.6 红黑树迭代器实现3.7 封装set和map的迭代器并测…

uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

要素排查: 1.scroll-x属性需要开启,官方类型是Boolean,实际字符串也行。 2scroll-view标签需要给予一个固定宽度,可以是百分百也可以是固定宽度或者100vw。 3.子元素需要设置display: inline-block(行内块元素&#x…

国标GB28181视频平台EasyGBS通过对应密钥上传到其他平台展示的详细步骤来啦!

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台,支持多路设备同时接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

项目管理实战笔记:硬技能(下)

需求变更: pmp里面涉及需求变更的很多,尤其是CCB 对于CCB的需求变更,可能需要以下步骤: 1. 确定变更的原因和必要性:需要了解变更是因为业务需求的变化、技术方案的变更还是其他原因,以及变更是否是必要的…

内行才知道的新闻稿发布技巧,媒介盒子为你揭秘

不知道最近其他小伙伴有没有遇上以上说的一些情况,必须借助新闻稿发布达到营销推广的目的。 可是对于新闻稿发布这一块却不知道应该怎么办,尤其是新手上任,对于如何发布新闻稿是一头雾水。 新闻稿的发布是企业在公关传播中重要的一环&#…

如何将PDF文件转换为PPT文件?

如何将pdf转换成ppt?PDF文件作为常用的文件格式,不仅可以在教学过程中使用,还可以在营销展会、培训讲座等过程中使用。欧迪芬文件的使用,能够在一定程度上提升我们的办公效率。对于PDF文件来说,其中包含的元素非常多&a…

【算法刷题之数组篇(2)】

目录 1.leetcode-35. 搜索插入位置(简单)2.leetcode-74. 搜索二维矩阵(中等)3.leetcode-73. 矩阵置零(中等)4.leetcode-56. 合并区间(中等)5.leetcode-54. 螺旋矩阵(中等…

水溶性试剂Hexynoic acid STP ester,炔酸STP酯,NHS酯的极好替代品

产品简介:炔酸STP酯是一种具有末端炔丙基和STP酯基的水溶性试剂。STP酯是在水性环境中进行偶联反应的传统N-羟基琥珀酰亚胺(NHS)酯的极好替代品。炔丙基通过铜催化的叠氮化物-炔烃点击化学与含叠氮化物的化合物或生物分子反应,产生…

leetcode303. 区域和检索 - 数组不可变(java)

前缀和数组的应用 区域和检索 - 数组不可变题目描述前缀和数组代码演示 区域和检索 - 数组不可变 难度 - 简单 原题链接 - 区域和检索 - 数组不可变 题目描述 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 righ…

解决运行在微信小程序中报[ app.json 文件内容错误] app.json: app.json 未找到(env: Windows,mp,1.05.2204

找到project.config.json文件夹 添加 "miniprogramRoot": "unpackage/dist/dev/mp-weixin/", 即可

发展全球电商业务,为什么首选Facebook Messenger电子商务?

Facebook Messenger电子商务就是使用Facebook的消息传递渠道Messenger来购买和销售产品或服务。通过将 Messenger与客户服务平台,例如SaleSmartly(SS客服)集成,企业可以利用渠道强大的消息传递功能为客户提供更加个性化和对话式的…

这个免费全景网站你知道吗,多篇教程教您如何创作全景作品

引言: 随着科技的不断进步,虚拟现实(VR)技术正逐渐融入我们的日常生活,为我们带来了没有过的沉浸式体验。其中,VR全景网站作为一种引领人们身临其境体验的创新方式,正在逐渐受到大众的关注。 蛙…

androidStudio或IDEA的通过gitBash打开插件

本人,一个资深的命令行,业余爱好者。常年直接vim,或者shell上服务器阅读代码。比较偏好使用GitBash来打开项目,进行git status,git diff,git add,commit等动作。 基于以上原因,本人开…

怎样通过本地电脑搭建SFTP服务器,并实现公网访问?

本地电脑搭建SFTP服务器,并实现公网访问 文章目录 本地电脑搭建SFTP服务器,并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…