Archive

Author Archives: underdark

Usually, I use CQL filter statements to dynamically filter features in a Geoserver WMS. These CQL filters can be added easily to the URL and Geoserver responds accordingly. There’s just one problem: There is a size limit for URLs and (very!) long filter statements won’t fit in. (And I’m not talking about the limit imposed by IE, but the more serious one in Apache.) This makes it necessary to switch from HTTP GET to POST. An easy way to send POST requests is using curl:

curl --data-binary @getMap.xml -H "Content-Type: text/xml" -o map.png "http://localhost:8080/geoserver/wms/GetMap"

I found that it’s important to use –data-binary to avoid that the text in getMap.xml is interpreted in any way. The “@” tells curl that a filename follows. Furthermore it’s necessary to specify the Content-Type. This results in the PNG map being stored in the current directory. My getMap.xml looks like follows:

<?xml version="1.0" encoding="UTF-8"?>
<ogc:GetMap
xmlns:ogc="http://www.opengis.net/ows"
xmlns:gml="http://www.opengis.net/gml"
version="1.1.1" service="WMS">

<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
 <Name>myNs:roads</Name>
 <NamedStyle>
  <Name>simple_roads</Name>
 </NamedStyle>
</NamedLayer>
</StyledLayerDescriptor>

<BoundingBox srsName="http://www.opengis.net/gml/srs/epsg.xml#31287">
<gml:coord>
<gml:X>621005.1594799113</gml:X>
<gml:Y>471313.0306986364</gml:Y>
</gml:coord>
<gml:coord>
<gml:X>635174.7245025429</gml:X>
<gml:Y>484404.226939031</gml:Y>
</gml:coord>
</BoundingBox>

<Output>
 <Format>image/png</Format>
 <Size>
 <Width>600</Width>
 <Height>320</Height>
 </Size>
</Output>

<Exceptions>application/vnd.ogc.se+xml</Exceptions>

</ogc:GetMap>

It’s also pretty straightforward to add a filter to the NamedLayer element. Basically it can be copied from any SLD you have at hand.

Today I’ve been fighting again with how to get GetFeatureInfo working in my Geoserver, Apache, Tomcat environment. It’s pretty simple actually: One needs a proxy which I put in
/usr/lib/cgi-bin/proxy.cgi.

Proxy code can be found in OpenLayers-2.9/examples/proxy.cgi (Download the full package of OpenLayers and use it instead of the package that ships with Geoserver). Add all necessary hosts to allowedHosts list.

Don’t forget to set it executable:
sudo chmod +x /usr/lib/cgi-bin/proxy.cgi

To tell your website to use the proxy, add the following javascript line:
OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";

Geoserver and Mapserver are both quite powerful but their developers pursued different goals.

To make the choice easier for you (I hope), here comes a general feature comparison:

Geoserver Mapserver
WMS both are good maybe a bit better [1]
WFS better, supports WFS-T [1] no WFS-T [1]
Technology J2EE [1] CGI [1]
Project start 2003 [1] 1996 [1]
Administration Web tool Mapfile generation can be aided by QGIS, but not comparable to Geoserver’s web admin tool
Extensibility good for Java developers [1] PHP Mapscript, good for PHP developers [1]
Cartography uses standardized SLDs powerful; styles are part of mapfile
Services one WMS/WFS/WCS service for all users [1] a mapfile means a service [1]
Querying CQL and OGC filters embedded SQL statements

New benchmarking results should be available soon [2]. Meanwhile, you might wanna watch last years results [3].

[1] http://osgeo-org.1803224.n2.nabble.com/Mapserver-vs-Geoserver-td4905798.html

[2] http://wiki.osgeo.org/wiki/Benchmarking_2010

[3] http://www.slideshare.net/gatewaygeomatics.com/wms-performance-shootout

Openstreetmap offers a handy API for querying their database: XAPI. You’ll find the docs on their wiki at http://wiki.openstreetmap.org/wiki/Xapi.

To download all traffic signals within a certain bounding box:
http://xapi.openstreetmap.org/api/0.6/node[highway=traffic_signals][bbox=16.26,48.18,16.31,48.20]