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个小图拼接成。

Python 写的 Google Map 地图下载工具相关推荐

  1. Python写的实时地球图片下载工具

    Himawari8 Image Downloader himawari8downloader 是下载卫星 Himawari8 拍摄到的地球近实时照片的 Python 脚本. GitHub 地址: hi ...

  2. 自己做的Google地图下载工具(一)

    一直都有Google地图下载的需要,这个周末加了个班, 自己实现了个VC版本的Google地图下载工具,简单实用,能用了. 至于为什么要自己实现,也是出于无奈,谁也不愿意重复造轮子. 在sourefo ...

  3. Google Maps Download Tool 谷歌地图下载工具

    谷歌地图下载工具可下载谷歌影像图.地形图.交通路线图的瓦片图片数据,瓦片等级可任意选择1~19级,虽然20~22级地图也可以下载:         但地图分辨率和19级没啥区别,建议下载到19级即可. ...

  4. 点击获取GOOGLE MAP地图上的经纬度坐标的方法

    GOOGLE  map api让我们可以在自己的网站上显示GOOGLE MAP 那样强大的功能,只要你编程够牛逼,数据库数据多.你的GOOGLE MAP会比GOOGLE 的MAP更牛.万丈高楼平地起, ...

  5. Google 地图下载工具 (C#)

    这是一个用于下载 Google 地图的小工具,相关内容参见 https://on4wp7.codeplex.com/ . // // Google Map Tiles Downloader in C# ...

  6. Google Map浏览下载器

    很久没有更新博客了,最近为了玩Google Map,专门写了个小工具.用以在浏览Google地图时,将关心区域的图片保存到本地.软件主界面如下图: 主界面 提取子库 主要功能有: 1.可以浏览Goog ...

  7. 在网页中轻松插入google map地图

    Google Map 是什么?这是Google公司(谷歌)推出的一项地图服务,我私下把它归为一种GIS服务.它不仅仅是一幅简单的电子地图图片,而是一种互动的.内涵丰富的GIS集成.当你打开 http: ...

  8. Python 爬取 Google Map POI

    Google Map 的 API文档:https://developers.google.com/maps/documentation/places/web-service/search#PlaceS ...

  9. google map 地图网址

    Google地图扩展 http://econym.org.uk/gmap/ http://econym.org.uk/gmap/egeoxml.htm http://gmaps-utility-lib ...

最新文章

  1. mysql 行号_PQ获取TABLE的单一值作为条件查询MySQL返回数据
  2. 构建城市大脑的未来标准,9个值得探索的规范
  3. 维护服务器技术员流程,技术员岗位工作的流程表.doc
  4. 每日Linux命令(1)-date
  5. springboot单例模式注入对象_Spring 中经典的 9 种设计模式,打死也要记住啊!
  6. Core IO学习心得
  7. 常用工具整理:数学,论文,代码等
  8. C++学习之路 | PTA乙级—— 1038 统计同成绩学生 (20 分)(精简)
  9. navicat premium 连接出现的问题
  10. 创建一个Flash站点的十大技巧
  11. 机器学习(深度学习)通用工作流程
  12. windows c语言目录操作函数,c语言目录操作在C/C++语言中如何进行目录操作,如得到目录内的 爱问知识人...
  13. .net开发常用工具备忘录
  14. 如何看待夸克,酷狗概念版等简洁型软件?
  15. 里式替换(LSP)跟多态有何区别?
  16. Symbian使用TTime类获取系统时间并转换为描述符
  17. 线性分式变换(linear fractional transformation)
  18. 《人工智能算法工程师(高级)》
  19. [感动]知道我为什么喜欢SUPER JUNIOR吗?
  20. 如何修理无线网络电视服务器,win7实现无线投屏到电视_网站服务器运行维护

热门文章

  1. vue-cli项目中引入vue-i18n
  2. 深度学习:AI对抗学习比深度、增强学习能好多少
  3. 8 固若金汤:网络的安全架构
  4. 如今泡沫跟消泡剂混凝土仇恨已经是历史悠久了。
  5. 如何掌握Facebook自动人脸识别技术?
  6. Android实现刘海全屏显示
  7. 提高自己魅力的九阴真经
  8. tp5- 模板文件不存在
  9. JS 中的 this
  10. Java设计模式-工厂模式的详细记录