2006-02-01 00:09:52 +01:00
/* This file is part of python_mapnik (c++/python mapping toolkit)
2006-02-20 02:34:02 +01:00
* Copyright ( C ) 2005 Artem Pavlenko , Jean - Francois Doyon
2006-02-01 00:09:52 +01:00
*
* Mapnik is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
//$Id: mapnik_layer.cc 17 2005-03-08 23:58:43Z pavlenko $
# include <boost/python.hpp>
# include <boost/python/detail/api_placeholder.hpp>
# include <boost/python/suite/indexing/vector_indexing_suite.hpp>
# include <mapnik.hpp>
using mapnik : : Layer ;
using mapnik : : parameters ;
struct layer_pickle_suite : boost : : python : : pickle_suite
{
static boost : : python : : tuple
getinitargs ( const Layer & l )
{
using namespace boost : : python ;
return boost : : python : : make_tuple ( l . params ( ) ) ;
}
static boost : : python : : tuple
getstate ( const Layer & l )
{
using namespace boost : : python ;
std : : vector < std : : string > const & styles = l . styles ( ) ;
std : : vector < std : : string > : : const_iterator itr = styles . begin ( ) ;
boost : : python : : list py_styles ;
while ( itr ! = styles . end ( ) )
{
py_styles . append ( * itr + + ) ;
}
return boost : : python : : make_tuple ( l . getMinZoom ( ) ,
l . getMaxZoom ( ) ,
py_styles ) ;
}
static void
setstate ( Layer & l , boost : : python : : tuple state )
{
using namespace boost : : python ;
if ( len ( state ) ! = 3 )
{
PyErr_SetObject ( PyExc_ValueError ,
( " expected 3-item tuple in call to __setstate__; got %s "
% state ) . ptr ( )
) ;
throw_error_already_set ( ) ;
}
l . setMinZoom ( extract < double > ( state [ 0 ] ) ) ;
l . setMaxZoom ( extract < double > ( state [ 1 ] ) ) ;
boost : : python : : list styles = extract < boost : : python : : list > ( state [ 2 ] ) ;
for ( int i = 0 ; i < len ( styles ) ; + + i )
{
l . add_style ( extract < std : : string > ( styles [ i ] ) ) ;
}
}
} ;
namespace
{
2006-03-01 16:15:37 +01:00
//user-friendly wrapper that uses Python dictionary
2006-02-01 00:09:52 +01:00
using namespace boost : : python ;
2006-03-01 16:34:23 +01:00
Layer create_layer ( const dict & d )
2006-02-01 00:09:52 +01:00
{
parameters params ;
2006-03-01 16:15:37 +01:00
boost : : python : : list keys = d . keys ( ) ;
for ( int i = 0 ; i < len ( keys ) ; + + i )
{
std : : string key = extract < std : : string > ( keys [ i ] ) ;
std : : string value = extract < std : : string > ( d [ key ] ) ;
params [ key ] = value ;
}
2006-02-01 00:09:52 +01:00
return Layer ( params ) ;
}
}
void export_layer ( )
{
using namespace boost : : python ;
2006-02-20 02:34:02 +01:00
class_ < std : : vector < std : : string > > ( " Styles " )
2006-02-01 00:09:52 +01:00
. def ( vector_indexing_suite < std : : vector < std : : string > , true > ( ) )
;
2006-02-25 12:03:30 +01:00
2006-02-26 22:47:35 +01:00
class_ < Layer > ( " Layer " , " A map layer. " , no_init )
2006-03-22 01:13:14 +01:00
. def ( " name " , & Layer : : name , return_value_policy < copy_const_reference > ( ) , " Return the name of the layer. " )
2006-03-28 03:01:00 +02:00
. def ( " params " , & Layer : : params , return_value_policy < reference_existing_object > ( ) , " The configuration parameters of the layer. These vary depending on the type of data source. " )
2006-03-22 01:13:14 +01:00
. def ( " envelope " , & Layer : : envelope , " Return the geographic envelope/bounding box of the data in the layer. " )
2006-02-01 00:09:52 +01:00
. add_property ( " minzoom " , & Layer : : getMinZoom , & Layer : : setMinZoom )
. add_property ( " maxzoom " , & Layer : : getMaxZoom , & Layer : : setMaxZoom )
. add_property ( " styles " , make_function
( & Layer : : styles , return_value_policy < reference_existing_object > ( ) ) )
. def_pickle ( layer_pickle_suite ( ) )
;
2006-03-01 16:34:23 +01:00
def ( " CreateLayer " , & create_layer ) ;
2006-02-01 00:09:52 +01:00
}