python bindings: export Query.resolution property as a tuple

Although the mapnik::query class is exposed to the Python bindings, the
resolution attribute is a raw boost::tuple. If you attempt to access
this tuple from Python, boost complains strongly.

This patch adds the required magic to marshal the raw boost::tuple which
is query::resolution_type into an honest-to-goodness Python tuple.
This commit is contained in:
Rich Wareham 2012-07-19 19:03:34 +01:00
parent e0c2304d42
commit 7b3baee3a1
2 changed files with 51 additions and 0 deletions

View file

@ -30,6 +30,8 @@
using mapnik::query; using mapnik::query;
using mapnik::box2d; using mapnik::box2d;
namespace python = boost::python;
struct query_pickle_suite : boost::python::pickle_suite struct query_pickle_suite : boost::python::pickle_suite
{ {
static boost::python::tuple static boost::python::tuple
@ -39,10 +41,26 @@ struct query_pickle_suite : boost::python::pickle_suite
} }
}; };
struct resolution_to_tuple
{
static PyObject* convert(query::resolution_type const& x)
{
python::object tuple(python::make_tuple(x.get<0>(), x.get<1>()));
return python::incref(tuple.ptr());
}
static PyTypeObject const* get_pytype()
{
return &PyTuple_Type;
}
};
void export_query() void export_query()
{ {
using namespace boost::python; using namespace boost::python;
to_python_converter<query::resolution_type, resolution_to_tuple> ();
class_<query>("Query", "a spatial query data object", class_<query>("Query", "a spatial query data object",
init<box2d<double>,query::resolution_type const&,double>() ) init<box2d<double>,query::resolution_type const&,double>() )
.def(init<box2d<double> >()) .def(init<box2d<double> >())

View file

@ -0,0 +1,33 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, mapnik
from nose.tools import *
from utilities import execution_path
def setup():
# All of the paths used are relative, if we run the tests
# from another directory we need to chdir()
os.chdir(execution_path('.'))
def test_query_init():
bbox = (-180, -90, 180, 90)
query = mapnik.Query(mapnik.Box2d(*bbox))
r = query.resolution
assert_almost_equal(r[0], 1.0, places=7)
assert_almost_equal(r[1], 1.0, places=7)
# Converting *from* tuples *to* resolutions is not yet supported
@raises(TypeError)
def test_query_resolution():
bbox = (-180, -90, 180, 90)
init_res = (4.5, 6.7)
query = mapnik.Query(mapnik.Box2d(*bbox), init_res)
r = query.resolution
assert_almost_equal(r[0], init_res[0], places=7)
assert_almost_equal(r[1], init_res[1], places=7)
if __name__ == "__main__":
setup()
[eval(run)() for run in dir() if 'test_' in run]