finish edit pass

springmeyer 2012-01-09 14:03:36 -08:00
parent 18ce892100
commit 05e534ebb8

@ -2,21 +2,27 @@
## Overview ## Overview
This tutorial is designed to introduce a few more advanced Mapnik styling features, mainly `Rules` and `Filters`. This tutorial is designed to introduce a few more advanced Mapnik styling features, mainly `Rules` and `Filters`. This XML file is only compatible with Mapnik 2.x and above.
This script should result in a graphic similar to:
[[/images/world_population.png]]
* Note: text labeling positions may be different between Mapnik versions.
## Step 1: data ## Step 1: data
For this tutorial we'll use the same world borders shapefile from natural earth used for the first two tutorials. Refer to either [Tutorial 1](GettingStartedInPython) or [Tutorial 2](XMLGettingStarted) for details. For this tutorial we'll use the same world borders shapefile from natural earth used for the first two tutorials. Refer to either [Tutorial 1](GettingStartedInPython) or [Tutorial 2](XMLGettingStarted) for details.
This script should result in a graphic like this: ## Step 2: Script
[[/images/world_population_minimized.png]] Save the below code into a file called `world_population.py`:
```python ```python
#!/usr/bin/env python #!/usr/bin/env python
import mapnik import mapnik
mapfile = "population.xml" mapfile = "world_population.xml"
m = mapnik.Map(1400, 600) m = mapnik.Map(1400, 600)
mapnik.load_map(m, mapfile) mapnik.load_map(m, mapfile)
bbox = mapnik.Envelope(mapnik.Coord(-180.0, -75.0), mapnik.Coord(180.0, 90.0)) bbox = mapnik.Envelope(mapnik.Coord(-180.0, -75.0), mapnik.Coord(180.0, 90.0))
@ -24,139 +30,105 @@ m.zoom_to_box(bbox)
mapnik.render_to_file(m, 'world_population.png', 'png') mapnik.render_to_file(m, 'world_population.png', 'png')
``` ```
And here is the xml file: ## Step 3: Stylesheet
Save the below XML into a file called `world_population.xml` in the same directory as the `world_population.py` python script:
```xml ```xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Map>
<!DOCTYPE Map> <!-- Sample Mapnik XML template by Dane Springmeyer -->
<!-- Sample Mapnik XML template by Dane Springmeyer --> <Map srs="+proj=latlong +datum=WGS84" background-color="white" minimum-version="0.7.2">
<Map bgcolor="white" srs="+proj=latlong +datum=WGS84">
<Style name="population">
<Style name="population">
<!-- Built from Seven Class sequential YIGnBu from www.colorbrewer.org -->
<!-- Quantile breaks originally from QGIS layer classification -->
<Rule>
<Filter>[POP_EST] &gt; -1 and [POP_EST] &lt; 15000</Filter>
<PolygonSymbolizer fill="#c7e9b4"/>
<LineSymbolizer stroke="black" stroke-width=".1"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 15000 and [POP_EST] &lt; 255000</Filter>
<PolygonSymbolizer fill="#7fcdbb"/>
<LineSymbolizer stroke="black" stroke-width=".1"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 255000 and [POP_EST] &lt; 1300000</Filter>
<PolygonSymbolizer fill="#1d91c0"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 1300000 and [POP_EST] &lt; 4320000</Filter>
<PolygonSymbolizer fill="#41b6c3"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 4320000 and [POP_EST] &lt; 9450000</Filter>
<PolygonSymbolizer fill="#225ea8"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 9450000 and [POP_EST] &lt; 25650000</Filter>
<PolygonSymbolizer fill="#225ea8"/>
</Rule>
<Rule>
<Filter>[POP_EST] &gt;= 25650000 and [POP_EST] &lt; 1134000000</Filter>
<PolygonSymbolizer fill="#122F7F"/>
</Rule>
<Rule>
<ElseFilter/>
<!-- This will catch all other values - in this case just India and China -->
<!-- A dark red polygon fill and black outline is used here to highlight these two countries -->
<PolygonSymbolizer fill="darkred"/>
<LineSymbolizer stroke="black" stroke-width=".7"/>
</Rule>
<Rule> </Style>
<!-- Built from Seven Class sequential YIGnBu from www.colorbrewer.org -->
<!-- Quantile breaks originally from QGIS layer classification -->
<Filter>[POP2005] = 0 </Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#ffffcc</CssParameter>
</PolygonSymbolizer>
<!-- Outlines for Antarctica look good -->
<LineSymbolizer>
<CssParameter name="stroke">black</CssParameter>
<CssParameter name="stroke-width">.1</CssParameter>
</LineSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt; 0 and [POP2005] &lt; 15000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#c7e9b4</CssParameter>
</PolygonSymbolizer>
<!-- Outlines for Antarctica look good -->
<LineSymbolizer>
<CssParameter name="stroke">black</CssParameter>
<CssParameter name="stroke-width">.1</CssParameter>
</LineSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 15000 and [POP2005] &lt; 255000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#7fcdbb</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 255000 and [POP2005] &lt; 1300000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#1d91c0</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 1300000 and [POP2005] &lt; 4320000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#41b6c3</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 4320000 and [POP2005] &lt; 9450000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#225ea8</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 9450000 and [POP2005] &lt; 25650000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#225ea8</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<Filter>[POP2005] &gt;= 25650000 and [POP2005] &lt; 1134000000</Filter>
<PolygonSymbolizer>
<CssParameter name="fill">#122F7F</CssParameter>
</PolygonSymbolizer>
</Rule>
<Rule>
<ElseFilter/> <!-- This will catch all other values - in this case just India and China -->
<!-- A dark red polygon fill and black outline is used here to highlight these two countries -->
<PolygonSymbolizer>
<CssParameter name="fill">darkred</CssParameter>
</PolygonSymbolizer>
<LineSymbolizer>
<CssParameter name="stroke">black</CssParameter>
<CssParameter name="stroke-width">.7</CssParameter>
</LineSymbolizer>
</Rule>
</Style>
<Style name="countries_label">
<Rule>
<!-- Only label those countries with over 9 Million People -->
<!-- Note: Halo and Fill are reversed to try to make them subtle -->
<Filter>[POP2005] &gt;= 4320000 and [POP2005] &lt; 9450000</Filter>
<TextSymbolizer name="NAME" face_name="DejaVu Sans Bold" size="7" fill="black" halo_fill= "#DFDBE3" halo_radius="1" wrap_width="20" spacing="5" allow_overlap="false" avoid_edges="false" min_distance="10"/>
</Rule>
<Rule>
<!-- Only label those countries with over 9 Million People -->
<!-- Note: Halo and Fill are reversed to try to make them subtle -->
<Filter>[POP2005] &gt;= 9450000 and [POP2005] &lt; 25650000</Filter>
<TextSymbolizer name="NAME" face_name="DejaVu Sans Book" size="9" fill="black" halo_fill= "#DFDBE3" halo_radius="1" wrap_width="20" spacing="5" allow_overlap="false" avoid_edges="false" min_distance="10"/>
</Rule>
<Rule>
<!-- Those with over 25 Million get larger labels -->
<Filter>[POP2005] &gt;= 25650000 and [POP2005] &lt; 1134000000</Filter>
<TextSymbolizer name="NAME" face_name="DejaVu Sans Book" size="12" fill="white" halo_fill= "#2E2F39" halo_radius="1" wrap_width="20" spacing="5" allow_overlap="false" avoid_edges="true" min_distance="10"/>
</Rule>
<Rule>
<!-- Those with over 25 Million get larger labels -->
<!-- Note: allow_overlap is true here to allow India to sneak through -->
<Filter>[POP2005] &gt;= 1134000000</Filter>
<TextSymbolizer name="NAME" face_name="DejaVu Sans Book" size="15" fill="white" halo_fill= "black" halo_radius="1" wrap_width="20" spacing="5" allow_overlap="true" avoid_edges="true" min_distance="10"/>
</Rule>
</Style>
<Layer name="countries" srs="+proj=latlong +datum=WGS84" status="on">
<!-- Style order determines layering hierarchy -->
<!-- Labels go on top so they are listed second -->
<StyleName>population</StyleName>
<StyleName>countries_label</StyleName>
<Datasource>
<Parameter name="type">shape</Parameter>
<!-- FIXME -->
<!-- Note: 'TM_WORLD_BORDERS_SIMPL-0.3' is the name of the shapefile (without the .shp file extension) -->
<Parameter name="file">/PATH/TO/THE/TM_WORLD_BORDERS_SIMPL-0.3</Parameter>
</Datasource>
</Layer>
</Map> <Style name="countries_label">
<Rule>
<!-- Only label those countries with over 9 Million People -->
<!-- Note: Halo and Fill are reversed to try to make them subtle -->
<Filter>[POP_EST] &gt;= 4320000 and [POP_EST] &lt; 9450000</Filter>
<TextSymbolizer size="7" fill="black" face-name="DejaVu Sans Bold" halo-fill="#DFDBE3" halo-radius="1" wrap-width="20">[NAME]</TextSymbolizer>
</Rule>
<Rule>
<!-- Only label those countries with over 9 Million People -->
<!-- Note: Halo and Fill are reversed to try to make them subtle -->
<Filter>[POP_EST] &gt;= 9450000 and [POP_EST] &lt; 25650000</Filter>
<TextSymbolizer size="9" fill="black" face-name="DejaVu Sans Book" halo-fill="#DFDBE3" halo-radius="1" wrap-width="20">[NAME]</TextSymbolizer>
</Rule>
<Rule>
<!-- Those with over 25 Million get larger labels -->
<Filter>[POP_EST] &gt;= 25650000 and [POP_EST] &lt; 1134000000</Filter>
<TextSymbolizer size="12" fill="white" face-name="DejaVu Sans Book" halo-fill="#2E2F39" halo-radius="1" wrap-width="20">[NAME]</TextSymbolizer>
</Rule>
<Rule>
<!-- Those with over 25 Million get larger labels -->
<!-- Note: allow_overlap is true here to allow India/China to sneak through -->
<Filter>[POP_EST] &gt;= 1134000000</Filter>
<TextSymbolizer size="15" fill="white" face-name="DejaVu Sans Book" halo-fill="black" halo-radius="1" wrap-width="20" allow-overlap="true" avoid-edges="true">[NAME]</TextSymbolizer>
</Rule>
</Style>
<Layer name="countries" srs="+proj=latlong +datum=WGS84" status="on">
<!-- Style order determines layering hierarchy -->
<!-- Labels go on top so they are listed second -->
<StyleName>population</StyleName>
<StyleName>countries_label</StyleName>
<Datasource>
<Parameter name="type">shape</Parameter>
<Parameter name="file">ne_110m_admin_0_countries.shp</Parameter>
</Datasource>
</Layer>
</Map>
``` ```