From b2f5dee9dd26e2fbf5415a21080907cd1b08a3bf Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 29 Apr 2011 06:05:53 +0300 Subject: [PATCH] Add mwm rect updater functions. --- generator/generator_tool/generator_tool.cpp | 4 ++ generator/mwm_rect_updater.cpp | 61 +++++++++++++++++++++ generator/mwm_rect_updater.hpp | 5 ++ geometry/tree4d.hpp | 9 +++ 4 files changed, 79 insertions(+) create mode 100644 generator/mwm_rect_updater.cpp create mode 100644 generator/mwm_rect_updater.hpp diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index bacf3c6aef..02e613e87f 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -7,6 +7,7 @@ #include "../statistics.hpp" #include "../classif_routine.hpp" #include "../borders_generator.hpp" +#include "../mwm_rect_updater.hpp" #include "../../indexer/features_vector.hpp" #include "../../indexer/index_builder.hpp" @@ -190,6 +191,9 @@ int main(int argc, char ** argv) } } + //if (FLAGS_split_by_polygons) + // UpdateMWMRectsFromBoundaries(path, FLAGS_simplify_countries_level); + // Create http update list for countries and corresponding files if (FLAGS_generate_update) { diff --git a/generator/mwm_rect_updater.cpp b/generator/mwm_rect_updater.cpp new file mode 100644 index 0000000000..b36c2420b6 --- /dev/null +++ b/generator/mwm_rect_updater.cpp @@ -0,0 +1,61 @@ +#include "mwm_rect_updater.hpp" +#include "borders_loader.hpp" + +#include "../indexer/data_header.hpp" + +#include "../coding/file_container.hpp" + +#include "../base/logging.hpp" + +#include "../defines.hpp" + + +namespace +{ + class DoUpdateRect + { + string const & m_basePath; + public: + DoUpdateRect(string const & path) : m_basePath(path) {} + + void operator() (m2::RectD const & r, borders::CountryPolygons const & c) + { + string name = m_basePath + c.m_name + DATA_FILE_EXTENSION; + + feature::DataHeader h; + + try + { + { + FilesContainerR contR(name); + h.Load(contR.GetReader(HEADER_FILE_TAG)); + } + + h.SetBounds(r); + + { + FilesContainerW contW(name, FileWriter::OP_WRITE_EXISTING); + FileWriter w = contW.GetWriter(HEADER_FILE_TAG); + h.Save(w); + } + } + catch (FileReader::OpenException const &) + { + // country from countries list not found + } + catch (FileWriter::OpenException const &) + { + // something real bad happend + LOG(LERROR, ("Can't open existing file for writing")); + } + } + }; +} + +void UpdateMWMRectsFromBoundaries(string const & dataPath, int level) +{ + borders::CountriesContainerT countries; + borders::LoadCountriesList(dataPath, countries, level); + + countries.ForEachWithRect(DoUpdateRect(dataPath)); +} diff --git a/generator/mwm_rect_updater.hpp b/generator/mwm_rect_updater.hpp new file mode 100644 index 0000000000..4956505942 --- /dev/null +++ b/generator/mwm_rect_updater.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include "../std/string.hpp" + +void UpdateMWMRectsFromBoundaries(string const & dataPath, int level); diff --git a/geometry/tree4d.hpp b/geometry/tree4d.hpp index 2976da82ff..fa3c9de3b7 100644 --- a/geometry/tree4d.hpp +++ b/geometry/tree4d.hpp @@ -35,6 +35,8 @@ namespace m4 } double operator[](size_t i) const { return m_pts[i]; } + + m2::RectD GetRect() const { return m2::RectD(m_pts[0], m_pts[1], m_pts[2], m_pts[3]); } }; typedef KDTree::KDTree<4, value_t> tree_t; @@ -147,6 +149,13 @@ namespace m4 toDo((*i).m_val); } + template + void ForEachWithRect(ToDo toDo) const + { + for (typename tree_t::const_iterator i = m_tree.begin(); i != m_tree.end(); ++i) + toDo((*i).GetRect(), (*i).m_val); + } + template void ForEachInRect(m2::RectD const & rect, ToDo toDo) const {