如何自动将谷歌卫星地图导出/提取到图像?

时间:2014-11-04 14:55:12

标签: google-maps phantomjs zombie.js

我需要使用一些谷歌航拍图片进行图像处理,因为我需要很多图片,所以很难手动屏幕拍摄这些图片,所以我想知道有没有办法自动导出给定地理位置的卫星图像。

我正在使用node.js,似乎zombie和phantom.js是模拟人类浏览器的方法,可以从浏览器中检索html,但是这些方法可以渲染google map html然后允许我做截图。

1 个答案:

答案 0 :(得分:0)

是的,使用简单的PhantomJS可以轻松完成。您也可以使用ZombieJS或CasperJS。它们使得处理许多步骤变得更容易,而不会遇到回调地狱或静态代码。

我添加了点击和输入所需的功能。设置用户代理字符串是必要的,否则Google将提供可能无法在(旧)PhantomJS 1.x引擎上运行的代码。

var page = require('webpage').create(),
    classical = true;

// This userAgent works good with GM
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1';
page.viewportSize = {
    width: 1280,
    height: 800
};

function click(selector){
    page.evaluate(function(selector){
        // taken from here: http://stackoverflow.com/a/15948355
        var ev = document.createEvent("MouseEvent");
        ev.initMouseEvent(
            "click",
            true /* bubble */, true /* cancelable */,
            window, null,
            0, 0, 0, 0, /* coordinates */
            false, false, false, false, /* modifier keys */
            0 /*left*/, null
        );
        document.querySelector(selector).dispatchEvent(ev);
    }, selector);
}

function type(text){
    page.evaluate(function(text, classical){
        var el = document.querySelector(classical ? "#gbqfq" : "#searchboxinput");
        el.value = text;
        el.focus();
    }, text, classical);
    page.sendEvent('keypress', page.event.key.Enter);
}

page.open("https://www.google.com/maps", function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
        phantom.exit();
    } else {
        if (classical) {
            click("#paneltoggle2");
        }
        setTimeout(function(){
            page.render("1.png");
            click(classical ? "#mv-primary-container > .mv-primary" : "button.widget-minimap-shim");
        }, 1000); // +1 sec
        setTimeout(function(){
            page.render("2.png");
            type("bern");
        }, 11000); //+10 sec
        setTimeout(function(){
            if (classical) {
                click("#paneltoggle2");
            }
        }, 16000); //+5 sec
        setTimeout(function(){
            page.render("3.png");
            phantom.exit();
        }, 21000); //+5 sec
    }
});

如果你正在使用PhantomJS版本< 1.9.8,您应该使用--ssl-protocol=tlsv1运行它。裁剪图像以使用clipRect无法看到控件也可能会有所帮助。