我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 写的 Google Map

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 写的 Google Map

GoogleMap的切片地址改变了,以下内容已成历史:)


 

我们最近的遥感实习要做野外调绘,没想到老师给的图竟然比 Google Map 上的图还要旧,想想干脆就把 Google Map 上的图下载下来参考一下。

主要代码是这里面的:http://intepid.com/stuff/gmkh/,它是JS写的,我改成 Python,并增加大图拼接的功能。

Python 里面有两个数学库,一个是叫 cmath 另一个是 math。cmath 里面的东西好像比 math 的少,比如 log() 就只有 math 库里面才有。JS 代码转为 Python 基本上没有难度,就是有些比如 ? : 的运算符不同,还有一些格式上有问题而已。

一开始本来想用 urllib 来下载图片就行了,但是它没有像 httplib 那样的可以知道返回的状态(比如是 200 还是 404)。在某些放大级别下因为找不到图片是会返回 404 的,所以 httplib 在这里还是比较有用的。httplib.HTTPConnection()的参数里面的字符串是不需要有"http://"的,一开始我写成了httplib.HTTPConnection("http://kh2.google.com")那样,调试了半天才知道是这个错误。

因为下载下来的是图片数据,不是普通的文本,所以写入文件时的 open() 函数要用 "wb" 标志。要不然写入的时候程序会把 0x0A 都变为 0x0D 0x0A(回车换行符),这样图片就显示不对了。

# -*- coding:UTF-8 -*-
import Image
import httplib
from math import *


class MapImage():
    """将经纬度坐标转换为 Google Map 的 URL,并且可以把图片下载下来,合成一幅大图。
    下载后的图片依次命名为 1.jpg 2.jpg ...,最后合并的大图命名为 map.jpg
    合并成大图的话需要 PIL 库。
    """

    def __init__(self, Zoom = 10, nX = 3, nY = 3):
        """nX 和 nY 的设置就会由3x3个图生成大图。
        Zoom 是放大级别(1 - 20),某些地区的最大级别不到 20 或更小。
        """
        self.w = 0
        self.h = 0
        self.nx = nX
        self.ny = nY
        self.zoom = Zoom
        self.outputImg = "map.jpg"
        self.imgFiles = []

    def SetTiles(self, nX, nY):
        self.nx = nX
        self.ny = nY

    def SetZoom(self, Zoom):
        self.zoom = Zoom
    
    def GetAddress(self, lon, lat):
        "转换为 Mercator 投影"
        
        PI = 3.1415926535897
        digits = 20
        x = (180.0 + lon) / 360.0

        y = -lat * PI / 180.0
        y = 0.5 * log( (1 + sin(y)) / (1 - sin(y)) )
        y *= 1.0 / (2 * PI)
        y += 0.5

        quad = "t"
        lookup = "qrts"

        while digits > 0:
            x -= floor(x)
            y -= floor(y)
            quad = quad + lookup[(x >= 0.5 and 1 or 0) + (y >= 0.5 and 2 or 0)]
            x *= 2
            y *= 2
            digits -= 1
        
        return quad


    def GetNextTileX(self, addr, forward):
        "获得下一个横图块"
        
        if addr == '':
            return addr
            
        parent = addr[:len(addr) - 1]
        last = addr[len(addr) - 1]
        
        if last == 'q':
            last = 'r'
            if (not forward):
                    parent = self.GetNextTileX(parent, forward)
        elif last == 'r':
            last = 'q'
            if (forward):
                    parent = self.GetNextTileX(parent, forward)
        elif last == 's':
            last = 't'
            if (forward):
                    parent = self.GetNextTileX(parent, forward)
        elif last == 't':
            last = 's'
            if (not forward):
                    parent = self.GetNextTileX(parent, forward)
                
        return parent + last


    def GetNextTileY(self, addr, forward):
        "获得下一个纵图块"
        
        if addr == '':
            return addr
            
        parent = addr[:len(addr) - 1]
        last = addr[len(addr) - 1]
        
        if last == 'q':
            last = 't'
            if (not forward):
                    parent = self.GetNextTileY(parent, forward)
        elif last == 'r':
            last = 's'
            if (not forward):
                    parent = self.GetNextTileY(parent, forward)
        elif last == 's':
            last = 'r'
            if (forward):
                    parent = self.GetNextTileY(parent, forward)
        elif last == 't':
            last = 'q'
            if (forward):
                    parent = self.GetNextTileY(parent, forward)
                
        return parent + last


    def GetURL(self, lat, lon):
        """转换经纬度为 URL。
        输入经度、纬度"""
        
        address = []
        addr = self.GetAddress(lon, lat)
        cursor = addr[:self.zoom]
        cursor = self.GetNextTileX(cursor,0)
        cursor = self.GetNextTileY(cursor,0)
        
        for x in range(0, self.nx):
            c2 = cursor
            cursor = self.GetNextTileX(cursor,1)
            for y in range(0, self.ny):
                address.append("/kh?v=3&t=" + c2)
                c2 = self.GetNextTileY(c2,1)
        
        self.imgList = address
        return tuple(address)


    def DownloadImg(self):
        "下载列表中的图片"
        
        files = []
        for imgurl in self.imgList:
            con1 = httplib.HTTPConnection("kh2.google.com")
            con1.request("GET", imgurl)
            r1 = con1.getresponse()
            try:
                if r1.status == 200:
                    data = r1.read()

                    files.append("%s.jpg" % (self.imgList.index(imgurl)))
                    f = open("%s.jpg" % (self.imgList.index(imgurl)),"wb")
                    f.write(data)
                    f.close()
                    print "%s.jpg OK..." % (self.imgList.index(imgurl))
                elif r1.status == 404:
                    print "%s.jpg no found" % (self.imgList.index(imgurl))
                else:
                    print "%s.jpg unkown error" % (self.imgList.index(imgurl))
                
            except:
                print "img: %s download error" % (self.imgList.index(imgurl))

        self.imgFiles = tuple(files)
        return self.imgFiles
                

    def Merge(self):
        "合并图片"

        self.w = self.nx * 256
        self.h = self.ny * 256

        img = Image.new("RGB", (self.w, self.h))
        stepX = 0
        stepY = 0

        for i in self.imgFiles:
            im = Image.open(i)
            img.paste(im, (0 + stepX, 0 + stepY, 256 + stepX, 256 + stepY))
            stepY += 256
            if stepY >= self.h:
                stepX += 256
                stepY = 0
        img.save(self.outputImg)
        img.show()
        return self.outputImg



