在哪里获取免费的高分辨率卫星图像用于Python的地理空间数据可视化

4 投票
3 回答
12200 浏览
提问于 2025-04-16 10:38

我想用Python把地理空间数据(主要是热力图)叠加到高分辨率的卫星图像上。(我还是个新手,请多多包涵 ;-))

这是我的愿望清单:

  • 要足够详细,可以显示街道和建筑物
  • 必须是比较新的(最近几年拍摄的)
  • 图像/地图的坐标和投影必须是已知的,这样我制作的热力图才能叠加上去
  • 获取这些图像要简单(希望几行Python代码就能搞定)
  • 免费

我觉得谷歌地图、雅虎地图、必应等可能是合适的选择,但我不太确定怎么方便地访问它们。如果有代码示例就太好了。

有什么建议吗?

3 个回答

1

一个可能的来源是来自NASA World Wind的图像。你可以查看他们的源代码,了解他们是如何获取数据的,然后在你的应用程序中也可以这样做。

3

谷歌地图明确禁止离线使用地图瓦片或缓存它们,但我觉得微软的必应地图没有明确反对这个做法,而且我猜你并不打算把你的程序用于商业用途吧?

那么,你可以试试这个方法。它会创建一个缓存,首先从内存中加载一个瓦片,如果内存没有,就从硬盘加载,如果硬盘也没有,就从互联网加载,并且总是把所有内容缓存到硬盘上以便下次使用。当然,你需要弄清楚怎么调整这个程序,特别是如何获取你需要的瓦片坐标和缩放级别。为此,我强烈建议你访问这个网站。祝你学习愉快!

#!/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()
4

开放街图是一个很不错的替代谷歌地图的选择(我对谷歌地图了解不多)。

它们的数据库随着时间的推移在不断增加。这是一个开源的地图获取项目。有时候,它的准确性比谷歌地图还要高,比如在柏林动物园的例子中就有体现。

它提供了几个API,这些API是只读的,可以访问:http://wiki.openstreetmap.org/wiki/XAPI

看起来它使用的是REST协议。

如果你想了解如何在Python中使用REST,我推荐这个链接

撰写回答