I’ve upgraded a handful of Geoserver installations and it has never been flawless. If you’re lucky you end up with just some layers missing, if you’re not, you’ll miss a bunch of them (together with layergroups, some stores, workspaces might screw up etc.).
But how do you check for missing data before switching to the newer version? Thanks to the REST API implemented within Geoserver, it’s rather easy.
from bs4 import BeautifulSoup
from requests.auth import HTTPBasicAuth
req = requests.get('http://example.com/geoserver/rest/layers', auth=HTTPBasicAuth('username', 'password'))
html = BeautifulSoup(req.text)
i = 0
for link in html.find_all('a'):
i += 1
href = link.get_text()
with open('list.txt', 'a') as f:
We needed to migrate ~ 17,000 layers last week, and yes, we could have just shut the door and spend couple of nights checking one after another, if we were the dumbest GIS company ever.
As I wanted to make it a bit easier I wrote the simple Python script (see above) that just authenticates against Geoserver and downloads the list of layers. I actually had to do that twice - both old and new instance. A simple file comparison followed and I got a list of missing layers in less than two minutes.
If you do the same to workspaces, stores and layergroups, your chances of not losing some data after the switch are pretty high.
I guess it’s reasonable to check your maps by hand as well, but this gives you the picture of the current state of your data real quick.
Printing a web map requires a lot more than doing
Ctrl + P. MapFish seems to be the best option to use with Geoserver, and it comes ready as an extension. If you installed the module properly, you should be seeing general info at http://localhost:8080/geoserver/pdf/info.json. You’ll find a
MapFish lets you access three different points:
info.json that returns current config as defined in config.yaml file
print.pdf that actually prints the map as defined in the
spec GET argument
create.json that returns a JSON object with an URL of the printed map
Remember, if you’re displaying a lot of layers in the map and all of them should be printed, you need to pass it as a POST argument when calling
create.json, otherwise you’ll be getting an error complaining about the GET request length.
config.yaml file is where you define settings for the print module. You definitely want to define
dpis (we’re using 90, 200 and 300 DPI),
scales (they probably need to be hardcoded, I didn’t succeed trying any arbitrary scale) and
layouts (we’re using A4 to A0 both portrait and landscape).
However, defining the page size might get tricky as MapFish does not use standardized sizes defined in cm, in or any other unit. I’ve experimenting and doing some maths and here’s what I came up with for portrait layouts.
The bigger paper you use, the smaller DPI is available, that’s what I found out messing around with MapFish settings. This means that we’re using 200 DPI top for A2 layout and 90 DPI for A1 and A0 layout, respectively.
JQuery takes care of sending POST request and fetching the response. See it in action (Choose Nástroje and Tisknout for printing).