diff options
author | Maksim Andrianov <maksimandrianov1@gmail.com> | 2018-08-02 16:05:53 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <bykoianko@gmail.com> | 2018-08-09 16:28:40 +0300 |
commit | 2fbe30b352d740b5570878f69ba1c6456335184b (patch) | |
tree | fdfa038238c2e6bda6fea2d4a2b152e2a1a31936 /generator/translator_region.cpp | |
parent | af2717c9d19e1bc6203663faa79b86338d4ab9ae (diff) |
[generator] Separated osm_translator
Diffstat (limited to 'generator/translator_region.cpp')
-rw-r--r-- | generator/translator_region.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/generator/translator_region.cpp b/generator/translator_region.cpp new file mode 100644 index 0000000000..4485c638d1 --- /dev/null +++ b/generator/translator_region.cpp @@ -0,0 +1,115 @@ +#include "generator/translator_region.hpp" + +#include "generator/emitter_interface.hpp" +#include "generator/feature_builder.hpp" +#include "generator/generate_info.hpp" +#include "generator/holes.hpp" +#include "generator/intermediate_data.hpp" +#include "generator/osm2type.hpp" +#include "generator/osm_element.hpp" + +#include "indexer/classificator.hpp" + +#include "base/assert.hpp" + +#include <set> +#include <string> +#include <vector> + +namespace generator +{ +TranslatorRegion::TranslatorRegion(std::shared_ptr<EmitterInterface> emitter, + cache::IntermediateDataReader & holder) : + m_emitter(emitter), + m_holder(holder) +{ +} + +void TranslatorRegion::EmitElement(OsmElement * p) +{ + CHECK(p, ("Tried to emit a null OsmElement")); + + switch(p->type) + { + case OsmElement::EntityType::Relation: + { + FeatureParams params; + if (!(IsSuitableElement(p) && ParseParams(p, params))) + return; + + BuildFeatureAndEmit(p, params); + break; + } + default: + break; + } +} + +bool TranslatorRegion::IsSuitableElement(OsmElement const * p) const +{ + static std::set<std::string> const adminLevels = {"2", "4", "5", "6", "7", "8"}; + static std::set<std::string> const places = {"city", "town", "village", "suburb", "neighbourhood", + "hamlet", "locality", "isolated_dwelling"}; + + bool haveBoundary = false; + bool haveAdminLevel = false; + bool haveName = false; + for (auto const & t : p->Tags()) + { + if (t.key == "place" && places.find(t.value) != places.end()) + return true; + + if (t.key == "boundary" && t.value == "administrative") + haveBoundary = true; + else if (t.key == "admin_level" && adminLevels.find(t.value) != adminLevels.end()) + haveAdminLevel = true; + else if (t.key == "name" && !t.value.empty()) + haveName = true; + + if (haveBoundary && haveAdminLevel && haveName) + return true; + } + + return false; +} + +void TranslatorRegion::AddInfoAboutRegion(OsmElement const * p, + FeatureBuilder1 & ft) const +{ +} + +bool TranslatorRegion::ParseParams(OsmElement * p, FeatureParams & params) const +{ + ftype::GetNameAndType(p, params, [] (uint32_t type) { + return classif().IsTypeValid(type); + }); + return params.IsValid(); +} + +void TranslatorRegion::BuildFeatureAndEmit(OsmElement const * p, FeatureParams & params) +{ + HolesRelation helper(m_holder); + helper.Build(p); + auto const & holesGeometry = helper.GetHoles(); + auto & outer = helper.GetOuter(); + outer.ForEachArea(true, [&] (FeatureBuilder1::PointSeq const & pts, + std::vector<uint64_t> const & ids) + { + FeatureBuilder1 ft; + for (uint64_t id : ids) + ft.AddOsmId(osm::Id::Way(id)); + + for (auto const & pt : pts) + ft.AddPoint(pt); + + ft.AddOsmId(osm::Id::Relation(p->id)); + if (!ft.IsGeometryClosed()) + return; + + ft.SetAreaAddHoles(holesGeometry); + ft.SetParams(params); + AddInfoAboutRegion(p, ft); + (*m_emitter)(ft); + }); +} +} // namespace generator |