ฉันจะพิมพ์ Openlayers ด้วยเลเยอร์ OSM และ Geoserver WMS ได้อย่างไร


9

ฉันมีแผนที่ฉันต้องการพิมพ์เมื่อผู้ใช้เปิดเลเยอร์ เลเยอร์คือ geoserver wms และเลเยอร์พื้นฐานคือ OSM

ฉันรู้ว่า geoserver มีโมดูลการพิมพ์ (ซึ่งติดตั้งและทำงานอยู่เพราะฉันได้รับคำตอบจาก geoserver / pdf / info.json? var = printCapabilities

สิ่งที่ฉันไม่เข้าใจคือฉันใช้มันเพื่อพิมพ์แผนที่ปัจจุบันด้วยเลเยอร์ที่มองเห็นได้

ฉันดูที่ตัวอย่าง GeoExt (mapfish) แต่มันไม่ได้ช่วยให้ฉันเข้าใจ

อัปเดต 1: ฉันสร้าง URL ต่อไปนี้ด้วยรหัสแล้ว:

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

และฉันได้รับไฟล์ PDF ว่างเปล่า (มี แต่ชื่อเท่านั้น) ... มีอะไรผิดปกติหรือเปล่า


1
คุณต้องการ"เครื่องมือการพิมพ์ออนไลน์"หรือ"ตัวสร้างPDF ออฟไลน์"ดีกว่าไหม (สำหรับการควบคุมที่ดีและการประกันคุณภาพ PDF ที่ปลอดภัยเท่านั้น)
Peter Krauss

โปรดตรวจสอบdev.openlayers.org/sandbox/camptocamp/canvas/openlayers/…ฉันหวังว่ามันจะช่วยได้
Farhat Abbas

ฉันไม่เข้าใจสิ่งที่คุณกำลังพยายามทำให้สำเร็จ คุณต้องการให้ผู้ใช้สามารถพิมพ์ (ในเว็บ) หรือคุณต้องการพิมพ์แผนที่ (pdf สมมุติว่า) จาก osm layer + geoserver wms หรือไม่?
tudorbarascu

@Alophind: คุณต้องตอบคำถามที่ ppl ได้ถามในความคิดเห็น ที่จะกำหนดคำตอบที่คุณจะได้รับ
Devdatta Tengshe

ฉันไม่อยู่ @PeterKrauss - ฉันต้องการความสามารถในการพิมพ์ส่วนของแผนที่บนเบราว์เซอร์ใดก็ตาม PDF ก็ดีเช่นกัน
Alophind

คำตอบ:


7

กระบวนการพิมพ์ Geoserver เกี่ยวข้องกับสองขั้นตอน

ก่อนอื่นที่ฝั่งเซิร์ฟเวอร์คุณต้องกำหนดค่าไฟล์ yaml ของคุณที่เรียกว่า config.yaml ไปถึงเอกสารรายละเอียดที่MapFish พิมพ์หน้าเอกสารของโมดูล

ครั้งนี้ทำขั้นตอนที่สองสำหรับฝั่งไคลเอ็นต์ เมื่อพิจารณาว่าคุณใช้ openlayers สำหรับ front-end ของคุณเพื่อรับรายการเลเยอร์ที่มองเห็นได้คุณจะต้องมีลูปแบบง่าย ๆ พร้อมการตรวจสอบการมองเห็นเช่น

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

ตอนนี้คุณต้องผ่านสิ่งนี้ไปยัง url การพิมพ์ของคุณ เช่น

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

แน่นอนคุณจะต้องทำการเปลี่ยนแปลงที่เกี่ยวข้องใน URL ต่อไปกำหนด URL นี้ให้กับปุ่มพิมพ์ของคุณจากนั้นเรียกใช้ฟังก์ชั่นคลิกในทางปฏิบัติ

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

และทำ !!!


ฉันได้รับข้อผิดพลาด: เกิดข้อผิดพลาดขณะสร้าง PDF: org.mapfish.print.JsonMissingException: attribute [spec.mapTitle] หายไป
Alophind

ฉันได้เพิ่มตัวอย่างสำหรับ URL และข้อยกเว้นคุณสามารถแนะนำสิ่งที่ฉันทำผิดได้ไหม
Alophind

1
เนื้อหาของฟังก์ชัน getMapScale คืออะไร
Alophind

1
มันใช้งานได้กับ OSM หรือ google base layer?
Alophind

1
@Alophind ฉันไม่ได้ตรวจสอบสิ่งนี้กับเลเยอร์แผนที่ของ Google เนื่องจาก AFAIK ที่ใช้เลเยอร์แผนที่ของ Google ผ่าน API อื่นที่ไม่ใช่ Google Maps นั้นผิดกฎหมาย แม้ว่าเว็บไซต์เฉพาะนี้ไม่มีเลเยอร์ OSM แต่ฉันใช้ OSM ในแอพพลิเคชั่นอื่น ๆ
thelastray

1

หากคุณเป็นผู้ใช้ Chrome วิธีที่ง่ายและรวดเร็วคือ Google Cloud Printแต่ได้รับการออกแบบมาเพื่อพิมพ์หน้าเว็บทั้งหมด แต่คุณสามารถใช้การแสดงผลเต็มหน้าจอและพิมพ์ได้

ข้อดีอีกประการหนึ่งคือคุณสามารถพิมพ์ไปยังเครื่องพิมพ์ที่เชื่อมต่อทุกที่ที่คุณมีเครื่องพิมพ์ที่ลงทะเบียนไว้ในบัญชีของคุณดังนั้นการพิมพ์บนอุปกรณ์พกพาจึงสามารถใช้งานได้บนพีซีตั้งโต๊ะของคุณด้วยเครื่องพิมพ์ที่เชื่อมต่อหรือพีซีและเครื่องพิมพ์ใด ๆ รองรับเครื่องพิมพ์รุ่นเก่าและเครื่องพิมพ์เครือข่ายที่ออกแบบมาเพื่อทำงานกับ Google Cloud Print โดยเฉพาะ


1
ฉันต้องการสนับสนุนเบราว์เซอร์ล่าสุดทั้งหมดไม่ใช่เฉพาะ Chrome
Alophind

1

ฉันคิดว่าคุณกำลังเดินไปในทิศทางที่ถูกต้องด้วย geoserver และปลั๊กอิน mapfish มันเป็นสิ่งที่ฉันใช้ในการพิมพ์สำหรับผู้อ้างอิงพื้นฐาน WMS และ OSM ของฉัน มีสิ่งหนึ่งที่ควรทราบหากคุณจะใช้วิธีนี้ หากคุณต้องการให้แผนที่ที่พิมพ์ออกมาถูกต้องคุณจะไม่สามารถใช้ OSM ได้โดยตรงจากไซต์ดังกล่าวเนื่องจากการฉายภาพนั้นไม่ได้ปรับขนาดอย่างถูกต้อง คุณจะต้องโหลดข้อมูลลงในฐานข้อมูลและใช้ SRS อื่น

ต้องบอกว่านี้ฉันจะให้คุณ rundown อย่างรวดเร็วเกี่ยวกับวิธีการพิมพ์ทำงานกับปลั๊กอิน mapfish ใน geoserver

ก่อนอื่นคุณจะต้องดาวน์โหลดปลั๊กอิน mapfish และติดตั้งในการติดตั้ง geoser ของคุณ ตอนแรกที่ฉันทำขั้นตอนนี้ดูเหมือนว่าจะไม่ได้รับการบันทึกไว้ที่ใดก็ตามในบทเรียนหรือการสาธิตเพื่อการพิมพ์ดังนั้นจึงเป็นเวลาสั้น ๆ ก่อนที่ฉันจะค้นพบมัน นอกจากนี้มันค่อนข้างยากที่จะหาปลั๊กอิน

หน้านี้แสดงคำแนะนำจาก Geoserver เกี่ยวกับวิธีติดตั้งปลั๊กอินและใช้งาน โดยทั่วไปจะแบ่งลงเป็น:

  • ไปที่หน้านี้และดาวน์โหลดไฟล์ geoserver-2.1-SNAPSHOT-printing-plugin.zip
  • แตกเนื้อหาของไฟล์เก็บถาวร ZIP ลงใน / WEB-INF / lib / ในเว็บแอป GeoServer
  • รีสตาร์ท Geoserver

ตกลงตอนนี้ติดตั้งปลั๊กอินที่คุณจะต้อง conifure ปลั๊กอินที่ทำโดยการแก้ไขไฟล์ config.yaml ที่ 'thelastray' พูดถึงในคำตอบของพวกเขาข้างต้น ไฟล์ควรถูกสร้างขึ้นเมื่อ GeoServer เริ่มต้นใหม่และพบในตำแหน่งต่อไปนี้:

GEOSERVER_DATA_DIR / พิมพ์ / config.yaml

มีตัวเลือกมากมายสำหรับสิ่งนี้ดังนั้นคุณจะต้องอ่านเอกสารในเว็บไซต์ Mapfish ที่นี่

ขั้นตอนต่อไปคือการสร้างแอปพลิเคชันที่ใช้ปลั๊กอินนี้เพื่อทำการพิมพ์ ตัวอย่างของการประยุกต์ใช้การตั้งค่านี้สำหรับการพิมพ์โดยใช้ GeoEXT สามารถพบได้ที่นี่ หากคุณต้องการจะดูตัวอย่างเพิ่มเติมดูได้ที่นี้หน้า

หวังว่าจะช่วยให้คุณเริ่มต้นได้


คำถามด่วน / หัวข้อด่วน, เมื่อพิมพ์ OSM จากฐานข้อมูลของคุณ, คุณมีสไตล์ในเซิร์ฟเวอร์ WMS ของคุณเพื่อให้ตรงกับสไตล์ OSM ได้อย่างไร? (หรือคุณทำสไตล์ที่แตกต่างและไม่ตรงกับ 100%)
Alophind

ฉันสร้างสไตล์ของตัวเอง ฉันลงเอยด้วยการทำให้รูปแบบของ Google Maps ใกล้เคียงกับ OSM
Darkcylde

2
คุณสามารถแบ่งปันได้ไหม
Alophind


0

"แผนที่เป็นกระดาษ" อาจเป็นอะไรที่ง่ายกว่า "พอดีกับภาพในหน้า" ... ประวัติของการเขียนแผนที่ถูกเขียนลงในกระดาษและวันนี้ผลิตภัณฑ์ทำแผนที่ยังคงต้องการกระดาษ

วันนี้กระดาษเป็นรูปแบบไฟล์ PDF - ลืมEPUBหรือ "พิมพ์โดยเบราว์เซอร์" พวกเขากำลังรอมาตรฐาน CSS3, ฯลฯ สำหรับอนาคต ... และคุณภาพดี (กระดาษ) ผลิตภัณฑ์ทำแผนที่ต้องXSLT-FO หรือ CSS2 ด้วย (X) HTML + CSS2 คุณสามารถสร้าง PDF ที่ดี (!) ... HTML นั้นไม่ใช่ "สำหรับเบราว์เซอร์" สำหรับเครื่องมือ "การสร้าง PDF" (ที่สร้าง PDF ได้ทันทีหรือออฟไลน์)

เครื่องมือ "ระดับมืออาชีพเพียงอย่างเดียวที่สร้างPDF ที่ดีด้วย HTML + CSS2" ที่ฉันรู้จักคือPrinceXML : ฉันทดสอบด้วย "ภาพ on-fly" (SVG, JPG และ PNG) จาก โปรโตคอลWFSและWMSและด้วย OpenLayersและมัน ทำงานได้ดีมาก (!)


0

ฉันเพิ่งทำสิ่งนี้:

ดาวน์โหลด html2canvas.js ( https://github.com/niklasvh/html2canvas/releases )

ดาวน์โหลด html2canvas-proxy.php ( https://github.com/adjdred/html2canvas-proxy-php )

ติดตั้งพวกเขาทั้งบนเซิร์ฟเวอร์ของฉัน + อ้างอิงถึง. js ในแท็กและใน JS ของฉัน:

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

ให้ฉัน. png ของแผนที่ปัจจุบัน - ซึ่งฉันสามารถทำอะไรได้บ้าง - ใช้เวลาน้อยกว่าหนึ่งวินาทีในพีซีของฉัน

มินิ


-2

เป็นไปได้ที่จะพิมพ์ลงบนเว็บโดยตรงด้วยเครื่องมือที่คุณมี แต่จะต้องใช้ทักษะบางอย่างที่คุณไม่มี

ทางออกของฉันสำหรับคุณที่จะใช้QGIS โดยการติดตั้งปลั๊กอิน OpenLayers ใน QGIS คุณสามารถเข้าถึงเลเยอร์ OSM ที่คุณต้องการและเพิ่มเลเยอร์ Geoserver WMS (โดยการเพิ่มเลเยอร์ WMS)

จากนั้นคุณสามารถพิมพ์ด้วยรูปลักษณ์ที่คุณต้องการและอื่น ๆ อีกมากมายด้วยความช่วยเหลือของเครื่องมืออันทรงพลังนี้ ทั้งหมดที่ดีที่สุดทิวดอร์

PS ฉันรู้ว่าคำตอบของฉันอาจไม่ใช่สิ่งที่คุณคาดหวัง แต่มันจะทำงานและให้การปรับแต่งการพิมพ์มากกว่าโซลูชันเว็บใด ๆ


1
นี่เป็นเว็บแอปพลิเคชันที่ใช้เบราว์เซอร์ ... QGIS ไม่เกี่ยวข้องกับการแก้ปัญหานี้
Alophind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.