diff --git a/generator/generator_tests/osm_type_test.cpp b/generator/generator_tests/osm_type_test.cpp index 2f62f86f5d..72c95a69e7 100644 --- a/generator/generator_tests/osm_type_test.cpp +++ b/generator/generator_tests/osm_type_test.cpp @@ -290,6 +290,31 @@ UNIT_CLASS_TEST(TestWithClassificator, OsmType_Address) TEST_EQUAL(params.GetStreet(), "Place Vendôme", ()); TEST_EQUAL(params.GetPostcode(), "75001", ()); } + + { + Tags const tags = { + {"addr:city", "München"}, + {"addr:country", "DE"}, + {"addr:housenumber", "27"}, + {"addr:postcode", "80339"}, + {"addr:street", "Ligsalzstraße"}, + {"clothes", "children"}, + {"disused:shop", "clothes"}, + {"name", "Westendprinz"}, + {"operator", "Meike Hannig"}, + }; + + auto const params = GetFeatureBuilderParams(tags); + TEST_EQUAL(params.m_types.size(), 1, (params)); + TEST(params.IsTypeExist(addrType), ()); + + TEST_EQUAL(params.house.Get(), "27", ()); + TEST_EQUAL(params.GetStreet(), "Ligsalzstraße", ()); + TEST_EQUAL(params.GetPostcode(), "80339", ()); + + TEST(params.name.IsEmpty(), ()); + TEST(!params.GetMetadata().Has(feature::Metadata::FMD_OPERATOR), ()); + } } UNIT_CLASS_TEST(TestWithClassificator, OsmType_PlaceState) diff --git a/generator/osm2type.cpp b/generator/osm2type.cpp index 72500ea5fb..97acb28833 100644 --- a/generator/osm2type.cpp +++ b/generator/osm2type.cpp @@ -938,10 +938,24 @@ void PostprocessElement(OsmElement * p, FeatureBuilderParams & params) if (!hasSuitableType) { + /// @todo Worth to add Address type for existing Entrance only when params.name is not empty. + /// When we will fix entrance only styles to correct draw house number. AddParam(CachedTypes::Address); - - if (!params.name.IsEmpty() || !params.ref.empty()) - LOG(LWARNING, ("Address with name or ref:", GetGeoObjectId(*p), params.name, params.ref)); + + // https://github.com/organicmaps/organicmaps/issues/5803 + std::string_view const disusedPrefix[] = {"disused:", "abandoned:", "was:"}; + for (auto const & tag : p->Tags()) + { + for (auto const & prefix : disusedPrefix) + { + if (strings::StartsWith(tag.m_key, prefix)) + { + params.ClearPOIAttribs(); + goto exit; + } + } + } + exit:; } } diff --git a/indexer/feature_data.cpp b/indexer/feature_data.cpp index 1fd3946a06..b3f78931fe 100644 --- a/indexer/feature_data.cpp +++ b/indexer/feature_data.cpp @@ -605,6 +605,12 @@ bool FeatureBuilderParams::RemoveInconsistentTypes() return ynTypes.RemoveInconsistent(m_types); } +void FeatureBuilderParams::ClearPOIAttribs() +{ + ClearName(); + m_metadata.ClearPOIAttribs(); +} + string DebugPrint(FeatureParams const & p) { string res = "Types: " + TypesToString(p.m_types) + "; "; diff --git a/indexer/feature_data.hpp b/indexer/feature_data.hpp index d18355bcbd..e33bb737cf 100644 --- a/indexer/feature_data.hpp +++ b/indexer/feature_data.hpp @@ -364,6 +364,8 @@ public: /// @return true If any inconsistency was found here. bool RemoveInconsistentTypes(); + void ClearPOIAttribs(); + friend std::string DebugPrint(FeatureBuilderParams const & p); private: diff --git a/indexer/feature_meta.cpp b/indexer/feature_meta.cpp index 5b2017cd25..cdd5c0e3f0 100644 --- a/indexer/feature_meta.cpp +++ b/indexer/feature_meta.cpp @@ -126,6 +126,26 @@ bool Metadata::TypeFromString(string_view k, Metadata::EType & outType) return true; } +void Metadata::ClearPOIAttribs() +{ + for (auto i = m_metadata.begin(); i != m_metadata.end();) + { + if (i->first != Metadata::FMD_ELE && + i->first != Metadata::FMD_POSTCODE && + i->first != Metadata::FMD_FLATS && + i->first != Metadata::FMD_HEIGHT && + i->first != Metadata::FMD_MIN_HEIGHT && + i->first != Metadata::FMD_BUILDING_LEVELS && + i->first != Metadata::FMD_TEST_ID && + i->first != Metadata::FMD_BUILDING_MIN_LEVEL) + { + i = m_metadata.erase(i); + } + else + ++i; + } +} + void RegionData::SetLanguages(vector const & codes) { string value; diff --git a/indexer/feature_meta.hpp b/indexer/feature_meta.hpp index 539f724938..32407ed637 100644 --- a/indexer/feature_meta.hpp +++ b/indexer/feature_meta.hpp @@ -171,6 +171,8 @@ public: static std::string ToWikiURL(std::string v); std::string GetWikiURL() const; static std::string ToWikimediaCommonsURL(std::string const & v); + + void ClearPOIAttribs(); }; class AddressData : public MetadataBase