Завдання знайти точну локацію в місті за фотографією здається непростим, але сучасні методи геолокації значно спрощують цей процес. У цій статті ми розглянемо детальний алгоритм, як за панорамою одного з безпечних міст Франції — Діжона — вдалося ідентифікувати конкретне місце на мапі.
Як результат, найбільш імовірними варіантами стали Діжон або, можливо, Авіньйон. Пошуки розпочали з Діжона.
При цьому вдалося встановити, що на блакитному покажчику першим словом є RUE, тоді як на чорному, ймовірно, зазначено BOULEVARD (довжина слова відповідає іншим позначенням такого типу вулиць). Після аналізу численних покажчиків були сформовані деякі припущення (хоча не всі з них виявилися правильними):
У назві rue два слова.
Назва rue написана капсом, отже це ім’я Прізвище, оскільки ім’я у назві вулиці не пишеться капсом. Таких вулиць значно менше.
Довжина назви 13-15 символів, включаючи пробіл, оскільки вона досить довга, щоб займати всю ширину покажчика, але друге слово не перенесено на новий рядок.
Довжина назви Булевар теж 13-15 з тієї ж причини.
Усі ці припущення перевіряли за допомогою Overpass. Здійснювався пошук перетинів бульварів і вулиць, при цьому враховувалась довжина назв та кількість слів. Особливу увагу приділяли бульварам з назвами довжиною від 12 символів.
area [ name = Dijon ] [ admin_level = 8 ] ->. a ; way [ highway ] [ name ~ "^boulevard .{12,}$" , i ] ( area . a ) ->. ways ; foreach . ways ->. this_way { rel ( bw.this_way ) - > . this_rel ; node ( w.this_way ) - > . this_way_nodes ; way [ highway ] [ name ~ "^rue \\S+ \\S+$" , i ] ( bn . this_way_nodes ) ->. linked_ways ; ( way.linked_ways ; - ( way ( r.this_rel ) ; way.this_way ; ) ; ) ->. linked_ways_only ; node ( w . linked_ways_only ) ->. linked_ways_only_nodes ; node . linked_ways_only_nodes . this_way_nodes ; out ; }
Було створено скрипт, який дозволяв масово вивантажувати точки OSM за допомогою запитів OPQL, отримуючи панорами із супутниковими знімками.
З достатньою наполегливістю можна було б знайти точку навіть за цим запитом, проте кількість точок була великою, і ретельна перевірка кожної була неможливою.
Було використано різні методи та комбінації для визначення того, що ще, окрім слова “rue,” могло б бути на цьому покажчику, але ці спроби не дали результатів.
Після перегляду великої кількості панорам, остаточно переконавшись, що це Діжон, було вирішено вивантажити списки вулиць через Overpass, застосовуючи регулярні вирази, і розширити зону пошуку до меж усього муніципалітету. Запит:
[ out : csv ( name , :: id ) ] ; area [ name = Dijon ] [ admin_level = 7 ] ->. a ; way [ name ~ "^rue \\S{5,7} \\S{6,8}$" , i ] ( area . a ) ; out geom ;
В результаті було вивантажено список вулиць, яких виявилося 294. Після відсіювання назв формату «Ім’я Прізвище» залишилося небагато варіантів:
Rue Colonel Ballet Rue Colonel Driant Rue Colonel Marcaire Rue Colonel Picard Rue Colonel Quantin Rue Colonel Redoutey Rue Devant L'église Rue Docteur Calmette Rue Docteur Chauveau Rue Docteur Durande Rue Docteur Lavalle Rue Docteur Maillard Rue Docteur Parizot Rue Docteur Quignard Rue Docteur Renardet Rue Docteur Tarnier Rue General Bouchu Rue General Cambel Rue Général Giraud Rue Général Joubert Rue Longe L'église Rue Maison Blanche Rue Minot Museux Rue Neuve Bergère Rue Neuve Dauphine
Після перевірки цих вулиць результатів не отримали. Було прийнято рішення ще раз уважно проаналізувати фото.
Трохи погулявши Дижоном, зустрічаємо такий же:
Створено запит для отримання списку бульварів, щоб мати можливість перевірити їх вручну.
[ out : csv ( name , :: id ) ] ; area [ name = Dijon ] [ admin_level = 7 ] ->. a ; way [ name ~ "^boulevard" , i ] ( area . a ) ; out geom ;
Отримуємо цілих 82 бульвари в муніципалітеті Діжон:
Boulevard Albert Einstein Boulevard Alexandre 1er de Yougoslavie Boulevard Bernard Palissy Boulevard Carnot Boulevard Chanoine Kir Boulevard Charles de Gaulle Boulevard Docteur Jean Veillet Boulevard Docteur Petitjean Boulevard Edmé Nicolas Machureau Boulevard Eiffel Boulevard Eugène Fyot Boulevard Eugène Spuller Boulevard François Pompon Boulevard Gabriel Boulevard Gaston Bachelard Boulevard Georges Clemenceau Boulevard Henri Bazin Boulevard Henri Camp Boulevard Jean Jaurès Boulevard Jean Moulin Boulevard Jeanne d'Arc Boulevard John Fitzgerald Kennedy Boulevard John Kennedy Boulevard Maillard Boulevard Mansart Boulevard Marmont Boulevard Maréchal Gallieni Boulevard Maréchal Joffre Boulevard Maréchal Juin Boulevard Maréchal Leclerc Boulevard Maréchal de Lattre de Tassigny Boulevard Montaigne Boulevard Olivier de Serres Boulevard Pascal Boulevard Pasteur Boulevard Paul Doumer Boulevard Rembrandt Boulevard Robert Schuman Boulevard Sévigné Boulevard Thiers Boulevard Trimolet Boulevard Voltaire Boulevard Winston Churchill Boulevard de Beauregard Boulevard de Bellevue Boulevard de Brosses Boulevard de Champagne Boulevard de Chicago Boulevard de Chèvre Morte Boulevard de Strasbourg Boulevard de Sévigné Boulevard de Troyes Boulevard de Verdun Boulevard de l'Europe Boulevard de l'Ouest Boulevard de l'Université Boulevard de la Croix Saint-Martin Boulevard de la Défense Boulevard de la Fontaine des Suisses Boulevard de la Marne Boulevard de la Motte Boulevard de la Trémouille Boulevard des Aiguillottes Boulevard des Allobroges Boulevard des Bourroches Boulevard des Clomiers Boulevard des Diables Bleus Boulevard des Gorgets Boulevard des Herbues Boulevard des Hortensias Boulevard des Industries Boulevard des Martyrs de la Résistance Boulevard des Peyvets Boulevard des Valendons Boulevard du 1er RAD Boulevard du Castel Boulevard du Champ aux Métiers Boulevard du Colonel Charles Flamand Boulevard du Grand Marché Boulevard du Maréchal Leclerc Boulevard du Maréchal de Lattre de Tassigny Boulevard Édouard Branly
Нарешті, наведено приклад оптимального OPQL-запиту для цього завдання, який можна було б скласти, спираючись на вищезгадані припущення, відкинувши хибні. Цей запит повертає лише п’ять точок, і всі вони розташовані на потрібному бульварі.
area [ name = Dijon ] [ admin_level = 8 ] ->. dijon ; way [ highway ] [ name ~ "^boulevard .{13,}" , i ] ( area . dijon ) ->. bouls ; ( way . bouls [ "cycleway:both" = lane ] ; way . bouls [ cycleway = lane ] ; ) ->. cycles ; foreach . cycles - > this_way { rel . ( bn . this_way_nodes ) ->. linked_ways ; ( way.linked_ways ; - ( way ( r.this_rel ) ; way.this_way ; ) ; ) ->. linked_ways_only ; node ( w . linked_ways_only ) ->. linked_ways_only_nodes ; node . linked_ways_only_nodes . this_way_nodes ; out ;
У результаті детальний аналіз деталей панорами, таких як велодоріжки, теракотові дахи, кольорові покажчики й особливості розміщення ліхтарів, дозволив знайти точне місце у французькому місті Діжон. За допомогою інструментів OSM і OPQL було складено низку запитів, що значно скоротили перелік потенційних локацій, а вдосконалення запиту дозволило швидко отримати потрібні координати.
Цей процес підкреслює, як ретельне вивчення деталей і використання сучасних картографічних інструментів можуть допомогти досягти точних результатів навіть у найскладніших завданнях геолокації.