gmap = MapImage(20, 4, 4)
print " ".join(gmap.GetURL(40.703610, -73.931630))#这是New York的某个地方
print " ".join(gmap.DownloadImg())
print gmap.Merge()



下面是下载拼接后的图,由4x4个小图拼接成。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 写的 Google Map

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python 写的 Google Map

GoogleMap的切片地址改变了,以下内容已成历史:) 我们最近的遥感实习要做野外调绘,没想到老师给的图竟然比 Google Map 上的图还要旧,想想干脆就把 Google Map 上的图下载下来参考一下。主要代码是这里面的:http:
2023-01-31

python 中的filter, map

python 中的filter, map, reduce方法解释:filter:filter方法调用:resultlst = filter(func, seq)@param func:可调用对象,接受seq中的元素作为参数@param se
2023-01-31

python的map()函数

map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。map() 函数语法:map(function, iter
2023-01-31

python中的map()函数

先来看一下官方文档:map(function, iterable, ...)Apply function to every item of iterable and return a list of the results. If addi
2023-01-31

详解Python map函数及Python map()函数的用法

python map函数map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 例如,对于list [1, 2
2022-06-04

python里的map和reduce

有不少文章介绍python的map与reduce,这到底是什么样的东西呢?先看看google的paper里对mapreduce的解释http://static.googleusercontent.com/media/research.goo
2023-01-31

Google双因子认证python最好的

这个版本应该是最好的实现,在这个上面增加四个时间点,可以用in方式进行判断避免出错。@代码的注释其实就是最好的说明class _GoogleTwoSetpAuth(object): '''Google令牌二次认证相关''' de
2023-01-31

Google实践中总结的Python规范

好的代码风格,给人舒服的感觉,今天介绍一下谷歌的Python风格规范1 分号不要在行尾加分号, 也不要用分号将两条命令放在同一行。2 行长度每行不超过80个字符;不要使用反斜杠连接行。Python会将圆括号、中括号和花括号的行隐式的连接起来
2023-01-31

mybatisPlus返回Map类型的集合怎么写

今天小编给大家分享一下mybatisPlus返回Map类型的集合怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、自定
2023-07-05

python的apply(),map(),applymap()怎么用

这篇文章主要讲解了“python的apply(),map(),applymap()怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python的apply(),map(),applyma
2023-06-29

分享JS的一些优雅写法(reduce/map)

本篇文章给大家带来了关于JS的相关知识,其中主要给大家介绍了JS的一些优雅写法,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。
2023-05-14

Python 的 map、列表推导、循环

发现map最快,map返回的是迭代器,如果变成list则花的时间与循环差不多,其次是列表推导,最后是循环来写。
2023-01-31

Google内部的Python代码风格是什么样的

Google内部的Python代码风格是什么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、背景Python是谷歌主要使用的动态语言,本风格指导列举了使用Python
2023-06-15

关于python中map函数的使用

这篇文章主要介绍了关于python中map函数的使用,map函数也是python中的一个内置函数,用法同之前讲过的filter函数类似,需要的朋友可以参考下
2023-05-16

python中的map函数有什么用

在Python中,`map()`函数用于将一个函数应用于一个或多个可迭代对象(如列表或元组)的每个元素,并将结果新的迭代器返回。`map()`函数的语法为:```pythonmap(function, iterable)```其中,`fun
2023-10-10

Python中的map函数如何使用

在Python中,map() 函数用于将一个函数应用到一个或多个可迭代对象的每个元素上,并返回一个将该函数应用到每个元素后的结果组成的迭代器。其基本语法格式如下:map(function, iterable)其中,function 是要应
Python中的map函数如何使用
2024-04-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录