From 7274c8b24d4e0b7a021824c4f442b7eb96300ffd Mon Sep 17 00:00:00 2001 From: LaGrunge Date: Wed, 7 Aug 2019 17:40:55 +0300 Subject: [PATCH] [generator] nullbuilding fix --- .../generator_tests/geo_objects_tests.cpp | 32 +++++++++++++++---- generator/geo_objects/geo_objects.cpp | 30 ++++++++++------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/generator/generator_tests/geo_objects_tests.cpp b/generator/generator_tests/geo_objects_tests.cpp index d221bea9f6..f05fdfd272 100644 --- a/generator/generator_tests/geo_objects_tests.cpp +++ b/generator/generator_tests/geo_objects_tests.cpp @@ -107,7 +107,8 @@ GeoObjectsGenerator TearUp(std::vector const & osmElements, 1 /* threadsCount */}; } -void TestFindReverse(std::vector const & osmElements) +void TestFindReverse(std::vector const & osmElements, + std::vector const & where) { classificator::Load(); ScopedFile const geoObjectsFeatures{"geo_objects_features.mwm", ScopedFile::Mode::DoNotCreate}; @@ -126,9 +127,10 @@ void TestFindReverse(std::vector const & osmElements) TEST(geoObjectsIndex.has_value(), ("Temporary index build failed")); - TEST(CheckWeGotExpectedIdsByPoint({1.5, 1.5}, expectedIds, *geoObjectsIndex), ()); - TEST(CheckWeGotExpectedIdsByPoint({2, 2}, expectedIds, *geoObjectsIndex), ()); - TEST(CheckWeGotExpectedIdsByPoint({4, 4}, expectedIds, *geoObjectsIndex), ()); + for (auto const & point : where) + { + TEST(CheckWeGotExpectedIdsByPoint(point, expectedIds, *geoObjectsIndex), ()); + } } UNIT_TEST(GenerateGeoObjects_AddNullBuildingGeometryForPointsWithAddressesInside) @@ -150,7 +152,8 @@ UNIT_TEST(GenerateGeoObjects_AddNullBuildingGeometryForPointsWithAddressesInside {{1.6, 1.6}}, {}} }; - TestFindReverse(osmElements); + + TestFindReverse(osmElements, {{1.5, 1.5}, {2, 2}, {4, 4}}); } UNIT_TEST(GenerateGeoObjects_AddNullBuildingGeometryForPointsWithAddressesInside2) @@ -174,7 +177,24 @@ UNIT_TEST(GenerateGeoObjects_AddNullBuildingGeometryForPointsWithAddressesInside {}}, }; - TestFindReverse(osmElements); + TestFindReverse(osmElements, {{1.5, 1.5}, {2, 2}, {4, 4}}); +} + +UNIT_TEST(GenerateGeoObjects_AddNullBuildingPointToPoint) +{ + std::vector const osmElements{ + {1, + {{"addr:housenumber", "39 с79"}, + {"addr:street", "Ленинградский проспект"}, + {"building", "yes"}}, + {{1.5, 1.5}}, + {}}, + {3, + {{"building", "commercial"}, {"type", "multipolygon"}, {"name", "superbuilding"}}, + {{1.5, 1.5}}, + {}}, + }; + TestFindReverse(osmElements, {}); } void TestPoiHasAddress(std::vector const & osmElements) diff --git a/generator/geo_objects/geo_objects.cpp b/generator/geo_objects/geo_objects.cpp index 9057bb600d..0c73c8bcc5 100644 --- a/generator/geo_objects/geo_objects.cpp +++ b/generator/geo_objects/geo_objects.cpp @@ -188,20 +188,28 @@ size_t AddBuildingGeometriesToAddressPoints(std::string const & pathInGeoObjects auto point2BuildingIt = buildingsInfo.m_addressPoints2Buildings.find(id); if (point2BuildingIt != buildingsInfo.m_addressPoints2Buildings.end()) { - auto const & geometry = geometries.at(point2BuildingIt->second); + auto geometryIt = geometries.find(point2BuildingIt->second); + if (geometryIt != geometries.end()) + { + auto const & geometry = geometryIt->second; - // ResetGeometry does not reset center but SetCenter changes geometry type to Point and - // adds center to bounding rect - fb.SetCenter({}); - // ResetGeometry clears bounding rect - fb.ResetGeometry(); - fb.GetParams().SetGeomType(feature::GeomType::Area); + // ResetGeometry does not reset center but SetCenter changes geometry type to Point and + // adds center to bounding rect + fb.SetCenter({}); + // ResetGeometry clears bounding rect + fb.ResetGeometry(); + fb.GetParams().SetGeomType(feature::GeomType::Area); - for (std::vector poly : geometry) - fb.AddPolygon(poly); + for (std::vector poly : geometry) + fb.AddPolygon(poly); - fb.PreSerialize(); - ++pointsEnriched; + fb.PreSerialize(); + ++pointsEnriched; + } + else + { + LOG(LINFO, (point2BuildingIt->second, "is a null building with strange geometry")); + } } std::lock_guard lock(collectorMutex); collector.Collect(fb);