Comment imprimer des Openlayers avec des couches de base OSM et Geoserver WMS?

9

J'ai une carte que je souhaite imprimer une fois que l'utilisateur a ouvert certaines couches. Les couches sont géoserveur wms et la couche de base est OSM.

Je sais que geoserver a un module d'impression (qui est installé et fonctionne parce que je reçois une réponse de geoserver / pdf / info.json? Var = printCapabilities

Ce que je ne comprends pas, c'est comment je l'utilise pour imprimer la carte actuelle avec des couches visibles.

J'ai regardé l'exemple de GeoExt (mapfish) mais cela ne m'a pas aidé à comprendre.

Mise à jour 1: j'ai généré l'URL suivante par code:

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}]}

et je reçois un PDF vide (uniquement avec le titre) ... Qu'est-ce qui pourrait ne pas arriver?

Alophind
la source
1
Vous avez besoin d'un "outil d'impression en ligne" , ou d'un "générateur PDF hors ligne", c'est mieux? (pour un bon contrôle et une assurance qualité, seul le PDF est sûr)
Peter Krauss
Veuillez consulter dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/… j'espère que cela vous aidera.
Farhat Abbas
Je ne peux pas comprendre exactement ce que vous essayez d'accomplir. Souhaitez-vous que l'utilisateur puisse imprimer (sur le Web) ou voulez-vous imprimer une carte (pdf disons) à partir de couches osm + geoserver wms?
tudorbarascu
@Alophind: Vous devez répondre aux questions que ppl a posées dans les commentaires. Cela déterminera les réponses que vous obtiendrez.
Devdatta Tengshe
J'étais absent, @PeterKrauss - Je veux pouvoir imprimer une section de la carte sur n'importe quel navigateur, le PDF est également bon.
Alophind

Réponses:

7

Le processus d'impression du géoserveur comprend deux étapes.

D'abord côté serveur , vous devez configurer votre fichier yaml, appelé config.yaml. Parcourez la documentation détaillée sur la page de documentation du module d'impression MapFish .

Une fois cela fait, la deuxième étape est du côté client . Étant donné que vous utilisez des couches ouvertes pour votre frontal, afin d'obtenir la liste des couches visibles, vous aurez besoin d'une boucle simple avec vérification de la visibilité, par exemple

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

Vous devez maintenant le transmettre à votre URL d'impression. par exemple

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}]}'

Bien sûr, vous devrez apporter des modifications pertinentes à l'URL. Attribuez ensuite cette URL à votre bouton d'impression, puis appelez une fonction de clic de manière pragmatique.

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

Et.. Voila!!!

thelastray
la source
Im obtention d'une erreur: erreur lors de la génération du PDF: org.mapfish.print.JsonMissingException: attribut [spec.mapTitle] manquant
Alophind
J'ai ajouté un exemple d'URL et d'exception, pouvez-vous suggérer ce que je fais mal?
Alophind
1
Quel est le contenu de la fonction getMapScale?
Alophind
1
ça marche avec OSM ou google base layer?
Alophind
1
@Alophind Je n'ai pas vérifié cela pour la couche Google map, car AFAIK utilisant la couche Google map via une API autre que Google maps est illégal. Bien que ce site Web spécifique n'ait pas de couche OSM non plus, j'ai utilisé OSM dans d'autres applications avec facilité d'impression.
thelastray
1

Si vous êtes un utilisateur Chrome, Google Cloud Print est un moyen rapide et simple , mais il est conçu pour imprimer la page Web entière, mais vous pouvez utiliser un affichage plein écran et l'imprimer.

Un autre avantage est que vous pouvez imprimer sur une imprimante connectée partout où vous avez enregistré des imprimantes sur votre compte, de sorte que l'impression mobile est disponible sur votre ordinateur de bureau avec une imprimante connectée, ou tout ordinateur et imprimante que vous avez enregistrés sur votre compte Google. Il prend en charge les imprimantes héritées et les imprimantes réseau spécialement conçues pour fonctionner avec Google Cloud Print.

Mark Cupitt
la source
1
Je dois prendre en charge tous les navigateurs récents, pas seulement le chrome
Alophind
1

Je pense que vous allez sur la bonne voie avec geoserver et le plugin mapfish. C'est ce que j'utilise pour imprimer mes sous-couches WMS et OSM. Il y a cependant une chose à noter si vous allez utiliser cette méthode. Si vous voulez que vos cartes imprimées soient scallées correctement, vous ne pourrez pas utiliser OSM directement à partir de ce site car la projection dans laquelle il se trouve n'est pas mise à l'échelle correctement. Vous devrez charger les données dans une base de données et utiliser un SRS différent.

