forked from organicmaps/organicmaps
[generator:regions] Fix suburb marking: ignore administrative region with equal boundary to locality
This commit is contained in:
parent
390d80f81e
commit
cc0954d9e7
2 changed files with 22 additions and 8 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue