Como posso imprimir Openlayers com camadas básicas OSM e Geoserver WMS?

9

Eu tenho um mapa que quero imprimir quando o usuário abrir algumas camadas. As camadas são geoserver wms e a camada base é OSM.

Sei que o geoserver possui um módulo de impressão (que está instalado e funcionando porque recebo resposta de geoserver / pdf / info.json? Var = printCapabilities

O que não entendo é como o uso para imprimir o mapa atual com camadas visíveis.

Eu olhei para o exemplo do GeoExt (mapfish), mas isso não me ajudou a entender.

Atualização 1: gerei o seguinte URL por código:

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

e estou ficando em PDF vazio (apenas com o título) ... O que pode estar errado?

Alophind
fonte
11
Você precisa de uma "ferramenta de impressão online" ou um "gerador de PDF offline" é melhor? (para controle bom e garantia de qualidade só PDF é seguro)
Peter Krauss
Não consigo entender exatamente o que você está tentando realizar. Deseja que o usuário possa imprimir (na web) ou deseja imprimir um mapa (digamos, pdf) a partir de camadas osm + geoserver wms?
Tudorbarascu
@ Alophind: Você precisa responder às perguntas que as pessoas fizeram nos comentários. Isso determinará as respostas que você receberá.
Devdatta Tengshe
Eu estava ausente, @ PeterKrauss - quero imprimir a seção do mapa em qualquer navegador, o PDF também é bom.
Alophind

Respostas:

7

O processo de impressão do Geoserver envolve duas etapas.

Primeiro no lado do servidor , você deve configurar seu arquivo yaml, chamado config.yaml. Consulte a documentação detalhada na página de documentação do módulo de impressão MapFish .

Feito isso, o segundo passo é para o lado do cliente . Considerando que você está usando openlayers para seu front-end, para obter a lista de camadas visíveis, você precisará de um loop simples com verificação de visibilidade, por exemplo

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

Agora você deve passar isso para o seu URL de impressão. por exemplo

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

Claro que você precisará fazer alterações relevantes no URL. Em seguida, atribua esse URL ao seu botão de impressão e chame uma função de clique pragmaticamente.

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

E feito!!!

bandeja
fonte
Estou obtendo erro: erro ao gerar PDF: org.mapfish.print.JsonMissingException: atributo [spec.mapTitle] ausente
Alophind 24/13
Adicionei exemplo para URL e exceção. Você pode sugerir o que estou fazendo de errado?
Alophind
11
Qual é o conteúdo da função getMapScale?
Alophind
11
funciona com OSM ou camada base do google?
Alophind
11
@ Alophind Não marquei isso na camada de mapa do Google, porque o AFAIK usando a camada de mapa do Google por meio de API diferente dos mapas do Google é ilegal. Embora este site específico também não tenha camada OSM, usei o OSM em outros aplicativos com facilidade de impressão.
Thelastray 26/10/2013
1

Se você é um usuário do Chrome, uma maneira rápida e simples é o Google Cloud Print , mas foi projetado para imprimir a página da web inteira, mas você pode usar uma exibição em tela cheia e imprimi-la.

Outra vantagem é que você pode imprimir em uma impressora conectada em qualquer lugar em que tenha impressoras registradas em sua conta, para que a impressão móvel esteja disponível no seu PC de mesa com uma impressora conectada ou em qualquer PC e impressora que você tenha registrado em sua conta do Google. Ele suporta impressoras herdadas e impressoras de rede projetadas especificamente para funcionar com o Google Cloud Print.

Mark Cupitt
fonte
11
Eu preciso apoiar todos os navegadores recentes, não só cromo
Alophind
1

Eu acho que você está seguindo o caminho certo com o geoserver e o plugin mapfish. É o que eu uso para imprimir em minhas camadas de base WMS e OSM. Há uma coisa a observar se você vai usar esse método. Se você deseja que seus mapas impressos sejam escalonados corretamente, não será possível usar o OSM diretamente a partir desse site, pois a projeção em que ele está não é dimensionada corretamente. Você precisará carregar os dados em um banco de dados e usar um SRS diferente.

Dito isto, darei a você um rápido resumo de como fazer a impressão funcionar com o plugin mapfish no geoserver.

Primeiro, você precisará baixar o plug-in mapfish e instalá-lo na instalação do geoser. Quando fiz isso pela primeira vez, essa etapa não parecia estar documentada em nenhum lugar dos tutoriais ou demos para impressão; portanto, demorou um pouco para eu descobrir. Também foi um pouco difícil encontrar o plugin.

Esta página mostra as instruções do Geoserver sobre como instalar o plugin e usá-lo. Basicamente, divide-se em:

  • Vá para esta página e faça o download do arquivo geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Extraia o conteúdo do arquivo ZIP no / WEB-INF / lib / no aplicativo GeoServer
  • Reinicie o Geoserver

Ok, agora que o plug-in está instalado, você precisará configurar o plug-in, modificando o arquivo config.yaml que 'thelastray' fala na resposta acima. O arquivo deve ser criado quando o GeoServer for reiniciado e encontrado no seguinte local:

GEOSERVER_DATA_DIR / printing / config.yaml

Existem muitas opções para isso, então você precisará passar pela documentação no site do Mapfish aqui.

O próximo passo é criar um aplicativo que use esse plugin para imprimir. Um exemplo de aplicativo que usa essa configuração para imprimir usando o GeoEXT pode ser encontrado aqui . Se você quiser ver mais alguns exemplos, consulte esta página.

Espero que você comece.

Darkcylde
fonte
Pergunta rápida sobre o tópico / tópico: Ao imprimir o OSM no seu banco de dados, como você conseguiu que o estilo no servidor WMS correspondesse ao estilo do OSM? (ou você fez um estilo diferente e não é 100% compatível)
Alophind
Eu criei meu próprio estilo. Acabei fechando para o estilo do Google Maps que o OSM.
Darkcylde
2
Você pode compartilhar por favor?
Alophind
0

"Mapear em papel" pode ser mais do que simples "ajustar a imagem à página" ... A história da cartografia foi escrita em papel, e hoje alguns produtos cartográficos ainda exigem papel.

Hoje, o papel é PDF - esqueça o EPUB ou "imprima pelo navegador", eles estão aguardando padrões, CSS3, etc., são para o futuro ... E produtos cartográficos de boa qualidade (papel) precisam XSLT-FO ou CSS2 . Com (X) HTML + CSS2, você pode produzir um bom PDF (!) ... Esse HTML não é "para navegador", é para uma ferramenta de "geração de PDF" (que gera PDF on-fly ou offline).

A única "ferramenta profissional para gerar um bom PDF com HTML + CSS2" que eu conheço é o PrinceXML : testei com "imagens em tempo real" (SVG, JPG e PNG) dos protocolos WFS e WMS e com OpenLayers e funciona tão bem (!).

Peter Krauss
fonte
0

Acabei de fazer isso:

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

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

Instalei os dois no meu servidor + ref para .js na tag e no meu JS:

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

Dá-me um .png do mapa atual - com o qual posso fazer o que for - leva menos de um segundo no meu pc.

Mini

minisauro
fonte
-2

É possível imprimir diretamente na web com as ferramentas que você possui, mas isso exigiria algumas habilidades que você não possui.

Minha solução para você seria usar o QGIS . Ao instalar o plug-in OpenLayers no QGIS, você pode acessar a camada OSM desejada e adicionar a camada Geoserver WMS (adicionando uma camada WMS).

Em seguida, você pode imprimir com a aparência desejada e muito mais com a ajuda desta poderosa ferramenta. Tudo de bom, Tudor

PS. Sei que minha resposta provavelmente não é a que você esperava, mas funcionará e oferece mais personalização de impressão do que qualquer solução da web.

tudorbarascu
fonte
11
Esta é uma aplicação web, usando navegadores ... O QGIS não é relevante para esta solução.
Alophind