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--coding/file_container.hpp2
-rw-r--r--defines.hpp2
-rw-r--r--generator/feature_builder.cpp21
-rw-r--r--generator/feature_builder.hpp5
-rw-r--r--generator/feature_sorter.cpp46
-rw-r--r--generator/gen_mwm_info.hpp67
-rw-r--r--generator/generator.pro3
-rw-r--r--generator/osm_id.cpp5
-rw-r--r--generator/osm_id.hpp4
9 files changed, 138 insertions, 17 deletions
diff --git a/coding/file_container.hpp b/coding/file_container.hpp
index 722c0cee65..aa42a0f4a9 100644
--- a/coding/file_container.hpp
+++ b/coding/file_container.hpp
@@ -128,6 +128,8 @@ public:
/// @precondition Container should be opened with FileWriter::OP_WRITE_EXISTING.
void DeleteSection(Tag const & tag);
+ inline string const & GetFileName() const { return m_name; }
+
private:
uint64_t SaveCurrentSize();
diff --git a/defines.hpp b/defines.hpp
index 215ca86e16..146ea96bc7 100644
--- a/defines.hpp
+++ b/defines.hpp
@@ -3,6 +3,8 @@
#define DATA_FILE_EXTENSION ".mwm"
#define DATA_FILE_EXTENSION_TMP ".mwm.tmp"
#define FONT_FILE_EXTENSION ".ttf"
+#define OSM2FEATURE_FILE_EXTENSION ".osm2ft"
+
#define DATA_FILE_TAG "dat"
#define GEOMETRY_FILE_TAG "geom"
#define TRIANGLE_FILE_TAG "trg"
diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp
index ee7b7348cd..dd2ca63649 100644
--- a/generator/feature_builder.cpp
+++ b/generator/feature_builder.cpp
@@ -161,6 +161,15 @@ namespace
}
}
+bool FeatureBuilder1::IsHighway() const
+{
+ /// @todo Add additional type for check "route-ferry-motorcar"
+ /// when it will be added as separate type into classificator.
+
+ static feature::TypeSetChecker const checkHighway("highway");
+ return checkHighway.IsEqualV(m_params.m_Types);
+}
+
bool FeatureBuilder1::PreSerialize()
{
if (!m_params.IsValid())
@@ -188,10 +197,8 @@ bool FeatureBuilder1::PreSerialize()
case GEOM_LINE:
{
- static feature::TypeSetChecker checkHighway("highway");
-
// We need refs for road's numbers.
- if (!checkHighway.IsEqualV(m_params.m_Types))
+ if (!IsHighway())
m_params.ref.clear();
m_params.rank = 0;
@@ -586,3 +593,11 @@ void FeatureBuilder2::Serialize(buffers_holder_t & data, serial::CodingParams co
}
}
}
+
+uint64_t FeatureBuilder2::GetWayIDForRouting() const
+{
+ if (m_osmIds.size() == 1 && m_osmIds[0].IsWay() && IsLine() && IsHighway())
+ return m_osmIds[0].OsmId();
+ else
+ return 0;
+}
diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp
index f71e30b1ae..963823298e 100644
--- a/generator/feature_builder.hpp
+++ b/generator/feature_builder.hpp
@@ -165,6 +165,9 @@ public:
//@}
protected:
+ bool IsHighway() const;
+
+protected:
/// Used for features debugging
vector<osm::Id> m_osmIds;
@@ -230,6 +233,8 @@ public:
bool PreSerialize(buffers_holder_t const & data);
void Serialize(buffers_holder_t & data, serial::CodingParams const & params);
//@}
+
+ uint64_t GetWayIDForRouting() const;
};
namespace feature
diff --git a/generator/feature_sorter.cpp b/generator/feature_sorter.cpp
index b5997d1566..aee5ae1e7c 100644
--- a/generator/feature_sorter.cpp
+++ b/generator/feature_sorter.cpp
@@ -2,6 +2,7 @@
#include "feature_generator.hpp"
#include "feature_builder.hpp"
#include "tesselator.hpp"
+#include "gen_mwm_info.hpp"
#include "../defines.hpp"
@@ -89,6 +90,8 @@ namespace feature
DataHeader m_header;
+ gen::OsmID2FeatureID m_osm2ft;
+
public:
FeaturesCollector2(string const & fName, DataHeader const & header)
: FeaturesCollector(fName + DATA_FILE_TAG), m_writer(fName), m_header(header)
@@ -144,6 +147,12 @@ namespace feature
}
m_writer.Finish();
+
+ if (m_header.GetType() == DataHeader::country)
+ {
+ FileWriter osm2ftWriter(m_writer.GetFileName() + OSM2FEATURE_FILE_EXTENSION);
+ m_osm2ft.Flush(osm2ftWriter);
+ }
}
private:
@@ -493,7 +502,11 @@ namespace feature
{
fb.Serialize(holder.m_buffer, m_header.GetDefCodingParams());
- WriteFeatureBase(holder.m_buffer.m_buffer, fb);
+ uint32_t const ftID = WriteFeatureBase(holder.m_buffer.m_buffer, fb);
+
+ uint64_t const osmID = fb.GetWayIDForRouting();
+ if (osmID != 0)
+ m_osm2ft.Add(make_pair(osmID, ftID));
}
}
};
@@ -565,24 +578,31 @@ namespace feature
reader.ReadAsString(buffer);
strings::Tokenize(buffer, "|", DoStoreLanguages(header));
}
- catch (Reader::OpenException const &)
+ catch (Reader::Exception const &)
{
- LOG(LWARNING, ("No language file for country ", name));
+ LOG(LWARNING, ("No language file for country:", name));
}
- // Transform features from row format to optimized format.
- FeaturesCollector2 collector(datFilePath, header);
-
- for (size_t i = 0; i < midPoints.m_vec.size(); ++i)
+ // Transform features from raw format to optimized format.
+ try
{
- ReaderSource<FileReader> src(reader);
- src.Skip(midPoints.m_vec[i].second);
+ FeaturesCollector2 collector(datFilePath, header);
+
+ for (size_t i = 0; i < midPoints.m_vec.size(); ++i)
+ {
+ ReaderSource<FileReader> src(reader);
+ src.Skip(midPoints.m_vec[i].second);
- FeatureBuilder1 f;
- ReadFromSourceRowFormat(src, f);
+ FeatureBuilder1 f;
+ ReadFromSourceRowFormat(src, f);
- // emit the feature
- collector(GetFeatureBuilder2(f));
+ // emit the feature
+ collector(GetFeatureBuilder2(f));
+ }
+ }
+ catch (Writer::Exception const & ex)
+ {
+ LOG(LCRITICAL, ("MWM writing error:", ex.Msg()));
}
// at this point files should be closed
diff --git a/generator/gen_mwm_info.hpp b/generator/gen_mwm_info.hpp
new file mode 100644
index 0000000000..ba38e4f661
--- /dev/null
+++ b/generator/gen_mwm_info.hpp
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "../coding/read_write_utils.hpp"
+
+#include "../base/assert.hpp"
+
+#include "../std/utility.hpp"
+#include "../std/algorithm.hpp"
+
+
+namespace gen
+{
+
+template <class T> class Accumulator
+{
+protected:
+ vector<T> m_data;
+
+public:
+ typedef T ValueT;
+
+ void Add(T const & t) { m_data.push_back(t); }
+
+ template <class TSink> void Flush(TSink & sink) const
+ {
+ rw::WriteVectorOfPOD(sink, m_data);
+ }
+
+ template <class TSource> void Read(TSource & src)
+ {
+ rw::ReadVectorOfPOD(src, m_data);
+ }
+};
+
+class OsmID2FeatureID : public Accumulator<pair<uint64_t, uint32_t>>
+{
+ typedef Accumulator<ValueT> BaseT;
+
+ struct LessID
+ {
+ bool operator() (ValueT const & r1, ValueT const & r2) const { return r1.first < r2.first; }
+ bool operator() (uint64_t const & r1, ValueT const & r2) const { return r1 < r2.first; }
+ bool operator() (ValueT const & r1, uint64_t const & r2) const { return r1.first < r2; }
+ };
+
+public:
+ template <class TSink> void Flush(TSink & sink)
+ {
+ sort(m_data.begin(), m_data.end());
+
+ for (size_t i = 1; i < m_data.size(); ++i)
+ CHECK_NOT_EQUAL(m_data[i-1].first, m_data[i].first, ());
+
+ BaseT::Flush(sink);
+ }
+
+ uint32_t GetFeatureID(uint64_t osmID) const
+ {
+ vector<ValueT>::const_iterator i = lower_bound(m_data.begin(), m_data.end(), osmID, LessID());
+ if (i != m_data.end() && i->first == osmID)
+ return i->second;
+ else
+ return 0;
+ }
+};
+
+}
diff --git a/generator/generator.pro b/generator/generator.pro
index ea022b215b..dd9d51e9a6 100644
--- a/generator/generator.pro
+++ b/generator/generator.pro
@@ -60,4 +60,5 @@ HEADERS += \
coastlines_generator.hpp \
tesselator.hpp \
check_model.hpp \
- ways_merger.hpp
+ ways_merger.hpp \
+ gen_mwm_info.hpp \
diff --git a/generator/osm_id.cpp b/generator/osm_id.cpp
index 5d9e9fcad2..99f61411e1 100644
--- a/generator/osm_id.cpp
+++ b/generator/osm_id.cpp
@@ -38,6 +38,11 @@ uint64_t Id::OsmId() const
return m_encodedId & RESET;
}
+bool Id::IsWay() const
+{
+ return ((m_encodedId & WAY) == WAY);
+}
+
string Id::Type() const
{
if ((m_encodedId & RELATION) == RELATION)
diff --git a/generator/osm_id.hpp b/generator/osm_id.hpp
index e3401f0e6f..922435fada 100644
--- a/generator/osm_id.hpp
+++ b/generator/osm_id.hpp
@@ -15,10 +15,14 @@ class Id
public:
explicit Id(uint64_t encodedId = INVALID);
+
static Id Node(uint64_t osmId);
static Id Way(uint64_t osmId);
static Id Relation(uint64_t osmId);
+
uint64_t OsmId() const;
+ bool IsWay() const;
+
/// For debug output
string Type() const;