From 99d014ccaecd8fbba5ee265c39aa38fca8f1a4d0 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Thu, 14 Jan 2016 14:37:18 +0300 Subject: [PATCH] Get[Feature|Mercator]AddressInfo correctly fills types and name fields. --- map/address_finder.cpp | 18 ++++++++++++++---- map/framework.hpp | 3 ++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/map/address_finder.cpp b/map/address_finder.cpp index 59444e95f7..2272291787 100644 --- a/map/address_finder.cpp +++ b/map/address_finder.cpp @@ -479,11 +479,21 @@ search::AddressInfo Framework::GetFeatureAddressInfo(FeatureType const & ft) con //GetLocality(pt, info); info.m_house = ft.GetHouseNumber(); + // TODO(vng): Now geocoder assumes that buildings without house numbers also do not have a specified street. + if (!info.m_house.empty()) + { + search::ReverseGeocoder const coder(m_model.GetIndex()); + auto const streets = coder.GetNearbyFeatureStreets(ft); + if (streets.second < streets.first.size()) + info.m_street = streets.first[streets.second].m_name; + } + + // TODO(vng): Why AddressInfo is responsible for types and names? Refactor out. + string defaultName, intName; + ft.GetPreferredNames(defaultName, intName); + info.m_name = defaultName.empty() ? intName : defaultName; + info.m_types = GetPrintableFeatureTypes(ft); - search::ReverseGeocoder const coder(m_model.GetIndex()); - vector const streets = coder.GetNearbyFeatureStreets(ft); - if (!streets.empty()) - info.m_street = streets.front().m_name; return info; } diff --git a/map/framework.hpp b/map/framework.hpp index 6897ff7e3f..cfca9a699f 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -476,8 +476,9 @@ private: //void GetLocality(m2::PointD const & pt, search::AddressInfo & info) const; public: - /// Please use this method for debug purposes only. It always tries to find closest street. + /// @returns address of nearby building with house number in approx 1km distance. search::AddressInfo GetMercatorAddressInfo(m2::PointD const & mercator) const; + /// @returns valid street address only if it was specified in OSM for given feature; used in the editor. search::AddressInfo GetFeatureAddressInfo(FeatureType const & ft) const; vector GetPrintableFeatureTypes(FeatureType const & ft) const; /// If feature does not have explicit street in OSM data, first value can be a closest named street.