Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--generator/feature_builder.cpp5
-rw-r--r--generator/feature_builder.hpp2
-rw-r--r--generator/feature_generator.cpp6
-rw-r--r--generator/generate_info.hpp1
-rw-r--r--generator/generator_tool/generator_tool.cpp5
-rw-r--r--generator/osm_element.hpp34
-rw-r--r--indexer/feature_data.cpp12
-rw-r--r--indexer/feature_data.hpp16
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<FeatureGeoType>(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<MainFeaturesEmitter, holder_t> 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<string> 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<TEmitter, THolder>
typedef typename base_type::feature_builder_t feature_t;
uint32_t m_coastType;
+ scoped_ptr<FileWriter> 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 <class TSink>
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<uint32_t> 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(); }