[generator] Ignore edited status for nearby places during map generation

Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
This commit is contained in:
Yannik Bloscheck
2025-11-02 19:00:50 +01:00
committed by Yannik Bloscheck
parent 5c2e0b5b43
commit 2ae482de76
7 changed files with 27 additions and 20 deletions

View File

@@ -495,7 +495,7 @@ void BuildAddressTable(FilesContainerR & container, std::string const & addressD
if (!street.empty())
{
auto const streets = search::ReverseGeocoder::GetNearbyStreets(*contexts[threadIdx], center, kStreetRadiusM);
auto const streets = search::ReverseGeocoder::GetNearbyStreets(*contexts[threadIdx], center, kStreetRadiusM, true);
streetId = MatchObjectByName(street, streets, [](std::string_view name)
{ return search::GetStreetNameAsKey(name, false /* ignoreStreetSynonyms */); });
@@ -508,7 +508,7 @@ void BuildAddressTable(FilesContainerR & container, std::string const & addressD
if (!place.empty())
{
auto const places = search::ReverseGeocoder::GetNearbyPlaces(*contexts[threadIdx], center, kPlaceRadiusM);
auto const places = search::ReverseGeocoder::GetNearbyPlaces(*contexts[threadIdx], center, kPlaceRadiusM, true);
placeId = MatchObjectByName(place, places, [](std::string_view name) { return strings::MakeUniString(name); });
}

View File

@@ -29,8 +29,15 @@ MwmContext::MwmContext(MwmSet::MwmHandle handle, MwmType type) : MwmContext(std:
m_type = type;
}
std::unique_ptr<FeatureType> MwmContext::GetFeature(uint32_t index) const
std::unique_ptr<FeatureType> MwmContext::GetFeature(uint32_t index, bool ignoredEditedStatus) const
{
if (ignoredEditedStatus) {
auto ft = m_vector.GetByIndex(index);
CHECK(ft, ());
ft->SetID(FeatureID(GetId(), index));
return ft;
}
std::unique_ptr<FeatureType> ft;
switch (GetEditedStatus(index))
{

View File

@@ -85,7 +85,7 @@ public:
}
template <typename Fn>
void ForEachFeature(m2::RectD const & rect, Fn && fn) const
void ForEachFeature(m2::RectD const & rect, Fn && fn, bool ignoredEditedStatus = false) const
{
uint32_t const scale = m_value.GetHeader().GetLastScale();
covering::Intervals intervals;
@@ -93,14 +93,14 @@ public:
ForEachIndexImpl(intervals, scale, [&](uint32_t index)
{
auto ft = GetFeature(index);
auto ft = GetFeature(index, ignoredEditedStatus);
if (ft)
fn(*ft);
});
}
// Returns false if feature was deleted by user.
std::unique_ptr<FeatureType> GetFeature(uint32_t index) const;
std::unique_ptr<FeatureType> GetFeature(uint32_t index, bool ignoredEditedStatus = false) const;
[[nodiscard]] inline bool GetCenter(uint32_t index, m2::PointD & center) { return m_centers.Get(index, center); }

View File

@@ -77,7 +77,7 @@ ReverseGeocoder::ReverseGeocoder(DataSource const & dataSource) : m_dataSource(d
template <class ObjT, class FilterT>
vector<ObjT> GetNearbyObjects(search::MwmContext & context, m2::PointD const & center, double radiusM,
FilterT && filter)
FilterT && filter, bool ignoredEditedStatus = false)
{
vector<ObjT> objs;
@@ -90,17 +90,17 @@ vector<ObjT> GetNearbyObjects(search::MwmContext & context, m2::PointD const & c
if (!name.empty())
objs.emplace_back(ft.GetID(), feature::GetMinDistanceMeters(ft, center), name, ft.GetNames());
}
});
}, ignoredEditedStatus);
sort(objs.begin(), objs.end(), base::LessBy(&ObjT::m_distanceMeters));
return objs;
}
vector<ReverseGeocoder::Street> ReverseGeocoder::GetNearbyStreets(search::MwmContext & context,
m2::PointD const & center, double radiusM)
m2::PointD const & center, double radiusM, bool ignoredEditedStatus)
{
return GetNearbyObjects<Street>(context, center, radiusM,
[](FeatureType & ft) { return StreetVicinityLoader::IsStreet(ft); });
[](FeatureType & ft) { return StreetVicinityLoader::IsStreet(ft); }, ignoredEditedStatus);
}
vector<ReverseGeocoder::Street> ReverseGeocoder::GetNearbyStreets(MwmSet::MwmId const & id,
@@ -122,13 +122,13 @@ vector<ReverseGeocoder::Street> ReverseGeocoder::GetNearbyStreets(FeatureType &
}
std::vector<ReverseGeocoder::Place> ReverseGeocoder::GetNearbyPlaces(search::MwmContext & context,
m2::PointD const & center, double radiusM)
m2::PointD const & center, double radiusM, bool ignoredEditedStatus)
{
return GetNearbyObjects<Place>(context, center, radiusM, [](FeatureType & ft)
{
return (ftypes::IsLocalityChecker::Instance().GetType(ft) >= ftypes::LocalityType::City ||
ftypes::IsSuburbChecker::Instance()(ft));
});
}, ignoredEditedStatus);
}
string ReverseGeocoder::GetFeatureStreetName(FeatureType & ft) const

