[generator:regions] Mark suburbs in localities by admin_level-tags

This commit is contained in:
Anatoly Serdtcev 2019-07-08 18:35:04 +03:00
parent e494136fda
commit 13ec826902
5 changed files with 94 additions and 7 deletions

View file

@ -145,6 +145,8 @@ set(
ratings_section_builder.hpp
region_meta.cpp
region_meta.hpp
regions/admin_suburbs_marker.cpp
regions/admin_suburbs_marker.hpp
regions/collector_region_info.cpp
regions/collector_region_info.hpp
regions/country_specifier.cpp

View file

@ -528,11 +528,9 @@ UNIT_TEST(RegionsBuilderTest_GenerateRusCitySuburb)
TEST(HasName(regions, u8"Россия, region: Омская область, subregion: городской округ Омск, "
u8"locality: Омск"),
());
/* FIXME:
TEST(HasName(regions, u8"Россия, region: Омская область, subregion: городской округ Омск, "
u8"locality: Омск, suburb: Кировский административный округ"),
());
*/
}
UNIT_TEST(RegionsBuilderTest_GenerateRusMoscowSuburb)
@ -560,14 +558,12 @@ UNIT_TEST(RegionsBuilderTest_GenerateRusMoscowSuburb)
u8"Россия, region: Москва, subregion: Западный административный округ, "
u8"locality: Москва"),
());
/* FIXME:
TEST(HasName(regions, u8"Россия, region: Москва, subregion: Западный административный округ, "
u8"locality: Москва, suburb: Раменки"),
());
TEST(HasName(regions, u8"Россия, region: Москва, subregion: Западный административный округ, "
u8"locality: Москва, suburb: Раменки, sublocality: Воробъёвы горы"),
());
*/
TEST(HasName(regions,
u8"Россия, region: Москва, subregion: Западный административный округ, "
u8"locality: Москва, sublocality: Центр"),
@ -592,12 +588,10 @@ UNIT_TEST(RegionsBuilderTest_GenerateRusSPetersburgSuburb)
});
TEST(HasName(regions, u8"Россия, region: Санкт-Петербург, locality: Санкт-Петербург"), ());
/* FIXME:
TEST(HasName(regions, u8"Россия, region: Санкт-Петербург, locality: Санкт-Петербург, "
u8"suburb: Центральный район"),
());
TEST(HasName(regions, u8"Россия, region: Санкт-Петербург, locality: Санкт-Петербург, "
u8"suburb: Центральный район, sublocality: Дворцовый округ"),
());
*/
}

View file

@ -0,0 +1,64 @@
#include "generator/regions/admin_suburbs_marker.hpp"
#include "generator/regions/region.hpp"
namespace generator
{
namespace regions
{
void AdminSuburbsMarker::MarkSuburbs(Node::Ptr & tree)
{
auto const & region = tree->GetData();
if (region.GetLevel() == PlaceLevel::Locality)
{
MarkLocality(tree);
return;
}
for (auto & subtree : tree->GetChildren())
MarkSuburbs(subtree);
}
void AdminSuburbsMarker::MarkLocality(Node::Ptr & tree)
{
ASSERT_EQUAL(tree->GetData().GetLevel(), PlaceLevel::Locality, ());
for (auto & subtree : tree->GetChildren())
MarkSuburbsInLocality(subtree);
}
void AdminSuburbsMarker::MarkSuburbsInLocality(Node::Ptr & tree)
{
auto & region = tree->GetData();
if (region.GetLevel() == PlaceLevel::Locality)
{
MarkLocality(tree);
return;
}
if (region.GetAdminLevel() != AdminLevel::Unknown)
region.SetLevel(PlaceLevel::Suburb);
for (auto & subtree : tree->GetChildren())
MarkUnderLocalityAsSublocalities(subtree);
}
void AdminSuburbsMarker::MarkUnderLocalityAsSublocalities(Node::Ptr & tree)
{
auto & region = tree->GetData();
auto const level = region.GetLevel();
if (level == PlaceLevel::Locality)
{
MarkLocality(tree);
return;
}
if (level == PlaceLevel::Suburb)
region.SetLevel(PlaceLevel::Sublocality);
else if (level == PlaceLevel::Unknown && region.GetAdminLevel() != AdminLevel::Unknown)
region.SetLevel(PlaceLevel::Sublocality);
for (auto & subtree : tree->GetChildren())
MarkUnderLocalityAsSublocalities(subtree);
}
} // namespace regions
} // namespace generator

View file

@ -0,0 +1,20 @@
#pragma once
#include "generator/regions/node.hpp"
namespace generator
{
namespace regions
{
class AdminSuburbsMarker
{
public:
void MarkSuburbs(Node::Ptr & tree);
private:
void MarkLocality(Node::Ptr & tree);
void MarkSuburbsInLocality(Node::Ptr & tree);
void MarkUnderLocalityAsSublocalities(Node::Ptr & tree);
};
} // namespace regions
} // namespace generator

View file

@ -1,5 +1,6 @@
#include "generator/regions/regions_builder.hpp"
#include "generator/regions/admin_suburbs_marker.hpp"
#include "generator/regions/place_points_integrator.hpp"
#include "generator/regions/specs/rus.hpp"
@ -302,7 +303,13 @@ Node::PtrList RegionsBuilder::BuildCountry(std::string const & countryName) cons
LOG(LINFO, ("Start integrate place points for", countryName));
pointsIntegrator.ApplyTo(countryTrees);
LOG(LINFO, ("Finish integrate place points for", countryName));
AdminSuburbsMarker suburbsMarker;
LOG(LINFO, ("Start mark admin suburbs for", countryName));
for (auto & tree : countryTrees)
suburbsMarker.MarkSuburbs(tree);
LOG(LINFO, ("Finish mark admin suburbs for", countryName));
countrySpecifier->AdjustRegionsLevel(countryTrees);
return countryTrees;