diff --git a/android/app/src/main/res/values-iw/strings.xml b/android/app/src/main/res/values-iw/strings.xml
index f9a5609243..7aac91b036 100644
--- a/android/app/src/main/res/values-iw/strings.xml
+++ b/android/app/src/main/res/values-iw/strings.xml
@@ -839,7 +839,7 @@
שדה תעופה
שדה תעופה בינלאומי
חניית מטוסים
- שער עליה למטוס
+ שער
מנחת מסוקים
מסלול המראה
מסלול הסעה
@@ -1321,7 +1321,7 @@
גשר
מסלול
- מסלול ללא גישה
+ מסלול
מִנהָרָה
רמזור
@@ -1393,7 +1393,7 @@
אנדרטה
עמוד הקלון
חורבות עתיקות
- ספינה
+ אונייה
טנק היסטורי
קֶבֶר
צלב בצד הדרך
@@ -1414,22 +1414,15 @@
אינטרנט
אינטרנט אלחוטי
צומת
- כיכר
- כיכר
- שימושי קרקע
- חלקות חקלאיות
+ מעגל תנועה
+ מעגל תנועה
אגן מים
- קרקע מזוהמת
בית קברות
בית קברות נוצרי
- חצר כנסיה
אזור מסחרי
אתר בניה
- קריית חינוך
- אדמה חקלאית
- חצר חקלאית
שדה
ערוגת פרחים
יער
diff --git a/data/categories.txt b/data/categories.txt
index 60f7092427..ad6583aa62 100644
--- a/data/categories.txt
+++ b/data/categories.txt
@@ -78,6 +78,7 @@ ru:Где поесть|Поесть|Еда|кушать|покушать
be:Дзе паесці|паесці|ежа
bg:Места за хапване|ядене|храна
ar:طعام|أمكان لتناول الطعام
+ca:On menjar|Menjar
cs:Kde se najíst|Jídlo
da:Spisesteder|Mad
nl:Waar iets gaan eten|Eten
@@ -161,6 +162,7 @@ ru:5Транспорт
be:5Транспарт
bg:5Транспорт
ar:مواصلات|مواصلات
+ca:Transport
cs:Doprava
da:5Transport
nl:5Transport
@@ -193,7 +195,6 @@ el:Συγκοινωνία
he:תחבורה
sk:Doprava
fa:حمل و مواصلات
-ca:Transport
# First keyword should match [category_fuel] definition in strings.txt!
@category_fuel
@@ -202,6 +203,7 @@ ru:3бензин|3дизель|4топливо|газ
be:3бензін|3дызель|4паліва|газ
bg:Гориво|Бензиностанция
ar:1وقود|بنزين|سولار|ديزل|وقود الحافلات
+ca:Benzinera
cs:2Čerpací stanice|Benzinová pumpa|benzinka
da:Brændstof|Benzin
nl:3Benzine
@@ -235,7 +237,7 @@ he:גז
sk:3Čerpacia stanica
sw:Sheli
fa:سوخت|بنزین|دیزل|گازوئیل
-ca:Benzinera
+
# First keyword should match [category_parking] definition in strings.txt!
@category_parking
@@ -244,6 +246,7 @@ ru:4Парковка
be:4Паркоўка
bg:4Паркинг
ar:موقف سيارات|مرافق ركن السيارات
+ca:Aparcament
cs:4Parkoviště
da:4Parkering
nl:4Parkeerplaats
@@ -276,7 +279,7 @@ el:Χώρος στάθμευσης
he:חניה
sk:4Parkovisko
fa:پارکینگ
-ca:Aparcament
+
# First keyword should match [category_shopping] definition in strings.txt!
@category_shopping
@@ -285,6 +288,7 @@ ru:3Шоппинг|4Покупки
ar:تسوق
be:3Шопінг|4Закупы
bg:3Шопинг
+ca:Compres
cs:Nákupy
da:Indkøb
de:4Shopping
@@ -318,7 +322,7 @@ uk:3Шопінг
vi:Đi mua sắm
zh-Hans:购物
zh-Hant:購物
-ca:Compres
+
# First keyword should match [category_hotel] definition in strings.txt!
@category_hotel
@@ -327,6 +331,7 @@ ru:4Гостиница|отель|отели
be:4Гатэль|гатэлі
bg:Хотел|хотели
ar:فندق|الفنادق
+ca:Hotel|Hotels
cs:Hotel|Hotely
da:Hotel|Hoteller
nl:Hotel|Hotels
@@ -359,7 +364,7 @@ el:4Ξενοδοχείο|Διαμονή|Ξενοδοχεία
he:מלון|בתי
sk:Hotel|Hotely
fa:هتل|هتل ها
-ca:Hotel|Hotels
+
# First keyword should match [category_tourism] definition in strings.txt!
@category_tourism
@@ -368,6 +373,7 @@ ru:4Достопримечательности|3Туризм
be:4Славутасці|4турызм
bg:5Забележителности|4Туризъм
ar:سياحة
+ca:Turisme
cs:Pamětihodnost
da:5Seværdigheder|4Turisme|3sightseeing
nl:5Bezienswaardigheden|4Toerisme
@@ -400,7 +406,7 @@ el:4Αξιοθέατα
he:נקודות עיניין
sk:Pamätihodnosť
fa:منظره|گردشگری
-ca:Turisme
+
# First keyword should match [category_entertainment] definition in strings.txt!
@category_entertainment
@@ -409,6 +415,7 @@ ru:Развлечения
be:Забавы
bg:Развлечение
ar:ترفيه وتسلية|تسلية
+ca:Entreteniment
cs:Zábava
da:Underholdning
nl:Uitgaan
@@ -441,7 +448,7 @@ el:Ψυχαγωγία
he:בידור
sk:Zábava
fa:سرگرمی
-ca:Entreteniment
+
# First keyword should match [category_nightlife] definition in strings.txt!
@category_nightlife
@@ -450,6 +457,7 @@ ru:Ночная жизнь|С друзьями|Вечер с друзьями|п
be:Начное жыццё|патусіць
bg:Нощен живот|С приятели
ar:أنشطة ترفيه ليلية
+ca:Vida nocturna
cs:Noční život
da:Natteliv
nl:Nachtleven
@@ -482,7 +490,7 @@ el:Νυχτερινή Ζωή
sk:Nočný život
sw:Shughuli za usiku
fa:تفریحات شبانه
-ca:Vida nocturna
+
# First keyword should match [category_children] definition in strings.txt!
@category_children
@@ -491,6 +499,7 @@ ru:Отдых с детьми
be:Сямейны адпачынак
bg:Семейна почивка
ar:عطلة عائلية
+ca:Vacances familiars
cs:Dovolená s dětmi
da:Familieferie
nl:Gezinsvakantie
@@ -523,7 +532,7 @@ el:Οικογενειακές Διακοπές
sk:Rodinná dovolenka
sw:Mapumziko ya familia
fa:تعطیلات خانوادگی
-ca:Vacances familiars
+
# First keyword should match [category_atm] definition in strings.txt!
@category_atm
@@ -532,6 +541,7 @@ ru:3Банкомат
be:3Банкамат
bg:3Банкомат
ar:ماكينة صرافة آلية|صراف|صراف آلي|صراف آلي
+ca:Caixer automàtic
cs:3Bankomat
da:3Hæveautomat
nl:3Geldautomaat
@@ -565,7 +575,7 @@ he:כספומט
sk:3Bankomat
sw:Benki|fedha
fa:خود پرداز
-ca:Caixer automàtic
+
# First keyword should match [category_rv] definition in strings.txt!
@category_rv
@@ -573,7 +583,7 @@ en:2RV Facilities|4Caravan|Vanlife|5Campervan|5Motorhome
ar:منشآت للمنازل المتنقلة
be:Для аўтадамоў|5Аўтадом|5Трэйлер|5Караван|Дом на колах
bg:За RV
-ca:Caravanes
+ca:Caravanes|Autocaravana
cs:Pro RV
da:Til RV
de:Einrichtungen für Wohnmobile|4Wohnmobile
@@ -606,13 +616,13 @@ uk:Для автобудинків|5Автодім|5Автобудинок|5Тр
vi:Đối với RV
zh-Hans:房车设施
zh-Hant:露營車設施
-ca:Autocaravana
amenity-atm|@category_atm
en:money|U+1F3E7|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7
ru:деньги
bg:пари
ar:ماكينة صراف آلي|الأموال|فلوس|صرافة آلية|نقود
+ca:diners
cs:spořitelna|peníze
da:penge
nl:geld
@@ -643,7 +653,7 @@ zh-Hant:1atm|理財|錢|金錢
el:χρήματα
sk:sporiteľna|peniaze
fa:دستگاه خودپرداز
-ca:diners
+
# First keyword should match [category_bank] definition in strings.txt!
@category_bank
@@ -652,6 +662,7 @@ ru:3Банк
be:3Банк
bg:3Банка
ar:بنك
+ca:Banc
cs:3Banka
da:3Bank
nl:3Bank
@@ -684,7 +695,7 @@ he:בנק
sk:3Banka
sw:Benki|fedha
fa:بانک
-ca:Banc
+
# First keyword should match [category_secondhand] definition in strings.txt!
@category_secondhand
@@ -732,6 +743,7 @@ en:money|U+1F3E6|U+1F4B0|U+1F4B2|U+1F4B3|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7
ru:деньги
bg:пари
ar:بنك|الأموال|فلوس|نقود|مال
+ca:diners
cs:peníze
da:3penge
nl:geld
@@ -761,7 +773,7 @@ zh-Hant:錢
el:χρήματα
sk:peniaze
fa:بانک
-ca:diners
+
# First keyword should match [category_recycling] definition in strings.txt!
@category_recycling
@@ -770,6 +782,7 @@ ru:Переработка|5Переработка отходов|Утилиза
be:Перапрацоўка|5Перапрацоўка адходаў|Утылізацыя адходаў|5Прыём другаснай сыравіны|5Здаць другсыравіну|Паасобны збор смецця|Сартаванне смецця|Паўторнае выкарыстанне|Утыль
bg:Рециклиране|Преизползване|Разделно събиране|Сепаратор
ar:إعادة تدوير|استغلال المخلفات|المواد القابلة لإعادة التدوير|جمع القمامة بشكل منفصل|فرز النفايات|إعادة الاستخدام
+ca:Reciclatge|Reciclatge de residus|Eliminació de residus|Materials reciclables|Recollida selectiva d’escombraries|Classificació de residus|Reutilització
cs:Recyklace|Využití odpadu|Recyklovatelné|Oddělený sběr odpadků|Třídění odpadu|Opětovné použití
da:Genbrug|Affaldsudnyttelse|Genanvendelig|Separate dagrenovationer|Affaldssortering
nl:Recycling|Afvalgebruik|Recyclebaar materiaal|Gescheiden afvalinzameling|Afval sorteren|Hergebruik
@@ -801,13 +814,14 @@ sk:Recyklácia|Využitie odpadu|Recyklovateľné|Separovaný zber odpadu|Trieden
zh-Hans:回收|废物利用|可回收物|垃圾分类收集|垃圾分类|再利用
zh-Hant:回收|廢物利用|可回收物|垃圾分類收集|垃圾分類|再利用
fa:بازیافت|مدیریت پسماند|مواد بازیافتنی|جمعآوری جداگانۀ زبالهها |تفکیک پسماند|بازمصرف
-ca:Reciclatge|Reciclatge de residus|Eliminació de residus|Materials reciclables|Recollida selectiva d’escombraries|Classificació de residus|Reutilització
+
amenity-bureau_de_change
en:3Currency Exchange|3exchange|money|U+1F4B1|U+1F4B2|U+1F4B4|U+1F4B5|U+1F4B6|U+1F4B7
ru:3Обмен валюты|обмен валют|обменник|4валюта|деньги
bg:Чейндж бюро|пари|обмяна|валути
ar:تحويل عملات|تغيير عملات|الصرف|الأموال|صرف عملات|صرف
+ca:Canvi de divises|diners
cs:3Směnárna|peníze
da:3Vekselbureau|3penge
nl:3Wisselkantoor|3geld wisselen|wisselen|geld
@@ -838,13 +852,14 @@ zh-Hant:1匯率|理財|外幣|兌換|貨幣|換錢
el:Συνάλλαγμα|ανταλλακτήριο|χρήματα
sk:3Zmenáreň|peniaze
fa:صرافی
-ca:Canvi de divises|diners
+
amenity-bar|amenity-pub|@category_eat|@category_nightlife
en:2Bar|2pub|beer|drink|U+1F37A|U+1F37B|U+1F376|tavern|bars and pubs|brew pub|cocktail lounge
ru:2Бар|2паб|пиво|выпить|пивной ресторан|пивбар|крафт|коктейль бар|пивная|коктейли|алкоголь|алкогольные напитки
bg:2Бар|кръчма|бира|питие|напитка|таверна|коктейл|пиво|алкохол
ar:بار|حانة|خمارة|بيرة|شراب
+ca:Bar
cs:2Bar|hospoda|pivo|pití|tekutiny
da:2Bar|værtshus|kro|øl|pub|drink
nl:2Bar|2pub|kroeg|bier|drinken
@@ -877,13 +892,14 @@ el:Μπαρ|Παμπ|μπύρα|ποτό|φαγητό
sk:2Bar|pohostinstvo|pivo|pitie|tekutiny
sw:Baa|vinywaji
fa:میکده|کاباره
-ca:Bar
+
amenity-cafe|@category_eat
en:3Cafe|3restaurant|U+2615|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B|U+1F375|coffee|cafeteria
ru:3Кафе|3ресторан|кофейня|кофе
bg:3Кафе|3ресторант|кафене
ar:مقهى|مطعم|طعام|قهوة|كافتيريا
+ca:Cafè|Cafeteria
cs:3Kavárna|restaurace|hospoda
da:3Café|restaurant
nl:3Tearoom|3brasserie|3café|3restaurant
@@ -916,13 +932,14 @@ el:Καφετέρια|εστιατόριο|φαγητό
sk:3Kaviareň|reštaurácia|pohostinstvo
sw:Mgahawa|hoteli|chakula
fa:کافه|قهوه فروشی|قهوه خانه
-ca:Cafè|Cafeteria
+
amenity-fast_food|@category_eat
en:4Fast Food|3restaurant|3cafe|takeaway|U+1F354|U+1F355|U+1F35F|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|food to go|junk food
ru:3Фастфуд|3ресторан|3кафе|закусочная|быстрое питание|снеки|перекусить|экспресс-питание
bg:Бързо хранене|Фастфууд|кафе|храна|за вкъщи|ресторант|закусвалня
ar:وجبات سريعة|مطعم|مقهى|وجبة جاهزة|طعام
+ca:Menjar ràpid
cs:2Rychlé občerstvení|4fastfood|kavárna|restaurace
da:4Fastfood|restaurant|café|takeaway
nl:4Fast food|3frituur|fritkot|3restaurant|afhaaleten
@@ -954,13 +971,14 @@ zh-Hant:1速食店|麥當勞|肯德雞|漢堡王|頂呱呱|薯條|速食|用餐|
el:Ταχυφαγίο|καφετέρια|φαγητό για το σπίτι|φαγητό
sk:2Rýchle občerstvenie|4fastfood|3kaviareň|reštaurácia
fa:فست فود|غذای حاضری
-ca:Menjar ràpid
+
amenity-restaurant|@category_eat
en:3Restaurant|3cafe|U+1F356|U+1F357|U+1F35A|U+1F35B|U+1F35C|U+1F35D|U+1F363|U+1F366|U+1F367|U+1F368|U+1F369|U+1F370|U+1F372|U+1F374|U+1F377|U+1F60B
ru:3Ресторан|3кафе
bg:3ресторант|3кафе
ar:2مطعم|مقهى|طعام
+ca:Restaurant
cs:3Restaurace|hospoda|kavárna
da:3Restaurant|café
nl:3Restaurant|3café
@@ -993,7 +1011,7 @@ el:Εστιατόριο|καφετέρια|φαγητό
sk:3Reštaurácia|pohostinstvo|kaviareň
sw:Hoteli|restorenti|mgahawa|chakula
fa:رستوران
-ca:Restaurant
+
amenity-fuel|@category_fuel
en:Gas Station|Petrol Station|3Filling Station|U+26FD
@@ -1080,6 +1098,7 @@ ru:3Булочная|3пекарня|Торт|3Торты|Пирожные
be:3Булачная|3Пякарня|Торт|3Тарты
bg:3Пекарна
ar:مخبز|متجر
+ca:Fleca
cs:3Pekárna|Pekařství
da:3Bager|bageri
nl:3Bakkerij|Bakker|Gebak|Taart|3Taarten
@@ -1126,6 +1145,7 @@ ru:4Косметика
be:4Касметыка
bg:4Козметика
ar:مستحضرات تجميل|تجميل
+ca:Cosmetics
cs:4Kosmetika
da:4Kosmetik
fi:4Kosmetiikka|kauneudenhoito
@@ -1238,6 +1258,7 @@ zh-Hant:熟食店
shop-farm|@category_food|@shop
en:Farm food
+ca:Granja|Agrobotiga
de:4Hofladen|4Bauernhofladen
et:Talutoit
fr:4Produits fermiers|ferme
@@ -1654,6 +1675,7 @@ ru:3Хозяйственный|Строительный|Стройтовары|
ar:متجر عدد وأدوات|أدوات|عدة|متجر
be:Гаспадарчы|Будаўнічы
bg:НСС|строителни материали
+ca:Ferreteria
cs:Železářství
da:Isenkræmmer|Byggemarked
fi:Rautakauppa|Työkalukauppa
@@ -1733,6 +1755,7 @@ en-US:4Jewelry
ru:4Ювелирный|бижутерия
bg:4Бижутерия|скъпоценни камъни
ar:مجوهرات
+ca:Joieria
cs:Klenotnictví
da:Smykkebutik|smykker|4juveler
fi:Korukauppa
@@ -2269,6 +2292,7 @@ en:3Marketplace|market
ru:3Рынок|базар
bg:3Пазар
ar:سوق|السوق|متجر
+ca:Mercat
cs:4Tržiště|samoobsluha|market
da:3Markedsplads|marked
nl:3Markt
@@ -2344,6 +2368,7 @@ en:3Clothes|U+1F45A|U+1F457|U+1F456|U+1F455|clothing|wear
ru:3Одежда|одежды
bg:3Дрехи|магазин за дрехи
ar:متجر ملابس|ملابس|متجر
+ca:Botiga de roba|Roba
cs:Oblečení
da:Tøjbutik|tøjforretning|tøj
nl:Kledingwinkel|4kleding
@@ -2380,6 +2405,7 @@ fa:لباس فروشی|بوتیک
shop-caravan|@category_rv|@shop
en:2RV dealership|4Caravan dealership|Motorhome dealership
be:Аўтадом|Продаж аўтадамоў
+ca:Venda de caravanas|Venda de autocaravanas|Venda de motorhomes
de:5Wohnmobilhändler|5Wohnwagenhändler
es:Venta de caravanas|Venta de autocaravanas|Venta de motorhomes
et:Haagiselamute müük
@@ -2397,6 +2423,7 @@ be:4Аўтасалон|Машыны
ru:4Автосалон|Машины
bg:Майстор|автомонтьор|автосалон
ar:متجر سيارات|متجر
+ca:Venda de cotxes|Concesionari
cs:Obchod s auty
da:Bilforhandler
nl:Autohandelaar
@@ -2436,6 +2463,7 @@ ru:4Веломагазин|велосипеды
ar:متجر دراجات|متجر
be:Веламагазін|Веласіпеды
bg:4Веломагазин|велосипед|колело
+ca:Botiga de bicicletes|4bicicleta|bici
cs:3Cyklistický obchod|jízdní kolo|3kolo
da:3Cykelforretning|cykelhandler|cykler
fi:3Polkupyöräliike
@@ -2475,6 +2503,7 @@ ru:3Киоск
ar:كشك|متجر
be:Кіеск|Шапік
bg:3Киоск
+ca:Quiosc
cs:3Kiosk
da:3Kiosk|pølsevogn
nl:3Kiosk
@@ -2510,6 +2539,7 @@ en:2Bus Stop|bus|stop|U+1F68C|U+1F68F|U+1F68E|U+1F690
ru:4Остановка|5автобус|4троллейбус
bg:4автобусна спирка|4спирка|тролейбус
ar:موقف حافلة|باص|حافلة|مواصلات|مواصلات
+ca:Parada d'autobús|Parada
cs:4Autobusová zastávka|autobus|2bus|4zastávka|stanice
da:3Busstoppested|bus
nl:3Bushalte|bus|halte
@@ -2548,6 +2578,7 @@ en:3Tram Stop|tram|stop|U+1F683
ru:4Остановка|4трамвай
bg:4трамвайна спирка|4спирка
ar:موقف ترام|مواصلات|مواصلات
+ca:Parada de tramvia|Parada
cs:4Tramvajová zastávka|tramvaj|4zastávka|stanice
da:3Sporvogn|station
nl:3Tramhalte
@@ -4845,6 +4876,7 @@ en:4College|U+1F3EB
ru:4Колледж
bg:4Колеж
ar:كلية
+ca:Col·legi
cs:Vysoká škola
da:Universitet|4college|gymnasium
nl:Hogeschool|hoger beroepsonderwijs|hbo
@@ -6455,6 +6487,7 @@ ru:4Укрытие|навес|4убежище
be:4Прытулак
bg:4Подслон|Убежище|4заслон
ar:ملجأ
+ca:Refugi
cs:Přístřešek|úkryt
da:Shelter|læskur|hytte
nl:Beschutting
@@ -6534,6 +6567,7 @@ en:3Lean-to Shelter|4Shelter|Refuge
be:Бівальны навес
bg:Подслон за бивак
ar:ملجأ
+ca:Refugi
cs:Přístřešek|úkryt
da:Shelter|læskur|hytte
nl:Beschutting
@@ -6614,6 +6648,7 @@ en:2Phone|U+260E|U+1F4DE|5Telephone
ru:3Телефон|4таксофон
bg:3Телефон|мобифон|обаждане
ar:هاتف
+ca:Telèfon
cs:2Telefon|telefonní budka|telefonní automat
da:2Telefon
nl:2Telefoon|publieke telefoon
@@ -7569,6 +7604,7 @@ en:Park|U+1F332|U+1F333|U+1F60C
ru:Парк
bg:Парк|отдих
ar:حديقة
+ca:Parc
cs:Park
da:Park
nl:Park
@@ -9398,6 +9434,7 @@ ru:3Питьевая вода
be:3Пітная вада
bg:3Питейна вода
ar:مياه شرب
+ca:3Aigua potable|Font d'aigua potable
cs:4Pitná voda
da:4Drikkevand
nl:4Drinkwater
@@ -9476,6 +9513,7 @@ ru:4Родник|ключ|источник
be:4Крыніца
bg:Извор
ar:ينبوع
+ca:Manantial
cs:Pramen
da:Kilde|kildevæld
nl:Bron
@@ -9515,6 +9553,7 @@ ru:4Колодец|скважина
be:4Калодзеж|студня
bg:5Кладенец
ar:بئر ماء
+ca:Pou
cs:Studna
da:Brønd
nl:Waterbron
@@ -10366,6 +10405,7 @@ en:4Carpenter
ar:نجار
be:Цясляр
bg:4Дърводелство|дървар|
+ca:Fuster
cs:Truhlář
da:Tømrer
de:4Zimmermann
@@ -10677,6 +10717,7 @@ en:5Metal Worker
ar:عامل معادن
be:5Металаканструкцыі
bg:5Метални конструкции|металургия|ковач|метал|занаят
+ca:Ferrer
cs:Kovodílna
da:5Metalarbejder
de:4Schlosser
@@ -10796,6 +10837,7 @@ en:House Painter|painter|decorator
ar:رسام
be:Мастак
bg:Бояджия
+ca:Pintor
cs:Malíř
da:Maler
de:Maler
@@ -10834,6 +10876,7 @@ en:4Photographer|photography Studio
ar:مصور فوتوغرافي|استوديو تصوير
be:Фатограф
bg:4фотограф|албум|снимка|студио
+ca:Fotògraf
cs:4Fotograf|fotografické studio
da:4Fotograf|studio
de:4Fotograf|Fotostudio
@@ -11333,6 +11376,7 @@ mr:दीपगृह
man_made-survey_point
en:4Survey Point|survey marker|survey benchmark|4geodetic mark|geodetic vertex|4triangulation station|4trigonometrical point|trig point|trig pillar|4trig station|trig beacon|trig
be:4Геадэзічны пункт
+ca:Punt geodèsic
de:4Vermessungspunkt
el:4Γεωδαιτικό σημείο
et:4Vaatluspunkt|geodeetiline punkt|4trigonomeetriline punkt|triangulatsioonipunkt|trigopunkt|4triangulaator
@@ -11429,6 +11473,7 @@ en:4Copyshop|copy shop|4printing|4photocopy
ru:4Копировальный центр|4печать|полиграфия|ксерокс|принтер|копир
bg:4Копирен център|4печат|полиграфия|принтер
ar:محل نسخ|طباعة
+ca:Copisteria
cs:4Kopírovací obchod|4Tiskárny
da:4Kopieringsbutik|4Trykkeri
nl:4Copy shop|Kopieerwinkel|printer|4drukker
@@ -12641,6 +12686,7 @@ mr:वर्तमानपत्र विक्रीयंत्र
amenity-vending_machine-sweets
en:4Sweets Dispenser|Sweets|4Candies|Lollies
be:Аўтамат з прысмакамі|4прысмакі|4цукеркі
+ca:Màquina expenedora de dolços
de:Süßigkeitenautomat|Süßwaren|Süßigkeiten
es:Máquina expendedora de dulces|Dulces|Chuches|Chucherías
et:4Maiustuste automaat|Maiustused|4Kommid|Pulgakommid
@@ -12733,6 +12779,7 @@ en:Garage
ru:Гараж
bg:Гараж
ar:جراج
+ca:Garatge
cs:Garáž
da:Garage
nl:Garage
@@ -12804,6 +12851,7 @@ zh-Hant:休息區
highway-services
en:4Service Area|service station
be:4Зона абслугоўвання
+ca:Àrea de servei
de:Raststätte
es:Área de servicio
et:Teenindusala
@@ -13123,6 +13171,7 @@ en:3Car Parts|4Auto Parts
ru:Автомобильные запчасти|4Автозапчасти|4запчасти
bg:Автомобил|части|4авточасти
ar:ﺓﺭﺎﻴﺴﻟﺍ ءﺍﺰﺟﺃ
+ca:Peçes de cotxe
cs:Autodíly
da:Bildele
nl:Auto onderdelen
@@ -15981,6 +16030,7 @@ ar:محل مكملات غذائية
be:Харчовыя дабаўкі
bg:Хранителни добавки
cs:Doplňky výživy
+ca:Suplements nutricionals
da:Kosttilskud
de:Nahrungsergänzungsmittel
el:Συμπληρώματα Διατροφής
@@ -16019,6 +16069,7 @@ en:Paints
ar:ﺕﺎﻧﺎﻫﺪﻟﺍ
be:Фарбы
bg:Бои
+ca:Pintures
cs:Barvy
da:Maling
de:Farben
@@ -16058,6 +16109,7 @@ en:Perfumery
ar:العطور
be:Парфум|Парфумерыя
bg:Парфюмерия
+ca:Perfumería
cs:Parfumerie
da:Parfumeri
de:4Parfümerie
@@ -16097,6 +16149,7 @@ en:3Sewing Supplies|4Haberdashery
ar:معدات الخياطة
be:Швейныя прыналежнасці
bg:Шивашки консумативи
+ca:Material de costura|Mercería
cs:Šicí potřeby
da:Syudstyr
de:Nähzubehör
@@ -16175,6 +16228,7 @@ en:Tobacco
ar:تبغ
be:Тытунь
bg:Тютюн
+ca:Tabac
cs:Tabák
da:Tobak
de:5Tabakwarengeschäft|Tabak|4Trafik
@@ -16253,6 +16307,7 @@ en:Watches
ar:ساعات
be:Гадзіннік
bg:Часовници
+ca:Rellotger|Rellotgeria
cs:Hodinky
da:Ure
de:Uhrengeschäft|Uhren
@@ -16292,6 +16347,7 @@ en:Wholesale
ar:متجر مواد بالجملة
be:Аптовая
bg:Магазин на едро
+ca:Magatzem de roba al per major
cs:Velkoobchodní prodejna
da:Engros butik
de:5Großhandelsgeschäft
@@ -16328,6 +16384,7 @@ zh-Hant:批髮店
leisure-track
en:Track
+ca:Pista esportiva
de:Laufbahn
es:Pista deportiva
et:Jooksurada
diff --git a/data/osm_test_data/addr_area_street.osm b/data/osm_test_data/addr_area_street.osm
deleted file mode 100644
index 95cf5ae4ed..0000000000
--- a/data/osm_test_data/addr_area_street.osm
+++ /dev/null
@@ -1,551 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data/strings/types_strings.txt b/data/strings/types_strings.txt
index 45a8ca96d4..e7434ee292 100644
--- a/data/strings/types_strings.txt
+++ b/data/strings/types_strings.txt
@@ -397,7 +397,7 @@
eu = Ontziratzeko atea
fi = Portti
fr = Porte d'embarquement
- he = שער עליה למטוס
+ he = שער
it = Cancello aeroportuale
ja = 搭乗口
mr = दार
@@ -13763,7 +13763,6 @@
[type.highway.track.no.access]
ref = type.highway.track
- he = מסלול ללא גישה
[type.highway.track.tunnel]
ref = type.highway.road.tunnel
@@ -15467,7 +15466,7 @@
fa = گردشگری
fi = Alus
fr = Navire
- he = ספינה
+ he = אונייה
hi = जलयान
hu = Turizmus
id = Pemandangan
@@ -15834,7 +15833,7 @@
eu = Biribilgunea
fi = Liikenneympyrä
fr = Rond-point
- he = כיכר
+ he = מעגל תנועה
hi = गोल चक्कर
it = Rotonda
ja = ラウンドアバウト
@@ -15863,7 +15862,6 @@
et = Maakasutus
fi = Maankäyttö
fr = Utilisation du sol
- he = שימושי קרקע
hi = भूमि उपयोग
ja = 土地利用
mr = भूमी उपयोग
@@ -15888,7 +15886,6 @@
et = Peenrad
fi = Siirtolapuutarha
fr = Jardins familiaux
- he = חלקות חקלאיות
it = Orti comunitari
ja = 市民農園
mr = वाटप
@@ -15953,7 +15950,6 @@
et = Ehitusmaa
fi = Tuhoalue
fr = Friche industrielle
- he = קרקע מזוהמת
ja = 再開発用地
pl = Teren do zabudowy
pt = Terreno industrial devoluto
@@ -15991,7 +15987,6 @@
fa = حیاط کلیسا
fi = Kirkon piha
fr = Cour d'église
- he = חצר כנסיה
hu = Templomkert
id = Halaman gereja
it = Sagrato della chiesa
@@ -16075,7 +16070,6 @@
et = Haridusrajatised
fi = Koulutuslaitos
fr = Établissements éducatifs
- he = קריית חינוך
it = Strutture didattiche
mr = शैक्षणिक सुविधा
nl = Educatieve voorzieningen
@@ -16103,7 +16097,6 @@
fa = زمین کشاورزی
fi = Maatalousmaa
fr = Terrains agricoles
- he = אדמה חקלאית
hu = Termőföld
id = Lahan pertanian
it = Terreno agricolo
@@ -16136,7 +16129,6 @@
et = Taluõu
fi = Maatila
fr = Ferme
- he = חצר חקלאית
it = Fattoria
ja = 農地
nl = Boerenerf
diff --git a/generator/generator_tests/raw_generator_test.cpp b/generator/generator_tests/raw_generator_test.cpp
index 8406528291..81ca9632e8 100644
--- a/generator/generator_tests/raw_generator_test.cpp
+++ b/generator/generator_tests/raw_generator_test.cpp
@@ -1126,7 +1126,6 @@ UNIT_CLASS_TEST(TestRawGenerator, CycleBarrier)
TEST_EQUAL(carAcc, bicycleAcc, ());
}
-// https://github.com/organicmaps/organicmaps/issues/9029
UNIT_CLASS_TEST(TestRawGenerator, Addr_Street_Place)
{
std::string const mwmName = "Address";
@@ -1141,7 +1140,6 @@ UNIT_CLASS_TEST(TestRawGenerator, Addr_Street_Place)
{ "./data/osm_test_data/addr_street_place.osm", 1, true, true },
{ "./data/osm_test_data/addr_street_very_far.osm", 2, true, false },
{ "./data/osm_test_data/zelenograd.osm", 1, false, true },
- { "./data/osm_test_data/addr_area_street.osm", 1, true, false },
};
for (auto const & data : arrFiles)
diff --git a/iphone/Maps/Categories/MWMMapViewControlsManager+AddPlace.h b/iphone/Maps/Categories/MWMMapViewControlsManager+AddPlace.h
index 88e8ed14c0..5061ffca1d 100644
--- a/iphone/Maps/Categories/MWMMapViewControlsManager+AddPlace.h
+++ b/iphone/Maps/Categories/MWMMapViewControlsManager+AddPlace.h
@@ -1,8 +1,12 @@
#import
#include "geometry/point2d.hpp"
+NS_ASSUME_NONNULL_BEGIN
+
@interface MWMMapViewControlsManager (AddPlace)
-- (void)addPlace:(BOOL)isBusiness position:(nullable m2::PointD const *)optionalPosition;
+- (void)addPlace:(BOOL)isBusiness position:(m2::PointD const *)optionalPosition;
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
index 7588e0d73f..6458df16b6 100644
--- a/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
+++ b/iphone/Maps/LocalizedStrings/he.lproj/Localizable.strings
@@ -1423,7 +1423,7 @@
"type.aeroway.apron" = "חניית מטוסים";
-"type.aeroway.gate" = "שער עליה למטוס";
+"type.aeroway.gate" = "שער";
"type.aeroway.helipad" = "מנחת מסוקים";
@@ -2332,7 +2332,7 @@
"type.highway.track.grade1" = "מסלול";
-"type.highway.track.no.access" = "מסלול ללא גישה";
+"type.highway.track.no.access" = "מסלול";
/* These translations are used for all type.highway.*.tunnel. */
"type.highway.track.tunnel" = "מִנהָרָה";
@@ -2472,7 +2472,7 @@
"type.historic.ruins" = "חורבות עתיקות";
-"type.historic.ship" = "ספינה";
+"type.historic.ship" = "אונייה";
"type.historic.tank" = "טנק היסטורי";
@@ -2516,17 +2516,17 @@
"type.junction" = "צומת";
-"type.junction.circular" = "כיכר";
+"type.junction.circular" = "מעגל תנועה";
-"type.junction.roundabout" = "כיכר";
+"type.junction.roundabout" = "מעגל תנועה";
-"type.landuse" = "שימושי קרקע";
+"type.landuse" = "Landuse";
-"type.landuse.allotments" = "חלקות חקלאיות";
+"type.landuse.allotments" = "Allotments";
"type.landuse.basin" = "אגן מים";
-"type.landuse.brownfield" = "קרקע מזוהמת";
+"type.landuse.brownfield" = "Brownfield";
/* In most (European) countries, сemeteries are usually independent of places of worship (e.g. military cemeteries), while grave yards are usually the yard of a place of worship. */
"type.landuse.cemetery" = "בית קברות";
@@ -2534,17 +2534,17 @@
/* In most (European) countries, сemeteries are usually independent of places of worship (e.g. military cemeteries), while grave yards are usually the yard of a place of worship. */
"type.landuse.cemetery.christian" = "בית קברות נוצרי";
-"type.landuse.churchyard" = "חצר כנסיה";
+"type.landuse.churchyard" = "Churchyard";
"type.landuse.commercial" = "אזור מסחרי";
"type.landuse.construction" = "אתר בניה";
-"type.landuse.education" = "קריית חינוך";
+"type.landuse.education" = "Educational Facility";
-"type.landuse.farmland" = "אדמה חקלאית";
+"type.landuse.farmland" = "Farmland";
-"type.landuse.farmyard" = "חצר חקלאית";
+"type.landuse.farmyard" = "Farmyard";
"type.landuse.field" = "שדה";
diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h
index 0b7efa3c19..b2e3964b0e 100644
--- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h
+++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h
@@ -31,6 +31,7 @@
+ (void)editBookmark:(PlacePageData *)data;
+ (void)searchBookingHotels:(PlacePageData *)data;
+ (void)book:(PlacePageData *)data;
++ (void)share:(PlacePageData *)data;
+ (void)routeFrom:(PlacePageData *)data;
+ (void)routeTo:(PlacePageData *)data;
+ (void)routeAddStop:(PlacePageData *)data;
diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm
index f6b78cdd17..05d2617e83 100644
--- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm
+++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm
@@ -38,6 +38,7 @@
- (void)editBookmark:(PlacePageData *)data;
- (void)searchBookingHotels:(PlacePageData *)data;
- (void)book:(PlacePageData *)data;
+- (void)share:(PlacePageData *)data;
- (void)routeFrom:(PlacePageData *)data;
- (void)routeTo:(PlacePageData *)data;
- (void)routeAddStop:(PlacePageData *)data;
diff --git a/map/framework.cpp b/map/framework.cpp
index c3e767a2da..50a91c9e63 100644
--- a/map/framework.cpp
+++ b/map/framework.cpp
@@ -569,56 +569,6 @@ void Framework::FillPointInfoForBookmark(Bookmark const & bmk, place_page::Info
});
}
-void Framework::FillUserMarkInfo(UserMark const * mark, place_page::Info & outInfo)
-{
- outInfo.SetSelectedObject(df::SelectionShape::OBJECT_USER_MARK);
-
- switch (mark->GetMarkType())
- {
- case UserMark::Type::API:
- FillApiMarkInfo(*static_cast(mark), outInfo);
- break;
- case UserMark::Type::BOOKMARK:
- FillBookmarkInfo(*static_cast(mark), outInfo);
- break;
- case UserMark::Type::SEARCH:
- FillSearchResultInfo(*static_cast(mark), outInfo);
- break;
- case UserMark::Type::ROUTING:
- FillRouteMarkInfo(*static_cast(mark), outInfo);
- break;
- case UserMark::Type::ROAD_WARNING:
- FillRoadTypeMarkInfo(*static_cast(mark), outInfo);
- break;
- case UserMark::Type::TRACK_INFO:
- {
- auto const & infoMark = *static_cast(mark);
- BuildTrackPlacePage(GetBookmarkManager().GetTrackSelectionInfo(infoMark.GetTrackId()), outInfo);
- return;
- }
- case UserMark::Type::TRACK_SELECTION:
- {
- auto const & selMark = *static_cast(mark);
- BuildTrackPlacePage(GetBookmarkManager().GetTrackSelectionInfo(selMark.GetTrackId()), outInfo);
- return;
- }
- case UserMark::Type::TRANSIT:
- {
- FillTransitMarkInfo(*static_cast(mark), outInfo);
- break;
- }
- case UserMark::Type::SPEED_CAM:
- {
- FillSpeedCameraMarkInfo(*static_cast(mark), outInfo);
- break;
- }
- default:
- CHECK(false, ("Unexpected user mark type", mark->GetMarkType()));
- }
-
- SetPlacePageLocation(outInfo);
-}
-
void Framework::FillBookmarkInfo(Bookmark const & bmk, place_page::Info & info) const
{
info.SetBookmarkCategoryName(GetBookmarkManager().GetCategoryName(bmk.GetGroupId()));
@@ -844,14 +794,14 @@ void Framework::FillRoadTypeMarkInfo(RoadWarningMark const & roadTypeMark, place
void Framework::ShowBookmark(kml::MarkId id)
{
auto const * mark = m_bmManager->GetBookmark(id);
- if (mark)
- ShowBookmark(mark);
- else
- ASSERT(false, ("ShowBookmark was called with invalid id", id));
+ ShowBookmark(mark);
}
void Framework::ShowBookmark(Bookmark const * mark)
{
+ if (mark == nullptr)
+ return;
+
StopLocationFollow();
place_page::BuildInfo info;
@@ -866,8 +816,11 @@ void Framework::ShowBookmark(Bookmark const * mark)
auto es = GetBookmarkManager().GetEditSession();
es.SetIsVisible(mark->GetGroupId(), true /* visible */);
- if (m_drapeEngine)
- m_drapeEngine->SetModelViewCenter(mark->GetPivot(), scale, true /* isAnim */, true /* trackVisibleViewport */);
+ if (m_drapeEngine != nullptr)
+ {
+ m_drapeEngine->SetModelViewCenter(mark->GetPivot(), scale, true /* isAnim */,
+ true /* trackVisibleViewport */);
+ }
ActivateMapSelection();
}
@@ -907,7 +860,7 @@ void Framework::ShowBookmarkCategory(kml::MarkGroupId categoryId, bool animation
auto es = bm.GetEditSession();
es.SetIsVisible(categoryId, true /* visible */);
- auto const & trackIds = bm.GetTrackIds(categoryId);
+ auto const trackIds = bm.GetTrackIds(categoryId);
for (auto trackId : trackIds)
{
if (!bm.GetTrack(trackId)->IsInteractive())
@@ -928,7 +881,7 @@ void Framework::ShowFeature(FeatureID const & featureId)
if (m_drapeEngine != nullptr)
{
- auto const & pt = m_currentPlacePageInfo->GetMercator();
+ auto const pt = m_currentPlacePageInfo->GetMercator();
auto const scale = scales::GetUpperComfortScale();
m_drapeEngine->SetModelViewCenter(pt, scale, true /* isAnim */, true /* trackVisibleViewport */);
}
@@ -2172,20 +2125,56 @@ place_page::Info Framework::BuildPlacePageInfo(place_page::BuildInfo const & bui
if (buildInfo.IsUserMarkMatchingEnabled())
{
- UserMark const * mark = nullptr;
- if (buildInfo.m_userMarkId != kml::kInvalidMarkId)
+ UserMark const * mark = FindUserMarkInTapPosition(buildInfo);
+ if (mark != nullptr)
{
- auto const & bm = GetBookmarkManager();
- mark = bm.IsBookmark(buildInfo.m_userMarkId) ? bm.GetBookmark(buildInfo.m_userMarkId) : bm.GetUserMark(buildInfo.m_userMarkId);
- ASSERT(mark, ("There is no user mark with id", buildInfo.m_userMarkId));
- }
+ outInfo.SetSelectedObject(df::SelectionShape::OBJECT_USER_MARK);
+ switch (mark->GetMarkType())
+ {
+ case UserMark::Type::API:
+ FillApiMarkInfo(*static_cast(mark), outInfo);
+ break;
+ case UserMark::Type::BOOKMARK:
+ FillBookmarkInfo(*static_cast(mark), outInfo);
+ break;
+ case UserMark::Type::SEARCH:
+ FillSearchResultInfo(*static_cast(mark), outInfo);
+ break;
+ case UserMark::Type::ROUTING:
+ FillRouteMarkInfo(*static_cast(mark), outInfo);
+ break;
+ case UserMark::Type::ROAD_WARNING:
+ FillRoadTypeMarkInfo(*static_cast(mark), outInfo);
+ break;
+ case UserMark::Type::TRACK_INFO:
+ {
+ auto const & infoMark = *static_cast(mark);
+ BuildTrackPlacePage(GetBookmarkManager().GetTrackSelectionInfo(infoMark.GetTrackId()),
+ outInfo);
+ return outInfo;
+ }
+ case UserMark::Type::TRACK_SELECTION:
+ {
+ auto const & selMark = *static_cast(mark);
+ BuildTrackPlacePage(GetBookmarkManager().GetTrackSelectionInfo(selMark.GetTrackId()),
+ outInfo);
+ return outInfo;
+ }
+ case UserMark::Type::TRANSIT:
+ {
+ FillTransitMarkInfo(*static_cast(mark), outInfo);
+ break;
+ }
+ case UserMark::Type::SPEED_CAM:
+ {
+ FillSpeedCameraMarkInfo(*static_cast(mark), outInfo);
+ break;
+ }
+ default:
+ ASSERT(false, ("FindNearestUserMark returned invalid mark."));
+ }
- if (!mark)
- mark = FindUserMarkInTapPosition(buildInfo);
-
- if (mark)
- {
- FillUserMarkInfo(mark, outInfo);
+ SetPlacePageLocation(outInfo);
return outInfo;
}
}
@@ -2235,23 +2224,16 @@ place_page::Info Framework::BuildPlacePageInfo(place_page::BuildInfo const & bui
// Selection circle should match feature
FillFeatureInfo(selectedFeature, outInfo);
- if (isBuildingSelected)
- outInfo.SetMercator(buildInfo.m_mercator); // Move selection circle to the tap position inside a building.
- else if (buildInfo.IsUserMarkMatchingEnabled() && !outInfo.IsBookmark())
+ if (buildInfo.IsUserMarkMatchingEnabled() && !outInfo.IsBookmark() && !isBuildingSelected)
{
- // Search for a user mark at POI position instead of tap position (an icon or text label was tapped).
- double constexpr kEps = 1e-7;
- auto const rect = df::TapInfo::GetPreciseTapRect(outInfo.GetMercator(), kEps);
- UserMark const * mark = GetBookmarkManager().FindNearestUserMark(
- [&rect](UserMark::Type) { return rect; },
- [](UserMark::Type) { return true; });
+ // Search for a bookmark at POI position instead of tap position
+ auto mark = FindBookMarkInPosition(outInfo.GetMercator());
if (mark)
- {
- FillUserMarkInfo(mark, outInfo);
- SetPlacePageLocation(outInfo);
- return outInfo;
- }
+ FillBookmarkInfo(*static_cast(mark), outInfo);
}
+
+ if (isBuildingSelected)
+ outInfo.SetMercator(buildInfo.m_mercator); // Move selection circle to tap position inside a building.
}
else
{
@@ -2299,7 +2281,16 @@ Track::TrackSelectionInfo Framework::FindTrackInTapPosition(place_page::BuildInf
UserMark const * Framework::FindUserMarkInTapPosition(place_page::BuildInfo const & buildInfo) const
{
- UserMark const * mark = GetBookmarkManager().FindNearestUserMark(
+ auto const & bm = GetBookmarkManager();
+ if (buildInfo.m_userMarkId != kml::kInvalidMarkId)
+ {
+ auto mark = bm.IsBookmark(buildInfo.m_userMarkId) ? bm.GetBookmark(buildInfo.m_userMarkId)
+ : bm.GetUserMark(buildInfo.m_userMarkId);
+ if (mark != nullptr)
+ return mark;
+ }
+
+ UserMark const * mark = bm.FindNearestUserMark(
[this, &buildInfo](UserMark::Type type)
{
double constexpr kEps = 1e-7;
@@ -2321,6 +2312,26 @@ UserMark const * Framework::FindUserMarkInTapPosition(place_page::BuildInfo cons
return mark;
}
+UserMark const * Framework::FindBookMarkInPosition(m2::PointD const & mercator) const
+{
+ auto const & bm = GetBookmarkManager();
+
+ UserMark const * mark = bm.FindNearestUserMark(
+ [this, &mercator](UserMark::Type type)
+ {
+ if (type == UserMark::Type::BOOKMARK || type == UserMark::Type::TRACK_INFO)
+ return df::TapInfo::GetBookmarkTapRect(mercator, m_currentModelView);
+
+ if (type == UserMark::Type::ROUTING || type == UserMark::Type::ROAD_WARNING)
+ return df::TapInfo::GetRoutingPointTapRect(mercator, m_currentModelView);
+
+ return df::TapInfo::GetDefaultTapRect(mercator, m_currentModelView);
+ },
+ [](UserMark::Type type) { return true; });
+
+ return mark;
+}
+
void Framework::PredictLocation(double & lat, double & lon, double accuracy,
double bearing, double speed, double elapsedSeconds)
{
diff --git a/map/framework.hpp b/map/framework.hpp
index 53ef163860..42b15ee202 100644
--- a/map/framework.hpp
+++ b/map/framework.hpp
@@ -362,6 +362,7 @@ private:
void BuildTrackPlacePage(Track::TrackSelectionInfo const & trackSelectionInfo, place_page::Info & info);
Track::TrackSelectionInfo FindTrackInTapPosition(place_page::BuildInfo const & buildInfo) const;
UserMark const * FindUserMarkInTapPosition(place_page::BuildInfo const & buildInfo) const;
+ UserMark const * FindBookMarkInPosition(m2::PointD const & mercator) const;
FeatureID FindBuildingAtPoint(m2::PointD const & mercator) const;
void UpdateMinBuildingsTapZoom();
@@ -609,8 +610,6 @@ private:
void FillPostcodeInfo(std::string const & postcode, m2::PointD const & mercator,
place_page::Info & info) const;
- void FillUserMarkInfo(UserMark const * mark, place_page::Info & outInfo);
-
void FillInfoFromFeatureType(FeatureType & ft, place_page::Info & info) const;
void FillApiMarkInfo(ApiMarkPoint const & api, place_page::Info & info) const;
void FillSearchResultInfo(SearchMarkPoint const & smp, place_page::Info & info) const;
diff --git a/qt/qt_common/helpers.hpp b/qt/qt_common/helpers.hpp
index e56484227a..75cfb07f70 100644
--- a/qt/qt_common/helpers.hpp
+++ b/qt/qt_common/helpers.hpp
@@ -19,9 +19,9 @@ bool IsAltModifier(QMouseEvent const * const e);
struct Hotkey
{
Hotkey() = default;
- Hotkey(QKeySequence const & key, char const * slot) : m_key(key), m_slot(slot) {}
+ Hotkey(int key, char const * slot) : m_key(key), m_slot(slot) {}
- QKeySequence m_key = 0;
+ int m_key = 0;
char const * m_slot = nullptr;
};
diff --git a/qt/qt_common/map_widget.cpp b/qt/qt_common/map_widget.cpp
index 59102ca1ea..cb6d854ce9 100644
--- a/qt/qt_common/map_widget.cpp
+++ b/qt/qt_common/map_widget.cpp
@@ -25,12 +25,6 @@
#include
#include
-// Fraction of the viewport for a move event
-static constexpr float kViewportFractionRoughMove = 0.2;
-
-// Fraction of the viewport for a small move event
-static constexpr float kViewportFractionSmoothMove = 0.1;
-
namespace qt::common
{
//#define ENABLE_AA_SWITCH
@@ -67,20 +61,12 @@ void MapWidget::BindHotkeys(QWidget & parent)
{Qt::Key_Equal, SLOT(ScalePlus())},
{Qt::Key_Plus, SLOT(ScalePlus())},
{Qt::Key_Minus, SLOT(ScaleMinus())},
- {Qt::Key_Right, SLOT(MoveRight())},
- {Qt::Key_Left, SLOT(MoveLeft())},
- {Qt::Key_Up, SLOT(MoveUp())},
- {Qt::Key_Down, SLOT(MoveDown())},
- {Qt::ALT | Qt::Key_Equal, SLOT(ScalePlusLight())},
- {Qt::ALT | Qt::Key_Plus, SLOT(ScalePlusLight())},
- {Qt::ALT | Qt::Key_Minus, SLOT(ScaleMinusLight())},
- {Qt::ALT | Qt::Key_Right, SLOT(MoveRightSmooth())},
- {Qt::ALT | Qt::Key_Left, SLOT(MoveLeftSmooth())},
- {Qt::ALT | Qt::Key_Up, SLOT(MoveUpSmooth())},
- {Qt::ALT | Qt::Key_Down, SLOT(MoveDownSmooth())},
+ {static_cast(Qt::ALT) + static_cast(Qt::Key_Equal), SLOT(ScalePlusLight())},
+ {static_cast(Qt::ALT) + static_cast(Qt::Key_Plus), SLOT(ScalePlusLight())},
+ {static_cast(Qt::ALT) + static_cast(Qt::Key_Minus), SLOT(ScaleMinusLight())},
#ifdef ENABLE_AA_SWITCH
- {Qt::ALT | Qt::Key_A, SLOT(AntialiasingOn())},
- {Qt::ALT | Qt::Key_S, SLOT(AntialiasingOff())},
+ {static_cast(Qt::ALT) + static_cast(Qt::Key_A), SLOT(AntialiasingOn())},
+ {static_cast(Qt::ALT) + static_cast(Qt::Key_S), SLOT(AntialiasingOff())},
#endif
};
@@ -132,22 +118,6 @@ void MapWidget::ScalePlusLight() { m_framework.Scale(Framework::SCALE_MAG_LIGHT,
void MapWidget::ScaleMinusLight() { m_framework.Scale(Framework::SCALE_MIN_LIGHT, true); }
-void MapWidget::MoveRight() { m_framework.Move(-kViewportFractionRoughMove, 0, true); }
-
-void MapWidget::MoveRightSmooth() { m_framework.Move(-kViewportFractionSmoothMove, 0, true); }
-
-void MapWidget::MoveLeft() { m_framework.Move(kViewportFractionRoughMove, 0, true); }
-
-void MapWidget::MoveLeftSmooth() { m_framework.Move(kViewportFractionSmoothMove, 0, true); }
-
-void MapWidget::MoveUp() { m_framework.Move(0, -kViewportFractionRoughMove, true); }
-
-void MapWidget::MoveUpSmooth() { m_framework.Move(0, -kViewportFractionSmoothMove, true); }
-
-void MapWidget::MoveDown() { m_framework.Move(0, kViewportFractionRoughMove, true); }
-
-void MapWidget::MoveDownSmooth() { m_framework.Move(0, kViewportFractionSmoothMove, true); }
-
void MapWidget::AntialiasingOn()
{
auto engine = m_framework.GetDrapeEngine();
diff --git a/qt/qt_common/map_widget.hpp b/qt/qt_common/map_widget.hpp
index 01d4ee22ae..0de92a4709 100644
--- a/qt/qt_common/map_widget.hpp
+++ b/qt/qt_common/map_widget.hpp
@@ -47,15 +47,6 @@ public slots:
void ScaleMinus();
void ScalePlusLight();
void ScaleMinusLight();
- void MoveRight();
- void MoveRightSmooth();
- void MoveLeft();
- void MoveLeftSmooth();
- void MoveUp();
- void MoveUpSmooth();
- void MoveDown();
- void MoveDownSmooth();
-
void ScaleChanged(int action);
void SliderPressed();
diff --git a/search/reverse_geocoder.cpp b/search/reverse_geocoder.cpp
index 0c55ce277a..f26e886e93 100644
--- a/search/reverse_geocoder.cpp
+++ b/search/reverse_geocoder.cpp
@@ -4,7 +4,6 @@
#include "search/house_to_street_table.hpp"
#include "search/mwm_context.hpp"
#include "search/region_info_getter.hpp"
-#include "search/street_vicinity_loader.hpp"
#include "storage/country_info_getter.hpp"
@@ -20,8 +19,9 @@
#include "base/stl_helpers.hpp"
#include
+#include
#include
-
+#include
namespace search
{
@@ -103,7 +103,8 @@ vector ReverseGeocoder::GetNearbyStreets(
{
return GetNearbyObjects(context, center, radiusM, [](FeatureType & ft)
{
- return StreetVicinityLoader::IsStreet(ft);
+ return ((ft.GetGeomType() == feature::GeomType::Line && ftypes::IsWayChecker::Instance()(ft)) ||
+ ftypes::IsSquareChecker::Instance()(ft));
});
}
diff --git a/search/street_vicinity_loader.cpp b/search/street_vicinity_loader.cpp
index db3a0f0d24..4bac160db7 100644
--- a/search/street_vicinity_loader.cpp
+++ b/search/street_vicinity_loader.cpp
@@ -41,19 +41,17 @@ StreetVicinityLoader::Street const & StreetVicinityLoader::GetStreet(uint32_t fe
return r.first;
}
-bool StreetVicinityLoader::IsStreet(FeatureType & ft)
-{
- auto const geomType = ft.GetGeomType();
- // Highway should be line or area.
- bool const isLineOrArea = (geomType == feature::GeomType::Line || geomType == feature::GeomType::Area);
- // Square also maybe a point (besides line or area).
- return ((isLineOrArea && ftypes::IsWayChecker::Instance()(ft)) || ftypes::IsSquareChecker::Instance()(ft));
-}
-
void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street)
{
auto feature = m_context->GetFeature(featureId);
- if (!feature || !IsStreet(*feature))
+ if (!feature)
+ return;
+
+ bool const isStreet =
+ (feature->GetGeomType() == feature::GeomType::Line &&
+ ftypes::IsWayChecker::Instance()(*feature)) ||
+ ftypes::IsSquareChecker::Instance()(*feature);
+ if (!isStreet)
return;
/// @todo Can be optimized here. Do not aggregate rect, but aggregate covering intervals for each segment, instead.
diff --git a/search/street_vicinity_loader.hpp b/search/street_vicinity_loader.hpp
index 5c0a4e17ac..d8ed41b00d 100644
--- a/search/street_vicinity_loader.hpp
+++ b/search/street_vicinity_loader.hpp
@@ -1,12 +1,18 @@
#pragma once
#include "search/mwm_context.hpp"
+//#include "search/projection_on_street.hpp"
#include "search/stats_cache.hpp"
+//#include "indexer/feature.hpp"
+//#include "indexer/feature_algo.hpp"
+
#include "geometry/rect2d.hpp"
#include "base/macros.hpp"
+//#include
+#include
#include
namespace search
@@ -19,8 +25,6 @@ class MwmContext;
class StreetVicinityLoader
{
public:
- static bool IsStreet(FeatureType & ft);
-
struct Street
{
inline bool IsEmpty() const { return m_rect.IsEmptyInterior(); }
diff --git a/xcode/base/base.xcodeproj/project.pbxproj b/xcode/base/base.xcodeproj/project.pbxproj
index fc45f5fc66..d14beb48b9 100644
--- a/xcode/base/base.xcodeproj/project.pbxproj
+++ b/xcode/base/base.xcodeproj/project.pbxproj
@@ -631,7 +631,7 @@
attributes = {
BuildIndependentTargetsInParallel = YES;
DefaultBuildSystemTypeForWorkspace = Latest;
- LastUpgradeCheck = 1600;
+ LastUpgradeCheck = 1510;
TargetAttributes = {
39FD27061CC65A7100AFF551 = {
CreatedOnToolsVersion = 7.2.1;
diff --git a/xcode/drape/drape.xcodeproj/project.pbxproj b/xcode/drape/drape.xcodeproj/project.pbxproj
index b690f10d78..4ada982dab 100644
--- a/xcode/drape/drape.xcodeproj/project.pbxproj
+++ b/xcode/drape/drape.xcodeproj/project.pbxproj
@@ -384,6 +384,7 @@
6729A5041A69213A007D5872 /* batcher_helpers.hpp */,
6729A5051A69213A007D5872 /* batcher.cpp */,
6729A5061A69213A007D5872 /* batcher.hpp */,
+ 670947181BDF9A4F005014C0 /* bidi.hpp */,
6729A5071A69213A007D5872 /* binding_info.cpp */,
6729A5081A69213A007D5872 /* binding_info.hpp */,
6729A5091A69213A007D5872 /* buffer_base.cpp */,
@@ -556,6 +557,7 @@
34C624CA1DABDB2000510300 /* static_texture.hpp in Headers */,
4577B25521F2035D00864FAC /* vulkan_texture.hpp in Headers */,
6729A5901A69213A007D5872 /* object_pool.hpp in Headers */,
+ 670947261BDF9A4F005014C0 /* bidi.hpp in Headers */,
6729A5A11A69213A007D5872 /* shader.hpp in Headers */,
4513BF0C1EC2F0760066565C /* framebuffer.hpp in Headers */,
6729A5641A69213A007D5872 /* attribute_buffer_mutator.hpp in Headers */,
@@ -607,7 +609,7 @@
attributes = {
BuildIndependentTargetsInParallel = YES;
DefaultBuildSystemTypeForWorkspace = Latest;
- LastUpgradeCheck = 1600;
+ LastUpgradeCheck = 1540;
TargetAttributes = {
6729A4F01A691F6A007D5872 = {
CreatedOnToolsVersion = 6.1.1;
diff --git a/xcode/icu/icu.xcodeproj/project.pbxproj b/xcode/icu/icu.xcodeproj/project.pbxproj
index 9528f85d2c..e33866255d 100644
--- a/xcode/icu/icu.xcodeproj/project.pbxproj
+++ b/xcode/icu/icu.xcodeproj/project.pbxproj
@@ -1516,7 +1516,7 @@
attributes = {
BuildIndependentTargetsInParallel = YES;
DefaultBuildSystemTypeForWorkspace = Latest;
- LastUpgradeCheck = 1600;
+ LastUpgradeCheck = 1510;
TargetAttributes = {
BBB165D61E8275120058BF1E = {
CreatedOnToolsVersion = 8.2.1;