如何使用基本OSM和Geoserver WMS图层打印Openlayer?


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


我无法完全理解您要完成的工作。您是否希望用户能够从osm图层+ geoserver wms打印(在Web中)或打印地图(假设是pdf)?
tudorbarascu

@Alophind:您需要回答ppl在评论中提出的问题。那将决定您将得到的答案。
Devdatta Tengshe

我不在了,@ PeterKrauss-我希望能够在任何给定的浏览器上打印地图的一部分,PDF也很好。
Alophind

Answers:


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

现在,您必须将其传递给您的打印网址。例如

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分配给您的打印按钮,然后实用地调用click函数。

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

并做了!!!


我收到错误消息:生成PDF时出错:org.mapfish.print.JsonMissingException:缺少属性[spec.mapTitle]
Alophind

我添加了URL和异常的示例,您能建议我做错了什么吗?
Alophind

1
getMapScale函数的内容是什么?
Alophind

1
它适用于OSM或Google基本层吗?
Alophind

1
@Alophind我尚未针对Google地图图层进行此检查,因为AFAIK通过除Google地图以外的API使用Google地图图层是非法的。尽管该特定网站也没有OSM层,但我在具有打印功能的其他应用程序中使用了OSM。
thelastray 2013年

1

如果您是Chrome浏览器用户,则快速简便的方法是Google Cloud Print,但是它是专为打印整个网页而设计的,但是您可以使用全屏显示并进行打印。

另一个优点是,您可以在已在其帐户中注册打印机的任何地方打印到已连接的打印机,因此,具有已连接打印机的台式PC或已针对Google帐户注册的任何PC和打印​​机都可以使用移动打印。它确实支持专门用于Google Cloud Print的传统打印机和网络打印机。


1
我需要支持所有最新的浏览器,而不仅仅是chrome
Alophind

1

我认为您在使用geoserver和mapfish插件走上了正确的道路。这就是我用于WMS和OSM基本层的打印的方法。但是,如果要使用此方法,则需要注意一件事。如果您希望正确调用打印的地图,将无法直接从该站点使用OSM,因为它所在的投影无法正确缩放。您将需要将数据加载到数据库中并使用其他SRS。

话虽如此,我将向您简要介绍如何使用geoserver中的mapfish插件进行打印。

首先,您需要下载mapfish插件并将其安装在geoser安装中。当我第一次执行此操作时,该步骤似乎没有在教程或演示中的任何地方进行记录以进行打印,因此我花了很长时间才弄清楚。同样,找到插件有点困难。

页面显示了来自Geoserver的有关如何安装和使用插件的说明。基本上可以分为:

  • 转到此页面并下载geoserver-2.1-SNAPSHOT-printing-plugin.zip文件。
  • 将ZIP存档的内容提取到GeoServer Web应用程序的/ WEB-INF / lib /中
  • 重新启动Geoserver

好的,现在已经安装了插件,您需要配置插件,方法是修改“ thelastray”在上面的回答中谈到的config.yaml文件。重新启动GeoServer时,应在以下位置找到该文件:

GEOSERVER_DATA_DIR / printing / config.yaml

有很多选项,因此您需要阅读Mapfish网站上的文档

下一步是创建一个使用此插件进行打印的应用程序。使用此设置通过GeoEXT进行打印的应用程序示例可在此处找到。如果您想看到更多示例,请查看示例页面查看。

希望这会帮助您入门。


快速/主题问题,从数据库打印OSM时,您是如何在WMS服务器中获得与OSM样式匹配的样式的?(或者您使用了不同的样式,而不是100%匹配)
Alophind

我创造了自己的风格。我最终使它比OSM更接近Google地图样式。
Darkcylde

2
你可以分享吗?
Alophind


0

“映射到纸上”不只是简单的“使图像适合页面” ...制图学的历史已被写到纸上,如今某些制图产品仍然需要纸。

今天,纸张是PDF —忘记了EPUB或“按浏览器打印”,它们正在等待标准,CSS3等,以备将来使用。而高质量的(纸质)制图产品则需要XSLT-FO或CSS2。使用(X)HTML + CSS2,您可以生成良好的PDF(!)... HTML并非“用于浏览器”,而是用于“ PDF生成”工具(可即时或离线生成PDF)。

我知道的唯一专业的“ 使用HTML + CSS2 生成良好PDF的工具”是PrinceXML:我使用WFSWMS 协议的“实时图像”(SVG,JPG和PNG)以及 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

可以使用您拥有的工具直接在Web上进行打印,但这需要一些您不具备的技能。

我为您提供的解决方案是使用QGIS。通过在QGIS中安装OpenLayers插件,您可以访问所需的OSM层并添加Geoserver WMS层(通过添加WMS层)。

然后,借助此功能强大的工具,您可以打印出所需的外观以及更多内容。祝一切顺利,都铎王朝

PS。我知道我的答案可能不是您所期望的,但它会起作用,并且比任何Web解决方案都提供更多的打印自定义。


1
这是一个使用浏览器的Web应用程序。QGIS与该解决方案无关。
Alophind
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.