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:
parent
e0c2304d42
commit
7b3baee3a1
2 changed files with 51 additions and 0 deletions
|
@ -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> >())
|
||||||
|
|
33
tests/python_tests/query_test.py
Normal file
33
tests/python_tests/query_test.py
Normal 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]
|
Loading…
Reference in a new issue