web-dev-qa-db-fra.com

Enregistrement d'une carte dynamique générée par l'API Google dans une image statique

J'ai une série de coordonnées que je trace sur une visualisation de heatmap générée par l'API à l'aide de l'API Google Maps. Les données changent tous les jours et je voudrais capturer la carte thermique et la sauvegarder en tant qu’image PNG ou JPG par programme à partir de PHP, de sorte que la carte d’un jour donné puisse être rappelée sans régénérer la carte et un certain nombre de données. les cartes pourraient être séquencées ensemble pour montrer les changements animés sur une période donnée. Je dois également pouvoir exporter un rapport PDF comprenant une carte thermique, ce qui ne fonctionnerait évidemment pas avec un cadre de page Web dynamique.

Est-ce que quelqu'un sait:

  • pour enregistrer une carte thermique générée par Google dans un fichier PNG ou JPG statique, autrement que de prendre manuellement une capture d’écran puis de la recadrer jusqu’aux limites de la carte? La solution doit fonctionner dans un environnement d'hébergement partagé sans interface graphique, car elle sera déployée sur de nombreux utilisateurs avec de nombreuses configurations d'hébergement différentes. La majorité d'entre eux ne seront pas des experts qualifiés en Linux ni un VPS. ou

  • d’un autre outil permettant de tracer les coordonnées sur une carte et d’en produire des visualisations telles que des cartes thermiques, qui peuvent être enregistrées dans des fichiers PNG ou JPG, à partir de PHP et en utilisant uniquement les classes PHP librement disponibles ou installées par défaut PHP modules? (c'est mon itinéraire préféré si quelqu'un a des outils en tête)

2
richhallstoke

Je travaille sur un projet avec une fonction similaire demandée. J'ai besoin de faire un rapport qui doit contenir des données et en plus des cartes (santé, cluster et marqueurs). À l'heure actuelle, je le fais côté client, avec html2canvas, mais comme vous, j'aimerais le faire côté serveur.

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

Et cette fonction

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
        });
      }
    });
}

Cette fonction est basée sur this answer.

NOTE: Je sais que c'est un très vieux billet (de 2014), mais je le poste parce que je pense que cela peut être utile pour quelqu'un. Mieux encore, quelqu'un peut nous donner la meilleure solution.

2
FoxEdu

Il est possible de prendre des captures d'écran par programme plutôt que manuellement. Je le fais sur mon site de tableaux et graphiques. Les graphiques sont générés côté client à l'aide de JavaScript, mais j'ai besoin d'images miniatures créées à partir d'eux.

J'utilise Java au lieu de PHP, mais il devrait être similaire.

  1. Installez xvfb (mémoire tampon d'images virtuelle X) afin que Firefox puisse s'exécuter sur un serveur sans tête. Démarrez-le en tant que démon configuré en tant qu'écran 99.
  2. Installez une version connue de firefox (par exemple /opt/firefox33/). J'ai constaté que les pilotes Selenium ne sont souvent pas compatibles avec la dernière version de Firefox jusqu'à ce que les bibliothèques soient mises à jour. L'installation d'une version connue me donne beaucoup plus de contrôle sur le processus de mise à niveau
  3. Lorsque vous avez besoin d’une capture d’écran, demandez à votre code de définir la variable d’environnement de l’écran et démarrez Selenium avec votre firefox installé.

Voici n article sur la prise en main de Selenium par PHP qui inclut un exemple de capture d'écran .

1