A feature of GeoServer that’s not very well known is that it can publish layers that contain a time component. Clients can request data for a specific date/time, a list of dates/times, or even over a range. This is built-in to the WMS protocol; no third-party requirements are necessary here.
This can of course be used to create animations (see the MapStory project for a high-profile example of this), but even simpler, it can be used to just highlight another dimension of a dataset in a useful way.
With the release of GeoServer 2.7, the ability to request relative intervals has been added as well. Previously each request had to include absolute intervals, but now you can request data with parameters that include, for example, “<some date> and 30 days before it” or, more interestingly “10 years before <today>” where <today> is the server time.
So I thought it would be interesting to highlight this feature in GeoServer to give you some ideas and inspiration on how you can adapt this to your data.
The states and the union
First, let’s take a look at a dataset. One that I happen to have handy is the order in which the states of the USA joined the union. (Taken from MapStory.)
I’ve stripped down the style here to make comprehension easier. For each feature, there is an attribute called
Date_of_St which is a timestamp accurate to the day.
For example, the value of the
Date_of_St attribute for the feature representing Hawaii is listed as
1959-01-03T08:00:000Z This jives with the official date as listed on Wikipedia, though I suspect the hour may be one level of precision too ambitious.
We can set this attribute as a “special” time dimension in GeoServer. Once the layer is loaded, in the Edit Layer configuration area, the Dimensions tab contains the ability to link an attribute to the time dimension.
For our purposes, we really only care about the year. Luckily—and this is a big advantage of using WMS dimensions for this—requests need only be as precise as you want. So if you want to request a date range of 1900-1950, you don’t need to specify it as:
Instead, you can just write:
(Imagine trying to make this flexibility of input happen without this feature. Think of generating a text string search to match up the dates exactly. No fun at all.)
We’re going to make requests to GeoServer to find out which states joined at which times. The full WMS request, utilizing OpenLayers, is a mouthful:
http://localhost:8080/geoserver/time/wms?service=WMS&version=1.1.0& request=GetMap&layers=time:StateJoined&styles=&bbox=-178.21759836236586, 18.92178634508703,-66.96927103600244,71.40623536725487&width=699& height=330&srs=EPSG:4326&format=application/openlayers
But for tutorial purposes, I always prefer using the WMS Reflector, which makes reasonable assumptions about the request for the sake of brevity. That same request above can be shrunk to this:
Much better right? Except one little pitfall about enabling WMS time is that when not specifying any times, the map will only render features with the latest time, which leaves us sad little Hawaii (being the most recent state added):
But with this setup, it’s quite easy to make maps of states at certain times.
The states of the states
(The following code snippets need to be appended to the above request.)
The thirteen original colonies (1790):
The states as of the onset of the Civil War (1861):
The states that joined up during the Civil War. The US Civil War was fought from 1861-1865, but if we were to just use the string
1861/1865, we’d include Kansas, which just predates the Civil War (as seen above).
So we’ll need to get more precise, and add in the month: April 1861 to April 1865.
(Again, notice how easy this is with WMS dimensions; all of the work of interpreting the time is done for us.)
Finally, the states that were created in the last 120 years:
This takes advantage of the new relative time support. This also means that the output of this request could itself change over time.
(The above image was reprojected to make Alaska look less huge. This is way easier using the WMS Reflector, as all you need to add is the
Now, it’s easy to envision a little app that takes as input Start and End dates and refreshes the map accordingly. And if people want to see that done (or anything else along that line), please leave a comment below.
And if you want to see this dataset animated, check it out over on MapStory.
No matter how long you’ve been working with GeoServer, there’s always more to be learned. Check out our Education Center to learn more!
Have you used the WMS time feature? Let us know how in the comments below!