From 79d9ac735ab5d710e4eba45cacb889a7657263ef Mon Sep 17 00:00:00 2001 From: Anatoly Serdtcev Date: Wed, 17 Apr 2019 13:30:17 +0300 Subject: [PATCH] [generator:geo_objects] Fix for review --- 3party/jansson/myjansson.hpp | 6 ++-- generator/geo_objects/geo_objects.cpp | 13 +++++-- generator/geo_objects/streets_builder.cpp | 42 +++++++++++++++-------- generator/geo_objects/streets_builder.hpp | 1 + 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/3party/jansson/myjansson.hpp b/3party/jansson/myjansson.hpp index a34daaf6e0..1963f4bb48 100644 --- a/3party/jansson/myjansson.hpp +++ b/3party/jansson/myjansson.hpp @@ -38,7 +38,7 @@ public: Json() = default; explicit Json(std::string_view const & s) { ParseFrom(s); } - explicit Json(JSONPtr const & json) : m_handle{json.get()} { } + explicit Json(JSONPtr && json) { m_handle.AttachNew(json.release()); } Json GetDeepCopy() const { @@ -61,10 +61,10 @@ private: JsonHandle m_handle; }; -json_t * GetJSONObligatoryField(json_t * root, char const * field); json_t * GetJSONObligatoryField(json_t * root, std::string const & field); -json_t * GetJSONOptionalField(json_t * root, char const * field); +json_t * GetJSONObligatoryField(json_t * root, char const * field); json_t * GetJSONOptionalField(json_t * root, std::string const & field); +json_t * GetJSONOptionalField(json_t * root, char const * field); bool JSONIsNull(json_t * root); } // namespace base diff --git a/generator/geo_objects/geo_objects.cpp b/generator/geo_objects/geo_objects.cpp index 162d104f6b..d380f98a88 100644 --- a/generator/geo_objects/geo_objects.cpp +++ b/generator/geo_objects/geo_objects.cpp @@ -207,6 +207,14 @@ void BuildGeoObjectsWithoutAddresses(GeoObjectInfoGetter const & geoObjectInfoGe feature::ForEachFromDatRawFormat(pathInGeoObjectsTmpMwm, fn); LOG(LINFO, ("Added ", countGeoObjects, "geo objects without addresses.")); } + +void BuildStreets(RegionInfoGetter const & regionInfoGetter, + std::string const & pathInGeoObjectsTmpMwm, + std::ostream & streamGeoObjectsKv, bool /* verbose */) +{ + StreetsBuilder streetsBuilder{regionInfoGetter}; + streetsBuilder.Build(pathInGeoObjectsTmpMwm, streamGeoObjectsKv); +} } // namespace bool GenerateGeoObjects(std::string const & pathInRegionsIndex, @@ -227,10 +235,9 @@ bool GenerateGeoObjects(std::string const & pathInRegionsIndex, RegionInfoGetter regionInfoGetter{pathInRegionsIndex, pathInRegionsKv}; LOG(LINFO, ("Size of regions key-value storage:", regionInfoGetter.GetStorage().Size())); - StreetsBuilder streetsBuilder{regionInfoGetter}; std::ofstream streamGeoObjectsKv(pathOutGeoObjectsKv); - streetsBuilder.Build(pathInGeoObjectsTmpMwm, streamGeoObjectsKv); - LOG(LINFO, ("Streets was built.")); + BuildStreets(regionInfoGetter, pathInGeoObjectsTmpMwm, streamGeoObjectsKv, verbose); + LOG(LINFO, ("Streets were built.")); BuildGeoObjectsWithAddresses(regionInfoGetter, pathInGeoObjectsTmpMwm, streamGeoObjectsKv, verbose); LOG(LINFO, ("Geo objects with addresses were built.")); diff --git a/generator/geo_objects/streets_builder.cpp b/generator/geo_objects/streets_builder.cpp index 10477a657d..db6de47a59 100644 --- a/generator/geo_objects/streets_builder.cpp +++ b/generator/geo_objects/streets_builder.cpp @@ -1,6 +1,7 @@ #include "generator/geo_objects/streets_builder.hpp" #include "indexer/classificator.hpp" +#include "indexer/ftypes_matcher.hpp" #include "base/logging.hpp" @@ -39,7 +40,11 @@ void StreetsBuilder::Build(std::string const & pathInGeoObjectsTmpMwm, std::ostr boost::optional StreetsBuilder::FindStreetRegionOwner(FeatureBuilder1 & fb) { + if (fb.IsPoint()) + return FindStreetRegionOwner(fb.GetKeyPoint()); + auto const & line = fb.GetOuterGeometry(); + CHECK_GREATER_OR_EQUAL(line.size(), 2, ()); auto const & startPoint = line.front(); auto const & owner = FindStreetRegionOwner(startPoint); if (!owner) @@ -103,37 +108,44 @@ std::unique_ptr StreetsBuilder::MakeStreetValue( // static bool StreetsBuilder::IsStreet(OsmElement const & element) { - if (!element.IsWay() && !element.IsRelation()) - return false; - auto const & tags = element.Tags(); - auto const isHighway = std::any_of(std::cbegin(tags), std::cend(tags), [] (auto const & tag) { - return tag.key == "highway"; - }); - if (!isHighway) - return false; - auto const hasName = std::any_of(std::cbegin(tags), std::cend(tags), [] (auto const & tag) { return tag.key == "name"; }); if (!hasName) return false; - return true; + auto const isHighway = std::any_of(std::cbegin(tags), std::cend(tags), [] (auto const & tag) { + return tag.key == "highway"; + }); + if (isHighway && (element.IsWay() || element.IsRelation())) + return true; + + auto const isSquare = std::any_of(std::cbegin(tags), std::cend(tags), [] (auto const & tag) { + return tag.key == "place" && tag.value == "square"; + }); + if (isSquare) + return true; + + return false; } // static bool StreetsBuilder::IsStreet(FeatureBuilder1 const & fb) { - if (!fb.IsLine() && !fb.IsArea()) + if (fb.GetName().empty()) return false; - static auto const highwayType = classif().GetTypeByPath({"highway"}); - if (fb.FindType(highwayType, 1) == ftype::GetEmptyValue()) - return false; + auto const & wayChecker = ftypes::IsWayChecker::Instance(); + if (wayChecker(fb.GetTypes()) && (fb.IsLine() || fb.IsArea())) + return true; - return !fb.GetName().empty(); + auto const & squareChecker = ftypes::IsSquareChecker::Instance(); + if (squareChecker(fb.GetTypes())) + return true; + + return false; } } // namespace geo_objects } // namespace generator diff --git a/generator/geo_objects/streets_builder.hpp b/generator/geo_objects/streets_builder.hpp index 5de7aadc4c..af8cdf8e48 100644 --- a/generator/geo_objects/streets_builder.hpp +++ b/generator/geo_objects/streets_builder.hpp @@ -9,6 +9,7 @@ #include "geometry/point2d.hpp" +#include #include #include #include