28 May 2010

Now OpenStreetmap covers most euro regions. I am surprised when I am
the first saw OpenStreetMap. It looks just fantastic. Actually, in
2007, one of openstreetmap developer gave us a lecture about their
ideas. How openstreetmap goings. But at that time, I have no idea
about it. It just like copying ideas from wikipedia. Now it is very
nice 'Copying'. Everybody have free and comprehensive spatial
information for free.

I would like to compare Google Maps, Microsoft maps or Yahoo maps with
OpenStreetMap. I think some other people must be already wrote
something about it. There is no need to repeat it again.

Back to today's point, using Geoserver rendering OpenStreetMap.
Honestly, it is not easy to rendering OSM by Geoserver. Because there
is no offical OSM SLD file for GeoServer. In the mailinglist there are
few people asked whether there is a SLD of OpenStreetMap. I did not
find any SLD file of OSM map until last month. One geoserver user
wrote a tutorial to teach people how to write Google style SLD. Based
on this turtorial, we can easily write an OSM SLD for GeoServer.

Data:

http://t1.hypercube.telascience.org/planet/?C=S;O=A

Tools

GeoServer

PostGIS/PostgreSQL

Useful links:

http://oegeo.wordpress.com/

http://www.perrygeo.net/wordpress/

http://geoserver.org/display/GEOSDOC/Google+Maps+SLD

http://geoserver.org/display/GEOSDOC/Geoserver+and+Google+SLDs

Here I would like to spend sometime to complain about the quality of
OSM. You could say OSM it is not perfect datasets. THE ATTRIBUTE TABLE
IS A MESS. There is no free lunch. So we still need to adopt to the
bad quality datasets.

The prepare job would be setup a GeoServer and a PostGIS. And import
OSM map into PostGIS. If you are a beginner of PostGIS or GeoServer or
SLD. Then you need time to read some material before continue reading
this article.

Something for windows users, I don't know how did you import osm file
into PostGIS. There is a tool osm2pgsql.exe which can easily import
osm data to PostGIS. From my experience, this tool is quite nasty. I
had two version of datasets. I could not import them to PostGIS by
osm2pgsql.exe. Even one of them did been import into database, but it
with some other problems. Actually, there are some errors when import
it. Anyway, I recommend use LINUX version osm2pgsql.exe to import
data. After that, you can back up your database to a backup file. Then
restore it on windows PostGIS. It is works fine for me. When you have
error with osm2pgsql.exe, please, follow me.

There will be four layers of openstreetmap, road, lines, polygon and
points. Here I only used three layers: lines ploygon and points.

Here is some example about how to write lines featuers.

A secondary line with labels

<sld:Rule>
<sld:Name>rule008</sld:Name>
<sld:Title>secondary trunk</sld:Title>
<sld:Abstract>Abstract</sld:Abstract>
<ogc:Filter>
<ogc:Or>

<ogc:PropertyIsEqualTo>
<ogc:PropertyName>highway</ogc:PropertyName>
<ogc:Literal>secondary</ogc:Literal>
</ogc:PropertyIsEqualTo>

<ogc:PropertyIsEqualTo>
<ogc:PropertyName>highway</ogc:PropertyName>
<ogc:Literal>secondary_link</ogc:Literal>
</ogc:PropertyIsEqualTo>

</ogc:Or>

</ogc:Filter>
<sld:MinScaleDenominator>150000</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>400000</sld:MaxScaleDenominator>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#d69c51</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-linecap">
<ogc:Literal>butt</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-linejoin">
<ogc:Literal>miter</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>5.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-dashoffset">
<ogc:Literal>0.0</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#fdbf6f</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-linecap">
<ogc:Literal>round</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-linejoin">
<ogc:Literal>round</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>4.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-dashoffset">
<ogc:Literal>0.0</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>

<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>ref</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">
<ogc:Literal>Lucida Sans</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="font-size">
<ogc:Literal>6.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="font-style">
<ogc:Literal>normal</ogc:Literal>
</sld:CssParameter>

<sld:CssParameter name="font-weight">
<ogc:Literal>bold</ogc:Literal>
</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:AnchorPoint>
<sld:AnchorPointX>0.5</sld:AnchorPointX>
<sld:AnchorPointY>0.5</sld:AnchorPointY>
</sld:AnchorPoint>
</sld:PointPlacement>
</sld:LabelPlacement>
<sld:Fill>
<sld:CssParameter name="fill">
<ogc:Literal>#fdbf6f</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="fill-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
</sld:Fill>

<sld:VendorOption name="group">yes</sld:VendorOption>
<sld:VendorOption name="spaceAround">2</sld:VendorOption>

<sld:Graphic>
<sld:ExternalGraphic>
<sld:OnlineResource xlink:type="simple" xlink:href="secondary_shield3.png"/>
<sld:Format>image/png</sld:Format>
</sld:ExternalGraphic>

<sld:Opacity>
<ogc:Literal>1.0</ogc:Literal>
</sld:Opacity>
<sld:Size>
<ogc:Literal>18.0</ogc:Literal>
</sld:Size>
<sld:Rotation>
<ogc:Literal>0.5</ogc:Literal>
</sld:Rotation>
</sld:Graphic>
</sld:TextSymbolizer>

</sld:Rule>

A railway in Geoserver, you should switch off, "fully SLD schema validator…."


<sld:Rule>
<sld:Name>rule06</sld:Name>
<sld:Title>railway rail</sld:Title>
<sld:Abstract>Abstract</sld:Abstract>
<ogc:Filter>

<ogc:PropertyIsEqualTo>
<ogc:PropertyName>railway</ogc:PropertyName>
<ogc:Literal>rail</ogc:Literal>
</ogc:PropertyIsEqualTo>

</ogc:Filter>
<sld:MinScaleDenominator>150000</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>400000</sld:MaxScaleDenominator>

<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#000000</ogc:Literal>
</sld:CssParameter>

<sld:CssParameter name="stroke-linejoin">
<ogc:Literal>round</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>4.0</ogc:Literal>
</sld:CssParameter>

</sld:Stroke>
</sld:LineSymbolizer>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#ffffff</ogc:Literal>
</sld:CssParameter>

<sld:CssParameter name="stroke-linejoin">
<ogc:Literal>round</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>3.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-dasharray">10 10</sld:CssParameter>

</sld:Stroke>
</sld:LineSymbolizer>

<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">
<ogc:Literal>Lucida Sans</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="font-size">
<ogc:Literal>10.0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="font-style">
<ogc:Literal>normal</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="font-weight">
<ogc:Literal>bold</ogc:Literal>
</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:LinePlacement>
<sld:PerpendicularOffset>
<ogc:Literal>10.0</ogc:Literal>
</sld:PerpendicularOffset>
</sld:LinePlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>
<ogc:Literal>2</ogc:Literal>
</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#ffffff</sld:CssParameter>
<sld:CssParameter name="fill-opacity">1.0</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">
<ogc:Literal>#000000</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="fill-opacity">
<ogc:Literal>1.0</ogc:Literal>
</sld:CssParameter>
</sld:Fill>
<sld:VendorOption name="spaceAround">2</sld:VendorOption>
<sld:VendorOption name="group">yes</sld:VendorOption>
</sld:TextSymbolizer>

--
Xiaoyu Guan (Sam)
http://guanxiaoyu.net

No comments: