diff --git a/plugins/input/shape/shape_utils.cpp b/plugins/input/shape/shape_utils.cpp new file mode 100644 index 000000000..d83db47dd --- /dev/null +++ b/plugins/input/shape/shape_utils.cpp @@ -0,0 +1,73 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2011 Artem Pavlenko + * + * 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 + * + *****************************************************************************/ + +// mapnik +#include +#include "shape_utils.hpp" + +// boost +#include +// stl +#include +#include + + +void setup_attributes(mapnik::context_ptr const& ctx, + std::set const& names, + std::string const& shape_name, + shape_io & shape, + std::vector & attr_ids) +{ + std::set::const_iterator pos = names.begin(); + std::set::const_iterator end = names.end(); + for ( ;pos !=end; ++pos) + { + bool found_name = false; + for (int i = 0; i < shape.dbf().num_fields(); ++i) + { + if (shape.dbf().descriptor(i).name_ == *pos) + { + ctx->push(*pos); + attr_ids.push_back(i); + found_name = true; + break; + } + } + + if (! found_name) + { + std::ostringstream s; + + s << "no attribute '" << *pos << "' in '" + << shape_name << "'. Valid attributes are: "; + + std::vector list; + for (int i = 0; i < shape.dbf().num_fields(); ++i) + { + list.push_back(shape.dbf().descriptor(i).name_); + } + s << boost::algorithm::join(list, ",") << "."; + + throw mapnik::datasource_exception("Shape Plugin: " + s.str()); + } + } +} diff --git a/plugins/input/shape/shape_utils.hpp b/plugins/input/shape/shape_utils.hpp new file mode 100644 index 000000000..cbffa5c3a --- /dev/null +++ b/plugins/input/shape/shape_utils.hpp @@ -0,0 +1,40 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2011 Artem Pavlenko + * + * 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 + * + *****************************************************************************/ + +#ifndef SHAPE_UTILS_HPP +#define SHAPE_UTILS_HPP + +// mapnik +#include +#include "shape_io.hpp" +// stl +#include +#include +#include + +void setup_attributes(mapnik::context_ptr const& ctx, + std::set const& names, + std::string const& shape_name, + shape_io & shape, + std::vector & attr_ids); + +#endif // SHAPE_UTILS_HPP