Come posso stampare Openlayer con livelli OSM e Geoserver WMS di base?


9

Ho una mappa che voglio stampare una volta che l'utente ha aperto alcuni livelli. I livelli sono geoserver wms e il livello base è OSM.

So che geoserver ha un modulo di stampa (che è installato e funzionante perché ricevo risposta da geoserver / pdf / info.json? Var = printCapabilities

Quello che non capisco è come lo uso per stampare la mappa corrente con livelli visibili.

Ho visto l'esempio di GeoExt (mapfish) ma non mi ha aiutato a capire.

Aggiornamento 1: ho generato il seguente URL per codice:

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

e sto ottenendo PDF vuoto (solo con titolo) ... Cosa potrebbe esserci di sbagliato?


1
Hai bisogno di uno "strumento di stampa online" o un "generatore PDF offline" è meglio? (per un buon controllo e controllo della qualità solo il PDF è sicuro)
Peter Krauss

Si prega di dare un'occhiata a dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/… spero che possa aiutare.
Farhat Abbas,

Non riesco a capire esattamente cosa stai cercando di realizzare. Vuoi che l'utente sia in grado di stampare (nel web) o vuoi stampare una mappa (pdf diciamo) da osm layer + geoserver wms?
Tudorbarascu,

@Alophind: devi rispondere alle domande che ppl ha posto nei commenti. Ciò determinerà le risposte che otterrai.
Devdatta Tengshe,

Ero via, @PeterKrauss - Voglio la possibilità di stampare la sezione della mappa su un determinato browser, anche il PDF è buono.
Alophind,

Risposte:


7

Il processo di stampa del geoserver prevede due passaggi.

Innanzitutto sul lato server , devi configurare il tuo file yaml, chiamato config.yaml. Consultare la documentazione dettagliata nella pagina della documentazione del modulo di stampa MapFish .

Fatto ciò, il secondo passo è per il lato client . Considerando che stai usando openlayer per il tuo front-end, al fine di ottenere l'elenco dei livelli visibili, avrai bisogno di un semplice ciclo con controllo della visibilità, ad es.

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

Ora devi passare questo al tuo URL di stampa. per esempio

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

Ovviamente dovrai apportare modifiche rilevanti nell'URL. Quindi assegnare questo URL al pulsante di stampa e quindi chiamare una funzione clic pragmaticamente.

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

E fatto !!!


Sto ottenendo errore: errore durante la generazione di PDF: org.mapfish.print.JsonMissingException: attributo [spec.mapTitle] mancante
Alophind

Ho aggiunto un esempio di URL ed eccezione, puoi suggerire cosa sto facendo di sbagliato?
Alophind,

1
Qual è il contenuto della funzione getMapScale?
Alophind,

1
funziona con OSM o google base layer?
Alophind,

1
@Alophind Non ho verificato questo per il livello di mappe di Google, perché AFAIK che utilizza il livello di mappe di Google tramite API diverse dalle mappe di Google è illegale. Anche se questo sito Web specifico non ha nemmeno il livello OSM, ho usato OSM in altre applicazioni con funzionalità di stampa.
theelastray,

1

Se sei un utente Chrome, un modo rapido e semplice è Google Cloud Print , ma è progettato per stampare l'intera pagina Web, ma è possibile utilizzare un display a schermo intero e stamparlo.

Un altro vantaggio è che puoi stampare su una stampante connessa ovunque ci siano stampanti registrate sul tuo account, quindi la stampa mobile è disponibile sul tuo PC desktop con una stampante connessa, o su qualsiasi PC e stampante che hai registrato sul tuo account Google. Supporta stampanti legacy e stampanti di rete appositamente progettate per funzionare con Google Cloud Print.


1
Devo supportare tutti i browser recenti, non solo Chrome
Alophind,

1

Penso che stai andando sulla strada giusta con geoserver e il plugin mapfish. È quello che uso per fare la stampa per i miei baselayer WMS e OSM. C'è una cosa da notare se si intende utilizzare questo metodo. Se vuoi che le tue mappe stampate vengano scaricate correttamente, non sarai in grado di utilizzare OSM direttamente dal loro sito poiché la proiezione in cui si trova non viene ridimensionata correttamente. Sarà necessario caricare i dati in un database e utilizzare un SRS diverso.

Detto questo, ti darò una rapida panoramica su come far funzionare la stampa con il plugin mapfish in geoserver.

Per prima cosa dovrai scaricare il plug-in mapfish e installarlo nella tua installazione geoser. Quando ho fatto questo per la prima volta, quel passaggio non sembrava essere documentato da nessuna parte nei tutorial o nelle demo per la stampa, quindi è stato un po 'di tempo prima che lo capissi. Inoltre è stato in qualche modo difficile trovare il plugin.

Questa pagina mostra le istruzioni di Geoserver su come installare il plugin e utilizzarlo. Fondamentalmente si scompone in:

  • Vai a questa pagina e scarica il file geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Estrarre il contenuto dell'archivio ZIP in / WEB-INF / lib / nella webapp GeoServer
  • Riavvia Geoserver

Ok ora che il plug-in è installato, dovrai configurare il plug-in che viene fatto modificando il file config.yaml di cui parla "theelastray" nella loro risposta sopra. Il file deve essere creato al riavvio di GeoServer e si trova nella seguente posizione:

GEOSERVER_DATA_DIR / stampa / config.yaml

Ci sono molte opzioni per questo, quindi dovrai consultare la documentazione sul sito Web Mapfish qui.

Il prossimo passo è creare un'applicazione che utilizza questo plugin per eseguire la stampa. Un esempio di un'applicazione che utilizza questa configurazione per la stampa tramite GeoEXT è disponibile qui . Se desideri vedere altri esempi, consulta questa pagina.

Spero che ti possa iniziare.


Quick off / topic question, Quando hai stampato OSM dal tuo database, come hai ottenuto lo stile nel tuo server WMS per abbinare lo stile OSM? (o hai fatto uno stile diverso e non corrisponde al 100%)
Alophind

Ho creato il mio stile. Ho finito per chiuderlo allo stile di google maps di OSM.
Darkcylde,

2
Puoi condividerlo per favore?
Alophind,


0

"Mappa su carta" può essere più che semplice "adattare l'immagine alla pagina" ... La storia della cartografia è stata scritta su carta e oggi alcuni prodotti cartografici richiedono ancora carta.

Oggi la carta è PDF - dimentica EPUB o "stampa dal browser", stanno aspettando standard, CSS3, ecc., Sono per il futuro ... E i prodotti cartografici (cartacei) di buona qualità hanno bisogno di XSLT-FO o CSS2 . Con (X) HTML + CSS2 puoi produrre un buon PDF (!) ... Che HTML non è "per browser", è per uno strumento di "generazione PDF" (che genera PDF al volo o offline).

L'unico "strumento professionale per generare un buon PDF con HTML + CSS2" che conosco, è PrinceXML : ho testato con "immagini al volo" (SVG, JPG e PNG) dai protocolli WFS e WMS , e con OpenLayer e funziona così bene (!).


0

Ho appena fatto questo:

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

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

Li ho installati entrambi sul mio server + ref a .js nel tag e nel mio JS:

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

Mi dà un .png della mappa corrente - che posso fare con qualsiasi cosa - richiede meno di un secondo sul mio pc.

Mini


-2

È possibile stampare direttamente sul web con gli strumenti che hai ma ciò richiederebbe alcune abilità che non possiedi.

La mia soluzione per te sarebbe usare QGIS . Installando il plug-in OpenLayers in QGIS è possibile accedere al livello OSM desiderato e aggiungere il livello WMS Geoserver (aggiungendo un livello WMS).

Quindi puoi stampare con l'aspetto che desideri e altro ancora con l'aiuto di questo potente strumento. Ti auguro il meglio, Tudor

PS. So che la mia risposta non è probabilmente quella che ti aspettavi, ma funzionerà e fornirà più personalizzazione della stampa rispetto a qualsiasi soluzione web.


1
Questa è un'applicazione Web che utilizza i browser ... QGIS non è rilevante per questa soluzione.
Alophind,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.