From 610b4b2a67b189abb3eadae3005c54ceaa80143a Mon Sep 17 00:00:00 2001 From: vng Date: Thu, 6 Feb 2014 16:58:30 +0300 Subject: [PATCH] [generator_tool] Refactoring of address file generation. Use --address_file_name=address.txt option. --- generator/feature_builder.cpp | 5 +++ generator/feature_builder.hpp | 2 ++ generator/feature_generator.cpp | 6 +++- generator/generate_info.hpp | 1 + generator/generator_tool/generator_tool.cpp | 5 +++ generator/osm_element.hpp | 34 ++++++++------------- indexer/feature_data.cpp | 12 ++++++-- indexer/feature_data.hpp | 16 ++++++++-- 8 files changed, 54 insertions(+), 27 deletions(-) diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 1f5be0b099..441fbda5d1 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -104,6 +104,11 @@ bool FeatureBuilder1::RemoveInvalidTypes() static_cast(m_Params.GetGeomType())); } +bool FeatureBuilder1::FormatFullAddress(string & res) const +{ + return m_Params.FormatFullAddress(m_LimitRect.Center(), res); +} + FeatureBase FeatureBuilder1::GetFeatureBase() const { CHECK ( CheckValid(), (*this) ); diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp index f7ad3160ff..0a4120c5cf 100644 --- a/generator/feature_builder.hpp +++ b/generator/feature_builder.hpp @@ -74,6 +74,8 @@ public: //@{ inline m2::RectD GetLimitRect() const { return m_LimitRect; } + bool FormatFullAddress(string & res) const; + /// Get common parameters of feature. FeatureBase GetFeatureBase() const; diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index 08a158e3e2..7030057436 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -25,6 +25,7 @@ #include "../std/unordered_map.hpp" #include "../std/target_os.hpp" + namespace feature { @@ -437,7 +438,10 @@ bool GenerateImpl(GenerateInfo & info) MainFeaturesEmitter bucketer(info); SecondPassParserUsual parser( - bucketer, holder, info.m_makeCoasts ? classif().GetCoastType() : 0); + bucketer, holder, + info.m_makeCoasts ? classif().GetCoastType() : 0, + info.m_addressFile); + ParseXMLFromStdIn(parser); // Stop if coasts are not merged and FLAG_fail_on_coasts is set diff --git a/generator/generate_info.hpp b/generator/generate_info.hpp index 914c2218e3..04c924d11a 100644 --- a/generator/generate_info.hpp +++ b/generator/generate_info.hpp @@ -17,6 +17,7 @@ struct GenerateInfo string m_tmpDir; string m_datFilePrefix; string m_datFileSuffix; + string m_addressFile; vector m_bucketNames; diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 84b0b69adf..9626a738fc 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -60,6 +60,8 @@ DEFINE_bool(generate_packed_borders, false, "Generate packed file with country p DEFINE_bool(check_mwm, false, "Check map file to be correct."); DEFINE_string(delete_section, "", "Delete specified section (defines.hpp) from container."); DEFINE_bool(fail_on_coasts, false, "Stop and exit with '255' code if some coastlines are not merged."); +DEFINE_string(address_file_name, "", "Output file name for storing full addresses."); + string AddSlashIfNeeded(string const & str) { @@ -133,6 +135,9 @@ int main(int argc, char ** argv) genInfo.m_makeCoasts = FLAGS_make_coasts; genInfo.m_emitCoasts = FLAGS_emit_coasts; + if (!FLAGS_address_file_name.empty()) + genInfo.m_addressFile = path + FLAGS_address_file_name; + if (!feature::GenerateFeatures(genInfo, FLAGS_use_light_nodes)) return -1; diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index 47c9f42136..0a4f5fb219 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -12,8 +12,6 @@ #include "../base/logging.hpp" #include "../base/stl_add.hpp" -#include "../platform/platform.hpp" - #include "../std/unordered_map.hpp" #include "../std/list.hpp" @@ -347,6 +345,7 @@ class SecondPassParserUsual : public SecondPassParserBase typedef typename base_type::feature_builder_t feature_t; uint32_t m_coastType; + scoped_ptr m_addrWriter; protected: virtual void EmitElement(XMLElement * p) @@ -413,15 +412,10 @@ protected: f.SetCenter(ft.GetGeometryCenter()); if (f.PreSerialize()) { - if (!params.m_streetAddress.empty() && !params.house.IsEmpty()) - { - m2::PointD p = ft.GetLimitRect().Center(); - string const s = params.m_streetAddress + "|" + params.house.Get() + "|" - + strings::to_string(MercatorBounds::YToLat(p.y)) + "|" - + strings::to_string(MercatorBounds::XToLon(p.x)) + '\n'; - FileWriter writer = FileWriter(GetPlatform().WritableDir() + "adresses.txt", FileWriter::OP_APPEND, false); - writer.Write(s.c_str(), s.size()); - } + string addr; + if (m_addrWriter && f.FormatFullAddress(addr)) + m_addrWriter->Write(addr.c_str(), addr.size()); + base_type::m_emitter(f); } } @@ -490,15 +484,10 @@ protected: ft.SetParams(fValue); if (ft.PreSerialize()) { - if (!fValue.m_streetAddress.empty() && !fValue.house.IsEmpty()) - { - m2::PointD p = ft.GetLimitRect().Center(); - string const s = fValue.m_streetAddress + "|" + fValue.house.Get() + "|" - + strings::to_string(MercatorBounds::YToLat(p.y)) + "|" - + strings::to_string(MercatorBounds::XToLon(p.x)) + '\n'; - FileWriter writer = FileWriter(GetPlatform().WritableDir() + "adresses.txt", FileWriter::OP_APPEND, false); - writer.Write(s.c_str(), s.size()); - } + string addr; + if (m_addrWriter && ft.FormatFullAddress(addr)) + m_addrWriter->Write(addr.c_str(), addr.size()); + // add osm id for debugging ft.AddOsmId(p->name, id); base_type::m_emitter(ft); @@ -506,8 +495,11 @@ protected: } public: - SecondPassParserUsual(TEmitter & emitter, THolder & holder, uint32_t coastType) + SecondPassParserUsual(TEmitter & emitter, THolder & holder, + uint32_t coastType, string const & addrFilePath) : base_type(emitter, holder), m_coastType(coastType) { + if (!addrFilePath.empty()) + m_addrWriter.reset(new FileWriter(addrFilePath, FileWriter::OP_APPEND)); } }; diff --git a/indexer/feature_data.cpp b/indexer/feature_data.cpp index d8f12ec33c..0eeb4945b2 100644 --- a/indexer/feature_data.cpp +++ b/indexer/feature_data.cpp @@ -125,9 +125,17 @@ void FeatureParamsBase::AddHouseNumber(string const & ss) house.Set(house.IsEmpty() ? s : s + ", " + house.Get()); } -void FeatureParamsBase::AddStreetAddress(string const & s) +bool FeatureParams::FormatFullAddress(m2::PointD const & pt, string & res) const { - m_streetAddress = s; + if (!m_streetAddress.empty() && !house.IsEmpty()) + { + res = m_streetAddress + "|" + house.Get() + "|" + + strings::to_string(MercatorBounds::YToLat(pt.y)) + "|" + + strings::to_string(MercatorBounds::XToLon(pt.x)) + '\n'; + return true; + } + + return false; } void FeatureParams::SetGeomType(feature::EGeomType t) diff --git a/indexer/feature_data.hpp b/indexer/feature_data.hpp index 8ca13a6da0..97ebf03311 100644 --- a/indexer/feature_data.hpp +++ b/indexer/feature_data.hpp @@ -1,6 +1,8 @@ #pragma once #include "feature_decl.hpp" +#include "../geometry/point2d.hpp" + #include "../coding/multilang_utf8_string.hpp" #include "../coding/value_opt_string.hpp" #include "../coding/reader.hpp" @@ -112,8 +114,6 @@ struct FeatureParamsBase string flats; int8_t layer; uint8_t rank; - /// We use it now only for search unit tests - string m_streetAddress; FeatureParamsBase() : layer(0), rank(0) {} @@ -127,7 +127,6 @@ struct FeatureParamsBase void AddHouseName(string const & s); void AddHouseNumber(string const & s); - void AddStreetAddress(string const & s); template void Write(TSink & sink, uint8_t header) const @@ -194,18 +193,29 @@ class FeatureParams : public FeatureParamsBase uint8_t m_geomType; + /// We use it now only for search unit tests + string m_streetAddress; + public: typedef vector types_t; types_t m_Types; FeatureParams() : m_geomType(0xFF) {} + /// @name Used in storing full street address only. + //@{ + inline void AddStreetAddress(string const & s) { m_streetAddress = s; } + bool FormatFullAddress(m2::PointD const & pt, string & res) const; + //@} + /// Assign parameters except geometry type. /// Geometry is independent state and it's set by FeatureType's geometry functions. inline void SetParams(FeatureParams const & rhs) { BaseT::operator=(rhs); + m_Types = rhs.m_Types; + m_streetAddress = rhs.m_streetAddress; } inline bool IsValid() const { return !m_Types.empty(); }