Làm cách nào tôi có thể in Openlayers với các lớp WMS OSM và Geoserver cơ bản?


9

Tôi có một bản đồ tôi muốn in khi người dùng mở một số lớp. Các lớp là geoserver wms và lớp cơ sở là OSM.

Tôi biết máy chủ địa lý có mô-đun in (được cài đặt và hoạt động vì tôi nhận được trả lời từ geoserver / pdf / info.json? Var = printCapabilities

Điều tôi không hiểu là làm thế nào tôi sử dụng nó để in bản đồ hiện tại với các lớp có thể nhìn thấy.

Tôi đã xem ví dụ GeoExt (mapfish) nhưng nó không giúp tôi hiểu.

Cập nhật 1: Tôi đã tạo URL sau bằng mã:

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

và tôi đang nhận được PDF trống (chỉ có tiêu đề) ... Điều gì có thể sai?


1
Bạn cần một "công cụ in trực tuyến" hay "trình tạo PDF ngoại tuyến" thì tốt hơn? (để kiểm soát tốt và đảm bảo chất lượng, chỉ có PDF là an toàn)
Peter Krauss

Vui lòng kiểm tra dev.openlayers.org/sandbox/camptocamp/canvas/openlayers/. Tôi hy vọng nó sẽ giúp ích.
Farhat Abbas

Tôi không thể hiểu chính xác những gì bạn đang cố gắng thực hiện. Bạn có muốn người dùng có thể in (trong web) hoặc bạn muốn in bản đồ (pdf giả sử) từ các lớp osm + geoserver wms?
tudorbarascu

@ Alophind: Bạn cần trả lời các câu hỏi mà ppl đã hỏi trong các bình luận. Điều đó sẽ xác định câu trả lời mà bạn sẽ nhận được.
Devdatta Tengshe

Tôi đã đi vắng, @PeterKrauss - Tôi muốn khả năng in phần bản đồ trên bất kỳ trình duyệt nào, PDF cũng tốt.
Alophind

Câu trả lời:


7

Quá trình in Geoserver bao gồm hai bước.

Đầu tiên ở phía máy chủ , bạn phải cấu hình tệp yaml của mình, được gọi là config.yaml. Xem qua các tài liệu chi tiết tại trang tài liệu mô-đun in MapFish .

Một khi điều này được thực hiện, bước thứ hai là cho phía khách hàng . Xem xét bạn đang sử dụng các trình mở cho giao diện người dùng của bạn, để có được danh sách các lớp hiển thị, bạn sẽ cần một vòng lặp đơn giản với kiểm tra khả năng hiển thị, ví dụ:

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

Bây giờ bạn phải chuyển cái này vào url in của bạn. ví dụ

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

Tất nhiên bạn sẽ phải thực hiện các thay đổi có liên quan trong URL. Tiếp theo gán URL này cho nút in của bạn và sau đó gọi hàm nhấp chuột một cách thực tế.

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

Và thực hiện!!!


Tôi đang gặp lỗi: Lỗi khi tạo PDF: org.mapfish.print.JsonMissingException: thuộc tính [spec.mapTitle] bị thiếu
Alophind

Tôi đã thêm ví dụ cho URL và ngoại lệ, bạn có thể đề xuất những gì tôi đang làm sai không?
Alophind

1
Nội dung của hàm getMapScale là gì?
Alophind

1
Nó có hoạt động với OSM hoặc lớp cơ sở google không?
Alophind

1
@Alophind Tôi chưa kiểm tra lớp này cho lớp bản đồ Google, vì AFAIK sử dụng lớp bản đồ Google thông qua API khác với bản đồ Google là bất hợp pháp. Mặc dù trang web cụ thể này cũng không có lớp OSM, tôi đã sử dụng OSM trong các ứng dụng khác với cơ sở in.
thelastray

1

Nếu bạn là Người dùng Chrome, một cách nhanh chóng và đơn giản là Google Cloud Print , nhưng nó được thiết kế để in toàn bộ trang web, nhưng bạn có thể sử dụng màn hình toàn màn hình và in nó.

Một lợi thế khác là bạn có thể in tới máy in được kết nối ở bất cứ nơi nào bạn đã đăng ký máy in trên tài khoản của mình, vì vậy in di động có sẵn cho máy tính để bàn của bạn với máy in được kết nối hoặc bất kỳ Pc và Máy in nào bạn đã đăng ký với tài khoản Google của mình. Nó hỗ trợ Máy in kế thừa và máy in mạng được thiết kế đặc biệt để hoạt động với Google Cloud Print.


1
Tôi cần hỗ trợ tất cả các trình duyệt gần đây, không chỉ chrome
Alophind

1

Tôi nghĩ rằng bạn đang đi đúng hướng với geoserver và plugin mapfish. Đó là những gì tôi sử dụng để in ấn cho các cơ sở WMS và OSM của mình. Có một điều cần lưu ý nếu bạn sẽ sử dụng phương pháp này mặc dù. Nếu bạn muốn bản đồ được in của mình được nhìn chính xác, bạn sẽ không thể sử dụng OSM trực tiếp từ trang web đó vì hình chiếu của nó không đúng tỷ lệ. Bạn sẽ cần tải dữ liệu vào cơ sở dữ liệu và sử dụng SRS khác.

Đã nói điều này tôi sẽ cung cấp cho bạn một bản tóm tắt nhanh về cách để in ấn hoạt động với plugin mapfish trong geoserver.

Trước tiên, bạn sẽ cần tải xuống plugin mapfish và cài đặt nó trong cài đặt trình địa lý của bạn. Khi tôi lần đầu tiên làm điều này, bước đó dường như không được ghi lại ở bất kỳ đâu trong các hướng dẫn hoặc bản demo để in nên đã mất một lúc trước khi tôi phát hiện ra. Ngoài ra, nó hơi khó để tìm thấy các plugin.

Đây trang hiển thị các hướng dẫn từ geoserver về cách cài đặt plugin và sử dụng nó. Về cơ bản, nó được chia thành:

  • Đến trang này và tải về các tập tin geoserver-2.1-SNAPSHOT-printing-plugin.zip.
  • Trích xuất nội dung của kho lưu trữ ZIP vào / WEB-INF / lib / trong ứng dụng web GeoServer
  • Khởi động lại máy chủ địa lý

Bây giờ, khi plugin được cài đặt, bạn sẽ cần phải tạo plugin được thực hiện bằng cách sửa đổi tệp config.yaml mà 'thelastray' nói về câu trả lời của họ ở trên. Tệp phải được tạo khi GeoServer được khởi động lại và được tìm thấy ở vị trí sau:

GEOSERVER_DATA_DIR / in / config.yaml

Có rất nhiều lựa chọn cho việc này, vì vậy bạn sẽ cần xem qua tài liệu trên trang web Mapfish tại đây.

Bước tiếp theo là tạo một ứng dụng sử dụng plugin này để in. Một ví dụ về một ứng dụng sử dụng thiết lập này để in bằng GeoEXT có thể được tìm thấy ở đây . Nếu bạn muốn xem một số ví dụ khác nhìn này trang.

Hy vọng rằng sẽ giúp bạn bắt đầu.


Câu hỏi tắt / chủ đề nhanh, Khi in OSM từ cơ sở dữ liệu của bạn, làm thế nào bạn có được kiểu trong máy chủ WMS của bạn để khớp với kiểu OSM? (hoặc bạn đã làm theo phong cách khác và không khớp 100%)
Alophind

Tôi tạo ra phong cách của riêng tôi. Tôi đã kết thúc việc đóng nó theo kiểu google maps hơn OSM.
Darkcylde

2
Bạn có thể chia sẻ nó được không?
Alophind


0

"Bản đồ thành giấy" có thể đơn giản hơn "phù hợp với hình ảnh cho trang" ... Lịch sử của Bản đồ đã được viết thành giấy và ngày nay một số sản phẩm bản đồ vẫn cần giấy.

Ngày nay, giấy là PDF - hãy quên EPUB hoặc "in bằng trình duyệt", chúng đang chờ các tiêu chuẩn, CSS3, v.v., là cho tương lai ... Và các sản phẩm bản đồ (giấy) chất lượng tốt cần XSLT-FO hoặc CSS2 . Với (X) HTML + CSS2, bạn có thể tạo PDF tốt (!) ... HTML đó không phải là "dành cho trình duyệt", dành cho công cụ "tạo PDF" (tạo PDF khi đang di chuyển hoặc ngoại tuyến).

"Công cụ chuyên nghiệp duy nhất để tạo PDF tốt với HTML + CSS2" mà tôi biết, là PrinceXML : Tôi đã thử nghiệm với "hình ảnh đang bay" (SVG, JPG và PNG) từ các giao thức WFSWMS và với OpenLayers , và nó hoạt động rất tốt (!).


0

Tôi vừa mới làm điều này:

Đã tải xuống html2canvas.js ( https://github.com/niklasvh/html2canvas/release )

Đã tải xuống html2canvas-proxy.php ( https://github.com/adjdred/html2canvas-proxy-php )

Đã cài đặt cả hai trên máy chủ của tôi + ref thành .js trong thẻ và trong JS của tôi:

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

Cung cấp cho tôi một .png của bản đồ hiện tại - mà tôi có thể làm bất cứ điều gì với - chỉ mất chưa đến một giây trên máy tính của tôi.

Nhỏ


-2

Có thể in trực tiếp trên web bằng các công cụ mà bạn có nhưng điều đó sẽ yêu cầu một số kỹ năng mà bạn không có.

Giải pháp của tôi cho bạn sẽ là sử dụng QGIS . Bằng cách cài đặt plugin OpenLayers trong QGIS, bạn có thể truy cập lớp OSM mà bạn muốn và thêm lớp WMS Geoserver (bằng cách thêm một lớp WMS).

Sau đó, bạn có thể in với giao diện mà bạn muốn và hơn thế nữa với sự trợ giúp của công cụ mạnh mẽ này. Tốt nhất, Tudor

Tái bút Tôi biết rằng câu trả lời của tôi có thể không phải là những gì bạn mong đợi nhưng nó sẽ hoạt động và cung cấp nhiều tùy chỉnh in hơn bất kỳ giải pháp web nào.


1
Đây là một ứng dụng web, sử dụng trình duyệt ... QGIS không liên quan đến giải pháp này.
Alophind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.