Як я можу друкувати Openlayers за допомогою базових шарів OSM та Geoserver WMS?


9

У мене є карта, яку я хочу надрукувати, коли користувач відкриє деякі шари. Шари є геосерверними wms, а базовим шаром є OSM.

Я знаю, що у геосервера є модуль друку (який встановлюється та працює, тому що я отримую відповідь від geoserver / pdf / info.json? Var = printCapability

Я не розумію, як я використовую його для друку поточної карти видимими шарами.

Я переглянув приклад 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 + geoserver wms?
тудорбараску

@Alophind: Вам потрібно відповісти на запитання, які задавали ppl у коментарях. Це визначатиме відповіді, які ви отримаєте.
Devdatta Tengshe

Я був у відсутності, @PeterKrauss - я хочу, щоб можливість друкувати розділ карти в будь-якому браузері, PDF також хороший.
Алофінд

Відповіді:


7

Процес друку геосервера включає два етапи.

Спочатку на стороні сервера ви повинні налаштувати свій файл yaml, який називається config.yaml. Перегляньте детальну документацію на сторінці документації модуля друку MapFish .

Після цього другий крок призначений для клієнта . Зважаючи на те, що ви використовуєте відкриті шари для свого переднього плану, для отримання списку видимих ​​шарів вам знадобиться простий цикл з перевіркою видимості, наприклад

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: атрибут [spec.mapTitle] відсутній
Alophind

Я додав приклад для URL-адреси та винятку, чи можете ви підказати, що я роблю неправильно?
Алофінд

1
Який вміст функції getMapScale?
Алофінд

1
це працює з базовим шаром OSM або google?
Алофінд

1
@Alophind Я не перевіряв це на шарі карт Google, тому що AFAIK, використовуючи шар карти Google через API, відмінний від карт Google, є незаконним. Хоча на цьому конкретному веб-сайті немає і рівня OSM, я використовував OSM в інших програмах із засобом друку.
thelastray

1

Якщо ви користувач Chrome, швидкий і простий спосіб - це Google Cloud Print , але він призначений для друку всієї веб-сторінки, але ви можете використовувати повноекранний дисплей та друкувати це.

Ще одна перевага полягає в тому, що ви можете друкувати на підключеному принтері в будь-якому місці, де ви зареєстрували принтери у своєму обліковому записі, тому мобільний друк доступний на вашому настільному ПК із підключеним принтером, або будь-який ПК та принтер, зареєстрований у вашому обліковому записі Google. Він підтримує застарілі принтери та мережеві принтери, спеціально розроблені для роботи з Google Cloud Print.


1
Мені потрібно підтримувати всі останні браузери, не лише хром
Alophind

1

Я думаю, що ви рухаєтесь правильним шляхом із геосервером та плагіном mapfish. Це те, що я використовую для друку для моїх базових версій WMS та OSM. Є одне, що слід зазначити, якщо ви збираєтесь використовувати цей метод. Якщо ви хочете, щоб ваші роздруковані карти були масштабовані правильно, ви не зможете використовувати OSM безпосередньо звідти сайту, оскільки проекція, на яку він знаходиться, не змінює масштаб правильно. Вам потрібно буде завантажити дані в базу даних і використовувати інший SRS.

Сказавши це, я дам вам швидке опитування про те, як змусити друкувати роботу з плагіном mapfish в геосервері.

Спочатку вам потрібно буде завантажити плагін mapfish та встановити його у вашій геосерській установці. Коли я вперше зробив це, цей крок, здається, не був задокументований ніде в навчальних посібниках або демонстраціях для друку, тому це було деякий час, перш ніж я зрозумів це. Також плагін було дещо складно знайти.

На цій сторінці показані вказівки від Geoserver про те, як встановити плагін і ним користуватися. В основному він розпадається на:

  • Перейдіть на цю сторінку та завантажте файл geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Витягніть вміст архіву ZIP у / WEB-INF / lib / у веб-програмі GeoServer
  • Перезапустіть геосервер

Ок, тепер, коли плагін встановлений, вам потрібно буде приєднати плагін, що робиться шляхом зміни файлу config.yaml, про який говорить «thelastray» у відповіді вище. Файл повинен бути створений при перезапуску GeoServer і знаходиться в такому місці:

GEOSERVER_DATA_DIR / друк / config.yaml

Варіантів для цього існує маса, тому вам потрібно буде ознайомитися з документацією на веб-сайті Mapfish тут.

Наступним кроком є ​​створення програми, яка використовує цей плагін для друку. Приклад програми, що використовує цю настройку для друку за допомогою GeoEXT, можна знайти тут . Якщо ви хочете побачити ще кілька прикладів, дивіться на цій сторінці.

Сподіваємось, що з цього ви почнете працювати.


Питання щодо швидкої тематики / теми. Під час друку ОСМ з вашої бази даних, як ви отримали стиль на своєму WMS-сервері, щоб він відповідав стилю OSM? (або ви зробили інший стиль, і це не 100% збіг)
Alophind

Я створив власний стиль. Я в кінцевому підсумку зробив це закриттям стилю google maps, ніж OSM.
Darkcylde

2
Ви можете поділитися цим, будь ласка?
Алофінд


0

"Зображення на папері" може бути більш ніж простим "підхоплення зображення до сторінки" ... Історія картографії була записана на папері, і сьогодні деякі картографічні продукти все ще вимагають паперу.

Сьогодні папір у форматі PDF - забудьте EPUB або «друкуйте браузером», вони чекають стандартів, CSS3 тощо. Для майбутнього ... І для якісної (паперової) картографічної продукції потрібні XSLT-FO або CSS2 . За допомогою (X) HTML + CSS2 ви можете створити хороший PDF (!) ... Цей HTML не "для браузера", це для інструменту "генерація PDF" (який генерує PDF в режимі "офлайн" або в режимі офлайн).

Єдиний професійний «інструмент для створення гарної PDF з HTML + CSS2» , що я знаю, це PrinceXML : я тестував з «на льоту зображень» (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 )

Встановлено їх як на моєму сервері + ref до .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 та додати рівень WMS Geoserver (додавши рівень WMS).

Тоді ви можете друкувати з потрібним виглядом та ще більше за допомогою цього потужного інструменту. Все найкраще, Тюдоре

PS. Я знаю, що моя відповідь, ймовірно, не те, що ви очікували, але вона буде працювати і надає більше налаштування друку, ніж будь-яке веб-рішення.


1
Це веб-додаток із використанням браузерів ... QGIS не має значення для цього рішення.
Алофінд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.