From 7a28fe8cc39880025c83a81cf88797aa5f174b0d Mon Sep 17 00:00:00 2001 From: tatiana-kondakova Date: Tue, 24 Apr 2018 18:16:41 +0300 Subject: [PATCH] [geocoder] Use delta coding for borders --- generator/feature_builder.cpp | 8 +++++++- indexer/borders.cpp | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 0aaf0bbe2b..55e6a52b40 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -419,11 +419,17 @@ void FeatureBuilder1::SerializeBorder(serial::GeometryCodingParams const & param CHECK_GREATER(m_polygons.size(), 0, ()); WriteToSink(sink, m_polygons.size() - 1); + + auto toU = [¶ms](m2::PointD const & p) { return PointDToPointU(p, params.GetCoordBits()); }; for (auto const & polygon : m_polygons) { WriteToSink(sink, polygon.size()); + auto last = params.GetBasePoint(); for (auto const & p : polygon) - serial::SavePoint(sink, p, params); + { + coding::EncodePointDelta(sink, toU(last), toU(p)); + last = p; + } } } diff --git a/indexer/borders.cpp b/indexer/borders.cpp index 0702ae728f..81946e145a 100644 --- a/indexer/borders.cpp +++ b/indexer/borders.cpp @@ -25,6 +25,16 @@ public: m_recordReader.ForEachRecord([&](uint32_t pos, char const * data, uint32_t /*size*/) { ArrayByteSource src(data); serial::GeometryCodingParams cp = {}; + + auto readPoly = [&cp, &src](vector & poly) { + m2::PointU base = PointDToPointU(cp.GetBasePoint(), cp.GetCoordBits()); + for (auto & point : poly) + { + base = coding::DecodePointDelta(src, base); + point = PointUToPointD(base, cp.GetCoordBits()); + } + }; + uint64_t id; ReadPrimitiveFromSource(src, id); size_t size; @@ -32,9 +42,7 @@ public: size_t outerSize; ReadPrimitiveFromSource(src, outerSize); vector outer(outerSize); - // todo:(@t.yan) consider delta coding techniques. - for (auto & point : outer) - point = serial::LoadPoint(src, cp); + readPoly(outer); vector> inners(size); for (auto & inner : inners) @@ -42,8 +50,7 @@ public: size_t innerSize; ReadPrimitiveFromSource(src, innerSize); inner = vector(innerSize); - for (auto & point : inner) - point = serial::LoadPoint(src, cp); + readPoly(inner); } toDo(id, outer, inners); });