当前位置: 首页 > 面试题库 >

使用Python捕获嵌入式Google地图图像,而无需使用浏览器

游安康
2023-03-14
问题内容

我注意到,在Google Maps页面上,您可以获取“嵌入”链接以将其放入iframe并将其加载到浏览器中。(这里没有新闻)

可以将图像大小调整为非常大,因此我对将大图像作为单个.PNG感兴趣。

更具体地说,我想从边界框定义一个矩形区域(右上和左下坐标),并使用适当的缩放系数获取相应的图像。

但是我的问题是:如何使用Python获取此地图的“像素内容”作为图像对象?

(我的理由是:如果浏览器可以获取并呈现此类图像内容,那么Python也应该能够这样做)。

编辑:这是显示我的示例图的HTML文件的内容:

<iframe 
    width="2000"
    height="1500"
    frameborder="0"
    scrolling="yes"
    marginheight="0"
    marginwidth="0"
    src="http://maps.google.com.br/maps?hl=pt-BR&amp;ll=-30.027489,-51.229248&amp;spn=1.783415,2.745209&amp;z=10&amp;output=embed"/>

编辑:我按照Ned
Batchelder的建议进行了操作,并urllib.urlopen()使用src从上述iframe中获取的地址读取了呼叫的内容。结果产生了很多JavaScript代码,我认为这与Google
Maps JavaScript API有关。因此,问题持续存在:我如何才能用Python中的所有这些东西做一些有用的东西以获取地图图像?

编辑:此链接似乎包含有关Google
Maps如何平铺其地图的一些非常相关的信息:http
:
//www.codeproject.com/KB/scrapbook/googlemap.aspx

也:http :
//econym.org.uk/gmap/howitworks.htm


问题答案:

我感谢所有的答案。我最终以另一种方式解决了该问题,使用Google Maps Static
API和一些公式将坐标空间转换为像素空间,以便获得可以很好地“拼接”在一起的精确图像。

对于任何有兴趣的人,这里是代码。如果可以帮助某人,请发表评论!

============================

import Image, urllib, StringIO
from math import log, exp, tan, atan, pi, ceil

EARTH_RADIUS = 6378137
EQUATOR_CIRCUMFERENCE = 2 * pi * EARTH_RADIUS
INITIAL_RESOLUTION = EQUATOR_CIRCUMFERENCE / 256.0
ORIGIN_SHIFT = EQUATOR_CIRCUMFERENCE / 2.0

def latlontopixels(lat, lon, zoom):
    mx = (lon * ORIGIN_SHIFT) / 180.0
    my = log(tan((90 + lat) * pi/360.0))/(pi/180.0)
    my = (my * ORIGIN_SHIFT) /180.0
    res = INITIAL_RESOLUTION / (2**zoom)
    px = (mx + ORIGIN_SHIFT) / res
    py = (my + ORIGIN_SHIFT) / res
    return px, py

def pixelstolatlon(px, py, zoom):
    res = INITIAL_RESOLUTION / (2**zoom)
    mx = px * res - ORIGIN_SHIFT
    my = py * res - ORIGIN_SHIFT
    lat = (my / ORIGIN_SHIFT) * 180.0
    lat = 180 / pi * (2*atan(exp(lat*pi/180.0)) - pi/2.0)
    lon = (mx / ORIGIN_SHIFT) * 180.0
    return lat, lon

############################################

# a neighbourhood in Lajeado, Brazil:

upperleft =  '-29.44,-52.0'  
lowerright = '-29.45,-51.98'

zoom = 18   # be careful not to get too many images!

############################################

ullat, ullon = map(float, upperleft.split(','))
lrlat, lrlon = map(float, lowerright.split(','))

# Set some important parameters
scale = 1
maxsize = 640

# convert all these coordinates to pixels
ulx, uly = latlontopixels(ullat, ullon, zoom)
lrx, lry = latlontopixels(lrlat, lrlon, zoom)

# calculate total pixel dimensions of final image
dx, dy = lrx - ulx, uly - lry

# calculate rows and columns
cols, rows = int(ceil(dx/maxsize)), int(ceil(dy/maxsize))

# calculate pixel dimensions of each small image
bottom = 120
largura = int(ceil(dx/cols))
altura = int(ceil(dy/rows))
alturaplus = altura + bottom


final = Image.new("RGB", (int(dx), int(dy)))
for x in range(cols):
    for y in range(rows):
        dxn = largura * (0.5 + x)
        dyn = altura * (0.5 + y)
        latn, lonn = pixelstolatlon(ulx + dxn, uly - dyn - bottom/2, zoom)
        position = ','.join((str(latn), str(lonn)))
        print x, y, position
        urlparams = urllib.urlencode({'center': position,
                                      'zoom': str(zoom),
                                      'size': '%dx%d' % (largura, alturaplus),
                                      'maptype': 'satellite',
                                      'sensor': 'false',
                                      'scale': scale})
        url = 'http://maps.google.com/maps/api/staticmap?' + urlparams
        f=urllib.urlopen(url)
        im=Image.open(StringIO.StringIO(f.read()))
        final.paste(im, (int(x*largura), int(y*altura)))
final.show()


 类似资料:
  • 我正在尝试使用html2canvas将div捕获到图像中。我有一个带滚动条的div。我想把这个div元素转换成image。当运行html2canvas时,它只捕获屏幕的可见部分,截断从滚动中隐藏的所有内容。设置“高度、宽度”属性没有影响。我使用的是html2canvas版本0.4。1. 感谢帮助。

  • 问题内容: 我面临的问题是img标签。当涉及单个图像时,以下代码将加载图像: 但是以下代码无法加载: 我需要遍历json,类似[{‘img’:’./ images / image1.jpg’,’name’:’AAA’},{‘img’:’./ images / image2.jpg’,’ name’:’BBB’}],然后将每个图像显示为图像,并将其名称显示为页脚。循环很好,但是图像不会加载,实际上我

  • 问题内容: 我对如何缓存图像是全新的。 我使用PHP输出图库中的所有图像,并希望已显示的图像由浏览器缓存,因此PHP脚本不必再次输出相同的图像。我想要的只是图像显示得更快。 调用图像时,我喜欢这样: 和-file做: 问题答案: 如果您使用php在输出消息之前检查用户是否已登录,则您不希望浏览器缓存图像。 缓存的全部目的是调用服务器一次,然后再也不调用它。如果浏览器缓存图像,它将不会调用服务器,并

  • 浏览图像 可从已登录至频道的网页接收数据,并播放图像。 使用操作接口 播放幻灯片秀

  • 浏览图像 选择相片时,会显示以下的图标。 摄影机 连接PSP™专用摄影机(选购品)后,可拍摄静止图像或影像。 Memory Stick™ 可浏览保存于Memory Stick™的图像。 主机内存 可浏览保存于主机内存的图像。   相机图像 可浏览支持Memory Stick™之数码(数字)相机所拍摄的图像。 (文件夹) 仅于存在使用计算机新建之文件夹时显示。 (图像档案) 可浏览保存于Memory

  • 问题内容: 在使用Selenium运行自动测试用例时,是否可以捕获浏览器日志?我找到了一篇有关如何捕获Selenium中的JavaScript错误的文章。但这仅适用于Firefox,仅适用于错误。我想获取所有控制台日志。 问题答案: 我认为这是符合以下条件的: