Nie jest to jeszcze nowa odpowiedź (jak dotąd), ale przedstawia zestaw danych z lotnisk antododalnych, z których ktoś mógłby skorzystać, aby znaleźć lepszą trasę. Czytaj dalej na najbardziej antypodalnych lotniskach i szokująca informacja o trasie Santiago-Xi'an.
Kontynuując tę eksplorację, zwracam się do pracy a3nm, który wcześniej zajmował się wygłupianiem na lotniskach. Korzystając ze wskaźnika do bazy danych OpenFlights (której przypisano cały kredyt za licencję), mogę uzyskać pliki danych dla lotnisk i tras lotniczych na całym świecie.
Najpierw załaduję dane lotniska do tabeli PostgreSQL przy użyciu tej procedury i włączę tabelę do obsługi PostGIS, abyśmy mogli wykonywać obliczenia przestrzenne.
Skonfigurujemy kilka zdrapek, obliczymy antypode dla każdego lotniska i przekonwertujemy go na geometrię (prawdopodobnie jest lepszy sposób, aby to zrobić, jeśli wiesz, co robisz. Typowym tematem jest to, że nie „ t, faktycznie wiem, co robimy):
update airports set antipode_latitude = -latitude;
update airports set antipode_longitude = 180+longitude;
update airports set antipode_longitude = antipode_longitude-360 where antipode_longitude > 180;
update airports SET antipode = ST_SetSRID(ST_MakePoint(antipode_longitude,antipode_latitude),4326);
Zdrowie psychiczne sprawdza wyniki na podstawie tych, o których już wiemy:
select airports.name, city, country, iata, ST_Distance_Sphere(airports.antipode, (select airports.geom from airports where iata='SCL')) as distance from airports order by distance limit 3;
Ankang Airport Ankang China AKA 80599.02914563
Xi\\'An Xiguan Xi\\'AN China SIA 109730.42018116
Xianyang Xi'an China XIY **124745.39283865**
O nie! Rozkoszowaliśmy się niszczycielską prawdą o mojej poprzedniej odpowiedzi. SCL-XIY jest w rzeczywistości o 24 km za daleko, żeby się dokładnie zakwalifikować. Prawdopodobnie można to naprawić, rozpoczynając podróż nieco dalej do Santiago lub Xi'an i wybierając jakiś autobus lotniskowy (który będziesz miał mnóstwo czasu, jeśli wybierzesz się na 72-godzinną podróż w obie strony), ale jest to smutne odkrycie.
select airports.name, city, country, iata, ST_Distance_Sphere(airports.antipode, (select airports.geom from airports where iata='AKL')) as distance from airports order by distance limit 5;
Ronda Airport Ronda Spain RRA 28932.88795948
Ronda Ronda Spain 30772.20555266
Moron Ab Sevilla Spain OZP 40636.98417791
Malaga Malaga Spain AGP 73182.10790714
Sevilla Sevilla Spain SVQ 75861.92508438
Dobra wiadomość jest taka, że wyniki wydają się rozsądne. Teraz możemy znaleźć najbardziej antypodalne lotniska, bo dlaczego nie? Kontynuujmy nasz głupi sposób korzystania z bazy danych, ponieważ jest to nieco łatwiejsze i stwórz zduplikowaną tabelę scratch, abyśmy mogli uruchomić zapytanie w dwóch tabelach. Ograniczymy również wyszukiwanie do lotnisk z kodami IATA, aby wykluczyć większość losowych stacji kolejowych w zbiorze danych i dać nam najlepszą szansę na znalezienie lotnisk z łatwą do znalezienia usługą komercyjną:
create table airports2 (like airports including all);
insert into airports2 select * from airports;
select airports.name, airports.city, airports.country, airports.iata, airports2.name, airports2.city, airports2.country, airports2.iata, st_distance_sphere(airports.antipode, airports2.geom) as distance from airports, airports2 where airports.geom && ST_Expand(airports2.antipode, 25) and airports.iata <> '' and airports2.iata <> '' order by ST_DISTANCE(airports.geom, airports2.antipode) asc limit 1;
Sultan Mahmud Badaruddin Ii Palembang Indonesia PLM Benito Salas Neiva Colombia NVA 5810.60702928
I rzeczywiście, PLM i NVA są dość blisko:
Jeśli jesteś ciekawy i wiem, że tak, PLM i NVA nadal wygrywają, nawet jeśli usuniesz ograniczenie, że lotniska mają kody IATA.
Teraz zapytamy o wszystkie lotniska antypodalne (z kodami IATA) w zasięgu 100 km, skracamy każdy inny wpis, ponieważ są one parami dopasowanymi, i tworzymy plik danych z listą 366 kandydujących par miast do zbadania. Możemy również zrobić nieco większy zestaw, jeśli rozluźnimy włosy o długości 100 km i postaramy się, że zawsze możemy trochę przejść, jeśli nic więcej.
select airports.name, airports.city, airports.country, airports.iata, airports2.name, airports2.city, airports2.country, airports2.iata, st_distance_sphere(airports.antipode, airports2.geom) as error from airports, airports2 where airports.geom && ST_Expand(airports2.antipode, 25) and airports.iata <> '' and airports2.iata <> '' order by ST_DISTANCE_sphere(airports.antipode, airports2.geom) asc limit 1000;
W naszej kolejnej części zobaczymy, czy uda nam się znaleźć szybszą trasę.