6 GEOS
springmeyer edited this page 2012-08-24 13:09:14 -07:00

Mapnik's PluginArchitecture supports the use of different input formats.

One such plugin supports writing inline WKT geometries directly in XML files or python, thus allowing to design geometries directly into mapnik withouth the need to access separate files or database. This is extremely useful to build legends, or layer styles images to put in layers controls widgets, or eventually visualize fixed geometries in your maps.

Installation (On Linux)

Check if you have the GEOS library installed:

    $ geos-config --version
    3.2.0

If not, install it from here or use your package system on your distro.

If scons is unable to find the needed headers and library, make sure you define where they are in config.py:

GEOS_INCLUDES='/usr/local/include'
GEOS_LIBS='/usr/local/lib'

Make sure that running python scons/scons.py DEBUG=y shows the following line

Checking for C library geos_c... yes

To check if the geos plugin built and was installed correctly, try the usual Python from mapnik import * on a DEBUG=y build, and look for the following debug line

registered datasource : geos

Parameters

parameter value description default
wkt string valid Well-Known-Text string describing the geometry to display
extent string extent of the passed geometry determined by the WKT geometry
gid integer specify the geometry id, useful if you need to give it an id and display it with a TextSymbolizer 0
field_data string additional text of the geometry, if you need to give it an id and display it with a TextSymbolizer
field_name string name of the field to use in a TextSymbolizer to display the "field_data" value name
multiple_geometries boolean wheter to use multiple different objects or a single one when dealing with multi-objects (this is mainly related to how the label are used in the map, one label for a multi-polygon or one label for each polygon of a multi-polygon) false
encoding string internal file encoding utf-8

Usage

Python

Instantiate a datasource like:

    lyr = Layer('WKT Rectangle')
    lyr.datasource = Geos(wkt='POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')

XML

If you are using XML mapfiles to style your data, then using a datasource looks like:

      <Layer name="WKT Rectangle" status="on">
        <StyleName>RectangleStyle</StyleName>
        <Datasource>
          <Parameter name="wkt">POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))</Parameter>
        </Datasource>
      </Layer>

C++

Plugin datasource initialization example code can be found on PluginArchitecture.

A datasource may be created as follows:

    {
        parameters p;
        p["type"]="geos";
        p["wkt"]="POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))";
        p["extent"]="0,0,10,10"; // optional
    
        set_datasource(datasource_cache::instance()->create(p));
    
        Layer lyr("WKT Rectangle");
        lyr.add_style("RectangleStyle");
        m.addLayer(lyr);
    }