Cela dit, je vais vous donner un bref aperçu sur la façon de faire fonctionner l'impression avec le plugin mapfish dans geoserver.

Vous devez d'abord télécharger le plugin mapfish et l'installer dans votre installation geoser. Lorsque j'ai fait cela pour la première fois, cette étape ne semblait pas être documentée nulle part dans les didacticiels ou les démos pour l'impression, il a donc fallu un certain temps avant de le comprendre. De plus, il était quelque peu difficile de trouver le plugin.

Cette page montre les instructions de Geoserver sur la façon d'installer le plugin et de l'utiliser. Fondamentalement, il se décompose en:

  • Accédez à cette page et téléchargez le fichier geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Extraire le contenu de l'archive ZIP dans / WEB-INF / lib / dans la webapp GeoServer
  • Redémarrez Geoserver

Ok maintenant que le plugin est installé, vous devrez configurer le plugin, ce qui se fait en modifiant le fichier config.yaml dont 'thelastray' parle dans leur réponse ci-dessus. Le fichier doit être créé au redémarrage de GeoServer et se trouve à l'emplacement suivant:

GEOSERVER_DATA_DIR / printing / config.yaml

Il existe de nombreuses options pour cela, vous devrez donc parcourir la documentation sur le site Web de Mapfish ici.

L'étape suivante consiste à créer une application qui utilise ce plugin pour effectuer l'impression. Un exemple d'application utilisant cette configuration pour imprimer avec GeoEXT peut être trouvé ici . Si vous souhaitez voir d'autres exemples, regardez sur cette page.

J'espère que cela vous aidera à démarrer.

Darkcylde
la source
Question rapide / sujet, lors de l'impression d'OSM à partir de votre base de données, comment avez-vous obtenu le style de votre serveur WMS pour correspondre au style OSM? (ou vous avez fait un style différent et ce n'est pas un match à 100%)
Alophind
J'ai créé mon propre style. J'ai fini par le rapprocher du style google maps de l'OSM.
Darkcylde
2
Pouvez-vous le partager s'il vous plaît?
Alophind
0

"Carte en papier" peut être plus que simple "adapter l'image à la page" ... L'histoire de la Cartographie a été écrite sur papier, et aujourd'hui certains produits cartographiques demandent encore du papier.

Aujourd'hui, le papier est au format PDF - oubliez EPUB ou "impression par navigateur", ce sont des normes en attente, CSS3, etc., sont pour l'avenir ... Et les produits cartographiques (papier) de bonne qualité ont besoin de XSLT-FO ou CSS2 . Avec (X) HTML + CSS2, vous pouvez produire de bons PDF (!) ... Ce HTML n'est pas "pour navigateur", c'est pour un outil de "génération de PDF" (qui génère des PDF à la volée ou hors ligne).

Le seul "outil professionnel pour générer de bons PDF avec HTML + CSS2" que je connaisse, est PrinceXML : j'ai testé avec des "images à la volée" (SVG, JPG et PNG) à partir des protocoles WFS et WMS , et avec OpenLayers , et fonctionne si bien (!).

Peter Krauss
la source
0

Je viens de faire ça:

Html2canvas.js téléchargé ( https://github.com/niklasvh/html2canvas/releases )

Téléchargé html2canvas-proxy.php ( https://github.com/adjdred/html2canvas-proxy-php )

Installé à la fois sur mon serveur + ref à .js dans la balise et dans mon JS:

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

Me donne un .png de la carte actuelle - avec laquelle je peux faire n'importe quoi - prend moins d'une seconde sur mon PC.

Mini

minisaurus
la source
-2

Il est possible d'imprimer directement sur le web avec les outils dont vous disposez mais cela nécessiterait des compétences que vous ne possédez pas.

Ma solution pour vous serait d'utiliser QGIS . En installant le plugin OpenLayers dans QGIS, vous pouvez accéder à la couche OSM souhaitée et ajouter la couche Geoserver WMS (en ajoutant une couche WMS).

Ensuite, vous pouvez imprimer avec le look que vous souhaitez et plus encore à l'aide de cet outil puissant. Cordialement, Tudor

PS. Je sais que ma réponse n'est probablement pas ce que vous attendiez mais cela fonctionnera et fournira plus de personnalisation d'impression que n'importe quelle solution Web.

tudorbarascu
la source
1
Il s'agit d'une application web, utilisant des navigateurs ... QGIS n'est pas pertinent pour cette solution.
Alophind