diff --git a/bindings/python/mapnik_python.cpp b/bindings/python/mapnik_python.cpp index 4a94ab97d..7a97867f2 100644 --- a/bindings/python/mapnik_python.cpp +++ b/bindings/python/mapnik_python.cpp @@ -75,6 +75,7 @@ void export_view_transform(); void export_raster_colorizer(); void export_label_collision_detector(); void export_logger(); +void export_wkt_reader(); #include #include @@ -535,6 +536,7 @@ BOOST_PYTHON_MODULE(_mapnik) export_raster_colorizer(); export_label_collision_detector(); export_logger(); + export_wkt_reader(); def("clear_cache", &clear_cache, "\n" diff --git a/bindings/python/mapnik_wkt_reader.cpp b/bindings/python/mapnik_wkt_reader.cpp new file mode 100644 index 000000000..3e9fa9be4 --- /dev/null +++ b/bindings/python/mapnik_wkt_reader.cpp @@ -0,0 +1,55 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2013 Artem Pavlenko, Jean-Francois Doyon + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + *****************************************************************************/ + +// boost +#include +#include +#include +#include +#include +// mapnik +#include +#include + +namespace impl { + +typedef boost::ptr_vector path_type; + +boost::shared_ptr from_wkt(mapnik::wkt_parser & p, std::string const& wkt) +{ + boost::shared_ptr paths = boost::make_shared(); + if (!p.parse(wkt, *paths)) + throw std::runtime_error("Failed to parse WKT"); + return paths; +} + +} + +void export_wkt_reader() +{ + using mapnik::wkt_parser; + using namespace boost::python; + + class_("WKTReader",init<>()) + .def("read",&impl::from_wkt) + ; +} diff --git a/tests/python_tests/geometry_io_test.py b/tests/python_tests/geometry_io_test.py index 7d6f78224..753bc9aec 100644 --- a/tests/python_tests/geometry_io_test.py +++ b/tests/python_tests/geometry_io_test.py @@ -102,10 +102,15 @@ def test_geojson_parsing(): pass eq_(count,len(path)) +reader = mapnik.WKTReader() + def compare_wkb_from_wkt(wkt,num=None): # create a Path from geometry(s) - paths = mapnik.Path.from_wkt(wkt) + # easy api, but slower + #paths = mapnik.Path.from_wkt(wkt) + # fast api + paths = reader.read(wkt); # add geometry(s) to feature from wkt f = mapnik.Feature(mapnik.Context(),1) @@ -136,7 +141,10 @@ def compare_wkb_from_wkt(wkt,num=None): def compare_wkt_from_wkt(wkt,num=None): # create a Path from geometry(s) - paths = mapnik.Path.from_wkt(wkt) + # easy api, but slower + #paths = mapnik.Path.from_wkt(wkt) + # fast api + paths = reader.read(wkt); # add geometry(s) to feature from wkt f = mapnik.Feature(mapnik.Context(),1) @@ -185,7 +193,10 @@ def test_wkb_simple(): @raises(IndexError) def test_geometry_index_error(): wkt = 'Point (0 0)' - paths = mapnik.Path.from_wkt(wkt) + # easy api, but slower + #paths = mapnik.Path.from_wkt(wkt) + # fast api + paths = reader.read(wkt); paths[3] f = mapnik.Feature(mapnik.Context(),1) f.add_geometries_from_wkt(wkt)