¿Cómo puedo imprimir Openlayers con capas base OSM y Geoserver WMS?


9

Tengo un mapa que quiero imprimir una vez que el usuario abre algunas capas. Las capas son geoservidor wms y la capa base es OSM.

Sé que geoserver tiene un módulo de impresión (que está instalado y funciona porque recibo respuesta de geoserver / pdf / info.json? Var = printCapabilities

Lo que no entiendo es cómo lo uso para imprimir el mapa actual con capas visibles.

He visto el ejemplo de GeoExt (mapfish) pero no me ayudó a entender.

Actualización 1: he generado la siguiente URL por código:

http://77.235.53.170/geoserver/pdf/print.pdf?spec={%22units%22:%22degrees%22,%22srs%22:%22EPSG:4326%22,%22layout%22:%22A4%22,%22dpi%22:%22300%22,%22mapTitle%22:%22This%20is%20the%20map%20title%22,%22comment%22:%22This%20is%20the%20map%20comment%22,%22resourcesUrl%22:%20%22http://77.235.53.170/img%22,%22layers%22:[{%22baseURL%22:%22http://77.235.53.170/geoserver/Lehavim/wms%22,%22opacity%22:1,%22singleTile%22:true,%22type%22:%22WMS%22,%22layers%22:[%22%D7%A7%D7%95%20%D7%9E%D7%99%D7%9D%22],%22format%22:%22image/jpeg%22,%22styles%22:[%22%22]}],%22pages%22:[{%22center%22:[3875254.1134954,3680894.557955],%22scale%22:32000,%22rotation%22:0}]}

y obtengo PDF vacío (solo con título) ... ¿Qué podría estar mal?


1
¿Necesita una "herramienta de impresión en línea" o un "generador de PDF sin conexión" es mejor? (para un buen control y garantía de calidad única PDF es seguro)
Peter Krauss


No puedo entender exactamente lo que estás tratando de lograr. ¿Desea que el usuario pueda imprimir (en la web) o desea imprimir un mapa (digamos pdf) desde las capas osm + geoserver wms?
tudorbarascu

@Alophind: debe responder las preguntas que la gente ha formulado en los comentarios. Eso determinará las respuestas que obtendrá.
Devdatta Tengshe

Estaba ausente, @PeterKrauss: quiero la posibilidad de imprimir una sección del mapa en cualquier navegador, el PDF también es bueno.
Alophind

Respuestas:


7

El proceso de impresión de Geoserver implica dos pasos.

Primero en el lado del servidor , debe configurar su archivo yaml, llamado config.yaml. Consulte la documentación detallada en la página de documentación del módulo de impresión MapFish .

Una vez hecho esto, el segundo paso es para el lado del cliente . Teniendo en cuenta que está utilizando capas abiertas para su front-end, para obtener la lista de capas visibles, necesitará un bucle simple con verificación de visibilidad, por ejemplo

var layers = "";
for (var i = 0; i < map.layers.length; i++) {
    if(map.layers[i].visibility == true){
        //get a string of visible layers
        layers = layers + map.layers[i].name + ','
    }
}
//remove the trailing ','
layers = layers.slice(0, -1);

Ahora tiene que pasar esto a su url de impresión. p.ej

var maptitle= "This is the map title";
var mapcomment= "This is the map comment"
var printurl = "http://host:post/geoserver/pdf/print.pdf?spec={"units":"degrees","srs":"EPSG:4326","layout":"A4","dpi":"300","maptitle":"This is the map title","comment":"This is the map comment","resourcesUrl": "http://host:port/img","layers":[{"baseURL":"http://host:port/geoserver/workspace/wms","opacity":1,"singleTile":true,"type":"WMS","layers":["' + layers + '"],"format":"image/jpeg","styles":[""]}],"pages":[{"center":[' + map.getCenter().lon + ',' + map.getCenter().lat + '],"scale":' + getMapScale(Math.ceil(map.getScale())) + ',"rotation":0}]}'

Por supuesto, tendrá que hacer cambios relevantes en la URL. Luego asigne esta URL a su botón de impresión y luego llame a una función de clic pragmáticamente.

$("#btnprint").attr("href", printUrl);
$('#btnprint')[0].click();

¡¡¡Y hecho!!!


Recibo un error: Error al generar PDF: org.mapfish.print.JsonMissingException: falta el atributo [spec.mapTitle]
Alophind

He agregado un ejemplo para URL y excepción, ¿puede sugerirme qué estoy haciendo mal?
Alophind

1
¿Cuál es el contenido de la función getMapScale?
Alophind

1
¿funciona con OSM o capa base de google?
Alophind

1
@Alophind No he comprobado esto para la capa de mapa de Google, porque AFAIK usando la capa de mapa de Google a través de API que no sea Google Maps es ilegal. Aunque este sitio web específico tampoco tiene capa OSM, he usado OSM en otras aplicaciones con facilidad de impresión.
thelastray

1

Si usted es un usuario de Chrome, una forma rápida y sencilla es Google Cloud Print , pero está diseñado para imprimir toda la página web, pero puede usar una pantalla completa e imprimir eso.

Otra ventaja es que puede imprimir en una impresora conectada en cualquier lugar donde haya impresoras registradas en su cuenta, por lo que la impresión móvil está disponible para su PC de escritorio con una impresora conectada, o cualquier PC e Impresora que haya registrado en su cuenta de Google. Es compatible con impresoras heredadas e impresoras de red específicamente diseñadas para trabajar con Google Cloud Print.


1
Necesito soportar todos los navegadores recientes, no solo Chrome
Alophind

1

Creo que vas por el camino correcto con geoserver y el plugin mapfish. Es lo que uso para imprimir para mis capas base WMS y OSM. Sin embargo, hay una cosa a tener en cuenta si va a utilizar este método. Si desea que sus mapas impresos se escalen correctamente, no podrá usar OSM directamente desde ese sitio, ya que la proyección en la que se encuentra no se escala correctamente. Deberá cargar los datos en una base de datos y usar un SRS diferente.

Dicho esto, le daré un resumen rápido sobre cómo hacer que la impresión funcione con el complemento mapfish en geoserver.

Primero deberá descargar el complemento mapfish e instalarlo en su instalación de geoser. Cuando hice esto por primera vez, ese paso no parecía estar documentado en ninguna parte de los tutoriales o demos para imprimir, así que fue un tiempo antes de que lo descubriera. También fue algo difícil encontrar el complemento.

Esta página muestra las instrucciones de Geoserver sobre cómo instalar el complemento y usarlo. Básicamente se descompone en:

  • Vaya a esta página y descargue el archivo geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Extraiga el contenido del archivo ZIP en / WEB-INF / lib / en la aplicación web GeoServer
  • Reiniciar Geoserver

Ok, ahora que el complemento está instalado, deberá con fi gurar el complemento, lo que se hace modificando el archivo config.yaml del que habla 'thelastray' en su respuesta anterior. El archivo debe crearse cuando se reinicia GeoServer y se encuentra en la siguiente ubicación:

GEOSERVER_DATA_DIR / printing / config.yaml

Hay muchas opciones para esto, por lo que deberá revisar la documentación en el sitio web de Mapfish aquí.

El siguiente paso es crear una aplicación que use este complemento para imprimir. Un ejemplo de una aplicación que utiliza esta configuración para imprimir utilizando GeoExt se puede encontrar aquí . Si desea ver más ejemplos, mire en esta página.

Esperemos que eso te ayude a comenzar.


Pregunta rápida / tema, Al imprimir OSM desde su base de datos, ¿cómo consiguió que el estilo en su servidor WMS coincidiera con el estilo OSM? (o hiciste un estilo diferente y no coincide al 100%)
Alophind

Creé mi propio estilo. Terminé haciéndolo cerrar al estilo de Google Maps que OSM.
Darkcylde

2
¿Puedes compartirlo por favor?
Alophind


0

"Map into paper" puede ser más que simple "ajustar la imagen a la página" ... La historia de la Cartografía se escribió en papel, y hoy en día algunos productos cartográficos aún exigen papel.

Hoy en día, el papel es PDF : olvídate de EPUB o "imprime por navegador", están esperando estándares, CSS3, etc., son para el futuro ... Y los productos cartográficos de buena calidad (papel) necesitan XSLT-FO o CSS2 . Con (X) HTML + CSS2 puede producir un buen PDF (!) ... Ese HTML no es "para el navegador", es para una herramienta de "generación de PDF" (que genera PDF sobre la marcha o sin conexión).

La única "herramienta profesional para generar un buen PDF con HTML + CSS2" que conozco es PrinceXML : probé con "imágenes sobre la marcha" (SVG, JPG y PNG) de los protocolos WFS y WMS , y con OpenLayers , y funciona muy bien (!)


0

Acabo de hacer esto:

Html2canvas.js descargado ( https://github.com/niklasvh/html2canvas/releases )

Descargado html2canvas-proxy.php ( https://github.com/adjdred/html2canvas-proxy-php )

Los instalé en mi servidor + ref .js en la etiqueta y en mi JS:

html2canvas(document.getElementById("map"), {
    proxy: "../lib/html2canvasproxy.php",
    logging : true,
    onrendered: function (canvas) {
        var img = canvas.toDataURL("image/png");
        window.open(img);
    }
});

Me da un .png del mapa actual, con el que puedo hacer lo que sea, toma menos de un segundo en mi PC.

Mini


-2

Es posible imprimir directamente en la web con las herramientas que tiene, pero eso requeriría algunas habilidades que no posee.

Mi solución para usted sería usar QGIS . Al instalar el complemento OpenLayers en QGIS, puede acceder a la capa OSM que desee y agregar la capa Geoserver WMS (agregando una capa WMS).

Luego puede imprimir con el aspecto que desee y más con la ayuda de esta poderosa herramienta. Todo lo mejor, Tudor.

PD. Sé que mi respuesta probablemente no sea la que esperaba, pero funcionará y proporciona más personalización de impresión que cualquier solución web.


1
Esta es una aplicación web que utiliza navegadores ... QGIS no es relevante para esta solución.
Alophind
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.