Как мне распечатать Openlayers с базовыми слоями OSM и Geoserver WMS?

9

У меня есть карта, которую я хочу напечатать, когда пользователь откроет несколько слоев. Слои - это геосервер wms, а базовый уровень - OSM.

Я знаю, что у геосервера есть модуль печати (который установлен и работает, потому что я получаю ответ от 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 (только с заголовком) ... Что может быть не так?

Alophind
источник
1
Вам нужен «инструмент для онлайн-печати» , или лучше «автономный генератор PDF» ? (для хорошего контроля и обеспечения качества только PDF безопасен)
Питер Краусс
Пожалуйста, проверьте dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/… Я надеюсь, что это поможет.
Фархат Аббас
Я не могу точно понять, что вы пытаетесь достичь. Вы хотите, чтобы пользователь мог печатать (в Интернете) или вы хотите напечатать карту (скажем, в формате pdf) из слоев osm + геосервер wms?
tudorbarascu
@Alophind: Вы должны ответить на вопросы, которые задавали люди в комментариях. Это определит ответы, которые вы получите.
Девдатта Тенгше
Я был в отъезде, @PeterKrauss - мне нужна возможность распечатывать раздел карты в любом браузере, PDF тоже хорош.
Алофинд

Ответы:

7

Процесс печати Geoserver состоит из двух этапов.

Сначала на стороне сервера вы должны настроить свой файл yaml, который называется config.yaml. Просмотрите подробную документацию на странице документации модуля печати MapFish .

Как только это будет сделано, второй шаг для стороны клиента . Учитывая, что вы используете openlayers для внешнего интерфейса, чтобы получить список видимых слоев, вам понадобится простой цикл с проверкой видимости, например

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

И сделано !!!

thelastray
источник
Я получаю сообщение об ошибке: Ошибка при создании 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
Мне нужно поддерживать все последние браузеры, не только Chrome
Alophind
1

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

Сказав это, я дам вам краткое изложение того, как заставить печать работать с плагином mapfish в geoserver.

Сначала вам нужно скачать плагин 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, можно найти здесь . Если вы хотите увидеть еще несколько примеров, посмотрите на этой странице.

Надеюсь, это поможет вам.

Darkcylde
источник
Краткий вопрос / вопрос по теме. При печати OSM из вашей базы данных, как вы установили стиль на своем сервере 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 )

Установил их как на моем сервере + ссылка на .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 текущей карты - что я могу сделать с чем угодно - занимает менее секунды на моем компьютере.

Мини

minisaurus
источник
-2

Можно печатать прямо в Интернете с помощью имеющихся у вас инструментов, но для этого потребуются некоторые навыки, которыми вы не обладаете.

Мое решение для вас будет использовать QGIS . Установив плагин OpenLayers в QGIS, вы можете получить доступ к нужному слою OSM и добавить слой Geoserver WMS (добавив слой WMS).

Затем вы можете печатать с нужным вам видом и больше с помощью этого мощного инструмента. Всего наилучшего, Тюдор

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

tudorbarascu
источник
1
Это веб-приложение, использующее браузеры ... QGIS не имеет отношения к этому решению.
Алофинд