[generator:regions] Fix suburb marking: ignore administrative region with equal boundary to locality

This commit is contained in:
Anatoly Serdtcev 2019-08-12 11:40:17 +03:00 committed by LaGrunge
parent 390d80f81e
commit cc0954d9e7
2 changed files with 22 additions and 8 deletions

View file

@ -23,24 +23,36 @@ void AdminSuburbsMarker::MarkLocality(Node::Ptr & tree)
{
ASSERT(tree->GetData().GetLevel() == PlaceLevel::Locality, ());
for (auto & subtree : tree->GetChildren())
MarkSuburbsInLocality(subtree);
MarkSuburbsInLocality(subtree, tree->GetData());
}
void AdminSuburbsMarker::MarkSuburbsInLocality(Node::Ptr & tree)
void AdminSuburbsMarker::MarkSuburbsInLocality(Node::Ptr & tree, LevelRegion const & locality)
{
auto & region = tree->GetData();
auto const level = region.GetLevel();
if (level == PlaceLevel::Locality)
if (region.GetLevel() == PlaceLevel::Locality)
{
MarkLocality(tree);
return;
}
if (level == PlaceLevel::Unknown && region.GetAdminLevel() != AdminLevel::Unknown)
region.SetLevel(PlaceLevel::Suburb);
if (region.GetLevel() == PlaceLevel::Unknown && region.GetAdminLevel() != AdminLevel::Unknown)
{
if (region.GetName() != locality.GetName() ||
region.GetArea() < kLocalityAreaRatioMax * locality.GetArea())
{
region.SetLevel(PlaceLevel::Suburb);
}
}
if (region.GetLevel() >= PlaceLevel::Suburb)
{
for (auto & subtree : tree->GetChildren())
MarkUnderLocalityAsSublocalities(subtree);
return;
}
for (auto & subtree : tree->GetChildren())
MarkUnderLocalityAsSublocalities(subtree);
MarkSuburbsInLocality(subtree, locality);
}
void AdminSuburbsMarker::MarkUnderLocalityAsSublocalities(Node::Ptr & tree)

View file

@ -9,11 +9,13 @@ namespace regions
class AdminSuburbsMarker
{
public:
static constexpr double kLocalityAreaRatioMax = 0.8;
void MarkSuburbs(Node::Ptr & tree);
private:
void MarkLocality(Node::Ptr & tree);
void MarkSuburbsInLocality(Node::Ptr & tree);
void MarkSuburbsInLocality(Node::Ptr & tree, LevelRegion const & locality);
void MarkUnderLocalityAsSublocalities(Node::Ptr & tree);
};
} // namespace regions