diff --git a/utils/mapnik-index/build.py b/utils/mapnik-index/build.py index ccf8731ba..335874422 100644 --- a/utils/mapnik-index/build.py +++ b/utils/mapnik-index/build.py @@ -31,6 +31,7 @@ source = Split( """ mapnik-index.cpp process_csv_file.cpp + process_geojson_file.cpp """ ) diff --git a/utils/mapnik-index/mapnik-index.cpp b/utils/mapnik-index/mapnik-index.cpp index f4ebe3c0f..c3547d397 100644 --- a/utils/mapnik-index/mapnik-index.cpp +++ b/utils/mapnik-index/mapnik-index.cpp @@ -29,7 +29,7 @@ #include #include "process_csv_file.hpp" - +#include "process_geojson_file.hpp" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-local-typedef" @@ -143,7 +143,7 @@ int main (int argc, char** argv) } using box_type = mapnik::box2d; - using item_type = std::pair>; + using item_type = std::pair>; for (auto const& filename : files) { @@ -164,7 +164,9 @@ int main (int argc, char** argv) } else if (mapnik::detail::is_geojson(filename)) { - std::clog << "TODO: support GeoJSON" << std::endl; + auto result = mapnik::detail::process_geojson_file(boxes, filename); + if (!result.first) continue; + extent = result.second; } if (extent.valid()) diff --git a/utils/mapnik-index/process_csv_file.cpp b/utils/mapnik-index/process_csv_file.cpp index 61c136cb9..3b4344a67 100644 --- a/utils/mapnik-index/process_csv_file.cpp +++ b/utils/mapnik-index/process_csv_file.cpp @@ -31,7 +31,6 @@ #include #pragma GCC diagnostic pop #include -#include namespace mapnik { namespace detail { @@ -209,8 +208,8 @@ std::pair> process_csv_file(T & boxes, std::string const& fil } using box_type = mapnik::box2d; -using item_type = std::pair>; +using item_type = std::pair>; using boxes_type = std::vector; -template std::pair> process_csv_file(boxes_type&, std::string const&e, std::string const&, char, char); +template std::pair> process_csv_file(boxes_type&, std::string const&, std::string const&, char, char); }} diff --git a/utils/mapnik-index/process_geojson_file.cpp b/utils/mapnik-index/process_geojson_file.cpp new file mode 100644 index 000000000..5200a0a4a --- /dev/null +++ b/utils/mapnik-index/process_geojson_file.cpp @@ -0,0 +1,89 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2015 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 + * + *****************************************************************************/ + +#include "process_geojson_file.hpp" +#include +#include +#include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#pragma GCC diagnostic ignored "-Wsign-conversion" +#include +#include +#include +#pragma GCC diagnostic pop +#include +#include +#include + +namespace { +using base_iterator_type = char const*; +const mapnik::json::extract_bounding_box_grammar geojson_datasource_static_bbox_grammar; +} + +namespace mapnik { namespace detail { + +template +std::pair> process_geojson_file(T & boxes, std::string const& filename) +{ + mapnik::box2d extent; + mapnik::mapped_region_ptr mapped_region; + boost::optional memory = + mapnik::mapped_memory_cache::instance().find(filename, true); + if (!memory) + { + std::clog << "Error : cannot mmap " << filename << std::endl; + return std::make_pair(false, extent); + } + else + { + mapped_region = *memory; + } + char const* start = reinterpret_cast(mapped_region->get_address()); + char const* end = start + mapped_region->get_size(); + boost::spirit::standard::space_type space; + try + { + if (!boost::spirit::qi::phrase_parse(start, end, (geojson_datasource_static_bbox_grammar)(boost::phoenix::ref(boxes)) , space)) + { + std::clog << "mapnik-index (GeoJSON) : could not parse: '" << filename << "'"; + return std::make_pair(false, extent); + } + } + catch (std::exception const& ex) + { + std::clog << "mapnik-index:" << ex.what() << std::endl; + } + for (auto const& item : boxes) + { + if (!extent.valid()) extent = item.first; + else extent.expand_to_include(item.first); + } + return std::make_pair(true, extent); +} + +using box_type = mapnik::box2d; +using item_type = std::pair>; +using boxes_type = std::vector; +template std::pair> process_geojson_file(boxes_type&, std::string const&); + +}} diff --git a/utils/mapnik-index/process_geojson_file.hpp b/utils/mapnik-index/process_geojson_file.hpp new file mode 100644 index 000000000..d7ccd634f --- /dev/null +++ b/utils/mapnik-index/process_geojson_file.hpp @@ -0,0 +1,36 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2015 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 MAPNIK_UTILS_PROCESS_GEOJSON_FILE_HPP +#define MAPNIK_UTILS_PROCESS_GEOJSON_FILE_HPP + +#include +#include + +namespace mapnik { namespace detail { + +template +std::pair> process_geojson_file(T & boxes, std::string const& filename); + +}} + +#endif // MAPNIK_UTILS_PROCESS_GEOJSON_FILE_HPP