Jak mogę wydrukować Openlayers z podstawowymi warstwami OSM i Geoserver WMS?

9

Mam mapę, którą chcę wydrukować, gdy użytkownik otworzy niektóre warstwy. Warstwy to geoserver wms, a warstwa bazowa to OSM.

Wiem, że geoserver ma moduł drukowania (który jest zainstalowany i działa, ponieważ otrzymuję odpowiedź z geoserver / pdf / info.json? Var = printCapabilities

Nie rozumiem jednak, w jaki sposób używam go do drukowania bieżącej mapy z widocznymi warstwami.

Patrzyłem na przykład GeoExt (mapfish), ale to nie pomogło mi zrozumieć.

Aktualizacja 1: Wygenerowałem następujący adres URL według kodu:

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

i dostaję pusty plik PDF (tylko z tytułem) ... Co może być nie tak?

Alofind
źródło
1
Potrzebujesz „narzędzia do drukowania online” lub „offline generator PDF” jest lepszy? (dla dobrej kontroli i zapewnienia jakości tylko plik PDF jest bezpieczny)
Peter Krauss
Sprawdź dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/... mam nadzieję, że to pomoże.
Farhat Abbas
Nie rozumiem dokładnie, co próbujesz osiągnąć. Czy chcesz, aby użytkownik mógł drukować (w Internecie), czy chcesz wydrukować mapę (powiedzmy pdf) z warstw osm + geoserver wms?
tudorbarascu
@Alophind: Musisz odpowiedzieć na pytania zadane przez ppl w komentarzach. To określi odpowiedzi, które otrzymasz.
Devdatta Tengshe,
Nie było mnie, @PeterKrauss - Chcę mieć możliwość wydrukowania fragmentu mapy w dowolnej przeglądarce, PDF też jest dobry.
Alophind

Odpowiedzi:

7

Proces drukowania Geoserver obejmuje dwa etapy.

Najpierw po stronie serwera musisz skonfigurować plik yaml o nazwie config.yaml. Przejrzyj szczegółową dokumentację na stronie dokumentacji modułu drukującego MapFish .

Po wykonaniu tej czynności drugi krok jest po stronie klienta . Biorąc pod uwagę, że używasz openlayers dla frontonu, aby uzyskać listę widocznych warstw, będziesz potrzebować prostej pętli z kontrolą widoczności, np.

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

Teraz musisz przekazać to do adresu URL wydruku. na przykład

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

Oczywiście będziesz musiał wprowadzić odpowiednie zmiany w adresie URL. Następnie przypisz ten adres URL do przycisku drukowania, a następnie wywołaj funkcję kliknięcia pragmatycznie.

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

I zrobione!!!

thelastray
źródło
Pojawia się błąd: błąd podczas generowania pliku PDF: org.mapfish.print.JsonMissingException: brak atrybutu [spec.mapTitle]
Alophind 24.10.2013
Dodałem przykład adresu URL i wyjątku. Czy możesz zasugerować, co robię źle?
Alophind,
1
Jaka jest zawartość funkcji getMapScale?
Alophind,
1
czy to działa z OSM lub warstwą podstawową Google?
Alophind,
1
@Alophind Nie sprawdziłem tego w warstwie mapy Google, ponieważ AFAIK korzystający z warstwy mapy Google za pośrednictwem interfejsu API innego niż mapy Google jest nielegalny. Chociaż ta konkretna strona internetowa również nie ma warstwy OSM, używałem OSM w innych aplikacjach z funkcją drukowania.
thelastray
1

Jeśli jesteś użytkownikiem Chrome, szybki i prosty sposób to Google Cloud Print , ale jest on przeznaczony do drukowania całej strony internetowej, ale możesz użyć ekranu pełnoekranowego i wydrukować go.

Kolejną zaletą jest to, że możesz drukować na podłączonej drukarce w dowolnym miejscu, w którym masz zarejestrowane drukarki na swoim koncie, dzięki czemu drukowanie mobilne jest dostępne na komputerze stacjonarnym z podłączoną drukarką lub dowolnym komputerem i drukarką zarejestrowaną na koncie Google. Obsługuje starsze drukarki i drukarki sieciowe specjalnie zaprojektowane do współpracy z Google Cloud Print.

Mark Cupitt
źródło
1
Muszę obsługiwać wszystkie najnowsze przeglądarki, nie tylko Chrome
Alophind
1

Myślę, że idziesz właściwą ścieżką z geoserver i wtyczką mapfish. To jest to, czego używam do drukowania dla moich warstw podstawowych WMS i OSM. Należy jednak pamiętać o jednej rzeczy, jeśli zamierzasz użyć tej metody. Jeśli chcesz poprawnie wydrukować wydrukowane mapy, nie będziesz mógł używać OSM bezpośrednio z tego miejsca, ponieważ projekcja, w której się znajduje, nie jest poprawnie skalowana. Musisz załadować dane do bazy danych i użyć innego SRS.

Powiedziawszy to, dam ci krótkie podsumowanie, w jaki sposób rozpocząć drukowanie przy użyciu wtyczki mapfish w geoserver.

Najpierw musisz pobrać wtyczkę mapfish i zainstalować ją w instalacji geoser. Kiedy po raz pierwszy to zrobiłem, ten krok nie wydawał się być nigdzie udokumentowany w tutorialach ani prezentacjach do wydrukowania, więc minęło trochę czasu, zanim się zorientowałem. Trudno też było znaleźć wtyczkę.

Ta strona pokazuje instrukcje z Geoserver dotyczące instalacji wtyczki i korzystania z niej. Zasadniczo rozkłada się na:

  • Przejdź do tej strony i pobierz plik geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Wyodrębnij zawartość archiwum ZIP do / WEB-INF / lib / w aplikacji internetowej GeoServer
  • Uruchom ponownie Geoserver

Ok, teraz, gdy wtyczka jest zainstalowana, musisz ją skonfigurować, modyfikując plik config.yaml, o którym mówi „thelastray” w odpowiedzi powyżej. Plik powinien zostać utworzony po ponownym uruchomieniu GeoServer i znajduje się w następującej lokalizacji:

GEOSERVER_DATA_DIR / printing / config.yaml

Jest na to wiele opcji, więc musisz przejrzeć dokumentację na stronie Mapfish tutaj.

Następnym krokiem jest utworzenie aplikacji korzystającej z tej wtyczki do drukowania. Przykład aplikacji używającej tej konfiguracji do drukowania za pomocą GeoEXT można znaleźć tutaj . Jeśli chcesz zobaczyć więcej przykładów, zajrzyj na stronę.

Mam nadzieję, że to pozwoli Ci zacząć.

Darkcylde
źródło
Szybkie pytanie / pytanie tematyczne: Jak wydrukowałeś OSM z bazy danych, w jaki sposób udało Ci się dopasować styl na serwerze WMS do stylu OSM? (lub zrobiłeś inny styl i nie jest to w 100% dopasowanie)
Alophind
Stworzyłem swój własny styl. Skończyło się na tym, że zbliża się do stylu map Google niż OSM.
Darkcylde
2
Czy możesz to udostępnić?
Alophind
0

„Mapa na papier” może być więcej niż prosta „dopasuj obraz do strony”… Historia kartografii została napisana na papierze, a dziś niektóre produkty kartograficzne wciąż wymagają papieru.

Dzisiaj papier jest w formacie PDF - zapomnij EPUB lub „drukuj przez przeglądarkę”, czekają na standardy, CSS3 itp., Są na przyszłość ... A dobrej jakości (papierowe) produkty kartograficzne potrzebują XSLT-FO lub CSS2 . Dzięki (X) HTML + CSS2 możesz stworzyć dobry plik PDF (!) ... Ten HTML nie jest przeznaczony do przeglądarki, tylko do narzędzia do generowania plików PDF (które generuje pliki PDF w locie lub offline).

Jedynym profesjonalnym „narzędziem do generowania dobrych plików PDF za pomocą HTML + CSS2”, które znam, jest PrinceXML : Testowałem z „obrazami w locie” (SVG, JPG i PNG) z protokołów WFS i WMS oraz z OpenLayers , i to działa tak dobrze (!).

Peter Krauss
źródło
0

Właśnie to zrobiłem:

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

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

Zainstalowałem je zarówno na moim serwerze + odnośnik do .js w tagu i na moim JS:

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

Daje mi .png bieżącej mapy - z którą mogę zrobić cokolwiek - zajmuje mniej niż sekundę na moim komputerze.

Mini

minizaurus
źródło
-2

Możliwe jest drukowanie bezpośrednio w Internecie za pomocą posiadanych narzędzi, ale wymagałoby to pewnych umiejętności, których nie posiadasz.

Moim rozwiązaniem byłoby skorzystanie z QGIS . Instalując wtyczkę OpenLayers w QGIS, możesz uzyskać dostęp do żądanej warstwy OSM i dodać warstwę WMS Geoserver (dodając warstwę WMS).

Następnie możesz drukować z pożądanym wyglądem i nie tylko za pomocą tego potężnego narzędzia. Wszystkiego najlepszego, Tudor

PS. Wiem, że moja odpowiedź prawdopodobnie nie jest taka, jakiej się spodziewałeś, ale zadziała i zapewni więcej możliwości dostosowywania drukowania niż jakiekolwiek rozwiązanie internetowe.

tudorbarascu
źródło
1
Jest to aplikacja internetowa, korzystająca z przeglądarek ... QGIS nie dotyczy tego rozwiązania.
Alophind