Dokąd lecimy? Ale co to znaczy "dokąd"
Opublikowano: 2026-08-13
"Dokąd lecisz?" to najprostsze pytanie, jakie można zadać podróżnikowi. Człowiek odpowiada bez namysłu: na Sardynię, na Mazury, w Alpy, do Zakopanego. Wyszukiwarka lotów odpowiada inaczej - zna wyłącznie kody lotnisk i nazwy miast. Napisz jej "Sardynia", a najczęściej dostaniesz zero wyników, choć na wyspę latają cztery lotniska. Ta rozbieżność między tym, jak ludzie mówią o celu podróży, a tym, co rozumieją systemy rezerwacyjne, to jeden z najciekawszych problemów, jakie musiałem rozwiązać w MeetInPlane. Poniżej opowiadam, jak działa pole "Dokąd?" - bez wykresów i wzorów, ale i bez ściemy.
"Dokąd" to nie nazwa. To zbiór lotnisk
Kluczowa decyzja projektowa brzmi tak: celem podróży nie jest napis, tylko zbiór lotnisk, z których da się tam dotrzeć. Kiedy wybierasz "Sardynia", system nie zapisuje słowa "Sardynia" - zapisuje listę kodów IATA obsługujących wyspę. Kiedy ktoś inny wybierze "Cagliari", jego zbiór zawiera jeden z tych samych kodów. I dlatego wasze podróże się spotkają, mimo że nikt z was nie wpisał tego samego słowa.
To brzmi jak drobiazg, a jest fundamentem. Dopóki cel podróży jest tekstem, "Kreta", "Crete", "Kriti" i "Heraklion" to cztery różne miejsca. Kiedy celem jest zbiór lotnisk, wszystkie cztery są tym samym kierunkiem - i mogą znaleźć się nawzajem. Zbiór lotnisk jest w MeetInPlane walutą dopasowania: tym, co porównuję, licząc, ilu podróżnych wybiera się tam, co Ty.
Miejsca, których nie ma w żadnym rozkładzie lotów
Ludzie nie planują wakacji na lotniskach. Planują je na wyspach, w regionach, w górach i nad jeziorami. Tyle że regiony turystyczne to byty, których świat rezerwacji lotniczych praktycznie nie zna. Żeby je poznać, sięgnąłem po otwartą, geograficzną bazę miejsc - i tu zaczęły się schody, bo świat jest znacznie mniej uporządkowany, niż się wydaje.
Kreta istnieje trzy razy
W bazie geograficznej Kreta ma trzy osobne rekordy: jako wyspa, jako region i jako jednostka administracyjna. Sardynia jest zapisana jako wyspa, ale Sycylia już jako region administracyjny. Ta sama kategoria rzeczy, trzy różne klasyfikacje. Gdybym przepisał dane jeden do jednego, w podpowiedziach zobaczyłbyś "Kreta" trzy razy pod rząd - i nie miałbyś pojęcia, którą wybrać. Dlatego import kanonikalizuje duplikaty: wskazuje jednego zwycięzcę, a pozostałe rekordy tylko na niego wskazują. Do wyszukiwarki trafia wyłącznie zwycięzca.
Alpy nie mają kraju
Rekord Alp ma pustą kolumnę "kraj" i osiem kodów krajów obok: Austria, Szwajcaria, Niemcy, Francja, Włochy, Liechtenstein, Monako, Słowenia. Dla bazy danych, w której kierunek podróży zaczynał się od pytania "jaki kraj?", takie miejsce jest nie do zapisania. To był drugi powód, dla którego przeszedłem na zbiory lotnisk: Alpy nie potrzebują kraju, wystarczy im lista lotnisk. Innsbruck, Grenoble, Zurych, Mediolan. Kraj wyświetlam potem, wyliczając go z lotnisk, a nie z samego miejsca.
Mazury, Masuren, Masuria - jedno miejsce, trzy pisownie
Główna kolumna z nazwą zawiera dokładnie jedną wersję i nigdy nie jest tą, której szukasz. Mazury są tam jako "Mazury", ale Warszawa jako Warsaw, a Kreta jako Crete. Cała reszta - Masuren, Masuria, Warszawa, Warschau, Krakau - leży w osobnym pliku alternatywnych nazw: 742 MB i kilkanaście milionów wierszy. Bez niego polska wyszukiwarka nie znajduje Warszawy, a niemiecka Mazur. Co więcej, sporo z tych nazw nie ma przypisanego języka, więc obok wersji polskiej, angielskiej i niemieckiej trzymam też "pisownię bez języka" - inaczej Masuren zniknęłoby z indeksu. Przy okazji: cała kategoria regionów turystycznych - Toskania, Prowansja, Mazury - to raptem 2580 wierszy na cały świat. Najcenniejszy zbiór w całym pliku jest jednocześnie najtańszy w obsłudze.
Jak z 13 milionów wierszy zrobić osiem podpowiedzi
Źródłowy plik ma 1,7 GB i 13 455 020 wierszy. Twoja podpowiedź ma osiem pozycji. Cała robota polega na tym, żeby po drodze wyrzucić właściwe 13 milionów.
Szum siedzi w wioskach, nie w regionach
Nazw takich jak "Crete", "Sardinia" czy "Alps" są w bazie dziesiątki - to bezludne osady w USA i Indiach. Samych wsi poniżej 200 mieszkańców jest blisko pięć milionów, czyli ponad jedna trzecia pliku. Dlatego import stosuje próg ludności (domyślnie 500 osób), przepuszcza bezwarunkowo stolice i siedziby administracyjne, a szczyty górskie wpuszcza dopiero powyżej 1500 m n.p.m. albo wtedy, gdy mają nazwy w kilku językach - bo to dobry sygnał, że ktoś o nich w ogóle słyszał.
Skąd wiem, które lotniska są najbliżej
Z tej samej bazy, z której biorę nazwy, dostaję też współrzędne geograficzne - szerokość i długość - i to dla każdego rekordu: dla Mazur, dla Zakopanego i dla wszystkich 3274 lotnisk. Mając dwie pary współrzędnych, odległość między nimi liczy się po ortodromie, czyli po najkrótszym łuku na kuli, a nie po linii na płaskiej mapie. Służy do tego klasyczny wzór haversine (ang.) - kilka funkcji trygonometrycznych, które zamieniają różnicę współrzędnych na kilometry i, w przeciwieństwie do naiwnego twierdzenia Pitagorasa, nie rozjeżdżają się na dużych dystansach ani blisko biegunów.
Problem w tym, że policzenie tego "każdy z każdym" to milion miejsc razy 3274 lotniska, czyli 3,3 miliarda operacji. Dlatego lotniska wrzucam najpierw do siatki komórek o boku jednego stopnia, a potem szukam pierścieniami - od komórki, w której leży miejsce, coraz szerzej - i przerywam, gdy nic spoza przeszukanego obszaru nie może już być bliżej niż najlepszy dotychczasowy kandydat. Wynik jest dokładnie taki sam jak przy liczeniu wszystkiego, tylko zamiast 3274 odległości mierzę zwykle kilkanaście, a cała siatka waży jakieś 350 kB.
Jest w tym jedna pułapka, na której łatwo się przejechać: stopień szerokości to zawsze około 111 km, ale stopień długości to 111 km na równiku, 55 km na 60° szerokości i 31 km na wysokości Tromsø. Kto liczy komórki tak samo w obie strony, ten dla Spitsbergenu "znajdzie" lotnisko, które wcale nie jest najbliższe. Stąd cosinus szerokości w kilku miejscach kodu i osobny test dla Longyearbyen.
Każdy typ miejsca ma swój zasięg
Miejsce dostaje lotniska w promieniu zależnym od tego, czym jest: region, wyspa i pasmo górskie sięgają po 150 km, miasto po 60 km, wieś czy jezioro po 30 km. Te liczby nie są kosmetyką. Przy 60 km Warszawa bierze Chopina i Modlin, ale nie bierze Łodzi - i dzięki temu dwie podróże "do Warszawy" naprawdę oznaczają to samo miasto. Gdyby promień był hojniejszy, dopasowania byłyby liczniejsze i bezużyteczne.
Zakopané, Zakopane, zakopane
To, co wpisujesz, i to, co leży w bazie, przechodzą przez dokładnie tę samą normalizację - bez ogonków, bez wielkich liter, bez akcentów. Inaczej francuskie "Zakopané" nie znalazłoby polskiego Zakopanego. Wyszukiwanie działa po przedroście nazwy, więc podpowiedzi pojawiają się już po dwóch znakach, a dokładne trafienie w całą nazwę dostaje premię w rankingu - ale ograniczoną. Nauczyło mnie tego "Krak": to prawdziwa polska nazwa powiatu pod Krakowem i przez chwilę wygrywała z 800-tysięcznym miastem, o które oczywiście chodziło.
Ta sama Warszawa dwa razy to błąd
Podpowiedzi powstają jednocześnie z dwóch indeksów: starszego, zbudowanego z lotnisk, i nowego, geograficznego. Siłą rzeczy się pokrywają. Scalam je i usuwam duplikaty po zbiorze lotnisk: dwie propozycje pokrywające dokładnie te same lotniska to ten sam kierunek, choćby były zapisane inaczej - zostaje lepiej oceniona. Dodatkowo jedna nazwa może wystąpić raz na kraj, żeby lista nie mówiła dwukrotnie "Warszawa". Kreta w Grecji i Crete w Nebrasce zachowują osobne wpisy, bo to faktycznie dwa różne miejsca.
Co to zmienia, gdy planujesz podróż
W praktyce tyle, że możesz wpisać to, co masz w głowie, a nie to, co ma w bazie linia lotnicza. Wpisujesz "Mazury" i widzisz, ilu podróżnych wybiera się tam w Twoim terminie. Wpisujesz "Alpy", a system rozumie, że Innsbruck i Grenoble to ta sama zima. Wpisujesz "Sardynia", a Twoja podróż dopasuje się do kogoś, kto wpisał "Cagliari" - i to jest dokładnie ten moment, dla którego zbudowałem MeetInPlane.
Reszta dzieje się już poza wyszukiwarką: dopasowania pokazuję z czytelnym powodem ("ten sam lot", "to samo miasto w tym samym tygodniu"), nigdy jako procentowy wynik bez uzasadnienia. Powody układają się w pięć kręgów dopasowań, które opisałem osobno. Jeśli w Twoim kierunku i terminie nie ma jeszcze nikogo, możesz zostawić jedno powiadomienie - napiszę raz, gdy ktoś się tam wybierze.
Skąd mam te dane
Baza miejsc pochodzi z GeoNames - otwartej, budowanej społecznościowo bazy geograficznej udostępnianej na licencji CC BY 4.0. Licencja wymaga wskazania źródła, i słusznie: to kilkanaście lat pracy tysięcy ludzi, dzięki której mogę w ogóle wiedzieć, że Mazury to Masuren, a Alpy leżą w ośmiu krajach. Informacja o źródle jest na stałe w stopce każdej strony, a tu dopisuję do niej podziękowania. Warstwa lotnisk, promienie, wagi i cała logika dopasowania są już moje.
Najczęstsze pytania
Czy mogę wyszukiwać po regionie, a nie po mieście?
Tak. Wyspy, regiony, pasma górskie, parki, jeziora i miejscowości działają tak samo jak kraje, miasta i lotniska. Wpisz "Sardynia", "Mazury", "Toskania" albo "Alpy".
Skąd wiadomo, że dwie osoby lecą "w to samo miejsce"?
Z części wspólnej zbiorów lotnisk obu podróży. Jeśli się pokrywają, to ten sam kierunek - niezależnie od tego, jak każdy z was go nazwał.
Czy wyszukiwarka działa po polsku, angielsku i niemiecku?
Tak. Indeks trzyma nazwy w trzech językach obok oryginalnej pisowni, więc "Mazury", "Masuria" i "Masuren" prowadzą do tego samego miejsca.
Czy muszę mieć kupiony bilet?
Nie. Wystarczy kierunek i przybliżony termin - dokładny lot możesz dodać później.
Następnym razem, gdy ktoś zapyta Cię "dokąd lecisz?", odpowiedz tak, jak odpowiadasz zawsze. Resztą - tym, że "tam" to w istocie osiem kodów lotnisk, trzy rekordy Krety i jedno pasmo górskie bez kraju - zajmę się ja. Załóż darmowe konto MeetInPlane i sprawdź, kto wybiera się tam, gdzie Ty.