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

2024-04-29 16:58:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的心愿单

  • 详细到足以显示街道和建筑物
  • 必须是最近的(在过去几年内捕获)
  • 必须知道图像/地图的坐标和投影,我创建的热图可以覆盖
  • 容易检索(希望有几行python代码能够提供正确的图像)
  • 免费的

我认为谷歌地图/地球,雅虎地图,必应等。。。可能是潜在的候选人,但我不确定如何方便地获得他们。代码示例将非常有用。

有什么建议吗?


Tags: 代码图像地球示例地图街道地理投影
3条回答

谷歌地图明确禁止离线使用地图块或缓存地图块,但我认为微软必应地图没有明确表示反对,我猜你也不打算在商业上使用你的程序(?)

那么,你可以用这个。它创建一个缓存,首先从内存加载一个磁贴,或者从磁盘加载,或者从internet加载,总是将所有内容缓存到磁盘以供重用。当然,你必须找出如何调整它,特别是如何得到你需要的平铺坐标和缩放级别,为此我强烈建议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()

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

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

我在谷歌上找到了“Python热图”。

现在你有点不清楚你想用这些图片做什么,所以记住Google Earth图片是受版权保护的,你可以用它们做什么有一系列限制。

Open Street Map相当于Google地图(我不太清楚)。

他们的数据库随着时间的推移而增加。这是一个开源的地图采集尝试。它们有时比Google地图更精确,请参见Berlin zoo example

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

它似乎使用了REST协议。

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

相关问题 更多 >