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:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-06-21 11:46:32 +0300
committerVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-07-23 10:25:09 +0300
commitde84454400b0c35f8556957e4945cd7f68b6c8e6 (patch)
treef88a7acfac7344e79719ebb2091820dd697833a8 /indexer
parenteead0e66ec4f397ecb67aedc8bf252c370efff31 (diff)
[altitude] The first version of writing to mwm and reading from altitude information.
Diffstat (limited to 'indexer')
-rw-r--r--indexer/feature.cpp11
-rw-r--r--indexer/feature.hpp13
-rw-r--r--indexer/feature_altitude.hpp49
-rw-r--r--indexer/feature_loader.cpp42
-rw-r--r--indexer/feature_loader.hpp17
-rw-r--r--indexer/feature_loader_base.cpp5
-rw-r--r--indexer/feature_loader_base.hpp2
-rw-r--r--indexer/indexer.pro1
-rw-r--r--indexer/old/feature_loader_101.hpp18
9 files changed, 140 insertions, 18 deletions
diff --git a/indexer/feature.cpp b/indexer/feature.cpp
index b05151515a..7153bc6476 100644
--- a/indexer/feature.cpp
+++ b/indexer/feature.cpp
@@ -302,7 +302,7 @@ void FeatureType::Deserialize(feature::LoaderBase * pLoader, TBuffer buffer)
m_pLoader->InitFeature(this);
- m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = false;
+ m_header2Parsed = m_pointsParsed = m_trianglesParsed = m_metadataParsed = m_altitudeParsed = false;
m_innerStats.MakeZero();
}
@@ -375,6 +375,15 @@ void FeatureType::ParseMetadata() const
m_metadataParsed = true;
}
+void FeatureType::ParseAltitude() const
+{
+ if (m_altitudeParsed)
+ return;
+
+ m_pLoader->ParseAltitude();
+ m_altitudeParsed = true;
+}
+
StringUtf8Multilang const & FeatureType::GetNames() const
{
return m_params.name;
diff --git a/indexer/feature.hpp b/indexer/feature.hpp
index 1913cd3465..108857dba1 100644
--- a/indexer/feature.hpp
+++ b/indexer/feature.hpp
@@ -1,5 +1,6 @@
#pragma once
#include "indexer/cell_id.hpp"
+#include "indexer/feature_altitude.hpp"
#include "indexer/feature_data.hpp"
#include "geometry/point2d.hpp"
@@ -201,6 +202,7 @@ public:
uint32_t ParseTriangles(int scale) const;
void ParseMetadata() const;
+ void ParseAltitude() const;
//@}
/// @name Geometry.
@@ -243,6 +245,12 @@ public:
return m_points[i];
}
+ inline feature::Altitudes const & GetAltitudes() const
+ {
+ ASSERT(m_altitudeParsed, ());
+ return m_altitudes;
+ }
+
template <typename TFunctor>
void ForEachTriangle(TFunctor && f, int scale) const
{
@@ -361,10 +369,15 @@ private:
mutable points_t m_points, m_triangles;
mutable feature::Metadata m_metadata;
+ // @TODO |m_altitudes| should be exchanged with vector<TAltitude>.
+ // If the vector is empty no altitude information is available for this feature.
+ mutable feature::Altitudes m_altitudes;
+
mutable bool m_header2Parsed = false;
mutable bool m_pointsParsed = false;
mutable bool m_trianglesParsed = false;
mutable bool m_metadataParsed = false;
+ mutable bool m_altitudeParsed = false;
mutable inner_geom_stat_t m_innerStats;
diff --git a/indexer/feature_altitude.hpp b/indexer/feature_altitude.hpp
new file mode 100644
index 0000000000..54894f0047
--- /dev/null
+++ b/indexer/feature_altitude.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "coding/varint.hpp"
+
+#include "std/vector.hpp"
+
+namespace feature
+{
+using TAltitude = int16_t;
+using TAltitudeVec = vector<feature::TAltitude>;
+static TAltitude constexpr kInvalidAltitude = -32768;
+
+struct Altitudes
+{
+ Altitudes() = default;
+ Altitudes(TAltitude b, TAltitude e) : begin(b), end(e) {}
+
+ TAltitude begin = 0;
+ TAltitude end = 0;
+};
+
+class Altitude
+{
+public:
+ Altitude() = default;
+ Altitude(uint32_t featureId, Altitudes const & altitudes) : m_featureId(featureId), m_altitudes(altitudes) {}
+
+ template <class TSink>
+ void Serialize(TSink & sink) const
+ {
+ sink.Write(&m_featureId, sizeof(uint32_t));
+ sink.Write(&m_altitudes.begin, sizeof(TAltitude));
+ sink.Write(&m_altitudes.end, sizeof(TAltitude));
+ }
+
+ /// @TODO template <class TSource> void Deserialize(TSource & src) should be implement here.
+ /// But now for test purposes deserialization is done with DDVector construction.
+
+ uint32_t GetFeatureId() const { return m_featureId; }
+ Altitudes const & GetAltitudes() const { return m_altitudes; }
+
+private:
+ /// @TODO Note. Feature id is located here because there's no index for altitudes.
+ /// There's only pairs sorted by feature id. Before merging to master some index has to be implemented.
+ /// Don't forget to remove |m_featureId|.
+ uint32_t m_featureId = 0;
+ Altitudes m_altitudes;
+};
+} // namespace feature
diff --git a/indexer/feature_loader.cpp b/indexer/feature_loader.cpp
index 37093182e8..950f134959 100644
--- a/indexer/feature_loader.cpp
+++ b/indexer/feature_loader.cpp
@@ -292,6 +292,48 @@ void LoaderCurrent::ParseMetadata()
}
}
+void LoaderCurrent::ParseAltitude()
+{
+ // @TODO Index and should be used here before merging to master.
+
+ if (m_Info.GetMWMFormat() < version::Format::v8)
+ return;
+
+ struct TAltitudeIndexEntry
+ {
+ uint32_t featureId;
+ feature::TAltitude beginAlt;
+ feature::TAltitude endAlt;
+ };
+
+ try
+ {
+ DDVector<TAltitudeIndexEntry, FilesContainerR::TReader> idx(m_Info.GetAltitudeReader());
+ auto it = lower_bound(
+ idx.begin(), idx.end(),
+ TAltitudeIndexEntry{static_cast<uint32_t>(m_pF->m_id.m_index), 0, 0},
+ [](TAltitudeIndexEntry const & v1, TAltitudeIndexEntry const & v2)
+ {
+ return v1.featureId < v2.featureId;
+ });
+ if (it == idx.end())
+ return;
+
+ if (m_pF->m_id.m_index != it->featureId)
+ return;
+
+ if (it->beginAlt == kInvalidAltitude || it->endAlt == kInvalidAltitude)
+ return;
+
+ m_pF->m_altitudes.begin = it->beginAlt;
+ m_pF->m_altitudes.end = it->endAlt;
+ }
+ catch (Reader::OpenException const &)
+ {
+ // Now ignore exception because not all mwm have needed sections.
+ }
+}
+
int LoaderCurrent::GetScaleIndex(int scale) const
{
int const count = m_Info.GetScalesCount();
diff --git a/indexer/feature_loader.hpp b/indexer/feature_loader.hpp
index 693cb9a451..513ca984c3 100644
--- a/indexer/feature_loader.hpp
+++ b/indexer/feature_loader.hpp
@@ -21,13 +21,14 @@ namespace feature
public:
LoaderCurrent(SharedLoadInfo const & info) : BaseT(info) {}
- virtual uint8_t GetHeader();
-
- virtual void ParseTypes();
- virtual void ParseCommon();
- virtual void ParseHeader2();
- virtual uint32_t ParseGeometry(int scale);
- virtual uint32_t ParseTriangles(int scale);
- virtual void ParseMetadata();
+ /// LoaderBase overrides:
+ virtual uint8_t GetHeader() override;
+ void ParseTypes() override;
+ void ParseCommon() override;
+ void ParseHeader2() override;
+ uint32_t ParseGeometry(int scale) override;
+ uint32_t ParseTriangles(int scale) override;
+ void ParseMetadata() override;
+ void ParseAltitude() override;
};
}
diff --git a/indexer/feature_loader_base.cpp b/indexer/feature_loader_base.cpp
index 8aa9d8422e..349ea8055e 100644
--- a/indexer/feature_loader_base.cpp
+++ b/indexer/feature_loader_base.cpp
@@ -44,6 +44,11 @@ SharedLoadInfo::TReader SharedLoadInfo::GetMetadataIndexReader() const
return m_cont.GetReader(METADATA_INDEX_FILE_TAG);
}
+SharedLoadInfo::TReader SharedLoadInfo::GetAltitudeReader() const
+{
+ return m_cont.GetReader(ALTITUDE_TAG);
+}
+
SharedLoadInfo::TReader SharedLoadInfo::GetGeometryReader(int ind) const
{
return m_cont.GetReader(GetTagForIndex(GEOMETRY_FILE_TAG, ind));
diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp
index 46f68f1597..2a2b2ff617 100644
--- a/indexer/feature_loader_base.hpp
+++ b/indexer/feature_loader_base.hpp
@@ -32,6 +32,7 @@ namespace feature
TReader GetDataReader() const;
TReader GetMetadataReader() const;
TReader GetMetadataIndexReader() const;
+ TReader GetAltitudeReader() const;
TReader GetGeometryReader(int ind) const;
TReader GetTrianglesReader(int ind) const;
@@ -78,6 +79,7 @@ namespace feature
virtual uint32_t ParseGeometry(int scale) = 0;
virtual uint32_t ParseTriangles(int scale) = 0;
virtual void ParseMetadata() = 0;
+ virtual void ParseAltitude() = 0;
inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; }
diff --git a/indexer/indexer.pro b/indexer/indexer.pro
index 26a2499e36..6602f18ddf 100644
--- a/indexer/indexer.pro
+++ b/indexer/indexer.pro
@@ -81,6 +81,7 @@ HEADERS += \
edits_migration.hpp \
feature.hpp \
feature_algo.hpp \
+ feature_altitude.hpp \
feature_covering.hpp \
feature_data.hpp \
feature_decl.hpp \
diff --git a/indexer/old/feature_loader_101.hpp b/indexer/old/feature_loader_101.hpp
index a18c8913da..7c07657013 100644
--- a/indexer/old/feature_loader_101.hpp
+++ b/indexer/old/feature_loader_101.hpp
@@ -29,15 +29,15 @@ namespace old_101 { namespace feature
public:
LoaderImpl(::feature::SharedLoadInfo const & info) : BaseT(info) {}
- virtual uint8_t GetHeader();
-
- virtual void ParseTypes();
- virtual void ParseCommon();
- virtual void ParseHeader2();
- virtual uint32_t ParseGeometry(int scale);
- virtual uint32_t ParseTriangles(int scale);
- virtual void ParseMetadata() {} /// not supported in this version
-
+ /// LoaderBase overrides:
+ uint8_t GetHeader() override;
+ void ParseTypes() override;
+ void ParseCommon() override;
+ void ParseHeader2() override;
+ uint32_t ParseGeometry(int scale) override;
+ uint32_t ParseTriangles(int scale) override;
+ void ParseMetadata() override {} /// not supported in this version
+ void ParseAltitude() override {} /// not supported in this version
};
}
}