web-dev-qa-db-ja.com

Google APIで生成された動的マップを静的画像に保存する

Google Maps APIを使用して、APIで生成されたヒートマップビジュアライゼーションにプロットする一連の座標データがあります。データは毎日変化します。ヒートマップをキャプチャし、PNGまたはJPG画像としてPHP内からプログラムで保存して、特定の日のマップを再生成せずに呼び出すことができます。マップをシーケンス化して、特定の期間にアニメーション化された変更を表示することができます。また、ヒートマップを含むPDFレポートをエクスポートできる必要がありますが、これは明らかに動的なWebページフレームでは機能しません。

誰か知っている:

  • googleが生成したヒートマップを静的なPNGまたはJPGファイルに保存する方法の例。手動でスクリーンショットを撮り、それをマップの境界にトリミングする以外にこのソリューションは、多くの異なるホスティング構成を持つ多くのユーザーに展開されるため、GUIなしの共有ホスティング環境で動作する必要があります。大半は熟練したLinuxの専門家やVPSの実行ではありません。または

  • 座標をマップにプロットし、これからヒートマップなどの視覚化を生成する代替ツールの開発。これは、PHP内からPNGまたはJPGファイルに保存でき、自由に利用可能なPHPクラスまたはデフォルトでインストールされたPHPモジュール? (誰かがツールを念頭に置いている場合、これは私の優先ルートです)

2
richhallstoke

私は同様の要求された機能を持つプロジェクトに取り組んでいます。いくつかのデータと、さらにいくつかのマップ(ヒース、クラスター、マーカー)を含める必要があるレポートを作成する必要があります。現時点では、html2canvasを使用してクライアント側で実行していますが、あなたと同じように、サーバー側でも実行したいと思います。

google.maps.event.addListener(DivMap, 'tilesloaded', function(){
    setTimeout(function(){ //Trying to ensure full map render
        Map2Image("DivMap","store_mapImage.php","png");
    },1000);
});

そして、この機能

function Map2Image(MapDiv,phpup,format){
    var transform=$(".gm-style>div:first>div").css("transform")
    var comp=transform.split(",") //split up the transform matrix
    var mapleft=parseFloat(comp[4]) //get left value
    var maptop=parseFloat(comp[5])  //get top value
    $(".gm-style>div:first>div").css({ //get the map container. not sure if stable
        "transform":"none",
        "left":mapleft,
        "top":maptop,
        })
    }
    html2canvas(document.getElementById(MapDiv),{
      useCORS: true,
      onrendered: function(canvas){
        $.post(phpup,{image:canvas.toDataURL("image/"+format)});
        $(".gm-style>div:first>div").css({
            left:0,
            top:0,
            "transform":transform
        });
      }
    });
}

この関数は this answerに基づいています。

注:非常に古い投稿(2014年から)を知っていますが、誰かに役立つと思うので、これを投稿しています。さらに良いことに、誰かが私たちに最高の解決策を与えることができます。

2
FoxEdu

手動ではなくプログラムでスクリーンショットを撮ることができます。これは、チャートとグラフのサイトで行います。グラフはJavaScriptを使用してクライアント側で生成されますが、それらから作成されたサムネイル画像が必要です。

PHPの代わりにJavaを使用していますが、似ているはずです。

  1. Firefoxがヘッドレスサーバーで実行できるように、xvfb(X仮想フレームバッファー)をインストールします。画面99として設定されたデーモンとして起動します。
  2. Firefoxの既知のバージョンをインストールします(例:/ opt/firefox33 /)。ライブラリが更新されるまで、Seleniumドライバーは多くの場合、Firefoxの最新リリースと互換性がないことがわかりました。既知のバージョンをインストールすると、アップグレードプロセスをより詳細に制御できます。
  3. スクリーンショットが必要な場合は、コードに画面環境変数を設定してもらい、インストールしたFirefoxでSeleniumを起動してください。

スクリーンショットの例を含むPHPからのSeleniumの使用開始に関する記事 です。

1