View File

@@ -114,11 +114,11 @@ public:
/// Parameter |includeSquaresAndSuburbs| needed for backward compatibility:
/// existing mwms operate on streets without squares and suburbs.
static std::vector<Street> GetNearbyStreets(search::MwmContext & context, m2::PointD const & center,
double radiusM = kLookupRadiusM);
double radiusM = kLookupRadiusM, bool ignoredEditedStatus = false);
std::vector<Street> GetNearbyStreets(MwmSet::MwmId const & id, m2::PointD const & center) const;
std::vector<Street> GetNearbyStreets(FeatureType & ft) const;
static std::vector<Place> GetNearbyPlaces(search::MwmContext & context, m2::PointD const & center, double radiusM);
static std::vector<Place> GetNearbyPlaces(search::MwmContext & context, m2::PointD const & center, double radiusM, bool ignoredEditedStatus = false);
/// @return feature street name.
/// Returns empty string when there is no street the feature belongs to.

View File

@@ -35,13 +35,13 @@ void StreetVicinityLoader::OnQueryFinished()
m_cache.ClearIfNeeded();
}
StreetVicinityLoader::Street const & StreetVicinityLoader::GetStreet(uint32_t featureId)
StreetVicinityLoader::Street const & StreetVicinityLoader::GetStreet(uint32_t featureId, bool ignoredEditedStatus)
{
auto r = m_cache.Get(featureId);
if (!r.second)
return r.first;
LoadStreet(featureId, r.first);
LoadStreet(featureId, r.first, ignoredEditedStatus);
return r.first;
}
@@ -54,9 +54,9 @@ bool StreetVicinityLoader::IsStreet(FeatureType & ft)
return ((isLineOrArea && ftypes::IsWayChecker::Instance()(ft)) || ftypes::IsSquareChecker::Instance()(ft));
}
void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street)
void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street, bool ignoredEditedStatus)
{
auto feature = m_context->GetFeature(featureId);
auto feature = m_context->GetFeature(featureId, ignoredEditedStatus);
if (!feature || !IsStreet(*feature))
return;

View File

@@ -73,10 +73,10 @@ public:
void OnQueryFinished();
Street const & GetStreet(uint32_t featureId);
Street const & GetStreet(uint32_t featureId, bool ignoredEditedStatus = false);
private:
void LoadStreet(uint32_t featureId, Street & street);
void LoadStreet(uint32_t featureId, Street & street, bool ignoredEditedStatus = false);
MwmContext * m_context;
int m_scale;