Bagaimana saya bisa mencetak Openlayers dengan lapisan OSM dasar dan Geoserver WMS?


9

Saya memiliki peta yang ingin saya cetak setelah pengguna membuka beberapa lapisan. Lapisan adalah geoserver wms dan lapisan dasar adalah OSM.

Saya tahu geoserver memiliki modul pencetakan (yang diinstal dan berfungsi karena saya mendapat balasan dari geoserver / pdf / info.json? Var = printCapabilities

Yang tidak saya mengerti adalah bagaimana saya menggunakannya untuk mencetak peta saat ini dengan lapisan yang terlihat.

Saya telah melihat contoh GeoExt (mapfish) tetapi tidak membantu saya memahami.

Pembaruan 1: Saya telah menghasilkan URL berikut dengan kode:

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

dan saya mendapatkan PDF kosong (hanya dengan judul) ... Apa yang salah?


1
Anda memerlukan "alat cetak online" , atau "generator PDF offline" lebih baik? (untuk kontrol yang baik dan jaminan kualitas hanya PDF yang aman)
Peter Krauss

Silakan periksa dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/… saya harap ini akan membantu.
Farhat Abbas

Saya tidak mengerti apa yang ingin Anda capai. Apakah Anda ingin pengguna dapat mencetak (di web) atau Anda ingin mencetak peta (pdf katakanlah) dari lapisan osm + geoserver wms?
tudorbarascu

@Alophind: Anda harus menjawab pertanyaan yang diajukan ppl di komentar. Itu akan menentukan jawaban yang akan Anda dapatkan.
Devdatta Tengshe

Saya pergi, @PeterKrauss - Saya ingin kemampuan untuk mencetak bagian peta pada browser yang diberikan, PDF juga bagus.
Alophind

Jawaban:


7

Proses pencetakan Geoserver melibatkan dua langkah.

Pertama di sisi server , Anda harus mengkonfigurasi file yaml Anda, yang disebut config.yaml. Buka dokumentasi terperinci di halaman dokumentasi modul cetak MapFish .

Setelah ini selesai, langkah kedua adalah untuk sisi klien . Mengingat Anda menggunakan openlayer untuk front-end Anda, untuk mendapatkan daftar lapisan yang terlihat, Anda akan memerlukan loop sederhana dengan pemeriksaan visibilitas, misalnya

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

Sekarang Anda harus meneruskan ini ke url cetak Anda. misalnya

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

Tentu saja Anda harus membuat perubahan yang relevan di URL. Selanjutnya tetapkan URL ini ke tombol cetak Anda dan panggil fungsi klik secara pragmatis.

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

Dan selesai !!!


Saya mendapatkan kesalahan: Kesalahan saat membuat PDF: org.mapfish.print.JsonMissingException: atribut [spec.mapTitle] hilang
Alophind

Saya telah menambahkan contoh untuk URL dan pengecualian, dapatkah Anda menyarankan kesalahan saya?
Alophind

1
Apa isi dari fungsi getMapScale?
Alophind

1
apakah itu berfungsi dengan OSM atau google base layer?
Alophind

1
@Alophind Saya belum memeriksa ini untuk lapisan peta Google, karena AFAIK menggunakan lapisan peta Google melalui API selain Google maps adalah ilegal. Meskipun situs web khusus ini tidak memiliki lapisan OSM, saya telah menggunakan OSM dalam aplikasi lain dengan fasilitas pencetakan.
thelastray

1

Jika Anda Pengguna Chrome, cara cepat dan sederhana adalah Google Cloud Print , tetapi dirancang untuk mencetak seluruh halaman web, tetapi Anda bisa menggunakan tampilan layar penuh dan mencetaknya.

Keuntungan lain adalah Anda dapat mencetak ke printer yang terhubung di mana saja Anda telah mendaftarkan printer pada akun Anda, sehingga pencetakan seluler tersedia untuk PC desktop Anda dengan printer yang terhubung, atau setiap PC dan Printer yang telah Anda daftarkan ke akun Google Anda. Itu mendukung Printer Legacy dan printer jaringan yang dirancang khusus untuk bekerja dengan Google Cloud Print.


1
Saya perlu mendukung semua browser terbaru, tidak hanya chrome
Alophind

1

Saya pikir Anda akan berada di jalur yang benar dengan geoserver dan plugin mapfish. Ini adalah apa yang saya gunakan untuk melakukan pencetakan untuk baselayer WMS dan OSM saya. Ada satu hal yang perlu diperhatikan jika Anda akan menggunakan metode ini. Jika Anda ingin peta yang dicetak dipindai dengan benar, Anda tidak akan dapat menggunakan OSM langsung dari situs yang ada karena proyeksi berada dalam skala yang tidak benar. Anda perlu memuat data ke dalam basis data dan menggunakan SRS yang berbeda.

Setelah mengatakan ini, saya akan memberikan ikhtisar singkat tentang cara mencetak bekerja dengan plugin mapfish di geoserver.

Pertama, Anda perlu mengunduh plugin mapfish dan menginstalnya di instalasi geoser Anda. Ketika saya pertama kali melakukan ini, langkah itu sepertinya tidak didokumentasikan di mana pun dalam tutorial atau demo untuk dicetak, jadi sebentar sebelum saya mengetahuinya. Juga agak sulit untuk menemukan plugin.

Halaman ini menunjukkan instruksi dari Geoserver tentang cara menginstal plugin dan menggunakannya. Pada dasarnya itu rusak menjadi:

  • Pergi ke halaman ini dan unduh file geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Ekstrak isi arsip ZIP ke / WEB-INF / lib / di webapp GeoServer
  • Mulai ulang Geoserver

Ok sekarang setelah plugin terinstal, Anda perlu mengkonfigurasi plugin yang dilakukan dengan memodifikasi file config.yaml yang dibicarakan oleh 'thelastray' dalam jawaban mereka di atas. File harus dibuat ketika GeoServer dihidupkan ulang dan ditemukan di lokasi berikut:

GEOSERVER_DATA_DIR / printing / config.yaml

Ada banyak opsi untuk ini sehingga Anda harus membaca dokumentasi di situs web Mapfish di sini.

Langkah selanjutnya adalah membuat aplikasi yang menggunakan plugin ini untuk melakukan pencetakan. Contoh aplikasi yang menggunakan pengaturan ini untuk mencetak menggunakan GeoEXT dapat ditemukan di sini . Jika Anda ingin melihat beberapa contoh, lihat halaman ini .

Semoga itu akan membantu Anda memulai.


Pertanyaan cepat / topik, Saat mencetak OSM dari database Anda, bagaimana Anda mendapatkan style di server WMS Anda agar sesuai dengan style OSM? (atau Anda melakukan gaya yang berbeda dan tidak cocok 100%)
Alophind

Saya menciptakan gaya saya sendiri. Saya akhirnya membuatnya mendekati gaya google maps daripada OSM.
Darkcylde

2
Bisakah Anda membagikannya?
Alophind


0

"Peta menjadi kertas" bisa lebih dari sekadar "pas gambar ke halaman" ... Sejarah Kartografi ditulis ke dalam kertas, dan hari ini beberapa produk kartografi masih membutuhkan kertas.

Hari ini, kertas adalah PDF - lupakan EPUB atau "cetak dengan browser", mereka menunggu standar, CSS3, dll. Untuk masa depan ... Dan produk kartografi (kertas) berkualitas baik membutuhkan XSLT-FO atau CSS2 . Dengan (X) HTML + CSS2 Anda dapat menghasilkan PDF yang bagus (!) ... HTML itu bukan "untuk peramban", adalah untuk alat "pembuatan PDF" (yang menghasilkan PDF sambil jalan atau offline).

Satu-satunya alat "profesional untuk menghasilkan PDF yang baik dengan HTML + CSS2" yang saya tahu, adalah PrinceXML : Saya diuji dengan "gambar on-fly" (SVG, JPG dan PNG) dari protokol WFS dan WMS , dan dengan OpenLayers , dan itu bekerja sangat baik (!).


0

Saya baru saja melakukan ini:

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

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

Menginstal keduanya di server saya + ref ke .js di tag dan di JS saya:

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

Memberi saya .png dari peta saat ini - yang bisa saya lakukan dengan apa pun - membutuhkan waktu kurang dari satu detik di pc saya.

Mini


-2

Dimungkinkan untuk mencetak langsung di web dengan alat-alat yang Anda miliki tetapi itu membutuhkan keterampilan yang tidak Anda miliki.

Solusi saya untuk Anda adalah menggunakan QGIS . Dengan menginstal plugin OpenLayers di QGIS Anda dapat mengakses lapisan OSM yang Anda inginkan dan menambahkan lapisan WMS Geoserver (dengan menambahkan lapisan WMS).

Kemudian Anda dapat mencetak dengan tampilan yang Anda inginkan dan lebih banyak lagi dengan bantuan alat canggih ini. Semua yang terbaik, Tudor

PS. Saya tahu bahwa jawaban saya mungkin bukan yang Anda harapkan tetapi akan berfungsi dan memberikan lebih banyak penyesuaian cetak daripada solusi web mana pun.


1
Ini adalah aplikasi web, menggunakan browser ... QGIS tidak relevan untuk solusi ini.
Alophind
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.