使用python在何处/如何获得用于地理空间数据可视化的免费高分辨率卫星图像

时间:2011-01-26 08:24:52

标签: python matplotlib geospatial data-visualization

我想使用python在高分辨率卫星图像上叠加地理空间数据(主要是热图)。 (我是新手,所以要对我温柔;-))

这是我的愿望清单

  • 足够详细显示街道和建筑物
  • 必须相当近(在过去几年内被捕获)
  • 必须知道图像/地图的坐标和投影,我创建的热图可以叠加
  • 轻松检索(希望有几行python代码可以处理正确的图像)
  • 免费

我认为Google地图/地球,雅虎地图,bing等等可能是潜在的候选人,但我不确定如何轻松访问它们。代码示例非常有用。

有什么建议吗?

5 个答案:

答案 0 :(得分:4)

Open Street Map与谷歌地图(我不太了解)很相似。

他们的数据库随着时间而增加。这是一个开源地图获取尝试。它们有时比谷歌地图更准确,请参阅Berlin zoo example

它有几个API,它们是只读访问权限:http://wiki.openstreetmap.org/wiki/XAPI

似乎使用REST协议。

对于REST和Python的使用,我建议使用SO link

答案 1 :(得分:4)

所以你想做一些几乎完全像这样的事情:

http://www.jjguy.com/heatmap/

我通过谷歌搜索“python heatmap”找到了。

现在您对这些图片的处理方式有点不清楚,因此请记住Google地球图像受版权保护,并且对您可以使用它们执行的操作有一系列限制。

答案 2 :(得分:2)

谷歌地图明确禁止使用地图图块离线或缓存它们,但我认为微软Bing地图没有明确反对它,我猜你不打算商业化使用你的程序(?)

然后,你可以使用它。它创建一个缓存,首先从内存加载磁贴,否则从磁盘加载磁盘,否则从互联网加载,始终将所有内容缓存到磁盘以供重用。当然你必须弄清楚如何调整它,特别是如何获得你需要的平铺坐标和缩放级别,为此我强烈建议this site。好好学习!

#!/usr/bin/env python
# coding: utf-8

import os
import Image
import random
import urllib
import cStringIO
import cairo
#from geofunctions import *


class TileServer(object):
    def __init__(self):
        self.imdict = {}
        self.surfdict = {}
        self.layers = 'ROADMAP'
        self.path = './'
        self.urltemplate = 'http://ecn.t{4}.tiles.virtualearth.net/tiles/{3}{5}?g=0'
        self.layerdict = {'SATELLITE': 'a', 'HYBRID': 'h', 'ROADMAP': 'r'}

    def tiletoquadkey(self, xi, yi, z):
        quadKey = ''
        for i in range(z, 0, -1):
            digit = 0
            mask = 1 << (i - 1)
            if(xi & mask) != 0:
                digit += 1
            if(yi & mask) != 0:
                digit += 2
            quadKey += str(digit)
        return quadKey

    def loadimage(self, fullname, tilekey):
        im = Image.open(fullname)
        self.imdict[tilekey] = im
        return self.imdict[tilekey]

    def tile_as_image(self, xi, yi, zoom):
        tilekey = (xi, yi, zoom)
        result = None
        try:
            result = self.imdict[tilekey]
        except:
            filename = '{}_{}_{}_{}.jpg'.format(zoom, xi, yi, self.layerdict[self.layers])
            fullname = self.path + filename
            try:
                result = self.loadimage(fullname, tilekey)
            except:
                server = random.choice(range(1,4))
                quadkey = self.tiletoquadkey(*tilekey)
                print quadkey
                url = self.urltemplate.format(xi, yi, zoom, self.layerdict[self.layers], server, quadkey)
                print "Downloading tile %s to local cache." % filename
                urllib.urlretrieve(url, fullname)
                result = self.loadimage(fullname, tilekey)
        return result

if __name__ == "__main__":
    ts = TileServer()
    im = ts.tile_as_image(5, 9, 4)
    im.show()

答案 3 :(得分:1)

一个可能的来源是images from NASA World Wind。您可以look at the their source了解他们如何访问他们的数据源,并在您的应用程序中执行相同操作。

答案 4 :(得分:0)

我使用了 Bing Maps API 以及 Map Tiling 的知识。请在我的 Github Repository 中找到相同的代码。

您可能会发现 this 也很有帮助。