(as featured on gisuser.com)
One thing I've always found useful about USGS website is the neat "latest earthquakes" listing given each day. So one day I said to myself, "boy, wouldn't it be great if this type of information were available as a map for users to embed in their application?".
The Open Geospatial Consortium (OGC) produces specifications web mapping, geographic information and processing. Perhaps the most used to date is the Web Map Service specification, which defines a common interface to interact with a server's geographic data through visualizations of maps. The Web Feature Service allows for users to access raw, actual data in Geography Markup Language (GML), which is an open XML format for geospatial data. Using common standards allows for maps and data to be delivered as "services", as opposed to static data download. This lets applications developers connect to geospatial data dynamically and fetch for a given area of interest, temporal slice, or attributional query.
There are many software tools which support the WMS specification. The neat thing about common standards is that servers can communicate with eachother regardless of what kind of software is used a given organization. In this particular example, I've chosen to use the University of Minnesota MapServer software. MapServer supports a number of OGC specifications, and can be run on a number of given operating systems. In addition, MapServer is free, open source software.
So, what I'm going to do is use MapServer to serve the latest earthquake data through a WMS server. Here are the steps involved:
MapServer accepts a number of different geospatial data formats, including GML. I wrote a quick Perl script which fetches the remote ASCII records from the USGS website and converts them to GML as a format MapServer, and any GML aware software, can work with. The neat thing about the output GML is that, as an XML format, it is interoperable and self-describing, which means applications which support GML can work with this data. Also, any XML processor can work with and process this data. Nice!
MapServer also works with shapefiles as input. Shapefiles are a binary encoded set of files which store geospatial data. Shapefiles are useful when GML becomes too large to work with. Since this is a small dataset, GML is a nice, application neutral, human readable file format to work with. GML can be thought of as a data transfer format over the Internet. We'll see later how MapServer can read a shapefile as a WFS and return GML on the fly. The Perl script to generate a shapefile is very similar to GML, except that we use Mapscript, a module which exposes MapServer functions in a number of languages, such as Java, PHP, and, in this case, Perl.
As the source data changes with time, I've opted to schedule a process to run every 10 minutes to freshen the data.
MapServer provides a CGI standalone process which is driven by a configuration file, called a "mapfile". Mapfiles contain layer information, data connections, area of interest, and so on.
So I wroted the mapfile to point to the output GML data. The mapfile is setup to act as an OGC WMS and OGC WFS.
At this point, any WMS client can make a request to MapServer as a WMS and have a map of the earthquakes returned to them. Here's a sample GetMap request:
http://host/cgi-bin/mapserv/mapserv?map=/home/tkralidi/config.map&service=WMS&version=1.1.1&request=GetMap&format=image/png&width=500&height=300&srs=EPSG:4326&layers=neis&bbox=-180,-90,180,90&styles=
and here is the image which is returned by the URL:
At this point, any WMS client can connect to this data and integrate into their application with other data.
MapServer also acts as a WMS client, which means MapServer itself can connect to other WMS services and fetch maps for you, which you can return to your client. So the next step we take is to add some reference layers (imagery, political boundaries, coastlines). These reference layers themselves come from remote WMS servers. Here's a GetMap request which shows the earthquake data atop the reference data:
http://host/cgi-bin/mapserv/mapserv?map=/home/tkralidi/config.map&service=WMS&version=1.1.1&request=GetMap&format=image/png&width=500&height=300&srs=EPSG:4326&layers=envisat_meris,polbnd,coast,neis&bbox=-180,-90,180,90&styles=
and here is the image returned by the URL:
Pretty neat and not alot of effort! One can make this as simple or as complex as they wish. The most simple thing to do is to add this as an HTML image tag in your webpage:
<img src="http://host/cgi-bin/mapserv/mapserv?map=/home/tkralidi/config.map&service=WMS&version=1.1.1&request=GetMap&format=image/png&width=500&height=300&srs=EPSG:4326&layers=envisat_meris,polbnd,coast,neis&bbox=-180,-90,180,90&styles=" alt="[ recent earthquakes ]" width="500" height="300" border="0"/>
I've included the Perl script and sample mapfile for download.
© 2005 Athanasios Tom Kralidis