javascript google-maps html2canvas

javascript - html2canvas no funciona con Google Maps Pan



google-maps (3)

Estoy usando html2canvas para guardar mi mapa en línea como una imagen (vea el enlace Guardar como imagen). Lo he probado en Firefox, Chrome y Opera.

Tiende a funcionar más a menudo si no modifica el mapa predeterminado. Si hace zoom y luego desplaza el mapa, es menos probable que funcione. El mapa se desplazará, pero html2canvas usará el punto central anterior y los límites del mapa. Y html2canvas no podrá cargar mosaicos de mapas para los nuevos límites del mapa.

El mapa se desplaza correctamente, pero html2canvas utiliza el punto central antiguo y los límites del mapa. ¿Por qué es esto?

Para admitir la obtención de imágenes de diferentes dominios, tengo la configuración:

useCors: true;

He intentado las siguientes soluciones

-Cambiando manualmente el tipo de mapa. A veces esto lo arregla.

-Trigger el evento de cambio de tamaño del navegador - no es útil.

-Utilizando setTimeout () para esperar 2000 ms para asegurarse de que los mosaicos estén cargados, no es útil

-Utilizar un proxy (html2canvas_proxy_php.php) - no es útil

-Utilizando el evento inactivo de google maps para esperar a que el mapa esté inactivo antes de guardar, no es útil


Aparentemente, el problema parece deberse a que html2canvas no puede procesar transformaciones CSS, al menos en Chrome (solo pude reproducir el problema en Chrome, en OSX). El contenedor que contiene los mosaicos, se traduce mediante -webkit-transform . Entonces, lo que podríamos hacer es tomar los valores que el contenedor está desplazado, eliminar la transformación, asignar la left y la top de los valores que obtuvimos de la transform luego usar html2canvas . Entonces, para que el mapa no se rompa, restablecemos los valores css del mapa cuando se realiza html2canvas .

Así que pegué esto en la consola de javascript de su sitio y al parecer funcionó.

//get transform value 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($(''#map-canvas''), { useCORS: true, onrendered: function(canvas) { var dataUrl= canvas.toDataURL(''image/png''); location.href=dataUrl //for testing I never get window.open to work $(".gm-style>div:first>div").css({ left:0, top:0, "transform":transform }) } });


Después de que una actualización de Google Maps la solución de mfirdaus deje de funcionar, la nueva solución es esta:

var transform = $(".gm-style>div:first>div:first>div:last>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:first>div:last>div").css({ //get the map container. not sure if stable "transform": "none", "left": mapleft, "top": maptop, })

es el mismo pero necesitas cambiar el selector de

.gm-style>div:first>div

a

.gm-style>div:first>div:first>div:last>div

Manos arriba 🙂


Tengo el mismo problema, pero utilicé Leaflet Map en lugar de Google Map.

El codigo esta abajo

var transform=$(".leaflet-map-pane").css("transform"); if (transform) { var c = transform.split(","); var d = parseFloat(c[4]); var h = parseFloat(c[5]); $(".leaflet-map-pane").css({ "transform": "none", "left": d, "top": h }) } html2canvas(document.body).then(function(canvas){ $(".leaflet-map-pane").css({ left: 0, top: 0, "transform": transform }) } // Here is used html2canvas 1.0.0-alpha.9