commit 379079204008384dd98e8f4934f305077e36579f Author: Trey t Date: Wed Apr 8 15:01:07 2026 -0500 Initial commit: Flights iOS app Flight search app built on FlightConnections.com API data. Features: airport search with autocomplete, browse by country/state/map, flight schedules by route and date, multi-airline support with per-airline schedule loading. Includes 4,561-airport GPS database for map browsing. Adaptive light/dark mode UI inspired by Flighty. Co-Authored-By: Claude Opus 4.6 (1M context) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0c520e --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Xcode +build/ +DerivedData/ +*.xcuserdata +*.xcworkspace/xcuserdata/ +xcuserdata/ +*.xccheckout +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +# Xcode Scheme +*.xcscheme + +# Swift Package Manager +.build/ +Packages/ +Package.pins +Package.resolved +*.workspace/xcshareddata/swiftpm/ + +# CocoaPods +Pods/ + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# HAR files (large network captures) +*.har + +# APK files +apps/ + +# Claude +.claude/ diff --git a/Flights.xcodeproj/project.pbxproj b/Flights.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3803c2a --- /dev/null +++ b/Flights.xcodeproj/project.pbxproj @@ -0,0 +1,394 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 019A3D900D1B4145AB87B9F7 /* MapAirport.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AC05BFDFDE4A94B360EB05 /* MapAirport.swift */; }; + 0E02E6501AA249229BBC335A /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFE025789164A779FC980B0 /* Route.swift */; }; + 1FA279998CFB44949B4188FE /* FlightService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A65682BD902141BAA686D101 /* FlightService.swift */; }; + 2C3FF395E0724FA5A6E33C3A /* FlightScheduleRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9640481120A418EBCD3CE73 /* FlightScheduleRow.swift */; }; + 303821C9668A44F38FFA02CA /* AirportSearchField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CD303E3EDCC4BF2BCF31722 /* AirportSearchField.swift */; }; + 35D016EBA93C40BB873AB304 /* Airline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04AC23D8748D42C9A7115FAC /* Airline.swift */; }; + 4C770C55CB3643BAB7B9D622 /* AirportBrowserSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15676B4BD35745D1BD1DC947 /* AirportBrowserSheet.swift */; }; + 57A463AB3CFD44DC93444E59 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9934B0FCA757403A94AB963C /* ContentView.swift */; }; + 61F8E3DD7D434DA7854C20E2 /* FlightsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6D822B4ABF741F890A4400C /* FlightsApp.swift */; }; + 6558A31ADEC740FC8C56EA22 /* FlightSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B913D04A4E51436595308A21 /* FlightSchedule.swift */; }; + 7FFD9A2D25F9421D8929C027 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36862683C4F44A95AFE234EB /* SearchViewModel.swift */; }; + 80D2BC95002A4931B3C10B4C /* airports.json in Resources */ = {isa = PBXBuildFile; fileRef = 53F457716F0642BDBCBA93EA /* airports.json */; }; + 9C1300E497B049FE8DA677E0 /* RouteDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434DEB1EB08F4F0CBCB91266 /* RouteDetailViewModel.swift */; }; + BADBC95A6A6D4267A01DA898 /* AirportDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58C339D6084657B0538E9C /* AirportDatabase.swift */; }; + BB3E647E4A07477F9F37E607 /* RouteDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C1176F877BF496ABF079040 /* RouteDetailView.swift */; }; + C36C490556254AC88EC02C80 /* DestinationsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEAC0EBABFD41569FE69B1B /* DestinationsViewModel.swift */; }; + C7191E4E1AF84FECAD27CEC9 /* Country.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7987BD4832D44F1A0851933 /* Country.swift */; }; + D0EC717347974D668C77B9D2 /* DestinationsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 300153508F8445B6A78CEC52 /* DestinationsListView.swift */; }; + E41FC265B0994D2ABC4DDE67 /* Airport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85EC89DEE12942B49DF51984 /* Airport.swift */; }; + F79789179F4443FD859BDEF0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D9E26DCDE2904210ABCA7855 /* Assets.xcassets */; }; + FD853F72EE724922B0E4E235 /* AirportMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C2EB471F011450DA7BBEFAD /* AirportMapView.swift */; }; + FF74A792115C414CA9AB5B36 /* BrowseAirport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4944338B20BA4AB98F05D4F7 /* BrowseAirport.swift */; }; + AA1111111111111111111111 /* FlightTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2222222222222222222222 /* FlightTheme.swift */; }; + AA3333333333333333333333 /* RouteVisualization.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA4444444444444444444444 /* RouteVisualization.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 04AC23D8748D42C9A7115FAC /* Airline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Airline.swift; sourceTree = ""; }; + 0CD303E3EDCC4BF2BCF31722 /* AirportSearchField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportSearchField.swift; sourceTree = ""; }; + 0EFE025789164A779FC980B0 /* Route.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Route.swift; sourceTree = ""; }; + 15676B4BD35745D1BD1DC947 /* AirportBrowserSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportBrowserSheet.swift; sourceTree = ""; }; + 1C1176F877BF496ABF079040 /* RouteDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteDetailView.swift; sourceTree = ""; }; + 300153508F8445B6A78CEC52 /* DestinationsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DestinationsListView.swift; sourceTree = ""; }; + 36862683C4F44A95AFE234EB /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; + 434DEB1EB08F4F0CBCB91266 /* RouteDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteDetailViewModel.swift; sourceTree = ""; }; + 4944338B20BA4AB98F05D4F7 /* BrowseAirport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseAirport.swift; sourceTree = ""; }; + 53F457716F0642BDBCBA93EA /* airports.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = airports.json; sourceTree = ""; }; + 7C2EB471F011450DA7BBEFAD /* AirportMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportMapView.swift; sourceTree = ""; }; + 85EC89DEE12942B49DF51984 /* Airport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Airport.swift; sourceTree = ""; }; + 8A3CB0CCC2524542AFB0D1D2 /* Flights.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flights.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9934B0FCA757403A94AB963C /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 9A58C339D6084657B0538E9C /* AirportDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportDatabase.swift; sourceTree = ""; }; + 9BEAC0EBABFD41569FE69B1B /* DestinationsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DestinationsViewModel.swift; sourceTree = ""; }; + A65682BD902141BAA686D101 /* FlightService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightService.swift; sourceTree = ""; }; + B913D04A4E51436595308A21 /* FlightSchedule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightSchedule.swift; sourceTree = ""; }; + D9E26DCDE2904210ABCA7855 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E1AC05BFDFDE4A94B360EB05 /* MapAirport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapAirport.swift; sourceTree = ""; }; + E6D822B4ABF741F890A4400C /* FlightsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightsApp.swift; sourceTree = ""; }; + E7987BD4832D44F1A0851933 /* Country.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Country.swift; sourceTree = ""; }; + F9640481120A418EBCD3CE73 /* FlightScheduleRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightScheduleRow.swift; sourceTree = ""; }; + AA2222222222222222222222 /* FlightTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlightTheme.swift; sourceTree = ""; }; + AA4444444444444444444444 /* RouteVisualization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteVisualization.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + EB782B062CA144E2972778DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1B20C5393D8F432A93097C2C /* Views */ = { + isa = PBXGroup; + children = ( + 9934B0FCA757403A94AB963C /* ContentView.swift */, + 0CD303E3EDCC4BF2BCF31722 /* AirportSearchField.swift */, + 300153508F8445B6A78CEC52 /* DestinationsListView.swift */, + 1C1176F877BF496ABF079040 /* RouteDetailView.swift */, + F9640481120A418EBCD3CE73 /* FlightScheduleRow.swift */, + 7C2EB471F011450DA7BBEFAD /* AirportMapView.swift */, + 15676B4BD35745D1BD1DC947 /* AirportBrowserSheet.swift */, + AA5555555555555555555555 /* Styles */, + AA6666666666666666666666 /* Components */, + ); + path = Views; + sourceTree = ""; + }; + AA5555555555555555555555 /* Styles */ = { + isa = PBXGroup; + children = ( + AA2222222222222222222222 /* FlightTheme.swift */, + ); + path = Styles; + sourceTree = ""; + }; + AA6666666666666666666666 /* Components */ = { + isa = PBXGroup; + children = ( + AA4444444444444444444444 /* RouteVisualization.swift */, + ); + path = Components; + sourceTree = ""; + }; + 1D5A2C06B99046F3934D2E59 /* Flights */ = { + isa = PBXGroup; + children = ( + E6D822B4ABF741F890A4400C /* FlightsApp.swift */, + F35FEFCEEAC24D248AC81678 /* Models */, + B6019ED81F39462B92BDC856 /* Services */, + 6E94DB5F9EB345948E2D5E2A /* ViewModels */, + 1B20C5393D8F432A93097C2C /* Views */, + D9E26DCDE2904210ABCA7855 /* Assets.xcassets */, + 53F457716F0642BDBCBA93EA /* airports.json */, + ); + path = Flights; + sourceTree = ""; + }; + 517CC07B82D949359C6CD4F5 /* Products */ = { + isa = PBXGroup; + children = ( + 8A3CB0CCC2524542AFB0D1D2 /* Flights.app */, + ); + name = Products; + sourceTree = ""; + }; + 6E94DB5F9EB345948E2D5E2A /* ViewModels */ = { + isa = PBXGroup; + children = ( + 36862683C4F44A95AFE234EB /* SearchViewModel.swift */, + 9BEAC0EBABFD41569FE69B1B /* DestinationsViewModel.swift */, + 434DEB1EB08F4F0CBCB91266 /* RouteDetailViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + B6019ED81F39462B92BDC856 /* Services */ = { + isa = PBXGroup; + children = ( + A65682BD902141BAA686D101 /* FlightService.swift */, + 9A58C339D6084657B0538E9C /* AirportDatabase.swift */, + ); + path = Services; + sourceTree = ""; + }; + EDB9BC1CC7104FB58C275091 = { + isa = PBXGroup; + children = ( + 1D5A2C06B99046F3934D2E59 /* Flights */, + 517CC07B82D949359C6CD4F5 /* Products */, + ); + sourceTree = ""; + }; + F35FEFCEEAC24D248AC81678 /* Models */ = { + isa = PBXGroup; + children = ( + 85EC89DEE12942B49DF51984 /* Airport.swift */, + 04AC23D8748D42C9A7115FAC /* Airline.swift */, + 0EFE025789164A779FC980B0 /* Route.swift */, + B913D04A4E51436595308A21 /* FlightSchedule.swift */, + E1AC05BFDFDE4A94B360EB05 /* MapAirport.swift */, + 4944338B20BA4AB98F05D4F7 /* BrowseAirport.swift */, + E7987BD4832D44F1A0851933 /* Country.swift */, + ); + path = Models; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E373C48C497D48D388BF7657 /* Flights */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E22AD8D30AA4AF593618EDA /* Build configuration list for PBXNativeTarget "Flights" */; + buildPhases = ( + A5535283EA784250AAF50064 /* Sources */, + EB782B062CA144E2972778DE /* Frameworks */, + 6B9FCA84AAAA44529A95D7AC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Flights; + productName = Flights; + productReference = 8A3CB0CCC2524542AFB0D1D2 /* Flights.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5418BEEAEFF644ADA7240CEA /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1540; + LastUpgradeCheck = 1540; + }; + buildConfigurationList = AD1FB003D80641D59E37D6A0 /* Build configuration list for PBXProject "Flights" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = EDB9BC1CC7104FB58C275091; + productRefGroup = 517CC07B82D949359C6CD4F5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E373C48C497D48D388BF7657 /* Flights */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6B9FCA84AAAA44529A95D7AC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F79789179F4443FD859BDEF0 /* Assets.xcassets in Resources */, + 80D2BC95002A4931B3C10B4C /* airports.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A5535283EA784250AAF50064 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 61F8E3DD7D434DA7854C20E2 /* FlightsApp.swift in Sources */, + E41FC265B0994D2ABC4DDE67 /* Airport.swift in Sources */, + 35D016EBA93C40BB873AB304 /* Airline.swift in Sources */, + 0E02E6501AA249229BBC335A /* Route.swift in Sources */, + 6558A31ADEC740FC8C56EA22 /* FlightSchedule.swift in Sources */, + 1FA279998CFB44949B4188FE /* FlightService.swift in Sources */, + 7FFD9A2D25F9421D8929C027 /* SearchViewModel.swift in Sources */, + C36C490556254AC88EC02C80 /* DestinationsViewModel.swift in Sources */, + 9C1300E497B049FE8DA677E0 /* RouteDetailViewModel.swift in Sources */, + 57A463AB3CFD44DC93444E59 /* ContentView.swift in Sources */, + 303821C9668A44F38FFA02CA /* AirportSearchField.swift in Sources */, + D0EC717347974D668C77B9D2 /* DestinationsListView.swift in Sources */, + BB3E647E4A07477F9F37E607 /* RouteDetailView.swift in Sources */, + 2C3FF395E0724FA5A6E33C3A /* FlightScheduleRow.swift in Sources */, + C7191E4E1AF84FECAD27CEC9 /* Country.swift in Sources */, + FF74A792115C414CA9AB5B36 /* BrowseAirport.swift in Sources */, + 4C770C55CB3643BAB7B9D622 /* AirportBrowserSheet.swift in Sources */, + 019A3D900D1B4145AB87B9F7 /* MapAirport.swift in Sources */, + BADBC95A6A6D4267A01DA898 /* AirportDatabase.swift in Sources */, + FD853F72EE724922B0E4E235 /* AirportMapView.swift in Sources */, + AA1111111111111111111111 /* FlightTheme.swift in Sources */, + AA3333333333333333333333 /* RouteVisualization.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1A8450A5FFF54054AB64D72A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = V3PF3M6B6U; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.flights.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 2013CC286F244D4EB2F6844E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = V3PF3M6B6U; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.flights.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 586CEED6298F48F5A36032EC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CE9F5DD65F2043CB9B39FC35 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2E22AD8D30AA4AF593618EDA /* Build configuration list for PBXNativeTarget "Flights" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2013CC286F244D4EB2F6844E /* Debug */, + 1A8450A5FFF54054AB64D72A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AD1FB003D80641D59E37D6A0 /* Build configuration list for PBXProject "Flights" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CE9F5DD65F2043CB9B39FC35 /* Debug */, + 586CEED6298F48F5A36032EC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5418BEEAEFF644ADA7240CEA /* Project object */; +} diff --git a/Flights/Assets.xcassets/AccentColor.colorset/Contents.json b/Flights/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Flights/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Flights/Assets.xcassets/AppIcon.appiconset/Contents.json b/Flights/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..8edf56e --- /dev/null +++ b/Flights/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "app-icon-1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Flights/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/Flights/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png new file mode 100644 index 0000000..f6d65e2 Binary files /dev/null and b/Flights/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png differ diff --git a/Flights/Assets.xcassets/Contents.json b/Flights/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Flights/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Flights/FlightsApp.swift b/Flights/FlightsApp.swift new file mode 100644 index 0000000..9704cee --- /dev/null +++ b/Flights/FlightsApp.swift @@ -0,0 +1,13 @@ +import SwiftUI + +@main +struct FlightsApp: App { + let service = FlightService() + let database = AirportDatabase() + + var body: some Scene { + WindowGroup { + ContentView(service: service, database: database) + } + } +} diff --git a/Flights/Models/Airline.swift b/Flights/Models/Airline.swift new file mode 100644 index 0000000..5ae9b66 --- /dev/null +++ b/Flights/Models/Airline.swift @@ -0,0 +1,12 @@ +import Foundation + +struct Airline: Identifiable, Hashable, Sendable { + let id: String + let name: String + let iata: String + let logoFilename: String + + var logoURL: URL? { + URL(string: "https://cdn.flightconnections.com/img/airlines_sq/\(logoFilename)") + } +} diff --git a/Flights/Models/Airport.swift b/Flights/Models/Airport.swift new file mode 100644 index 0000000..e17d3f3 --- /dev/null +++ b/Flights/Models/Airport.swift @@ -0,0 +1,9 @@ +import Foundation + +struct Airport: Identifiable, Hashable, Sendable { + let id: String + let iata: String + let name: String + var countryCode: String = "" + var country: String = "" +} diff --git a/Flights/Models/BrowseAirport.swift b/Flights/Models/BrowseAirport.swift new file mode 100644 index 0000000..82885d5 --- /dev/null +++ b/Flights/Models/BrowseAirport.swift @@ -0,0 +1,7 @@ +import Foundation + +struct BrowseAirport: Identifiable, Hashable, Sendable { + let id: String // IATA code "DFW" + let iata: String // "DFW" + let city: String // "Dallas-Fort Worth" +} diff --git a/Flights/Models/Country.swift b/Flights/Models/Country.swift new file mode 100644 index 0000000..934275e --- /dev/null +++ b/Flights/Models/Country.swift @@ -0,0 +1,7 @@ +import Foundation + +struct Country: Identifiable, Hashable, Sendable { + let id: String // Country code "US" + let name: String // "United States" + let slug: String // "united-states" +} diff --git a/Flights/Models/FlightSchedule.swift b/Flights/Models/FlightSchedule.swift new file mode 100644 index 0000000..d9734c4 --- /dev/null +++ b/Flights/Models/FlightSchedule.swift @@ -0,0 +1,33 @@ +import Foundation + +struct FlightSchedule: Identifiable, Sendable { + let id = UUID() + let airline: Airline + let flightNumber: String + let aircraft: String + let aircraftId: String + let departureTime: String + let arrivalTime: String + let dateFrom: Date + let dateTo: Date + let daysOfWeek: Set + let cabinClasses: CabinClass + + func operatesOn(date: Date) -> Bool { + var utc = Calendar(identifier: .gregorian) + utc.timeZone = TimeZone(identifier: "UTC")! + + let fromDay = utc.startOfDay(for: dateFrom) + let toDay = utc.startOfDay(for: dateTo) + + // Normalize the input date to UTC noon to avoid timezone boundary issues + let components = Calendar.current.dateComponents([.year, .month, .day], from: date) + guard let normalizedDate = utc.date(from: components) else { return false } + + guard normalizedDate >= fromDay, normalizedDate <= toDay else { return false } + + // Use the local calendar for weekday since the user picked the date locally + let weekday = Calendar.current.component(.weekday, from: date) + return daysOfWeek.contains(weekday) + } +} diff --git a/Flights/Models/MapAirport.swift b/Flights/Models/MapAirport.swift new file mode 100644 index 0000000..899c16f --- /dev/null +++ b/Flights/Models/MapAirport.swift @@ -0,0 +1,17 @@ +import Foundation +import CoreLocation + +struct MapAirport: Codable, Identifiable, Hashable, Sendable { + let iata: String + let name: String + let country: String + let region: String // ISO region e.g. "US-TX" + let lat: Double + let lng: Double + + var id: String { iata } + + var coordinate: CLLocationCoordinate2D { + CLLocationCoordinate2D(latitude: lat, longitude: lng) + } +} diff --git a/Flights/Models/Route.swift b/Flights/Models/Route.swift new file mode 100644 index 0000000..fc90217 --- /dev/null +++ b/Flights/Models/Route.swift @@ -0,0 +1,62 @@ +import Foundation + +struct CabinClass: OptionSet, Hashable, Sendable { + let rawValue: Int + + static let economy = CabinClass(rawValue: 1 << 0) + static let premiumEcon = CabinClass(rawValue: 1 << 1) + static let business = CabinClass(rawValue: 1 << 2) + static let first = CabinClass(rawValue: 1 << 3) + + /// Parse from validity.php "classes" string like "0111". + /// Position 0 = First, 1 = Business, 2 = PremEcon, 3 = Economy. + static func from(classesString: String) -> CabinClass { + var result = CabinClass() + let chars = Array(classesString) + guard chars.count >= 4 else { return result } + if chars[0] == "1" { result.insert(.first) } + if chars[1] == "1" { result.insert(.business) } + if chars[2] == "1" { result.insert(.premiumEcon) } + if chars[3] == "1" { result.insert(.economy) } + return result + } + + /// Parse from rt.json `clss` bitmask integer. + /// Bit mapping: 1 = economy, 2 = premEcon, 4 = business, 8 = first. + static func from(bitmask: Int) -> CabinClass { + CabinClass(rawValue: bitmask) + } + + var labels: [String] { + var result: [String] = [] + if contains(.first) { result.append("F") } + if contains(.business) { result.append("J") } + if contains(.premiumEcon) { result.append("W") } + if contains(.economy) { result.append("Y") } + return result + } +} + +struct Route: Identifiable, Hashable, Sendable { + var id: String { destinationAirport.id } + let destinationAirport: Airport + let durationMinutes: Int + let distanceMiles: Int + let monthsBitmask: Int + let cabinClasses: CabinClass + let latitude: Double + let longitude: Double + + func availableIn(month: Int) -> Bool { + guard month >= 1, month <= 12 else { return false } + return monthsBitmask & (1 << (month - 1)) != 0 + } +} + +struct RouteAirline: Identifiable, Sendable { + var id: String { airline.id } + let airline: Airline + let distanceMiles: Int + let durationMinutes: Int + let monthsBitmask: Int +} diff --git a/Flights/Services/AirportDatabase.swift b/Flights/Services/AirportDatabase.swift new file mode 100644 index 0000000..f6f3047 --- /dev/null +++ b/Flights/Services/AirportDatabase.swift @@ -0,0 +1,108 @@ +import Foundation +import MapKit + +final class AirportDatabase: Sendable { + let airports: [MapAirport] + private let regionNames: [String: String] // "US-TX" -> "Texas" + + init() { + guard let url = Bundle.main.url(forResource: "airports", withExtension: "json"), + let data = try? Data(contentsOf: url), + let decoded = try? JSONDecoder().decode([MapAirport].self, from: data) + else { + airports = [] + regionNames = [:] + return + } + airports = decoded + regionNames = Self.buildRegionNames() + } + + /// Returns airports within the given map region, capped at `limit` for performance. + func airports(in region: MKCoordinateRegion, limit: Int = 200) -> [MapAirport] { + let centerLat = region.center.latitude + let centerLng = region.center.longitude + let latDelta = region.span.latitudeDelta / 2 + let lngDelta = region.span.longitudeDelta / 2 + + let minLat = centerLat - latDelta + let maxLat = centerLat + latDelta + let minLng = centerLng - lngDelta + let maxLng = centerLng + lngDelta + + var result: [MapAirport] = [] + for airport in airports { + guard airport.lat >= minLat, airport.lat <= maxLat else { continue } + + if minLng <= maxLng { + guard airport.lng >= minLng, airport.lng <= maxLng else { continue } + } else { + guard airport.lng >= minLng || airport.lng <= maxLng else { continue } + } + + result.append(airport) + if result.count >= limit { break } + } + + return result + } + + /// Search airports by region/state name (e.g. "Texas" -> all US-TX airports). + /// Returns matching region name and airports, or nil if no match. + func searchByRegion(term: String) -> (regionName: String, airports: [MapAirport])? { + let lowered = term.lowercased().trimmingCharacters(in: .whitespacesAndNewlines) + guard lowered.count >= 3 else { return nil } + + // Find matching region + var matchedCode: String? + var matchedName: String? + + for (code, name) in regionNames { + if name.lowercased().hasPrefix(lowered) || name.lowercased() == lowered { + matchedCode = code + matchedName = name + break + } + } + + guard let code = matchedCode, let name = matchedName else { return nil } + + let results = airports.filter { $0.region == code } + .sorted { $0.name.localizedCompare($1.name) == .orderedAscending } + + guard !results.isEmpty else { return nil } + return (regionName: name, airports: results) + } + + private static func buildRegionNames() -> [String: String] { + // US states + territories + var names: [String: String] = [ + "US-AL": "Alabama", "US-AK": "Alaska", "US-AZ": "Arizona", "US-AR": "Arkansas", + "US-CA": "California", "US-CO": "Colorado", "US-CT": "Connecticut", "US-DE": "Delaware", + "US-FL": "Florida", "US-GA": "Georgia", "US-HI": "Hawaii", "US-ID": "Idaho", + "US-IL": "Illinois", "US-IN": "Indiana", "US-IA": "Iowa", "US-KS": "Kansas", + "US-KY": "Kentucky", "US-LA": "Louisiana", "US-ME": "Maine", "US-MD": "Maryland", + "US-MA": "Massachusetts", "US-MI": "Michigan", "US-MN": "Minnesota", "US-MS": "Mississippi", + "US-MO": "Missouri", "US-MT": "Montana", "US-NE": "Nebraska", "US-NV": "Nevada", + "US-NH": "New Hampshire", "US-NJ": "New Jersey", "US-NM": "New Mexico", "US-NY": "New York", + "US-NC": "North Carolina", "US-ND": "North Dakota", "US-OH": "Ohio", "US-OK": "Oklahoma", + "US-OR": "Oregon", "US-PA": "Pennsylvania", "US-RI": "Rhode Island", "US-SC": "South Carolina", + "US-SD": "South Dakota", "US-TN": "Tennessee", "US-TX": "Texas", "US-UT": "Utah", + "US-VT": "Vermont", "US-VA": "Virginia", "US-WA": "Washington", "US-WV": "West Virginia", + "US-WI": "Wisconsin", "US-WY": "Wyoming", "US-DC": "District of Columbia", + "US-PR": "Puerto Rico", "US-VI": "U.S. Virgin Islands", "US-GU": "Guam", + "US-AS": "American Samoa", + // Canadian provinces + "CA-AB": "Alberta", "CA-BC": "British Columbia", "CA-MB": "Manitoba", + "CA-NB": "New Brunswick", "CA-NL": "Newfoundland and Labrador", + "CA-NS": "Nova Scotia", "CA-NT": "Northwest Territories", "CA-NU": "Nunavut", + "CA-ON": "Ontario", "CA-PE": "Prince Edward Island", "CA-QC": "Quebec", + "CA-SK": "Saskatchewan", "CA-YT": "Yukon", + // Australian states + "AU-NSW": "New South Wales", "AU-VIC": "Victoria", "AU-QLD": "Queensland", + "AU-WA": "Western Australia", "AU-SA": "South Australia", "AU-TAS": "Tasmania", + "AU-NT": "Northern Territory", "AU-ACT": "Australian Capital Territory", + ] + return names + } +} diff --git a/Flights/Services/FlightService.swift b/Flights/Services/FlightService.swift new file mode 100644 index 0000000..224be41 --- /dev/null +++ b/Flights/Services/FlightService.swift @@ -0,0 +1,507 @@ +import Foundation + +actor FlightService { + + // MARK: - Configuration + + private let session: URLSession + private let baseURL = "https://www.flightconnections.com" + + private static let userAgent = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" + + private var cachedCountries: [Country]? + private var cachedAirportsByCountry: [String: [BrowseAirport]] = [:] + + init(session: URLSession = .shared) { + self.session = session + } + + // MARK: - Public API + + /// Search airports by term (autocomplete). + func searchAirports(term: String) async throws -> [Airport] { + let results = try await searchAll(term: term) + return results.airports + } + + /// Search airports, countries, and continents by term. + func searchAll(term: String) async throws -> AutocompleteResults { + guard let encoded = term.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), + let url = URL(string: "\(baseURL)/autocomplete_location.php?lang=en&term=\(encoded)") + else { throw FlightServiceError.invalidURL } + + let request = makeRequest(url: url) + let data = try await perform(request) + let json = try parseJSON(data) + + guard let dict = json as? [String: Any] else { + return AutocompleteResults(airports: [], countries: []) + } + + let airportEntries = dict["airports"] as? [[String: Any]] ?? [] + let airports: [Airport] = airportEntries.compactMap { entry in + guard let value = entry["value"] as? String, + let id = entry["id"] as? String + else { return nil } + + let parts = value.split(separator: " - ", maxSplits: 1) + guard parts.count == 2 else { return nil } + + let iata = String(parts[0]).trimmingCharacters(in: .whitespaces) + let name = String(parts[1]).trimmingCharacters(in: .whitespaces) + return Airport(id: id, iata: iata, name: name) + } + + let countryEntries = dict["countries"] as? [[String: Any]] ?? [] + let countries: [Country] = countryEntries.compactMap { entry in + guard let name = entry["name"] as? String, + let code = entry["code"] as? String + else { return nil } + let slug = name.lowercased().replacingOccurrences(of: " ", with: "-") + return Country(id: code, name: name, slug: slug) + } + + return AutocompleteResults(airports: airports, countries: countries) + } + + /// Fetch all nonstop destinations from a given airport. + func destinations(for airportId: String) async throws -> [Route] { + guard let url = URL(string: "\(baseURL)/rt\(airportId).json") else { + throw FlightServiceError.invalidURL + } + + let request = makeRequest(url: url) + let data = try await perform(request) + let json = try parseJSON(data) + + guard let dict = json as? [String: Any], + let pts = dict["pts"] as? [Int], + let crd = dict["crd"] as? [Double], + let mths = dict["mths"] as? [Int], + let clss = dict["clss"] as? [Int], + let lst = dict["lst"] as? [[Any]] + else { throw FlightServiceError.invalidResponse } + + // pts[0] is origin; lst[i] maps to pts[i+1] + var routes: [Route] = [] + for (i, item) in lst.enumerated() { + guard item.count >= 7, + let iata = item[0] as? String, + let city = item[1] as? String, + let countryCode = item[2] as? String, + let country = item[3] as? String + else { continue } + + let durationStr = item[4] as? String ?? "\(item[4])" + let distanceStr = item[5] as? String ?? "\(item[5])" + let stopIndicator = item[6] as? String ?? "\(item[6])" + + let duration = Int(durationStr) ?? 0 + let distance = Int(distanceStr) ?? 0 + + let ptsIndex = i + 1 + let destId = ptsIndex < pts.count ? String(pts[ptsIndex]) : "" + let monthBitmask = ptsIndex < mths.count ? mths[ptsIndex] : 0 + let cabinBitmask = i < clss.count ? clss[i] : 0 + + let crdIndex = 2 * (i + 1) + let lat = crdIndex < crd.count ? crd[crdIndex] : 0 + let lng = (crdIndex + 1) < crd.count ? crd[crdIndex + 1] : 0 + + let airport = Airport( + id: destId, + iata: iata, + name: city, + countryCode: countryCode, + country: country + ) + + routes.append(Route( + destinationAirport: airport, + durationMinutes: duration, + distanceMiles: distance, + monthsBitmask: monthBitmask, + cabinClasses: .from(bitmask: cabinBitmask), + latitude: lat, + longitude: lng + )) + } + + return routes + } + + /// Fetch airlines operating a specific route. + func airlines(from depId: String, to desId: String) async throws -> [RouteAirline] { + guard let url = URL(string: "\(baseURL)/rt\(depId)_\(desId).json") else { + throw FlightServiceError.invalidURL + } + + let request = makeRequest(url: url) + let data = try await perform(request) + let json = try parseJSON(data) + + guard let dict = json as? [String: Any], + let dataArray = dict["data"] as? [[String: Any]] + else { throw FlightServiceError.invalidResponse } + + return dataArray.compactMap { entry in + guard let routeArray = entry["route"] as? [Any], + routeArray.count >= 5, + let dist = entry["dist"] as? Int, + let dur = entry["dur"] as? Int, + let mths = entry["mths"] as? Int + else { return nil } + + let airlineIdRaw = routeArray[0] + let airlineId: String + if let intId = airlineIdRaw as? Int { + airlineId = String(intId) + } else if let strId = airlineIdRaw as? String { + airlineId = strId + } else { + return nil + } + + guard let name = routeArray[2] as? String, + let logoFilename = routeArray[3] as? String, + let iata = routeArray[4] as? String + else { return nil } + + let airline = Airline( + id: airlineId, + name: name, + iata: iata, + logoFilename: logoFilename + ) + + return RouteAirline( + airline: airline, + distanceMiles: dist, + durationMinutes: dur, + monthsBitmask: mths + ) + } + } + + /// Fetch flight schedules for a specific airline on a route. + func schedules( + dep depId: String, + des desId: String, + airlineId: String, + airline: Airline + ) async throws -> [FlightSchedule] { + guard let url = URL(string: "\(baseURL)/validity.php") else { + throw FlightServiceError.invalidURL + } + + let calendar = Calendar.current + let currentYear = calendar.component(.year, from: Date()) + let nextYear = currentYear + 1 + + var request = makeRequest(url: url) + request.httpMethod = "POST" + request.setValue( + "application/x-www-form-urlencoded; charset=UTF-8", + forHTTPHeaderField: "Content-Type" + ) + + let body = "dep=\(depId)&des=\(desId)&id=\(airlineId)&startDate=\(currentYear)&endDate=\(nextYear)&lang=en" + request.httpBody = body.data(using: .utf8) + + let data = try await perform(request) + let json = try parseJSON(data) + + guard let dict = json as? [String: Any], + let flights = dict["flights"] as? [[String: Any]] + else { return [] } + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + dateFormatter.locale = Locale(identifier: "en_US_POSIX") + dateFormatter.timeZone = TimeZone(identifier: "UTC") + + let dayKeys: [(String, Int)] = [ + ("su", 1), ("mo", 2), ("tu", 3), ("we", 4), + ("th", 5), ("fr", 6), ("sa", 7) + ] + + return flights.compactMap { flight in + guard let rawFlightNumber = flight["flightnumber"] as? String, + let aircraft = flight["aircraft"] as? String, + let deptime = flight["deptime"] as? String, + let destime = flight["destime"] as? String, + let dateFromStr = flight["datefrom"] as? String, + let dateToStr = flight["dateto"] as? String, + let dateFrom = dateFormatter.date(from: dateFromStr), + let dateTo = dateFormatter.date(from: dateToStr) + else { return nil } + + let flightNumber = rawFlightNumber + .split(separator: " ") + .joined(separator: " ") + .trimmingCharacters(in: .whitespaces) + + let acId: String + if let idVal = flight["ac_id"] { + acId = "\(idVal)" + } else { + acId = "" + } + + var days = Set() + for (key, weekday) in dayKeys { + if let val = flight[key] as? String, val == "1" { + days.insert(weekday) + } + } + + let classesStr = flight["classes"] as? String ?? "0000" + let cabinClasses = CabinClass.from(classesString: classesStr) + + // Strip seconds from time strings: "16:45:00" -> "16:45" + let depTimeFormatted = formatTime(deptime) + let arrTimeFormatted = formatTime(destime) + + return FlightSchedule( + airline: airline, + flightNumber: flightNumber, + aircraft: aircraft, + aircraftId: acId, + departureTime: depTimeFormatted, + arrivalTime: arrTimeFormatted, + dateFrom: dateFrom, + dateTo: dateTo, + daysOfWeek: days, + cabinClasses: cabinClasses + ) + } + } + + /// Fetch all flight schedules for a route across all airlines. + /// Reports progress via the `onProgress` closure with (completed, total) counts. + func allSchedules( + dep depId: String, + des desId: String, + onProgress: @Sendable @escaping (Int, Int) -> Void + ) async throws -> [FlightSchedule] { + let routeAirlines = try await airlines(from: depId, to: desId) + let total = routeAirlines.count + + if total == 0 { return [] } + + let completed = Counter() + + let results: [FlightSchedule] = try await withThrowingTaskGroup(of: [FlightSchedule].self) { group in + var allSchedules: [FlightSchedule] = [] + var launched = 0 + var index = 0 + + // Launch initial batch (up to 3) + while index < routeAirlines.count, launched < 3 { + let ra = routeAirlines[index] + group.addTask { [self] in + try await self.schedules( + dep: depId, + des: desId, + airlineId: ra.airline.id, + airline: ra.airline + ) + } + launched += 1 + index += 1 + } + + // As each completes, launch next + for try await flights in group { + allSchedules.append(contentsOf: flights) + let current = await completed.increment() + onProgress(current, total) + + if index < routeAirlines.count { + let ra = routeAirlines[index] + group.addTask { [self] in + try await self.schedules( + dep: depId, + des: desId, + airlineId: ra.airline.id, + airline: ra.airline + ) + } + index += 1 + } + } + + return allSchedules + } + + return results.sorted { $0.departureTime < $1.departureTime } + } + + // MARK: - Browse API + + /// Fetch all countries that have airports. + func fetchCountries() async throws -> [Country] { + if let cached = cachedCountries { return cached } + + guard let url = URL(string: "\(baseURL)/airports-by-country") else { + throw FlightServiceError.invalidURL + } + + let request = makeRequest(url: url) + let data = try await perform(request) + + guard let html = String(data: data, encoding: .utf8) else { + throw FlightServiceError.invalidResponse + } + + // Pattern: href="/airports-in-{slug}-{code}" + // Extract country name from slug (convert hyphens to spaces, title case) + let pattern = try NSRegularExpression( + pattern: #"href="/airports-in-([a-z-]+)-([a-z]{2})""# + ) + let matches = pattern.matches(in: html, range: NSRange(html.startIndex..., in: html)) + + var seen = Set() + var countries: [Country] = [] + + for match in matches { + guard let slugRange = Range(match.range(at: 1), in: html), + let codeRange = Range(match.range(at: 2), in: html) else { continue } + + let slug = String(html[slugRange]) + let code = String(html[codeRange]).uppercased() + + guard !seen.contains(code) else { continue } + seen.insert(code) + + let name = slug.split(separator: "-") + .map { $0.prefix(1).uppercased() + $0.dropFirst() } + .joined(separator: " ") + + countries.append(Country(id: code, name: name, slug: slug)) + } + + countries.sort { $0.name.localizedCompare($1.name) == .orderedAscending } + cachedCountries = countries + return countries + } + + /// Fetch all airports in a country. + func fetchAirports(country: Country) async throws -> [BrowseAirport] { + if let cached = cachedAirportsByCountry[country.id] { return cached } + + guard let url = URL(string: "\(baseURL)/airports-in-\(country.slug)-\(country.id.lowercased())") else { + throw FlightServiceError.invalidURL + } + + let request = makeRequest(url: url) + let data = try await perform(request) + + guard let html = String(data: data, encoding: .utf8) else { + throw FlightServiceError.invalidResponse + } + + // Pattern: title="Direct flights from {City} ({IATA})" + // or: title="Flights from {City} ({IATA})" + let pattern = try NSRegularExpression( + pattern: #"title="(?:Direct )?[Ff]lights from ([^(]+)\(([A-Z]{3})\)""# + ) + let matches = pattern.matches(in: html, range: NSRange(html.startIndex..., in: html)) + + var seen = Set() + var airports: [BrowseAirport] = [] + + for match in matches { + guard let cityRange = Range(match.range(at: 1), in: html), + let iataRange = Range(match.range(at: 2), in: html) else { continue } + + let city = String(html[cityRange]).trimmingCharacters(in: .whitespaces) + let iata = String(html[iataRange]) + + guard !seen.contains(iata) else { continue } + seen.insert(iata) + + airports.append(BrowseAirport(id: iata, iata: iata, city: city)) + } + + airports.sort { $0.city.localizedCompare($1.city) == .orderedAscending } + cachedAirportsByCountry[country.id] = airports + return airports + } + + // MARK: - Private Helpers + + private func makeRequest(url: URL) -> URLRequest { + var request = URLRequest(url: url) + request.setValue(Self.userAgent, forHTTPHeaderField: "User-Agent") + request.setValue("XMLHttpRequest", forHTTPHeaderField: "X-Requested-With") + request.setValue("https://www.flightconnections.com/", forHTTPHeaderField: "Referer") + return request + } + + private func perform(_ request: URLRequest) async throws -> Data { + let (data, response) = try await session.data(for: request) + guard let http = response as? HTTPURLResponse else { + throw FlightServiceError.invalidResponse + } + guard (200...299).contains(http.statusCode) else { + throw FlightServiceError.httpError(http.statusCode) + } + return data + } + + private func parseJSON(_ data: Data) throws -> Any { + do { + return try JSONSerialization.jsonObject(with: data, options: [.fragmentsAllowed]) + } catch { + throw FlightServiceError.decodingFailed(error) + } + } + + private func formatTime(_ raw: String) -> String { + let components = raw.split(separator: ":") + if components.count >= 2 { + return "\(components[0]):\(components[1])" + } + return raw + } +} + +// MARK: - Concurrency Helper + +private actor Counter { + private var value = 0 + + func increment() -> Int { + value += 1 + return value + } +} + +// MARK: - Errors + +struct AutocompleteResults: Sendable { + let airports: [Airport] + let countries: [Country] +} + +enum FlightServiceError: LocalizedError { + case invalidURL + case invalidResponse + case httpError(Int) + case decodingFailed(Error) + + var errorDescription: String? { + switch self { + case .invalidURL: + return "Invalid URL" + case .invalidResponse: + return "Invalid response from server" + case .httpError(let code): + return "HTTP error \(code)" + case .decodingFailed(let error): + return "Failed to decode response: \(error.localizedDescription)" + } + } +} diff --git a/Flights/ViewModels/DestinationsViewModel.swift b/Flights/ViewModels/DestinationsViewModel.swift new file mode 100644 index 0000000..362878d --- /dev/null +++ b/Flights/ViewModels/DestinationsViewModel.swift @@ -0,0 +1,56 @@ +import Foundation +import Observation + +@MainActor +@Observable +final class DestinationsViewModel { + + // MARK: - State + + var routes: [Route] = [] + var isLoading: Bool = false + var error: String? + var selectedDate: Date + + // MARK: - Computed + + var filteredRoutes: [Route] { + let month = Calendar.current.component(.month, from: selectedDate) + return routes + .filter { $0.availableIn(month: month) } + .sorted { $0.destinationAirport.name.localizedCompare($1.destinationAirport.name) == .orderedAscending } + } + + // MARK: - Private + + private let service: FlightService + + // MARK: - Init + + init(service: FlightService, date: Date) { + self.service = service + self.selectedDate = date + } + + // MARK: - Loading + + func loadDestinations(airportId: String) async { + isLoading = true + error = nil + + do { + let results = try await service.destinations(for: airportId) + if !Task.isCancelled { + routes = results + } + } catch { + if !Task.isCancelled { + self.error = error.localizedDescription + } + } + + if !Task.isCancelled { + isLoading = false + } + } +} diff --git a/Flights/ViewModels/RouteDetailViewModel.swift b/Flights/ViewModels/RouteDetailViewModel.swift new file mode 100644 index 0000000..96cb2e6 --- /dev/null +++ b/Flights/ViewModels/RouteDetailViewModel.swift @@ -0,0 +1,72 @@ +import Foundation +import Observation + +@MainActor +@Observable +final class RouteDetailViewModel { + + // MARK: - State + + var allSchedules: [FlightSchedule] = [] + var isLoading: Bool = false + var error: String? + var selectedDate: Date + var loadingProgress: (completed: Int, total: Int)? + + // MARK: - Computed + + var flightsForDate: [FlightSchedule] { + allSchedules + .filter { $0.operatesOn(date: selectedDate) } + .sorted { $0.departureTime < $1.departureTime } + } + + var airlineGroups: [(airline: Airline, flights: [FlightSchedule])] { + let flights = flightsForDate + let grouped = Dictionary(grouping: flights) { $0.airline.id } + + return grouped + .map { (_, schedules) in + (airline: schedules[0].airline, flights: schedules.sorted { $0.departureTime < $1.departureTime }) + } + .sorted { $0.airline.name.localizedCompare($1.airline.name) == .orderedAscending } + } + + // MARK: - Private + + private let service: FlightService + + // MARK: - Init + + init(service: FlightService, date: Date) { + self.service = service + self.selectedDate = date + } + + // MARK: - Loading + + func loadSchedules(dep: String, des: String) async { + isLoading = true + error = nil + loadingProgress = nil + + do { + let results = try await service.allSchedules(dep: dep, des: des) { [weak self] completed, total in + Task { @MainActor [weak self] in + self?.loadingProgress = (completed: completed, total: total) + } + } + if !Task.isCancelled { + allSchedules = results + } + } catch { + if !Task.isCancelled { + self.error = error.localizedDescription + } + } + + if !Task.isCancelled { + isLoading = false + } + } +} diff --git a/Flights/ViewModels/SearchViewModel.swift b/Flights/ViewModels/SearchViewModel.swift new file mode 100644 index 0000000..1a272b2 --- /dev/null +++ b/Flights/ViewModels/SearchViewModel.swift @@ -0,0 +1,168 @@ +import Foundation +import Observation + +@MainActor +@Observable +final class SearchViewModel { + + // MARK: - Published State + + var departureAirport: Airport? + var arrivalAirport: Airport? + var selectedDate: Date = .now + + var departureSearchText: String = "" + var arrivalSearchText: String = "" + + var departureSuggestions: [Airport] = [] + var arrivalSuggestions: [Airport] = [] + + var departureCountrySuggestions: [Country] = [] + var arrivalCountrySuggestions: [Country] = [] + + var departureRegionResult: (regionName: String, airports: [MapAirport])? + var arrivalRegionResult: (regionName: String, airports: [MapAirport])? + + var isDepartureSearching: Bool = false + var isArrivalSearching: Bool = false + + // MARK: - Computed + + var canSearch: Bool { + departureAirport != nil || arrivalAirport != nil + } + + // MARK: - Private + + private let service: FlightService + private let database: AirportDatabase + private var departureSearchTask: Task? + private var arrivalSearchTask: Task? + + // MARK: - Init + + init(service: FlightService, database: AirportDatabase) { + self.service = service + self.database = database + } + + // MARK: - Departure Search + + func departureTextChanged() { + departureSearchTask?.cancel() + guard departureAirport == nil else { return } + + let term = departureSearchText.trimmingCharacters(in: .whitespacesAndNewlines) + guard !term.isEmpty else { + departureSuggestions = [] + departureCountrySuggestions = [] + departureRegionResult = nil + isDepartureSearching = false + return + } + + // Immediate local region search + departureRegionResult = database.searchByRegion(term: term) + + departureSearchTask = Task { + try? await Task.sleep(for: .milliseconds(300)) + guard !Task.isCancelled else { return } + isDepartureSearching = true + do { + let results = try await service.searchAll(term: term) + if !Task.isCancelled { + departureSuggestions = results.airports + departureCountrySuggestions = results.countries + } + } catch { + if !Task.isCancelled { + departureSuggestions = [] + departureCountrySuggestions = [] + } + } + if !Task.isCancelled { + isDepartureSearching = false + } + } + } + + func selectDeparture(_ airport: Airport) { + departureAirport = airport + departureSearchTask?.cancel() + departureSearchText = "\(airport.iata) - \(airport.name)" + departureSuggestions = [] + departureCountrySuggestions = [] + departureRegionResult = nil + isDepartureSearching = false + } + + func clearDeparture() { + departureAirport = nil + departureSearchTask?.cancel() + departureSearchText = "" + departureSuggestions = [] + departureCountrySuggestions = [] + departureRegionResult = nil + isDepartureSearching = false + } + + // MARK: - Arrival Search + + func arrivalTextChanged() { + arrivalSearchTask?.cancel() + guard arrivalAirport == nil else { return } + + let term = arrivalSearchText.trimmingCharacters(in: .whitespacesAndNewlines) + guard !term.isEmpty else { + arrivalSuggestions = [] + arrivalCountrySuggestions = [] + arrivalRegionResult = nil + isArrivalSearching = false + return + } + + // Immediate local region search + arrivalRegionResult = database.searchByRegion(term: term) + + arrivalSearchTask = Task { + try? await Task.sleep(for: .milliseconds(300)) + guard !Task.isCancelled else { return } + isArrivalSearching = true + do { + let results = try await service.searchAll(term: term) + if !Task.isCancelled { + arrivalSuggestions = results.airports + arrivalCountrySuggestions = results.countries + } + } catch { + if !Task.isCancelled { + arrivalSuggestions = [] + arrivalCountrySuggestions = [] + } + } + if !Task.isCancelled { + isArrivalSearching = false + } + } + } + + func selectArrival(_ airport: Airport) { + arrivalAirport = airport + arrivalSearchTask?.cancel() + arrivalSearchText = "\(airport.iata) - \(airport.name)" + arrivalSuggestions = [] + arrivalCountrySuggestions = [] + arrivalRegionResult = nil + isArrivalSearching = false + } + + func clearArrival() { + arrivalAirport = nil + arrivalSearchTask?.cancel() + arrivalSearchText = "" + arrivalSuggestions = [] + arrivalCountrySuggestions = [] + arrivalRegionResult = nil + isArrivalSearching = false + } +} diff --git a/Flights/Views/AirportBrowserSheet.swift b/Flights/Views/AirportBrowserSheet.swift new file mode 100644 index 0000000..cea5f7c --- /dev/null +++ b/Flights/Views/AirportBrowserSheet.swift @@ -0,0 +1,203 @@ +import SwiftUI + +private enum BrowseMode: String, CaseIterable { + case list = "List" + case map = "Map" +} + +struct AirportBrowserSheet: View { + let service: FlightService + let database: AirportDatabase + let onSelect: (Airport) -> Void + + @Environment(\.dismiss) private var dismiss + @State private var browseMode: BrowseMode = .list + @State private var countries: [Country] = [] + @State private var isLoadingCountries = true + @State private var countrySearch = "" + @State private var error: String? + + var filteredCountries: [Country] { + guard !countrySearch.isEmpty else { return countries } + return countries.filter { + $0.name.localizedCaseInsensitiveContains(countrySearch) || + $0.id.localizedCaseInsensitiveContains(countrySearch) + } + } + + var body: some View { + NavigationStack { + VStack(spacing: 0) { + Picker("Browse Mode", selection: $browseMode) { + ForEach(BrowseMode.allCases, id: \.self) { mode in + Text(mode.rawValue) + } + } + .pickerStyle(.segmented) + .padding() + + switch browseMode { + case .list: + listContent + case .map: + AirportMapView( + database: database, + service: service, + onSelect: { airport in + onSelect(airport) + dismiss() + } + ) + } + } + .navigationTitle("Browse Airports") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { dismiss() } + } + } + .task { + await loadCountries() + } + .navigationDestination(for: Country.self) { country in + CountryAirportsView( + country: country, + service: service, + onSelect: { airport in + onSelect(airport) + dismiss() + } + ) + } + } + } + + @ViewBuilder + private var listContent: some View { + if isLoadingCountries { + Spacer() + ProgressView("Loading countries...") + Spacer() + } else if let error { + ContentUnavailableView { + Label("Error", systemImage: "exclamationmark.triangle") + } description: { + Text(error) + } + } else { + List(filteredCountries) { country in + NavigationLink(value: country) { + Text(country.name) + } + } + .searchable(text: $countrySearch, prompt: "Search countries") + } + } +} + +// MARK: - Lifecycle + +extension AirportBrowserSheet { + func loadCountries() async { + do { + countries = try await service.fetchCountries() + } catch { + self.error = error.localizedDescription + } + isLoadingCountries = false + } +} + +private struct CountryAirportsView: View { + let country: Country + let service: FlightService + let onSelect: (Airport) -> Void + + @State private var airports: [BrowseAirport] = [] + @State private var isLoading = true + @State private var error: String? + @State private var airportSearch = "" + @State private var selectingIATA: String? + + var filteredAirports: [BrowseAirport] { + guard !airportSearch.isEmpty else { return airports } + return airports.filter { + $0.city.localizedCaseInsensitiveContains(airportSearch) || + $0.iata.localizedCaseInsensitiveContains(airportSearch) + } + } + + var body: some View { + Group { + if isLoading { + ProgressView("Loading airports...") + } else if let error { + ContentUnavailableView { + Label("Error", systemImage: "exclamationmark.triangle") + } description: { + Text(error) + } + } else if airports.isEmpty { + ContentUnavailableView( + "No Airports", + systemImage: "airplane.slash", + description: Text("No airports found in \(country.name).") + ) + } else { + List(filteredAirports) { airport in + Button { + selectAirport(airport) + } label: { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(airport.city) + .font(.headline) + .foregroundStyle(.primary) + Text(airport.iata) + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + if selectingIATA == airport.iata { + ProgressView() + .controlSize(.small) + } + } + } + .disabled(selectingIATA != nil) + } + .searchable(text: $airportSearch, prompt: "Search airports") + } + } + .navigationTitle(country.name) + .task { + do { + airports = try await service.fetchAirports(country: country) + } catch { + self.error = error.localizedDescription + } + isLoading = false + } + } + + private func selectAirport(_ browseAirport: BrowseAirport) { + selectingIATA = browseAirport.iata + Task { + do { + let results = try await service.searchAirports(term: browseAirport.iata) + if let match = results.first(where: { $0.iata == browseAirport.iata }) { + onSelect(match) + } else { + onSelect(Airport( + id: "", + iata: browseAirport.iata, + name: browseAirport.city + )) + } + } catch { + selectingIATA = nil + } + } + } +} diff --git a/Flights/Views/AirportMapView.swift b/Flights/Views/AirportMapView.swift new file mode 100644 index 0000000..c34a35b --- /dev/null +++ b/Flights/Views/AirportMapView.swift @@ -0,0 +1,129 @@ +import SwiftUI +import MapKit + +struct AirportMapView: View { + let database: AirportDatabase + let service: FlightService + let onSelect: (Airport) -> Void + + @State private var position: MapCameraPosition = .automatic + @State private var visibleRegion: MKCoordinateRegion? + @State private var visibleAirports: [MapAirport] = [] + @State private var selectedAirport: MapAirport? + @State private var isSelecting = false + + var body: some View { + ZStack { + Map(position: $position) { + ForEach(visibleAirports) { airport in + Annotation(airport.iata, coordinate: airport.coordinate) { + Button { + selectedAirport = airport + } label: { + Image(systemName: "airplane.circle.fill") + .font(.title2) + .foregroundStyle(selectedAirport?.id == airport.id ? .blue : .red) + .background(Circle().fill(.white).padding(2)) + } + } + } + } + .onMapCameraChange(frequency: .onEnd) { context in + visibleRegion = context.region + updateVisibleAirports() + } + + if let airport = selectedAirport { + VStack { + Spacer() + airportPopup(airport) + .padding() + .transition(.move(edge: .bottom).combined(with: .opacity)) + } + .animation(.easeInOut(duration: 0.2), value: selectedAirport) + } + } + .onAppear { + let initial = MKCoordinateRegion( + center: CLLocationCoordinate2D(latitude: 30, longitude: -40), + span: MKCoordinateSpan(latitudeDelta: 120, longitudeDelta: 180) + ) + position = .region(initial) + visibleRegion = initial + updateVisibleAirports() + } + } + + private func airportPopup(_ airport: MapAirport) -> some View { + HStack(spacing: 16) { + VStack(alignment: .leading, spacing: 4) { + Text(airport.name) + .font(.headline) + HStack(spacing: 8) { + Text(airport.iata) + .font(.subheadline) + .fontWeight(.semibold) + .foregroundStyle(.blue) + Text(airport.country) + .font(.subheadline) + .foregroundStyle(.secondary) + } + } + + Spacer() + + if isSelecting { + ProgressView() + .controlSize(.small) + } else { + Button { + selectAirport(airport) + } label: { + Text("Select") + .fontWeight(.semibold) + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background(.blue) + .foregroundStyle(.white) + .clipShape(RoundedRectangle(cornerRadius: 8)) + } + } + + Button { + selectedAirport = nil + } label: { + Image(systemName: "xmark.circle.fill") + .font(.title3) + .foregroundStyle(.secondary) + } + } + .padding() + .background(.ultraThinMaterial, in: RoundedRectangle(cornerRadius: 16)) + .shadow(radius: 8) + } + + private func updateVisibleAirports() { + guard let region = visibleRegion else { return } + visibleAirports = database.airports(in: region, limit: 200) + } + + private func selectAirport(_ mapAirport: MapAirport) { + isSelecting = true + Task { + do { + let results = try await service.searchAirports(term: mapAirport.iata) + if let match = results.first(where: { $0.iata == mapAirport.iata }) { + onSelect(match) + } else { + onSelect(Airport( + id: "", + iata: mapAirport.iata, + name: mapAirport.name + )) + } + } catch { + isSelecting = false + } + } + } +} diff --git a/Flights/Views/AirportSearchField.swift b/Flights/Views/AirportSearchField.swift new file mode 100644 index 0000000..a17228f --- /dev/null +++ b/Flights/Views/AirportSearchField.swift @@ -0,0 +1,342 @@ +import SwiftUI + +struct AirportSearchField: View { + let label: String + @Binding var searchText: String + @Binding var selectedAirport: Airport? + let suggestions: [Airport] + let countrySuggestions: [Country] + let regionResult: (regionName: String, airports: [MapAirport])? + let isSearching: Bool + let service: FlightService + let database: AirportDatabase + let onTextChanged: () -> Void + let onSelect: (Airport) -> Void + let onClear: () -> Void + + @State private var activeSheet: AirportSheet? + + private enum AirportSheet: Identifiable { + case browser + case country(Country) + case region(name: String, airports: [MapAirport]) + + var id: String { + switch self { + case .browser: return "browser" + case .country(let c): return "country-\(c.id)" + case .region(let name, _): return "region-\(name)" + } + } + } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + // MARK: - Text Field Row + HStack { + TextField(label, text: $searchText) + .foregroundStyle(.primary) + .autocorrectionDisabled() + .textInputAutocapitalization(.characters) + .onChange(of: searchText) { + onTextChanged() + } + + if selectedAirport != nil { + Button { + onClear() + } label: { + Image(systemName: "xmark.circle.fill") + .foregroundStyle(.secondary) + } + .buttonStyle(.plain) + } else if isSearching { + ProgressView() + .controlSize(.small) + } + + Button { + activeSheet = .browser + } label: { + Image(systemName: "globe") + .foregroundStyle(FlightTheme.accent) + } + .buttonStyle(.plain) + } + + // MARK: - Suggestions + let hasResults = !suggestions.isEmpty || !countrySuggestions.isEmpty || regionResult != nil + if selectedAirport == nil && hasResults { + Divider() + .padding(.vertical, 6) + + ForEach(suggestions) { airport in + Button { + onSelect(airport) + } label: { + HStack(spacing: 6) { + Image(systemName: "airplane") + .font(.caption) + .foregroundStyle(.secondary) + Text("\(airport.iata) - \(airport.name)") + .foregroundStyle(.primary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .padding(.vertical, 8) + + if airport.id != suggestions.last?.id { + Divider() + } + } + + ForEach(countrySuggestions) { country in + if !suggestions.isEmpty || country.id != countrySuggestions.first?.id { + Divider() + } + + Button { + activeSheet = .country(country) + } label: { + HStack(spacing: 6) { + Image(systemName: "flag") + .font(.caption) + .foregroundStyle(.orange) + Text(country.name) + .foregroundStyle(.primary) + Text("(\(country.id))") + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .padding(.vertical, 8) + } + + if let region = regionResult { + if !suggestions.isEmpty || !countrySuggestions.isEmpty { + Divider() + } + + Button { + activeSheet = .region(name: region.regionName, airports: region.airports) + } label: { + HStack(spacing: 6) { + Image(systemName: "map") + .font(.caption) + .foregroundStyle(FlightTheme.onTime) + Text(region.regionName) + .foregroundStyle(.primary) + Text("(\(region.airports.count) airports)") + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .padding(.vertical, 8) + } + } + } + .sheet(item: $activeSheet) { sheet in + switch sheet { + case .browser: + AirportBrowserSheet(service: service, database: database) { airport in + onSelect(airport) + activeSheet = nil + } + case .country(let country): + CountryAirportPickerSheet( + country: country, + service: service, + onSelect: { airport in + onSelect(airport) + activeSheet = nil + } + ) + case .region(let name, let airports): + RegionAirportPickerSheet( + regionName: name, + airports: airports, + service: service, + onSelect: { airport in + onSelect(airport) + activeSheet = nil + } + ) + } + } + } +} + +// MARK: - Country Airport Picker Sheet + +/// Sheet that shows airports in a specific country for direct selection +private struct CountryAirportPickerSheet: View { + let country: Country + let service: FlightService + let onSelect: (Airport) -> Void + + @Environment(\.dismiss) private var dismiss + @State private var airports: [BrowseAirport] = [] + @State private var isLoading = true + @State private var error: String? + @State private var search = "" + @State private var selectingIATA: String? + + var filteredAirports: [BrowseAirport] { + guard !search.isEmpty else { return airports } + return airports.filter { + $0.city.localizedCaseInsensitiveContains(search) || + $0.iata.localizedCaseInsensitiveContains(search) + } + } + + var body: some View { + NavigationStack { + Group { + if isLoading { + ProgressView("Loading airports...") + } else if airports.isEmpty { + ContentUnavailableView( + "No Airports", + systemImage: "airplane.slash", + description: Text("No airports found in \(country.name).") + ) + } else { + List(filteredAirports) { airport in + Button { + selectAirport(airport) + } label: { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(airport.city) + .font(.headline) + .foregroundStyle(.primary) + Text(airport.iata) + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + if selectingIATA == airport.iata { + ProgressView() + .controlSize(.small) + } + } + } + .disabled(selectingIATA != nil) + } + .searchable(text: $search, prompt: "Search airports") + } + } + .navigationTitle("Airports in \(country.name)") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { dismiss() } + } + } + .task { + do { + airports = try await service.fetchAirports(country: country) + } catch { + self.error = error.localizedDescription + } + isLoading = false + } + } + } + + private func selectAirport(_ browseAirport: BrowseAirport) { + selectingIATA = browseAirport.iata + Task { + do { + let results = try await service.searchAirports(term: browseAirport.iata) + if let match = results.first(where: { $0.iata == browseAirport.iata }) { + onSelect(match) + } else { + onSelect(Airport(id: "", iata: browseAirport.iata, name: browseAirport.city)) + } + } catch { + selectingIATA = nil + } + } + } +} + +// MARK: - Region Airport Picker Sheet + +/// Sheet that shows airports in a region/state for direct selection +private struct RegionAirportPickerSheet: View { + let regionName: String + let airports: [MapAirport] + let service: FlightService + let onSelect: (Airport) -> Void + + @Environment(\.dismiss) private var dismiss + @State private var search = "" + @State private var selectingIATA: String? + + var filteredAirports: [MapAirport] { + guard !search.isEmpty else { return airports } + return airports.filter { + $0.name.localizedCaseInsensitiveContains(search) || + $0.iata.localizedCaseInsensitiveContains(search) + } + } + + var body: some View { + NavigationStack { + List(filteredAirports) { airport in + Button { + selectAirport(airport) + } label: { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(airport.name) + .font(.headline) + .foregroundStyle(.primary) + Text(airport.iata) + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + if selectingIATA == airport.iata { + ProgressView() + .controlSize(.small) + } + } + } + .disabled(selectingIATA != nil) + } + .searchable(text: $search, prompt: "Search airports") + .navigationTitle("Airports in \(regionName)") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { dismiss() } + } + } + } + } + + private func selectAirport(_ mapAirport: MapAirport) { + selectingIATA = mapAirport.iata + Task { + do { + let results = try await service.searchAirports(term: mapAirport.iata) + if let match = results.first(where: { $0.iata == mapAirport.iata }) { + onSelect(match) + } else { + // API doesn't know this airport — use bundled data + onSelect(Airport(id: "", iata: mapAirport.iata, name: mapAirport.name)) + } + } catch { + selectingIATA = nil + } + } + } +} diff --git a/Flights/Views/Components/RouteVisualization.swift b/Flights/Views/Components/RouteVisualization.swift new file mode 100644 index 0000000..65b995e --- /dev/null +++ b/Flights/Views/Components/RouteVisualization.swift @@ -0,0 +1,130 @@ +import SwiftUI + +struct RouteVisualization: View { + let departureCode: String + let arrivalCode: String + var departureTime: String? + var arrivalTime: String? + var codeSize: CGFloat = 28 + var timeSize: CGFloat = 18 + + var body: some View { + HStack(alignment: .top, spacing: 0) { + // Departure info + VStack(spacing: 4) { + Text(departureCode) + .font(FlightTheme.airportCode(codeSize)) + .foregroundStyle(FlightTheme.textPrimary) + + if let departureTime { + Text(departureTime) + .font(FlightTheme.time(timeSize)) + .foregroundStyle(FlightTheme.textSecondary) + } + } + .frame(minWidth: 60) + + // Curved arc with airplane + RouteArc() + .padding(.top, 4) + + // Arrival info + VStack(spacing: 4) { + Text(arrivalCode) + .font(FlightTheme.airportCode(codeSize)) + .foregroundStyle(FlightTheme.textPrimary) + + if let arrivalTime { + Text(arrivalTime) + .font(FlightTheme.time(timeSize)) + .foregroundStyle(FlightTheme.textSecondary) + } + } + .frame(minWidth: 60) + } + } +} + +// MARK: - Curved Arc Shape + +private struct ArcCurve: Shape { + func path(in rect: CGRect) -> Path { + var path = Path() + let startPoint = CGPoint(x: 0, y: rect.height) + let endPoint = CGPoint(x: rect.width, y: rect.height) + let controlPoint = CGPoint(x: rect.midX, y: rect.height - (rect.width * 0.3)) + + path.move(to: startPoint) + path.addQuadCurve(to: endPoint, control: controlPoint) + + return path + } +} + +// MARK: - Route Arc View + +private struct RouteArc: View { + var body: some View { + GeometryReader { geometry in + let width = geometry.size.width + let height = geometry.size.height + let arcHeight = width * 0.3 + let midX = width / 2 + + // The peak of the arc: midpoint of the quadratic bezier + // For a quad bezier from (0, h) to (w, h) with control (midX, h - arcH), + // the midpoint at t=0.5 is at y = h - arcH/2 + let airplaneY = height - arcHeight / 2 + + ZStack { + // Dashed curved arc + ArcCurve() + .stroke( + FlightTheme.routeArc, + style: StrokeStyle( + lineWidth: 1.5, + dash: [6, 4] + ) + ) + + // Airplane icon at the top of the arc + Image(systemName: "airplane") + .font(.system(size: 14, weight: .regular)) + .foregroundStyle(FlightTheme.textSecondary) + .rotationEffect(.degrees(-45)) + .position(x: midX, y: airplaneY) + } + } + .frame(height: 40) + .frame(maxWidth: .infinity) + } +} + +// MARK: - Preview + +#Preview { + VStack(spacing: 40) { + RouteVisualization( + departureCode: "DFW", + arrivalCode: "MAD", + departureTime: "16:45", + arrivalTime: "09:05" + ) + + RouteVisualization( + departureCode: "JFK", + arrivalCode: "LHR" + ) + + RouteVisualization( + departureCode: "SFO", + arrivalCode: "NRT", + departureTime: "11:30", + arrivalTime: "14:55", + codeSize: 22, + timeSize: 14 + ) + } + .padding(24) + .background(FlightTheme.background) +} diff --git a/Flights/Views/ContentView.swift b/Flights/Views/ContentView.swift new file mode 100644 index 0000000..5deb1c6 --- /dev/null +++ b/Flights/Views/ContentView.swift @@ -0,0 +1,175 @@ +import SwiftUI + +enum SearchRoute: Hashable { + case destinations(Airport, Date, Bool) + case routeDetail(Airport, Airport, Date) +} + +struct ContentView: View { + let service: FlightService + let database: AirportDatabase + + @State private var viewModel: SearchViewModel + @State private var path = NavigationPath() + + init(service: FlightService, database: AirportDatabase) { + self.service = service + self.database = database + self._viewModel = State(initialValue: SearchViewModel(service: service, database: database)) + } + + var body: some View { + NavigationStack(path: $path) { + ScrollView { + VStack(spacing: FlightTheme.sectionSpacing) { + // MARK: - Combined FROM / TO Card + VStack(alignment: .leading, spacing: 0) { + // FROM section + VStack(alignment: .leading, spacing: 8) { + Label { + Text("FROM") + .font(FlightTheme.label()) + .foregroundStyle(.secondary) + .tracking(1) + } icon: { + Image(systemName: "airplane.departure") + .font(.caption) + .foregroundStyle(.secondary) + } + + AirportSearchField( + label: "Departure Airport", + searchText: $viewModel.departureSearchText, + selectedAirport: $viewModel.departureAirport, + suggestions: viewModel.departureSuggestions, + countrySuggestions: viewModel.departureCountrySuggestions, + regionResult: viewModel.departureRegionResult, + isSearching: viewModel.isDepartureSearching, + service: service, + database: database, + onTextChanged: { viewModel.departureTextChanged() }, + onSelect: { viewModel.selectDeparture($0) }, + onClear: { viewModel.clearDeparture() } + ) + } + .padding(FlightTheme.cardPadding) + + Divider() + .padding(.horizontal, FlightTheme.cardPadding) + + // TO section + VStack(alignment: .leading, spacing: 8) { + Label { + Text("TO (OPTIONAL)") + .font(FlightTheme.label()) + .foregroundStyle(.secondary) + .tracking(1) + } icon: { + Image(systemName: "mappin.and.ellipse") + .font(.caption) + .foregroundStyle(.secondary) + } + + AirportSearchField( + label: "Arrival Airport", + searchText: $viewModel.arrivalSearchText, + selectedAirport: $viewModel.arrivalAirport, + suggestions: viewModel.arrivalSuggestions, + countrySuggestions: viewModel.arrivalCountrySuggestions, + regionResult: viewModel.arrivalRegionResult, + isSearching: viewModel.isArrivalSearching, + service: service, + database: database, + onTextChanged: { viewModel.arrivalTextChanged() }, + onSelect: { viewModel.selectArrival($0) }, + onClear: { viewModel.clearArrival() } + ) + } + .padding(FlightTheme.cardPadding) + } + .background(FlightTheme.cardBackground) + .clipShape(RoundedRectangle(cornerRadius: FlightTheme.cardCornerRadius)) + .shadow(color: FlightTheme.cardShadow, radius: 8, y: 2) + + // MARK: - Date Card + HStack(spacing: 10) { + Image(systemName: "calendar") + .foregroundStyle(FlightTheme.accent) + .font(.body) + + DatePicker( + "Travel Date", + selection: $viewModel.selectedDate, + displayedComponents: .date + ) + .labelsHidden() + .datePickerStyle(.compact) + .tint(FlightTheme.accent) + + Spacer() + } + .flightCard() + + // MARK: - Search Button + Button { + navigateToResults() + } label: { + Text("Search Flights") + .font(.body.weight(.bold)) + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .frame(height: 50) + .background( + LinearGradient( + colors: [FlightTheme.accent, FlightTheme.accentLight], + startPoint: .leading, + endPoint: .trailing + ) + ) + .clipShape(RoundedRectangle(cornerRadius: 12)) + } + .disabled(!viewModel.canSearch) + .opacity(viewModel.canSearch ? 1.0 : 0.5) + } + .padding(.horizontal) + .padding(.top, 8) + .padding(.bottom, 32) + } + .background(FlightTheme.background.ignoresSafeArea()) + .navigationTitle("Flights") + .navigationDestination(for: SearchRoute.self) { route in + switch route { + case let .destinations(airport, date, isArrival): + DestinationsListView( + airport: airport, + date: date, + service: service, + isArrival: isArrival + ) + case let .routeDetail(departure, arrival, date): + RouteDetailView( + departure: departure, + arrival: arrival, + date: date, + service: service + ) + } + } + } + } + + // MARK: - Helpers + + private func navigateToResults() { + let date = viewModel.selectedDate + + if let departure = viewModel.departureAirport, + let arrival = viewModel.arrivalAirport { + path.append(SearchRoute.routeDetail(departure, arrival, date)) + } else if let departure = viewModel.departureAirport { + path.append(SearchRoute.destinations(departure, date, false)) + } else if let arrival = viewModel.arrivalAirport { + path.append(SearchRoute.destinations(arrival, date, true)) + } + } +} diff --git a/Flights/Views/DestinationsListView.swift b/Flights/Views/DestinationsListView.swift new file mode 100644 index 0000000..78320b0 --- /dev/null +++ b/Flights/Views/DestinationsListView.swift @@ -0,0 +1,152 @@ +import SwiftUI + +struct DestinationsListView: View { + let airport: Airport + let date: Date + let service: FlightService + let isArrival: Bool + + @State private var viewModel: DestinationsViewModel + + init(airport: Airport, date: Date, service: FlightService, isArrival: Bool) { + self.airport = airport + self.date = date + self.service = service + self.isArrival = isArrival + self._viewModel = State(initialValue: DestinationsViewModel(service: service, date: date)) + } + + var body: some View { + Group { + if viewModel.isLoading { + ProgressView("Loading destinations...") + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else if let error = viewModel.error { + ContentUnavailableView { + Label("Error", systemImage: "exclamationmark.triangle") + } description: { + Text(error) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else if viewModel.filteredRoutes.isEmpty { + ContentUnavailableView( + "No Flights", + systemImage: "airplane.slash", + description: Text("No nonstop flights available in this month.") + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else { + ScrollView { + LazyVStack(spacing: 12) { + ForEach(viewModel.filteredRoutes) { route in + NavigationLink(value: searchRoute(for: route)) { + routeCard(route) + } + .buttonStyle(.plain) + } + } + .padding(.horizontal) + .padding(.vertical, 12) + } + } + } + .background(FlightTheme.background.ignoresSafeArea()) + .navigationTitle(isArrival ? "To \(airport.iata)" : "From \(airport.iata)") + .navigationDestination(for: SearchRoute.self) { route in + switch route { + case let .routeDetail(departure, arrival, date): + RouteDetailView( + departure: departure, + arrival: arrival, + date: date, + service: service + ) + default: + EmptyView() + } + } + .task { + let resolvedId = await resolveId(for: airport) + await viewModel.loadDestinations(airportId: resolvedId) + } + } + + // MARK: - Route Card + + private func routeCard(_ route: Route) -> some View { + HStack(spacing: 12) { + // Green dot + IATA code + HStack(spacing: 8) { + Circle() + .fill(FlightTheme.onTime) + .frame(width: 8, height: 8) + + Text(route.destinationAirport.iata) + .font(FlightTheme.airportCode(22)) + .foregroundStyle(.primary) + } + + // City & country + VStack(alignment: .leading, spacing: 2) { + Text(route.destinationAirport.name) + .font(.headline) + .foregroundStyle(.primary) + .lineLimit(1) + + if !route.destinationAirport.country.isEmpty { + Text(route.destinationAirport.country) + .font(.caption) + .foregroundStyle(.secondary) + } + } + + Spacer() + + // Duration & distance + VStack(alignment: .trailing, spacing: 2) { + Text(formattedDuration(route.durationMinutes)) + .font(.subheadline.monospacedDigit()) + .foregroundStyle(.secondary) + + Text("\(route.distanceMiles) mi") + .font(.caption) + .foregroundStyle(FlightTheme.textTertiary) + } + } + .flightCard(padding: 14) + } + + // MARK: - Helpers + + private func searchRoute(for route: Route) -> SearchRoute { + if isArrival { + return .routeDetail(route.destinationAirport, airport, date) + } else { + return .routeDetail(airport, route.destinationAirport, date) + } + } + + private func formattedDuration(_ minutes: Int) -> String { + let hours = minutes / 60 + let mins = minutes % 60 + if hours > 0 && mins > 0 { + return "\(hours)h \(mins)m" + } else if hours > 0 { + return "\(hours)h" + } else { + return "\(mins)m" + } + } + + private func resolveId(for airport: Airport) async -> String { + guard airport.id.isEmpty else { return airport.id } + do { + let results = try await service.searchAirports(term: airport.iata) + if let match = results.first(where: { $0.iata == airport.iata }) { + return match.id + } + } catch {} + return airport.id + } +} diff --git a/Flights/Views/FlightScheduleRow.swift b/Flights/Views/FlightScheduleRow.swift new file mode 100644 index 0000000..8cd8cca --- /dev/null +++ b/Flights/Views/FlightScheduleRow.swift @@ -0,0 +1,65 @@ +import SwiftUI + +struct FlightScheduleRow: View { + let schedule: FlightSchedule + let departureCode: String + let arrivalCode: String + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + // MARK: - Top row: airline logo + name + flight number + HStack(spacing: 10) { + AsyncImage(url: schedule.airline.logoURL) { phase in + switch phase { + case .success(let image): + image + .resizable() + .scaledToFit() + default: + RoundedRectangle(cornerRadius: 10) + .fill(FlightTheme.accent) + .overlay { + Text(String(schedule.airline.name.prefix(1))) + .font(.system(size: 18, weight: .bold, design: .rounded)) + .foregroundStyle(.white) + } + } + } + .frame(width: 40, height: 40) + .clipShape(RoundedRectangle(cornerRadius: 10)) + + Text(schedule.airline.name) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(FlightTheme.textPrimary) + .lineLimit(1) + + Spacer() + + Text(schedule.flightNumber) + .font(FlightTheme.flightNumber()) + .foregroundStyle(FlightTheme.textSecondary) + } + + // MARK: - Route visualization (curved arc with codes + times) + RouteVisualization( + departureCode: departureCode, + arrivalCode: arrivalCode, + departureTime: schedule.departureTime, + arrivalTime: schedule.arrivalTime, + codeSize: 28, + timeSize: 18 + ) + + // MARK: - Aircraft pill tag + if !schedule.aircraft.isEmpty { + Text(schedule.aircraft) + .font(FlightTheme.label(11)) + .foregroundStyle(FlightTheme.textSecondary) + .padding(.horizontal, 10) + .padding(.vertical, 4) + .background(Color(.quaternarySystemFill), in: Capsule()) + } + } + .flightCard() + } +} diff --git a/Flights/Views/RouteDetailView.swift b/Flights/Views/RouteDetailView.swift new file mode 100644 index 0000000..3d44a0e --- /dev/null +++ b/Flights/Views/RouteDetailView.swift @@ -0,0 +1,164 @@ +import SwiftUI + +struct RouteDetailView: View { + let departure: Airport + let arrival: Airport + let date: Date + let service: FlightService + + @State private var viewModel: RouteDetailViewModel + + init(departure: Airport, arrival: Airport, date: Date, service: FlightService) { + self.departure = departure + self.arrival = arrival + self.date = date + self.service = service + self._viewModel = State(initialValue: RouteDetailViewModel(service: service, date: date)) + } + + var body: some View { + ZStack { + FlightTheme.background + .ignoresSafeArea() + + Group { + if viewModel.isLoading { + loadingView + } else if let error = viewModel.error { + errorView(error) + } else if viewModel.flightsForDate.isEmpty { + emptyView + } else { + scheduleList + } + } + } + .navigationTitle("\(departure.iata) \u{2192} \(arrival.iata)") + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + DatePicker( + "Date", + selection: $viewModel.selectedDate, + displayedComponents: .date + ) + .labelsHidden() + .datePickerStyle(.compact) + .tint(FlightTheme.accent) + } + } + .task { + let depId = await resolveId(for: departure) + let desId = await resolveId(for: arrival) + await viewModel.loadSchedules(dep: depId, des: desId) + } + } + + // MARK: - Loading + + private var loadingView: some View { + VStack(spacing: 12) { + ProgressView() + .tint(FlightTheme.accent) + + if let progress = viewModel.loadingProgress { + Text("Loading airline \(progress.completed)/\(progress.total)...") + .font(.caption) + .foregroundStyle(FlightTheme.textSecondary) + } + } + } + + // MARK: - Error + + private func errorView(_ message: String) -> some View { + ContentUnavailableView { + Label("Error", systemImage: "exclamationmark.triangle") + } description: { + Text(message) + } actions: { + Button("Retry") { + Task { + let depId = await resolveId(for: departure) + let desId = await resolveId(for: arrival) + await viewModel.loadSchedules(dep: depId, des: desId) + } + } + .buttonStyle(.borderedProminent) + .tint(FlightTheme.accent) + } + } + + // MARK: - Empty + + private var emptyView: some View { + ContentUnavailableView { + Label("No Flights", systemImage: "airplane") + } description: { + Text("No flights operate on this date.") + } + } + + // MARK: - Schedule List + + private var scheduleList: some View { + ScrollView { + VStack(alignment: .leading, spacing: FlightTheme.sectionSpacing) { + ForEach(viewModel.airlineGroups, id: \.airline.id) { group in + VStack(alignment: .leading, spacing: 12) { + // Section header: small logo + airline name + HStack(spacing: 8) { + AsyncImage(url: group.airline.logoURL) { phase in + switch phase { + case .success(let image): + image + .resizable() + .scaledToFit() + default: + RoundedRectangle(cornerRadius: 6) + .fill(FlightTheme.accent) + .overlay { + Text(String(group.airline.name.prefix(1))) + .font(.system(size: 12, weight: .bold, design: .rounded)) + .foregroundStyle(.white) + } + } + } + .frame(width: 24, height: 24) + .clipShape(RoundedRectangle(cornerRadius: 6)) + + Text(group.airline.name) + .font(.headline) + .foregroundStyle(FlightTheme.textPrimary) + } + .padding(.top, 4) + + // Flight cards + ForEach(group.flights) { schedule in + FlightScheduleRow( + schedule: schedule, + departureCode: departure.iata, + arrivalCode: arrival.iata + ) + } + } + } + } + .padding(.horizontal, 16) + .padding(.vertical, 12) + } + } + + // MARK: - ID Resolution + + /// If an airport was selected from browse/map with no FlightConnections ID, look it up. + private func resolveId(for airport: Airport) async -> String { + guard airport.id.isEmpty else { return airport.id } + do { + let results = try await service.searchAirports(term: airport.iata) + if let match = results.first(where: { $0.iata == airport.iata }) { + return match.id + } + } catch {} + return airport.id + } +} diff --git a/Flights/Views/Styles/FlightTheme.swift b/Flights/Views/Styles/FlightTheme.swift new file mode 100644 index 0000000..f26300e --- /dev/null +++ b/Flights/Views/Styles/FlightTheme.swift @@ -0,0 +1,85 @@ +import SwiftUI + +extension Color { + init(hex: String) { + let hex = hex.trimmingCharacters(in: .alphanumerics.inverted) + var int: UInt64 = 0 + Scanner(string: hex).scanHexInt64(&int) + let r, g, b: Double + r = Double((int >> 16) & 0xFF) / 255.0 + g = Double((int >> 8) & 0xFF) / 255.0 + b = Double(int & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} + +enum FlightTheme { + // MARK: - Adaptive Backgrounds + // These auto-adapt to light/dark mode + static let background = Color(.systemGroupedBackground) + static let cardBackground = Color(.secondarySystemGroupedBackground) + static let elevatedBackground = Color(.tertiarySystemGroupedBackground) + + // MARK: - Adaptive Text + static let textPrimary = Color.primary + static let textSecondary = Color.secondary + static let textTertiary = Color(.tertiaryLabel) + + // MARK: - Accent & Brand + static let accent = Color(hex: "6366F1") + static let accentLight = Color(hex: "818CF8") + + // MARK: - Status Colors (same in both modes) + static let onTime = Color(hex: "10B981") + static let delayed = Color(hex: "F59E0B") + static let cancelled = Color(hex: "EF4444") + static let boarding = Color(hex: "3B82F6") + + // MARK: - Decorative + static let routeArc = Color(.separator) + static let cardShadow = Color.black.opacity(0.08) + + // MARK: - Fonts (airport signage inspired) + + static func airportCode(_ size: CGFloat = 28) -> Font { + .system(size: size, weight: .bold, design: .rounded) + } + + static func time(_ size: CGFloat = 20) -> Font { + .system(size: size, weight: .semibold, design: .monospaced) + } + + static func flightNumber(_ size: CGFloat = 14) -> Font { + .system(size: size, weight: .medium, design: .monospaced) + } + + static func label(_ size: CGFloat = 12) -> Font { + .system(size: size, weight: .semibold, design: .default) + } + + // MARK: - Layout + + static let cardCornerRadius: CGFloat = 16 + static let cardPadding: CGFloat = 16 + static let sectionSpacing: CGFloat = 20 +} + +// MARK: - Card Style Modifier + +struct FlightCardStyle: ViewModifier { + var padding: CGFloat = FlightTheme.cardPadding + + func body(content: Content) -> some View { + content + .padding(padding) + .background(FlightTheme.cardBackground) + .clipShape(RoundedRectangle(cornerRadius: FlightTheme.cardCornerRadius)) + .shadow(color: FlightTheme.cardShadow, radius: 8, y: 2) + } +} + +extension View { + func flightCard(padding: CGFloat = FlightTheme.cardPadding) -> some View { + modifier(FlightCardStyle(padding: padding)) + } +} diff --git a/Flights/airports.json b/Flights/airports.json new file mode 100644 index 0000000..8f5f517 --- /dev/null +++ b/Flights/airports.json @@ -0,0 +1 @@ +[{"iata":"AAA","name":"Anaa","country":"PF","region":"PF-U-A","lat":-17.3526,"lng":-145.51},{"iata":"AAC","name":"El Arish","country":"EG","region":"EG-SIN","lat":31.0553,"lng":33.828},{"iata":"AAE","name":"Annaba","country":"DZ","region":"DZ-23","lat":36.8268,"lng":7.8133},{"iata":"AAL","name":"Aalborg","country":"DK","region":"DK-81","lat":57.0948,"lng":9.8499},{"iata":"AAM","name":"Malamala","country":"ZA","region":"ZA-MP","lat":-24.8169,"lng":31.5441},{"iata":"AAN","name":"Al Ain","country":"AE","region":"AE-AZ","lat":24.2617,"lng":55.6092},{"iata":"AAO","name":"Anaco","country":"VE","region":"VE-B","lat":9.4302,"lng":-64.4707},{"iata":"AAP","name":"Samarinda","country":"ID","region":"ID-KI","lat":-0.3745,"lng":117.2501},{"iata":"AAQ","name":"Krasnyi Kurgan","country":"RU","region":"RU-KDA","lat":45.0021,"lng":37.3473},{"iata":"AAR","name":"Aarhus","country":"DK","region":"DK-82","lat":56.3033,"lng":10.6183},{"iata":"AAT","name":"Altay","country":"CN","region":"CN-65","lat":47.7499,"lng":88.0858},{"iata":"AAV","name":"Surallah","country":"PH","region":"PH-SCO","lat":6.3679,"lng":124.7524},{"iata":"AAX","name":"Arax\u00e1","country":"BR","region":"BR-MG","lat":-19.5632,"lng":-46.9604},{"iata":"AAY","name":"Al Ghaydah","country":"YE","region":"YE-MR","lat":16.1933,"lng":52.1742},{"iata":"ABA","name":"Abakan","country":"RU","region":"RU-KK","lat":53.74,"lng":91.385},{"iata":"ABB","name":"Asaba","country":"NG","region":"NG-DE","lat":6.2042,"lng":6.6653},{"iata":"ABC","name":"Albacete","country":"ES","region":"ES-CM","lat":38.9485,"lng":-1.8635},{"iata":"ABD","name":"Abadan","country":"IR","region":"IR-06","lat":30.3679,"lng":48.2301},{"iata":"ABE","name":"Allentown/Bethlehem","country":"US","region":"US-PA","lat":40.6518,"lng":-75.4428},{"iata":"ABI","name":"Abilene","country":"US","region":"US-TX","lat":32.4113,"lng":-99.6819},{"iata":"ABJ","name":"Abidjan","country":"CI","region":"CI-AB","lat":5.2614,"lng":-3.9263},{"iata":"ABK","name":"Kebri Dahar","country":"ET","region":"ET-SO","lat":6.7326,"lng":44.2413},{"iata":"ABL","name":"Ambler","country":"US","region":"US-AK","lat":67.1055,"lng":-157.8553},{"iata":"ABQ","name":"Albuquerque","country":"US","region":"US-NM","lat":35.04,"lng":-106.6089},{"iata":"ABR","name":"Aberdeen","country":"US","region":"US-SD","lat":45.4491,"lng":-98.4218},{"iata":"ABS","name":"Abu Simbel","country":"EG","region":"EG-ASN","lat":22.3759,"lng":31.6117},{"iata":"ABT","name":"Al-Baha","country":"SA","region":"SA-11","lat":20.2985,"lng":41.6362},{"iata":"ABV","name":"Abuja","country":"NG","region":"NG-FC","lat":9.0068,"lng":7.2632},{"iata":"ABX","name":"East Albury","country":"AU","region":"AU-NSW","lat":-36.0668,"lng":146.9591},{"iata":"ABY","name":"Albany","country":"US","region":"US-GA","lat":31.5329,"lng":-84.1962},{"iata":"ABZ","name":"Aberdeen","country":"GB","region":"GB-SCT","lat":57.2019,"lng":-2.1978},{"iata":"ACA","name":"Acapulco","country":"MX","region":"MX-GRO","lat":16.7571,"lng":-99.7531},{"iata":"ACC","name":"Accra","country":"GH","region":"GH-AA","lat":5.6052,"lng":-0.1668},{"iata":"ACE","name":"San Bartolom\u00e9","country":"ES","region":"ES-CN","lat":28.9455,"lng":-13.6052},{"iata":"ACH","name":"St. Gallen","country":"CH","region":"CH-SG","lat":47.485,"lng":9.5608},{"iata":"ACI","name":"Saint Anne","country":"GG","region":"GG-A","lat":49.7061,"lng":-2.2147},{"iata":"ACJ","name":"Anuradhapura","country":"LK","region":"LK-7","lat":8.3015,"lng":80.4285},{"iata":"ACK","name":"Nantucket","country":"US","region":"US-MA","lat":41.2531,"lng":-70.0602},{"iata":"ACN","name":"Ciudad Acu\u00f1a","country":"MX","region":"MX-COA","lat":29.3337,"lng":-101.1006},{"iata":"ACS","name":"Achinsk","country":"RU","region":"RU-KYA","lat":56.2692,"lng":90.5751},{"iata":"ACT","name":"Waco","country":"US","region":"US-TX","lat":31.6113,"lng":-97.2305},{"iata":"ACV","name":"Arcata/Eureka","country":"US","region":"US-CA","lat":40.9781,"lng":-124.109},{"iata":"ACX","name":"Xingyi","country":"CN","region":"CN-52","lat":25.0834,"lng":104.9608},{"iata":"ACY","name":"Atlantic City","country":"US","region":"US-NJ","lat":39.4562,"lng":-74.5775},{"iata":"ACZ","name":"Zabol","country":"IR","region":"IR-11","lat":31.0983,"lng":61.5439},{"iata":"ADA","name":"Seyhan","country":"TR","region":"TR-01","lat":36.9822,"lng":35.2804},{"iata":"ADB","name":"Gaziemir","country":"TR","region":"TR-35","lat":38.2924,"lng":27.157},{"iata":"ADD","name":"Addis Ababa","country":"ET","region":"ET-AA","lat":8.9779,"lng":38.7993},{"iata":"ADE","name":"Aden","country":"YE","region":"YE-AD","lat":12.8296,"lng":45.03},{"iata":"ADF","name":"Ad\u0131yaman","country":"TR","region":"TR-02","lat":37.7314,"lng":38.4689},{"iata":"ADI","name":"Arandis","country":"NA","region":"NA-ER","lat":-22.4619,"lng":14.9793},{"iata":"ADJ","name":"Amman","country":"JO","region":"JO-AM","lat":31.9727,"lng":35.9916},{"iata":"ADK","name":"Adak","country":"US","region":"US-AK","lat":51.8836,"lng":-176.6428},{"iata":"ADL","name":"Adelaide","country":"AU","region":"AU-SA","lat":-34.9475,"lng":138.5334},{"iata":"ADP","name":"Ampara","country":"LK","region":"LK-5","lat":7.3367,"lng":81.6239},{"iata":"ADQ","name":"Kodiak","country":"US","region":"US-AK","lat":57.75,"lng":-152.494},{"iata":"ADT","name":"Ada","country":"US","region":"US-OK","lat":34.8052,"lng":-96.672},{"iata":"ADU","name":"Ardabil","country":"IR","region":"IR-24","lat":38.3257,"lng":48.4244},{"iata":"ADW","name":"Camp Springs","country":"US","region":"US-MD","lat":38.8108,"lng":-76.867},{"iata":"ADX","name":"Leuchars, Fife","country":"GB","region":"GB-SCT","lat":56.374,"lng":-2.8689},{"iata":"ADZ","name":"San Andr\u00e9s","country":"CO","region":"CO-SAP","lat":12.5836,"lng":-81.7112},{"iata":"AEB","name":"Baise (Tianyang)","country":"CN","region":"CN-45","lat":23.7206,"lng":106.96},{"iata":"AEG","name":"Padang Sidempuan","country":"ID","region":"ID-SU","lat":1.4001,"lng":99.4305},{"iata":"AEH","name":"Abeche","country":"TD","region":"TD-OD","lat":13.847,"lng":20.8443},{"iata":"AEP","name":"Buenos Aires","country":"AR","region":"AR-C","lat":-34.5594,"lng":-58.4155},{"iata":"AER","name":"Sochi","country":"RU","region":"RU-KDA","lat":43.4499,"lng":39.9566},{"iata":"AES","name":"\u00c5lesund","country":"NO","region":"NO-15","lat":62.5604,"lng":6.1108},{"iata":"AEU","name":"Abu Musa","country":"IR","region":"IR-22","lat":25.8757,"lng":55.033},{"iata":"AEX","name":"Alexandria","country":"US","region":"US-LA","lat":31.3258,"lng":-92.5467},{"iata":"AEY","name":"Akureyri","country":"IS","region":"IS-6","lat":65.6566,"lng":-18.072},{"iata":"AFA","name":"San Rafael","country":"AR","region":"AR-M","lat":-34.5883,"lng":-68.4039},{"iata":"AFL","name":"Alta Floresta","country":"BR","region":"BR-MT","lat":-9.8664,"lng":-56.1063},{"iata":"AFW","name":"Fort Worth","country":"US","region":"US-TX","lat":32.9904,"lng":-97.3195},{"iata":"AFY","name":"Afyonkarahisar","country":"TR","region":"TR-03","lat":38.7264,"lng":30.6011},{"iata":"AFZ","name":"Sabzevar","country":"IR","region":"IR-09","lat":36.1681,"lng":57.5952},{"iata":"AGA","name":"Agadir (Temsia)","country":"MA","region":"MA-09","lat":30.3225,"lng":-9.412},{"iata":"AGB","name":"Augsburg","country":"DE","region":"DE-BY","lat":48.4253,"lng":10.9317},{"iata":"AGC","name":"Pittsburgh","country":"US","region":"US-PA","lat":40.3544,"lng":-79.9302},{"iata":"AGF","name":"Agen","country":"FR","region":"FR-NAQ","lat":44.1742,"lng":0.5931},{"iata":"AGH","name":"\u00c4ngelholm","country":"SE","region":"SE-M","lat":56.2961,"lng":12.8471},{"iata":"AGP","name":"M\u00e1laga","country":"ES","region":"ES-AN","lat":36.6749,"lng":-4.4991},{"iata":"AGR","name":"Agra","country":"IN","region":"IN-UP","lat":27.158,"lng":77.961},{"iata":"AGS","name":"Augusta","country":"US","region":"US-GA","lat":33.3699,"lng":-81.9645},{"iata":"AGT","name":"Ciudad del Este","country":"PY","region":"PY-10","lat":-25.4572,"lng":-54.8395},{"iata":"AGU","name":"Aguascalientes","country":"MX","region":"MX-AGU","lat":21.6996,"lng":-102.3184},{"iata":"AGV","name":"Acarigua","country":"VE","region":"VE-P","lat":9.5534,"lng":-69.2379},{"iata":"AGX","name":"Agatti","country":"IN","region":"IN-LD","lat":10.8237,"lng":72.176},{"iata":"AGZ","name":"Aggeneys","country":"ZA","region":"ZA-NC","lat":-29.2818,"lng":18.8139},{"iata":"AHA","name":"Ambikapur","country":"IN","region":"IN-CT","lat":22.9875,"lng":83.1961},{"iata":"AHB","name":"Abha","country":"SA","region":"SA-14","lat":18.2404,"lng":42.6566},{"iata":"AHE","name":"Ahe Atoll","country":"PF","region":"PF-U-A","lat":-14.4281,"lng":-146.257},{"iata":"AHJ","name":"Ngawa (Hongyuan)","country":"CN","region":"CN-51","lat":32.5315,"lng":102.3522},{"iata":"AHN","name":"Athens","country":"US","region":"US-GA","lat":33.9488,"lng":-83.3256},{"iata":"AHO","name":"Alghero","country":"IT","region":"IT-88","lat":40.6321,"lng":8.2908},{"iata":"AHU","name":"Al Hoceima","country":"MA","region":"MA-01","lat":35.1771,"lng":-3.8395},{"iata":"AIA","name":"Alliance","country":"US","region":"US-NE","lat":42.0525,"lng":-102.804},{"iata":"AIN","name":"Wainwright","country":"US","region":"US-AK","lat":70.638,"lng":-159.995},{"iata":"AJA","name":"Ajaccio","country":"FR","region":"FR-COR","lat":41.9236,"lng":8.8029},{"iata":"AJF","name":"Al-Jawf","country":"SA","region":"SA-12","lat":29.7833,"lng":40.1009},{"iata":"AJI","name":"A\u011fr\u0131","country":"TR","region":"TR-04","lat":39.6556,"lng":43.0257},{"iata":"AJL","name":"Aizawl (Lengpui)","country":"IN","region":"IN-MZ","lat":23.8406,"lng":92.6197},{"iata":"AJN","name":"Ouani","country":"KM","region":"KM-A","lat":-12.131,"lng":44.43},{"iata":"AJR","name":"Arvidsjaur","country":"SE","region":"SE-BD","lat":65.5903,"lng":19.2819},{"iata":"AJU","name":"Aracaju","country":"BR","region":"BR-SE","lat":-10.9839,"lng":-37.0729},{"iata":"AJY","name":"Agadez","country":"NE","region":"NE-1","lat":16.966,"lng":8.0001},{"iata":"AKC","name":"Akron","country":"US","region":"US-OH","lat":41.0374,"lng":-81.4678},{"iata":"AKD","name":"Akola","country":"IN","region":"IN-MM","lat":20.6989,"lng":77.0569},{"iata":"AKF","name":"Kufra","country":"LY","region":"LY-KF","lat":24.1787,"lng":23.314},{"iata":"AKH","name":"Al Kharj","country":"SA","region":"SA-01","lat":24.0627,"lng":47.5805},{"iata":"AKJ","name":"Higashikagura","country":"JP","region":"JP-01","lat":43.6708,"lng":142.447},{"iata":"AKL","name":"Auckland","country":"NZ","region":"NZ-AUK","lat":-37.012,"lng":174.7863},{"iata":"AKN","name":"King Salmon","country":"US","region":"US-AK","lat":58.6778,"lng":-156.652},{"iata":"AKP","name":"Anaktuvuk Pass","country":"US","region":"US-AK","lat":68.1336,"lng":-151.743},{"iata":"AKR","name":"Akure","country":"NG","region":"NG-ON","lat":7.2467,"lng":5.301},{"iata":"AKT","name":"Akrotiri","country":"CY","region":"CY-XX","lat":34.5904,"lng":32.9879},{"iata":"AKU","name":"Aksu (Onsu)","country":"CN","region":"CN-65","lat":41.2625,"lng":80.2917},{"iata":"AKW","name":"Omidiyeh","country":"IR","region":"IR-06","lat":30.7444,"lng":49.6772},{"iata":"AKX","name":"Aktobe","country":"KZ","region":"KZ-AKT","lat":50.2481,"lng":57.2041},{"iata":"AKY","name":"Sittwe","country":"MM","region":"MM-16","lat":20.1332,"lng":92.8707},{"iata":"ALA","name":"Almaty","country":"KZ","region":"KZ-ALA","lat":43.3543,"lng":77.0428},{"iata":"ALB","name":"Albany","country":"US","region":"US-NY","lat":42.7483,"lng":-73.8017},{"iata":"ALC","name":"Alicante","country":"ES","region":"ES-VC","lat":38.2822,"lng":-0.5582},{"iata":"ALF","name":"Alta","country":"NO","region":"NO-56","lat":69.9761,"lng":23.3717},{"iata":"ALG","name":"Algiers","country":"DZ","region":"DZ-16","lat":36.6939,"lng":3.2145},{"iata":"ALH","name":"Albany","country":"AU","region":"AU-WA","lat":-34.9433,"lng":117.8089},{"iata":"ALI","name":"Alice","country":"US","region":"US-TX","lat":27.7409,"lng":-98.0269},{"iata":"ALJ","name":"Alexander Bay","country":"ZA","region":"ZA-NC","lat":-28.575,"lng":16.5333},{"iata":"ALM","name":"Alamogordo","country":"US","region":"US-NM","lat":32.8378,"lng":-105.9931},{"iata":"ALN","name":"Alton/St Louis","country":"US","region":"US-IL","lat":38.8903,"lng":-90.046},{"iata":"ALO","name":"Waterloo","country":"US","region":"US-IA","lat":42.5571,"lng":-92.4003},{"iata":"ALP","name":"Aleppo","country":"SY","region":"SY-HL","lat":36.1813,"lng":37.2269},{"iata":"ALR","name":"Alexandra","country":"NZ","region":"NZ-OTA","lat":-45.2105,"lng":169.3711},{"iata":"ALS","name":"Alamosa","country":"US","region":"US-CO","lat":37.4349,"lng":-105.867},{"iata":"ALW","name":"Walla Walla","country":"US","region":"US-WA","lat":46.0949,"lng":-118.288},{"iata":"AMA","name":"Amarillo","country":"US","region":"US-TX","lat":35.2179,"lng":-101.7064},{"iata":"AMD","name":"Ahmedabad","country":"IN","region":"IN-GJ","lat":23.0772,"lng":72.6347},{"iata":"AMH","name":"Arba Minch","country":"ET","region":"ET-SN","lat":6.0394,"lng":37.5905},{"iata":"AMM","name":"Amman","country":"JO","region":"JO-AM","lat":31.7226,"lng":35.9932},{"iata":"AMQ","name":"Ambon","country":"ID","region":"ID-MA","lat":-3.7103,"lng":128.089},{"iata":"AMS","name":"Amsterdam","country":"NL","region":"NL-NH","lat":52.3086,"lng":4.7639},{"iata":"AMV","name":"Amderma","country":"RU","region":"RU-NEN","lat":69.7633,"lng":61.5564},{"iata":"AMZ","name":"Manurewa","country":"NZ","region":"NZ-AUK","lat":-37.0297,"lng":174.973},{"iata":"ANB","name":"Anniston","country":"US","region":"US-AL","lat":33.5882,"lng":-85.8581},{"iata":"ANC","name":"Anchorage","country":"US","region":"US-AK","lat":61.179,"lng":-149.9926},{"iata":"AND","name":"Anderson","country":"US","region":"US-SC","lat":34.4946,"lng":-82.7094},{"iata":"ANE","name":"Angers","country":"FR","region":"FR-PDL","lat":47.5603,"lng":-0.3122},{"iata":"ANF","name":"Antofagasta","country":"CL","region":"CL-AN","lat":-23.4453,"lng":-70.4452},{"iata":"ANG","name":"Angoul\u00eame","country":"FR","region":"FR-NAQ","lat":45.7292,"lng":0.2215},{"iata":"ANI","name":"Aniak","country":"US","region":"US-AK","lat":61.5816,"lng":-159.543},{"iata":"ANK","name":"Ankara","country":"TR","region":"TR-06","lat":39.9498,"lng":32.6886},{"iata":"ANM","name":"Antsirabe","country":"MG","region":"MG-D","lat":-14.9994,"lng":50.3202},{"iata":"ANN","name":"Metlakatla","country":"US","region":"US-AK","lat":55.0377,"lng":-131.5726},{"iata":"ANR","name":"Antwerp","country":"BE","region":"BE-VAN","lat":51.1907,"lng":4.4632},{"iata":"ANU","name":"Osbourn","country":"AG","region":"AG-03","lat":17.1367,"lng":-61.7927},{"iata":"ANV","name":"Anvik","country":"US","region":"US-AK","lat":62.6467,"lng":-160.191},{"iata":"ANX","name":"Andenes","country":"NO","region":"NO-18","lat":69.2952,"lng":16.1394},{"iata":"AOC","name":"Nobitz","country":"DE","region":"DE-TH","lat":50.9819,"lng":12.5064},{"iata":"AOE","name":"Eski\u015fehir","country":"TR","region":"TR-26","lat":39.8116,"lng":30.5193},{"iata":"AOG","name":"Anshan","country":"CN","region":"CN-21","lat":41.1053,"lng":122.854},{"iata":"AOI","name":"Falconara Marittima (AN)","country":"IT","region":"IT-57","lat":43.6163,"lng":13.3623},{"iata":"AOJ","name":"Aomori","country":"JP","region":"JP-02","lat":40.7338,"lng":140.6895},{"iata":"AOK","name":"Karpathos Island","country":"GR","region":"GR-L","lat":35.4214,"lng":27.146},{"iata":"AOL","name":"Paso de los Libres","country":"AR","region":"AR-W","lat":-29.6894,"lng":-57.1521},{"iata":"AOO","name":"Altoona","country":"US","region":"US-PA","lat":40.2964,"lng":-78.32},{"iata":"AOR","name":"Alor Satar","country":"MY","region":"MY-02","lat":6.1897,"lng":100.398},{"iata":"AOT","name":"Saint-Christophe (AO)","country":"IT","region":"IT-23","lat":45.7386,"lng":7.3683},{"iata":"APA","name":"Denver","country":"US","region":"US-CO","lat":39.5701,"lng":-104.849},{"iata":"APF","name":"Naples","country":"US","region":"US-FL","lat":26.1526,"lng":-81.7753},{"iata":"APG","name":"Aberdeen","country":"US","region":"US-MD","lat":39.4662,"lng":-76.1688},{"iata":"API","name":"Apiay","country":"CO","region":"CO-MET","lat":4.0761,"lng":-73.5627},{"iata":"APJ","name":"Burang Town","country":"CN","region":"CN-54","lat":30.3979,"lng":81.1332},{"iata":"APL","name":"Nampula","country":"MZ","region":"MZ-N","lat":-15.1056,"lng":39.2818},{"iata":"APN","name":"Alpena","country":"US","region":"US-MI","lat":45.0781,"lng":-83.5603},{"iata":"APO","name":"Carepa","country":"CO","region":"CO-ANT","lat":7.812,"lng":-76.7164},{"iata":"APW","name":"Apia","country":"WS","region":"WS-AA","lat":-13.83,"lng":-172.008},{"iata":"APZ","name":"Zapala","country":"AR","region":"AR-Q","lat":-38.9755,"lng":-70.1136},{"iata":"AQA","name":"Araraquara","country":"BR","region":"BR-SP","lat":-21.812,"lng":-48.133},{"iata":"AQG","name":"Anqing","country":"CN","region":"CN-34","lat":30.5822,"lng":117.05},{"iata":"AQI","name":"Qaisumah","country":"SA","region":"SA-04","lat":28.3357,"lng":46.1271},{"iata":"AQJ","name":"Aqaba","country":"JO","region":"JO-AQ","lat":29.6116,"lng":35.0181},{"iata":"AQP","name":"Arequipa","country":"PE","region":"PE-ARE","lat":-16.3408,"lng":-71.5695},{"iata":"ARA","name":"New Iberia","country":"US","region":"US-LA","lat":30.0378,"lng":-91.8839},{"iata":"ARC","name":"Arctic Village","country":"US","region":"US-AK","lat":68.1147,"lng":-145.579},{"iata":"ARE","name":"Arecibo","country":"PR","region":"PR-U-A","lat":18.4508,"lng":-66.6758},{"iata":"ARH","name":"Archangelsk","country":"RU","region":"RU-ARK","lat":64.6003,"lng":40.7167},{"iata":"ARI","name":"Arica","country":"CL","region":"CL-AP","lat":-18.3485,"lng":-70.3387},{"iata":"ARK","name":"Arusha","country":"TZ","region":"TZ-01","lat":-3.3678,"lng":36.6333},{"iata":"ARM","name":"Armidale","country":"AU","region":"AU-NSW","lat":-30.5281,"lng":151.617},{"iata":"ARN","name":"Stockholm","country":"SE","region":"SE-AB","lat":59.6485,"lng":17.9288},{"iata":"ART","name":"Watertown","country":"US","region":"US-NY","lat":43.9919,"lng":-76.0217},{"iata":"ARU","name":"Ara\u00e7atuba","country":"BR","region":"BR-SP","lat":-21.1415,"lng":-50.4246},{"iata":"ARW","name":"Arad","country":"RO","region":"RO-AR","lat":46.1761,"lng":21.2643},{"iata":"ARX","name":"Aracati","country":"BR","region":"BR-CE","lat":-4.5689,"lng":-37.8051},{"iata":"ARY","name":"Ararat","country":"AU","region":"AU-VIC","lat":-37.31,"lng":142.9887},{"iata":"ASA","name":"Assab","country":"ER","region":"ER-DK","lat":13.0718,"lng":42.645},{"iata":"ASB","name":"Ashgabat","country":"TM","region":"TM-S","lat":37.9868,"lng":58.361},{"iata":"ASD","name":"Andros Town","country":"BS","region":"BS-NS","lat":24.6979,"lng":-77.7956},{"iata":"ASE","name":"Aspen","country":"US","region":"US-CO","lat":39.2232,"lng":-106.869},{"iata":"ASF","name":"Astrakhan","country":"RU","region":"RU-AST","lat":46.2828,"lng":48.0105},{"iata":"ASI","name":"Cat Hill","country":"SH","region":"SH-AC","lat":-7.9702,"lng":-14.3927},{"iata":"ASJ","name":"Amami","country":"JP","region":"JP-46","lat":28.4306,"lng":129.713},{"iata":"ASK","name":"Yamoussoukro","country":"CI","region":"CI-YM","lat":6.9032,"lng":-5.3656},{"iata":"ASM","name":"Asmara","country":"ER","region":"ER-SK","lat":15.2919,"lng":38.9107},{"iata":"ASO","name":"Asosa","country":"ET","region":"ET-BE","lat":10.0185,"lng":34.5863},{"iata":"ASP","name":"Alice Springs","country":"AU","region":"AU-NT","lat":-23.8066,"lng":133.9034},{"iata":"ASR","name":"Kayseri","country":"TR","region":"TR-38","lat":38.7704,"lng":35.4954},{"iata":"AST","name":"Astoria","country":"US","region":"US-OR","lat":46.158,"lng":-123.879},{"iata":"ASU","name":"Asunci\u00f3n","country":"PY","region":"PY-11","lat":-25.2402,"lng":-57.5192},{"iata":"ASV","name":"Amboseli National Park","country":"KE","region":"KE-700","lat":-2.6451,"lng":37.2531},{"iata":"ASW","name":"Aswan","country":"EG","region":"EG-ASN","lat":23.9611,"lng":32.8204},{"iata":"ATA","name":"Anta","country":"PE","region":"PE-ANC","lat":-9.3474,"lng":-77.5984},{"iata":"ATC","name":"Arthur's Town","country":"BS","region":"BS-CI","lat":24.6294,"lng":-75.6738},{"iata":"ATF","name":"Ambato","country":"EC","region":"EC-T","lat":-1.2121,"lng":-78.5746},{"iata":"ATG","name":"Kamra","country":"PK","region":"PK-PB","lat":33.8691,"lng":72.4009},{"iata":"ATH","name":"Spata-Artemida","country":"GR","region":"GR-I","lat":37.9364,"lng":23.9445},{"iata":"ATK","name":"Atqasuk","country":"US","region":"US-AK","lat":70.467,"lng":-157.436},{"iata":"ATL","name":"Atlanta","country":"US","region":"US-GA","lat":33.6367,"lng":-84.4281},{"iata":"ATM","name":"Altamira","country":"BR","region":"BR-PA","lat":-3.2531,"lng":-52.2539},{"iata":"ATQ","name":"Amritsar","country":"IN","region":"IN-PB","lat":31.7096,"lng":74.7973},{"iata":"ATR","name":"Atar","country":"MR","region":"MR-07","lat":20.5058,"lng":-13.0437},{"iata":"ATW","name":"Appleton","country":"US","region":"US-WI","lat":44.2585,"lng":-88.519},{"iata":"ATY","name":"Watertown","country":"US","region":"US-SD","lat":44.914,"lng":-97.1547},{"iata":"ATZ","name":"Asyut","country":"EG","region":"EG-AST","lat":27.046,"lng":31.0128},{"iata":"AUA","name":"Oranjestad","country":"AW","region":"AW-U-A","lat":12.5011,"lng":-70.0143},{"iata":"AUC","name":"Arauca","country":"CO","region":"CO-ARA","lat":7.0689,"lng":-70.7369},{"iata":"AUF","name":"Auxerre","country":"FR","region":"FR-BFC","lat":47.8502,"lng":3.4971},{"iata":"AUG","name":"Augusta","country":"US","region":"US-ME","lat":44.3206,"lng":-69.7973},{"iata":"AUH","name":"Abu Dhabi","country":"AE","region":"AE-AZ","lat":24.441,"lng":54.6492},{"iata":"AUQ","name":"Hiva Oa Island","country":"PF","region":"PF-U-A","lat":-9.7688,"lng":-139.011},{"iata":"AUR","name":"Aurillac","country":"FR","region":"FR-ARA","lat":44.8914,"lng":2.4219},{"iata":"AUS","name":"Austin","country":"US","region":"US-TX","lat":30.1975,"lng":-97.662},{"iata":"AUW","name":"Wausau","country":"US","region":"US-WI","lat":44.9262,"lng":-89.6266},{"iata":"AUX","name":"Aragua\u00edna","country":"BR","region":"BR-TO","lat":-7.2279,"lng":-48.2405},{"iata":"AVA","name":"Anshun (Xixiu)","country":"CN","region":"CN-52","lat":26.2606,"lng":105.8733},{"iata":"AVB","name":"Aviano (PN)","country":"IT","region":"IT-36","lat":46.0319,"lng":12.5965},{"iata":"AVI","name":"Ciro Redondo","country":"CU","region":"CU-08","lat":22.0271,"lng":-78.7896},{"iata":"AVK","name":"Arvaikheer","country":"MN","region":"MN-055","lat":46.2503,"lng":102.802},{"iata":"AVL","name":"Asheville","country":"US","region":"US-NC","lat":35.4355,"lng":-82.5419},{"iata":"AVN","name":"Avignon","country":"FR","region":"FR-PAC","lat":43.9073,"lng":4.9018},{"iata":"AVP","name":"Wilkes-Barre/Scranton","country":"US","region":"US-PA","lat":41.3371,"lng":-75.7242},{"iata":"AVV","name":"Geelong/Melbourne","country":"AU","region":"AU-VIC","lat":-38.0403,"lng":144.4672},{"iata":"AWA","name":"Hawassa","country":"ET","region":"ET-XSD","lat":7.1006,"lng":38.3965},{"iata":"AWK","name":"Wake Island","country":"UM","region":"UM-79","lat":19.2824,"lng":166.6366},{"iata":"AWZ","name":"Ahvaz","country":"IR","region":"IR-06","lat":31.3364,"lng":48.7638},{"iata":"AXA","name":"The Valley","country":"AI","region":"AI-U-A","lat":18.2048,"lng":-63.0538},{"iata":"AXD","name":"Alexandroupolis","country":"GR","region":"GR-A","lat":40.8559,"lng":25.9563},{"iata":"AXF","name":"Bayanhot","country":"CN","region":"CN-15","lat":38.7483,"lng":105.5842},{"iata":"AXJ","name":"Amakusa","country":"JP","region":"JP-43","lat":32.4825,"lng":130.159},{"iata":"AXK","name":"Ataq","country":"YE","region":"YE-SH","lat":14.5513,"lng":46.8262},{"iata":"AXM","name":"Armenia","country":"CO","region":"CO-QUI","lat":4.4528,"lng":-75.7664},{"iata":"AXN","name":"Alexandria","country":"US","region":"US-MN","lat":45.8663,"lng":-95.3947},{"iata":"AXP","name":"Spring Point","country":"BS","region":"BS-AK","lat":22.4418,"lng":-73.9709},{"iata":"AXR","name":"Arutua Airport","country":"PF","region":"PF-U-A","lat":-15.2483,"lng":-146.617},{"iata":"AXT","name":"Akita","country":"JP","region":"JP-05","lat":39.6156,"lng":140.219},{"iata":"AXU","name":"Axum","country":"ET","region":"ET-TI","lat":14.1468,"lng":38.7728},{"iata":"AYJ","name":"Faizabad","country":"IN","region":"IN-UP","lat":26.7477,"lng":82.1637},{"iata":"AYO","name":"Ayolas","country":"PY","region":"PY-8","lat":-27.3784,"lng":-56.8568},{"iata":"AYP","name":"Ayacucho","country":"PE","region":"PE-AYA","lat":-13.1548,"lng":-74.2044},{"iata":"AYQ","name":"Yulara","country":"AU","region":"AU-NT","lat":-25.1859,"lng":130.977},{"iata":"AYT","name":"Antalya","country":"TR","region":"TR-07","lat":36.8987,"lng":30.8005},{"iata":"AYX","name":"Atalaya","country":"PE","region":"PE-UCA","lat":-10.7291,"lng":-73.7665},{"iata":"AZA","name":"Mesa","country":"US","region":"US-AZ","lat":33.3078,"lng":-111.655},{"iata":"AZD","name":"Yazd","country":"IR","region":"IR-21","lat":31.9049,"lng":54.2765},{"iata":"AZI","name":"Abu Dhabi","country":"AE","region":"AE-AZ","lat":24.4271,"lng":54.4599},{"iata":"AZN","name":"Andijan","country":"UZ","region":"UZ-AN","lat":40.7277,"lng":72.294},{"iata":"AZO","name":"Kalamazoo","country":"US","region":"US-MI","lat":42.2321,"lng":-85.5496},{"iata":"AZR","name":"Adrar","country":"DZ","region":"DZ-01","lat":27.8376,"lng":-0.1864},{"iata":"AZS","name":"Samana","country":"DO","region":"DO-20","lat":19.2693,"lng":-69.7374},{"iata":"BAB","name":"Beale Air Force Base","country":"US","region":"US-CA","lat":39.1361,"lng":-121.437},{"iata":"BAD","name":"Bossier City","country":"US","region":"US-LA","lat":32.5018,"lng":-93.6627},{"iata":"BAF","name":"Westfield","country":"US","region":"US-MA","lat":42.1578,"lng":-72.7156},{"iata":"BAG","name":"Baguio","country":"PH","region":"PH-BAG","lat":16.375,"lng":120.6199},{"iata":"BAH","name":"Manama","country":"BH","region":"BH-15","lat":26.2673,"lng":50.6376},{"iata":"BAI","name":"Punta Arenas","country":"CR","region":"CR-P","lat":9.1639,"lng":-83.3302},{"iata":"BAL","name":"Batman","country":"TR","region":"TR-72","lat":37.929,"lng":41.1166},{"iata":"BAQ","name":"Barranquilla","country":"CO","region":"CO-ATL","lat":10.8896,"lng":-74.7808},{"iata":"BAR","name":"Qionghai (Basuo)","country":"CN","region":"CN-46","lat":19.141,"lng":110.4528},{"iata":"BAT","name":"Barretos","country":"BR","region":"BR-SP","lat":-20.5846,"lng":-48.5941},{"iata":"BAV","name":"Baotou","country":"CN","region":"CN-15","lat":40.56,"lng":109.997},{"iata":"BAX","name":"Barnaul","country":"RU","region":"RU-ALT","lat":53.3613,"lng":83.5397},{"iata":"BAY","name":"T\u0103u\u021bii-M\u0103gher\u0103u\u0219","country":"RO","region":"RO-MM","lat":47.6584,"lng":23.4644},{"iata":"BBA","name":"Balmaceda","country":"CL","region":"CL-AI","lat":-45.916,"lng":-71.6895},{"iata":"BBD","name":"Brady","country":"US","region":"US-TX","lat":31.1789,"lng":-99.3247},{"iata":"BBI","name":"Bhubaneswar","country":"IN","region":"IN-OR","lat":20.251,"lng":85.8147},{"iata":"BBK","name":"Kasane","country":"BW","region":"BW-CH","lat":-17.8317,"lng":25.1662},{"iata":"BBM","name":"Battambang","country":"KH","region":"KH-2","lat":13.0956,"lng":103.224},{"iata":"BBN","name":"Bario","country":"MY","region":"MY-13","lat":3.7346,"lng":115.4785},{"iata":"BBO","name":"Berbera","country":"SO","region":"SO-WO","lat":10.385,"lng":44.9367},{"iata":"BBQ","name":"Codrington","country":"AG","region":"AG-10","lat":17.6212,"lng":-61.7983},{"iata":"BBS","name":"Camberley, Surrey","country":"GB","region":"GB-ENG","lat":51.3239,"lng":-0.8475},{"iata":"BBT","name":"Berb\u00e9rati","country":"CF","region":"CF-HS","lat":4.2216,"lng":15.7864},{"iata":"BBU","name":"Bucharest","country":"RO","region":"RO-B","lat":44.5031,"lng":26.1029},{"iata":"BCA","name":"Baracoa","country":"CU","region":"CU-14","lat":20.3653,"lng":-74.5062},{"iata":"BCD","name":"Bacolod City","country":"PH","region":"PH-NEC","lat":10.7762,"lng":123.0189},{"iata":"BCE","name":"Bryce Canyon","country":"US","region":"US-UT","lat":37.7064,"lng":-112.145},{"iata":"BCH","name":"Baucau","country":"TL","region":"TL-BA","lat":-8.4865,"lng":126.4},{"iata":"BCI","name":"Barcaldine","country":"AU","region":"AU-QLD","lat":-23.5663,"lng":145.3021},{"iata":"BCL","name":"Pococi","country":"CR","region":"CR-L","lat":10.7687,"lng":-83.5856},{"iata":"BCM","name":"Bac\u0103u","country":"RO","region":"RO-BC","lat":46.5219,"lng":26.9103},{"iata":"BCN","name":"Barcelona","country":"ES","region":"ES-CT","lat":41.2971,"lng":2.0785},{"iata":"BCO","name":"Jinka","country":"ET","region":"ET-SN","lat":5.7497,"lng":36.5602},{"iata":"BCQ","name":"Brak","country":"LY","region":"LY-SH","lat":27.653,"lng":14.272},{"iata":"BCT","name":"Boca Raton","country":"US","region":"US-FL","lat":26.3785,"lng":-80.1077},{"iata":"BCU","name":"Bauchi","country":"NG","region":"NG-BA","lat":10.4828,"lng":9.744},{"iata":"BCW","name":"Benguera Island","country":"MZ","region":"MZ-I","lat":-21.8533,"lng":35.4383},{"iata":"BDA","name":"Hamilton","country":"BM","region":"BM-U-A","lat":32.3638,"lng":-64.6782},{"iata":"BDB","name":"Bundaberg","country":"AU","region":"AU-QLD","lat":-24.905,"lng":152.3226},{"iata":"BDE","name":"Baudette","country":"US","region":"US-MN","lat":48.7284,"lng":-94.6122},{"iata":"BDH","name":"Bandar Lengeh","country":"IR","region":"IR-22","lat":26.5323,"lng":54.8248},{"iata":"BDJ","name":"Banjarbaru","country":"ID","region":"ID-KS","lat":-3.4401,"lng":114.7612},{"iata":"BDL","name":"Hartford","country":"US","region":"US-CT","lat":41.9386,"lng":-72.688},{"iata":"BDM","name":"Band\u0131rma","country":"TR","region":"TR-10","lat":40.318,"lng":27.9777},{"iata":"BDO","name":"Bandung","country":"ID","region":"ID-JB","lat":-6.9006,"lng":107.576},{"iata":"BDQ","name":"Vadodara","country":"IN","region":"IN-GJ","lat":22.3362,"lng":73.2263},{"iata":"BDR","name":"Bridgeport","country":"US","region":"US-CT","lat":41.1635,"lng":-73.1262},{"iata":"BDS","name":"Brindisi","country":"IT","region":"IT-75","lat":40.6576,"lng":17.947},{"iata":"BDT","name":"Gbadolite","country":"CD","region":"CD-NU","lat":4.2527,"lng":20.9753},{"iata":"BDU","name":"M\u00e5lselv","country":"NO","region":"NO-55","lat":69.0558,"lng":18.5404},{"iata":"BEB","name":"Balivanich","country":"GB","region":"GB-SCT","lat":57.4811,"lng":-7.3628},{"iata":"BED","name":"Bedford","country":"US","region":"US-MA","lat":42.47,"lng":-71.289},{"iata":"BEF","name":"Bluefields","country":"NI","region":"NI-AS","lat":11.991,"lng":-83.7741},{"iata":"BEG","name":"Belgrade","country":"RS","region":"RS-00","lat":44.8184,"lng":20.3091},{"iata":"BEJ","name":"Tanjung Redeb - Borneo Island","country":"ID","region":"ID-KI","lat":2.1478,"lng":117.4307},{"iata":"BEK","name":"Bareilly","country":"IN","region":"IN-UP","lat":28.4221,"lng":79.4508},{"iata":"BEL","name":"Bel\u00e9m","country":"BR","region":"BR-PA","lat":-1.3793,"lng":-48.4762},{"iata":"BEM","name":"Oulad Yaich","country":"MA","region":"MA-05","lat":32.4019,"lng":-6.3159},{"iata":"BEN","name":"Benina","country":"LY","region":"LY-BA","lat":32.0968,"lng":20.2695},{"iata":"BEP","name":"Bellary","country":"IN","region":"IN-KA","lat":15.1628,"lng":76.8828},{"iata":"BEQ","name":"Bury Saint Edmunds, Suffolk","country":"GB","region":"GB-ENG","lat":52.3426,"lng":0.7729},{"iata":"BER","name":"Berlin","country":"DE","region":"DE-BR","lat":52.3617,"lng":13.5023},{"iata":"BES","name":"Brest","country":"FR","region":"FR-BRE","lat":48.4479,"lng":-4.4185},{"iata":"BET","name":"Bethel","country":"US","region":"US-AK","lat":60.7798,"lng":-161.838},{"iata":"BEU","name":"Bedourie","country":"AU","region":"AU-QLD","lat":-24.3461,"lng":139.46},{"iata":"BEW","name":"Beira","country":"MZ","region":"MZ-S","lat":-19.7964,"lng":34.9076},{"iata":"BEX","name":"Wallingford, Oxfordshire","country":"GB","region":"GB-ENG","lat":51.6144,"lng":-1.096},{"iata":"BEY","name":"Beirut","country":"LB","region":"LB-JL","lat":33.8198,"lng":35.4874},{"iata":"BFD","name":"Bradford","country":"US","region":"US-PA","lat":41.8031,"lng":-78.6401},{"iata":"BFE","name":"Bielefeld","country":"DE","region":"DE-NW","lat":51.9647,"lng":8.5444},{"iata":"BFF","name":"Scottsbluff","country":"US","region":"US-NE","lat":41.874,"lng":-103.596},{"iata":"BFH","name":"Curitiba","country":"BR","region":"BR-PR","lat":-25.4051,"lng":-49.232},{"iata":"BFI","name":"Seattle","country":"US","region":"US-WA","lat":47.527,"lng":-122.2999},{"iata":"BFJ","name":"Bijie","country":"CN","region":"CN-52","lat":27.2671,"lng":105.4721},{"iata":"BFK","name":"Aurora","country":"US","region":"US-CO","lat":39.7017,"lng":-104.752},{"iata":"BFL","name":"Bakersfield","country":"US","region":"US-CA","lat":35.4336,"lng":-119.057},{"iata":"BFM","name":"Mobile","country":"US","region":"US-AL","lat":30.6268,"lng":-88.0681},{"iata":"BFN","name":"Bloemfontein","country":"ZA","region":"ZA-FS","lat":-29.0927,"lng":26.3024},{"iata":"BFO","name":"Chiredzi","country":"ZW","region":"ZW-MV","lat":-21.0081,"lng":31.5786},{"iata":"BFP","name":"Beaver Falls","country":"US","region":"US-PA","lat":40.7725,"lng":-80.3914},{"iata":"BFS","name":"Belfast","country":"GB","region":"GB-NIR","lat":54.6575,"lng":-6.2158},{"iata":"BFU","name":"Bengbu","country":"CN","region":"CN-34","lat":32.8477,"lng":117.3202},{"iata":"BFV","name":"Buriram","country":"TH","region":"TH-31","lat":15.2295,"lng":103.253},{"iata":"BFX","name":"Bafoussam","country":"CM","region":"CM-OU","lat":5.5369,"lng":10.3546},{"iata":"BFY","name":"Bengbu","country":"CN","region":"CN-34","lat":33.1663,"lng":117.0583},{"iata":"BGA","name":"Bucaramanga","country":"CO","region":"CO-SAN","lat":7.1265,"lng":-73.1848},{"iata":"BGC","name":"Bragan\u00e7a","country":"PT","region":"PT-04","lat":41.8578,"lng":-6.7071},{"iata":"BGF","name":"Bangui","country":"CF","region":"CF-MP","lat":4.3985,"lng":18.5188},{"iata":"BGI","name":"Bridgetown","country":"BB","region":"BB-01","lat":13.0747,"lng":-59.491},{"iata":"BGM","name":"Binghamton","country":"US","region":"US-NY","lat":42.2087,"lng":-75.9798},{"iata":"BGN","name":"Belaya Gora","country":"RU","region":"RU-SA","lat":68.5562,"lng":146.2278},{"iata":"BGO","name":"Bergen","country":"NO","region":"NO-46","lat":60.2934,"lng":5.2181},{"iata":"BGR","name":"Bangor","country":"US","region":"US-ME","lat":44.8064,"lng":-68.8267},{"iata":"BGW","name":"Baghdad","country":"IQ","region":"IQ-BG","lat":33.2625,"lng":44.2346},{"iata":"BGX","name":"Bag\u00e9","country":"BR","region":"BR-RS","lat":-31.3905,"lng":-54.1122},{"iata":"BGY","name":"Orio al Serio (BG)","country":"IT","region":"IT-25","lat":45.6694,"lng":9.7089},{"iata":"BHB","name":"Bar Harbor","country":"US","region":"US-ME","lat":44.45,"lng":-68.3615},{"iata":"BHD","name":"Belfast","country":"GB","region":"GB-NIR","lat":54.6181,"lng":-5.8725},{"iata":"BHE","name":"Blenheim","country":"NZ","region":"NZ-MBH","lat":-41.5183,"lng":173.87},{"iata":"BHH","name":"Bisha","country":"SA","region":"SA-14","lat":19.9844,"lng":42.6209},{"iata":"BHI","name":"Bah\u00eda Blanca","country":"AR","region":"AR-B","lat":-38.725,"lng":-62.1693},{"iata":"BHJ","name":"Bhuj","country":"IN","region":"IN-GJ","lat":23.2878,"lng":69.6702},{"iata":"BHK","name":"Bukhara","country":"UZ","region":"UZ-BU","lat":39.7753,"lng":64.4823},{"iata":"BHM","name":"Birmingham","country":"US","region":"US-AL","lat":33.5629,"lng":-86.7507},{"iata":"BHO","name":"Bhopal","country":"IN","region":"IN-MP","lat":23.2875,"lng":77.3374},{"iata":"BHQ","name":"Broken Hill","country":"AU","region":"AU-NSW","lat":-32.0014,"lng":141.472},{"iata":"BHS","name":"Bathurst","country":"AU","region":"AU-NSW","lat":-33.4068,"lng":149.6512},{"iata":"BHU","name":"Bhavnagar","country":"IN","region":"IN-GJ","lat":21.7522,"lng":72.1852},{"iata":"BHV","name":"Bahawalpur","country":"PK","region":"PK-PB","lat":29.3481,"lng":71.718},{"iata":"BHX","name":"Birmingham, West Midlands","country":"GB","region":"GB-ENG","lat":52.4539,"lng":-1.748},{"iata":"BHY","name":"Beihai","country":"CN","region":"CN-45","lat":21.5387,"lng":109.2937},{"iata":"BIA","name":"Bastia","country":"FR","region":"FR-COR","lat":42.5527,"lng":9.4837},{"iata":"BIF","name":"Fort Bliss/El Paso","country":"US","region":"US-TX","lat":31.8495,"lng":-106.38},{"iata":"BIG","name":"Delta Junction Ft Greely","country":"US","region":"US-AK","lat":63.9945,"lng":-145.722},{"iata":"BIH","name":"Bishop","country":"US","region":"US-CA","lat":37.3731,"lng":-118.364},{"iata":"BIK","name":"Biak","country":"ID","region":"ID-PA","lat":-1.19,"lng":136.108},{"iata":"BIL","name":"Billings","country":"US","region":"US-MT","lat":45.8089,"lng":-108.5412},{"iata":"BIM","name":"South Bimini","country":"BS","region":"BS-BI","lat":25.6999,"lng":-79.2647},{"iata":"BIO","name":"Bilbao","country":"ES","region":"ES-PV","lat":43.3011,"lng":-2.9106},{"iata":"BIQ","name":"Biarritz","country":"FR","region":"FR-NAQ","lat":43.4684,"lng":-1.5232},{"iata":"BIR","name":"Biratnagar","country":"NP","region":"NP-P1","lat":26.4815,"lng":87.264},{"iata":"BIS","name":"Bismarck","country":"US","region":"US-ND","lat":46.7727,"lng":-100.7469},{"iata":"BIU","name":"Bildudalur","country":"IS","region":"IS-4","lat":65.6413,"lng":-23.5462},{"iata":"BIX","name":"Biloxi","country":"US","region":"US-MS","lat":30.4104,"lng":-88.9244},{"iata":"BIY","name":"Bisho","country":"ZA","region":"ZA-EC","lat":-32.8971,"lng":27.2791},{"iata":"BJA","name":"B\u00e9ja\u00efa","country":"DZ","region":"DZ-06","lat":36.7125,"lng":5.0699},{"iata":"BJB","name":"Bojnord","country":"IR","region":"IR-28","lat":37.493,"lng":57.3082},{"iata":"BJC","name":"Denver","country":"US","region":"US-CO","lat":39.9088,"lng":-105.117},{"iata":"BJF","name":"B\u00e5tsfjord","country":"NO","region":"NO-56","lat":70.6003,"lng":29.6926},{"iata":"BJI","name":"Bemidji","country":"US","region":"US-MN","lat":47.5094,"lng":-94.9337},{"iata":"BJL","name":"Yundum","country":"GM","region":"GM-W","lat":13.338,"lng":-16.6522},{"iata":"BJM","name":"Bujumbura","country":"BI","region":"BI-BM","lat":-3.324,"lng":29.3185},{"iata":"BJO","name":"Bermejo","country":"BO","region":"BO-T","lat":-22.7733,"lng":-64.3129},{"iata":"BJR","name":"Bahir Dar","country":"ET","region":"ET-AM","lat":11.6081,"lng":37.3216},{"iata":"BJV","name":"Bodrum","country":"TR","region":"TR-48","lat":37.2493,"lng":27.664},{"iata":"BJX","name":"Silao","country":"MX","region":"MX-GUA","lat":20.9927,"lng":-101.4803},{"iata":"BJY","name":"Zemun","country":"RS","region":"RS-00","lat":44.9353,"lng":20.2575},{"iata":"BJZ","name":"Badajoz","country":"ES","region":"ES-EX","lat":38.8913,"lng":-6.8213},{"iata":"BKA","name":"Baykit","country":"RU","region":"RU-KYA","lat":61.6767,"lng":96.355},{"iata":"BKB","name":"Bikaner","country":"IN","region":"IN-RJ","lat":28.0706,"lng":73.2072},{"iata":"BKE","name":"Baker City","country":"US","region":"US-OR","lat":44.8373,"lng":-117.809},{"iata":"BKG","name":"Branson","country":"US","region":"US-MO","lat":36.5321,"lng":-93.2005},{"iata":"BKH","name":"Kekaha","country":"US","region":"US-HI","lat":22.0228,"lng":-159.785},{"iata":"BKI","name":"Kota Kinabalu","country":"MY","region":"MY-12","lat":5.9327,"lng":116.0493},{"iata":"BKK","name":"Bangkok","country":"TH","region":"TH-10","lat":13.6811,"lng":100.747},{"iata":"BKL","name":"Cleveland","country":"US","region":"US-OH","lat":41.5175,"lng":-81.6833},{"iata":"BKN","name":"Balkanabat","country":"TM","region":"TM-B","lat":39.6811,"lng":54.206},{"iata":"BKO","name":"Bamako","country":"ML","region":"ML-2","lat":12.5335,"lng":-7.9499},{"iata":"BKQ","name":"Blackall","country":"AU","region":"AU-QLD","lat":-24.4317,"lng":145.4297},{"iata":"BKS","name":"Bengkulu","country":"ID","region":"ID-BE","lat":-3.8637,"lng":102.339},{"iata":"BKW","name":"Beaver","country":"US","region":"US-WV","lat":37.7873,"lng":-81.1242},{"iata":"BKY","name":"Kamakombe","country":"CD","region":"CD-SK","lat":-2.309,"lng":28.8088},{"iata":"BLA","name":"Barcelona","country":"VE","region":"VE-B","lat":10.1111,"lng":-64.6922},{"iata":"BLD","name":"Boulder City","country":"US","region":"US-NV","lat":35.9472,"lng":-114.8588},{"iata":"BLE","name":"Borlange","country":"SE","region":"SE-W","lat":60.422,"lng":15.5152},{"iata":"BLF","name":"Bluefield","country":"US","region":"US-WV","lat":37.2958,"lng":-81.2077},{"iata":"BLH","name":"Blythe","country":"US","region":"US-CA","lat":33.6192,"lng":-114.717},{"iata":"BLI","name":"Bellingham","country":"US","region":"US-WA","lat":48.7928,"lng":-122.538},{"iata":"BLJ","name":"Batna","country":"DZ","region":"DZ-05","lat":35.7521,"lng":6.3086},{"iata":"BLK","name":"Blackpool","country":"GB","region":"GB-ENG","lat":53.7717,"lng":-3.0286},{"iata":"BLL","name":"Billund","country":"DK","region":"DK-83","lat":55.7403,"lng":9.157},{"iata":"BLN","name":"Benalla","country":"AU","region":"AU-VIC","lat":-36.5519,"lng":146.007},{"iata":"BLQ","name":"Bologna","country":"IT","region":"IT-45","lat":44.5354,"lng":11.2887},{"iata":"BLR","name":"Bengaluru","country":"IN","region":"IN-KA","lat":13.1979,"lng":77.7063},{"iata":"BLT","name":"Blackwater Airport","country":"AU","region":"AU-QLD","lat":-23.6031,"lng":148.807},{"iata":"BLV","name":"Belleville","country":"US","region":"US-IL","lat":38.5452,"lng":-89.8352},{"iata":"BLZ","name":"Blantyre","country":"MW","region":"MW-BL","lat":-15.6772,"lng":34.9723},{"iata":"BMA","name":"Stockholm","country":"SE","region":"SE-AB","lat":59.3544,"lng":17.9417},{"iata":"BME","name":"Broome","country":"AU","region":"AU-WA","lat":-17.9492,"lng":122.2283},{"iata":"BMG","name":"Bloomington","country":"US","region":"US-IN","lat":39.146,"lng":-86.6167},{"iata":"BMI","name":"Bloomington/Normal","country":"US","region":"US-IL","lat":40.4771,"lng":-88.9159},{"iata":"BMM","name":"Bitam","country":"GA","region":"GA-9","lat":2.0756,"lng":11.4932},{"iata":"BMU","name":"Bima","country":"ID","region":"ID-NB","lat":-8.5372,"lng":118.685},{"iata":"BMV","name":"Buon Ma Thuot","country":"VN","region":"VN-CH","lat":12.6683,"lng":108.12},{"iata":"BNA","name":"Nashville","country":"US","region":"US-TN","lat":36.1245,"lng":-86.6782},{"iata":"BND","name":"Bandar Abbas","country":"IR","region":"IR-22","lat":27.2183,"lng":56.3778},{"iata":"BNE","name":"Brisbane","country":"AU","region":"AU-QLD","lat":-27.3842,"lng":153.117},{"iata":"BNI","name":"Benin","country":"NG","region":"NG-ED","lat":6.317,"lng":5.5995},{"iata":"BNK","name":"Ballina","country":"AU","region":"AU-NSW","lat":-28.8332,"lng":153.5615},{"iata":"BNN","name":"Br\u00f8nn\u00f8y","country":"NO","region":"NO-18","lat":65.4611,"lng":12.2175},{"iata":"BNO","name":"Burns","country":"US","region":"US-OR","lat":43.5905,"lng":-118.9552},{"iata":"BNS","name":"Barinas","country":"VE","region":"VE-E","lat":8.615,"lng":-70.2142},{"iata":"BNX","name":"Mahovljani","country":"BA","region":"BA-SRP","lat":44.9414,"lng":17.2975},{"iata":"BOB","name":"Motu Mute","country":"PF","region":"PF-U-A","lat":-16.4444,"lng":-151.751},{"iata":"BOC","name":"Isla Col\u00f3n","country":"PA","region":"PA-1","lat":9.3408,"lng":-82.2508},{"iata":"BOD","name":"Bordeaux","country":"FR","region":"FR-NAQ","lat":44.8287,"lng":-0.7154},{"iata":"BOG","name":"Bogota","country":"CO","region":"CO-DC","lat":4.7016,"lng":-74.1469},{"iata":"BOH","name":"Bournemouth","country":"GB","region":"GB-ENG","lat":50.7805,"lng":-1.8396},{"iata":"BOI","name":"Boise","country":"US","region":"US-ID","lat":43.5644,"lng":-116.223},{"iata":"BOJ","name":"Burgas","country":"BG","region":"BG-02","lat":42.5699,"lng":27.5152},{"iata":"BOM","name":"Mumbai","country":"IN","region":"IN-MM","lat":19.0887,"lng":72.8679},{"iata":"BON","name":"Kralendijk","country":"BQ","region":"BQ-BO","lat":12.131,"lng":-68.2685},{"iata":"BOO","name":"Bod\u00f8","country":"NO","region":"NO-18","lat":67.2692,"lng":14.3653},{"iata":"BOR","name":"Ton Phueng","country":"LA","region":"LA-BK","lat":20.324,"lng":100.1654},{"iata":"BOS","name":"Boston","country":"US","region":"US-MA","lat":42.362,"lng":-71.0079},{"iata":"BOU","name":"Bourges","country":"FR","region":"FR-CVL","lat":47.0602,"lng":2.3696},{"iata":"BOY","name":"Bobo Dioulasso","country":"BF","region":"BF-HOU","lat":11.1601,"lng":-4.331},{"iata":"BPC","name":"Bamenda","country":"CM","region":"CM-NW","lat":6.0392,"lng":10.1226},{"iata":"BPE","name":"Qinhuangdao (Changli)","country":"CN","region":"CN-13","lat":39.6664,"lng":119.0614},{"iata":"BPG","name":"Barra do Gar\u00e7as","country":"BR","region":"BR-MT","lat":-15.8614,"lng":-52.389},{"iata":"BPH","name":"Bislig","country":"PH","region":"PH-SUR","lat":8.1951,"lng":126.321},{"iata":"BPI","name":"Big Piney","country":"US","region":"US-WY","lat":42.5851,"lng":-110.111},{"iata":"BPL","name":"Bole","country":"CN","region":"CN-65","lat":44.8955,"lng":82.3001},{"iata":"BPM","name":"Hyderabad","country":"IN","region":"IN-TG","lat":17.4531,"lng":78.4676},{"iata":"BPN","name":"Balikpapan","country":"ID","region":"ID-KI","lat":-1.2683,"lng":116.8945},{"iata":"BPS","name":"Porto Seguro","country":"BR","region":"BR-BA","lat":-16.4384,"lng":-39.0806},{"iata":"BPT","name":"Beaumont/Port Arthur","country":"US","region":"US-TX","lat":29.9508,"lng":-94.0207},{"iata":"BPX","name":"Bangda","country":"CN","region":"CN-54","lat":30.5536,"lng":97.1083},{"iata":"BPY","name":"Besalampy","country":"MG","region":"MG-M","lat":-16.7445,"lng":44.4825},{"iata":"BQA","name":"Baler","country":"PH","region":"PH-AUR","lat":15.7293,"lng":121.5},{"iata":"BQH","name":"London","country":"GB","region":"GB-ENG","lat":51.3308,"lng":0.0325},{"iata":"BQK","name":"Brunswick","country":"US","region":"US-GA","lat":31.2588,"lng":-81.4665},{"iata":"BQL","name":"Boulia Airport","country":"AU","region":"AU-QLD","lat":-22.9133,"lng":139.9},{"iata":"BQN","name":"Aguadilla","country":"PR","region":"PR-U-A","lat":18.4949,"lng":-67.1294},{"iata":"BQS","name":"Blagoveschensk","country":"RU","region":"RU-AMU","lat":50.4254,"lng":127.412},{"iata":"BQT","name":"Brest","country":"BY","region":"BY-BR","lat":52.1081,"lng":23.8968},{"iata":"BQU","name":"Bequia","country":"VC","region":"VC-06","lat":12.9884,"lng":-61.262},{"iata":"BRC","name":"San Carlos de Bariloche","country":"AR","region":"AR-R","lat":-41.1512,"lng":-71.1575},{"iata":"BRD","name":"Brainerd","country":"US","region":"US-MN","lat":46.4029,"lng":-94.1297},{"iata":"BRE","name":"Bremen","country":"DE","region":"DE-HB","lat":53.0468,"lng":8.7893},{"iata":"BRI","name":"Bari","country":"IT","region":"IT-75","lat":41.1389,"lng":16.7606},{"iata":"BRK","name":"Bourke Airport","country":"AU","region":"AU-NSW","lat":-30.0392,"lng":145.952},{"iata":"BRL","name":"Burlington","country":"US","region":"US-IA","lat":40.7832,"lng":-91.1255},{"iata":"BRM","name":"Barquisimeto","country":"VE","region":"VE-K","lat":10.0427,"lng":-69.3586},{"iata":"BRN","name":"Bern","country":"CH","region":"CH-BE","lat":46.9127,"lng":7.4988},{"iata":"BRO","name":"Brownsville","country":"US","region":"US-TX","lat":25.9072,"lng":-97.4252},{"iata":"BRQ","name":"Brno","country":"CZ","region":"CZ-JM","lat":49.1513,"lng":16.694},{"iata":"BRR","name":"Eoligarry","country":"GB","region":"GB-SCT","lat":57.0228,"lng":-7.4431},{"iata":"BRS","name":"Bristol","country":"GB","region":"GB-ENG","lat":51.3823,"lng":-2.7165},{"iata":"BRT","name":"Wurrumiyanga","country":"AU","region":"AU-NT","lat":-11.765,"lng":130.6158},{"iata":"BRU","name":"Zaventem","country":"BE","region":"BE-VBR","lat":50.9014,"lng":4.4844},{"iata":"BRW","name":"Utqia\u0121vik","country":"US","region":"US-AK","lat":71.2854,"lng":-156.766},{"iata":"BRX","name":"Barahona","country":"DO","region":"DO-04","lat":18.2515,"lng":-71.1204},{"iata":"BSA","name":"Bosaso","country":"SO","region":"SO-BR","lat":11.2752,"lng":49.1392},{"iata":"BSB","name":"Bras\u00edlia","country":"BR","region":"BR-DF","lat":-15.8692,"lng":-47.9208},{"iata":"BSC","name":"Bah\u00eda Solano","country":"CO","region":"CO-CHO","lat":6.2029,"lng":-77.3947},{"iata":"BSD","name":"Baoshan (Longyang)","country":"CN","region":"CN-53","lat":25.0533,"lng":99.1683},{"iata":"BSG","name":"Bata","country":"GQ","region":"GQ-LI","lat":1.9055,"lng":9.8057},{"iata":"BSJ","name":"Bairnsdale","country":"AU","region":"AU-VIC","lat":-37.8875,"lng":147.5694},{"iata":"BSK","name":"Biskra","country":"DZ","region":"DZ-07","lat":34.7932,"lng":5.7389},{"iata":"BSL","name":"B\u00e2le / Mulhouse","country":"FR","region":"FR-GES","lat":47.6007,"lng":7.5211},{"iata":"BSO","name":"Basco","country":"PH","region":"PH-BTN","lat":20.4513,"lng":121.98},{"iata":"BSR","name":"Basra","country":"IQ","region":"IQ-BA","lat":30.5491,"lng":47.6621},{"iata":"BSZ","name":"Bishkek","country":"KG","region":"KG-C","lat":43.0613,"lng":74.4776},{"iata":"BTC","name":"Batticaloa","country":"LK","region":"LK-5","lat":7.7051,"lng":81.6772},{"iata":"BTH","name":"Batam","country":"ID","region":"ID-KR","lat":1.121,"lng":104.119},{"iata":"BTI","name":"Barter Island","country":"US","region":"US-AK","lat":70.134,"lng":-143.582},{"iata":"BTJ","name":"Banda Aceh","country":"ID","region":"ID-AC","lat":5.5251,"lng":95.42},{"iata":"BTK","name":"Bratsk","country":"RU","region":"RU-IRK","lat":56.3696,"lng":101.7018},{"iata":"BTL","name":"Battle Creek","country":"US","region":"US-MI","lat":42.3073,"lng":-85.2515},{"iata":"BTM","name":"Butte","country":"US","region":"US-MT","lat":45.9548,"lng":-112.497},{"iata":"BTR","name":"Baton Rouge","country":"US","region":"US-LA","lat":30.5332,"lng":-91.1496},{"iata":"BTS","name":"Bratislava","country":"SK","region":"SK-BL","lat":48.1702,"lng":17.2127},{"iata":"BTU","name":"Bintulu","country":"MY","region":"MY-13","lat":3.1239,"lng":113.02},{"iata":"BTV","name":"Burlington","country":"US","region":"US-VT","lat":44.4719,"lng":-73.1533},{"iata":"BTZ","name":"Betong","country":"TH","region":"TH-95","lat":5.79,"lng":101.15},{"iata":"BUA","name":"Buka Island","country":"PG","region":"PG-NSB","lat":-5.4223,"lng":154.6727},{"iata":"BUD","name":"Budapest","country":"HU","region":"HU-BU","lat":47.4302,"lng":19.2624},{"iata":"BUF","name":"Buffalo","country":"US","region":"US-NY","lat":42.9405,"lng":-78.7322},{"iata":"BUG","name":"Benguela","country":"AO","region":"AO-BGU","lat":-12.609,"lng":13.4037},{"iata":"BUJ","name":"Ouled Sidi Brahim","country":"DZ","region":"DZ-28","lat":35.3325,"lng":4.2064},{"iata":"BUN","name":"Buenaventura","country":"CO","region":"CO-VAC","lat":3.8196,"lng":-76.9898},{"iata":"BUP","name":"Bhatinda Air Force Station","country":"IN","region":"IN-PB","lat":30.2701,"lng":74.7558},{"iata":"BUQ","name":"Bulawayo","country":"ZW","region":"ZW-BU","lat":-20.0163,"lng":28.6229},{"iata":"BUR","name":"Burbank","country":"US","region":"US-CA","lat":34.2028,"lng":-118.3581},{"iata":"BUS","name":"Batumi","country":"GE","region":"GE-AJ","lat":41.6094,"lng":41.6003},{"iata":"BUX","name":"Bunia","country":"CD","region":"CD-IT","lat":1.5657,"lng":30.2207},{"iata":"BUZ","name":"Bushehr","country":"IR","region":"IR-18","lat":28.9448,"lng":50.8346},{"iata":"BVA","name":"Beauvais","country":"FR","region":"FR-HDF","lat":49.4544,"lng":2.1128},{"iata":"BVB","name":"Boa Vista","country":"BR","region":"BR-RR","lat":2.8462,"lng":-60.6906},{"iata":"BVC","name":"Rabil","country":"CV","region":"CV-B","lat":16.1365,"lng":-22.8889},{"iata":"BVE","name":"Brive","country":"FR","region":"FR-NAQ","lat":45.0397,"lng":1.4856},{"iata":"BVG","name":"Berlev\u00e5g","country":"NO","region":"NO-56","lat":70.8715,"lng":29.0341},{"iata":"BVH","name":"Vilhena","country":"BR","region":"BR-RO","lat":-12.6944,"lng":-60.0983},{"iata":"BVI","name":"Birdsville Airport","country":"AU","region":"AU-QLD","lat":-25.8975,"lng":139.348},{"iata":"BVJ","name":"Bovanenkovo","country":"RU","region":"RU-YAN","lat":70.3153,"lng":68.3336},{"iata":"BVY","name":"Beverly / Danvers","country":"US","region":"US-MA","lat":42.5842,"lng":-70.9165},{"iata":"BWA","name":"Siddharthanagar (Bhairahawa)","country":"NP","region":"NP-P5","lat":27.5046,"lng":83.4104},{"iata":"BWE","name":"Braunschweig","country":"DE","region":"DE-NI","lat":52.3192,"lng":10.5561},{"iata":"BWF","name":"Barrow-in-Furness","country":"GB","region":"GB-ENG","lat":54.1286,"lng":-3.2675},{"iata":"BWG","name":"Bowling Green","country":"US","region":"US-KY","lat":36.9645,"lng":-86.4197},{"iata":"BWH","name":"Butterworth","country":"MY","region":"MY-07","lat":5.4659,"lng":100.391},{"iata":"BWI","name":"Baltimore","country":"US","region":"US-MD","lat":39.1754,"lng":-76.6683},{"iata":"BWK","name":"Gornji Humac","country":"HR","region":"HR-17","lat":43.2845,"lng":16.6784},{"iata":"BWN","name":"Bandar Seri Begawan","country":"BN","region":"BN-BM","lat":4.9442,"lng":114.928},{"iata":"BWO","name":"Balakovo","country":"RU","region":"RU-SAR","lat":51.8583,"lng":47.7456},{"iata":"BWQ","name":"Brewarrina Airport","country":"AU","region":"AU-NSW","lat":-29.9758,"lng":146.8144},{"iata":"BWT","name":"Burnie","country":"AU","region":"AU-TAS","lat":-40.997,"lng":145.726},{"iata":"BWU","name":"Sydney","country":"AU","region":"AU-NSW","lat":-33.9236,"lng":150.9908},{"iata":"BXB","name":"Babo","country":"ID","region":"ID-PB","lat":-2.5322,"lng":133.439},{"iata":"BXE","name":"Bakel","country":"SN","region":"SN-TC","lat":14.8473,"lng":-12.4683},{"iata":"BXH","name":"Balkhash","country":"KZ","region":"KZ-KAR","lat":46.8942,"lng":75.0045},{"iata":"BXR","name":"Bam","country":"IR","region":"IR-08","lat":29.0842,"lng":58.45},{"iata":"BXU","name":"Butuan","country":"PH","region":"PH-BTC","lat":8.9515,"lng":125.4788},{"iata":"BXY","name":"Baikonur","country":"KZ","region":"KZ-BAY","lat":45.622,"lng":63.2108},{"iata":"BYC","name":"Yacu\u00edba","country":"BO","region":"BO-T","lat":-21.9609,"lng":-63.6517},{"iata":"BYH","name":"Blytheville","country":"US","region":"US-AR","lat":35.9643,"lng":-89.944},{"iata":"BYI","name":"Burley","country":"US","region":"US-ID","lat":42.5426,"lng":-113.772},{"iata":"BYJ","name":"Beja","country":"PT","region":"PT-02","lat":38.0789,"lng":-7.9324},{"iata":"BYK","name":"Bouak\u00e9","country":"CI","region":"CI-VB","lat":7.7388,"lng":-5.0737},{"iata":"BYM","name":"Bayamo","country":"CU","region":"CU-12","lat":20.3964,"lng":-76.6214},{"iata":"BYN","name":"Bayankhongor","country":"MN","region":"MN-069","lat":46.1633,"lng":100.704},{"iata":"BYS","name":"Fort Irwin/Barstow","country":"US","region":"US-CA","lat":35.2805,"lng":-116.63},{"iata":"BYU","name":"Bindlach","country":"DE","region":"DE-BY","lat":49.985,"lng":11.64},{"iata":"BZB","name":"Bazaruto Island","country":"MZ","region":"MZ-I","lat":-21.5411,"lng":35.4729},{"iata":"BZC","name":"Cabo Frio","country":"BR","region":"BR-RJ","lat":-22.7709,"lng":-41.9631},{"iata":"BZD","name":"Balranald Airport","country":"AU","region":"AU-NSW","lat":-34.6248,"lng":143.5771},{"iata":"BZE","name":"Belize City","country":"BZ","region":"BZ-BZ","lat":17.54,"lng":-88.3036},{"iata":"BZG","name":"Bydgoszcz","country":"PL","region":"PL-KP","lat":53.0968,"lng":17.9777},{"iata":"BZI","name":"Bal\u0131kesir","country":"TR","region":"TR-10","lat":39.6193,"lng":27.926},{"iata":"BZK","name":"Bryansk","country":"RU","region":"RU-BRY","lat":53.2144,"lng":34.176},{"iata":"BZL","name":"Barisal","country":"BD","region":"BD-1","lat":22.801,"lng":90.3012},{"iata":"BZN","name":"Bozeman","country":"US","region":"US-MT","lat":45.7789,"lng":-111.1537},{"iata":"BZO","name":"Bolzano (BZ)","country":"IT","region":"IT-32","lat":46.4592,"lng":11.3261},{"iata":"BZR","name":"B\u00e9ziers","country":"FR","region":"FR-OCC","lat":43.3235,"lng":3.3539},{"iata":"BZU","name":"Buta","country":"CD","region":"CD-BU","lat":2.8181,"lng":24.794},{"iata":"BZV","name":"Brazzaville","country":"CG","region":"CG-12","lat":-4.2517,"lng":15.253},{"iata":"BZX","name":"Bazhong","country":"CN","region":"CN-51","lat":31.7384,"lng":106.6449},{"iata":"BZY","name":"B\u0103l\u021bi","country":"MD","region":"MD-RS","lat":47.8377,"lng":27.7811},{"iata":"BZZ","name":"Carterton, Oxfordshire","country":"GB","region":"GB-ENG","lat":51.75,"lng":-1.5836},{"iata":"CAB","name":"Cabinda","country":"AO","region":"AO-CAB","lat":-5.5984,"lng":12.1881},{"iata":"CAC","name":"Cascavel","country":"BR","region":"BR-PR","lat":-25.0003,"lng":-53.5012},{"iata":"CAE","name":"Columbia","country":"US","region":"US-SC","lat":33.9382,"lng":-81.123},{"iata":"CAG","name":"Cagliari","country":"IT","region":"IT-88","lat":39.2515,"lng":9.0543},{"iata":"CAH","name":"Ca Mau City","country":"VN","region":"VN-SW","lat":9.1777,"lng":105.1778},{"iata":"CAI","name":"Cairo","country":"EG","region":"EG-C","lat":30.1115,"lng":31.3967},{"iata":"CAJ","name":"Canaima","country":"VE","region":"VE-F","lat":6.232,"lng":-62.8548},{"iata":"CAK","name":"Akron","country":"US","region":"US-OH","lat":40.9161,"lng":-81.4422},{"iata":"CAL","name":"Campbeltown","country":"GB","region":"GB-SCT","lat":55.4372,"lng":-5.6864},{"iata":"CAN","name":"Guangzhou (Huadu)","country":"CN","region":"CN-44","lat":23.3924,"lng":113.299},{"iata":"CAP","name":"Cap Haitien","country":"HT","region":"HT-ND","lat":19.7255,"lng":-72.2007},{"iata":"CAQ","name":"Caucasia","country":"CO","region":"CO-ANT","lat":7.9685,"lng":-75.1985},{"iata":"CAR","name":"Caribou","country":"US","region":"US-ME","lat":46.8715,"lng":-68.0179},{"iata":"CAT","name":"Cascais","country":"PT","region":"PT-11","lat":38.725,"lng":-9.3552},{"iata":"CAW","name":"Campos dos Goytacazes","country":"BR","region":"BR-RJ","lat":-21.6983,"lng":-41.3017},{"iata":"CAX","name":"Carlisle, Cumbria","country":"GB","region":"GB-ENG","lat":54.9375,"lng":-2.8092},{"iata":"CAY","name":"Matoury","country":"GF","region":"GF-CY","lat":4.82,"lng":-52.3613},{"iata":"CAZ","name":"Cobar Airport","country":"AU","region":"AU-NSW","lat":-31.5383,"lng":145.794},{"iata":"CBB","name":"Cochabamba","country":"BO","region":"BO-C","lat":-17.4211,"lng":-66.1771},{"iata":"CBD","name":"IAF Camp","country":"IN","region":"IN-AN","lat":9.1531,"lng":92.8193},{"iata":"CBG","name":"Cambridge, Cambridgeshire","country":"GB","region":"GB-ENG","lat":52.205,"lng":0.175},{"iata":"CBH","name":"B\u00e9char","country":"DZ","region":"DZ-08","lat":31.6457,"lng":-2.2699},{"iata":"CBJ","name":"Cabo Rojo","country":"DO","region":"DO-16","lat":17.929,"lng":-71.6448},{"iata":"CBL","name":"Ciudad Bolivar","country":"VE","region":"VE-F","lat":8.1222,"lng":-63.537},{"iata":"CBM","name":"Columbus","country":"US","region":"US-MS","lat":33.6438,"lng":-88.4438},{"iata":"CBO","name":"Datu Odin Sinsuat","country":"PH","region":"PH-MDN","lat":7.1648,"lng":124.2099},{"iata":"CBQ","name":"Calabar","country":"NG","region":"NG-CR","lat":4.976,"lng":8.3472},{"iata":"CBR","name":"Canberra","country":"AU","region":"AU-ACT","lat":-35.3069,"lng":149.195},{"iata":"CBT","name":"Catumbela","country":"AO","region":"AO-BGU","lat":-12.4792,"lng":13.4869},{"iata":"CBV","name":"Coban","country":"GT","region":"GT-AV","lat":15.469,"lng":-90.4067},{"iata":"CCC","name":"Cayo Coco","country":"CU","region":"CU-08","lat":22.461,"lng":-78.3284},{"iata":"CCE","name":"New Cairo","country":"EG","region":"EG-C","lat":30.0647,"lng":31.84},{"iata":"CCF","name":"Carcassonne","country":"FR","region":"FR-OCC","lat":43.216,"lng":2.3063},{"iata":"CCH","name":"Chile Chico","country":"CL","region":"CL-AI","lat":-46.5831,"lng":-71.6863},{"iata":"CCJ","name":"Calicut","country":"IN","region":"IN-KL","lat":11.136,"lng":75.9552},{"iata":"CCK","name":"West Island","country":"CC","region":"CC-U-A","lat":-12.1922,"lng":96.8341},{"iata":"CCL","name":"Chinchilla","country":"AU","region":"AU-QLD","lat":-26.7719,"lng":150.6176},{"iata":"CCM","name":"Crici\u00fama","country":"BR","region":"BR-SC","lat":-28.7257,"lng":-49.4245},{"iata":"CCP","name":"Concepcion","country":"CL","region":"CL-BI","lat":-36.7724,"lng":-73.0628},{"iata":"CCR","name":"Concord","country":"US","region":"US-CA","lat":37.9897,"lng":-122.057},{"iata":"CCS","name":"Maiquet\u00eda","country":"VE","region":"VE-X","lat":10.6022,"lng":-66.9912},{"iata":"CCU","name":"Kolkata","country":"IN","region":"IN-WB","lat":22.654,"lng":88.4476},{"iata":"CCY","name":"Charles City","country":"US","region":"US-IA","lat":43.0726,"lng":-92.6108},{"iata":"CCZ","name":"Chub Cay","country":"BS","region":"BS-NS","lat":25.4171,"lng":-77.8809},{"iata":"CDB","name":"Cold Bay","country":"US","region":"US-AK","lat":55.2079,"lng":-162.725},{"iata":"CDC","name":"Cedar City","country":"US","region":"US-UT","lat":37.701,"lng":-113.099},{"iata":"CDE","name":"Chengde","country":"CN","region":"CN-13","lat":41.1225,"lng":118.0739},{"iata":"CDG","name":"Paris (Roissy-en-France, Val-d'Oise)","country":"FR","region":"FR-IDF","lat":49.009,"lng":2.5541},{"iata":"CDJ","name":"Concei\u00e7\u00e3o do Araguaia","country":"BR","region":"BR-PA","lat":-8.3483,"lng":-49.3015},{"iata":"CDP","name":"Kadapa","country":"IN","region":"IN-AP","lat":14.5132,"lng":78.7692},{"iata":"CDR","name":"Chadron","country":"US","region":"US-NE","lat":42.8376,"lng":-103.095},{"iata":"CDS","name":"Childress","country":"US","region":"US-TX","lat":34.4338,"lng":-100.288},{"iata":"CDT","name":"Castell\u00f3n de la Plana","country":"ES","region":"ES-VC","lat":40.2139,"lng":0.0733},{"iata":"CDU","name":"Cobbitty","country":"AU","region":"AU-NSW","lat":-34.0383,"lng":150.6864},{"iata":"CDV","name":"Cordova","country":"US","region":"US-AK","lat":60.4918,"lng":-145.478},{"iata":"CEB","name":"Cebu City/Lapu-Lapu City","country":"PH","region":"PH-CEB","lat":10.3093,"lng":123.9797},{"iata":"CEC","name":"Crescent City","country":"US","region":"US-CA","lat":41.7789,"lng":-124.2364},{"iata":"CED","name":"Ceduna Airport","country":"AU","region":"AU-SA","lat":-32.1306,"lng":133.71},{"iata":"CEE","name":"Cherepovets","country":"RU","region":"RU-VLG","lat":59.2736,"lng":38.0158},{"iata":"CEF","name":"Chicopee","country":"US","region":"US-MA","lat":42.194,"lng":-72.5348},{"iata":"CEG","name":"Broughton","country":"GB","region":"GB-WLS","lat":53.1781,"lng":-2.9778},{"iata":"CEI","name":"Chiang Rai","country":"TH","region":"TH-57","lat":19.9523,"lng":99.8829},{"iata":"CEK","name":"Chelyabinsk","country":"RU","region":"RU-CHE","lat":55.3031,"lng":61.5049},{"iata":"CEN","name":"Ciudad Obreg\u00f3n","country":"MX","region":"MX-SON","lat":27.3926,"lng":-109.833},{"iata":"CEQ","name":"Cannes","country":"FR","region":"FR-PAC","lat":43.548,"lng":6.9552},{"iata":"CER","name":"Cherbourg","country":"FR","region":"FR-NOR","lat":49.6501,"lng":-1.4703},{"iata":"CEW","name":"Crestview","country":"US","region":"US-FL","lat":30.7788,"lng":-86.5221},{"iata":"CEZ","name":"Cortez","country":"US","region":"US-CO","lat":37.303,"lng":-108.628},{"iata":"CFE","name":"Clermont-Ferrand","country":"FR","region":"FR-ARA","lat":45.7867,"lng":3.1692},{"iata":"CFG","name":"Cienfuegos","country":"CU","region":"CU-06","lat":22.15,"lng":-80.4142},{"iata":"CFK","name":"Chlef","country":"DZ","region":"DZ-02","lat":36.2166,"lng":1.3411},{"iata":"CFN","name":"Donegal","country":"IE","region":"IE-DL","lat":55.0442,"lng":-8.341},{"iata":"CFR","name":"Caen","country":"FR","region":"FR-NOR","lat":49.1768,"lng":-0.4549},{"iata":"CFS","name":"Coffs Harbour","country":"AU","region":"AU-NSW","lat":-30.3206,"lng":153.116},{"iata":"CFU","name":"Kerkyra (Corfu)","country":"GR","region":"GR-F","lat":39.6014,"lng":19.9122},{"iata":"CGB","name":"Cuiab\u00e1","country":"BR","region":"BR-MT","lat":-15.6529,"lng":-56.1167},{"iata":"CGD","name":"Changde (Dingcheng)","country":"CN","region":"CN-43","lat":28.9189,"lng":111.64},{"iata":"CGF","name":"Cleveland","country":"US","region":"US-OH","lat":41.5651,"lng":-81.4864},{"iata":"CGH","name":"S\u00e3o Paulo","country":"BR","region":"BR-SP","lat":-23.6277,"lng":-46.6546},{"iata":"CGI","name":"Cape Girardeau","country":"US","region":"US-MO","lat":37.2253,"lng":-89.5708},{"iata":"CGJ","name":"Chingola","country":"ZM","region":"ZM-08","lat":-12.5728,"lng":27.8939},{"iata":"CGK","name":"Jakarta","country":"ID","region":"ID-BT","lat":-6.1256,"lng":106.656},{"iata":"CGM","name":"Mambajao","country":"PH","region":"PH-CAM","lat":9.2539,"lng":124.7091},{"iata":"CGN","name":"K\u00f6ln (Cologne)","country":"DE","region":"DE-NW","lat":50.8659,"lng":7.1427},{"iata":"CGO","name":"Zhengzhou","country":"CN","region":"CN-41","lat":34.5265,"lng":113.8492},{"iata":"CGP","name":"Chattogram (Chittagong)","country":"BD","region":"BD-2","lat":22.2496,"lng":91.8133},{"iata":"CGQ","name":"Changchun","country":"CN","region":"CN-22","lat":43.9962,"lng":125.685},{"iata":"CGR","name":"Campo Grande","country":"BR","region":"BR-MS","lat":-20.47,"lng":-54.674},{"iata":"CGY","name":"Laguindingan","country":"PH","region":"PH-MSR","lat":8.6122,"lng":124.4565},{"iata":"CHA","name":"Chattanooga","country":"US","region":"US-TN","lat":35.0353,"lng":-85.2038},{"iata":"CHC","name":"Christchurch","country":"NZ","region":"NZ-CAN","lat":-43.489,"lng":172.5321},{"iata":"CHG","name":"Shuangta, Chaoyang","country":"CN","region":"CN-21","lat":41.5381,"lng":120.435},{"iata":"CHH","name":"Chachapoyas","country":"PE","region":"PE-AMA","lat":-6.2019,"lng":-77.8562},{"iata":"CHM","name":"Chimbote","country":"PE","region":"PE-ANC","lat":-9.1496,"lng":-78.5238},{"iata":"CHO","name":"Charlottesville","country":"US","region":"US-VA","lat":38.1386,"lng":-78.4529},{"iata":"CHQ","name":"Souda","country":"GR","region":"GR-M","lat":35.5312,"lng":24.1507},{"iata":"CHR","name":"Ch\u00e2teauroux","country":"FR","region":"FR-CVL","lat":46.8602,"lng":1.7283},{"iata":"CHS","name":"Charleston","country":"US","region":"US-SC","lat":32.8962,"lng":-80.0382},{"iata":"CHT","name":"Te One","country":"NZ","region":"NZ-WGN","lat":-43.8119,"lng":-176.4651},{"iata":"CHX","name":"Changuinola","country":"PA","region":"PA-1","lat":9.459,"lng":-82.5151},{"iata":"CIA","name":"Rome","country":"IT","region":"IT-62","lat":41.7988,"lng":12.5953},{"iata":"CID","name":"Cedar Rapids","country":"US","region":"US-IA","lat":41.8847,"lng":-91.7108},{"iata":"CIF","name":"Chifeng","country":"CN","region":"CN-15","lat":42.1597,"lng":118.841},{"iata":"CIJ","name":"Cobija","country":"BO","region":"BO-N","lat":-11.0391,"lng":-68.7828},{"iata":"CIO","name":"Concepci\u00f3n","country":"PY","region":"PY-1","lat":-23.4416,"lng":-57.427},{"iata":"CIS","name":"Abariringa","country":"KI","region":"KI-P","lat":-2.7681,"lng":-171.71},{"iata":"CIT","name":"Shymkent","country":"KZ","region":"KZ-YUZ","lat":42.365,"lng":69.4756},{"iata":"CIU","name":"Kincheloe","country":"US","region":"US-MI","lat":46.242,"lng":-84.4621},{"iata":"CIW","name":"Canouan","country":"VC","region":"VC-06","lat":12.699,"lng":-61.3424},{"iata":"CIX","name":"Chiclayo","country":"PE","region":"PE-LAM","lat":-6.7892,"lng":-79.8283},{"iata":"CIY","name":"Comiso","country":"IT","region":"IT-82","lat":36.9958,"lng":14.6089},{"iata":"CJA","name":"Cajamarca","country":"PE","region":"PE-CAJ","lat":-7.1392,"lng":-78.4894},{"iata":"CJB","name":"Coimbatore","country":"IN","region":"IN-TN","lat":11.03,"lng":77.0434},{"iata":"CJC","name":"Calama","country":"CL","region":"CL-AN","lat":-22.4982,"lng":-68.9036},{"iata":"CJJ","name":"Cheongju","country":"KR","region":"KR-43","lat":36.7156,"lng":127.5003},{"iata":"CJL","name":"Chitral","country":"PK","region":"PK-KP","lat":35.8862,"lng":71.7999},{"iata":"CJM","name":"Chumphon","country":"TH","region":"TH-86","lat":10.7112,"lng":99.3617},{"iata":"CJS","name":"Ciudad Ju\u00e1rez","country":"MX","region":"MX-CHH","lat":31.6367,"lng":-106.4285},{"iata":"CJU","name":"Jeju City","country":"KR","region":"KR-49","lat":33.5121,"lng":126.4925},{"iata":"CKB","name":"Bridgeport","country":"US","region":"US-WV","lat":39.2966,"lng":-80.2281},{"iata":"CKC","name":"Cherkasy","country":"UA","region":"UA-71","lat":49.4156,"lng":31.9953},{"iata":"CKG","name":"Chongqing","country":"CN","region":"CN-50","lat":29.7123,"lng":106.6519},{"iata":"CKH","name":"Chokurdah","country":"RU","region":"RU-SA","lat":70.6231,"lng":147.902},{"iata":"CKL","name":"Moscow","country":"RU","region":"RU-MOS","lat":55.8783,"lng":38.0617},{"iata":"CKS","name":"Parauapebas","country":"BR","region":"BR-PA","lat":-6.1178,"lng":-50.0034},{"iata":"CKT","name":"Sarakhs","country":"IR","region":"IR-09","lat":36.5012,"lng":61.0649},{"iata":"CKY","name":"Conakry","country":"GN","region":"GN-C","lat":9.5769,"lng":-13.612},{"iata":"CKZ","name":"\u00c7anakkale","country":"TR","region":"TR-17","lat":40.1377,"lng":26.4268},{"iata":"CLD","name":"Carlsbad","country":"US","region":"US-CA","lat":33.1283,"lng":-117.28},{"iata":"CLE","name":"Cleveland","country":"US","region":"US-OH","lat":41.4117,"lng":-81.8498},{"iata":"CLJ","name":"Cluj-Napoca","country":"RO","region":"RO-CJ","lat":46.786,"lng":23.6857},{"iata":"CLL","name":"College Station","country":"US","region":"US-TX","lat":30.5886,"lng":-96.3638},{"iata":"CLM","name":"Port Angeles","country":"US","region":"US-WA","lat":48.1202,"lng":-123.5},{"iata":"CLN","name":"Carolina","country":"BR","region":"BR-MA","lat":-7.3204,"lng":-47.4587},{"iata":"CLO","name":"Cali","country":"CO","region":"CO-VAC","lat":3.5427,"lng":-76.3819},{"iata":"CLQ","name":"Colima","country":"MX","region":"MX-COL","lat":19.277,"lng":-103.577},{"iata":"CLT","name":"Charlotte","country":"US","region":"US-NC","lat":35.214,"lng":-80.9431},{"iata":"CLU","name":"Columbus","country":"US","region":"US-IN","lat":39.2624,"lng":-85.8956},{"iata":"CLY","name":"Calvi","country":"FR","region":"FR-COR","lat":42.5304,"lng":8.793},{"iata":"CLZ","name":"Guarico","country":"VE","region":"VE-J","lat":8.9247,"lng":-67.4171},{"iata":"CMA","name":"Cunnamulla Airport","country":"AU","region":"AU-QLD","lat":-28.03,"lng":145.622},{"iata":"CMB","name":"Colombo","country":"LK","region":"LK-1","lat":7.1808,"lng":79.8841},{"iata":"CMD","name":"Cootamundra Airport","country":"AU","region":"AU-NSW","lat":-34.6243,"lng":148.0366},{"iata":"CME","name":"Ciudad del Carmen","country":"MX","region":"MX-CAM","lat":18.6515,"lng":-91.7994},{"iata":"CMF","name":"Chamb\u00e9ry","country":"FR","region":"FR-ARA","lat":45.6381,"lng":5.8802},{"iata":"CMG","name":"Corumb\u00e1","country":"BR","region":"BR-MS","lat":-19.0119,"lng":-57.6728},{"iata":"CMH","name":"Columbus","country":"US","region":"US-OH","lat":39.998,"lng":-82.8919},{"iata":"CMI","name":"Savoy","country":"US","region":"US-IL","lat":40.0398,"lng":-88.2762},{"iata":"CMN","name":"Casablanca","country":"MA","region":"MA-06","lat":33.3675,"lng":-7.59},{"iata":"CMQ","name":"Clermont Airport","country":"AU","region":"AU-QLD","lat":-22.7731,"lng":147.621},{"iata":"CMR","name":"Colmar","country":"FR","region":"FR-GES","lat":48.1099,"lng":7.359},{"iata":"CMU","name":"Kundiawa","country":"PG","region":"PG-CPK","lat":-6.0243,"lng":144.971},{"iata":"CMW","name":"Camaguey","country":"CU","region":"CU-09","lat":21.4199,"lng":-77.848},{"iata":"CMX","name":"Hancock","country":"US","region":"US-MI","lat":47.1684,"lng":-88.4891},{"iata":"CNB","name":"Coonamble Airport","country":"AU","region":"AU-NSW","lat":-30.9809,"lng":148.3778},{"iata":"CND","name":"Constan\u021ba","country":"RO","region":"RO-CT","lat":44.3622,"lng":28.4883},{"iata":"CNF","name":"Belo Horizonte","country":"BR","region":"BR-MG","lat":-19.6357,"lng":-43.9669},{"iata":"CNG","name":"Cognac/Ch\u00e2teaubernard","country":"FR","region":"FR-NAQ","lat":45.6583,"lng":-0.3175},{"iata":"CNJ","name":"Cloncurry","country":"AU","region":"AU-QLD","lat":-20.6686,"lng":140.504},{"iata":"CNL","name":"Sindal","country":"DK","region":"DK-81","lat":57.5035,"lng":10.2294},{"iata":"CNM","name":"Carlsbad","country":"US","region":"US-NM","lat":32.3375,"lng":-104.263},{"iata":"CNN","name":"Kannur","country":"IN","region":"IN-KL","lat":11.9163,"lng":75.545},{"iata":"CNP","name":"Neerlerit Inaat","country":"GL","region":"GL-SE","lat":70.7431,"lng":-22.6505},{"iata":"CNQ","name":"Corrientes","country":"AR","region":"AR-W","lat":-27.4455,"lng":-58.7619},{"iata":"CNR","name":"Cha\u00f1aral","country":"CL","region":"CL-AT","lat":-26.3325,"lng":-70.6073},{"iata":"CNS","name":"Cairns","country":"AU","region":"AU-QLD","lat":-16.8789,"lng":145.7495},{"iata":"CNU","name":"Chanute","country":"US","region":"US-KS","lat":37.6682,"lng":-95.4867},{"iata":"CNX","name":"Chiang Mai","country":"TH","region":"TH-50","lat":18.7668,"lng":98.9626},{"iata":"CNY","name":"Moab","country":"US","region":"US-UT","lat":38.755,"lng":-109.755},{"iata":"COC","name":"Concordia","country":"AR","region":"AR-E","lat":-31.2969,"lng":-57.9966},{"iata":"COD","name":"Cody","country":"US","region":"US-WY","lat":44.5202,"lng":-109.024},{"iata":"COE","name":"Coeur d'Alene","country":"US","region":"US-ID","lat":47.7743,"lng":-116.82},{"iata":"COF","name":"Cocoa Beach","country":"US","region":"US-FL","lat":28.2349,"lng":-80.6101},{"iata":"COJ","name":"Coonabarabran Airport","country":"AU","region":"AU-NSW","lat":-31.3325,"lng":149.267},{"iata":"COK","name":"Kochi","country":"IN","region":"IN-KL","lat":10.151,"lng":76.4008},{"iata":"CON","name":"Concord","country":"US","region":"US-NH","lat":43.2027,"lng":-71.5023},{"iata":"COO","name":"Cotonou","country":"BJ","region":"BJ-AQ","lat":6.3572,"lng":2.3843},{"iata":"COQ","name":"Choibalsan Airport","country":"MN","region":"MN-061","lat":48.1354,"lng":114.6472},{"iata":"COR","name":"Cordoba","country":"AR","region":"AR-X","lat":-31.3123,"lng":-64.2083},{"iata":"COS","name":"Colorado Springs","country":"US","region":"US-CO","lat":38.8058,"lng":-104.701},{"iata":"COU","name":"Columbia","country":"US","region":"US-MO","lat":38.8181,"lng":-92.2196},{"iata":"COV","name":"Tarsus","country":"TR","region":"TR-33","lat":36.8915,"lng":35.0712},{"iata":"CPC","name":"Chapelco/San Martin de los Andes","country":"AR","region":"AR-Q","lat":-40.0754,"lng":-71.1373},{"iata":"CPD","name":"Coober Pedy","country":"AU","region":"AU-SA","lat":-29.0383,"lng":134.7222},{"iata":"CPE","name":"Campeche","country":"MX","region":"MX-CAM","lat":19.816,"lng":-90.5001},{"iata":"CPH","name":"Copenhagen","country":"DK","region":"DK-84","lat":55.6179,"lng":12.656},{"iata":"CPO","name":"Copiapo","country":"CL","region":"CL-AT","lat":-27.2612,"lng":-70.7792},{"iata":"CPR","name":"Casper","country":"US","region":"US-WY","lat":42.9074,"lng":-106.4616},{"iata":"CPT","name":"Cape Town","country":"ZA","region":"ZA-WC","lat":-33.974,"lng":18.6043},{"iata":"CPV","name":"Campina Grande","country":"BR","region":"BR-PB","lat":-7.2697,"lng":-35.8961},{"iata":"CPX","name":"Culebra","country":"PR","region":"PR-U-A","lat":18.313,"lng":-65.3039},{"iata":"CQD","name":"Shahrekord","country":"IR","region":"IR-14","lat":32.2972,"lng":50.8422},{"iata":"CQF","name":"Calais","country":"FR","region":"FR-HDF","lat":50.9621,"lng":1.9548},{"iata":"CQM","name":"Ciudad Real","country":"ES","region":"ES-CM","lat":38.8565,"lng":-3.9699},{"iata":"CQW","name":"Wulong","country":"CN","region":"CN-50","lat":29.4657,"lng":107.6937},{"iata":"CRA","name":"Craiova","country":"RO","region":"RO-DJ","lat":44.3181,"lng":23.8886},{"iata":"CRC","name":"Cartago","country":"CO","region":"CO-VAC","lat":4.7582,"lng":-75.9557},{"iata":"CRD","name":"Comodoro Rivadavia","country":"AR","region":"AR-U","lat":-45.7869,"lng":-67.4634},{"iata":"CRE","name":"North Myrtle Beach","country":"US","region":"US-SC","lat":33.8117,"lng":-78.7239},{"iata":"CRG","name":"Jacksonville","country":"US","region":"US-FL","lat":30.3363,"lng":-81.5144},{"iata":"CRI","name":"Colonel Hill","country":"BS","region":"BS-CK","lat":22.7456,"lng":-74.1824},{"iata":"CRK","name":"Mabalacat","country":"PH","region":"PH-PAM","lat":15.186,"lng":120.56},{"iata":"CRL","name":"Charleroi","country":"BE","region":"BE-WHT","lat":50.462,"lng":4.4596},{"iata":"CRM","name":"Catarman","country":"PH","region":"PH-NSA","lat":12.5016,"lng":124.6353},{"iata":"CRP","name":"Corpus Christi","country":"US","region":"US-TX","lat":27.7704,"lng":-97.5012},{"iata":"CRQ","name":"Caravelas","country":"BR","region":"BR-BA","lat":-17.6523,"lng":-39.2531},{"iata":"CRV","name":"Isola di Capo Rizzuto (KR)","country":"IT","region":"IT-78","lat":38.9972,"lng":17.0802},{"iata":"CRW","name":"Charleston","country":"US","region":"US-WV","lat":38.3731,"lng":-81.5932},{"iata":"CRZ","name":"T\u00fcrkmenabat","country":"TM","region":"TM-L","lat":38.9307,"lng":63.564},{"iata":"CSB","name":"Caransebe\u015f","country":"RO","region":"RO-CS","lat":45.4201,"lng":22.2525},{"iata":"CSF","name":"Creil","country":"FR","region":"FR-HDF","lat":49.2535,"lng":2.5191},{"iata":"CSG","name":"Columbus","country":"US","region":"US-GA","lat":32.5164,"lng":-84.9396},{"iata":"CSK","name":"Cap Skirring","country":"SN","region":"SN-ZG","lat":12.3953,"lng":-16.748},{"iata":"CSN","name":"Carson City","country":"US","region":"US-NV","lat":39.1943,"lng":-119.7343},{"iata":"CSV","name":"Crossville","country":"US","region":"US-TN","lat":35.9513,"lng":-85.085},{"iata":"CSW","name":"Cabo San Lucas","country":"MX","region":"MX-BCS","lat":22.9491,"lng":-109.9395},{"iata":"CSX","name":"Changsha (Changsha)","country":"CN","region":"CN-43","lat":28.1892,"lng":113.22},{"iata":"CSY","name":"Cheboksary","country":"RU","region":"RU-CU","lat":56.0903,"lng":47.3473},{"iata":"CTA","name":"Catania","country":"IT","region":"IT-82","lat":37.4668,"lng":15.0664},{"iata":"CTB","name":"Cut Bank","country":"US","region":"US-MT","lat":48.6087,"lng":-112.3782},{"iata":"CTC","name":"Catamarca","country":"AR","region":"AR-K","lat":-28.5931,"lng":-65.7512},{"iata":"CTD","name":"Chitr\u00e9","country":"PA","region":"PA-6","lat":7.9878,"lng":-80.4098},{"iata":"CTG","name":"Cartagena","country":"CO","region":"CO-BOL","lat":10.4424,"lng":-75.513},{"iata":"CTL","name":"Charleville","country":"AU","region":"AU-QLD","lat":-26.4133,"lng":146.262},{"iata":"CTM","name":"Chetumal","country":"MX","region":"MX-ROO","lat":18.505,"lng":-88.328},{"iata":"CTN","name":"Cooktown Airport","country":"AU","region":"AU-QLD","lat":-15.4436,"lng":145.1832},{"iata":"CTS","name":"Sapporo","country":"JP","region":"JP-01","lat":42.7748,"lng":141.6904},{"iata":"CTT","name":"Le Castellet, Var","country":"FR","region":"FR-PAC","lat":43.2525,"lng":5.7852},{"iata":"CTU","name":"Chengdu (Shuangliu)","country":"CN","region":"CN-51","lat":30.5583,"lng":103.946},{"iata":"CUB","name":"Columbia","country":"US","region":"US-SC","lat":33.9705,"lng":-80.9952},{"iata":"CUC","name":"C\u00facuta","country":"CO","region":"CO-NSA","lat":7.9276,"lng":-72.5115},{"iata":"CUE","name":"Cuenca","country":"EC","region":"EC-A","lat":-2.8895,"lng":-78.9844},{"iata":"CUF","name":"Levaldigi (CN)","country":"IT","region":"IT-21","lat":44.5475,"lng":7.623},{"iata":"CUK","name":"Caye Caulker","country":"BZ","region":"BZ-BZ","lat":17.735,"lng":-88.0329},{"iata":"CUL","name":"Culiac\u00e1n","country":"MX","region":"MX-SIN","lat":24.765,"lng":-107.4752},{"iata":"CUM","name":"Cuman\u00e1","country":"VE","region":"VE-R","lat":10.4503,"lng":-64.1305},{"iata":"CUN","name":"Canc\u00fan","country":"MX","region":"MX-ROO","lat":21.0408,"lng":-86.8735},{"iata":"CUP","name":"Car\u00fapano","country":"VE","region":"VE-R","lat":10.66,"lng":-63.2617},{"iata":"CUQ","name":"Coen","country":"AU","region":"AU-QLD","lat":-13.7611,"lng":143.1133},{"iata":"CUR","name":"Willemstad","country":"CW","region":"CW-U-A","lat":12.1889,"lng":-68.9598},{"iata":"CUT","name":"Cutral-Co","country":"AR","region":"AR-Q","lat":-38.9397,"lng":-69.2646},{"iata":"CUU","name":"Chihuahua","country":"MX","region":"MX-CHH","lat":28.7026,"lng":-105.9638},{"iata":"CUZ","name":"Cusco","country":"PE","region":"PE-CUS","lat":-13.5357,"lng":-71.9388},{"iata":"CVC","name":"Cleve Airport","country":"AU","region":"AU-SA","lat":-33.7097,"lng":136.505},{"iata":"CVE","name":"Cove\u00f1as","country":"CO","region":"CO-SUC","lat":9.4009,"lng":-75.6913},{"iata":"CVG","name":"Cincinnati / Covington","country":"US","region":"US-KY","lat":39.0488,"lng":-84.6678},{"iata":"CVJ","name":"Temixco","country":"MX","region":"MX-MOR","lat":18.8339,"lng":-99.2618},{"iata":"CVM","name":"Ciudad Victoria","country":"MX","region":"MX-TAM","lat":23.7033,"lng":-98.9565},{"iata":"CVN","name":"Clovis","country":"US","region":"US-NM","lat":34.4266,"lng":-103.0788},{"iata":"CVO","name":"Corvallis","country":"US","region":"US-OR","lat":44.4972,"lng":-123.29},{"iata":"CVQ","name":"Carnarvon","country":"AU","region":"AU-WA","lat":-24.8843,"lng":113.6664},{"iata":"CVS","name":"Clovis","country":"US","region":"US-NM","lat":34.3828,"lng":-103.322},{"iata":"CVT","name":"Coventry, West Midlands","country":"GB","region":"GB-ENG","lat":52.3697,"lng":-1.4797},{"iata":"CWA","name":"Mosinee","country":"US","region":"US-WI","lat":44.7774,"lng":-89.6702},{"iata":"CWB","name":"Curitiba","country":"BR","region":"BR-PR","lat":-25.5285,"lng":-49.1758},{"iata":"CWC","name":"Chernivtsi","country":"UA","region":"UA-77","lat":48.2593,"lng":25.9808},{"iata":"CWJ","name":"Lincang (Cangyuan)","country":"CN","region":"CN-53","lat":23.2763,"lng":99.3732},{"iata":"CWL","name":"Cardiff","country":"GB","region":"GB-WLS","lat":51.3967,"lng":-3.3433},{"iata":"CWT","name":"Cowra Airport","country":"AU","region":"AU-NSW","lat":-33.8469,"lng":148.648},{"iata":"CWW","name":"Corowa Airport","country":"AU","region":"AU-NSW","lat":-35.9947,"lng":146.357},{"iata":"CXA","name":"Caicara del Orinoco Airport","country":"VE","region":"VE-F","lat":7.6255,"lng":-66.1628},{"iata":"CXB","name":"Cox's Bazar","country":"BD","region":"BD-2","lat":21.4575,"lng":91.9633},{"iata":"CXI","name":"Kiritimati","country":"KI","region":"KI-L","lat":1.9863,"lng":-157.35},{"iata":"CXJ","name":"Caxias Do Sul","country":"BR","region":"BR-RS","lat":-29.1972,"lng":-51.1876},{"iata":"CXO","name":"Houston","country":"US","region":"US-TX","lat":30.3518,"lng":-95.4145},{"iata":"CXP","name":"Cilacap","country":"ID","region":"ID-JT","lat":-7.6451,"lng":109.034},{"iata":"CXR","name":"Nha Trang/nha Trang aiurportCam Ranh","country":"VN","region":"VN-SCC","lat":11.9982,"lng":109.219},{"iata":"CYA","name":"Les Cayes","country":"HT","region":"HT-SD","lat":18.2711,"lng":-73.7883},{"iata":"CYB","name":"West End","country":"KY","region":"KY-CB","lat":19.687,"lng":-79.8828},{"iata":"CYC","name":"Caye Chapel","country":"BZ","region":"BZ-BZ","lat":17.6838,"lng":-88.045},{"iata":"CYG","name":"Corryong Airport","country":"AU","region":"AU-VIC","lat":-36.1828,"lng":147.888},{"iata":"CYI","name":"Shuishang","country":"TW","region":"TW-CYQ","lat":23.4626,"lng":120.3905},{"iata":"CYO","name":"Cayo Largo del Sur","country":"CU","region":"CU-99","lat":21.6165,"lng":-81.546},{"iata":"CYP","name":"Calbayog City","country":"PH","region":"PH-WSA","lat":12.0726,"lng":124.5451},{"iata":"CYS","name":"Cheyenne","country":"US","region":"US-WY","lat":41.1557,"lng":-104.812},{"iata":"CYW","name":"Celaya","country":"MX","region":"MX-GUA","lat":20.546,"lng":-100.8865},{"iata":"CYX","name":"Cherskiy","country":"RU","region":"RU-SA","lat":68.7406,"lng":161.338},{"iata":"CYZ","name":"Cauayan City","country":"PH","region":"PH-ISA","lat":16.9299,"lng":121.753},{"iata":"CZE","name":"Coro","country":"VE","region":"VE-I","lat":11.4149,"lng":-69.6809},{"iata":"CZF","name":"Cape Romanzof","country":"US","region":"US-AK","lat":61.7803,"lng":-166.039},{"iata":"CZH","name":"Corozal","country":"BZ","region":"BZ-CZL","lat":18.3822,"lng":-88.4119},{"iata":"CZL","name":"Constantine","country":"DZ","region":"DZ-25","lat":36.276,"lng":6.6204},{"iata":"CZM","name":"Cozumel","country":"MX","region":"MX-ROO","lat":20.5149,"lng":-86.9285},{"iata":"CZS","name":"Cruzeiro Do Sul","country":"BR","region":"BR-AC","lat":-7.5999,"lng":-72.7695},{"iata":"CZU","name":"Corozal","country":"CO","region":"CO-SUC","lat":9.3327,"lng":-75.2856},{"iata":"CZX","name":"Changzhou","country":"CN","region":"CN-32","lat":31.9205,"lng":119.7755},{"iata":"DAA","name":"Fort Belvoir","country":"US","region":"US-VA","lat":38.715,"lng":-77.181},{"iata":"DAB","name":"Daytona Beach","country":"US","region":"US-FL","lat":29.1825,"lng":-81.0595},{"iata":"DAC","name":"Dhaka","country":"BD","region":"BD-3","lat":23.8433,"lng":90.3978},{"iata":"DAD","name":"Da Nang","country":"VN","region":"VN-SCC","lat":16.0439,"lng":108.199},{"iata":"DAG","name":"Daggett","country":"US","region":"US-CA","lat":34.8537,"lng":-116.787},{"iata":"DAL","name":"Dallas","country":"US","region":"US-TX","lat":32.8448,"lng":-96.8477},{"iata":"DAM","name":"Damascus","country":"SY","region":"SY-DI","lat":33.4115,"lng":36.5156},{"iata":"DAN","name":"Danville","country":"US","region":"US-VA","lat":36.5729,"lng":-79.3361},{"iata":"DAR","name":"Dar es Salaam","country":"TZ","region":"TZ-02","lat":-6.8735,"lng":39.2073},{"iata":"DAT","name":"Datong","country":"CN","region":"CN-14","lat":40.0614,"lng":113.4805},{"iata":"DAU","name":"Daru","country":"PG","region":"PG-WPD","lat":-9.0868,"lng":143.208},{"iata":"DAV","name":"David","country":"PA","region":"PA-4","lat":8.389,"lng":-82.4364},{"iata":"DAY","name":"Dayton","country":"US","region":"US-OH","lat":39.9024,"lng":-84.2194},{"iata":"DBB","name":"El Alamein","country":"EG","region":"EG-MT","lat":30.9243,"lng":28.4616},{"iata":"DBC","name":"Baicheng","country":"CN","region":"CN-22","lat":45.5053,"lng":123.0197},{"iata":"DBD","name":"Dhanbad Airport","country":"IN","region":"IN-BR","lat":23.834,"lng":86.4253},{"iata":"DBO","name":"Dubbo","country":"AU","region":"AU-NSW","lat":-32.2167,"lng":148.575},{"iata":"DBQ","name":"Dubuque","country":"US","region":"US-IA","lat":42.402,"lng":-90.7095},{"iata":"DBR","name":"Darbhanga","country":"IN","region":"IN-BR","lat":26.1928,"lng":85.9169},{"iata":"DBV","name":"Dubrovnik","country":"HR","region":"HR-19","lat":42.5622,"lng":18.2655},{"iata":"DCA","name":"Washington","country":"US","region":"US-DC","lat":38.8521,"lng":-77.0377},{"iata":"DCF","name":"Canefield","country":"DM","region":"DM-10","lat":15.3367,"lng":-61.3921},{"iata":"DCI","name":"Decimomannu","country":"IT","region":"IT-88","lat":39.3542,"lng":8.9725},{"iata":"DCM","name":"Castres","country":"FR","region":"FR-OCC","lat":43.5563,"lng":2.2892},{"iata":"DCN","name":"Derby","country":"AU","region":"AU-WA","lat":-17.5814,"lng":123.8283},{"iata":"DCT","name":"Duncan Town","country":"BS","region":"BS-RI","lat":22.1818,"lng":-75.7295},{"iata":"DCY","name":"Garz\u00ea (Daocheng)","country":"CN","region":"CN-51","lat":29.3163,"lng":100.0603},{"iata":"DDC","name":"Dodge City","country":"US","region":"US-KS","lat":37.7634,"lng":-99.9656},{"iata":"DDG","name":"Dandong (Zhenxing)","country":"CN","region":"CN-21","lat":40.0255,"lng":124.2867},{"iata":"DDR","name":"Xigaz\u00ea (Dingri)","country":"CN","region":"CN-54","lat":28.6046,"lng":86.798},{"iata":"DEA","name":"Dera Ghazi Khan","country":"PK","region":"PK-PB","lat":29.961,"lng":70.4859},{"iata":"DEB","name":"Debrecen","country":"HU","region":"HU-HB","lat":47.4895,"lng":21.6163},{"iata":"DEC","name":"Decatur","country":"US","region":"US-IL","lat":39.8346,"lng":-88.8657},{"iata":"DED","name":"Dehradun (Jauligrant)","country":"IN","region":"IN-UT","lat":30.1892,"lng":78.1767},{"iata":"DEF","name":"Dezful","country":"IR","region":"IR-06","lat":32.4344,"lng":48.3976},{"iata":"DEJ","name":"Tongren","country":"CN","region":"CN-52","lat":28.121,"lng":108.1631},{"iata":"DEL","name":"New Delhi","country":"IN","region":"IN-DL","lat":28.5556,"lng":77.0952},{"iata":"DEN","name":"Denver","country":"US","region":"US-CO","lat":39.86,"lng":-104.6738},{"iata":"DET","name":"Detroit","country":"US","region":"US-MI","lat":42.4092,"lng":-83.0099},{"iata":"DEZ","name":"Deir ez-Zor","country":"SY","region":"SY-DY","lat":35.2854,"lng":40.176},{"iata":"DFW","name":"Dallas-Fort Worth","country":"US","region":"US-TX","lat":32.8968,"lng":-97.038},{"iata":"DGA","name":"Dangriga","country":"BZ","region":"BZ-SC","lat":16.9825,"lng":-88.231},{"iata":"DGE","name":"Mudgee","country":"AU","region":"AU-NSW","lat":-32.5648,"lng":149.6095},{"iata":"DGO","name":"Durango","country":"MX","region":"MX-DUR","lat":24.1255,"lng":-104.5279},{"iata":"DGP","name":"Daugavpils","country":"LV","region":"LV-111","lat":55.9447,"lng":26.665},{"iata":"DGT","name":"Dumaguete City","country":"PH","region":"PH-NER","lat":9.3342,"lng":123.3019},{"iata":"DHA","name":"Dhahran","country":"SA","region":"SA-04","lat":26.2654,"lng":50.152},{"iata":"DHF","name":"Al Dhafra Air Base","country":"AE","region":"AE-AZ","lat":24.2482,"lng":54.5477},{"iata":"DHH","name":"Barkol","country":"CN","region":"CN-65","lat":43.7565,"lng":93.1372},{"iata":"DHM","name":"Kangra","country":"IN","region":"IN-HP","lat":32.1649,"lng":76.263},{"iata":"DHN","name":"Dothan","country":"US","region":"US-AL","lat":31.3213,"lng":-85.4496},{"iata":"DHR","name":"Den Helder","country":"NL","region":"NL-NH","lat":52.9234,"lng":4.7806},{"iata":"DHT","name":"Dalhart","country":"US","region":"US-TX","lat":36.0226,"lng":-102.547},{"iata":"DHX","name":"Kediri","country":"ID","region":"ID-JI","lat":-7.7503,"lng":111.9472},{"iata":"DIA","name":"Doha","country":"QA","region":"QA-DA","lat":25.2594,"lng":51.5655},{"iata":"DIB","name":"Dibrugarh","country":"IN","region":"IN-AS","lat":27.4839,"lng":95.0169},{"iata":"DIE","name":"Antisiranana","country":"MG","region":"MG-D","lat":-12.3494,"lng":49.2917},{"iata":"DIG","name":"Diqing (Shangri-La)","country":"CN","region":"CN-53","lat":27.7936,"lng":99.6772},{"iata":"DIJ","name":"Dijon","country":"FR","region":"FR-BFC","lat":47.2689,"lng":5.09},{"iata":"DIK","name":"Dickinson","country":"US","region":"US-ND","lat":46.7975,"lng":-102.8019},{"iata":"DIL","name":"Dili","country":"TL","region":"TL-DI","lat":-8.5466,"lng":125.5245},{"iata":"DIN","name":"Dien Bien Phu","country":"VN","region":"VN-NW","lat":21.3975,"lng":103.008},{"iata":"DIR","name":"Dire Dawa","country":"ET","region":"ET-DD","lat":9.6235,"lng":41.855},{"iata":"DIS","name":"Dolisie","country":"CG","region":"CG-9","lat":-4.2063,"lng":12.6599},{"iata":"DIY","name":"Diyarbak\u0131r","country":"TR","region":"TR-21","lat":37.8939,"lng":40.201},{"iata":"DJE","name":"Mellita","country":"TN","region":"TN-82","lat":33.8737,"lng":10.7773},{"iata":"DJG","name":"Djanet","country":"DZ","region":"DZ-56","lat":24.2854,"lng":9.4637},{"iata":"DJJ","name":"Sentani","country":"ID","region":"ID-PA","lat":-2.5796,"lng":140.5199},{"iata":"DJO","name":"Daloa Airport","country":"CI","region":"CI-SM","lat":6.7928,"lng":-6.4732},{"iata":"DKA","name":"Katsina","country":"NG","region":"NG-KT","lat":13.0078,"lng":7.6604},{"iata":"DKR","name":"Dakar","country":"SN","region":"SN-DK","lat":14.7423,"lng":-17.4792},{"iata":"DKS","name":"Dikson","country":"RU","region":"RU-KYA","lat":73.5178,"lng":80.3797},{"iata":"DLA","name":"Douala","country":"CM","region":"CM-LT","lat":4.0061,"lng":9.7195},{"iata":"DLC","name":"Dalian (Ganjingzi)","country":"CN","region":"CN-21","lat":38.9657,"lng":121.5385},{"iata":"DLE","name":"Dole","country":"FR","region":"FR-BFC","lat":47.039,"lng":5.4276},{"iata":"DLF","name":"Del Rio","country":"US","region":"US-TX","lat":29.3595,"lng":-100.778},{"iata":"DLG","name":"Dillingham","country":"US","region":"US-AK","lat":59.0447,"lng":-158.505},{"iata":"DLH","name":"Duluth","country":"US","region":"US-MN","lat":46.8419,"lng":-92.1987},{"iata":"DLI","name":"Da Lat","country":"VN","region":"VN-CH","lat":11.7506,"lng":108.367},{"iata":"DLM","name":"Dalaman","country":"TR","region":"TR-48","lat":36.7131,"lng":28.7925},{"iata":"DLS","name":"Dallesport / The Dalles","country":"US","region":"US-OR","lat":45.621,"lng":-121.1708},{"iata":"DLU","name":"Dali (Xiaguan)","country":"CN","region":"CN-53","lat":25.6494,"lng":100.319},{"iata":"DLZ","name":"Dalanzadgad","country":"MN","region":"MN-053","lat":43.6086,"lng":104.3677},{"iata":"DMA","name":"Tucson","country":"US","region":"US-AZ","lat":32.1665,"lng":-110.883},{"iata":"DMB","name":"Taraz","country":"KZ","region":"KZ-ZHA","lat":42.8536,"lng":71.3036},{"iata":"DME","name":"Moscow","country":"RU","region":"RU-MOS","lat":55.4088,"lng":37.9063},{"iata":"DMK","name":"Bangkok","country":"TH","region":"TH-10","lat":13.9126,"lng":100.607},{"iata":"DMM","name":"Ad Dammam","country":"SA","region":"SA-04","lat":26.4691,"lng":49.7982},{"iata":"DMN","name":"Deming","country":"US","region":"US-NM","lat":32.2623,"lng":-107.721},{"iata":"DMU","name":"Dimapur","country":"IN","region":"IN-NL","lat":25.8839,"lng":93.7711},{"iata":"DNA","name":"Okinawa","country":"JP","region":"JP-47","lat":26.3517,"lng":127.7694},{"iata":"DND","name":"Dundee","country":"GB","region":"GB-SCT","lat":56.4525,"lng":-3.0258},{"iata":"DNH","name":"Dunhuang","country":"CN","region":"CN-62","lat":40.162,"lng":94.8128},{"iata":"DNK","name":"Dnipro","country":"UA","region":"UA-12","lat":48.3572,"lng":35.1006},{"iata":"DNL","name":"Augusta","country":"US","region":"US-GA","lat":33.4665,"lng":-82.0394},{"iata":"DNQ","name":"Deniliquin","country":"AU","region":"AU-NSW","lat":-35.5594,"lng":144.946},{"iata":"DNR","name":"Dinard","country":"FR","region":"FR-BRE","lat":48.5877,"lng":-2.08},{"iata":"DNZ","name":"Denizli","country":"TR","region":"TR-20","lat":37.7856,"lng":29.7013},{"iata":"DOD","name":"Dodoma","country":"TZ","region":"TZ-03","lat":-6.1704,"lng":35.7526},{"iata":"DOG","name":"Dongola","country":"SD","region":"SD-01","lat":19.1537,"lng":30.4301},{"iata":"DOH","name":"Doha","country":"QA","region":"QA-DA","lat":25.2731,"lng":51.6081},{"iata":"DOL","name":"Deauville","country":"FR","region":"FR-NOR","lat":49.3652,"lng":0.1545},{"iata":"DOM","name":"Marigot","country":"DM","region":"DM-02","lat":15.5467,"lng":-61.3011},{"iata":"DOV","name":"Dover","country":"US","region":"US-DE","lat":39.1295,"lng":-75.466},{"iata":"DOY","name":"Dongying (Kenli)","country":"CN","region":"CN-37","lat":37.5014,"lng":118.7899},{"iata":"DPA","name":"Chicago/West Chicago","country":"US","region":"US-IL","lat":41.9078,"lng":-88.2486},{"iata":"DPL","name":"Dipolog","country":"PH","region":"PH-ZAN","lat":8.602,"lng":123.3419},{"iata":"DPO","name":"Devonport","country":"AU","region":"AU-TAS","lat":-41.1697,"lng":146.43},{"iata":"DPS","name":"Kuta, Badung","country":"ID","region":"ID-BA","lat":-8.7484,"lng":115.1671},{"iata":"DQM","name":"Duqm","country":"OM","region":"OM-WU","lat":19.5019,"lng":57.6342},{"iata":"DRA","name":"Mercury","country":"US","region":"US-NV","lat":36.6194,"lng":-116.033},{"iata":"DRB","name":"Derby","country":"AU","region":"AU-WA","lat":-17.3719,"lng":123.6622},{"iata":"DRG","name":"Deering","country":"US","region":"US-AK","lat":66.0689,"lng":-162.7669},{"iata":"DRI","name":"DeRidder","country":"US","region":"US-LA","lat":30.8317,"lng":-93.3399},{"iata":"DRN","name":"Dirranbandi Airport","country":"AU","region":"AU-QLD","lat":-28.5879,"lng":148.2172},{"iata":"DRO","name":"Durango","country":"US","region":"US-CO","lat":37.1515,"lng":-107.754},{"iata":"DRP","name":"Legazpi","country":"PH","region":"PH-ALB","lat":13.1119,"lng":123.6768},{"iata":"DRS","name":"Dresden","country":"DE","region":"DE-SN","lat":51.1341,"lng":13.7678},{"iata":"DRT","name":"Del Rio","country":"US","region":"US-TX","lat":29.3742,"lng":-100.927},{"iata":"DRW","name":"Darwin","country":"AU","region":"AU-NT","lat":-12.415,"lng":130.8818},{"iata":"DSI","name":"Destin","country":"US","region":"US-FL","lat":30.4001,"lng":-86.4715},{"iata":"DSK","name":"Dera Ismael Khan","country":"PK","region":"PK-KP","lat":31.9094,"lng":70.8966},{"iata":"DSM","name":"Des Moines","country":"US","region":"US-IA","lat":41.534,"lng":-93.6567},{"iata":"DSN","name":"Ordos","country":"CN","region":"CN-15","lat":39.4935,"lng":109.8599},{"iata":"DSO","name":"S\u014fnd\u014fng-ni","country":"KP","region":"KP-08","lat":39.7452,"lng":127.474},{"iata":"DSS","name":"Dakar","country":"SN","region":"SN-DK","lat":14.6709,"lng":-17.0728},{"iata":"DSY","name":"Ta Noun","country":"KH","region":"KH-9","lat":10.9142,"lng":103.2267},{"iata":"DTE","name":"Daet","country":"PH","region":"PH-CAN","lat":14.1292,"lng":122.98},{"iata":"DTM","name":"Dortmund","country":"DE","region":"DE-NW","lat":51.5183,"lng":7.6122},{"iata":"DTU","name":"Heihe","country":"CN","region":"CN-23","lat":48.441,"lng":126.1284},{"iata":"DTW","name":"Detroit","country":"US","region":"US-MI","lat":42.2138,"lng":-83.3538},{"iata":"DUA","name":"Durant","country":"US","region":"US-OK","lat":33.9397,"lng":-96.3951},{"iata":"DUB","name":"Dublin","country":"IE","region":"IE-D","lat":53.4287,"lng":-6.2621},{"iata":"DUD","name":"Dunedin","country":"NZ","region":"NZ-OTA","lat":-45.929,"lng":170.1978},{"iata":"DUE","name":"Chitato","country":"AO","region":"AO-LNO","lat":-7.4009,"lng":20.8185},{"iata":"DUG","name":"Douglas Bisbee","country":"US","region":"US-AZ","lat":31.4641,"lng":-109.6046},{"iata":"DUJ","name":"Dubois","country":"US","region":"US-PA","lat":41.1783,"lng":-78.8987},{"iata":"DUM","name":"Dumai","country":"ID","region":"ID-RI","lat":1.609,"lng":101.4335},{"iata":"DUR","name":"Durban","country":"ZA","region":"ZA-NL","lat":-29.6144,"lng":31.1197},{"iata":"DUS","name":"D\u00fcsseldorf","country":"DE","region":"DE-NW","lat":51.2895,"lng":6.7668},{"iata":"DUT","name":"Unalaska","country":"US","region":"US-AK","lat":53.8988,"lng":-166.545},{"iata":"DVL","name":"Devils Lake","country":"US","region":"US-ND","lat":48.1155,"lng":-98.9088},{"iata":"DVO","name":"Davao","country":"PH","region":"PH-DVO","lat":7.1255,"lng":125.646},{"iata":"DWA","name":"Dwangwa","country":"MW","region":"MW-NK","lat":-12.5175,"lng":34.1319},{"iata":"DWC","name":"Dubai(Jebel Ali)","country":"AE","region":"AE-DU","lat":24.8962,"lng":55.1624},{"iata":"DWD","name":"Dawadmi","country":"SA","region":"SA-01","lat":24.4499,"lng":44.1212},{"iata":"DXB","name":"Dubai","country":"AE","region":"AE-DU","lat":25.2498,"lng":55.371},{"iata":"DXN","name":"Gautam Buddha Nagar","country":"IN","region":"IN-UP","lat":28.1799,"lng":77.6118},{"iata":"DXR","name":"Danbury","country":"US","region":"US-CT","lat":41.3717,"lng":-73.4822},{"iata":"DYA","name":"Dysart Airport","country":"AU","region":"AU-QLD","lat":-22.6222,"lng":148.364},{"iata":"DYG","name":"Zhangjiajie (Yongding)","country":"CN","region":"CN-43","lat":29.1047,"lng":110.4428},{"iata":"DYR","name":"Anadyr","country":"RU","region":"RU-CHU","lat":64.7349,"lng":177.741},{"iata":"DYS","name":"Abilene","country":"US","region":"US-TX","lat":32.4208,"lng":-99.8546},{"iata":"DYU","name":"Dushanbe","country":"TJ","region":"TJ-DU","lat":38.5437,"lng":68.823},{"iata":"DZA","name":"Dzaoudzi","country":"YT","region":"YT-U-A","lat":-12.8093,"lng":45.2818},{"iata":"DZH","name":"Dazhou (Dachuan)","country":"CN","region":"CN-51","lat":31.0488,"lng":107.4356},{"iata":"DZN","name":"Zhezkazgan","country":"KZ","region":"KZ-ULY","lat":47.709,"lng":67.7381},{"iata":"DZO","name":"Durazno","country":"UY","region":"UY-DU","lat":-33.3589,"lng":-56.4992},{"iata":"EAM","name":"Najran","country":"SA","region":"SA-10","lat":17.6114,"lng":44.4192},{"iata":"EAR","name":"Kearney","country":"US","region":"US-NE","lat":40.727,"lng":-99.0068},{"iata":"EAS","name":"Hondarribia","country":"ES","region":"ES-PV","lat":43.3565,"lng":-1.7906},{"iata":"EAT","name":"Wenatchee","country":"US","region":"US-WA","lat":47.3989,"lng":-120.207},{"iata":"EAU","name":"Eau Claire","country":"US","region":"US-WI","lat":44.8658,"lng":-91.4843},{"iata":"EBA","name":"Campo nell'Elba (LI)","country":"IT","region":"IT-52","lat":42.7609,"lng":10.2398},{"iata":"EBB","name":"Entebbe","country":"UG","region":"UG-C","lat":0.0424,"lng":32.4435},{"iata":"EBD","name":"El-Obeid","country":"SD","region":"SD-09","lat":13.1532,"lng":30.2327},{"iata":"EBG","name":"El Bagre","country":"CO","region":"CO-ANT","lat":7.5965,"lng":-74.8089},{"iata":"EBJ","name":"Esbjerg","country":"DK","region":"DK-83","lat":55.5259,"lng":8.5534},{"iata":"EBL","name":"Arbil","country":"IQ","region":"IQ-AR","lat":36.236,"lng":43.9466},{"iata":"EBM","name":"El Borma","country":"TN","region":"TN-83","lat":31.7043,"lng":9.2546},{"iata":"EBU","name":"Andr\u00e9zieux-Bouth\u00e9on, Loire","country":"FR","region":"FR-ARA","lat":45.5406,"lng":4.2964},{"iata":"ECG","name":"Elizabeth City","country":"US","region":"US-NC","lat":36.2606,"lng":-76.1746},{"iata":"ECH","name":"Echuca Airport","country":"AU","region":"AU-VIC","lat":-36.1572,"lng":144.762},{"iata":"ECN","name":"Tymbou (Kirklar)","country":"CY","region":"CY-02","lat":35.1531,"lng":33.5074},{"iata":"ECP","name":"Panama City Beach","country":"US","region":"US-FL","lat":30.3571,"lng":-85.7954},{"iata":"EDF","name":"Anchorage","country":"US","region":"US-AK","lat":61.2517,"lng":-149.8071},{"iata":"EDI","name":"Edinburgh","country":"GB","region":"GB-SCT","lat":55.9501,"lng":-3.3723},{"iata":"EDL","name":"Eldoret","country":"KE","region":"KE-700","lat":0.4045,"lng":35.2389},{"iata":"EDM","name":"La Roche-sur-Yon","country":"FR","region":"FR-PDL","lat":46.7019,"lng":-1.3786},{"iata":"EDO","name":"Edremit","country":"TR","region":"TR-10","lat":39.5525,"lng":27.0102},{"iata":"EDW","name":"Edwards","country":"US","region":"US-CA","lat":34.9108,"lng":-117.8864},{"iata":"EEA","name":"Correia Pinto","country":"BR","region":"BR-SC","lat":-27.6341,"lng":-50.3583},{"iata":"EED","name":"Needles","country":"US","region":"US-CA","lat":34.7663,"lng":-114.623},{"iata":"EEN","name":"Keene","country":"US","region":"US-NH","lat":42.8984,"lng":-72.2708},{"iata":"EES","name":"Berenice Troglodytica","country":"EG","region":"EG-BA","lat":23.9804,"lng":35.4603},{"iata":"EFD","name":"Houston","country":"US","region":"US-TX","lat":29.6073,"lng":-95.1588},{"iata":"EFL","name":"Kefallinia Island","country":"GR","region":"GR-F","lat":38.1201,"lng":20.5005},{"iata":"EGC","name":"Bergerac","country":"FR","region":"FR-NAQ","lat":44.8253,"lng":0.5186},{"iata":"EGE","name":"Eagle","country":"US","region":"US-CO","lat":39.6426,"lng":-106.918},{"iata":"EGH","name":"El Jora","country":"EG","region":"EG-SIN","lat":31.0781,"lng":34.1531},{"iata":"EGI","name":"Crestview","country":"US","region":"US-FL","lat":30.6504,"lng":-86.5229},{"iata":"EGO","name":"Belgorod","country":"RU","region":"RU-BEL","lat":50.6438,"lng":36.5901},{"iata":"EGS","name":"Egilssta\u00f0ir","country":"IS","region":"IS-7","lat":65.2833,"lng":-14.4014},{"iata":"EGX","name":"Egegik","country":"US","region":"US-AK","lat":58.1844,"lng":-157.3749},{"iata":"EHL","name":"El Bols\u00f3n","country":"AR","region":"AR-R","lat":-41.9432,"lng":-71.5323},{"iata":"EHM","name":"Cape Newenham","country":"US","region":"US-AK","lat":58.6464,"lng":-162.063},{"iata":"EHU","name":"Ezhou","country":"CN","region":"CN-42","lat":30.3412,"lng":115.0393},{"iata":"EIB","name":"H\u00f6rselberg-Hainich","country":"DE","region":"DE-TH","lat":50.9916,"lng":10.4797},{"iata":"EIE","name":"Yeniseysk","country":"RU","region":"RU-KYA","lat":58.4742,"lng":92.1125},{"iata":"EIK","name":"Yeysk","country":"RU","region":"RU-KDA","lat":46.68,"lng":38.21},{"iata":"EIL","name":"Fairbanks","country":"US","region":"US-AK","lat":64.6657,"lng":-147.102},{"iata":"EIN","name":"Eindhoven","country":"NL","region":"NL-NB","lat":51.4501,"lng":5.3745},{"iata":"EIS","name":"Beef Island","country":"VG","region":"VG-U-A","lat":18.4455,"lng":-64.5417},{"iata":"EJA","name":"Barrancabermeja","country":"CO","region":"CO-SAN","lat":7.0243,"lng":-73.8068},{"iata":"EJH","name":"Al Wajh","country":"SA","region":"SA-07","lat":26.1986,"lng":36.4764},{"iata":"EKA","name":"Eureka","country":"US","region":"US-CA","lat":40.8034,"lng":-124.113},{"iata":"EKB","name":"Ekibastuz","country":"KZ","region":"KZ-PAV","lat":51.591,"lng":75.215},{"iata":"EKN","name":"Elkins","country":"US","region":"US-WV","lat":38.8898,"lng":-79.8577},{"iata":"EKO","name":"Elko","country":"US","region":"US-NV","lat":40.8249,"lng":-115.792},{"iata":"EKT","name":"Eskilstuna","country":"SE","region":"SE-D","lat":59.3511,"lng":16.7084},{"iata":"ELB","name":"El Banco","country":"CO","region":"CO-MAG","lat":9.0455,"lng":-73.9749},{"iata":"ELC","name":"Elcho Island","country":"AU","region":"AU-NT","lat":-12.0194,"lng":135.571},{"iata":"ELD","name":"El Dorado","country":"US","region":"US-AR","lat":33.221,"lng":-92.8133},{"iata":"ELF","name":"El Fasher","country":"SD","region":"SD-02","lat":13.6149,"lng":25.3246},{"iata":"ELG","name":"El Menia","country":"DZ","region":"DZ-50","lat":30.5807,"lng":2.8616},{"iata":"ELH","name":"North Eleuthera","country":"BS","region":"BS-HI","lat":25.4758,"lng":-76.6808},{"iata":"ELM","name":"Elmira/Corning","country":"US","region":"US-NY","lat":42.1599,"lng":-76.8916},{"iata":"ELP","name":"El Paso","country":"US","region":"US-TX","lat":31.8099,"lng":-106.3756},{"iata":"ELQ","name":"Qassim","country":"SA","region":"SA-05","lat":26.3028,"lng":43.7744},{"iata":"ELS","name":"East London","country":"ZA","region":"ZA-EC","lat":-33.0356,"lng":27.8259},{"iata":"ELU","name":"Guemar","country":"DZ","region":"DZ-39","lat":33.5114,"lng":6.7768},{"iata":"ELY","name":"Ely","country":"US","region":"US-NV","lat":39.2997,"lng":-114.842},{"iata":"EMA","name":"Nottingham, Leicestershire","country":"GB","region":"GB-ENG","lat":52.8311,"lng":-1.3281},{"iata":"EMD","name":"Emerald","country":"AU","region":"AU-QLD","lat":-23.5675,"lng":148.179},{"iata":"EMK","name":"Emmonak","country":"US","region":"US-AK","lat":62.7861,"lng":-164.491},{"iata":"EML","name":"Emmen","country":"CH","region":"CH-LU","lat":47.0924,"lng":8.3052},{"iata":"ENA","name":"Kenai","country":"US","region":"US-AK","lat":60.5709,"lng":-151.2452},{"iata":"ENC","name":"Tomblaine, Meurthe-et-Moselle","country":"FR","region":"FR-GES","lat":48.6921,"lng":6.2305},{"iata":"END","name":"Enid","country":"US","region":"US-OK","lat":36.3392,"lng":-97.9165},{"iata":"ENF","name":"Enontekio","country":"FI","region":"FI-10","lat":68.3626,"lng":23.4243},{"iata":"ENH","name":"Enshi (Enshi)","country":"CN","region":"CN-42","lat":30.3203,"lng":109.485},{"iata":"ENK","name":"Enniskillen, Fermanagh and Omagh","country":"GB","region":"GB-NIR","lat":54.3983,"lng":-7.6512},{"iata":"ENN","name":"Nenana","country":"US","region":"US-AK","lat":64.5488,"lng":-149.0745},{"iata":"ENO","name":"Encarnaci\u00f3n","country":"PY","region":"PY-7","lat":-27.2275,"lng":-55.8376},{"iata":"ENS","name":"Enschede","country":"NL","region":"NL-OV","lat":52.2758,"lng":6.8892},{"iata":"ENU","name":"Enegu","country":"NG","region":"NG-EN","lat":6.4737,"lng":7.5605},{"iata":"ENV","name":"Wendover","country":"US","region":"US-UT","lat":40.7187,"lng":-114.031},{"iata":"ENW","name":"Kenosha","country":"US","region":"US-WI","lat":42.5957,"lng":-87.9278},{"iata":"ENY","name":"Yan'an (Baota)","country":"CN","region":"CN-61","lat":36.4794,"lng":109.4641},{"iata":"EOH","name":"Medell\u00edn","country":"CO","region":"CO-ANT","lat":6.2197,"lng":-75.5906},{"iata":"EOI","name":"Eday","country":"GB","region":"GB-SCT","lat":59.1906,"lng":-2.7722},{"iata":"EOR","name":"Bolivar","country":"VE","region":"VE-F","lat":6.7157,"lng":-61.6388},{"iata":"EOZ","name":"Elorza Airport","country":"VE","region":"VE-C","lat":7.0597,"lng":-69.4967},{"iata":"EPA","name":"El Palomar","country":"AR","region":"AR-B","lat":-34.6099,"lng":-58.6126},{"iata":"EPL","name":"\u00c9pinal","country":"FR","region":"FR-GES","lat":48.325,"lng":6.07},{"iata":"EPR","name":"Esperance","country":"AU","region":"AU-WA","lat":-33.6844,"lng":121.823},{"iata":"EPU","name":"P\u00e4rnu","country":"EE","region":"EE-67","lat":58.419,"lng":24.4728},{"iata":"EQS","name":"Esquel","country":"AR","region":"AR-U","lat":-42.908,"lng":-71.1395},{"iata":"ERC","name":"Erzincan","country":"TR","region":"TR-24","lat":39.7102,"lng":39.527},{"iata":"ERD","name":"Berdyansk","country":"UA","region":"UA-23","lat":46.815,"lng":36.7581},{"iata":"ERF","name":"Erfurt","country":"DE","region":"DE-TH","lat":50.9783,"lng":10.9607},{"iata":"ERH","name":"Errachidia","country":"MA","region":"MA-08","lat":31.9475,"lng":-4.3983},{"iata":"ERI","name":"Erie","country":"US","region":"US-PA","lat":42.0831,"lng":-80.1739},{"iata":"ERL","name":"Erenhot","country":"CN","region":"CN-15","lat":43.4241,"lng":112.0911},{"iata":"ERS","name":"Windhoek","country":"NA","region":"NA-KH","lat":-22.6049,"lng":17.079},{"iata":"ERZ","name":"Erzurum","country":"TR","region":"TR-25","lat":39.9565,"lng":41.1702},{"iata":"ESB","name":"Ankara","country":"TR","region":"TR-06","lat":40.1281,"lng":32.9951},{"iata":"ESC","name":"Escanaba","country":"US","region":"US-MI","lat":45.7232,"lng":-87.0886},{"iata":"ESD","name":"Eastsound","country":"US","region":"US-WA","lat":48.7082,"lng":-122.91},{"iata":"ESE","name":"Ensenada","country":"MX","region":"MX-BCN","lat":31.7945,"lng":-116.6024},{"iata":"ESF","name":"Alexandria","country":"US","region":"US-LA","lat":31.3943,"lng":-92.2941},{"iata":"ESG","name":"Mariscal Estigarribia","country":"PY","region":"PY-19","lat":-22.0465,"lng":-60.6217},{"iata":"ESH","name":"Brighton, East Sussex","country":"GB","region":"GB-ENG","lat":50.8356,"lng":-0.2972},{"iata":"ESK","name":"Eski\u015fehir","country":"TR","region":"TR-26","lat":39.7841,"lng":30.5821},{"iata":"ESL","name":"Elista","country":"RU","region":"RU-KL","lat":46.3739,"lng":44.3309},{"iata":"ESM","name":"Tachina","country":"EC","region":"EC-E","lat":0.9785,"lng":-79.6266},{"iata":"ESR","name":"El Salvador","country":"CL","region":"CL-AT","lat":-26.3111,"lng":-69.7652},{"iata":"ESU","name":"Essaouira","country":"MA","region":"MA-07","lat":31.3975,"lng":-9.6817},{"iata":"ETM","name":"Eilat","country":"IL","region":"IL-D","lat":29.727,"lng":35.0141},{"iata":"ETR","name":"Santa Rosa","country":"EC","region":"EC-O","lat":-3.442,"lng":-79.997},{"iata":"ETZ","name":"Goin","country":"FR","region":"FR-GES","lat":48.9821,"lng":6.2513},{"iata":"EUG","name":"Eugene","country":"US","region":"US-OR","lat":44.1246,"lng":-123.212},{"iata":"EUN","name":"El Aai\u00fan","country":"EH","region":"EH-U-A","lat":27.1425,"lng":-13.2249},{"iata":"EUQ","name":"San Jose","country":"PH","region":"PH-ANT","lat":10.7666,"lng":121.9325},{"iata":"EUX","name":"Oranjestad","country":"BQ","region":"BQ-SE","lat":17.4965,"lng":-62.9794},{"iata":"EVE","name":"Evenes","country":"NO","region":"NO-18","lat":68.4913,"lng":16.6781},{"iata":"EVN","name":"Yerevan","country":"AM","region":"AM-ER","lat":40.1489,"lng":44.3979},{"iata":"EVV","name":"Evansville","country":"US","region":"US-IN","lat":38.037,"lng":-87.5324},{"iata":"EVW","name":"Evanston","country":"US","region":"US-WY","lat":41.2748,"lng":-111.035},{"iata":"EVX","name":"Fauville, Eure","country":"FR","region":"FR-NOR","lat":49.0287,"lng":1.2199},{"iata":"EWB","name":"New Bedford","country":"US","region":"US-MA","lat":41.6761,"lng":-70.9569},{"iata":"EWN","name":"New Bern","country":"US","region":"US-NC","lat":35.073,"lng":-77.0429},{"iata":"EWR","name":"Newark","country":"US","region":"US-NJ","lat":40.6894,"lng":-74.1705},{"iata":"EXT","name":"Exeter, Devon","country":"GB","region":"GB-ENG","lat":50.7343,"lng":-3.414},{"iata":"EYK","name":"Beloyarskiy Airport","country":"RU","region":"RU-KHM","lat":63.6869,"lng":66.6986},{"iata":"EYP","name":"Yopal","country":"CO","region":"CO-CAS","lat":5.3191,"lng":-72.384},{"iata":"EYW","name":"Key West","country":"US","region":"US-FL","lat":24.5561,"lng":-81.7596},{"iata":"EZE","name":"Buenos Aires (Ezeiza)","country":"AR","region":"AR-B","lat":-34.8222,"lng":-58.5358},{"iata":"EZS","name":"Elaz\u0131\u011f","country":"TR","region":"TR-23","lat":38.598,"lng":39.2835},{"iata":"EZV","name":"Berezovo Airport","country":"RU","region":"RU-KHM","lat":63.921,"lng":65.0305},{"iata":"FAB","name":"Farnborough, Hampshire","country":"GB","region":"GB-ENG","lat":51.2758,"lng":-0.7763},{"iata":"FAE","name":"V\u00e1gar","country":"FO","region":"FO-U-A","lat":62.0633,"lng":-7.2758},{"iata":"FAF","name":"Newport News (Fort Eustis)","country":"US","region":"US-VA","lat":37.1325,"lng":-76.6088},{"iata":"FAI","name":"Fairbanks","country":"US","region":"US-AK","lat":64.8151,"lng":-147.856},{"iata":"FAO","name":"Faro","country":"PT","region":"PT-08","lat":37.0159,"lng":-7.9709},{"iata":"FAR","name":"Fargo","country":"US","region":"US-ND","lat":46.9207,"lng":-96.8158},{"iata":"FAT","name":"Fresno","country":"US","region":"US-CA","lat":36.7758,"lng":-119.718},{"iata":"FAV","name":"Fakarava Airport","country":"PF","region":"PF-U-A","lat":-16.0541,"lng":-145.657},{"iata":"FAY","name":"Fayetteville","country":"US","region":"US-NC","lat":34.9912,"lng":-78.8803},{"iata":"FAZ","name":"Fasa","country":"IR","region":"IR-07","lat":28.8918,"lng":53.7233},{"iata":"FBG","name":"Fort Bragg","country":"US","region":"US-NC","lat":35.1318,"lng":-78.9367},{"iata":"FBK","name":"Fairbanks","country":"US","region":"US-AK","lat":64.8375,"lng":-147.614},{"iata":"FBM","name":"Lubumbashi","country":"CD","region":"CD-HK","lat":-11.5915,"lng":27.5308},{"iata":"FCA","name":"Kalispell","country":"US","region":"US-MT","lat":48.3105,"lng":-114.256},{"iata":"FCB","name":"Ficksburg","country":"ZA","region":"ZA-FS","lat":-28.8231,"lng":27.9089},{"iata":"FCN","name":"Wurster Nordseek\u00fcste","country":"DE","region":"DE-NI","lat":53.7677,"lng":8.6592},{"iata":"FCO","name":"Rome","country":"IT","region":"IT-62","lat":41.8045,"lng":12.252},{"iata":"FCS","name":"Fort Carson","country":"US","region":"US-CO","lat":38.6784,"lng":-104.757},{"iata":"FDF","name":"Fort-de-France","country":"MQ","region":"MQ-U-A","lat":14.591,"lng":-61.0032},{"iata":"FDH","name":"Friedrichshafen","country":"DE","region":"DE-BW","lat":47.6713,"lng":9.5115},{"iata":"FDU","name":"Bandundu","country":"CD","region":"CD-KL","lat":-3.3113,"lng":17.3817},{"iata":"FDY","name":"Findlay","country":"US","region":"US-OH","lat":41.0135,"lng":-83.6687},{"iata":"FEC","name":"Feira de Santana","country":"BR","region":"BR-BA","lat":-12.2007,"lng":-38.9062},{"iata":"FEG","name":"Fergana","country":"UZ","region":"UZ-FA","lat":40.3588,"lng":71.745},{"iata":"FEN","name":"Fernando de Noronha","country":"BR","region":"BR-PE","lat":-3.8545,"lng":-32.423},{"iata":"FEZ","name":"Sa\u00efss","country":"MA","region":"MA-03","lat":33.9273,"lng":-4.978},{"iata":"FFD","name":"Fairford, Gloucestershire","country":"GB","region":"GB-ENG","lat":51.6836,"lng":-1.7892},{"iata":"FFO","name":"Dayton","country":"US","region":"US-OH","lat":39.8261,"lng":-84.0483},{"iata":"FGU","name":"Fangatau","country":"PF","region":"PF-U-A","lat":-15.82,"lng":-140.8881},{"iata":"FHU","name":"Fort Huachuca / Sierra Vista","country":"US","region":"US-AZ","lat":31.5874,"lng":-110.3482},{"iata":"FIH","name":"Kinshasa","country":"CD","region":"CD-KN","lat":-4.3857,"lng":15.4446},{"iata":"FIZ","name":"Fitzroy Crossing Airport","country":"AU","region":"AU-WA","lat":-18.1836,"lng":125.5598},{"iata":"FJR","name":"Fujairah","country":"AE","region":"AE-FU","lat":25.1084,"lng":56.3281},{"iata":"FKB","name":"Rheinm\u00fcnster","country":"DE","region":"DE-BW","lat":48.7794,"lng":8.0805},{"iata":"FKI","name":"Kisangani","country":"CD","region":"CD-TO","lat":0.4816,"lng":25.338},{"iata":"FKJ","name":"Fukui","country":"JP","region":"JP-18","lat":36.1428,"lng":136.224},{"iata":"FKL","name":"Franklin","country":"US","region":"US-PA","lat":41.3779,"lng":-79.8604},{"iata":"FKQ","name":"Fakfak","country":"ID","region":"ID-PB","lat":-2.9205,"lng":132.267},{"iata":"FKS","name":"Sukagawa","country":"JP","region":"JP-07","lat":37.2274,"lng":140.431},{"iata":"FLA","name":"Florencia","country":"CO","region":"CO-CAQ","lat":1.5892,"lng":-75.5644},{"iata":"FLG","name":"Flagstaff","country":"US","region":"US-AZ","lat":35.1398,"lng":-111.6698},{"iata":"FLL","name":"Fort Lauderdale","country":"US","region":"US-FL","lat":26.0726,"lng":-80.1527},{"iata":"FLN","name":"Florian\u00f3polis","country":"BR","region":"BR-SC","lat":-27.6703,"lng":-48.5525},{"iata":"FLO","name":"Florence","country":"US","region":"US-SC","lat":34.1854,"lng":-79.7239},{"iata":"FLR","name":"Firenze (FI)","country":"IT","region":"IT-52","lat":43.8086,"lng":11.2028},{"iata":"FLW","name":"Santa Cruz das Flores","country":"PT","region":"PT-20","lat":39.4553,"lng":-31.1314},{"iata":"FLZ","name":"Sibolga (Pinangsori)","country":"ID","region":"ID-SU","lat":1.5571,"lng":98.8871},{"iata":"FMA","name":"Formosa","country":"AR","region":"AR-P","lat":-26.2127,"lng":-58.2281},{"iata":"FME","name":"Fort Meade(Odenton)","country":"US","region":"US-MD","lat":39.0854,"lng":-76.7594},{"iata":"FMI","name":"Kalemie","country":"CD","region":"CD-TA","lat":-5.8756,"lng":29.25},{"iata":"FMM","name":"Memmingen","country":"DE","region":"DE-BY","lat":47.9881,"lng":10.2382},{"iata":"FMN","name":"Farmington","country":"US","region":"US-NM","lat":36.7412,"lng":-108.23},{"iata":"FMO","name":"Greven","country":"DE","region":"DE-NW","lat":52.1338,"lng":7.6885},{"iata":"FMY","name":"Fort Myers","country":"US","region":"US-FL","lat":26.5866,"lng":-81.8633},{"iata":"FNA","name":"Freetown (Lungi-Town)","country":"SL","region":"SL-N","lat":8.6164,"lng":-13.1955},{"iata":"FNB","name":"Trollenhagen","country":"DE","region":"DE-MV","lat":53.6022,"lng":13.306},{"iata":"FNC","name":"Funchal","country":"PT","region":"PT-30","lat":32.6978,"lng":-16.7746},{"iata":"FNI","name":"N\u00eemes/Garons","country":"FR","region":"FR-OCC","lat":43.7574,"lng":4.4164},{"iata":"FNJ","name":"Pyongyang","country":"KP","region":"KP-01","lat":39.2241,"lng":125.67},{"iata":"FNL","name":"Loveland","country":"US","region":"US-CO","lat":40.4497,"lng":-105.0113},{"iata":"FNT","name":"Flint","country":"US","region":"US-MI","lat":42.9693,"lng":-83.7434},{"iata":"FOC","name":"Fuzhou (Changle)","country":"CN","region":"CN-35","lat":25.9293,"lng":119.6725},{"iata":"FOD","name":"Fort Dodge","country":"US","region":"US-IA","lat":42.5526,"lng":-94.1912},{"iata":"FOE","name":"Topeka","country":"US","region":"US-KS","lat":38.9509,"lng":-95.6636},{"iata":"FOG","name":"Foggia (FG)","country":"IT","region":"IT-75","lat":41.4336,"lng":15.5346},{"iata":"FOM","name":"Foumban","country":"CM","region":"CM-OU","lat":5.6369,"lng":10.7508},{"iata":"FON","name":"La Fortuna","country":"CR","region":"CR-A","lat":10.4693,"lng":-84.5791},{"iata":"FOR","name":"Fortaleza","country":"BR","region":"BR-CE","lat":-3.7758,"lng":-38.5322},{"iata":"FOS","name":"Forrest Airport","country":"AU","region":"AU-WA","lat":-30.8366,"lng":128.1128},{"iata":"FPO","name":"Freeport","country":"BS","region":"BS-FP","lat":26.558,"lng":-78.6956},{"iata":"FPR","name":"Fort Pierce","country":"US","region":"US-FL","lat":27.4951,"lng":-80.3683},{"iata":"FRA","name":"Frankfurt am Main","country":"DE","region":"DE-HE","lat":50.0267,"lng":8.5584},{"iata":"FRB","name":"Forbes","country":"AU","region":"AU-NSW","lat":-33.3636,"lng":147.935},{"iata":"FRD","name":"Friday Harbor","country":"US","region":"US-WA","lat":48.5237,"lng":-123.0246},{"iata":"FRG","name":"East Farmingdale","country":"US","region":"US-NY","lat":40.7286,"lng":-73.4143},{"iata":"FRI","name":"Fort Riley (Junction City)","country":"US","region":"US-KS","lat":39.053,"lng":-96.7642},{"iata":"FRL","name":"Forl\u00ec (FC)","country":"IT","region":"IT-45","lat":44.1948,"lng":12.0701},{"iata":"FRO","name":"Flor\u00f8","country":"NO","region":"NO-46","lat":61.5836,"lng":5.0247},{"iata":"FRS","name":"San Benito","country":"GT","region":"GT-PE","lat":16.9137,"lng":-89.8661},{"iata":"FRW","name":"Francistown","country":"BW","region":"BW-FR","lat":-21.1592,"lng":27.4688},{"iata":"FRZ","name":"Fritzlar","country":"DE","region":"DE-HE","lat":51.1146,"lng":9.286},{"iata":"FSC","name":"Figari","country":"FR","region":"FR-COR","lat":41.5018,"lng":9.0971},{"iata":"FSD","name":"Sioux Falls","country":"US","region":"US-SD","lat":43.5855,"lng":-96.7412},{"iata":"FSI","name":"Fort Sill","country":"US","region":"US-OK","lat":34.6498,"lng":-98.4022},{"iata":"FSM","name":"Fort Smith","country":"US","region":"US-AR","lat":35.3366,"lng":-94.3674},{"iata":"FSP","name":"Saint-Pierre","country":"PM","region":"PM-SP","lat":46.7627,"lng":-56.175},{"iata":"FST","name":"Fort Stockton","country":"US","region":"US-TX","lat":30.9157,"lng":-102.916},{"iata":"FSZ","name":"Makinohara / Shimada","country":"JP","region":"JP-22","lat":34.795,"lng":138.191},{"iata":"FTE","name":"El Calafate","country":"AR","region":"AR-Z","lat":-50.282,"lng":-72.0539},{"iata":"FTK","name":"Fort Knox","country":"US","region":"US-KY","lat":37.9071,"lng":-85.9721},{"iata":"FTU","name":"T\u00f4lanaro","country":"MG","region":"MG-U","lat":-25.0381,"lng":46.9561},{"iata":"FTW","name":"Fort Worth","country":"US","region":"US-TX","lat":32.8199,"lng":-97.3608},{"iata":"FTX","name":"Owando","country":"CG","region":"CG-8","lat":-0.5246,"lng":15.9378},{"iata":"FTY","name":"Atlanta","country":"US","region":"US-GA","lat":33.7791,"lng":-84.5214},{"iata":"FUE","name":"El Matorral","country":"ES","region":"ES-CN","lat":28.4527,"lng":-13.8638},{"iata":"FUG","name":"Yingzhou, Fuyang","country":"CN","region":"CN-34","lat":32.8822,"lng":115.7344},{"iata":"FUJ","name":"Goto","country":"JP","region":"JP-42","lat":32.6663,"lng":128.833},{"iata":"FUK","name":"Fukuoka","country":"JP","region":"JP-40","lat":33.5859,"lng":130.451},{"iata":"FUN","name":"Funafuti","country":"TV","region":"TV-FUN","lat":-8.5239,"lng":179.197},{"iata":"FUO","name":"Foshan (Nanhai)","country":"CN","region":"CN-44","lat":23.0825,"lng":113.0708},{"iata":"FWA","name":"Fort Wayne","country":"US","region":"US-IN","lat":40.9789,"lng":-85.1945},{"iata":"FWH","name":"Fort Worth","country":"US","region":"US-TX","lat":32.7692,"lng":-97.4415},{"iata":"FXE","name":"Fort Lauderdale","country":"US","region":"US-FL","lat":26.1973,"lng":-80.1707},{"iata":"FYJ","name":"Fuyuan","country":"CN","region":"CN-23","lat":48.1972,"lng":134.363},{"iata":"FYN","name":"Fuyun","country":"CN","region":"CN-65","lat":46.8042,"lng":89.512},{"iata":"FYT","name":"Faya-Largeau","country":"TD","region":"TD-BO","lat":17.9171,"lng":19.1111},{"iata":"FYU","name":"Fort Yukon","country":"US","region":"US-AK","lat":66.5717,"lng":-145.25},{"iata":"FYV","name":"Fayetteville","country":"US","region":"US-AR","lat":36.0051,"lng":-94.1701},{"iata":"GAE","name":"Gab\u00e8s","country":"TN","region":"TN-81","lat":33.7337,"lng":9.9194},{"iata":"GAF","name":"Gafsa","country":"TN","region":"TN-71","lat":34.422,"lng":8.8225},{"iata":"GAJ","name":"Higashine","country":"JP","region":"JP-06","lat":38.4119,"lng":140.371},{"iata":"GAL","name":"Galena","country":"US","region":"US-AK","lat":64.7362,"lng":-156.937},{"iata":"GAM","name":"Gambell","country":"US","region":"US-AK","lat":63.7677,"lng":-171.7333},{"iata":"GAN","name":"Gan","country":"MV","region":"MV-01","lat":-0.693,"lng":73.1526},{"iata":"GAO","name":"Guant\u00e1namo","country":"CU","region":"CU-14","lat":20.0853,"lng":-75.1583},{"iata":"GAQ","name":"Gao","country":"ML","region":"ML-7","lat":16.2485,"lng":-0.0054},{"iata":"GAU","name":"Guwahati","country":"IN","region":"IN-AS","lat":26.1067,"lng":91.5852},{"iata":"GAY","name":"Gaya","country":"IN","region":"IN-BR","lat":24.7443,"lng":84.9512},{"iata":"GBB","name":"Gabala","country":"AZ","region":"AZ-QAB","lat":40.8086,"lng":47.7254},{"iata":"GBE","name":"Gaborone","country":"BW","region":"BW-GA","lat":-24.5552,"lng":25.9182},{"iata":"GBJ","name":"Grand-Bourg","country":"GP","region":"GP-U-A","lat":15.8689,"lng":-61.2701},{"iata":"GBT","name":"Gorgan","country":"IR","region":"IR-27","lat":36.9094,"lng":54.4013},{"iata":"GCC","name":"Gillette","country":"US","region":"US-WY","lat":44.3489,"lng":-105.539},{"iata":"GCH","name":"Gachsaran","country":"IR","region":"IR-17","lat":30.3339,"lng":50.8338},{"iata":"GCI","name":"Saint Peter Port","country":"GG","region":"GG-G","lat":49.435,"lng":-2.602},{"iata":"GCJ","name":"Midrand","country":"ZA","region":"ZA-GT","lat":-25.9863,"lng":28.1401},{"iata":"GCK","name":"Garden City","country":"US","region":"US-KS","lat":37.9275,"lng":-100.724},{"iata":"GCM","name":"George Town","country":"KY","region":"KY-GC","lat":19.2928,"lng":-81.3577},{"iata":"GCN","name":"Grand Canyon - Tusayan","country":"US","region":"US-AZ","lat":35.9524,"lng":-112.147},{"iata":"GDB","name":"Gondia","country":"IN","region":"IN-MM","lat":21.5268,"lng":80.2903},{"iata":"GDE","name":"Gode","country":"ET","region":"ET-SO","lat":5.9351,"lng":43.5786},{"iata":"GDL","name":"Guadalajara","country":"MX","region":"MX-JAL","lat":20.5233,"lng":-103.3101},{"iata":"GDN","name":"Gda\u0144sk","country":"PL","region":"PL-PM","lat":54.3776,"lng":18.4662},{"iata":"GDO","name":"Guasdualito","country":"VE","region":"VE-C","lat":7.2108,"lng":-70.7564},{"iata":"GDQ","name":"Azezo","country":"ET","region":"ET-AM","lat":12.5199,"lng":37.434},{"iata":"GDT","name":"Cockburn Town","country":"TC","region":"TC-GT","lat":21.4445,"lng":-71.1423},{"iata":"GDV","name":"Glendive","country":"US","region":"US-MT","lat":47.1377,"lng":-104.8069},{"iata":"GDX","name":"Magadan","country":"RU","region":"RU-MAG","lat":59.911,"lng":150.72},{"iata":"GDZ","name":"Gelendzhik","country":"RU","region":"RU-KDA","lat":44.5821,"lng":38.0125},{"iata":"GEA","name":"Noum\u00e9a","country":"NC","region":"NC-03","lat":-22.2577,"lng":166.4728},{"iata":"GEC","name":"Lefkoniko (Ge\u00e7itkale)","country":"CY","region":"CY-03","lat":35.2359,"lng":33.7201},{"iata":"GEG","name":"Spokane","country":"US","region":"US-WA","lat":47.6199,"lng":-117.534},{"iata":"GEL","name":"Santo \u00c2ngelo","country":"BR","region":"BR-RS","lat":-28.2825,"lng":-54.1696},{"iata":"GEM","name":"Mengomey\u00e9n","country":"GQ","region":"GQ-WN","lat":1.6764,"lng":11.0249},{"iata":"GEO","name":"Georgetown","country":"GY","region":"GY-DE","lat":6.4985,"lng":-58.2541},{"iata":"GER","name":"Nueva Gerona","country":"CU","region":"CU-99","lat":21.8347,"lng":-82.7838},{"iata":"GES","name":"General Santos","country":"PH","region":"PH-SCO","lat":6.0572,"lng":125.0962},{"iata":"GET","name":"Moonyoonooka","country":"AU","region":"AU-WA","lat":-28.7961,"lng":114.707},{"iata":"GEV","name":"G\u00e4llivare","country":"SE","region":"SE-BD","lat":67.1324,"lng":20.8146},{"iata":"GFF","name":"Griffith","country":"AU","region":"AU-NSW","lat":-34.2508,"lng":146.067},{"iata":"GFK","name":"Grand Forks","country":"US","region":"US-ND","lat":47.9493,"lng":-97.1761},{"iata":"GFL","name":"Glens Falls","country":"US","region":"US-NY","lat":43.3412,"lng":-73.6103},{"iata":"GFN","name":"Grafton","country":"AU","region":"AU-NSW","lat":-29.7548,"lng":153.0312},{"iata":"GFR","name":"Br\u00e9ville-sur-Mer, Manche","country":"FR","region":"FR-NOR","lat":48.8831,"lng":-1.5642},{"iata":"GFY","name":"Grootfontein","country":"NA","region":"NA-OD","lat":-19.6022,"lng":18.1227},{"iata":"GGG","name":"Longview","country":"US","region":"US-TX","lat":32.384,"lng":-94.7115},{"iata":"GGT","name":"Moss Town","country":"BS","region":"BS-EX","lat":23.5626,"lng":-75.878},{"iata":"GGW","name":"Glasgow","country":"US","region":"US-MT","lat":48.2125,"lng":-106.615},{"iata":"GHA","name":"El Atteuf","country":"DZ","region":"DZ-47","lat":32.3841,"lng":3.7941},{"iata":"GHB","name":"Governor's Harbour","country":"BS","region":"BS-CE","lat":25.2847,"lng":-76.331},{"iata":"GHC","name":"Bullocks Harbour","country":"BS","region":"BS-BY","lat":25.7383,"lng":-77.8401},{"iata":"GHN","name":"Deyang (Guanghan)","country":"CN","region":"CN-51","lat":30.9485,"lng":104.3296},{"iata":"GHT","name":"Ghat","country":"LY","region":"LY-GT","lat":25.1456,"lng":10.1426},{"iata":"GHU","name":"Gualeguaychu","country":"AR","region":"AR-E","lat":-33.0056,"lng":-58.6128},{"iata":"GHV","name":"Bra\u0219ov (Ghimbav)","country":"RO","region":"RO-BV","lat":45.7056,"lng":25.5229},{"iata":"GIB","name":"Gibraltar","country":"GI","region":"GI-U-A","lat":36.1517,"lng":-5.3498},{"iata":"GID","name":"Gitega","country":"BI","region":"BI-GI","lat":-3.4172,"lng":29.9113},{"iata":"GIG","name":"Rio De Janeiro","country":"BR","region":"BR-RJ","lat":-22.81,"lng":-43.2506},{"iata":"GIL","name":"Gilgit","country":"PK","region":"PK-GB","lat":35.9188,"lng":74.3336},{"iata":"GIR","name":"Girardot","country":"CO","region":"CO-CUN","lat":4.2762,"lng":-74.7967},{"iata":"GIS","name":"Gisborne","country":"NZ","region":"NZ-GIS","lat":-38.6633,"lng":177.978},{"iata":"GIZ","name":"Jizan","country":"SA","region":"SA-09","lat":16.9011,"lng":42.5858},{"iata":"GJA","name":"Guanaja","country":"HN","region":"HN-IB","lat":16.4454,"lng":-85.9066},{"iata":"GJL","name":"Tahir","country":"DZ","region":"DZ-18","lat":36.7941,"lng":5.8737},{"iata":"GJM","name":"Guajar\u00e1-Mirim","country":"BR","region":"BR-RO","lat":-10.7864,"lng":-65.2849},{"iata":"GJT","name":"Grand Junction","country":"US","region":"US-CO","lat":39.1267,"lng":-108.5294},{"iata":"GKA","name":"Goronka","country":"PG","region":"PG-EHG","lat":-6.0817,"lng":145.392},{"iata":"GKE","name":"Geilenkirchen","country":"DE","region":"DE-NW","lat":50.9608,"lng":6.0424},{"iata":"GKN","name":"Gulkana","country":"US","region":"US-AK","lat":62.1559,"lng":-145.4547},{"iata":"GLA","name":"Glasgow","country":"GB","region":"GB-SCT","lat":55.8719,"lng":-4.4331},{"iata":"GLD","name":"Goodland","country":"US","region":"US-KS","lat":39.3707,"lng":-101.6998},{"iata":"GLF","name":"Golfito","country":"CR","region":"CR-P","lat":8.654,"lng":-83.1822},{"iata":"GLH","name":"Greenville","country":"US","region":"US-MS","lat":33.4829,"lng":-90.9856},{"iata":"GLI","name":"Glen Innes","country":"AU","region":"AU-NSW","lat":-29.676,"lng":151.6912},{"iata":"GLO","name":"Staverton, Gloucestershire","country":"GB","region":"GB-ENG","lat":51.8942,"lng":-2.1672},{"iata":"GLS","name":"Galveston","country":"US","region":"US-TX","lat":29.2653,"lng":-94.8604},{"iata":"GLT","name":"Gladstone","country":"AU","region":"AU-QLD","lat":-23.8698,"lng":151.2254},{"iata":"GLU","name":"Gelephu","country":"BT","region":"BT-31","lat":26.8846,"lng":90.4641},{"iata":"GLZ","name":"Rijen","country":"NL","region":"NL-NB","lat":51.5674,"lng":4.9318},{"iata":"GMA","name":"Gemena","country":"CD","region":"CD-SU","lat":3.2354,"lng":19.7713},{"iata":"GMB","name":"Gambela","country":"ET","region":"ET-GA","lat":8.1288,"lng":34.5631},{"iata":"GME","name":"Gomel","country":"BY","region":"BY-HO","lat":52.527,"lng":31.0167},{"iata":"GMO","name":"Gombe","country":"NG","region":"NG-GO","lat":10.2989,"lng":10.9},{"iata":"GMP","name":"Seoul","country":"KR","region":"KR-11","lat":37.5583,"lng":126.791},{"iata":"GMQ","name":"Golog (Maq\u00ean)","country":"CN","region":"CN-63","lat":34.4181,"lng":100.3011},{"iata":"GMR","name":"Totegegie Airport","country":"PF","region":"PF-U-A","lat":-23.0799,"lng":-134.89},{"iata":"GMU","name":"Greenville","country":"US","region":"US-SC","lat":34.8479,"lng":-82.3502},{"iata":"GNA","name":"Hrodna","country":"BY","region":"BY-HR","lat":53.602,"lng":24.0538},{"iata":"GNB","name":"Grenoble","country":"FR","region":"FR-ARA","lat":45.3629,"lng":5.3294},{"iata":"GND","name":"Saint George's","country":"GD","region":"GD-GE","lat":12.004,"lng":-61.7853},{"iata":"GNJ","name":"Ganja","country":"AZ","region":"AZ-GA","lat":40.7387,"lng":46.3204},{"iata":"GNS","name":"Gunungsitoli","country":"ID","region":"ID-SU","lat":1.1663,"lng":97.7052},{"iata":"GNV","name":"Gainesville","country":"US","region":"US-FL","lat":29.6901,"lng":-82.2718},{"iata":"GNY","name":"\u015eanl\u0131urfa","country":"TR","region":"TR-63","lat":37.4457,"lng":38.8956},{"iata":"GOA","name":"Genova (GE)","country":"IT","region":"IT-42","lat":44.412,"lng":8.8407},{"iata":"GOH","name":"Nuuk","country":"GL","region":"GL-SE","lat":64.1911,"lng":-51.6791},{"iata":"GOI","name":"Vasco da Gama","country":"IN","region":"IN-GA","lat":15.3801,"lng":73.8333},{"iata":"GOJ","name":"Nizhny Novgorod","country":"RU","region":"RU-NIZ","lat":56.2274,"lng":43.7852},{"iata":"GOM","name":"Goma","country":"CD","region":"CD-NK","lat":-1.6668,"lng":29.238},{"iata":"GON","name":"Groton","country":"US","region":"US-CT","lat":41.3301,"lng":-72.0451},{"iata":"GOP","name":"Gorakhpur","country":"IN","region":"IN-UP","lat":26.7397,"lng":83.4497},{"iata":"GOQ","name":"Golmud","country":"CN","region":"CN-63","lat":36.4006,"lng":94.7861},{"iata":"GOT","name":"G\u00f6teborg","country":"SE","region":"SE-Q","lat":57.6628,"lng":12.2798},{"iata":"GOU","name":"Garoua","country":"CM","region":"CM-NO","lat":9.3348,"lng":13.3721},{"iata":"GOV","name":"Nhulunbuy","country":"AU","region":"AU-NT","lat":-12.2694,"lng":136.818},{"iata":"GOX","name":"Mopa","country":"IN","region":"IN-GA","lat":15.7443,"lng":73.8606},{"iata":"GOZ","name":"Gorna Oryahovitsa","country":"BG","region":"BG-04","lat":43.1514,"lng":25.7129},{"iata":"GPA","name":"Patras","country":"GR","region":"GR-G","lat":38.1511,"lng":21.4256},{"iata":"GPI","name":"Guapi","country":"CO","region":"CO-CAU","lat":2.5701,"lng":-77.898},{"iata":"GPL","name":"Pococi","country":"CR","region":"CR-L","lat":10.2172,"lng":-83.797},{"iata":"GPN","name":"Pirlangimpi","country":"AU","region":"AU-NT","lat":-11.3997,"lng":130.4256},{"iata":"GPO","name":"General Pico","country":"AR","region":"AR-L","lat":-35.6962,"lng":-63.7583},{"iata":"GPS","name":"Isla Baltra","country":"EC","region":"EC-W","lat":-0.4538,"lng":-90.2659},{"iata":"GPT","name":"Gulfport","country":"US","region":"US-MS","lat":30.4056,"lng":-89.0698},{"iata":"GRB","name":"Green Bay","country":"US","region":"US-WI","lat":44.4835,"lng":-88.1308},{"iata":"GRF","name":"Fort Lewis/Tacoma","country":"US","region":"US-WA","lat":47.0792,"lng":-122.581},{"iata":"GRI","name":"Grand Island","country":"US","region":"US-NE","lat":40.9675,"lng":-98.3096},{"iata":"GRJ","name":"George","country":"ZA","region":"ZA-WC","lat":-34.0056,"lng":22.3789},{"iata":"GRK","name":"Fort Cavazos","country":"US","region":"US-TX","lat":31.0672,"lng":-97.8289},{"iata":"GRO","name":"Girona","country":"ES","region":"ES-CT","lat":41.9046,"lng":2.7618},{"iata":"GRQ","name":"Groningen","country":"NL","region":"NL-DR","lat":53.1191,"lng":6.5777},{"iata":"GRR","name":"Grand Rapids","country":"US","region":"US-MI","lat":42.8808,"lng":-85.5228},{"iata":"GRS","name":"Grosseto (GR)","country":"IT","region":"IT-52","lat":42.7597,"lng":11.0719},{"iata":"GRU","name":"S\u00e3o Paulo","country":"BR","region":"BR-SP","lat":-23.4313,"lng":-46.47},{"iata":"GRV","name":"Grozny","country":"RU","region":"RU-CE","lat":43.3881,"lng":45.6998},{"iata":"GRW","name":"Santa Cruz da Graciosa","country":"PT","region":"PT-20","lat":39.0922,"lng":-28.0298},{"iata":"GRX","name":"Granada","country":"ES","region":"ES-AN","lat":37.1887,"lng":-3.7774},{"iata":"GRY","name":"Gr\u00edmsey/Sandv\u00edk","country":"IS","region":"IS-6","lat":66.5458,"lng":-18.0173},{"iata":"GRZ","name":"Feldkirchen bei Graz","country":"AT","region":"AT-6","lat":46.9911,"lng":15.4396},{"iata":"GSB","name":"Goldsboro","country":"US","region":"US-NC","lat":35.3394,"lng":-77.9606},{"iata":"GSE","name":"G\u00f6teborg","country":"SE","region":"SE-Q","lat":57.7747,"lng":11.8704},{"iata":"GSJ","name":"Puerto San Jos\u00e9","country":"GT","region":"GT-ES","lat":13.9362,"lng":-90.8358},{"iata":"GSM","name":"Qeshm(Dayrestan)","country":"IR","region":"IR-22","lat":26.7546,"lng":55.9024},{"iata":"GSO","name":"Greensboro","country":"US","region":"US-NC","lat":36.0994,"lng":-79.9373},{"iata":"GSP","name":"Greenville/Greer/Spartanburg","country":"US","region":"US-SC","lat":34.8957,"lng":-82.2189},{"iata":"GST","name":"Gustavus","country":"US","region":"US-AK","lat":58.4253,"lng":-135.707},{"iata":"GSV","name":"Saratov","country":"RU","region":"RU-SAR","lat":51.7128,"lng":46.1711},{"iata":"GTE","name":"Groote Eylandt","country":"AU","region":"AU-NT","lat":-13.9724,"lng":136.4586},{"iata":"GTF","name":"Great Falls","country":"US","region":"US-MT","lat":47.482,"lng":-111.371},{"iata":"GTN","name":"Glentanner Station","country":"NZ","region":"NZ-CAN","lat":-43.9067,"lng":170.128},{"iata":"GTR","name":"Columbus/W Point/Starkville","country":"US","region":"US-MS","lat":33.4503,"lng":-88.5914},{"iata":"GUA","name":"Guatemala City","country":"GT","region":"GT-GU","lat":14.5829,"lng":-90.5275},{"iata":"GUC","name":"Gunnison","country":"US","region":"US-CO","lat":38.5347,"lng":-106.9346},{"iata":"GUH","name":"Gunnedah Airport","country":"AU","region":"AU-NSW","lat":-30.9575,"lng":150.249},{"iata":"GUI","name":"Guiria Airport","country":"VE","region":"VE-R","lat":10.5741,"lng":-62.3127},{"iata":"GUJ","name":"Guaratinguet\u00e1","country":"BR","region":"BR-SP","lat":-22.7916,"lng":-45.2048},{"iata":"GUL","name":"Goulburn Airport","country":"AU","region":"AU-NSW","lat":-34.8103,"lng":149.726},{"iata":"GUM","name":"Hag\u00e5t\u00f1a","country":"GU","region":"GU-U-A","lat":13.485,"lng":144.7973},{"iata":"GUP","name":"Gallup","country":"US","region":"US-NM","lat":35.5117,"lng":-108.7882},{"iata":"GUQ","name":"Guanare","country":"VE","region":"VE-P","lat":9.0269,"lng":-69.7552},{"iata":"GUR","name":"Gurney","country":"PG","region":"PG-MBA","lat":-10.3115,"lng":150.334},{"iata":"GUS","name":"Peru","country":"US","region":"US-IN","lat":40.6481,"lng":-86.1521},{"iata":"GUW","name":"Atyrau","country":"KZ","region":"KZ-ATY","lat":47.1213,"lng":51.8203},{"iata":"GUY","name":"Guymon","country":"US","region":"US-OK","lat":36.6851,"lng":-101.508},{"iata":"GVA","name":"Geneva","country":"CH","region":"CH-GE","lat":46.2381,"lng":6.109},{"iata":"GVN","name":"Sovetskaya Gavan","country":"RU","region":"RU-KHA","lat":48.9251,"lng":140.0353},{"iata":"GVR","name":"Governador Valadares","country":"BR","region":"BR-MG","lat":-18.8959,"lng":-41.9829},{"iata":"GVX","name":"G\u00e4vle / Sandviken","country":"SE","region":"SE-X","lat":60.5933,"lng":16.9514},{"iata":"GWD","name":"Gurandani","country":"PK","region":"PK-BA","lat":25.2967,"lng":62.4988},{"iata":"GWE","name":"Gweru","country":"ZW","region":"ZW-MI","lat":-19.4367,"lng":29.8619},{"iata":"GWL","name":"Gwalior","country":"IN","region":"IN-MP","lat":26.2933,"lng":78.2278},{"iata":"GWO","name":"Greenwood","country":"US","region":"US-MS","lat":33.495,"lng":-90.0882},{"iata":"GWT","name":"Sylt","country":"DE","region":"DE-SH","lat":54.9132,"lng":8.3405},{"iata":"GXF","name":"Seiyun","country":"YE","region":"YE-HD","lat":15.9659,"lng":48.7881},{"iata":"GXG","name":"Negage","country":"AO","region":"AO-UIG","lat":-7.7545,"lng":15.2877},{"iata":"GXH","name":"Gannan (Xiahe)","country":"CN","region":"CN-62","lat":34.819,"lng":102.6223},{"iata":"GXQ","name":"Coyhaique","country":"CL","region":"CL-AI","lat":-45.5942,"lng":-72.1061},{"iata":"GYA","name":"Guayaramer\u00edn","country":"BO","region":"BO-B","lat":-10.8886,"lng":-65.381},{"iata":"GYD","name":"Baku","country":"AZ","region":"AZ-BA","lat":40.4728,"lng":50.0509},{"iata":"GYE","name":"Guayaquil","country":"EC","region":"EC-G","lat":-2.1574,"lng":-79.8836},{"iata":"GYG","name":"Magan","country":"RU","region":"RU-SA","lat":62.1035,"lng":129.5453},{"iata":"GYI","name":"Gisenyi","country":"RW","region":"RW-04","lat":-1.6772,"lng":29.2589},{"iata":"GYM","name":"Guaymas","country":"MX","region":"MX-SON","lat":27.969,"lng":-110.925},{"iata":"GYN","name":"Goi\u00e2nia","country":"BR","region":"BR-GO","lat":-16.632,"lng":-49.2207},{"iata":"GYS","name":"Guangyuan (Lizhou)","country":"CN","region":"CN-51","lat":32.3903,"lng":105.6946},{"iata":"GYU","name":"Guyuan (Yuanzhou)","country":"CN","region":"CN-64","lat":36.0789,"lng":106.2169},{"iata":"GYY","name":"Gary","country":"US","region":"US-IN","lat":41.6171,"lng":-87.4132},{"iata":"GZP","name":"Gazipa\u015fa","country":"TR","region":"TR-07","lat":36.2988,"lng":32.297},{"iata":"GZT","name":"Gaziantep","country":"TR","region":"TR-27","lat":36.9472,"lng":37.4787},{"iata":"GZW","name":"Qazvin","country":"IR","region":"IR-26","lat":36.2401,"lng":50.0471},{"iata":"HAC","name":"Hachijojima","country":"JP","region":"JP-13","lat":33.1148,"lng":139.7856},{"iata":"HAD","name":"Halmstad","country":"SE","region":"SE-N","lat":56.6911,"lng":12.8202},{"iata":"HAH","name":"Moroni","country":"KM","region":"KM-G","lat":-11.5337,"lng":43.2719},{"iata":"HAJ","name":"Hannover","country":"DE","region":"DE-NI","lat":52.4611,"lng":9.6851},{"iata":"HAK","name":"Haikou (Meilan)","country":"CN","region":"CN-46","lat":19.9349,"lng":110.459},{"iata":"HAM","name":"Hamburg","country":"DE","region":"DE-HH","lat":53.6304,"lng":9.9882},{"iata":"HAN","name":"Hanoi (Soc Son)","country":"VN","region":"VN-RRD","lat":21.2212,"lng":105.807},{"iata":"HAQ","name":"Haa Dhaalu Atoll","country":"MV","region":"MV-23","lat":6.7432,"lng":73.1671},{"iata":"HAS","name":"Hail","country":"SA","region":"SA-06","lat":27.4379,"lng":41.6863},{"iata":"HAU","name":"Karm\u00f8y","country":"NO","region":"NO-11","lat":59.3453,"lng":5.2084},{"iata":"HAV","name":"Havana","country":"CU","region":"CU-03","lat":22.9892,"lng":-82.4091},{"iata":"HAW","name":"Haverfordwest","country":"GB","region":"GB-WLS","lat":51.8331,"lng":-4.9611},{"iata":"HBA","name":"Hobart (Cambridge)","country":"AU","region":"AU-TAS","lat":-42.837,"lng":147.513},{"iata":"HBE","name":"Alexandria","country":"EG","region":"EG-ALX","lat":30.9325,"lng":29.6964},{"iata":"HBG","name":"Hattiesburg","country":"US","region":"US-MS","lat":31.2648,"lng":-89.2528},{"iata":"HBR","name":"Hobart","country":"US","region":"US-OK","lat":34.9913,"lng":-99.0513},{"iata":"HBX","name":"Hubballi","country":"IN","region":"IN-KA","lat":15.3611,"lng":75.0821},{"iata":"HCJ","name":"Hechi (Jinchengjiang)","country":"CN","region":"CN-45","lat":24.8043,"lng":107.7108},{"iata":"HCN","name":"Hengchun","country":"TW","region":"TW-PIF","lat":22.0411,"lng":120.73},{"iata":"HCQ","name":"Halls Creek Airport","country":"AU","region":"AU-WA","lat":-18.2339,"lng":127.67},{"iata":"HCR","name":"Holy Cross","country":"US","region":"US-AK","lat":62.1883,"lng":-159.775},{"iata":"HCZ","name":"Chenzhou","country":"CN","region":"CN-43","lat":25.7534,"lng":112.8454},{"iata":"HDF","name":"Zirchow","country":"DE","region":"DE-MV","lat":53.8787,"lng":14.1523},{"iata":"HDG","name":"Handan","country":"CN","region":"CN-13","lat":36.5248,"lng":114.4241},{"iata":"HDM","name":"Hamadan","country":"IR","region":"IR-13","lat":34.8664,"lng":48.5607},{"iata":"HDN","name":"Hayden","country":"US","region":"US-CO","lat":40.4812,"lng":-107.218},{"iata":"HDS","name":"Hoedspruit","country":"ZA","region":"ZA-NP","lat":-24.3619,"lng":31.0529},{"iata":"HDY","name":"Hat Yai","country":"TH","region":"TH-90","lat":6.9332,"lng":100.393},{"iata":"HEA","name":"Guzara","country":"AF","region":"AF-HER","lat":34.21,"lng":62.2283},{"iata":"HEH","name":"Heho","country":"MM","region":"MM-17","lat":20.7471,"lng":96.792},{"iata":"HEK","name":"Heihe","country":"CN","region":"CN-23","lat":50.1716,"lng":127.3089},{"iata":"HEL","name":"Helsinki (Vantaa)","country":"FI","region":"FI-18","lat":60.3184,"lng":24.9633},{"iata":"HER","name":"Heraklion","country":"GR","region":"GR-M","lat":35.3397,"lng":25.1803},{"iata":"HET","name":"Hohhot","country":"CN","region":"CN-15","lat":40.8497,"lng":111.8246},{"iata":"HFA","name":"Haifa","country":"IL","region":"IL-HA","lat":32.8102,"lng":35.0437},{"iata":"HFD","name":"Hartford","country":"US","region":"US-CT","lat":41.7367,"lng":-72.6494},{"iata":"HFE","name":"Hefei","country":"CN","region":"CN-34","lat":31.9878,"lng":116.9769},{"iata":"HFN","name":"H\u00f6fn","country":"IS","region":"IS-8","lat":64.2956,"lng":-15.2272},{"iata":"HFT","name":"Hammerfest","country":"NO","region":"NO-56","lat":70.6797,"lng":23.6686},{"iata":"HGA","name":"Hargeisa","country":"SO","region":"SO-WO","lat":9.5141,"lng":44.0835},{"iata":"HGH","name":"Hangzhou","country":"CN","region":"CN-33","lat":30.2361,"lng":120.4289},{"iata":"HGI","name":"Hollongi","country":"IN","region":"IN-AR","lat":26.9668,"lng":93.6388},{"iata":"HGN","name":"Mae Hong Son","country":"TH","region":"TH-58","lat":19.3013,"lng":97.9758},{"iata":"HGO","name":"Korhogo","country":"CI","region":"CI-SV","lat":9.3872,"lng":-5.5567},{"iata":"HGR","name":"Hagerstown","country":"US","region":"US-MD","lat":39.7088,"lng":-77.728},{"iata":"HGU","name":"Mount Hagen","country":"PG","region":"PG-WHM","lat":-5.8282,"lng":144.2994},{"iata":"HHE","name":"Hachinohe","country":"JP","region":"JP-02","lat":40.5512,"lng":141.4654},{"iata":"HHH","name":"Hilton Head Island","country":"US","region":"US-SC","lat":32.2244,"lng":-80.6975},{"iata":"HHN","name":"Frankfurt am Main (Lautzenhausen)","country":"DE","region":"DE-RP","lat":49.9464,"lng":7.2617},{"iata":"HHQ","name":"Hua Hin","country":"TH","region":"TH-76","lat":12.6362,"lng":99.9515},{"iata":"HHR","name":"Hawthorne","country":"US","region":"US-CA","lat":33.9228,"lng":-118.335},{"iata":"HIA","name":"Huai'an","country":"CN","region":"CN-32","lat":33.7927,"lng":119.1267},{"iata":"HIB","name":"Hibbing","country":"US","region":"US-MN","lat":47.3848,"lng":-92.8369},{"iata":"HID","name":"Horn","country":"AU","region":"AU-QLD","lat":-10.5856,"lng":142.2928},{"iata":"HIF","name":"Ogden","country":"US","region":"US-UT","lat":41.124,"lng":-111.9731},{"iata":"HII","name":"Lake Havasu City","country":"US","region":"US-AZ","lat":34.5705,"lng":-114.3577},{"iata":"HIJ","name":"Hiroshima","country":"JP","region":"JP-34","lat":34.4361,"lng":132.919},{"iata":"HIM","name":"Polonnaruwa Town","country":"LK","region":"LK-7","lat":8.0498,"lng":80.9814},{"iata":"HIN","name":"Sacheon","country":"KR","region":"KR-48","lat":35.0886,"lng":128.0717},{"iata":"HIO","name":"Portland","country":"US","region":"US-OR","lat":45.5404,"lng":-122.95},{"iata":"HIR","name":"Honiara","country":"SB","region":"SB-GU","lat":-9.428,"lng":160.055},{"iata":"HJJ","name":"Huaihua","country":"CN","region":"CN-43","lat":27.4431,"lng":109.7047},{"iata":"HJR","name":"Khajuraho","country":"IN","region":"IN-MP","lat":24.8172,"lng":79.9186},{"iata":"HKD","name":"Hakodate","country":"JP","region":"JP-01","lat":41.77,"lng":140.822},{"iata":"HKG","name":"Hong Kong","country":"HK","region":"HK-NT","lat":22.3118,"lng":113.9149},{"iata":"HKK","name":"Hokitika Airfield","country":"NZ","region":"NZ-WTC","lat":-42.7136,"lng":170.985},{"iata":"HKN","name":"Kimbe","country":"PG","region":"PG-WBK","lat":-5.4638,"lng":150.4073},{"iata":"HKT","name":"Phuket","country":"TH","region":"TH-83","lat":8.1133,"lng":98.3174},{"iata":"HKY","name":"Hickory","country":"US","region":"US-NC","lat":35.7411,"lng":-81.3895},{"iata":"HLA","name":"Johannesburg","country":"ZA","region":"ZA-GT","lat":-25.939,"lng":27.9266},{"iata":"HLD","name":"Hailar","country":"CN","region":"CN-15","lat":49.2086,"lng":119.8223},{"iata":"HLE","name":"Jamestown","country":"SH","region":"SH-SH","lat":-15.9589,"lng":-5.6461},{"iata":"HLG","name":"Wheeling","country":"US","region":"US-WV","lat":40.175,"lng":-80.6463},{"iata":"HLN","name":"Helena","country":"US","region":"US-MT","lat":46.6068,"lng":-111.983},{"iata":"HLP","name":"Jakarta","country":"ID","region":"ID-JK","lat":-6.267,"lng":106.8903},{"iata":"HLT","name":"Hamilton Airport","country":"AU","region":"AU-VIC","lat":-37.6489,"lng":142.065},{"iata":"HLZ","name":"Hamilton","country":"NZ","region":"NZ-WKO","lat":-37.867,"lng":175.332},{"iata":"HMA","name":"Khanty-Mansiysk","country":"RU","region":"RU-KHM","lat":61.0285,"lng":69.0861},{"iata":"HMB","name":"Suhaj","country":"EG","region":"EG-SHG","lat":26.3425,"lng":31.743},{"iata":"HME","name":"Hassi Messaoud","country":"DZ","region":"DZ-30","lat":31.673,"lng":6.1404},{"iata":"HMI","name":"Hami","country":"CN","region":"CN-65","lat":42.8414,"lng":93.6692},{"iata":"HMJ","name":"Khmelnytskyi","country":"UA","region":"UA-68","lat":49.3597,"lng":26.9334},{"iata":"HMN","name":"Alamogordo","country":"US","region":"US-NM","lat":32.8525,"lng":-106.107},{"iata":"HMO","name":"Hermosillo","country":"MX","region":"MX-SON","lat":29.0928,"lng":-111.053},{"iata":"HNA","name":"Hanamaki","country":"JP","region":"JP-03","lat":39.4286,"lng":141.135},{"iata":"HND","name":"Tokyo","country":"JP","region":"JP-13","lat":35.5497,"lng":139.787},{"iata":"HNL","name":"Honolulu, Oahu","country":"US","region":"US-HI","lat":21.3184,"lng":-157.9257},{"iata":"HNM","name":"Hana","country":"US","region":"US-HI","lat":20.7956,"lng":-156.014},{"iata":"HNS","name":"Haines","country":"US","region":"US-AK","lat":59.2439,"lng":-135.5239},{"iata":"HOB","name":"Hobbs","country":"US","region":"US-NM","lat":32.6875,"lng":-103.217},{"iata":"HOF","name":"Hofuf","country":"SA","region":"SA-04","lat":25.2853,"lng":49.4852},{"iata":"HOG","name":"Holguin","country":"CU","region":"CU-11","lat":20.7851,"lng":-76.3155},{"iata":"HOI","name":"Otepa","country":"PF","region":"PF-U-A","lat":-18.0748,"lng":-140.946},{"iata":"HOM","name":"Homer","country":"US","region":"US-AK","lat":59.6445,"lng":-151.4792},{"iata":"HON","name":"Huron","country":"US","region":"US-SD","lat":44.3852,"lng":-98.2285},{"iata":"HOP","name":"Fort Campbell","country":"US","region":"US-KY","lat":36.6742,"lng":-87.4897},{"iata":"HOQ","name":"Hof","country":"DE","region":"DE-BY","lat":50.2885,"lng":11.8529},{"iata":"HOR","name":"Horta","country":"PT","region":"PT-20","lat":38.5199,"lng":-28.7159},{"iata":"HOT","name":"Hot Springs","country":"US","region":"US-AR","lat":34.4788,"lng":-93.0963},{"iata":"HOU","name":"Houston","country":"US","region":"US-TX","lat":29.6453,"lng":-95.2768},{"iata":"HOV","name":"\u00d8rsta","country":"NO","region":"NO-15","lat":62.18,"lng":6.0741},{"iata":"HPA","name":"Lifuka","country":"TO","region":"TO-02","lat":-19.777,"lng":-174.341},{"iata":"HPG","name":"Shennongjia (Hongping)","country":"CN","region":"CN-42","lat":31.626,"lng":110.34},{"iata":"HPH","name":"Haiphong (Hai An)","country":"VN","region":"VN-RRD","lat":20.8174,"lng":106.7243},{"iata":"HPN","name":"White Plains","country":"US","region":"US-NY","lat":41.067,"lng":-73.7076},{"iata":"HQL","name":"Tashikuergan","country":"CN","region":"CN-65","lat":37.6613,"lng":75.2889},{"iata":"HQM","name":"Hoquiam","country":"US","region":"US-WA","lat":46.9712,"lng":-123.937},{"iata":"HRB","name":"Harbin","country":"CN","region":"CN-23","lat":45.6234,"lng":126.25},{"iata":"HRE","name":"Harare","country":"ZW","region":"ZW-HA","lat":-17.9318,"lng":31.0928},{"iata":"HRG","name":"Hurghada","country":"EG","region":"EG-BA","lat":27.1768,"lng":33.7967},{"iata":"HRI","name":"Mattala","country":"LK","region":"LK-3","lat":6.2839,"lng":81.1242},{"iata":"HRK","name":"Kharkiv","country":"UA","region":"UA-U-A","lat":49.9269,"lng":36.2908},{"iata":"HRL","name":"Harlingen","country":"US","region":"US-TX","lat":26.2285,"lng":-97.6544},{"iata":"HRM","name":"Hassi R'Mel","country":"DZ","region":"DZ-03","lat":32.9304,"lng":3.3115},{"iata":"HRO","name":"Harrison","country":"US","region":"US-AR","lat":36.2615,"lng":-93.1547},{"iata":"HRS","name":"Harrismith","country":"ZA","region":"ZA-FS","lat":-28.2351,"lng":29.1062},{"iata":"HSA","name":"Turk\u0131stan","country":"KZ","region":"KZ-YUZ","lat":43.3117,"lng":68.5502},{"iata":"HSC","name":"Shaoguan","country":"CN","region":"CN-44","lat":24.9786,"lng":113.421},{"iata":"HSG","name":"Saga","country":"JP","region":"JP-41","lat":33.1497,"lng":130.302},{"iata":"HSL","name":"Huslia","country":"US","region":"US-AK","lat":65.6979,"lng":-156.351},{"iata":"HSM","name":"Horsham Airport","country":"AU","region":"AU-VIC","lat":-36.6697,"lng":142.173},{"iata":"HSN","name":"Zhoushan","country":"CN","region":"CN-33","lat":29.9339,"lng":122.3623},{"iata":"HSR","name":"Rajkot","country":"IN","region":"IN-GJ","lat":22.3788,"lng":71.0394},{"iata":"HSS","name":"Hisar","country":"IN","region":"IN-HR","lat":29.1861,"lng":75.7414},{"iata":"HST","name":"Homestead","country":"US","region":"US-FL","lat":25.4886,"lng":-80.3836},{"iata":"HSV","name":"Huntsville","country":"US","region":"US-AL","lat":34.6362,"lng":-86.7744},{"iata":"HSZ","name":"Hsinchu City","country":"TW","region":"TW-HSZ","lat":24.818,"lng":120.939},{"iata":"HTA","name":"Chita","country":"RU","region":"RU-ZAB","lat":52.0248,"lng":113.3058},{"iata":"HTG","name":"Khatanga","country":"RU","region":"RU-KYA","lat":71.9781,"lng":102.491},{"iata":"HTI","name":"Hamilton Island","country":"AU","region":"AU-QLD","lat":-20.3581,"lng":148.952},{"iata":"HTN","name":"Hotan","country":"CN","region":"CN-65","lat":37.0385,"lng":79.8649},{"iata":"HTS","name":"Huntington","country":"US","region":"US-WV","lat":38.3667,"lng":-82.558},{"iata":"HTT","name":"Mengnai","country":"CN","region":"CN-63","lat":38.2016,"lng":90.8378},{"iata":"HTU","name":"Hopetoun Airport","country":"AU","region":"AU-VIC","lat":-35.7153,"lng":142.36},{"iata":"HTV","name":"Huntsville","country":"US","region":"US-TX","lat":30.7469,"lng":-95.5872},{"iata":"HTY","name":"Antakya","country":"TR","region":"TR-31","lat":36.3608,"lng":36.2856},{"iata":"HUA","name":"Redstone Arsnl Huntsville","country":"US","region":"US-AL","lat":34.6787,"lng":-86.6848},{"iata":"HUF","name":"Terre Haute","country":"US","region":"US-IN","lat":39.4515,"lng":-87.3076},{"iata":"HUH","name":"Fare","country":"PF","region":"PF-U-A","lat":-16.6871,"lng":-151.0216},{"iata":"HUI","name":"Hu\u1ebf","country":"VN","region":"VN-NC","lat":16.4006,"lng":107.7031},{"iata":"HUL","name":"Houlton","country":"US","region":"US-ME","lat":46.1231,"lng":-67.7921},{"iata":"HUN","name":"Hualien City","country":"TW","region":"TW-HUA","lat":24.0232,"lng":121.618},{"iata":"HUO","name":"Holingol","country":"CN","region":"CN-15","lat":45.4872,"lng":119.4072},{"iata":"HUT","name":"Hutchinson","country":"US","region":"US-KS","lat":38.0655,"lng":-97.8606},{"iata":"HUU","name":"Hu\u00e1nuco","country":"PE","region":"PE-HUC","lat":-9.8788,"lng":-76.2048},{"iata":"HUX","name":"Huatulco","country":"MX","region":"MX-OAX","lat":15.7754,"lng":-96.2605},{"iata":"HUY","name":"Grimsby, Lincolnshire","country":"GB","region":"GB-ENG","lat":53.5762,"lng":-0.3495},{"iata":"HUZ","name":"Huizhou (Pingtan)","country":"CN","region":"CN-44","lat":23.05,"lng":114.6},{"iata":"HVA","name":"Analalava","country":"MG","region":"MG-M","lat":-14.6295,"lng":47.7636},{"iata":"HVB","name":"Hervey Bay","country":"AU","region":"AU-QLD","lat":-25.3201,"lng":152.8807},{"iata":"HVD","name":"Khovd","country":"MN","region":"MN-043","lat":47.9541,"lng":91.6282},{"iata":"HVG","name":"Honningsv\u00e5g","country":"NO","region":"NO-56","lat":71.0097,"lng":25.9836},{"iata":"HVN","name":"New Haven","country":"US","region":"US-CT","lat":41.2629,"lng":-72.8877},{"iata":"HVR","name":"Havre","country":"US","region":"US-MT","lat":48.5414,"lng":-109.7629},{"iata":"HWN","name":"Gwayi River Farms","country":"ZW","region":"ZW-MN","lat":-18.6299,"lng":27.021},{"iata":"HWO","name":"Hollywood","country":"US","region":"US-FL","lat":26.0012,"lng":-80.2407},{"iata":"HWR","name":"Halwara","country":"IN","region":"IN-PB","lat":30.7485,"lng":75.6298},{"iata":"HXD","name":"Delingha","country":"CN","region":"CN-63","lat":37.1253,"lng":97.2687},{"iata":"HXX","name":"Hay Airport","country":"AU","region":"AU-NSW","lat":-34.5314,"lng":144.83},{"iata":"HYA","name":"Hyannis","country":"US","region":"US-MA","lat":41.6693,"lng":-70.2804},{"iata":"HYD","name":"Hyderabad","country":"IN","region":"IN-TG","lat":17.2313,"lng":78.4299},{"iata":"HYN","name":"Taizhou (Luqiao)","country":"CN","region":"CN-33","lat":28.5622,"lng":121.429},{"iata":"HYR","name":"Hayward","country":"US","region":"US-WI","lat":46.0252,"lng":-91.4443},{"iata":"HYS","name":"Hays","country":"US","region":"US-KS","lat":38.8445,"lng":-99.2731},{"iata":"HZA","name":"Heze (Dingtao)","country":"CN","region":"CN-37","lat":35.213,"lng":115.7367},{"iata":"HZB","name":"Merville, Nord","country":"FR","region":"FR-HDF","lat":50.6184,"lng":2.6422},{"iata":"HZG","name":"Hanzhong (Chenggu)","country":"CN","region":"CN-61","lat":33.1335,"lng":107.2038},{"iata":"HZH","name":"Liping","country":"CN","region":"CN-52","lat":26.3222,"lng":109.1499},{"iata":"HZK","name":"H\u00fasav\u00edk","country":"IS","region":"IS-6","lat":65.9523,"lng":-17.426},{"iata":"HZU","name":"Chengdu (Jintang)","country":"CN","region":"CN-51","lat":30.6773,"lng":104.5294},{"iata":"IAA","name":"Igarka","country":"RU","region":"RU-KYA","lat":67.4372,"lng":86.6219},{"iata":"IAB","name":"Wichita","country":"US","region":"US-KS","lat":37.6219,"lng":-97.2682},{"iata":"IAD","name":"Dulles","country":"US","region":"US-VA","lat":38.9445,"lng":-77.4558},{"iata":"IAG","name":"Niagara Falls","country":"US","region":"US-NY","lat":43.1073,"lng":-78.9462},{"iata":"IAH","name":"Houston","country":"US","region":"US-TX","lat":29.9844,"lng":-95.3414},{"iata":"IAM","name":"In Am\u00e9nas","country":"DZ","region":"DZ-33","lat":28.0515,"lng":9.6429},{"iata":"IAN","name":"Kiana","country":"US","region":"US-AK","lat":66.9761,"lng":-160.439},{"iata":"IAR","name":"Tunoshna","country":"RU","region":"RU-YAR","lat":57.5607,"lng":40.1574},{"iata":"IAS","name":"Ia\u015fi","country":"RO","region":"RO-IS","lat":47.1796,"lng":27.6214},{"iata":"IBA","name":"Ibadan","country":"NG","region":"NG-OY","lat":7.3625,"lng":3.9783},{"iata":"IBE","name":"Ibagu\u00e9","country":"CO","region":"CO-TOL","lat":4.4216,"lng":-75.1333},{"iata":"IBL","name":"Bazaruto Island","country":"MZ","region":"MZ-I","lat":-21.708,"lng":35.4528},{"iata":"IBP","name":"Iberia","country":"PE","region":"PE-MDD","lat":-11.4116,"lng":-69.4887},{"iata":"IBR","name":"Omitama","country":"JP","region":"JP-08","lat":36.1815,"lng":140.4144},{"iata":"IBZ","name":"Ibiza (Eivissa)","country":"ES","region":"ES-IB","lat":38.8729,"lng":1.3731},{"iata":"ICN","name":"Seoul","country":"KR","region":"KR-28","lat":37.4691,"lng":126.451},{"iata":"ICT","name":"Wichita","country":"US","region":"US-KS","lat":37.6503,"lng":-97.4286},{"iata":"IDA","name":"Idaho Falls","country":"US","region":"US-ID","lat":43.5146,"lng":-112.071},{"iata":"IDR","name":"Indore","country":"IN","region":"IN-MP","lat":22.7214,"lng":75.8005},{"iata":"IEG","name":"Nowe Kramsko","country":"PL","region":"PL-LB","lat":52.1385,"lng":15.7986},{"iata":"IEJ","name":"Ie","country":"JP","region":"JP-47","lat":26.7225,"lng":127.7868},{"iata":"IEV","name":"Kyiv","country":"UA","region":"UA-30","lat":50.4019,"lng":30.4519},{"iata":"IFJ","name":"\u00cdsafj\u00f6r\u00f0ur","country":"IS","region":"IS-4","lat":66.0581,"lng":-23.1353},{"iata":"IFN","name":"Isfahan","country":"IR","region":"IR-10","lat":32.7551,"lng":51.8839},{"iata":"IFO","name":"Ivano-Frankivsk","country":"UA","region":"UA-26","lat":48.8842,"lng":24.6861},{"iata":"IFP","name":"Bullhead City","country":"US","region":"US-AZ","lat":35.1547,"lng":-114.5593},{"iata":"IGA","name":"Matthew Town","country":"BS","region":"BS-IN","lat":20.975,"lng":-73.6669},{"iata":"IGD","name":"I\u011fd\u0131r","country":"TR","region":"TR-76","lat":39.9766,"lng":43.8766},{"iata":"IGL","name":"\u00c7i\u011fli","country":"TR","region":"TR-35","lat":38.513,"lng":27.0101},{"iata":"IGM","name":"Kingman","country":"US","region":"US-AZ","lat":35.2595,"lng":-113.938},{"iata":"IGR","name":"Puerto Iguazu","country":"AR","region":"AR-N","lat":-25.7373,"lng":-54.4734},{"iata":"IGS","name":"Manching","country":"DE","region":"DE-BY","lat":48.7157,"lng":11.534},{"iata":"IGT","name":"Sunzha","country":"RU","region":"RU-IN","lat":43.3233,"lng":45.0126},{"iata":"IGU","name":"Foz do Igua\u00e7u","country":"BR","region":"BR-PR","lat":-25.5942,"lng":-54.4894},{"iata":"IHR","name":"Iranshahr","country":"IR","region":"IR-11","lat":27.2361,"lng":60.72},{"iata":"IIL","name":"Ilam","country":"IR","region":"IR-16","lat":33.5866,"lng":46.4048},{"iata":"IJK","name":"Izhevsk","country":"RU","region":"RU-UD","lat":56.8345,"lng":53.4622},{"iata":"IKA","name":"Tehran","country":"IR","region":"IR-23","lat":35.4161,"lng":51.1522},{"iata":"IKG","name":"Karakol","country":"KG","region":"KG-Y","lat":42.5081,"lng":78.4078},{"iata":"IKI","name":"Iki","country":"JP","region":"JP-42","lat":33.749,"lng":129.785},{"iata":"IKK","name":"Kankakee","country":"US","region":"US-IL","lat":41.0714,"lng":-87.8463},{"iata":"IKS","name":"Tiksi","country":"RU","region":"RU-SA","lat":71.6977,"lng":128.903},{"iata":"IKT","name":"Irkutsk","country":"RU","region":"RU-IRK","lat":52.2667,"lng":104.3956},{"iata":"IKU","name":"Tamchy","country":"KG","region":"KG-Y","lat":42.5856,"lng":76.7012},{"iata":"ILD","name":"Lleida","country":"ES","region":"ES-CT","lat":41.7282,"lng":0.535},{"iata":"ILG","name":"Wilmington","country":"US","region":"US-DE","lat":39.6787,"lng":-75.6065},{"iata":"ILI","name":"Iliamna","country":"US","region":"US-AK","lat":59.7544,"lng":-154.911},{"iata":"ILM","name":"Wilmington","country":"US","region":"US-NC","lat":34.2723,"lng":-77.9051},{"iata":"ILN","name":"Wilmington","country":"US","region":"US-OH","lat":39.4279,"lng":-83.7921},{"iata":"ILO","name":"Cabatuan","country":"PH","region":"PH-ILI","lat":10.833,"lng":122.4934},{"iata":"ILP","name":"\u00cele des Pins","country":"NC","region":"NC-03","lat":-22.5889,"lng":167.456},{"iata":"ILQ","name":"Ilo","country":"PE","region":"PE-MOQ","lat":-17.695,"lng":-71.344},{"iata":"ILR","name":"Ilorin/Ogbomosho","country":"NG","region":"NG-KW","lat":8.4402,"lng":4.4939},{"iata":"ILS","name":"San Salvador","country":"SV","region":"SV-SS","lat":13.6995,"lng":-89.1199},{"iata":"ILY","name":"Isle of Islay, Argyll and Bute","country":"GB","region":"GB-SCT","lat":55.6827,"lng":-6.2575},{"iata":"ILZ","name":"Doln\u00fd Hri\u010dov","country":"SK","region":"SK-ZI","lat":49.2333,"lng":18.6134},{"iata":"IMF","name":"Imphal","country":"IN","region":"IN-MN","lat":24.76,"lng":93.8967},{"iata":"IMP","name":"Imperatriz","country":"BR","region":"BR-MA","lat":-5.5313,"lng":-47.46},{"iata":"IMQ","name":"Showt","country":"IR","region":"IR-04","lat":39.1913,"lng":44.9285},{"iata":"IMT","name":"Kingsford","country":"US","region":"US-MI","lat":45.8191,"lng":-88.1146},{"iata":"INA","name":"Inta","country":"RU","region":"RU-KO","lat":66.0534,"lng":60.1058},{"iata":"INC","name":"Yinchuan","country":"CN","region":"CN-64","lat":38.3228,"lng":106.3932},{"iata":"IND","name":"Indianapolis","country":"US","region":"US-IN","lat":39.7173,"lng":-86.2944},{"iata":"INH","name":"Inhambane","country":"MZ","region":"MZ-I","lat":-23.8764,"lng":35.4085},{"iata":"INI","name":"Ni\u0161","country":"RS","region":"RS-20","lat":43.3365,"lng":21.8562},{"iata":"INK","name":"Wink","country":"US","region":"US-TX","lat":31.7796,"lng":-103.201},{"iata":"INL","name":"International Falls","country":"US","region":"US-MN","lat":48.5662,"lng":-93.4031},{"iata":"INN","name":"Innsbruck","country":"AT","region":"AT-7","lat":47.2602,"lng":11.344},{"iata":"INT","name":"Winston Salem","country":"US","region":"US-NC","lat":36.1337,"lng":-80.222},{"iata":"INU","name":"Yaren","country":"NR","region":"NR-14","lat":-0.5479,"lng":166.9195},{"iata":"INV","name":"Inverness","country":"GB","region":"GB-SCT","lat":57.5425,"lng":-4.0475},{"iata":"INW","name":"Winslow","country":"US","region":"US-AZ","lat":35.0219,"lng":-110.723},{"iata":"INZ","name":"In Salah","country":"DZ","region":"DZ-57","lat":27.251,"lng":2.512},{"iata":"IOA","name":"Ioannina","country":"GR","region":"GR-D","lat":39.6964,"lng":20.8225},{"iata":"IOM","name":"Castletown","country":"IM","region":"IM-U-A","lat":54.0831,"lng":-4.6239},{"iata":"IOS","name":"Ilh\u00e9us","country":"BR","region":"BR-BA","lat":-14.8159,"lng":-39.0335},{"iata":"IPC","name":"Isla De Pascua","country":"CL","region":"CL-VS","lat":-27.1654,"lng":-109.421},{"iata":"IPH","name":"Ipoh","country":"MY","region":"MY-08","lat":4.5673,"lng":101.0916},{"iata":"IPI","name":"Ipiales","country":"CO","region":"CO-NAR","lat":0.8619,"lng":-77.6718},{"iata":"IPL","name":"Imperial","country":"US","region":"US-CA","lat":32.8354,"lng":-115.574},{"iata":"IPN","name":"Ipatinga","country":"BR","region":"BR-MG","lat":-19.4707,"lng":-42.4876},{"iata":"IPT","name":"Williamsport","country":"US","region":"US-PA","lat":41.2421,"lng":-76.9224},{"iata":"IQA","name":"H\u012bt","country":"IQ","region":"IQ-AN","lat":33.7856,"lng":42.4412},{"iata":"IQM","name":"Qiemo","country":"CN","region":"CN-65","lat":38.2345,"lng":85.4655},{"iata":"IQN","name":"Qingyang (Xifeng)","country":"CN","region":"CN-62","lat":35.8026,"lng":107.5989},{"iata":"IQQ","name":"Iquique","country":"CL","region":"CL-TA","lat":-20.5363,"lng":-70.1814},{"iata":"IQT","name":"Iquitos","country":"PE","region":"PE-LOR","lat":-3.7847,"lng":-73.3088},{"iata":"IRD","name":"Ishurdi","country":"BD","region":"BD-5","lat":24.1525,"lng":89.0494},{"iata":"IRG","name":"Lockhart River","country":"AU","region":"AU-QLD","lat":-12.7869,"lng":143.305},{"iata":"IRI","name":"Nduli","country":"TZ","region":"TZ-04","lat":-7.6686,"lng":35.7521},{"iata":"IRJ","name":"La Rioja","country":"AR","region":"AR-F","lat":-29.3816,"lng":-66.7958},{"iata":"IRK","name":"Kirksville","country":"US","region":"US-MO","lat":40.0935,"lng":-92.5449},{"iata":"IRP","name":"Isiro","country":"CD","region":"CD-HU","lat":2.8276,"lng":27.5883},{"iata":"ISA","name":"Mount Isa","country":"AU","region":"AU-QLD","lat":-20.6664,"lng":139.4885},{"iata":"ISB","name":"Attock","country":"PK","region":"PK-PB","lat":33.549,"lng":72.8257},{"iata":"ISE","name":"Isparta","country":"TR","region":"TR-32","lat":37.8554,"lng":30.3684},{"iata":"ISG","name":"Ishigaki","country":"JP","region":"JP-47","lat":24.3964,"lng":124.245},{"iata":"ISK","name":"Nashik","country":"IN","region":"IN-MM","lat":20.1191,"lng":73.9129},{"iata":"ISL","name":"Istanbul(Bak\u0131rk\u00f6y)","country":"TR","region":"TR-34","lat":40.9719,"lng":28.8237},{"iata":"ISM","name":"Orlando","country":"US","region":"US-FL","lat":28.2898,"lng":-81.4371},{"iata":"ISO","name":"Kinston","country":"US","region":"US-NC","lat":35.3314,"lng":-77.6088},{"iata":"ISP","name":"Islip","country":"US","region":"US-NY","lat":40.7963,"lng":-73.1017},{"iata":"IST","name":"Istanbul","country":"TR","region":"TR-34","lat":41.2749,"lng":28.7321},{"iata":"ISU","name":"Sulaymaniyah","country":"IQ","region":"IQ-SW","lat":35.5617,"lng":45.3167},{"iata":"ITA","name":"Itacoatiara","country":"BR","region":"BR-AM","lat":-3.1265,"lng":-58.4817},{"iata":"ITB","name":"Itaituba","country":"BR","region":"BR-PA","lat":-4.2421,"lng":-56.0007},{"iata":"ITH","name":"Ithaca","country":"US","region":"US-NY","lat":42.491,"lng":-76.4584},{"iata":"ITM","name":"Osaka","country":"JP","region":"JP-27","lat":34.7809,"lng":135.4408},{"iata":"ITO","name":"Hilo","country":"US","region":"US-HI","lat":19.7214,"lng":-155.0454},{"iata":"IUE","name":"Alofi","country":"NU","region":"NU-U-A","lat":-19.0801,"lng":-169.9235},{"iata":"IVC","name":"Invercargill","country":"NZ","region":"NZ-STL","lat":-46.4124,"lng":168.313},{"iata":"IVD","name":"Nusantara","country":"ID","region":"ID-KI","lat":-1.1586,"lng":116.7081},{"iata":"IVL","name":"Ivalo","country":"FI","region":"FI-10","lat":68.6073,"lng":27.4053},{"iata":"IVR","name":"Inverell","country":"AU","region":"AU-NSW","lat":-29.8883,"lng":151.144},{"iata":"IWA","name":"Ivanovo","country":"RU","region":"RU-IVA","lat":56.9394,"lng":40.9408},{"iata":"IWJ","name":"Masuda","country":"JP","region":"JP-32","lat":34.6764,"lng":131.79},{"iata":"IWK","name":"Iwakuni","country":"JP","region":"JP-35","lat":34.1463,"lng":132.2472},{"iata":"IWO","name":"Ogasawara","country":"JP","region":"JP-13","lat":24.7842,"lng":141.3226},{"iata":"IXA","name":"Agartala","country":"IN","region":"IN-TR","lat":23.887,"lng":91.2404},{"iata":"IXB","name":"Siliguri","country":"IN","region":"IN-WB","lat":26.6812,"lng":88.3286},{"iata":"IXC","name":"Chandigarh","country":"IN","region":"IN-CH","lat":30.6735,"lng":76.7885},{"iata":"IXD","name":"Allahabad","country":"IN","region":"IN-UP","lat":25.4401,"lng":81.7339},{"iata":"IXE","name":"Mangaluru","country":"IN","region":"IN-KA","lat":12.9547,"lng":74.8868},{"iata":"IXG","name":"Belgaum","country":"IN","region":"IN-KA","lat":15.8593,"lng":74.6183},{"iata":"IXH","name":"Kailashahar","country":"IN","region":"IN-TR","lat":24.3087,"lng":92.0077},{"iata":"IXI","name":"Lilabari","country":"IN","region":"IN-AS","lat":27.2957,"lng":94.0973},{"iata":"IXJ","name":"Jammu","country":"IN","region":"IN-JK","lat":32.6888,"lng":74.8382},{"iata":"IXK","name":"Keshod","country":"IN","region":"IN-GJ","lat":21.3171,"lng":70.2704},{"iata":"IXL","name":"Leh","country":"IN","region":"IN-LA","lat":34.1359,"lng":77.5465},{"iata":"IXM","name":"Madurai","country":"IN","region":"IN-TN","lat":9.8345,"lng":78.0934},{"iata":"IXP","name":"Pathankot","country":"IN","region":"IN-PB","lat":32.2336,"lng":75.6344},{"iata":"IXR","name":"Ranchi","country":"IN","region":"IN-JH","lat":23.3143,"lng":85.3217},{"iata":"IXS","name":"Silchar","country":"IN","region":"IN-AS","lat":24.9129,"lng":92.9787},{"iata":"IXU","name":"Aurangabad","country":"IN","region":"IN-MM","lat":19.8629,"lng":75.3963},{"iata":"IXV","name":"Along Airport","country":"IN","region":"IN-AR","lat":28.1753,"lng":94.802},{"iata":"IXW","name":"Jamshedpur","country":"IN","region":"IN-JH","lat":22.8137,"lng":86.169},{"iata":"IXX","name":"Bidar","country":"IN","region":"IN-KA","lat":17.9081,"lng":77.4871},{"iata":"IXY","name":"Kandla","country":"IN","region":"IN-GJ","lat":23.1127,"lng":70.1003},{"iata":"IXZ","name":"Port Blair","country":"IN","region":"IN-AN","lat":11.6402,"lng":92.729},{"iata":"IZA","name":"Juiz de Fora","country":"BR","region":"BR-MG","lat":-21.5131,"lng":-43.1731},{"iata":"IZO","name":"Izumo","country":"JP","region":"JP-32","lat":35.4136,"lng":132.89},{"iata":"IZT","name":"Ixtepec","country":"MX","region":"MX-OAX","lat":16.446,"lng":-95.0937},{"iata":"JAA","name":"Jalalabad","country":"AF","region":"AF-NAN","lat":34.3998,"lng":70.4986},{"iata":"JAC","name":"Jackson","country":"US","region":"US-WY","lat":43.6073,"lng":-110.738},{"iata":"JAD","name":"Perth","country":"AU","region":"AU-WA","lat":-32.0975,"lng":115.881},{"iata":"JAE","name":"Ja\u00e9n","country":"PE","region":"PE-CAJ","lat":-5.5925,"lng":-78.774},{"iata":"JAF","name":"Jaffna","country":"LK","region":"LK-4","lat":9.7923,"lng":80.0701},{"iata":"JAG","name":"Jacobabad","country":"PK","region":"PK-SD","lat":28.2842,"lng":68.4497},{"iata":"JAI","name":"Jaipur","country":"IN","region":"IN-RJ","lat":26.8242,"lng":75.8122},{"iata":"JAK","name":"Jacmel","country":"HT","region":"HT-SE","lat":18.2411,"lng":-72.5185},{"iata":"JAL","name":"Emiliano Zapata","country":"MX","region":"MX-VER","lat":19.4751,"lng":-96.797},{"iata":"JAM","name":"Bezmer","country":"BG","region":"BG-28","lat":42.4549,"lng":26.3522},{"iata":"JAN","name":"Jackson","country":"US","region":"US-MS","lat":32.3112,"lng":-90.0759},{"iata":"JAU","name":"Jauja","country":"PE","region":"PE-JUN","lat":-11.7831,"lng":-75.4734},{"iata":"JAV","name":"Ilulissat","country":"GL","region":"GL-AV","lat":69.2432,"lng":-51.0571},{"iata":"JAX","name":"Jacksonville","country":"US","region":"US-FL","lat":30.4925,"lng":-81.6878},{"iata":"JBQ","name":"La Isabela","country":"DO","region":"DO-01","lat":18.5725,"lng":-69.9856},{"iata":"JBR","name":"Jonesboro","country":"US","region":"US-AR","lat":35.8317,"lng":-90.6464},{"iata":"JCL","name":"\u010cesk\u00e9 Bud\u011bjovice","country":"CZ","region":"CZ-JC","lat":48.9482,"lng":14.4283},{"iata":"JCR","name":"Jacareacanga","country":"BR","region":"BR-PA","lat":-6.2332,"lng":-57.7769},{"iata":"JCT","name":"Junction","country":"US","region":"US-TX","lat":30.5113,"lng":-99.7635},{"iata":"JDE","name":"Hangzhou","country":"CN","region":"CN-33","lat":29.3609,"lng":119.1808},{"iata":"JDF","name":"Juiz de Fora","country":"BR","region":"BR-MG","lat":-21.7915,"lng":-43.3861},{"iata":"JDG","name":"Jeju Island","country":"KR","region":"KR-49","lat":33.3996,"lng":126.712},{"iata":"JDH","name":"Jodhpur","country":"IN","region":"IN-RJ","lat":26.2511,"lng":73.0489},{"iata":"JDZ","name":"Jingdezhen","country":"CN","region":"CN-36","lat":29.3386,"lng":117.176},{"iata":"JED","name":"Jeddah","country":"SA","region":"SA-02","lat":21.6802,"lng":39.1574},{"iata":"JEE","name":"Carrefour Sanon","country":"HT","region":"HT-GA","lat":18.6631,"lng":-74.1703},{"iata":"JEG","name":"Aasiaat","country":"GL","region":"GL-QK","lat":68.7218,"lng":-52.7847},{"iata":"JER","name":"St. Peter","country":"JE","region":"JE-U-A","lat":49.2079,"lng":-2.1955},{"iata":"JFK","name":"New York","country":"US","region":"US-NY","lat":40.6394,"lng":-73.7793},{"iata":"JFN","name":"Ashtabula","country":"US","region":"US-OH","lat":41.778,"lng":-80.6955},{"iata":"JGA","name":"Jamnagar","country":"IN","region":"IN-GJ","lat":22.4655,"lng":70.0126},{"iata":"JGD","name":"Jiagedaqi","country":"CN","region":"CN-23","lat":50.3714,"lng":124.1175},{"iata":"JGN","name":"Jiayuguan","country":"CN","region":"CN-62","lat":39.8591,"lng":98.3393},{"iata":"JGS","name":"Ji'an","country":"CN","region":"CN-36","lat":26.8569,"lng":114.737},{"iata":"JHB","name":"Johor Bahru","country":"MY","region":"MY-01","lat":1.6413,"lng":103.67},{"iata":"JHF","name":"S\u00e3o Roque","country":"BR","region":"BR-SP","lat":-23.4269,"lng":-47.1657},{"iata":"JHG","name":"Jinghong (Gasa)","country":"CN","region":"CN-53","lat":21.9746,"lng":100.7622},{"iata":"JHM","name":"Lahaina","country":"US","region":"US-HI","lat":20.9629,"lng":-156.673},{"iata":"JHS","name":"Sisimiut","country":"GL","region":"GL-QA","lat":66.9513,"lng":-53.7293},{"iata":"JHW","name":"Jamestown","country":"US","region":"US-NY","lat":42.1542,"lng":-79.254},{"iata":"JIB","name":"Djibouti City","country":"DJ","region":"DJ-DJ","lat":11.5473,"lng":43.1595},{"iata":"JIC","name":"Jinchang","country":"CN","region":"CN-62","lat":38.5422,"lng":102.3483},{"iata":"JIJ","name":"Jijiga","country":"ET","region":"ET-SO","lat":9.3319,"lng":42.9118},{"iata":"JIM","name":"Jimma","country":"ET","region":"ET-OR","lat":7.6661,"lng":36.8166},{"iata":"JIQ","name":"Qianjiang","country":"CN","region":"CN-50","lat":29.5133,"lng":108.8311},{"iata":"JJD","name":"Cruz","country":"BR","region":"BR-CE","lat":-2.9064,"lng":-40.3573},{"iata":"JJI","name":"Juanju\u00ed","country":"PE","region":"PE-SAM","lat":-7.1691,"lng":-76.7286},{"iata":"JJN","name":"Quanzhou","country":"CN","region":"CN-35","lat":24.7959,"lng":118.5886},{"iata":"JKG","name":"J\u00f6nk\u00f6ping","country":"SE","region":"SE-F","lat":57.7576,"lng":14.0687},{"iata":"JKH","name":"Chios Island","country":"GR","region":"GR-K","lat":38.3432,"lng":26.1406},{"iata":"JKR","name":"Janakpur","country":"NP","region":"NP-P2","lat":26.7088,"lng":85.9224},{"iata":"JLN","name":"Joplin","country":"US","region":"US-MO","lat":37.1518,"lng":-94.4983},{"iata":"JLR","name":"Jabalpur","country":"IN","region":"IN-MP","lat":23.1778,"lng":80.052},{"iata":"JMJ","name":"Pu'er (Lancang)","country":"CN","region":"CN-53","lat":22.4177,"lng":99.784},{"iata":"JMK","name":"Mykonos","country":"GR","region":"GR-L","lat":37.4351,"lng":25.3481},{"iata":"JMS","name":"Jamestown","country":"US","region":"US-ND","lat":46.9297,"lng":-98.6782},{"iata":"JMU","name":"Jiamusi","country":"CN","region":"CN-23","lat":46.8428,"lng":130.4643},{"iata":"JNB","name":"Johannesburg","country":"ZA","region":"ZA-GT","lat":-26.1401,"lng":28.2468},{"iata":"JNG","name":"Jining","country":"CN","region":"CN-37","lat":35.6474,"lng":116.7433},{"iata":"JNH","name":"Xiuzhou, Hangzhou","country":"CN","region":"CN-33","lat":30.6981,"lng":120.6631},{"iata":"JNU","name":"Juneau","country":"US","region":"US-AK","lat":58.3549,"lng":-134.5744},{"iata":"JNZ","name":"Jinzhou (Linghai)","country":"CN","region":"CN-21","lat":40.936,"lng":121.2771},{"iata":"JOE","name":"Joensuu","country":"FI","region":"FI-13","lat":62.6588,"lng":29.6194},{"iata":"JOG","name":"Yogyakarta","country":"ID","region":"ID-YO","lat":-7.7882,"lng":110.432},{"iata":"JOH","name":"Port St Johns","country":"ZA","region":"ZA-EC","lat":-31.6061,"lng":29.5218},{"iata":"JOI","name":"Joinville","country":"BR","region":"BR-SC","lat":-26.2245,"lng":-48.7974},{"iata":"JOK","name":"Yoshkar-Ola","country":"RU","region":"RU-ME","lat":56.7006,"lng":47.9047},{"iata":"JOL","name":"Jolo","country":"PH","region":"PH-SLU","lat":6.0537,"lng":121.011},{"iata":"JOS","name":"Jos","country":"NG","region":"NG-PL","lat":9.6398,"lng":8.8691},{"iata":"JPA","name":"Jo\u00e3o Pessoa","country":"BR","region":"BR-PB","lat":-7.1487,"lng":-34.9506},{"iata":"JRF","name":"Kapolei","country":"US","region":"US-HI","lat":21.3074,"lng":-158.07},{"iata":"JRH","name":"Jorhat","country":"IN","region":"IN-AS","lat":26.7305,"lng":94.1754},{"iata":"JRO","name":"Arusha","country":"TZ","region":"TZ-01","lat":-3.427,"lng":37.0735},{"iata":"JSA","name":"Jaisalmer Airport","country":"IN","region":"IN-RJ","lat":26.8887,"lng":70.865},{"iata":"JSH","name":"Crete Island","country":"GR","region":"GR-M","lat":35.2161,"lng":26.1013},{"iata":"JSI","name":"Skiathos","country":"GR","region":"GR-E","lat":39.1771,"lng":23.5037},{"iata":"JSJ","name":"Jiansanjiang","country":"CN","region":"CN-23","lat":47.1082,"lng":132.6579},{"iata":"JSO","name":"Sobral","country":"BR","region":"BR-CE","lat":-3.6145,"lng":-40.2314},{"iata":"JSR","name":"Jashore (Jessore)","country":"BD","region":"BD-4","lat":23.1838,"lng":89.1608},{"iata":"JST","name":"Johnstown","country":"US","region":"US-PA","lat":40.3161,"lng":-78.8339},{"iata":"JTC","name":"Bauru","country":"BR","region":"BR-SP","lat":-22.1608,"lng":-49.0703},{"iata":"JTR","name":"Santorini Island","country":"GR","region":"GR-L","lat":36.4,"lng":25.4786},{"iata":"JUB","name":"Juba","country":"SS","region":"SS-EC","lat":4.872,"lng":31.6011},{"iata":"JUJ","name":"San Salvador de Jujuy","country":"AR","region":"AR-Y","lat":-24.3928,"lng":-65.0978},{"iata":"JUL","name":"Juliaca","country":"PE","region":"PE-PUN","lat":-15.4677,"lng":-70.1565},{"iata":"JUZ","name":"Quzhou (Kezheng)","country":"CN","region":"CN-33","lat":28.9661,"lng":118.8988},{"iata":"JWA","name":"Jwaneng","country":"BW","region":"BW-JW","lat":-24.6023,"lng":24.691},{"iata":"JWN","name":"Zanjan","country":"IR","region":"IR-19","lat":36.7737,"lng":48.3594},{"iata":"JWO","name":"Gimseang-ro","country":"KR","region":"KR-43","lat":37.0302,"lng":127.8864},{"iata":"JXA","name":"Jixi","country":"CN","region":"CN-23","lat":45.293,"lng":131.193},{"iata":"JXN","name":"Jackson","country":"US","region":"US-MI","lat":42.2605,"lng":-84.463},{"iata":"JYR","name":"Jiroft","country":"IR","region":"IR-08","lat":28.7235,"lng":57.675},{"iata":"JYV","name":"Jyv\u00e4skyl\u00e4n Maalaiskunta","country":"FI","region":"FI-08","lat":62.3995,"lng":25.6783},{"iata":"JZH","name":"Ngawa (Songpan)","country":"CN","region":"CN-51","lat":32.8533,"lng":103.6822},{"iata":"KAB","name":"Kariba","country":"ZW","region":"ZW-MW","lat":-16.5198,"lng":28.885},{"iata":"KAC","name":"Qamishli","country":"SY","region":"SY-HA","lat":37.0206,"lng":41.1914},{"iata":"KAD","name":"Kaduna","country":"NG","region":"NG-KD","lat":10.696,"lng":7.3201},{"iata":"KAG","name":"Gangneung","country":"KR","region":"KR-42","lat":37.7536,"lng":128.9439},{"iata":"KAI","name":"Kaieteur Falls","country":"GY","region":"GY-PT","lat":5.1773,"lng":-59.489},{"iata":"KAJ","name":"Kajaani","country":"FI","region":"FI-05","lat":64.2855,"lng":27.6924},{"iata":"KAN","name":"Kano","country":"NG","region":"NG-KN","lat":12.0456,"lng":8.5236},{"iata":"KAO","name":"Kuusamo","country":"FI","region":"FI-14","lat":65.9876,"lng":29.2394},{"iata":"KAT","name":"Awanui","country":"NZ","region":"NZ-NTL","lat":-35.0698,"lng":173.2871},{"iata":"KAU","name":"Kauhava","country":"FI","region":"FI-03","lat":63.1271,"lng":23.0514},{"iata":"KAW","name":"Kawthoung","country":"MM","region":"MM-05","lat":10.0493,"lng":98.538},{"iata":"KBK","name":"Kushinagar","country":"IN","region":"IN-UP","lat":26.7765,"lng":83.8892},{"iata":"KBL","name":"Kabul","country":"AF","region":"AF-KAB","lat":34.5659,"lng":69.2123},{"iata":"KBP","name":"Boryspil","country":"UA","region":"UA-32","lat":50.345,"lng":30.8947},{"iata":"KBR","name":"Kota Baharu","country":"MY","region":"MY-03","lat":6.1669,"lng":102.293},{"iata":"KBS","name":"Bo","country":"SL","region":"SL-S","lat":7.9444,"lng":-11.761},{"iata":"KBV","name":"Krabi","country":"TH","region":"TH-81","lat":8.0956,"lng":98.989},{"iata":"KCH","name":"Kuching","country":"MY","region":"MY-13","lat":1.4874,"lng":110.3529},{"iata":"KCM","name":"Kahramanmara\u015f","country":"TR","region":"TR-46","lat":37.5388,"lng":36.9535},{"iata":"KCO","name":"Kartepe","country":"TR","region":"TR-41","lat":40.735,"lng":30.0833},{"iata":"KCT","name":"Galle","country":"LK","region":"LK-3","lat":5.9937,"lng":80.3203},{"iata":"KCY","name":"Krasnoyarsk","country":"RU","region":"RU-KYA","lat":56.1776,"lng":92.5459},{"iata":"KCZ","name":"Nankoku","country":"JP","region":"JP-39","lat":33.5452,"lng":133.6702},{"iata":"KDH","name":"Kandahar","country":"AF","region":"AF-KAN","lat":31.5058,"lng":65.848},{"iata":"KDL","name":"K\u00e4rdla","country":"EE","region":"EE-39","lat":58.9908,"lng":22.8307},{"iata":"KDM","name":"Huvadhu Atoll","country":"MV","region":"MV-28","lat":0.4881,"lng":72.9969},{"iata":"KDO","name":"Kadhdhoo","country":"MV","region":"MV-05","lat":1.8592,"lng":73.5219},{"iata":"KDT","name":"Nakhon Pathom","country":"TH","region":"TH-72","lat":14.102,"lng":99.9172},{"iata":"KDU","name":"Skardu","country":"PK","region":"PK-GB","lat":35.3387,"lng":75.5386},{"iata":"KEF","name":"Reykjav\u00edk","country":"IS","region":"IS-2","lat":63.985,"lng":-22.6056},{"iata":"KEJ","name":"Kemerovo","country":"RU","region":"RU-KEM","lat":55.2701,"lng":86.1072},{"iata":"KEL","name":"Kiel","country":"DE","region":"DE-SH","lat":54.3796,"lng":10.1453},{"iata":"KEM","name":"Kemi / Tornio","country":"FI","region":"FI-10","lat":65.7787,"lng":24.5821},{"iata":"KEN","name":"Kenema","country":"SL","region":"SL-E","lat":7.8964,"lng":-11.1741},{"iata":"KEP","name":"Nepalgunj","country":"NP","region":"NP-P5","lat":28.1036,"lng":81.667},{"iata":"KER","name":"Kerman","country":"IR","region":"IR-08","lat":30.2713,"lng":56.9497},{"iata":"KES","name":"Kelsey","country":"CA","region":"CA-MB","lat":56.0375,"lng":-96.5097},{"iata":"KET","name":"Kengtung","country":"MM","region":"MM-17","lat":21.3016,"lng":99.636},{"iata":"KEV","name":"J\u00e4ms\u00e4","country":"FI","region":"FI-08","lat":61.856,"lng":24.7867},{"iata":"KFS","name":"Kastamonu","country":"TR","region":"TR-37","lat":41.3142,"lng":33.7958},{"iata":"KFZ","name":"Kuk\u00ebs","country":"AL","region":"AL-07","lat":42.0358,"lng":20.416},{"iata":"KGA","name":"Kananga","country":"CD","region":"CD-KC","lat":-5.9001,"lng":22.4692},{"iata":"KGC","name":"Kingscote Airport","country":"AU","region":"AU-SA","lat":-35.7139,"lng":137.521},{"iata":"KGD","name":"Kaliningrad","country":"RU","region":"RU-KGD","lat":54.8916,"lng":20.5986},{"iata":"KGF","name":"Karaganda","country":"KZ","region":"KZ-KAR","lat":49.6708,"lng":73.3344},{"iata":"KGG","name":"K\u00e9dougou","country":"SN","region":"SN-TC","lat":12.5723,"lng":-12.2203},{"iata":"KGI","name":"Broadwood","country":"AU","region":"AU-WA","lat":-30.7915,"lng":121.4646},{"iata":"KGJ","name":"Karonga","country":"MW","region":"MW-KR","lat":-9.9536,"lng":33.8933},{"iata":"KGL","name":"Kigali","country":"RW","region":"RW-01","lat":-1.9686,"lng":30.1395},{"iata":"KGP","name":"Kogalym","country":"RU","region":"RU-KHM","lat":62.1904,"lng":74.5338},{"iata":"KGS","name":"Kos Island","country":"GR","region":"GR-L","lat":36.7945,"lng":27.0911},{"iata":"KGT","name":"Garz\u00ea (Kangding)","country":"CN","region":"CN-51","lat":30.1425,"lng":101.7387},{"iata":"KGY","name":"Kingaroy Airport","country":"AU","region":"AU-QLD","lat":-26.5811,"lng":151.8399},{"iata":"KHD","name":"Khoram Abad Airport","country":"IR","region":"IR-15","lat":33.4354,"lng":48.2829},{"iata":"KHE","name":"Kherson","country":"UA","region":"UA-65","lat":46.6758,"lng":32.5064},{"iata":"KHG","name":"Kashgar","country":"CN","region":"CN-65","lat":39.5423,"lng":76.0202},{"iata":"KHH","name":"Kaohsiung (Xiaogang)","country":"TW","region":"TW-KHH","lat":22.5771,"lng":120.35},{"iata":"KHI","name":"Karachi","country":"PK","region":"PK-SD","lat":24.9065,"lng":67.1608},{"iata":"KHJ","name":"Kauhajoki","country":"FI","region":"FI-03","lat":62.4632,"lng":22.3908},{"iata":"KHK","name":"Khark","country":"IR","region":"IR-18","lat":29.2605,"lng":50.3222},{"iata":"KHN","name":"Nanchang","country":"CN","region":"CN-36","lat":28.8648,"lng":115.9027},{"iata":"KHS","name":"Khasab","country":"OM","region":"OM-MU","lat":26.171,"lng":56.2406},{"iata":"KHT","name":"Khost","country":"AF","region":"AF-KHO","lat":33.2846,"lng":69.8073},{"iata":"KHV","name":"Khabarovsk","country":"RU","region":"RU-KHA","lat":48.5283,"lng":135.1886},{"iata":"KHX","name":"Kihihi","country":"UG","region":"UG-W","lat":-0.7165,"lng":29.6997},{"iata":"KID","name":"Kristianstad","country":"SE","region":"SE-M","lat":55.9217,"lng":14.0855},{"iata":"KIH","name":"Kish Island","country":"IR","region":"IR-22","lat":26.5254,"lng":53.9805},{"iata":"KIJ","name":"Niigata","country":"JP","region":"JP-15","lat":37.9542,"lng":139.1122},{"iata":"KIK","name":"Kirkuk","country":"IQ","region":"IQ-TS","lat":35.4695,"lng":44.3489},{"iata":"KIM","name":"Kimberley","country":"ZA","region":"ZA-NC","lat":-28.8054,"lng":24.7649},{"iata":"KIN","name":"Kingston","country":"JM","region":"JM-01","lat":17.9357,"lng":-76.7875},{"iata":"KIR","name":"Farranfore","country":"IE","region":"IE-KY","lat":52.1809,"lng":-9.5238},{"iata":"KIS","name":"Kisumu","country":"KE","region":"KE-600","lat":-0.0861,"lng":34.7289},{"iata":"KIW","name":"Kitwe","country":"ZM","region":"ZM-08","lat":-12.9005,"lng":28.1499},{"iata":"KIX","name":"Osaka","country":"JP","region":"JP-27","lat":34.4273,"lng":135.244},{"iata":"KJA","name":"Krasnoyarsk","country":"RU","region":"RU-KYA","lat":56.1757,"lng":92.4858},{"iata":"KJB","name":"Orvakal","country":"IN","region":"IN-AP","lat":15.7163,"lng":78.1692},{"iata":"KJH","name":"Kaili (Huangping)","country":"CN","region":"CN-52","lat":26.972,"lng":107.988},{"iata":"KJI","name":"Burqin","country":"CN","region":"CN-65","lat":48.2223,"lng":86.9959},{"iata":"KJK","name":"Wevelgem","country":"BE","region":"BE-VWV","lat":50.8189,"lng":3.2096},{"iata":"KJT","name":"Kertajati","country":"ID","region":"ID-JB","lat":-6.6474,"lng":108.1656},{"iata":"KKC","name":"Khon Kaen","country":"TH","region":"TH-40","lat":16.4666,"lng":102.784},{"iata":"KKE","name":"Kerikeri","country":"NZ","region":"NZ-NTL","lat":-35.2591,"lng":173.9133},{"iata":"KKJ","name":"Kitakyushu","country":"JP","region":"JP-40","lat":33.8459,"lng":131.035},{"iata":"KKM","name":"Lop Buri","country":"TH","region":"TH-16","lat":14.8746,"lng":100.6634},{"iata":"KKN","name":"Kirkenes","country":"NO","region":"NO-56","lat":69.7258,"lng":29.8913},{"iata":"KKR","name":"Raitahiti","country":"PF","region":"PF-U-A","lat":-15.6633,"lng":-146.885},{"iata":"KKS","name":"Kashan","country":"IR","region":"IR-10","lat":33.8953,"lng":51.577},{"iata":"KKW","name":"Kikwit","country":"CD","region":"CD-KL","lat":-5.0358,"lng":18.7856},{"iata":"KKX","name":"Kikai","country":"JP","region":"JP-46","lat":28.3213,"lng":129.928},{"iata":"KLC","name":"Kaolack","country":"SN","region":"SN-FK","lat":14.1469,"lng":-16.0513},{"iata":"KLD","name":"Tver","country":"RU","region":"RU-TVE","lat":56.8247,"lng":35.7577},{"iata":"KLF","name":"Kaluga","country":"RU","region":"RU-KLU","lat":54.55,"lng":36.3667},{"iata":"KLH","name":"Kolhapur","country":"IN","region":"IN-MM","lat":16.6647,"lng":74.2894},{"iata":"KLO","name":"Kalibo","country":"PH","region":"PH-AKL","lat":11.6794,"lng":122.376},{"iata":"KLR","name":"Kalmar","country":"SE","region":"SE-H","lat":56.6855,"lng":16.2876},{"iata":"KLS","name":"Kelso","country":"US","region":"US-WA","lat":46.118,"lng":-122.898},{"iata":"KLU","name":"Klagenfurt am W\u00f6rthersee","country":"AT","region":"AT-2","lat":46.6425,"lng":14.3377},{"iata":"KLV","name":"Karlovy Vary","country":"CZ","region":"CZ-KA","lat":50.203,"lng":12.915},{"iata":"KLW","name":"Klawock","country":"US","region":"US-AK","lat":55.5792,"lng":-133.076},{"iata":"KLX","name":"Kalamata","country":"GR","region":"GR-J","lat":37.0683,"lng":22.0255},{"iata":"KLZ","name":"Kleinsee","country":"ZA","region":"ZA-NC","lat":-29.6884,"lng":17.094},{"iata":"KMA","name":"Kerema","country":"PG","region":"PG-GPK","lat":-7.9636,"lng":145.771},{"iata":"KMC","name":"King Khaled Military City","country":"SA","region":"SA-04","lat":27.9009,"lng":45.5282},{"iata":"KME","name":"Kamembe","country":"RW","region":"RW-04","lat":-2.4622,"lng":28.9079},{"iata":"KMG","name":"Kunming","country":"CN","region":"CN-53","lat":25.1103,"lng":102.9367},{"iata":"KMH","name":"Kuruman","country":"ZA","region":"ZA-NC","lat":-27.4567,"lng":23.4114},{"iata":"KMI","name":"Miyazaki","country":"JP","region":"JP-45","lat":31.8772,"lng":131.449},{"iata":"KMJ","name":"Kumamoto","country":"JP","region":"JP-43","lat":32.8373,"lng":130.855},{"iata":"KMP","name":"Keetmanshoop","country":"NA","region":"NA-KA","lat":-26.5398,"lng":18.1114},{"iata":"KMQ","name":"Kanazawa","country":"JP","region":"JP-17","lat":36.3934,"lng":136.4069},{"iata":"KMS","name":"Kumasi","country":"GH","region":"GH-AH","lat":6.7146,"lng":-1.5908},{"iata":"KMU","name":"Kismayo","country":"SO","region":"SO-JH","lat":-0.3774,"lng":42.4592},{"iata":"KMW","name":"Kostroma","country":"RU","region":"RU-KOS","lat":57.7969,"lng":41.0194},{"iata":"KMX","name":"Khamis Mushait","country":"SA","region":"SA-14","lat":18.2973,"lng":42.8035},{"iata":"KNA","name":"Vi\u00f1a del Mar","country":"CL","region":"CL-VS","lat":-32.9496,"lng":-71.4786},{"iata":"KND","name":"Kindu","country":"CD","region":"CD-MA","lat":-2.9192,"lng":25.9154},{"iata":"KNF","name":"King's Lynn, Norfolk","country":"GB","region":"GB-ENG","lat":52.6484,"lng":0.5507},{"iata":"KNG","name":"Kaimana","country":"ID","region":"ID-PB","lat":-3.6446,"lng":133.6951},{"iata":"KNH","name":"Shang-I","country":"TW","region":"TW-X-KM","lat":24.4279,"lng":118.359},{"iata":"KNO","name":"Beringin","country":"ID","region":"ID-SU","lat":3.6378,"lng":98.8706},{"iata":"KNQ","name":"Kon\u00e9","country":"NC","region":"NC-02","lat":-21.0536,"lng":164.8388},{"iata":"KNR","name":"Jam","country":"IR","region":"IR-18","lat":27.8205,"lng":52.3522},{"iata":"KNS","name":"King Island Airport","country":"AU","region":"AU-TAS","lat":-39.8775,"lng":143.878},{"iata":"KNU","name":"Kanpur","country":"IN","region":"IN-UP","lat":26.4043,"lng":80.4101},{"iata":"KNX","name":"Kununurra","country":"AU","region":"AU-WA","lat":-15.7781,"lng":128.708},{"iata":"KOA","name":"Kailua-Kona","country":"US","region":"US-HI","lat":19.7388,"lng":-156.0456},{"iata":"KOE","name":"Kupang","country":"ID","region":"ID-NT","lat":-10.1716,"lng":123.671},{"iata":"KOI","name":"Kirkwall, Orkney Islands","country":"GB","region":"GB-SCT","lat":58.9579,"lng":-2.9051},{"iata":"KOJ","name":"Kagoshima","country":"JP","region":"JP-46","lat":31.8034,"lng":130.719},{"iata":"KOK","name":"Kokkola / Kruunupyy","country":"FI","region":"FI-07","lat":63.7212,"lng":23.1431},{"iata":"KOP","name":"Nakhon Phanom","country":"TH","region":"TH-48","lat":17.3838,"lng":104.643},{"iata":"KOS","name":"Preah Sihanouk","country":"KH","region":"KH-18","lat":10.5706,"lng":103.6321},{"iata":"KOU","name":"Koulamoutou","country":"GA","region":"GA-7","lat":-1.1846,"lng":12.4413},{"iata":"KOV","name":"Kokshetau","country":"KZ","region":"KZ-AKM","lat":53.3291,"lng":69.5946},{"iata":"KPC","name":"Port Clarence","country":"US","region":"US-AK","lat":65.2537,"lng":-166.859},{"iata":"KPO","name":"Pohang","country":"KR","region":"KR-47","lat":35.988,"lng":129.4204},{"iata":"KPS","name":"Kempsey Airport","country":"AU","region":"AU-NSW","lat":-31.0723,"lng":152.7653},{"iata":"KPW","name":"Keperveem","country":"RU","region":"RU-CHU","lat":67.845,"lng":166.14},{"iata":"KQH","name":"Ajmer (Kishangarh)","country":"IN","region":"IN-RJ","lat":26.591,"lng":74.813},{"iata":"KQT","name":"Bokhtar","country":"TJ","region":"TJ-KT","lat":37.8663,"lng":68.8645},{"iata":"KRA","name":"Kerang Airport","country":"AU","region":"AU-VIC","lat":-35.7514,"lng":143.939},{"iata":"KRF","name":"Nyland","country":"SE","region":"SE-Y","lat":63.0486,"lng":17.7689},{"iata":"KRK","name":"Balice","country":"PL","region":"PL-MA","lat":50.0777,"lng":19.7848},{"iata":"KRL","name":"Korla","country":"CN","region":"CN-65","lat":41.615,"lng":86.1408},{"iata":"KRN","name":"Kiruna","country":"SE","region":"SE-BD","lat":67.822,"lng":20.3368},{"iata":"KRO","name":"Kurgan","country":"RU","region":"RU-KGN","lat":55.4753,"lng":65.4156},{"iata":"KRP","name":"Karup","country":"DK","region":"DK-82","lat":56.2971,"lng":9.1043},{"iata":"KRR","name":"Krasnodar","country":"RU","region":"RU-KDA","lat":45.0345,"lng":39.1742},{"iata":"KRS","name":"Kristiansand(Kjevik)","country":"NO","region":"NO-42","lat":58.2042,"lng":8.0854},{"iata":"KRT","name":"Khartoum","country":"SD","region":"SD-03","lat":15.5895,"lng":32.5532},{"iata":"KRW","name":"Turkmenba\u015fy","country":"TM","region":"TM-B","lat":40.0628,"lng":53.0051},{"iata":"KSA","name":"Okat","country":"FM","region":"FM-KSA","lat":5.357,"lng":162.958},{"iata":"KSC","name":"Ko\u0161ice","country":"SK","region":"SK-KI","lat":48.6631,"lng":21.2411},{"iata":"KSD","name":"Karlstad","country":"SE","region":"SE-S","lat":59.4447,"lng":13.3374},{"iata":"KSF","name":"Calden","country":"DE","region":"DE-HE","lat":51.4184,"lng":9.3916},{"iata":"KSH","name":"Kermanshah","country":"IR","region":"IR-05","lat":34.3459,"lng":47.1581},{"iata":"KSK","name":"Karlskoga","country":"SE","region":"SE-T","lat":59.3459,"lng":14.4959},{"iata":"KSL","name":"Kassala","country":"SD","region":"SD-05","lat":15.3875,"lng":36.3288},{"iata":"KSN","name":"Kostanay","country":"KZ","region":"KZ-KUS","lat":53.2069,"lng":63.5503},{"iata":"KSU","name":"Kvernberget","country":"NO","region":"NO-15","lat":63.1118,"lng":7.8245},{"iata":"KSY","name":"Kars","country":"TR","region":"TR-36","lat":40.5622,"lng":43.115},{"iata":"KSZ","name":"Kotlas","country":"RU","region":"RU-ARK","lat":61.2358,"lng":46.6975},{"iata":"KTA","name":"Karratha","country":"AU","region":"AU-WA","lat":-20.7122,"lng":116.773},{"iata":"KTD","name":"Kitadait\u014djima","country":"JP","region":"JP-47","lat":25.9447,"lng":131.327},{"iata":"KTE","name":"Kerteh","country":"MY","region":"MY-11","lat":4.5372,"lng":103.427},{"iata":"KTG","name":"Ketapang","country":"ID","region":"ID-KB","lat":-1.8172,"lng":109.9635},{"iata":"KTI","name":"Phnom Penh (Boeng Khyang)","country":"KH","region":"KH-8","lat":11.36,"lng":104.9213},{"iata":"KTL","name":"Kitale","country":"KE","region":"KE-700","lat":0.972,"lng":34.9586},{"iata":"KTM","name":"Kathmandu","country":"NP","region":"NP-P3","lat":27.6966,"lng":85.3591},{"iata":"KTN","name":"Ketchikan","country":"US","region":"US-AK","lat":55.3556,"lng":-131.714},{"iata":"KTP","name":"Tinson Pen","country":"JM","region":"JM-02","lat":17.9886,"lng":-76.8238},{"iata":"KTQ","name":"Kitee","country":"FI","region":"FI-13","lat":62.1661,"lng":30.0736},{"iata":"KTR","name":"Tindal Airport","country":"AU","region":"AU-NT","lat":-14.5211,"lng":132.378},{"iata":"KTT","name":"Kittil\u00e4","country":"FI","region":"FI-10","lat":67.701,"lng":24.8468},{"iata":"KTU","name":"Kota","country":"IN","region":"IN-RJ","lat":25.1602,"lng":75.8456},{"iata":"KTW","name":"Katowice","country":"PL","region":"PL-SL","lat":50.476,"lng":19.0807},{"iata":"KUA","name":"Kuantan","country":"MY","region":"MY-06","lat":3.7754,"lng":103.209},{"iata":"KUF","name":"Samara","country":"RU","region":"RU-SAM","lat":53.5049,"lng":50.1643},{"iata":"KUH","name":"Kushiro","country":"JP","region":"JP-01","lat":43.041,"lng":144.193},{"iata":"KUL","name":"Sepang","country":"MY","region":"MY-10","lat":2.7456,"lng":101.71},{"iata":"KUM","name":"Yakushima","country":"JP","region":"JP-46","lat":30.3856,"lng":130.659},{"iata":"KUN","name":"Kaunas","country":"LT","region":"LT-KU","lat":54.964,"lng":24.0858},{"iata":"KUO","name":"Kuopio / Siilinj\u00e4rvi","country":"FI","region":"FI-15","lat":63.0071,"lng":27.7978},{"iata":"KUS","name":"Kulusuk","country":"GL","region":"GL-SE","lat":65.5736,"lng":-37.1236},{"iata":"KUT","name":"Kopitnari","country":"GE","region":"GE-IM","lat":42.1774,"lng":42.4854},{"iata":"KUU","name":"Bhuntar","country":"IN","region":"IN-HP","lat":31.8767,"lng":77.1544},{"iata":"KUV","name":"Gunsan","country":"KR","region":"KR-45","lat":35.9038,"lng":126.616},{"iata":"KVA","name":"Kavala","country":"GR","region":"GR-A","lat":40.9133,"lng":24.6192},{"iata":"KVB","name":"Sk\u00f6vde","country":"SE","region":"SE-Q","lat":58.4564,"lng":13.9727},{"iata":"KVG","name":"Kavieng","country":"PG","region":"PG-NIK","lat":-2.5794,"lng":150.808},{"iata":"KVO","name":"Kraljevo","country":"RS","region":"RS-18","lat":43.8175,"lng":20.5867},{"iata":"KVX","name":"Kirov","country":"RU","region":"RU-KIR","lat":58.5039,"lng":49.3478},{"iata":"KWA","name":"Kwajalein","country":"MH","region":"MH-KWA","lat":8.7201,"lng":167.732},{"iata":"KWE","name":"Guiyang (Nanming)","country":"CN","region":"CN-52","lat":26.5418,"lng":106.804},{"iata":"KWG","name":"Kryvyi Rih","country":"UA","region":"UA-12","lat":48.0433,"lng":33.21},{"iata":"KWI","name":"Kuwait City","country":"KW","region":"KW-FA","lat":29.2245,"lng":47.9698},{"iata":"KWJ","name":"Gwangju","country":"KR","region":"KR-29","lat":35.1232,"lng":126.8054},{"iata":"KWL","name":"Guilin (Lingui)","country":"CN","region":"CN-45","lat":25.2198,"lng":110.0396},{"iata":"KWM","name":"Kowanyama","country":"AU","region":"AU-QLD","lat":-15.4854,"lng":141.7526},{"iata":"KWY","name":"Kiwayu","country":"KE","region":"KE-300","lat":-1.9606,"lng":41.2975},{"iata":"KWZ","name":"Kolwezi","country":"CD","region":"CD-LU","lat":-10.7659,"lng":25.5057},{"iata":"KXB","name":"Kolaka","country":"ID","region":"ID-SG","lat":-4.3382,"lng":121.524},{"iata":"KXE","name":"Klerksdorp","country":"ZA","region":"ZA-NW","lat":-26.8711,"lng":26.718},{"iata":"KXK","name":"Komsomolsk-on-Amur","country":"RU","region":"RU-KHA","lat":50.409,"lng":136.934},{"iata":"KYA","name":"Konya","country":"TR","region":"TR-42","lat":37.979,"lng":32.5619},{"iata":"KYD","name":"Orchid Island","country":"TW","region":"TW-TTT","lat":22.027,"lng":121.535},{"iata":"KYE","name":"Tripoli","country":"LB","region":"LB-AS","lat":34.5893,"lng":36.0113},{"iata":"KYP","name":"Kyaukpyu","country":"MM","region":"MM-16","lat":19.4264,"lng":93.5348},{"iata":"KYS","name":"Kayes","country":"ML","region":"ML-1","lat":14.4825,"lng":-11.3993},{"iata":"KYZ","name":"Kyzyl","country":"RU","region":"RU-TY","lat":51.6694,"lng":94.4006},{"iata":"KZI","name":"Kozani","country":"GR","region":"GR-C","lat":40.2861,"lng":21.8408},{"iata":"KZN","name":"Kazan","country":"RU","region":"RU-TA","lat":55.6062,"lng":49.2787},{"iata":"KZO","name":"Kyzylorda","country":"KZ","region":"KZ-KZY","lat":44.7069,"lng":65.5925},{"iata":"LAA","name":"Lamar","country":"US","region":"US-CO","lat":38.0664,"lng":-102.6914},{"iata":"LAD","name":"Luanda","country":"AO","region":"AO-LUA","lat":-8.8584,"lng":13.2312},{"iata":"LAE","name":"Lae","country":"PG","region":"PG-MPL","lat":-6.568,"lng":146.7265},{"iata":"LAF","name":"West Lafayette","country":"US","region":"US-IN","lat":40.4129,"lng":-86.9394},{"iata":"LAI","name":"Lannion","country":"FR","region":"FR-BRE","lat":48.7544,"lng":-3.4717},{"iata":"LAJ","name":"Lages","country":"BR","region":"BR-SC","lat":-27.7821,"lng":-50.2815},{"iata":"LAL","name":"Lakeland","country":"US","region":"US-FL","lat":27.9893,"lng":-82.0207},{"iata":"LAN","name":"Lansing","country":"US","region":"US-MI","lat":42.7776,"lng":-84.5857},{"iata":"LAO","name":"Laoag City","country":"PH","region":"PH-ILN","lat":18.1751,"lng":120.531},{"iata":"LAP","name":"La Paz","country":"MX","region":"MX-BCS","lat":24.0723,"lng":-110.3627},{"iata":"LAQ","name":"Al Albraq","country":"LY","region":"LY-JA","lat":32.789,"lng":21.9549},{"iata":"LAR","name":"Laramie","country":"US","region":"US-WY","lat":41.3121,"lng":-105.675},{"iata":"LAS","name":"Las Vegas","country":"US","region":"US-NV","lat":36.0834,"lng":-115.1518},{"iata":"LAU","name":"Lamu","country":"KE","region":"KE-300","lat":-2.2524,"lng":40.9129},{"iata":"LAW","name":"Lawton","country":"US","region":"US-OK","lat":34.5677,"lng":-98.4166},{"iata":"LAX","name":"Los Angeles","country":"US","region":"US-CA","lat":33.9425,"lng":-118.408},{"iata":"LAY","name":"Ladysmith","country":"ZA","region":"ZA-NL","lat":-28.5817,"lng":29.7497},{"iata":"LAZ","name":"Bom Jesus da Lapa","country":"BR","region":"BR-BA","lat":-13.2621,"lng":-43.4081},{"iata":"LBA","name":"Leeds, West Yorkshire","country":"GB","region":"GB-ENG","lat":53.8659,"lng":-1.6606},{"iata":"LBB","name":"Lubbock","country":"US","region":"US-TX","lat":33.6636,"lng":-101.823},{"iata":"LBC","name":"L\u00fcbeck","country":"DE","region":"DE-SH","lat":53.8054,"lng":10.7192},{"iata":"LBD","name":"Khujand","country":"TJ","region":"TJ-SU","lat":40.2154,"lng":69.6947},{"iata":"LBE","name":"Latrobe","country":"US","region":"US-PA","lat":40.2759,"lng":-79.4048},{"iata":"LBF","name":"North Platte","country":"US","region":"US-NE","lat":41.1262,"lng":-100.684},{"iata":"LBG","name":"Paris","country":"FR","region":"FR-IDF","lat":48.9623,"lng":2.4365},{"iata":"LBI","name":"Albi","country":"FR","region":"FR-OCC","lat":43.9139,"lng":2.1131},{"iata":"LBL","name":"Liberal","country":"US","region":"US-KS","lat":37.0442,"lng":-100.96},{"iata":"LBQ","name":"Lambarene","country":"GA","region":"GA-3","lat":-0.7044,"lng":10.2457},{"iata":"LBS","name":"Labasa","country":"FJ","region":"FJ-N","lat":-16.4667,"lng":179.34},{"iata":"LBT","name":"Lumberton","country":"US","region":"US-NC","lat":34.6108,"lng":-79.0594},{"iata":"LBU","name":"Labuan","country":"MY","region":"MY-15","lat":5.3017,"lng":115.2483},{"iata":"LBV","name":"Libreville","country":"GA","region":"GA-1","lat":0.459,"lng":9.4121},{"iata":"LBX","name":"Lubang","country":"PH","region":"PH-MDC","lat":13.8554,"lng":120.105},{"iata":"LBY","name":"La Baule-Escoublac","country":"FR","region":"FR-PDL","lat":47.2894,"lng":-2.3464},{"iata":"LCA","name":"Larnaca","country":"CY","region":"CY-04","lat":34.8751,"lng":33.6249},{"iata":"LCC","name":"Galatina (LE)","country":"IT","region":"IT-75","lat":40.2392,"lng":18.1333},{"iata":"LCE","name":"La Ceiba","country":"HN","region":"HN-AT","lat":15.7425,"lng":-86.853},{"iata":"LCG","name":"Culleredo","country":"ES","region":"ES-GA","lat":43.3021,"lng":-8.3773},{"iata":"LCH","name":"Lake Charles","country":"US","region":"US-LA","lat":30.1261,"lng":-93.2233},{"iata":"LCJ","name":"\u0141\u00f3d\u017a","country":"PL","region":"PL-LD","lat":51.7219,"lng":19.3981},{"iata":"LCK","name":"Columbus","country":"US","region":"US-OH","lat":39.8138,"lng":-82.9278},{"iata":"LCX","name":"Longyan (Liancheng)","country":"CN","region":"CN-35","lat":25.6759,"lng":116.7459},{"iata":"LCY","name":"London","country":"GB","region":"GB-ENG","lat":51.5053,"lng":0.0553},{"iata":"LDB","name":"Londrina","country":"BR","region":"BR-PR","lat":-23.3344,"lng":-51.1284},{"iata":"LDE","name":"Tarbes/Lourdes/Pyr\u00e9n\u00e9es","country":"FR","region":"FR-OCC","lat":43.1787,"lng":-0.0064},{"iata":"LDS","name":"Yichun","country":"CN","region":"CN-23","lat":47.7521,"lng":129.0191},{"iata":"LDU","name":"Lahad Datu","country":"MY","region":"MY-12","lat":5.0324,"lng":118.3238},{"iata":"LDV","name":"Landivisiau","country":"FR","region":"FR-BRE","lat":48.5303,"lng":-4.1516},{"iata":"LDX","name":"Saint-Laurent-du-Maroni","country":"GF","region":"GF-SL","lat":5.4819,"lng":-54.035},{"iata":"LDY","name":"Derry, Derry and Strabane","country":"GB","region":"GB-NIR","lat":55.0428,"lng":-7.1611},{"iata":"LEA","name":"Exmouth","country":"AU","region":"AU-WA","lat":-22.2352,"lng":114.09},{"iata":"LEB","name":"Lebanon","country":"US","region":"US-NH","lat":43.6261,"lng":-72.3042},{"iata":"LED","name":"St. Petersburg","country":"RU","region":"RU-SPE","lat":59.8003,"lng":30.2625},{"iata":"LEE","name":"Leesburg","country":"US","region":"US-FL","lat":28.8231,"lng":-81.8087},{"iata":"LEH","name":"Le Havre","country":"FR","region":"FR-NOR","lat":49.534,"lng":0.0884},{"iata":"LEI","name":"Almer\u00eda","country":"ES","region":"ES-AN","lat":36.8439,"lng":-2.3701},{"iata":"LEJ","name":"Schkeuditz","country":"DE","region":"DE-SN","lat":51.4207,"lng":12.2327},{"iata":"LEN","name":"La Virgen Del Camino","country":"ES","region":"ES-CL","lat":42.5907,"lng":-5.6534},{"iata":"LER","name":"Leinster Airport","country":"AU","region":"AU-WA","lat":-27.8433,"lng":120.703},{"iata":"LET","name":"Leticia","country":"CO","region":"CO-AMA","lat":-4.1911,"lng":-69.942},{"iata":"LEU","name":"La Seu d'Urgell Pyrenees and Andorra","country":"ES","region":"ES-CT","lat":42.3386,"lng":1.4092},{"iata":"LEX","name":"Lexington","country":"US","region":"US-KY","lat":38.0351,"lng":-84.6067},{"iata":"LEY","name":"Lelystad","country":"NL","region":"NL-FL","lat":52.4532,"lng":5.5146},{"iata":"LFI","name":"Hampton","country":"US","region":"US-VA","lat":37.0829,"lng":-76.3605},{"iata":"LFK","name":"Lufkin","country":"US","region":"US-TX","lat":31.234,"lng":-94.75},{"iata":"LFM","name":"Lamerd","country":"IR","region":"IR-07","lat":27.3727,"lng":53.1888},{"iata":"LFQ","name":"Linfen (Yaodu)","country":"CN","region":"CN-14","lat":36.1326,"lng":111.6412},{"iata":"LFR","name":"La Fria Airport","country":"VE","region":"VE-S","lat":8.2392,"lng":-72.271},{"iata":"LFT","name":"Lafayette","country":"US","region":"US-LA","lat":30.2053,"lng":-91.9876},{"iata":"LFW","name":"Lom\u00e9","country":"TG","region":"TG-M","lat":6.1656,"lng":1.2545},{"iata":"LGA","name":"New York","country":"US","region":"US-NY","lat":40.7772,"lng":-73.8726},{"iata":"LGB","name":"Long Beach","country":"US","region":"US-CA","lat":33.8165,"lng":-118.1499},{"iata":"LGG","name":"Gr\u00e2ce-Hollogne","country":"BE","region":"BE-WLG","lat":50.6386,"lng":5.4439},{"iata":"LGH","name":"Leigh Creek Airport","country":"AU","region":"AU-SA","lat":-30.5983,"lng":138.426},{"iata":"LGI","name":"Deadman's Cay","country":"BS","region":"BS-LI","lat":23.179,"lng":-75.0936},{"iata":"LGK","name":"Langkawi","country":"MY","region":"MY-02","lat":6.3297,"lng":99.7287},{"iata":"LGR","name":"Cochrane","country":"CL","region":"CL-AI","lat":-47.2436,"lng":-72.5881},{"iata":"LGS","name":"Malargue","country":"AR","region":"AR-M","lat":-35.4936,"lng":-69.5743},{"iata":"LGU","name":"Logan","country":"US","region":"US-UT","lat":41.7912,"lng":-111.852},{"iata":"LGW","name":"London","country":"GB","region":"GB-ENG","lat":51.1487,"lng":-0.1857},{"iata":"LHA","name":"Lahr/Schwarzwald","country":"DE","region":"DE-BW","lat":48.3693,"lng":7.8277},{"iata":"LHE","name":"Lahore","country":"PK","region":"PK-PB","lat":31.5216,"lng":74.4036},{"iata":"LHG","name":"Lightning Ridge Airport","country":"AU","region":"AU-NSW","lat":-29.4529,"lng":147.9771},{"iata":"LHK","name":"Xiangyang (Laohekou)","country":"CN","region":"CN-42","lat":32.3887,"lng":111.6942},{"iata":"LHN","name":"Linhares","country":"BR","region":"BR-ES","lat":-19.3552,"lng":-40.0713},{"iata":"LHR","name":"London","country":"GB","region":"GB-ENG","lat":51.4707,"lng":-0.4599},{"iata":"LHS","name":"Las Heras","country":"AR","region":"AR-Z","lat":-46.5385,"lng":-68.9653},{"iata":"LHW","name":"Lanzhou (Yongdeng)","country":"CN","region":"CN-62","lat":36.5152,"lng":103.62},{"iata":"LIF","name":"Lifou","country":"NC","region":"NC-01","lat":-20.7746,"lng":167.2393},{"iata":"LIG","name":"Limoges/Bellegarde","country":"FR","region":"FR-NAQ","lat":45.8628,"lng":1.1794},{"iata":"LIH","name":"Lihue, Kauai","country":"US","region":"US-HI","lat":21.9744,"lng":-159.3371},{"iata":"LIL","name":"Lesquin","country":"FR","region":"FR-HDF","lat":50.5666,"lng":3.1024},{"iata":"LIM","name":"Lima","country":"PE","region":"PE-LIM","lat":-12.0219,"lng":-77.1143},{"iata":"LIN","name":"Segrate (MI)","country":"IT","region":"IT-25","lat":45.4451,"lng":9.2767},{"iata":"LIO","name":"Lim\u00f3n","country":"CR","region":"CR-L","lat":9.958,"lng":-83.022},{"iata":"LIP","name":"Lins","country":"BR","region":"BR-SP","lat":-21.6635,"lng":-49.73},{"iata":"LIQ","name":"Lisala","country":"CD","region":"CD-MO","lat":2.1707,"lng":21.4969},{"iata":"LIR","name":"Liberia","country":"CR","region":"CR-G","lat":10.5933,"lng":-85.5444},{"iata":"LIS","name":"Lisbon","country":"PT","region":"PT-11","lat":38.7813,"lng":-9.1359},{"iata":"LIT","name":"Little Rock","country":"US","region":"US-AR","lat":34.7292,"lng":-92.2236},{"iata":"LIW","name":"Loikaw","country":"MM","region":"MM-12","lat":19.6915,"lng":97.2148},{"iata":"LJG","name":"Lijiang","country":"CN","region":"CN-53","lat":26.6775,"lng":100.2449},{"iata":"LJN","name":"Angleton","country":"US","region":"US-TX","lat":29.1086,"lng":-95.4621},{"iata":"LJU","name":"Zgornji Brnik","country":"SI","region":"SI-012","lat":46.2237,"lng":14.4576},{"iata":"LKG","name":"Lokichogio","country":"KE","region":"KE-700","lat":4.2041,"lng":34.3482},{"iata":"LKL","name":"Lakselv","country":"NO","region":"NO-56","lat":70.0688,"lng":24.9735},{"iata":"LKN","name":"Leknes","country":"NO","region":"NO-18","lat":68.1525,"lng":13.6094},{"iata":"LKO","name":"Lucknow","country":"IN","region":"IN-UP","lat":26.7606,"lng":80.8893},{"iata":"LKY","name":"Lake Manyara National Park","country":"TZ","region":"TZ-26","lat":-3.3763,"lng":35.8183},{"iata":"LKZ","name":"Brandon, Suffolk","country":"GB","region":"GB-ENG","lat":52.4095,"lng":0.5612},{"iata":"LLA","name":"Lule\u00e5","country":"SE","region":"SE-BD","lat":65.5438,"lng":22.122},{"iata":"LLC","name":"Lal-lo","country":"PH","region":"PH-CAG","lat":18.1824,"lng":121.7462},{"iata":"LLF","name":"Yongzhou","country":"CN","region":"CN-43","lat":26.3387,"lng":111.61},{"iata":"LLV","name":"L\u00fcliang","country":"CN","region":"CN-61","lat":37.6833,"lng":111.1428},{"iata":"LLW","name":"Lumbadzi","country":"MW","region":"MW-LI","lat":-13.7894,"lng":33.781},{"iata":"LME","name":"Le Mans, Sarthe","country":"FR","region":"FR-PDL","lat":47.9486,"lng":0.2017},{"iata":"LMM","name":"Los Mochis","country":"MX","region":"MX-SIN","lat":25.6855,"lng":-109.0812},{"iata":"LMN","name":"Limbang","country":"MY","region":"MY-13","lat":4.8083,"lng":115.01},{"iata":"LMO","name":"Lossiemouth, Moray","country":"GB","region":"GB-SCT","lat":57.7052,"lng":-3.3392},{"iata":"LMP","name":"Lampedusa","country":"IT","region":"IT-82","lat":35.4979,"lng":12.6181},{"iata":"LMQ","name":"Marsa al Brega","country":"LY","region":"LY-WA","lat":30.3781,"lng":19.5764},{"iata":"LMR","name":"Lime Acres","country":"ZA","region":"ZA-NC","lat":-28.3601,"lng":23.4391},{"iata":"LMT","name":"Klamath Falls","country":"US","region":"US-OR","lat":42.1561,"lng":-121.733},{"iata":"LND","name":"Lander","country":"US","region":"US-WY","lat":42.8152,"lng":-108.73},{"iata":"LNJ","name":"Lincang","country":"CN","region":"CN-53","lat":23.7381,"lng":100.025},{"iata":"LNK","name":"Lincoln","country":"US","region":"US-NE","lat":40.8449,"lng":-96.7618},{"iata":"LNL","name":"Longnan (Cheng)","country":"CN","region":"CN-62","lat":33.7899,"lng":105.79},{"iata":"LNO","name":"Leonora","country":"AU","region":"AU-WA","lat":-28.8781,"lng":121.315},{"iata":"LNS","name":"Lancaster","country":"US","region":"US-PA","lat":40.1217,"lng":-76.2961},{"iata":"LNX","name":"Smolensk","country":"RU","region":"RU-SMO","lat":54.824,"lng":32.025},{"iata":"LNY","name":"Lanai City","country":"US","region":"US-HI","lat":20.7857,"lng":-156.9513},{"iata":"LNZ","name":"Linz","country":"AT","region":"AT-4","lat":48.2354,"lng":14.1881},{"iata":"LOE","name":"Loei Airport","country":"TH","region":"TH-42","lat":17.4391,"lng":101.722},{"iata":"LOK","name":"Lodwar","country":"KE","region":"KE-700","lat":3.122,"lng":35.6087},{"iata":"LOL","name":"Lovelock","country":"US","region":"US-NV","lat":40.0664,"lng":-118.565},{"iata":"LOO","name":"Laghouat","country":"DZ","region":"DZ-03","lat":33.7644,"lng":2.9283},{"iata":"LOP","name":"Mataram (Pujut, Lombok Tengah)","country":"ID","region":"ID-NB","lat":-8.76,"lng":116.2782},{"iata":"LOS","name":"Lagos","country":"NG","region":"NG-LA","lat":6.5774,"lng":3.3212},{"iata":"LOU","name":"Louisville","country":"US","region":"US-KY","lat":38.228,"lng":-85.6637},{"iata":"LOV","name":"Monclova","country":"MX","region":"MX-COA","lat":26.9557,"lng":-101.47},{"iata":"LOZ","name":"London","country":"US","region":"US-KY","lat":37.0822,"lng":-84.0849},{"iata":"LPA","name":"Gran Canaria Island","country":"ES","region":"ES-CN","lat":27.9319,"lng":-15.3866},{"iata":"LPB","name":"La Paz / El Alto","country":"BO","region":"BO-L","lat":-16.5103,"lng":-68.1894},{"iata":"LPF","name":"Liupanshui (Zhongshan)","country":"CN","region":"CN-52","lat":26.6094,"lng":104.979},{"iata":"LPG","name":"La Plata","country":"AR","region":"AR-B","lat":-34.9722,"lng":-57.8947},{"iata":"LPI","name":"Link\u00f6ping","country":"SE","region":"SE-E","lat":58.4049,"lng":15.6845},{"iata":"LPK","name":"Lipetsk","country":"RU","region":"RU-LIP","lat":52.7028,"lng":39.5378},{"iata":"LPL","name":"Liverpool","country":"GB","region":"GB-ENG","lat":53.3349,"lng":-2.8496},{"iata":"LPP","name":"Lappeenranta","country":"FI","region":"FI-02","lat":61.0446,"lng":28.1447},{"iata":"LPQ","name":"Luang Phabang","country":"LA","region":"LA-LP","lat":19.9043,"lng":102.1672},{"iata":"LPT","name":"Lampang Airport","country":"TH","region":"TH-52","lat":18.2709,"lng":99.5042},{"iata":"LPX","name":"Liep\u0101ja","country":"LV","region":"LV-112","lat":56.5175,"lng":21.0969},{"iata":"LRD","name":"Laredo","country":"US","region":"US-TX","lat":27.5438,"lng":-99.4616},{"iata":"LRE","name":"Longreach","country":"AU","region":"AU-QLD","lat":-23.4342,"lng":144.28},{"iata":"LRF","name":"Jacksonville","country":"US","region":"US-AR","lat":34.9169,"lng":-92.1497},{"iata":"LRH","name":"La Rochelle","country":"FR","region":"FR-NAQ","lat":46.1792,"lng":-1.1953},{"iata":"LRL","name":"Niamtougou","country":"TG","region":"TG-K","lat":9.7667,"lng":1.0909},{"iata":"LRM","name":"La Romana","country":"DO","region":"DO-12","lat":18.4522,"lng":-68.9111},{"iata":"LRR","name":"Lar","country":"IR","region":"IR-07","lat":27.6747,"lng":54.3833},{"iata":"LRT","name":"Lorient/Lann/Bihou\u00e9","country":"FR","region":"FR-BRE","lat":47.7606,"lng":-3.44},{"iata":"LRU","name":"Las Cruces","country":"US","region":"US-NM","lat":32.2894,"lng":-106.922},{"iata":"LSC","name":"La Serena-Coquimbo","country":"CL","region":"CL-CO","lat":-29.9162,"lng":-71.1995},{"iata":"LSE","name":"La Crosse","country":"US","region":"US-WI","lat":43.879,"lng":-91.2567},{"iata":"LSF","name":"Fort Benning","country":"US","region":"US-GA","lat":32.3325,"lng":-84.988},{"iata":"LSH","name":"Lashio","country":"MM","region":"MM-17","lat":22.9779,"lng":97.7522},{"iata":"LSI","name":"Lerwick, Shetland","country":"GB","region":"GB-SCT","lat":59.8789,"lng":-1.2956},{"iata":"LSL","name":"Los Chiles","country":"CR","region":"CR-A","lat":11.0353,"lng":-84.7061},{"iata":"LSP","name":"Paraguan\u00e1","country":"VE","region":"VE-I","lat":11.7808,"lng":-70.1515},{"iata":"LSR","name":"Kutacane","country":"ID","region":"ID-AC","lat":3.3915,"lng":97.8637},{"iata":"LST","name":"Launceston (Western Junction)","country":"AU","region":"AU-TAS","lat":-41.5449,"lng":147.2108},{"iata":"LSV","name":"Las Vegas","country":"US","region":"US-NV","lat":36.2362,"lng":-115.034},{"iata":"LSX","name":"Lhok Sukon-Sumatra Island","country":"ID","region":"ID-AC","lat":5.0695,"lng":97.2592},{"iata":"LSY","name":"Lismore","country":"AU","region":"AU-NSW","lat":-28.8307,"lng":153.2584},{"iata":"LTA","name":"Tzaneen","country":"ZA","region":"ZA-NP","lat":-23.8244,"lng":30.3293},{"iata":"LTD","name":"Ghadames","country":"LY","region":"LY-NL","lat":30.1455,"lng":9.7021},{"iata":"LTH","name":"Ho Chi Minh City (Long Thanh)","country":"VN","region":"VN-SE","lat":10.7728,"lng":107.0406},{"iata":"LTI","name":"Altai","country":"MN","region":"MN-065","lat":46.3764,"lng":96.2211},{"iata":"LTK","name":"Latakia","country":"SY","region":"SY-LA","lat":35.4011,"lng":35.9487},{"iata":"LTM","name":"Lethem","country":"GY","region":"GY-UT","lat":3.3728,"lng":-59.7894},{"iata":"LTN","name":"Luton, Luton","country":"GB","region":"GB-ENG","lat":51.8747,"lng":-0.3683},{"iata":"LTO","name":"Loreto","country":"MX","region":"MX-BCS","lat":25.9895,"lng":-111.3484},{"iata":"LTQ","name":"Le Touquet-Paris-Plage","country":"FR","region":"FR-HDF","lat":50.5183,"lng":1.6217},{"iata":"LTS","name":"Altus","country":"US","region":"US-OK","lat":34.6671,"lng":-99.2667},{"iata":"LTU","name":"Latur","country":"IN","region":"IN-MM","lat":18.4115,"lng":76.4647},{"iata":"LTX","name":"Latacunga","country":"EC","region":"EC-X","lat":-0.9068,"lng":-78.6158},{"iata":"LUA","name":"Lukla","country":"NP","region":"NP-P1","lat":27.6868,"lng":86.7295},{"iata":"LUD","name":"Luderitz","country":"NA","region":"NA-KA","lat":-26.6874,"lng":15.2429},{"iata":"LUF","name":"Glendale","country":"US","region":"US-AZ","lat":33.535,"lng":-112.383},{"iata":"LUG","name":"Agno","country":"CH","region":"CH-TI","lat":46.0043,"lng":8.9106},{"iata":"LUH","name":"Ludhiana Airport","country":"IN","region":"IN-PB","lat":30.8547,"lng":75.9526},{"iata":"LUK","name":"Cincinnati","country":"US","region":"US-OH","lat":39.1024,"lng":-84.4189},{"iata":"LUM","name":"Dehong (Mangshi)","country":"CN","region":"CN-53","lat":24.4011,"lng":98.5317},{"iata":"LUN","name":"Lusaka","country":"ZM","region":"ZM-09","lat":-15.3308,"lng":28.4527},{"iata":"LUO","name":"Luena","country":"AO","region":"AO-MOX","lat":-11.7681,"lng":19.8977},{"iata":"LUQ","name":"San Luis","country":"AR","region":"AR-D","lat":-33.2732,"lng":-66.3564},{"iata":"LUR","name":"Cape Lisburne","country":"US","region":"US-AK","lat":68.8751,"lng":-166.11},{"iata":"LUV","name":"Langgur","country":"ID","region":"ID-MA","lat":-5.7603,"lng":132.7594},{"iata":"LUW","name":"Luwok","country":"ID","region":"ID-ST","lat":-1.0359,"lng":122.7739},{"iata":"LUX","name":"Luxembourg","country":"LU","region":"LU-L","lat":49.6268,"lng":6.2121},{"iata":"LUZ","name":"Lublin","country":"PL","region":"PL-LU","lat":51.2402,"lng":22.7135},{"iata":"LVA","name":"Laval, Mayenne","country":"FR","region":"FR-PDL","lat":48.0322,"lng":-0.744},{"iata":"LVI","name":"Livingstone","country":"ZM","region":"ZM-07","lat":-17.8215,"lng":25.8196},{"iata":"LVM","name":"Livingston","country":"US","region":"US-MT","lat":45.6994,"lng":-110.448},{"iata":"LVP","name":"Lavan Airport","country":"IR","region":"IR-22","lat":26.8107,"lng":53.3543},{"iata":"LVS","name":"Las Vegas","country":"US","region":"US-NM","lat":35.6542,"lng":-105.142},{"iata":"LWB","name":"Lewisburg","country":"US","region":"US-WV","lat":37.8579,"lng":-80.4004},{"iata":"LWM","name":"Lawrence","country":"US","region":"US-MA","lat":42.7172,"lng":-71.1234},{"iata":"LWN","name":"Gyumri","country":"AM","region":"AM-SH","lat":40.7504,"lng":43.8593},{"iata":"LWO","name":"Lviv","country":"UA","region":"UA-46","lat":49.8125,"lng":23.9561},{"iata":"LWR","name":"Leeuwarden","country":"NL","region":"NL-FR","lat":53.2286,"lng":5.7606},{"iata":"LWS","name":"Lewiston","country":"US","region":"US-ID","lat":46.3745,"lng":-117.015},{"iata":"LWT","name":"Lewistown","country":"US","region":"US-MT","lat":47.0484,"lng":-109.4661},{"iata":"LXA","name":"Shannan (Gonggar)","country":"CN","region":"CN-54","lat":29.298,"lng":90.912},{"iata":"LXR","name":"Luxor","country":"EG","region":"EG-LX","lat":25.671,"lng":32.7064},{"iata":"LYA","name":"Luoyang (Laocheng)","country":"CN","region":"CN-41","lat":34.7411,"lng":112.388},{"iata":"LYB","name":"Blossom Village","country":"KY","region":"KY-LC","lat":19.6602,"lng":-80.0888},{"iata":"LYC","name":"Lycksele","country":"SE","region":"SE-AC","lat":64.5483,"lng":18.7162},{"iata":"LYG","name":"Lianyungang","country":"CN","region":"CN-32","lat":34.4141,"lng":119.179},{"iata":"LYH","name":"Lynchburg","country":"US","region":"US-VA","lat":37.3267,"lng":-79.2004},{"iata":"LYI","name":"Linyi (Hedong)","country":"CN","region":"CN-37","lat":35.0529,"lng":118.4118},{"iata":"LYN","name":"Chassieu, Lyon","country":"FR","region":"FR-ARA","lat":45.7279,"lng":4.944},{"iata":"LYP","name":"Faisalabad","country":"PK","region":"PK-PB","lat":31.3649,"lng":72.9953},{"iata":"LYR","name":"Longyearbyen","country":"NO","region":"NO-21","lat":78.2461,"lng":15.4656},{"iata":"LYS","name":"Colombier-Saugnieu, Rh\u00f4ne","country":"FR","region":"FR-ARA","lat":45.726,"lng":5.0901},{"iata":"LYU","name":"Ely","country":"US","region":"US-MN","lat":47.8245,"lng":-91.8307},{"iata":"LYX","name":"Romney Marsh, Kent","country":"GB","region":"GB-ENG","lat":50.9562,"lng":0.9391},{"iata":"LZC","name":"L\u00e1zaro C\u00e1rdenas","country":"MX","region":"MX-MIC","lat":18.0017,"lng":-102.2203},{"iata":"LZG","name":"Nanchong (Langzhong)","country":"CN","region":"CN-51","lat":31.5019,"lng":106.0344},{"iata":"LZH","name":"Liuzhou (Liujiang)","country":"CN","region":"CN-45","lat":24.2075,"lng":109.391},{"iata":"LZN","name":"Matsu (Nangan)","country":"TW","region":"TW-X-LK","lat":26.1597,"lng":119.9584},{"iata":"LZO","name":"Luzhou (Yunlong)","country":"CN","region":"CN-51","lat":29.0304,"lng":105.4684},{"iata":"LZY","name":"Nyingchi (Mainling)","country":"CN","region":"CN-54","lat":29.3033,"lng":94.3353},{"iata":"MAA","name":"Chennai","country":"IN","region":"IN-TN","lat":12.99,"lng":80.1693},{"iata":"MAB","name":"Marab\u00e1","country":"BR","region":"BR-PA","lat":-5.3686,"lng":-49.138},{"iata":"MAD","name":"Madrid","country":"ES","region":"ES-MD","lat":40.4934,"lng":-3.5722},{"iata":"MAF","name":"Midland","country":"US","region":"US-TX","lat":31.9425,"lng":-102.202},{"iata":"MAG","name":"Madang","country":"PG","region":"PG-MPM","lat":-5.2071,"lng":145.789},{"iata":"MAH","name":"Mah\u00f3n (Ma\u00f3)","country":"ES","region":"ES-IB","lat":39.8626,"lng":4.2187},{"iata":"MAJ","name":"Majuro Atoll","country":"MH","region":"MH-MAJ","lat":7.0651,"lng":171.2717},{"iata":"MAK","name":"Malakal","country":"SS","region":"SS-NU","lat":9.5587,"lng":31.6519},{"iata":"MAM","name":"Matamoros","country":"MX","region":"MX-TAM","lat":25.7699,"lng":-97.5253},{"iata":"MAN","name":"Manchester, Greater Manchester","country":"GB","region":"GB-ENG","lat":53.3494,"lng":-2.2795},{"iata":"MAO","name":"Manaus","country":"BR","region":"BR-AM","lat":-3.0386,"lng":-60.0497},{"iata":"MAQ","name":"Mae Sot Airport","country":"TH","region":"TH-63","lat":16.6999,"lng":98.5451},{"iata":"MAR","name":"Maracaibo","country":"VE","region":"VE-V","lat":10.5575,"lng":-71.7293},{"iata":"MAS","name":"Manus Island","country":"PG","region":"PG-MRL","lat":-2.0619,"lng":147.424},{"iata":"MAU","name":"Maupiti Airport","country":"PF","region":"PF-U-A","lat":-16.4265,"lng":-152.244},{"iata":"MAX","name":"Ouro Sogui","country":"SN","region":"SN-MT","lat":15.5936,"lng":-13.3228},{"iata":"MAY","name":"Mangrove Cay","country":"BS","region":"BS-SA","lat":24.2877,"lng":-77.6846},{"iata":"MAZ","name":"Mayaguez","country":"PR","region":"PR-U-A","lat":18.2557,"lng":-67.1485},{"iata":"MBA","name":"Mombasa","country":"KE","region":"KE-300","lat":-4.0348,"lng":39.5942},{"iata":"MBD","name":"Mafeking","country":"ZA","region":"ZA-NW","lat":-25.7984,"lng":25.548},{"iata":"MBE","name":"Monbetsu","country":"JP","region":"JP-01","lat":44.3039,"lng":143.404},{"iata":"MBG","name":"Mobridge","country":"US","region":"US-SD","lat":45.5465,"lng":-100.408},{"iata":"MBI","name":"Mbeya","country":"TZ","region":"TZ-14","lat":-8.9199,"lng":33.274},{"iata":"MBJ","name":"Montego Bay","country":"JM","region":"JM-08","lat":18.5034,"lng":-77.9132},{"iata":"MBO","name":"Mamburao","country":"PH","region":"PH-MDC","lat":13.208,"lng":120.6055},{"iata":"MBS","name":"Freeland","country":"US","region":"US-MI","lat":43.5332,"lng":-84.0831},{"iata":"MBT","name":"Masbate","country":"PH","region":"PH-MAS","lat":12.3697,"lng":123.6301},{"iata":"MBW","name":"Melbourne","country":"AU","region":"AU-VIC","lat":-37.9778,"lng":145.0998},{"iata":"MBX","name":"Maribor","country":"SI","region":"SI-160","lat":46.4799,"lng":15.6861},{"iata":"MCB","name":"McComb","country":"US","region":"US-MS","lat":31.1785,"lng":-90.4719},{"iata":"MCC","name":"Sacramento","country":"US","region":"US-CA","lat":38.6676,"lng":-121.401},{"iata":"MCE","name":"Merced","country":"US","region":"US-CA","lat":37.2847,"lng":-120.514},{"iata":"MCF","name":"Tampa","country":"US","region":"US-FL","lat":27.8493,"lng":-82.5212},{"iata":"MCG","name":"McGrath","country":"US","region":"US-AK","lat":62.9529,"lng":-155.606},{"iata":"MCI","name":"Kansas City","country":"US","region":"US-MO","lat":39.3017,"lng":-94.7139},{"iata":"MCJ","name":"La Mina-Maicao","country":"CO","region":"CO-LAG","lat":11.2325,"lng":-72.4901},{"iata":"MCK","name":"McCook","country":"US","region":"US-NE","lat":40.2078,"lng":-100.5928},{"iata":"MCN","name":"Macon","country":"US","region":"US-GA","lat":32.6928,"lng":-83.6492},{"iata":"MCO","name":"Orlando","country":"US","region":"US-FL","lat":28.4294,"lng":-81.309},{"iata":"MCP","name":"Macap\u00e1","country":"BR","region":"BR-AP","lat":0.0507,"lng":-51.0722},{"iata":"MCS","name":"Monte Caseros","country":"AR","region":"AR-W","lat":-30.2719,"lng":-57.6402},{"iata":"MCT","name":"Muscat/Seeb","country":"OM","region":"OM-MA","lat":23.6002,"lng":58.2853},{"iata":"MCU","name":"L\u00e9paud, Creuse","country":"FR","region":"FR-NAQ","lat":46.2226,"lng":2.364},{"iata":"MCW","name":"Mason City","country":"US","region":"US-IA","lat":43.1598,"lng":-93.3297},{"iata":"MCX","name":"Makhachkala","country":"RU","region":"RU-DA","lat":42.8168,"lng":47.6523},{"iata":"MCY","name":"Maroochydore","country":"AU","region":"AU-QLD","lat":-26.5933,"lng":153.0832},{"iata":"MCZ","name":"Macei\u00f3","country":"BR","region":"BR-AL","lat":-9.5126,"lng":-35.7918},{"iata":"MDC","name":"Manado","country":"ID","region":"ID-SA","lat":1.5486,"lng":124.9262},{"iata":"MDE","name":"Medell\u00edn","country":"CO","region":"CO-ANT","lat":6.1645,"lng":-75.4231},{"iata":"MDG","name":"Mudanjiang","country":"CN","region":"CN-23","lat":44.5252,"lng":129.5686},{"iata":"MDH","name":"Murphysboro","country":"US","region":"US-IL","lat":37.7781,"lng":-89.252},{"iata":"MDI","name":"Makurdi","country":"NG","region":"NG-BE","lat":7.7039,"lng":8.6139},{"iata":"MDK","name":"Mbandaka","country":"CD","region":"CD-EQ","lat":0.0226,"lng":18.2887},{"iata":"MDL","name":"Mandalay","country":"MM","region":"MM-04","lat":21.7022,"lng":95.9779},{"iata":"MDQ","name":"Mar del Plata","country":"AR","region":"AR-B","lat":-37.9342,"lng":-57.5733},{"iata":"MDT","name":"Harrisburg","country":"US","region":"US-PA","lat":40.1928,"lng":-76.7623},{"iata":"MDU","name":"Mendi","country":"PG","region":"PG-SHM","lat":-6.1477,"lng":143.657},{"iata":"MDW","name":"Chicago","country":"US","region":"US-IL","lat":41.786,"lng":-87.7524},{"iata":"MDY","name":"Sand Island","country":"UM","region":"UM-71","lat":28.2017,"lng":-177.381},{"iata":"MDZ","name":"Mendoza","country":"AR","region":"AR-M","lat":-32.8317,"lng":-68.7929},{"iata":"MEA","name":"Maca\u00e9","country":"BR","region":"BR-RJ","lat":-22.343,"lng":-41.766},{"iata":"MEB","name":"Essendon Fields","country":"AU","region":"AU-VIC","lat":-37.7281,"lng":144.902},{"iata":"MEC","name":"Manta","country":"EC","region":"EC-M","lat":-0.9461,"lng":-80.6788},{"iata":"MED","name":"Medina","country":"SA","region":"SA-03","lat":24.5534,"lng":39.7051},{"iata":"MEE","name":"Mar\u00e9","country":"NC","region":"NC-01","lat":-21.4824,"lng":168.0385},{"iata":"MEG","name":"Malanje","country":"AO","region":"AO-MAL","lat":-9.5251,"lng":16.3124},{"iata":"MEH","name":"Mehamn","country":"NO","region":"NO-56","lat":71.0297,"lng":27.8267},{"iata":"MEI","name":"Meridian","country":"US","region":"US-MS","lat":32.3326,"lng":-88.7519},{"iata":"MEK","name":"Meknes","country":"MA","region":"MA-03","lat":33.8791,"lng":-5.5151},{"iata":"MEL","name":"Melbourne","country":"AU","region":"AU-VIC","lat":-37.6707,"lng":144.8379},{"iata":"MEM","name":"Memphis","country":"US","region":"US-TN","lat":35.0438,"lng":-89.9763},{"iata":"MEN","name":"Mende/Br\u00e9noux","country":"FR","region":"FR-OCC","lat":44.5021,"lng":3.5328},{"iata":"MEQ","name":"Kuala Pesisir","country":"ID","region":"ID-AC","lat":4.041,"lng":96.2533},{"iata":"MER","name":"Merced","country":"US","region":"US-CA","lat":37.3805,"lng":-120.568},{"iata":"MES","name":"Medan","country":"ID","region":"ID-SU","lat":3.5584,"lng":98.6723},{"iata":"MEU","name":"Almeirim","country":"BR","region":"BR-PA","lat":-0.8898,"lng":-52.6022},{"iata":"MEX","name":"Mexico City","country":"MX","region":"MX-DIF","lat":19.4358,"lng":-99.0703},{"iata":"MFD","name":"Mansfield","country":"US","region":"US-OH","lat":40.8214,"lng":-82.5166},{"iata":"MFE","name":"McAllen","country":"US","region":"US-TX","lat":26.1761,"lng":-98.238},{"iata":"MFH","name":"Mesquite","country":"US","region":"US-NV","lat":36.8331,"lng":-114.0559},{"iata":"MFK","name":"Matsu (Beigan)","country":"TW","region":"TW-X-LK","lat":26.2242,"lng":120.003},{"iata":"MFM","name":"Nossa Senhora do Carmo","country":"MO","region":"MO-CAR","lat":22.1496,"lng":113.592},{"iata":"MFQ","name":"Maradi","country":"NE","region":"NE-4","lat":13.5025,"lng":7.1268},{"iata":"MFR","name":"Medford","country":"US","region":"US-OR","lat":42.3742,"lng":-122.873},{"iata":"MFU","name":"Mfuwe","country":"ZM","region":"ZM-03","lat":-13.2589,"lng":31.9366},{"iata":"MGA","name":"Managua","country":"NI","region":"NI-MN","lat":12.1415,"lng":-86.1682},{"iata":"MGB","name":"Mount Gambier","country":"AU","region":"AU-SA","lat":-37.7444,"lng":140.7806},{"iata":"MGC","name":"Michigan City","country":"US","region":"US-IN","lat":41.7033,"lng":-86.8212},{"iata":"MGE","name":"Marietta","country":"US","region":"US-GA","lat":33.9154,"lng":-84.5163},{"iata":"MGF","name":"Maring\u00e1","country":"BR","region":"BR-PR","lat":-23.4761,"lng":-52.0162},{"iata":"MGH","name":"Margate","country":"ZA","region":"ZA-NL","lat":-30.8574,"lng":30.343},{"iata":"MGL","name":"M\u00f6nchengladbach","country":"DE","region":"DE-NW","lat":51.2303,"lng":6.5044},{"iata":"MGM","name":"Montgomery","country":"US","region":"US-AL","lat":32.3006,"lng":-86.394},{"iata":"MGN","name":"Magangu\u00e9","country":"CO","region":"CO-BOL","lat":9.2847,"lng":-74.8461},{"iata":"MGQ","name":"Mogadishu","country":"SO","region":"SO-BN","lat":2.0144,"lng":45.3047},{"iata":"MGW","name":"Morgantown","country":"US","region":"US-WV","lat":39.6433,"lng":-79.9176},{"iata":"MGZ","name":"Mkeik","country":"MM","region":"MM-05","lat":12.4398,"lng":98.6215},{"iata":"MHD","name":"Mashhad","country":"IR","region":"IR-09","lat":36.2348,"lng":59.6429},{"iata":"MHG","name":"Mannheim","country":"DE","region":"DE-BW","lat":49.4731,"lng":8.5142},{"iata":"MHH","name":"Marsh Harbour","country":"BS","region":"BS-CO","lat":26.5107,"lng":-77.0843},{"iata":"MHK","name":"Manhattan","country":"US","region":"US-KS","lat":39.141,"lng":-96.6708},{"iata":"MHQ","name":"Mariehamn","country":"FI","region":"FI-01","lat":60.1222,"lng":19.8982},{"iata":"MHR","name":"Sacramento","country":"US","region":"US-CA","lat":38.5547,"lng":-121.298},{"iata":"MHT","name":"Manchester","country":"US","region":"US-NH","lat":42.9326,"lng":-71.4357},{"iata":"MHU","name":"Mount Hotham","country":"AU","region":"AU-VIC","lat":-37.0475,"lng":147.334},{"iata":"MHV","name":"Mojave","country":"US","region":"US-CA","lat":35.0564,"lng":-118.1453},{"iata":"MHZ","name":"Bury Saint Edmunds, Suffolk","country":"GB","region":"GB-ENG","lat":52.3619,"lng":0.4864},{"iata":"MIA","name":"Miami","country":"US","region":"US-FL","lat":25.796,"lng":-80.2898},{"iata":"MIB","name":"Minot","country":"US","region":"US-ND","lat":48.4156,"lng":-101.358},{"iata":"MID","name":"M\u00e9rida","country":"MX","region":"MX-YUC","lat":20.9305,"lng":-89.6455},{"iata":"MIE","name":"Muncie","country":"US","region":"US-IN","lat":40.2423,"lng":-85.3959},{"iata":"MIG","name":"Mianyang (Fucheng)","country":"CN","region":"CN-51","lat":31.4281,"lng":104.741},{"iata":"MII","name":"Mar\u00edlia","country":"BR","region":"BR-SP","lat":-22.1969,"lng":-49.9265},{"iata":"MIK","name":"Mikkeli","country":"FI","region":"FI-04","lat":61.6866,"lng":27.2018},{"iata":"MIM","name":"Merimbula","country":"AU","region":"AU-NSW","lat":-36.9086,"lng":149.901},{"iata":"MIR","name":"Monastir","country":"TN","region":"TN-52","lat":35.7581,"lng":10.7547},{"iata":"MIU","name":"Maiduguri","country":"NG","region":"NG-BO","lat":11.8542,"lng":13.0807},{"iata":"MIV","name":"Millville","country":"US","region":"US-NJ","lat":39.3678,"lng":-75.0722},{"iata":"MJC","name":"Man Airport","country":"CI","region":"CI-MG","lat":7.2721,"lng":-7.5874},{"iata":"MJD","name":"Moenjodaro","country":"PK","region":"PK-SD","lat":27.3352,"lng":68.1431},{"iata":"MJF","name":"Mosj\u00f8en","country":"NO","region":"NO-18","lat":65.784,"lng":13.2149},{"iata":"MJI","name":"Tripoli","country":"LY","region":"LY-TB","lat":32.8918,"lng":13.2879},{"iata":"MJK","name":"Denham","country":"AU","region":"AU-WA","lat":-25.8973,"lng":113.5758},{"iata":"MJL","name":"Mouila","country":"GA","region":"GA-4","lat":-1.8451,"lng":11.0567},{"iata":"MJM","name":"Mbuji Mayi","country":"CD","region":"CD-KE","lat":-6.1212,"lng":23.569},{"iata":"MJN","name":"Mahajanga","country":"MG","region":"MG-M","lat":-15.6668,"lng":46.3512},{"iata":"MJT","name":"Mytilene","country":"GR","region":"GR-K","lat":39.0574,"lng":26.5986},{"iata":"MJZ","name":"Mirny","country":"RU","region":"RU-SA","lat":62.5347,"lng":114.039},{"iata":"MKC","name":"Kansas City","country":"US","region":"US-MO","lat":39.1232,"lng":-94.5928},{"iata":"MKE","name":"Milwaukee","country":"US","region":"US-WI","lat":42.9472,"lng":-87.8966},{"iata":"MKG","name":"Muskegon","country":"US","region":"US-MI","lat":43.1695,"lng":-86.2382},{"iata":"MKK","name":"Kaunakakai","country":"US","region":"US-HI","lat":21.1529,"lng":-157.096},{"iata":"MKL","name":"Jackson","country":"US","region":"US-TN","lat":35.5999,"lng":-88.9156},{"iata":"MKM","name":"Mukah","country":"MY","region":"MY-13","lat":2.8819,"lng":112.0433},{"iata":"MKP","name":"Makemo","country":"PF","region":"PF-U-A","lat":-16.5839,"lng":-143.658},{"iata":"MKQ","name":"Merauke","country":"ID","region":"ID-PS","lat":-8.5239,"lng":140.4197},{"iata":"MKR","name":"Meekatharra Airport","country":"AU","region":"AU-WA","lat":-26.6117,"lng":118.548},{"iata":"MKU","name":"Makokou","country":"GA","region":"GA-6","lat":0.5792,"lng":12.8909},{"iata":"MKW","name":"Manokwari","country":"ID","region":"ID-PB","lat":-0.8918,"lng":134.049},{"iata":"MKY","name":"Mackay","country":"AU","region":"AU-QLD","lat":-21.1708,"lng":149.1826},{"iata":"MKZ","name":"Malacca","country":"MY","region":"MY-04","lat":2.2656,"lng":102.2528},{"iata":"MLA","name":"Valletta","country":"MT","region":"MT-25","lat":35.8459,"lng":14.4915},{"iata":"MLB","name":"Melbourne","country":"US","region":"US-FL","lat":28.102,"lng":-80.6411},{"iata":"MLC","name":"Mc Alester","country":"US","region":"US-OK","lat":34.8824,"lng":-95.7835},{"iata":"MLE","name":"Mal\u00e9","country":"MV","region":"MV-MLE","lat":4.1918,"lng":73.5291},{"iata":"MLG","name":"Malang","country":"ID","region":"ID-JI","lat":-7.9291,"lng":112.7142},{"iata":"MLI","name":"Moline","country":"US","region":"US-IL","lat":41.4485,"lng":-90.5075},{"iata":"MLM","name":"Morelia","country":"MX","region":"MX-MIC","lat":19.8499,"lng":-101.025},{"iata":"MLN","name":"Melilla","country":"ES","region":"ES-ML","lat":35.2798,"lng":-2.9563},{"iata":"MLS","name":"Miles City","country":"US","region":"US-MT","lat":46.4273,"lng":-105.8854},{"iata":"MLU","name":"Monroe","country":"US","region":"US-LA","lat":32.5109,"lng":-92.0377},{"iata":"MLW","name":"Monrovia","country":"LR","region":"LR-MO","lat":6.2891,"lng":-10.7587},{"iata":"MLX","name":"Malatya","country":"TR","region":"TR-44","lat":38.4353,"lng":38.091},{"iata":"MMB","name":"\u014czora","country":"JP","region":"JP-01","lat":43.8806,"lng":144.164},{"iata":"MMD","name":"Minamidaito","country":"JP","region":"JP-47","lat":25.8465,"lng":131.263},{"iata":"MME","name":"Darlington, Durham","country":"GB","region":"GB-ENG","lat":54.5092,"lng":-1.4294},{"iata":"MMG","name":"Mount Magnet Airport","country":"AU","region":"AU-WA","lat":-28.1161,"lng":117.842},{"iata":"MMJ","name":"Matsumoto","country":"JP","region":"JP-20","lat":36.1668,"lng":137.923},{"iata":"MMK","name":"Murmansk","country":"RU","region":"RU-MUR","lat":68.7817,"lng":32.7508},{"iata":"MMO","name":"Vila do Maio","country":"CV","region":"CV-S","lat":15.1559,"lng":-23.2137},{"iata":"MMT","name":"Eastover","country":"US","region":"US-SC","lat":33.9208,"lng":-80.8013},{"iata":"MMU","name":"Morristown","country":"US","region":"US-NJ","lat":40.7991,"lng":-74.4149},{"iata":"MMX","name":"Malm\u00f6","country":"SE","region":"SE-M","lat":55.5356,"lng":13.3763},{"iata":"MMY","name":"Miyakojima","country":"JP","region":"JP-47","lat":24.7828,"lng":125.295},{"iata":"MMZ","name":"Maymana","country":"AF","region":"AF-FYB","lat":35.9308,"lng":64.7609},{"iata":"MNC","name":"Nacala","country":"MZ","region":"MZ-N","lat":-14.4882,"lng":40.7122},{"iata":"MNG","name":"Maningrida","country":"AU","region":"AU-NT","lat":-12.0561,"lng":134.234},{"iata":"MNH","name":"Al Masna'ah","country":"OM","region":"OM-BA","lat":23.6406,"lng":57.4875},{"iata":"MNI","name":"Gerald's Park","country":"MS","region":"MS-SP","lat":16.7918,"lng":-62.1932},{"iata":"MNJ","name":"Mananjary","country":"MG","region":"MG-F","lat":-21.2018,"lng":48.3583},{"iata":"MNL","name":"Manila (Pasay)","country":"PH","region":"PH-00","lat":14.5086,"lng":121.02},{"iata":"MNR","name":"Mongu","country":"ZM","region":"ZM-01","lat":-15.2545,"lng":23.1623},{"iata":"MNX","name":"Manicor\u00e9","country":"BR","region":"BR-AM","lat":-5.8114,"lng":-61.2783},{"iata":"MNZ","name":"Manassas","country":"US","region":"US-VA","lat":38.7214,"lng":-77.5154},{"iata":"MOA","name":"Moa","country":"CU","region":"CU-11","lat":20.6539,"lng":-74.9222},{"iata":"MOB","name":"Mobile","country":"US","region":"US-AL","lat":30.6912,"lng":-88.2428},{"iata":"MOC","name":"Montes Claros","country":"BR","region":"BR-MG","lat":-16.7069,"lng":-43.8189},{"iata":"MOD","name":"Modesto","country":"US","region":"US-CA","lat":37.6258,"lng":-120.954},{"iata":"MOE","name":"Momeik Airport","country":"MM","region":"MM-17","lat":23.0925,"lng":96.6453},{"iata":"MOG","name":"Mong Hsat","country":"MM","region":"MM-17","lat":20.5168,"lng":99.2568},{"iata":"MOL","name":"\u00c5r\u00f8","country":"NO","region":"NO-15","lat":62.7447,"lng":7.2625},{"iata":"MON","name":"Mount Cook Airport","country":"NZ","region":"NZ-CAN","lat":-43.765,"lng":170.133},{"iata":"MOQ","name":"Morondava","country":"MG","region":"MG-U","lat":-20.2847,"lng":44.3176},{"iata":"MOT","name":"Minot","country":"US","region":"US-ND","lat":48.258,"lng":-101.2791},{"iata":"MOV","name":"Moranbah","country":"AU","region":"AU-QLD","lat":-22.0578,"lng":148.077},{"iata":"MOZ","name":"Moorea-Maiao","country":"PF","region":"PF-U-A","lat":-17.4898,"lng":-149.7618},{"iata":"MPA","name":"Mpacha","country":"NA","region":"NA-CA","lat":-17.6343,"lng":24.1767},{"iata":"MPH","name":"Caticlan","country":"PH","region":"PH-AKL","lat":11.9245,"lng":121.954},{"iata":"MPL","name":"Montpellier/M\u00e9diterran\u00e9e","country":"FR","region":"FR-OCC","lat":43.5762,"lng":3.963},{"iata":"MPM","name":"Maputo","country":"MZ","region":"MZ-MPM","lat":-25.9208,"lng":32.5726},{"iata":"MPN","name":"Mount Pleasant","country":"FK","region":"FK-U-A","lat":-51.8226,"lng":-58.4458},{"iata":"MPV","name":"Barre/Montpelier","country":"US","region":"US-VT","lat":44.2035,"lng":-72.5623},{"iata":"MPW","name":"Mariupol","country":"UA","region":"UA-14","lat":47.0761,"lng":37.4496},{"iata":"MPY","name":"Maripasoula","country":"GF","region":"GF-SL","lat":3.6559,"lng":-54.0394},{"iata":"MQF","name":"Magnitogorsk","country":"RU","region":"RU-BA","lat":53.392,"lng":58.7552},{"iata":"MQH","name":"Mina\u00e7u","country":"BR","region":"BR-GO","lat":-13.5491,"lng":-48.1953},{"iata":"MQJ","name":"Khonuu","country":"RU","region":"RU-SA","lat":66.4509,"lng":143.2616},{"iata":"MQL","name":"Mildura","country":"AU","region":"AU-VIC","lat":-34.2292,"lng":142.086},{"iata":"MQM","name":"Mardin","country":"TR","region":"TR-47","lat":37.2233,"lng":40.6317},{"iata":"MQN","name":"Mo i Rana","country":"NO","region":"NO-18","lat":66.3639,"lng":14.3014},{"iata":"MQP","name":"Mbombela","country":"ZA","region":"ZA-MP","lat":-25.3833,"lng":31.1053},{"iata":"MQQ","name":"Moundou","country":"TD","region":"TD-LO","lat":8.6285,"lng":16.0742},{"iata":"MQS","name":"Lovell","country":"VC","region":"VC-06","lat":12.8879,"lng":-61.1802},{"iata":"MQT","name":"Gwinn","country":"US","region":"US-MI","lat":46.3515,"lng":-87.3959},{"iata":"MQU","name":"Mariquita","country":"CO","region":"CO-TOL","lat":5.2126,"lng":-74.8836},{"iata":"MQX","name":"Mekele","country":"ET","region":"ET-TI","lat":13.4674,"lng":39.5335},{"iata":"MQY","name":"Smyrna","country":"US","region":"US-TN","lat":36.009,"lng":-86.5201},{"iata":"MRB","name":"Martinsburg","country":"US","region":"US-WV","lat":39.4019,"lng":-77.9846},{"iata":"MRD","name":"M\u00e9rida","country":"VE","region":"VE-L","lat":8.5821,"lng":-71.161},{"iata":"MRE","name":"Masai Mara","country":"KE","region":"KE-700","lat":-1.4061,"lng":35.0081},{"iata":"MRG","name":"Mareeba","country":"AU","region":"AU-QLD","lat":-17.0703,"lng":145.4242},{"iata":"MRI","name":"Anchorage","country":"US","region":"US-AK","lat":61.2128,"lng":-149.844},{"iata":"MRO","name":"Masterton","country":"NZ","region":"NZ-WGN","lat":-40.9746,"lng":175.6345},{"iata":"MRQ","name":"Gasan","country":"PH","region":"PH-MAD","lat":13.361,"lng":121.826},{"iata":"MRR","name":"Macar\u00e1","country":"EC","region":"EC-L","lat":-4.3782,"lng":-79.941},{"iata":"MRS","name":"Marignane, Bouches-du-Rh\u00f4ne","country":"FR","region":"FR-PAC","lat":43.4381,"lng":5.2125},{"iata":"MRU","name":"Plaine Magnien","country":"MU","region":"MU-GP","lat":-20.4302,"lng":57.6836},{"iata":"MRV","name":"Mineralnyye Vody","country":"RU","region":"RU-STA","lat":44.2251,"lng":43.0819},{"iata":"MRW","name":"R\u00f8dby","country":"DK","region":"DK-85","lat":54.6994,"lng":11.4382},{"iata":"MRX","name":"Mahshahr","country":"IR","region":"IR-06","lat":30.5562,"lng":49.1519},{"iata":"MRY","name":"Monterey","country":"US","region":"US-CA","lat":36.5868,"lng":-121.8442},{"iata":"MRZ","name":"Moree","country":"AU","region":"AU-NSW","lat":-29.4989,"lng":149.845},{"iata":"MSH","name":"Masirah","country":"OM","region":"OM-SH","lat":20.6754,"lng":58.8905},{"iata":"MSJ","name":"Misawa","country":"JP","region":"JP-02","lat":40.7032,"lng":141.368},{"iata":"MSL","name":"Muscle Shoals","country":"US","region":"US-AL","lat":34.7451,"lng":-87.613},{"iata":"MSN","name":"Madison","country":"US","region":"US-WI","lat":43.1399,"lng":-89.3375},{"iata":"MSO","name":"Missoula","country":"US","region":"US-MT","lat":46.9158,"lng":-114.0911},{"iata":"MSP","name":"Minneapolis","country":"US","region":"US-MN","lat":44.8801,"lng":-93.2217},{"iata":"MSQ","name":"Minsk","country":"BY","region":"BY-MI","lat":53.8881,"lng":28.04},{"iata":"MSR","name":"Mu\u015f","country":"TR","region":"TR-49","lat":38.7478,"lng":41.6612},{"iata":"MSS","name":"Massena","country":"US","region":"US-NY","lat":44.9362,"lng":-74.8443},{"iata":"MST","name":"Maastricht","country":"NL","region":"NL-LI","lat":50.9111,"lng":5.7694},{"iata":"MSU","name":"Maseru(Mazenod)","country":"LS","region":"LS-A","lat":-29.4563,"lng":27.5545},{"iata":"MSW","name":"Massawa","country":"ER","region":"ER-SK","lat":15.67,"lng":39.3701},{"iata":"MSY","name":"New Orleans","country":"US","region":"US-LA","lat":29.9934,"lng":-90.2647},{"iata":"MSZ","name":"Mo\u00e7\u00e2medes","country":"AO","region":"AO-NAM","lat":-15.2612,"lng":12.1468},{"iata":"MTC","name":"Mount Clemens","country":"US","region":"US-MI","lat":42.6135,"lng":-82.8369},{"iata":"MTH","name":"Marathon","country":"US","region":"US-FL","lat":24.726,"lng":-81.0514},{"iata":"MTJ","name":"Montrose","country":"US","region":"US-CO","lat":38.5098,"lng":-107.894},{"iata":"MTN","name":"Baltimore","country":"US","region":"US-MD","lat":39.3257,"lng":-76.4138},{"iata":"MTR","name":"Monter\u00eda","country":"CO","region":"CO-COR","lat":8.8237,"lng":-75.8258},{"iata":"MTS","name":"Manzini","country":"SZ","region":"SZ-MA","lat":-26.5289,"lng":31.3076},{"iata":"MTT","name":"Cosoleacaque","country":"MX","region":"MX-VER","lat":18.1034,"lng":-94.5807},{"iata":"MTY","name":"Monterrey","country":"MX","region":"MX-NLE","lat":25.7785,"lng":-100.107},{"iata":"MTZ","name":"Masada","country":"IL","region":"IL-D","lat":31.3282,"lng":35.3886},{"iata":"MUA","name":"Munda","country":"SB","region":"SB-WE","lat":-8.328,"lng":157.263},{"iata":"MUB","name":"Maun","country":"BW","region":"BW-NW","lat":-19.9705,"lng":23.4314},{"iata":"MUC","name":"Munich","country":"DE","region":"DE-BY","lat":48.3538,"lng":11.7861},{"iata":"MUD","name":"Mueda","country":"MZ","region":"MZ-P","lat":-11.6729,"lng":39.5631},{"iata":"MUE","name":"Waimea (Kamuela)","country":"US","region":"US-HI","lat":20.0013,"lng":-155.668},{"iata":"MUH","name":"Marsa Matruh","country":"EG","region":"EG-MT","lat":31.3243,"lng":27.2223},{"iata":"MUI","name":"Fort Indiantown Gap(Annville)","country":"US","region":"US-PA","lat":40.4352,"lng":-76.5687},{"iata":"MUN","name":"Matur\u00edn","country":"VE","region":"VE-N","lat":9.749,"lng":-63.1533},{"iata":"MUO","name":"Mountain Home","country":"US","region":"US-ID","lat":43.0436,"lng":-115.872},{"iata":"MUR","name":"Marudi","country":"MY","region":"MY-13","lat":4.1787,"lng":114.3303},{"iata":"MUW","name":"Ghriss","country":"DZ","region":"DZ-29","lat":35.2077,"lng":0.1471},{"iata":"MUX","name":"Multan","country":"PK","region":"PK-PB","lat":30.2032,"lng":71.4191},{"iata":"MVA","name":"Myvatn","country":"IS","region":"IS-6","lat":65.6558,"lng":-16.9181},{"iata":"MVB","name":"Franceville","country":"GA","region":"GA-2","lat":-1.6562,"lng":13.438},{"iata":"MVD","name":"Ciudad de la Costa","country":"UY","region":"UY-CA","lat":-34.8356,"lng":-56.0265},{"iata":"MVF","name":"Mossor\u00f3","country":"BR","region":"BR-RN","lat":-5.2019,"lng":-37.3643},{"iata":"MVP","name":"Mit\u00fa","country":"CO","region":"CO-VAU","lat":1.2537,"lng":-70.2339},{"iata":"MVQ","name":"Mogilev","country":"BY","region":"BY-MA","lat":53.9549,"lng":30.0951},{"iata":"MVR","name":"Maroua","country":"CM","region":"CM-EN","lat":10.4514,"lng":14.2574},{"iata":"MVT","name":"Mataiva Airport","country":"PF","region":"PF-U-A","lat":-14.8681,"lng":-148.717},{"iata":"MVZ","name":"Masvingo","country":"ZW","region":"ZW-MV","lat":-20.0553,"lng":30.8591},{"iata":"MWA","name":"Marion","country":"US","region":"US-IL","lat":37.7512,"lng":-89.0166},{"iata":"MWD","name":"Mianwali","country":"PK","region":"PK-PB","lat":32.5631,"lng":71.5707},{"iata":"MWE","name":"Merowe","country":"SD","region":"SD-01","lat":18.4433,"lng":31.8433},{"iata":"MWH","name":"Moses Lake","country":"US","region":"US-WA","lat":47.2077,"lng":-119.32},{"iata":"MWL","name":"Mineral Wells","country":"US","region":"US-TX","lat":32.7816,"lng":-98.0602},{"iata":"MWX","name":"Muan (Piseo-ri)","country":"KR","region":"KR-46","lat":34.9914,"lng":126.3828},{"iata":"MWZ","name":"Mwanza","country":"TZ","region":"TZ-18","lat":-2.4466,"lng":32.936},{"iata":"MXF","name":"Montgomery","country":"US","region":"US-AL","lat":32.3829,"lng":-86.3658},{"iata":"MXI","name":"Mati","country":"PH","region":"PH-DAO","lat":6.9491,"lng":126.2737},{"iata":"MXJ","name":"Minna","country":"NG","region":"NG-NI","lat":9.6522,"lng":6.4623},{"iata":"MXL","name":"Mexicali","country":"MX","region":"MX-BCN","lat":32.6306,"lng":-115.2428},{"iata":"MXM","name":"Morombe","country":"MG","region":"MG-U","lat":-21.7538,"lng":43.3748},{"iata":"MXN","name":"Morlaix/Ploujean","country":"FR","region":"FR-BRE","lat":48.6032,"lng":-3.8158},{"iata":"MXP","name":"Ferno (VA)","country":"IT","region":"IT-25","lat":45.6306,"lng":8.7281},{"iata":"MXV","name":"M\u00f6r\u00f6n","country":"MN","region":"MN-041","lat":49.6637,"lng":100.1},{"iata":"MXX","name":"Mora","country":"SE","region":"SE-W","lat":60.9579,"lng":14.5114},{"iata":"MYA","name":"Moruya","country":"AU","region":"AU-NSW","lat":-35.8978,"lng":150.144},{"iata":"MYC","name":"Maracay","country":"VE","region":"VE-D","lat":10.25,"lng":-67.6494},{"iata":"MYD","name":"Malindi","country":"KE","region":"KE-300","lat":-3.2293,"lng":40.1017},{"iata":"MYE","name":"Miyakejima","country":"JP","region":"JP-13","lat":34.0736,"lng":139.56},{"iata":"MYG","name":"Abraham Bay Settlement","country":"BS","region":"BS-MG","lat":22.3795,"lng":-73.0135},{"iata":"MYJ","name":"Matsuyama","country":"JP","region":"JP-38","lat":33.8269,"lng":132.7001},{"iata":"MYL","name":"McCall","country":"US","region":"US-ID","lat":44.8888,"lng":-116.1011},{"iata":"MYP","name":"Mary","country":"TM","region":"TM-M","lat":37.6235,"lng":61.8957},{"iata":"MYQ","name":"Mysore","country":"IN","region":"IN-KA","lat":12.2298,"lng":76.6537},{"iata":"MYR","name":"Myrtle Beach","country":"US","region":"US-SC","lat":33.6797,"lng":-78.9283},{"iata":"MYT","name":"Myitkyina","country":"MM","region":"MM-11","lat":25.3836,"lng":97.3519},{"iata":"MYU","name":"Mekoryuk","country":"US","region":"US-AK","lat":60.3723,"lng":-166.2698},{"iata":"MYV","name":"Marysville","country":"US","region":"US-CA","lat":39.0978,"lng":-121.57},{"iata":"MYW","name":"Mtwara","country":"TZ","region":"TZ-17","lat":-10.3362,"lng":40.182},{"iata":"MYY","name":"Miri","country":"MY","region":"MY-13","lat":4.322,"lng":113.987},{"iata":"MZB","name":"Moc\u00edmboa da Praia","country":"MZ","region":"MZ-P","lat":-11.3618,"lng":40.3549},{"iata":"MZG","name":"Huxi","country":"TW","region":"TW-PEN","lat":23.5687,"lng":119.628},{"iata":"MZI","name":"S\u00e9var\u00e9","country":"ML","region":"ML-5","lat":14.5128,"lng":-4.0796},{"iata":"MZL","name":"Manizales","country":"CO","region":"CO-CAL","lat":5.0296,"lng":-75.4647},{"iata":"MZO","name":"Manzanillo","country":"CU","region":"CU-12","lat":20.2886,"lng":-77.0875},{"iata":"MZQ","name":"Mkuze","country":"ZA","region":"ZA-NL","lat":-27.6261,"lng":32.0443},{"iata":"MZR","name":"Mazar-i-Sharif","country":"AF","region":"AF-BAL","lat":36.7041,"lng":67.2105},{"iata":"MZS","name":"Moradabad","country":"IN","region":"IN-UP","lat":28.8175,"lng":78.9219},{"iata":"MZT","name":"Mazatl\u00e0n","country":"MX","region":"MX-SIN","lat":23.1628,"lng":-106.2645},{"iata":"MZU","name":"Muzaffarpur","country":"IN","region":"IN-BR","lat":26.1191,"lng":85.3137},{"iata":"MZV","name":"Mulu","country":"MY","region":"MY-13","lat":4.0483,"lng":114.805},{"iata":"MZW","name":"Mecheria","country":"DZ","region":"DZ-45","lat":33.5359,"lng":-0.2424},{"iata":"NAA","name":"Narrabri","country":"AU","region":"AU-NSW","lat":-30.3192,"lng":149.827},{"iata":"NAG","name":"Nagpur","country":"IN","region":"IN-MM","lat":21.0922,"lng":79.0472},{"iata":"NAH","name":"Tabukan Utara, Sangihe Islands","country":"ID","region":"ID-SA","lat":3.6848,"lng":125.5272},{"iata":"NAJ","name":"Nakhchivan","country":"AZ","region":"AZ-NX","lat":39.1888,"lng":45.4584},{"iata":"NAK","name":"Chaloem Phra Kiat","country":"TH","region":"TH-30","lat":14.9495,"lng":102.313},{"iata":"NAL","name":"Nalchik","country":"RU","region":"RU-KB","lat":43.5129,"lng":43.6366},{"iata":"NAM","name":"Namniwel","country":"ID","region":"ID-MA","lat":-3.1432,"lng":126.9765},{"iata":"NAN","name":"Nadi","country":"FJ","region":"FJ-W","lat":-17.7618,"lng":177.4378},{"iata":"NAP","name":"Napoli","country":"IT","region":"IT-72","lat":40.886,"lng":14.2908},{"iata":"NAQ","name":"Qaanaaq","country":"GL","region":"GL-AV","lat":77.4886,"lng":-69.3887},{"iata":"NAS","name":"Nassau","country":"BS","region":"BS-NP","lat":25.039,"lng":-77.4662},{"iata":"NAT","name":"Natal","country":"BR","region":"BR-RN","lat":-5.7698,"lng":-35.3666},{"iata":"NAV","name":"Nev\u015fehir","country":"TR","region":"TR-50","lat":38.7719,"lng":34.5345},{"iata":"NAW","name":"Narathiwat Airport","country":"TH","region":"TH-96","lat":6.5199,"lng":101.743},{"iata":"NBC","name":"Nizhnekamsk","country":"RU","region":"RU-TA","lat":55.5647,"lng":52.0925},{"iata":"NBE","name":"Enfidha","country":"TN","region":"TN-51","lat":36.0758,"lng":10.4386},{"iata":"NBG","name":"New Orleans","country":"US","region":"US-LA","lat":29.8253,"lng":-90.035},{"iata":"NBJ","name":"Luanda (\u00cdcolo e Bengo)","country":"AO","region":"AO-LUA","lat":-9.0507,"lng":13.4991},{"iata":"NBO","name":"Nairobi","country":"KE","region":"KE-110","lat":-1.3189,"lng":36.9282},{"iata":"NBS","name":"Baishan","country":"CN","region":"CN-22","lat":42.0669,"lng":127.6022},{"iata":"NBW","name":"Guantanamo Bay Naval Station","country":"CU","region":"CU-14","lat":19.9065,"lng":-75.2071},{"iata":"NBX","name":"Nabire","country":"ID","region":"ID-PT","lat":-3.398,"lng":135.3931},{"iata":"NCA","name":"North Caicos","country":"TC","region":"TC-NC","lat":21.9161,"lng":-71.943},{"iata":"NCE","name":"Nice, Alpes-Maritimes","country":"FR","region":"FR-PAC","lat":43.6584,"lng":7.2159},{"iata":"NCL","name":"Newcastle upon Tyne, Tyne and Wear","country":"GB","region":"GB-ENG","lat":55.038,"lng":-1.6896},{"iata":"NCO","name":"North Kingstown","country":"US","region":"US-RI","lat":41.5971,"lng":-71.4121},{"iata":"NCS","name":"Newcastle","country":"ZA","region":"ZA-NL","lat":-27.7706,"lng":29.9769},{"iata":"NCU","name":"Nukus","country":"UZ","region":"UZ-QR","lat":42.4884,"lng":59.6233},{"iata":"NCY","name":"Annecy","country":"FR","region":"FR-ARA","lat":45.9289,"lng":6.0987},{"iata":"NDB","name":"Nouadhibou","country":"MR","region":"MR-08","lat":20.9324,"lng":-17.0302},{"iata":"NDC","name":"Nanded","country":"IN","region":"IN-MM","lat":19.1833,"lng":77.3167},{"iata":"NDD","name":"Sumbe","country":"AO","region":"AO-CUS","lat":-11.1679,"lng":13.8475},{"iata":"NDG","name":"Qiqihar","country":"CN","region":"CN-23","lat":47.23,"lng":123.9142},{"iata":"NDJ","name":"N'Djamena","country":"TD","region":"TD-ND","lat":12.1337,"lng":15.034},{"iata":"NDR","name":"Al Aaroui","country":"MA","region":"MA-02","lat":34.9888,"lng":-3.0282},{"iata":"NDU","name":"Rundu","country":"NA","region":"NA-KE","lat":-17.9565,"lng":19.7194},{"iata":"NEC","name":"Necochea","country":"AR","region":"AR-B","lat":-38.4907,"lng":-58.8163},{"iata":"NEL","name":"Lakehurst","country":"US","region":"US-NJ","lat":40.0333,"lng":-74.3533},{"iata":"NER","name":"Neryungri","country":"RU","region":"RU-SA","lat":56.9139,"lng":124.914},{"iata":"NEU","name":"Sam Neua Airport","country":"LA","region":"LA-HO","lat":20.4184,"lng":104.067},{"iata":"NEV","name":"Charlestown","country":"KN","region":"KN-U-A","lat":17.2057,"lng":-62.5899},{"iata":"NEW","name":"New Orleans","country":"US","region":"US-LA","lat":30.0424,"lng":-90.0283},{"iata":"NFG","name":"Nefteyugansk","country":"RU","region":"RU-KHM","lat":61.1083,"lng":72.65},{"iata":"NFL","name":"Fallon","country":"US","region":"US-NV","lat":39.4166,"lng":-118.701},{"iata":"NGA","name":"Young Airport","country":"AU","region":"AU-NSW","lat":-34.2556,"lng":148.2471},{"iata":"NGB","name":"Ningbo","country":"CN","region":"CN-33","lat":29.8267,"lng":121.462},{"iata":"NGE","name":"N'Gaound\u00e9r\u00e9","country":"CM","region":"CM-AD","lat":7.357,"lng":13.5592},{"iata":"NGF","name":"Kaneohe","country":"US","region":"US-HI","lat":21.4505,"lng":-157.768},{"iata":"NGO","name":"Tokoname","country":"JP","region":"JP-23","lat":34.8584,"lng":136.805},{"iata":"NGP","name":"Corpus Christi","country":"US","region":"US-TX","lat":27.6926,"lng":-97.2911},{"iata":"NGQ","name":"Shiquanhe","country":"CN","region":"CN-54","lat":32.0979,"lng":80.054},{"iata":"NGS","name":"Nagasaki","country":"JP","region":"JP-42","lat":32.9169,"lng":129.914},{"iata":"NGU","name":"Norfolk","country":"US","region":"US-VA","lat":36.9376,"lng":-76.2893},{"iata":"NHD","name":"Dubai","country":"AE","region":"AE-DU","lat":25.0268,"lng":55.3662},{"iata":"NHK","name":"Patuxent River","country":"US","region":"US-MD","lat":38.286,"lng":-76.4118},{"iata":"NHT","name":"Northolt, Greater London","country":"GB","region":"GB-ENG","lat":51.553,"lng":-0.4182},{"iata":"NHV","name":"Nuku Hiva","country":"PF","region":"PF-U-A","lat":-8.7956,"lng":-140.229},{"iata":"NHZ","name":"Brunswick","country":"US","region":"US-ME","lat":43.8922,"lng":-69.9386},{"iata":"NIM","name":"Niamey","country":"NE","region":"NE-8","lat":13.4815,"lng":2.1836},{"iata":"NIP","name":"Jacksonville","country":"US","region":"US-FL","lat":30.2358,"lng":-81.6806},{"iata":"NIT","name":"Niort/Souch\u00e9","country":"FR","region":"FR-NAQ","lat":46.3135,"lng":-0.3945},{"iata":"NJA","name":"Ayase / Yamato","country":"JP","region":"JP-14","lat":35.4546,"lng":139.45},{"iata":"NJC","name":"Nizhnevartovsk","country":"RU","region":"RU-KHM","lat":60.9493,"lng":76.4836},{"iata":"NJF","name":"Najaf","country":"IQ","region":"IQ-NA","lat":31.9911,"lng":44.405},{"iata":"NJK","name":"El Centro","country":"US","region":"US-CA","lat":32.8292,"lng":-115.672},{"iata":"NKC","name":"Nouakchott","country":"MR","region":"MR-NKC","lat":18.31,"lng":-15.9697},{"iata":"NKG","name":"Nanjing","country":"CN","region":"CN-32","lat":31.735,"lng":118.8659},{"iata":"NKM","name":"Nagoya","country":"JP","region":"JP-23","lat":35.2558,"lng":136.9241},{"iata":"NKT","name":"\u015e\u0131rnak","country":"TR","region":"TR-73","lat":37.3647,"lng":42.0582},{"iata":"NKW","name":"Diego Garcia","country":"IO","region":"IO-U-A","lat":-7.3133,"lng":72.4111},{"iata":"NKX","name":"San Diego","country":"US","region":"US-CA","lat":32.8684,"lng":-117.143},{"iata":"NLA","name":"Ndola","country":"ZM","region":"ZM-08","lat":-12.9651,"lng":28.5156},{"iata":"NLC","name":"Lemoore","country":"US","region":"US-CA","lat":36.333,"lng":-119.952},{"iata":"NLD","name":"Nuevo Laredo","country":"MX","region":"MX-TAM","lat":27.4439,"lng":-99.5705},{"iata":"NLH","name":"Ninglang","country":"CN","region":"CN-53","lat":27.5403,"lng":100.7593},{"iata":"NLI","name":"Nikolayevsk-na-Amure Airport","country":"RU","region":"RU-KHA","lat":53.155,"lng":140.65},{"iata":"NLK","name":"Burnt Pine","country":"NF","region":"NF-U-A","lat":-29.0418,"lng":167.9395},{"iata":"NLO","name":"N'dolo","country":"CD","region":"CD-KN","lat":-4.3267,"lng":15.3275},{"iata":"NLT","name":"Xinyuan","country":"CN","region":"CN-65","lat":43.4318,"lng":83.3786},{"iata":"NLU","name":"Mexico City","country":"MX","region":"MX-MEX","lat":19.7438,"lng":-99.0151},{"iata":"NMA","name":"Namangan","country":"UZ","region":"UZ-NG","lat":40.9846,"lng":71.5578},{"iata":"NMB","name":"Daman","country":"IN","region":"IN-DH","lat":20.4344,"lng":72.8432},{"iata":"NMC","name":"Normans Cay","country":"BS","region":"BS-EX","lat":24.5943,"lng":-76.8202},{"iata":"NMF","name":"Noonu Atoll","country":"MV","region":"MV-25","lat":5.8174,"lng":73.4684},{"iata":"NMI","name":"Navi Mumbai","country":"IN","region":"IN-MM","lat":18.9846,"lng":73.0653},{"iata":"NMS","name":"Namsang","country":"MM","region":"MM-17","lat":20.8905,"lng":97.7359},{"iata":"NNA","name":"Kenitra","country":"MA","region":"MA-04","lat":34.2989,"lng":-6.5959},{"iata":"NNG","name":"Nanning (Jiangnan)","country":"CN","region":"CN-45","lat":22.5981,"lng":108.1819},{"iata":"NNM","name":"Naryan Mar","country":"RU","region":"RU-NEN","lat":67.64,"lng":53.1219},{"iata":"NNT","name":"Nan Airport","country":"TH","region":"TH-55","lat":18.8079,"lng":100.783},{"iata":"NOA","name":"Nowra Hill","country":"AU","region":"AU-NSW","lat":-34.9466,"lng":150.5425},{"iata":"NOB","name":"Nicoya","country":"CR","region":"CR-G","lat":9.9765,"lng":-85.653},{"iata":"NOC","name":"Charlestown","country":"IE","region":"IE-MO","lat":53.9104,"lng":-8.817},{"iata":"NOG","name":"Nogales","country":"MX","region":"MX-SON","lat":31.2258,"lng":-110.9769},{"iata":"NOI","name":"Krymsk","country":"RU","region":"RU-KDA","lat":44.9629,"lng":37.9991},{"iata":"NOJ","name":"Noyabrsk","country":"RU","region":"RU-YAN","lat":63.1833,"lng":75.27},{"iata":"NOP","name":"Sinop","country":"TR","region":"TR-57","lat":42.0183,"lng":35.0718},{"iata":"NOS","name":"Nosy Be","country":"MG","region":"MG-D","lat":-13.3121,"lng":48.3148},{"iata":"NOU","name":"Noum\u00e9a (La Tontouta)","country":"NC","region":"NC-03","lat":-22.0146,"lng":166.213},{"iata":"NOV","name":"Huambo","country":"AO","region":"AO-HUA","lat":-12.8089,"lng":15.7605},{"iata":"NOZ","name":"Novokuznetsk","country":"RU","region":"RU-KEM","lat":53.8114,"lng":86.8772},{"iata":"NPA","name":"Pensacola","country":"US","region":"US-FL","lat":30.3527,"lng":-87.3186},{"iata":"NPE","name":"Napier","country":"NZ","region":"NZ-HKB","lat":-39.4658,"lng":176.87},{"iata":"NPL","name":"New Plymouth","country":"NZ","region":"NZ-TKI","lat":-39.0086,"lng":174.179},{"iata":"NPO","name":"Nanga Pinoh-Borneo Island","country":"ID","region":"ID-KB","lat":-0.3486,"lng":111.7462},{"iata":"NPT","name":"Newport","country":"US","region":"US-RI","lat":41.5322,"lng":-71.281},{"iata":"NQA","name":"Millington","country":"US","region":"US-TN","lat":35.3567,"lng":-89.8703},{"iata":"NQI","name":"Kingsville","country":"US","region":"US-TX","lat":27.5072,"lng":-97.8097},{"iata":"NQN","name":"Neuqu\u00e9n","country":"AR","region":"AR-Q","lat":-38.949,"lng":-68.1557},{"iata":"NQT","name":"Nottingham, Nottinghamshire","country":"GB","region":"GB-ENG","lat":52.92,"lng":-1.0792},{"iata":"NQX","name":"Key West","country":"US","region":"US-FL","lat":24.5758,"lng":-81.6889},{"iata":"NQY","name":"Newquay","country":"GB","region":"GB-ENG","lat":50.4406,"lng":-4.9954},{"iata":"NQZ","name":"Astana","country":"KZ","region":"KZ-AST","lat":51.027,"lng":71.4671},{"iata":"NRA","name":"Narrandera","country":"AU","region":"AU-NSW","lat":-34.7022,"lng":146.512},{"iata":"NRB","name":"Jacksonville","country":"US","region":"US-FL","lat":30.3911,"lng":-81.4247},{"iata":"NRK","name":"Norrk\u00f6ping","country":"SE","region":"SE-E","lat":58.5863,"lng":16.2506},{"iata":"NRN","name":"Weeze","country":"DE","region":"DE-NW","lat":51.6014,"lng":6.1412},{"iata":"NRR","name":"Ceiba","country":"PR","region":"PR-U-A","lat":18.2473,"lng":-65.6398},{"iata":"NRT","name":"Narita","country":"JP","region":"JP-12","lat":35.7686,"lng":140.3887},{"iata":"NSE","name":"Milton","country":"US","region":"US-FL","lat":30.7242,"lng":-87.0219},{"iata":"NSH","name":"Nowshahr","country":"IR","region":"IR-02","lat":36.6643,"lng":51.4627},{"iata":"NSI","name":"Yaound\u00e9","country":"CM","region":"CM-CE","lat":3.7226,"lng":11.5533},{"iata":"NSK","name":"Norilsk","country":"RU","region":"RU-KYA","lat":69.308,"lng":87.3259},{"iata":"NSN","name":"Nelson","country":"NZ","region":"NZ-NSN","lat":-41.2983,"lng":173.221},{"iata":"NST","name":"Nakhon Si Thammarat","country":"TH","region":"TH-80","lat":8.5396,"lng":99.9447},{"iata":"NTB","name":"Notodden","country":"NO","region":"NO-40","lat":59.5651,"lng":9.2132},{"iata":"NTD","name":"Point Mugu","country":"US","region":"US-CA","lat":34.1203,"lng":-119.121},{"iata":"NTE","name":"Nantes","country":"FR","region":"FR-PDL","lat":47.1532,"lng":-1.6107},{"iata":"NTG","name":"Nantong (Tongzhou)","country":"CN","region":"CN-32","lat":32.0736,"lng":120.9801},{"iata":"NTL","name":"Williamtown","country":"AU","region":"AU-NSW","lat":-32.7961,"lng":151.835},{"iata":"NTN","name":"Normanton","country":"AU","region":"AU-QLD","lat":-17.6841,"lng":141.0697},{"iata":"NTQ","name":"Wajima","country":"JP","region":"JP-17","lat":37.2931,"lng":136.962},{"iata":"NTR","name":"Monterrey","country":"MX","region":"MX-NLE","lat":25.8656,"lng":-100.237},{"iata":"NTU","name":"Virginia Beach","country":"US","region":"US-VA","lat":36.8207,"lng":-76.0335},{"iata":"NTX","name":"Ranai-Natuna Besar Island","country":"ID","region":"ID-KR","lat":3.9087,"lng":108.388},{"iata":"NTY","name":"Pilanesberg","country":"ZA","region":"ZA-NW","lat":-25.3338,"lng":27.1734},{"iata":"NUE","name":"Nuremberg","country":"DE","region":"DE-BY","lat":49.4987,"lng":11.0781},{"iata":"NUI","name":"Nuiqsut","country":"US","region":"US-AK","lat":70.21,"lng":-151.006},{"iata":"NUJ","name":"Amirabad","country":"IR","region":"IR-13","lat":35.2116,"lng":48.6534},{"iata":"NUM","name":"Sharma","country":"SA","region":"SA-07","lat":27.9243,"lng":35.2936},{"iata":"NUQ","name":"Mountain View","country":"US","region":"US-CA","lat":37.4161,"lng":-122.049},{"iata":"NUU","name":"Nakuru","country":"KE","region":"KE-700","lat":-0.2984,"lng":36.1592},{"iata":"NUW","name":"Oak Harbor","country":"US","region":"US-WA","lat":48.3518,"lng":-122.656},{"iata":"NUX","name":"Novy Urengoy","country":"RU","region":"RU-YAN","lat":66.0694,"lng":76.5203},{"iata":"NVA","name":"Neiva","country":"CO","region":"CO-HUI","lat":2.9501,"lng":-75.294},{"iata":"NVI","name":"Navoi","country":"UZ","region":"UZ-NW","lat":40.1176,"lng":65.1727},{"iata":"NVS","name":"Marzy, Ni\u00e8vre","country":"FR","region":"FR-BFC","lat":47.0029,"lng":3.1131},{"iata":"NVT","name":"Navegantes","country":"BR","region":"BR-SC","lat":-26.8794,"lng":-48.651},{"iata":"NWA","name":"Fomboni","country":"KM","region":"KM-M","lat":-12.2981,"lng":43.7665},{"iata":"NWI","name":"Norwich, Norfolk","country":"GB","region":"GB-ENG","lat":52.6758,"lng":1.2828},{"iata":"NYA","name":"Nyagan","country":"RU","region":"RU-KHM","lat":62.11,"lng":65.615},{"iata":"NYG","name":"Quantico","country":"US","region":"US-VA","lat":38.5017,"lng":-77.3053},{"iata":"NYI","name":"Sunyani","country":"GH","region":"GH-BO","lat":7.3618,"lng":-2.3288},{"iata":"NYK","name":"Nanyuki","country":"KE","region":"KE-200","lat":-0.0624,"lng":37.041},{"iata":"NYM","name":"Nadym","country":"RU","region":"RU-YAN","lat":65.4809,"lng":72.6989},{"iata":"NYO","name":"Nyk\u00f6ping","country":"SE","region":"SE-D","lat":58.7897,"lng":16.9115},{"iata":"NYT","name":"Naypyitaw","country":"MM","region":"MM-04","lat":19.6235,"lng":96.201},{"iata":"NZC","name":"Nazca","country":"PE","region":"PE-ICA","lat":-14.854,"lng":-74.9615},{"iata":"NZH","name":"Manzhouli","country":"CN","region":"CN-15","lat":49.5667,"lng":117.33},{"iata":"NZL","name":"Zhalantun","country":"CN","region":"CN-15","lat":47.8659,"lng":122.7687},{"iata":"NZY","name":"San Diego","country":"US","region":"US-CA","lat":32.6992,"lng":-117.215},{"iata":"OAG","name":"Orange","country":"AU","region":"AU-NSW","lat":-33.382,"lng":149.1313},{"iata":"OAI","name":"Bagram","country":"AF","region":"AF-PAR","lat":34.9461,"lng":69.265},{"iata":"OAJ","name":"Richlands","country":"US","region":"US-NC","lat":34.8292,"lng":-77.6121},{"iata":"OAK","name":"Oakland","country":"US","region":"US-CA","lat":37.7201,"lng":-122.2212},{"iata":"OAM","name":"Oamaru Airport","country":"NZ","region":"NZ-OTA","lat":-44.97,"lng":171.082},{"iata":"OAX","name":"Oaxaca","country":"MX","region":"MX-OAX","lat":16.9988,"lng":-96.7261},{"iata":"OBF","name":"We\u00dfling","country":"DE","region":"DE-BY","lat":48.0814,"lng":11.2831},{"iata":"OBO","name":"Obihiro","country":"JP","region":"JP-01","lat":42.7333,"lng":143.217},{"iata":"OBS","name":"Lanas, Ard\u00e8che","country":"FR","region":"FR-ARA","lat":44.5444,"lng":4.3722},{"iata":"OCA","name":"Key Largo","country":"US","region":"US-FL","lat":25.3254,"lng":-80.2748},{"iata":"OCC","name":"Coca","country":"EC","region":"EC-D","lat":-0.4629,"lng":-76.9868},{"iata":"OCE","name":"Ocean City","country":"US","region":"US-MD","lat":38.3104,"lng":-75.124},{"iata":"OCJ","name":"Boscobel","country":"JM","region":"JM-05","lat":18.4041,"lng":-76.9698},{"iata":"OCN","name":"Oceanside","country":"US","region":"US-CA","lat":33.2179,"lng":-117.3517},{"iata":"OCS","name":"Corisco Island","country":"GQ","region":"GQ-LI","lat":0.9109,"lng":9.3303},{"iata":"OCV","name":"Oca\u00f1a","country":"CO","region":"CO-NSA","lat":8.3151,"lng":-73.3583},{"iata":"ODB","name":"C\u00f3rdoba","country":"ES","region":"ES-AN","lat":37.842,"lng":-4.8489},{"iata":"ODE","name":"Odense","country":"DK","region":"DK-83","lat":55.4753,"lng":10.3272},{"iata":"ODH","name":"Hook, Hampshire","country":"GB","region":"GB-ENG","lat":51.2341,"lng":-0.9428},{"iata":"ODS","name":"Odesa","country":"UA","region":"UA-51","lat":46.4272,"lng":30.6726},{"iata":"OEC","name":"Oecussi-Ambeno","country":"TL","region":"TL-OE","lat":-9.1984,"lng":124.3379},{"iata":"OER","name":"\u00d6rnsk\u00f6ldsvik","country":"SE","region":"SE-Y","lat":63.4083,"lng":18.99},{"iata":"OFF","name":"Omaha","country":"US","region":"US-NE","lat":41.1193,"lng":-95.9085},{"iata":"OFK","name":"Norfolk","country":"US","region":"US-NE","lat":41.9855,"lng":-97.4351},{"iata":"OGB","name":"Orangeburg","country":"US","region":"US-SC","lat":33.4568,"lng":-80.8595},{"iata":"OGD","name":"Ogden","country":"US","region":"US-UT","lat":41.1959,"lng":-112.012},{"iata":"OGG","name":"Kahului","country":"US","region":"US-HI","lat":20.8963,"lng":-156.4318},{"iata":"OGL","name":"Ogle","country":"GY","region":"GY-DE","lat":6.8059,"lng":-58.1077},{"iata":"OGN","name":"Yonaguni","country":"JP","region":"JP-47","lat":24.4673,"lng":122.9798},{"iata":"OGS","name":"Ogdensburg","country":"US","region":"US-NY","lat":44.6819,"lng":-75.4655},{"iata":"OGU","name":"Ordu","country":"TR","region":"TR-52","lat":40.9669,"lng":38.086},{"iata":"OGX","name":"Ouargla","country":"DZ","region":"DZ-30","lat":31.9172,"lng":5.4128},{"iata":"OGZ","name":"Beslan","country":"RU","region":"RU-SE","lat":43.2051,"lng":44.6066},{"iata":"OHA","name":"RNZAF Base Ohakea","country":"NZ","region":"NZ-MWT","lat":-40.206,"lng":175.388},{"iata":"OHD","name":"Ohrid","country":"MK","region":"MK-003","lat":41.18,"lng":20.7423},{"iata":"OHE","name":"Mohe","country":"CN","region":"CN-23","lat":52.9169,"lng":122.4228},{"iata":"OHO","name":"Okhotsk","country":"RU","region":"RU-KHA","lat":59.4101,"lng":143.0565},{"iata":"OHS","name":"Suhar","country":"OM","region":"OM-BA","lat":24.386,"lng":56.6254},{"iata":"OIM","name":"Izu Oshima","country":"JP","region":"JP-13","lat":34.782,"lng":139.36},{"iata":"OIR","name":"Okushiri Island","country":"JP","region":"JP-01","lat":42.0717,"lng":139.433},{"iata":"OIT","name":"Oita","country":"JP","region":"JP-44","lat":33.4794,"lng":131.737},{"iata":"OKA","name":"Naha","country":"JP","region":"JP-47","lat":26.1924,"lng":127.6398},{"iata":"OKC","name":"Oklahoma City","country":"US","region":"US-OK","lat":35.3934,"lng":-97.5982},{"iata":"OKD","name":"Sapporo","country":"JP","region":"JP-01","lat":43.1174,"lng":141.3813},{"iata":"OKE","name":"Wadomari","country":"JP","region":"JP-46","lat":27.4316,"lng":128.7056},{"iata":"OKI","name":"Okinoshima","country":"JP","region":"JP-32","lat":36.1784,"lng":133.3236},{"iata":"OKJ","name":"Okayama","country":"JP","region":"JP-33","lat":34.7569,"lng":133.855},{"iata":"OKL","name":"Oksibil","country":"ID","region":"ID-PP","lat":-4.9071,"lng":140.6277},{"iata":"OKN","name":"Okondja","country":"GA","region":"GA-2","lat":-0.6652,"lng":13.6731},{"iata":"OKO","name":"Fussa","country":"JP","region":"JP-13","lat":35.7485,"lng":139.348},{"iata":"OKY","name":"Oakey Army Aviation Centre","country":"AU","region":"AU-QLD","lat":-27.4093,"lng":151.7367},{"iata":"OLA","name":"\u00d8rland","country":"NO","region":"NO-50","lat":63.6989,"lng":9.604},{"iata":"OLB","name":"Olbia (SS)","country":"IT","region":"IT-88","lat":40.899,"lng":9.5185},{"iata":"OLF","name":"Wolf Point","country":"US","region":"US-MT","lat":48.0945,"lng":-105.575},{"iata":"OLL","name":"Oyo","country":"CG","region":"CG-14","lat":-1.2267,"lng":15.91},{"iata":"OLM","name":"Olympia","country":"US","region":"US-WA","lat":46.9694,"lng":-122.903},{"iata":"OLS","name":"Nogales","country":"US","region":"US-AZ","lat":31.4177,"lng":-110.848},{"iata":"OLU","name":"Columbus","country":"US","region":"US-NE","lat":41.4481,"lng":-97.3402},{"iata":"OLZ","name":"Olyokminsk","country":"RU","region":"RU-SA","lat":60.4018,"lng":120.4761},{"iata":"OMA","name":"Omaha","country":"US","region":"US-NE","lat":41.3032,"lng":-95.8941},{"iata":"OMB","name":"Omboue","country":"GA","region":"GA-8","lat":-1.5747,"lng":9.2627},{"iata":"OMC","name":"Ormoc City","country":"PH","region":"PH-LEY","lat":11.0577,"lng":124.5656},{"iata":"OMD","name":"Oranjemund","country":"NA","region":"NA-KA","lat":-28.5853,"lng":16.4464},{"iata":"OME","name":"Nome","country":"US","region":"US-AK","lat":64.5122,"lng":-165.445},{"iata":"OMH","name":"Urmia","country":"IR","region":"IR-04","lat":37.6681,"lng":45.0687},{"iata":"OMN","name":"Zomin","country":"UZ","region":"UZ-JI","lat":40.014,"lng":68.411},{"iata":"OMO","name":"Mostar","country":"BA","region":"BA-BIH","lat":43.2825,"lng":17.8461},{"iata":"OMR","name":"Oradea","country":"RO","region":"RO-BH","lat":47.0253,"lng":21.9025},{"iata":"OMS","name":"Omsk","country":"RU","region":"RU-OMS","lat":54.9631,"lng":73.3124},{"iata":"OND","name":"Ondangwa","country":"NA","region":"NA-ON","lat":-17.8782,"lng":15.9526},{"iata":"ONJ","name":"Kitaakita","country":"JP","region":"JP-05","lat":40.1919,"lng":140.371},{"iata":"ONO","name":"Oregon","country":"US","region":"US-OR","lat":44.0198,"lng":-117.0133},{"iata":"ONP","name":"Newport","country":"US","region":"US-OR","lat":44.5804,"lng":-124.058},{"iata":"ONQ","name":"Zonguldak","country":"TR","region":"TR-67","lat":41.5064,"lng":32.0886},{"iata":"ONT","name":"Ontario","country":"US","region":"US-CA","lat":34.056,"lng":-117.601},{"iata":"ONX","name":"Col\u00f3n","country":"PA","region":"PA-3","lat":9.3566,"lng":-79.8674},{"iata":"OOL","name":"Gold Coast","country":"AU","region":"AU-QLD","lat":-28.166,"lng":153.5066},{"iata":"OOM","name":"Cooma","country":"AU","region":"AU-NSW","lat":-36.3004,"lng":148.9724},{"iata":"OPF","name":"Miami","country":"US","region":"US-FL","lat":25.907,"lng":-80.2784},{"iata":"OPO","name":"Porto","country":"PT","region":"PT-13","lat":41.2481,"lng":-8.6814},{"iata":"OPU","name":"Balimo","country":"PG","region":"PG-WPD","lat":-8.05,"lng":142.933},{"iata":"ORA","name":"Or\u00e1n","country":"AR","region":"AR-A","lat":-23.1528,"lng":-64.3292},{"iata":"ORB","name":"\u00d6rebro","country":"SE","region":"SE-T","lat":59.2237,"lng":15.038},{"iata":"ORD","name":"Chicago","country":"US","region":"US-IL","lat":41.9786,"lng":-87.9048},{"iata":"ORF","name":"Norfolk","country":"US","region":"US-VA","lat":36.8953,"lng":-76.201},{"iata":"ORH","name":"Worcester","country":"US","region":"US-MA","lat":42.2673,"lng":-71.8757},{"iata":"ORK","name":"Cork","country":"IE","region":"IE-CO","lat":51.8413,"lng":-8.4911},{"iata":"ORL","name":"Orlando","country":"US","region":"US-FL","lat":28.5455,"lng":-81.3329},{"iata":"ORN","name":"Es-S\u00e9nia","country":"DZ","region":"DZ-31","lat":35.6206,"lng":-0.6225},{"iata":"ORT","name":"Northway","country":"US","region":"US-AK","lat":62.9613,"lng":-141.929},{"iata":"ORU","name":"Oruro","country":"BO","region":"BO-O","lat":-17.9562,"lng":-67.0758},{"iata":"ORY","name":"Paris (Orly, Val-de-Marne)","country":"FR","region":"FR-IDF","lat":48.7295,"lng":2.359},{"iata":"OSD","name":"\u00d6stersund","country":"SE","region":"SE-Z","lat":63.1935,"lng":14.5042},{"iata":"OSH","name":"Oshkosh","country":"US","region":"US-WI","lat":43.9844,"lng":-88.557},{"iata":"OSI","name":"Osijek(Klisa)","country":"HR","region":"HR-14","lat":45.4624,"lng":18.8113},{"iata":"OSL","name":"Oslo (Gardermoen)","country":"NO","region":"NO-32","lat":60.1939,"lng":11.1004},{"iata":"OSM","name":"Mosul","country":"IQ","region":"IQ-NI","lat":36.3058,"lng":43.1474},{"iata":"OSN","name":"Pyeongtaek","country":"KR","region":"KR-41","lat":37.0915,"lng":127.0294},{"iata":"OSR","name":"Mo\u0161nov","country":"CZ","region":"CZ-MO","lat":49.6963,"lng":18.1111},{"iata":"OSS","name":"Osh","country":"KG","region":"KG-O","lat":40.609,"lng":72.7933},{"iata":"OST","name":"Oostende","country":"BE","region":"BE-VWV","lat":51.1998,"lng":2.8747},{"iata":"OSU","name":"Columbus","country":"US","region":"US-OH","lat":40.0798,"lng":-83.073},{"iata":"OSW","name":"Orsk","country":"RU","region":"RU-ORE","lat":51.0725,"lng":58.5956},{"iata":"OTH","name":"North Bend","country":"US","region":"US-OR","lat":43.4171,"lng":-124.246},{"iata":"OTI","name":"Gotalalamo-Morotai Island","country":"ID","region":"ID-MU","lat":2.046,"lng":128.325},{"iata":"OTM","name":"Ottumwa","country":"US","region":"US-IA","lat":41.1064,"lng":-92.4498},{"iata":"OTP","name":"Otopeni","country":"RO","region":"RO-IF","lat":44.5718,"lng":26.1033},{"iata":"OTR","name":"Corredores","country":"CR","region":"CR-P","lat":8.6016,"lng":-82.9688},{"iata":"OTZ","name":"Kotzebue","country":"US","region":"US-AK","lat":66.8847,"lng":-162.599},{"iata":"OUA","name":"Ouagadougou","country":"BF","region":"BF-KAD","lat":12.3532,"lng":-1.5124},{"iata":"OUD","name":"Ahl Angad","country":"MA","region":"MA-02","lat":34.7896,"lng":-1.926},{"iata":"OUE","name":"Ouesso Airport","country":"CG","region":"CG-13","lat":1.616,"lng":16.0379},{"iata":"OUH","name":"Oudtshoorn","country":"ZA","region":"ZA-WC","lat":-33.607,"lng":22.189},{"iata":"OUL","name":"Oulu / Oulunsalo","country":"FI","region":"FI-14","lat":64.9301,"lng":25.3546},{"iata":"OVB","name":"Novosibirsk","country":"RU","region":"RU-NVS","lat":55.0198,"lng":82.6187},{"iata":"OVD","name":"Ran\u00f3n","country":"ES","region":"ES-AS","lat":43.5636,"lng":-6.0346},{"iata":"OVS","name":"Sovetskiy","country":"RU","region":"RU-KHM","lat":61.3266,"lng":63.6019},{"iata":"OWB","name":"Owensboro","country":"US","region":"US-KY","lat":37.7401,"lng":-87.1668},{"iata":"OWD","name":"Norwood","country":"US","region":"US-MA","lat":42.1905,"lng":-71.1729},{"iata":"OXB","name":"Bissau","country":"GW","region":"GW-BS","lat":11.8943,"lng":-15.6536},{"iata":"OXF","name":"Kidlington, Oxfordshire","country":"GB","region":"GB-ENG","lat":51.8369,"lng":-1.32},{"iata":"OXR","name":"Oxnard","country":"US","region":"US-CA","lat":34.2008,"lng":-119.207},{"iata":"OYA","name":"Goya","country":"AR","region":"AR-W","lat":-29.1058,"lng":-59.2189},{"iata":"OYE","name":"Oyem","country":"GA","region":"GA-9","lat":1.5431,"lng":11.5814},{"iata":"OYK","name":"Oiapoque","country":"BR","region":"BR-AP","lat":3.8541,"lng":-51.7971},{"iata":"OYO","name":"Tres Arroyos","country":"AR","region":"AR-B","lat":-38.3869,"lng":-60.3297},{"iata":"OYP","name":"Saint-Georges-de-l'Oyapock","country":"GF","region":"GF-CY","lat":3.8976,"lng":-51.8041},{"iata":"OZC","name":"Ozamiz","country":"PH","region":"PH-MSC","lat":8.1785,"lng":123.842},{"iata":"OZG","name":"Zagora","country":"MA","region":"MA-08","lat":30.2658,"lng":-5.8608},{"iata":"OZH","name":"Zaporizhia","country":"UA","region":"UA-23","lat":47.867,"lng":35.3147},{"iata":"OZP","name":"Mor\u00f3n","country":"ES","region":"ES-AN","lat":37.1749,"lng":-5.6159},{"iata":"OZR","name":"Fort Rucker/Ozark","country":"US","region":"US-AL","lat":31.2757,"lng":-85.7134},{"iata":"OZZ","name":"Ouarzazate","country":"MA","region":"MA-08","lat":30.9391,"lng":-6.9094},{"iata":"PAB","name":"Bilaspur","country":"IN","region":"IN-CT","lat":21.9884,"lng":82.111},{"iata":"PAC","name":"Albrook","country":"PA","region":"PA-8","lat":8.9733,"lng":-79.5556},{"iata":"PAD","name":"B\u00fcren","country":"DE","region":"DE-NW","lat":51.6125,"lng":8.6175},{"iata":"PAE","name":"Everett","country":"US","region":"US-WA","lat":47.9063,"lng":-122.282},{"iata":"PAG","name":"Pagadian","country":"PH","region":"PH-ZAS","lat":7.8256,"lng":123.4596},{"iata":"PAH","name":"Paducah","country":"US","region":"US-KY","lat":37.0608,"lng":-88.7738},{"iata":"PAL","name":"La Dorada","country":"CO","region":"CO-CUN","lat":5.4836,"lng":-74.6574},{"iata":"PAM","name":"Panama City","country":"US","region":"US-FL","lat":30.0696,"lng":-85.5754},{"iata":"PAN","name":"Pattani Airport","country":"TH","region":"TH-94","lat":6.7855,"lng":101.154},{"iata":"PAO","name":"Palo Alto","country":"US","region":"US-CA","lat":37.4611,"lng":-122.115},{"iata":"PAP","name":"Port-au-Prince","country":"HT","region":"HT-OU","lat":18.58,"lng":-72.2926},{"iata":"PAQ","name":"Palmer","country":"US","region":"US-AK","lat":61.5949,"lng":-149.089},{"iata":"PAT","name":"Patna","country":"IN","region":"IN-BR","lat":25.5913,"lng":85.088},{"iata":"PAV","name":"Paulo Afonso","country":"BR","region":"BR-BA","lat":-9.4009,"lng":-38.2506},{"iata":"PAX","name":"Port-de-Paix","country":"HT","region":"HT-NO","lat":19.934,"lng":-72.848},{"iata":"PAZ","name":"Poza Rica","country":"MX","region":"MX-VER","lat":20.6027,"lng":-97.4608},{"iata":"PBC","name":"Puebla","country":"MX","region":"MX-PUE","lat":19.1585,"lng":-98.3716},{"iata":"PBD","name":"Porbandar","country":"IN","region":"IN-GJ","lat":21.6495,"lng":69.6564},{"iata":"PBF","name":"Pine Bluff","country":"US","region":"US-AR","lat":34.1741,"lng":-91.9356},{"iata":"PBG","name":"Plattsburgh","country":"US","region":"US-NY","lat":44.6509,"lng":-73.4681},{"iata":"PBH","name":"Paro","country":"BT","region":"BT-11","lat":27.4032,"lng":89.4246},{"iata":"PBI","name":"West Palm Beach","country":"US","region":"US-FL","lat":26.6832,"lng":-80.0956},{"iata":"PBL","name":"Puerto Cabello","country":"VE","region":"VE-G","lat":10.4805,"lng":-68.073},{"iata":"PBM","name":"Paramaribo","country":"SR","region":"SR-PR","lat":5.4528,"lng":-55.1878},{"iata":"PBN","name":"Port Amboim","country":"AO","region":"AO-CUS","lat":-10.722,"lng":13.7655},{"iata":"PBO","name":"Paraburdoo","country":"AU","region":"AU-WA","lat":-23.1711,"lng":117.745},{"iata":"PBR","name":"Puerto Barrios","country":"GT","region":"GT-IZ","lat":15.7309,"lng":-88.5838},{"iata":"PBU","name":"Putao","country":"MM","region":"MM-11","lat":27.3299,"lng":97.4263},{"iata":"PBZ","name":"Plettenberg Bay","country":"ZA","region":"ZA-WC","lat":-34.0882,"lng":23.3287},{"iata":"PCF","name":"Potchefstroom","country":"ZA","region":"ZA-NW","lat":-26.671,"lng":27.0819},{"iata":"PCL","name":"Pucallpa","country":"PE","region":"PE-UCA","lat":-8.3781,"lng":-74.5745},{"iata":"PCP","name":"S\u00e3o Tom\u00e9 & Pr\u00edncipe","country":"ST","region":"ST-P","lat":1.6612,"lng":7.4111},{"iata":"PCR","name":"Puerto Carre\u00f1o","country":"CO","region":"CO-VID","lat":6.1847,"lng":-67.4932},{"iata":"PDA","name":"Puerto In\u00edrida","country":"CO","region":"CO-GUA","lat":3.8535,"lng":-67.9062},{"iata":"PDG","name":"Padang (Katapiang)","country":"ID","region":"ID-SB","lat":-0.786,"lng":100.2804},{"iata":"PDK","name":"Atlanta","country":"US","region":"US-GA","lat":33.8763,"lng":-84.3021},{"iata":"PDL","name":"Ponta Delgada","country":"PT","region":"PT-20","lat":37.7412,"lng":-25.6979},{"iata":"PDO","name":"Talang Gudang-Sumatra Island","country":"ID","region":"ID-SS","lat":-3.2861,"lng":103.88},{"iata":"PDP","name":"Punta del Este","country":"UY","region":"UY-MA","lat":-34.8551,"lng":-55.0943},{"iata":"PDS","name":"Piedras Negras","country":"MX","region":"MX-COA","lat":28.6279,"lng":-100.5352},{"iata":"PDT","name":"Pendleton","country":"US","region":"US-OR","lat":45.6951,"lng":-118.841},{"iata":"PDU","name":"Paysand\u00fa","country":"UY","region":"UY-PA","lat":-32.3633,"lng":-58.0619},{"iata":"PDV","name":"Plovdiv","country":"BG","region":"BG-16","lat":42.0678,"lng":24.8508},{"iata":"PDX","name":"Portland","country":"US","region":"US-OR","lat":45.5887,"lng":-122.598},{"iata":"PED","name":"Pardubice","country":"CZ","region":"CZ-PA","lat":50.015,"lng":15.7398},{"iata":"PEE","name":"Perm","country":"RU","region":"RU-PER","lat":57.9145,"lng":56.0212},{"iata":"PEG","name":"Perugia (PG)","country":"IT","region":"IT-55","lat":43.0959,"lng":12.5132},{"iata":"PEH","name":"Pehuaj\u00f3","country":"AR","region":"AR-B","lat":-35.8446,"lng":-61.8576},{"iata":"PEI","name":"Pereira","country":"CO","region":"CO-RIS","lat":4.8127,"lng":-75.7395},{"iata":"PEK","name":"Beijing","country":"CN","region":"CN-11","lat":40.0773,"lng":116.5967},{"iata":"PEM","name":"Puerto Maldonado","country":"PE","region":"PE-MDD","lat":-12.6136,"lng":-69.2286},{"iata":"PEN","name":"Penang","country":"MY","region":"MY-07","lat":5.2963,"lng":100.2762},{"iata":"PER","name":"Perth","country":"AU","region":"AU-WA","lat":-31.9403,"lng":115.967},{"iata":"PES","name":"Petrozavodsk","country":"RU","region":"RU-KR","lat":61.8852,"lng":34.1547},{"iata":"PET","name":"Pelotas","country":"BR","region":"BR-RS","lat":-31.7172,"lng":-52.3278},{"iata":"PEV","name":"P\u00e9cs","country":"HU","region":"HU-BA","lat":45.9889,"lng":18.242},{"iata":"PEW","name":"Peshawar","country":"PK","region":"PK-KP","lat":33.9939,"lng":71.5146},{"iata":"PEX","name":"Pechora","country":"RU","region":"RU-KO","lat":65.1211,"lng":57.1308},{"iata":"PEZ","name":"Penza","country":"RU","region":"RU-PNZ","lat":53.1106,"lng":45.0211},{"iata":"PFB","name":"Passo Fundo","country":"BR","region":"BR-RS","lat":-28.244,"lng":-52.3278},{"iata":"PFO","name":"Paphos","country":"CY","region":"CY-06","lat":34.718,"lng":32.4857},{"iata":"PGA","name":"Page","country":"US","region":"US-AZ","lat":36.9242,"lng":-111.4477},{"iata":"PGD","name":"Punta Gorda","country":"US","region":"US-FL","lat":26.9202,"lng":-81.9905},{"iata":"PGF","name":"Perpignan/Rivesaltes","country":"FR","region":"FR-OCC","lat":42.7404,"lng":2.8707},{"iata":"PGH","name":"Pantnagar","country":"IN","region":"IN-UP","lat":29.0334,"lng":79.4737},{"iata":"PGK","name":"Pangkal Pinang","country":"ID","region":"ID-BB","lat":-2.1622,"lng":106.139},{"iata":"PGU","name":"Khiyaroo","country":"IR","region":"IR-18","lat":27.3796,"lng":52.7377},{"iata":"PGV","name":"Greenville","country":"US","region":"US-NC","lat":35.6355,"lng":-77.3843},{"iata":"PGX","name":"P\u00e9rigueux/Bassillac","country":"FR","region":"FR-NAQ","lat":45.1981,"lng":0.8156},{"iata":"PGZ","name":"Ponta Grossa","country":"BR","region":"BR-PR","lat":-25.1845,"lng":-50.1438},{"iata":"PHB","name":"Parna\u00edba","country":"BR","region":"BR-PI","lat":-2.8937,"lng":-41.732},{"iata":"PHC","name":"Port Harcourt","country":"NG","region":"NG-RI","lat":5.0155,"lng":6.9496},{"iata":"PHE","name":"Port Hedland","country":"AU","region":"AU-WA","lat":-20.3828,"lng":118.6298},{"iata":"PHF","name":"Newport News","country":"US","region":"US-VA","lat":37.1319,"lng":-76.493},{"iata":"PHG","name":"Port Harcourt","country":"NG","region":"NG-RI","lat":4.8461,"lng":7.0214},{"iata":"PHH","name":"Pokhara","country":"NP","region":"NP-P4","lat":28.1838,"lng":84.0147},{"iata":"PHL","name":"Philadelphia","country":"US","region":"US-PA","lat":39.8719,"lng":-75.2411},{"iata":"PHS","name":"Phitsanulok","country":"TH","region":"TH-65","lat":16.7829,"lng":100.279},{"iata":"PHW","name":"Phalaborwa","country":"ZA","region":"ZA-NP","lat":-23.9372,"lng":31.1554},{"iata":"PHX","name":"Phoenix","country":"US","region":"US-AZ","lat":33.4353,"lng":-112.0059},{"iata":"PHY","name":"Phetchabun Airport","country":"TH","region":"TH-67","lat":16.676,"lng":101.195},{"iata":"PIA","name":"Peoria","country":"US","region":"US-IL","lat":40.6638,"lng":-89.6926},{"iata":"PIB","name":"Moselle","country":"US","region":"US-MS","lat":31.4671,"lng":-89.3371},{"iata":"PIE","name":"Pinellas Park","country":"US","region":"US-FL","lat":27.9102,"lng":-82.6874},{"iata":"PIF","name":"Pingtung","country":"TW","region":"TW-PIF","lat":22.7002,"lng":120.482},{"iata":"PIH","name":"Pocatello","country":"US","region":"US-ID","lat":42.9098,"lng":-112.596},{"iata":"PIK","name":"Prestwick, South Ayrshire","country":"GB","region":"GB-SCT","lat":55.5015,"lng":-4.5772},{"iata":"PIL","name":"Pilar","country":"PY","region":"PY-12","lat":-26.882,"lng":-58.3191},{"iata":"PIO","name":"Pisco","country":"PE","region":"PE-ICA","lat":-13.7449,"lng":-76.2203},{"iata":"PIR","name":"Pierre","country":"US","region":"US-SD","lat":44.3827,"lng":-100.286},{"iata":"PIS","name":"Poitiers/Biard","country":"FR","region":"FR-NAQ","lat":46.5877,"lng":0.3067},{"iata":"PIT","name":"Pittsburgh","country":"US","region":"US-PA","lat":40.4915,"lng":-80.2329},{"iata":"PIU","name":"Piura","country":"PE","region":"PE-PIU","lat":-5.2058,"lng":-80.6164},{"iata":"PIW","name":"Pikwitonei","country":"CA","region":"CA-MB","lat":55.5889,"lng":-97.1642},{"iata":"PIX","name":"Pico Island","country":"PT","region":"PT-20","lat":38.5543,"lng":-28.4413},{"iata":"PIZ","name":"Point Lay","country":"US","region":"US-AK","lat":69.7329,"lng":-163.005},{"iata":"PJC","name":"Pedro Juan Caballero","country":"PY","region":"PY-13","lat":-22.6414,"lng":-55.83},{"iata":"PJG","name":"Panjgur","country":"PK","region":"PK-BA","lat":26.9545,"lng":64.1325},{"iata":"PJM","name":"Puerto Jimenez","country":"CR","region":"CR-P","lat":8.5333,"lng":-83.3},{"iata":"PKB","name":"Parkersburg (Williamstown)","country":"US","region":"US-WV","lat":39.3451,"lng":-81.4392},{"iata":"PKC","name":"Petropavlovsk-Kamchatsky","country":"RU","region":"RU-KAM","lat":53.1687,"lng":158.4511},{"iata":"PKE","name":"Parkes","country":"AU","region":"AU-NSW","lat":-33.1314,"lng":148.239},{"iata":"PKR","name":"Pokhara","country":"NP","region":"NP-P4","lat":28.2006,"lng":83.9812},{"iata":"PKT","name":"Wadeye","country":"AU","region":"AU-NT","lat":-14.2497,"lng":129.5295},{"iata":"PKU","name":"Pekanbaru","country":"ID","region":"ID-RI","lat":0.4586,"lng":101.4443},{"iata":"PKV","name":"Pskov","country":"RU","region":"RU-PSK","lat":57.7813,"lng":28.3938},{"iata":"PKW","name":"Selebi Phikwe","country":"BW","region":"BW-SP","lat":-22.0583,"lng":27.8288},{"iata":"PKX","name":"Beijing","country":"CN","region":"CN-11","lat":39.5013,"lng":116.414},{"iata":"PKY","name":"Palangkaraya","country":"ID","region":"ID-KT","lat":-2.2271,"lng":113.9434},{"iata":"PKZ","name":"Pakse","country":"LA","region":"LA-CH","lat":15.134,"lng":105.7799},{"iata":"PLJ","name":"Placencia","country":"BZ","region":"BZ-SC","lat":16.537,"lng":-88.3615},{"iata":"PLL","name":"Manaus","country":"BR","region":"BR-AM","lat":-3.146,"lng":-59.9863},{"iata":"PLM","name":"Palembang","country":"ID","region":"ID-SS","lat":-2.8977,"lng":104.6981},{"iata":"PLN","name":"Pellston","country":"US","region":"US-MI","lat":45.5709,"lng":-84.7967},{"iata":"PLO","name":"Port Lincoln","country":"AU","region":"AU-SA","lat":-34.6053,"lng":135.88},{"iata":"PLQ","name":"Palanga","country":"LT","region":"LT-KL","lat":55.9732,"lng":21.0939},{"iata":"PLS","name":"Providenciales","country":"TC","region":"TC-PR","lat":21.7737,"lng":-72.2683},{"iata":"PLU","name":"Belo Horizonte","country":"BR","region":"BR-MG","lat":-19.8507,"lng":-43.9503},{"iata":"PLW","name":"Palu","country":"ID","region":"ID-ST","lat":-0.9165,"lng":119.9086},{"iata":"PLX","name":"Semey","country":"KZ","region":"KZ-ABA","lat":50.3513,"lng":80.2344},{"iata":"PLZ","name":"Gqeberha (Port Elizabeth)","country":"ZA","region":"ZA-EC","lat":-33.9897,"lng":25.6174},{"iata":"PMA","name":"Chake Chake","country":"TZ","region":"TZ-25","lat":-5.2573,"lng":39.8114},{"iata":"PMC","name":"Puerto Montt","country":"CL","region":"CL-LL","lat":-41.4431,"lng":-73.0941},{"iata":"PMD","name":"Palmdale","country":"US","region":"US-CA","lat":34.6294,"lng":-118.085},{"iata":"PMF","name":"Parma (PR)","country":"IT","region":"IT-45","lat":44.8264,"lng":10.2971},{"iata":"PMG","name":"Ponta Por\u00e3","country":"BR","region":"BR-MS","lat":-22.5496,"lng":-55.7026},{"iata":"PMI","name":"Palma de Mallorca","country":"ES","region":"ES-IB","lat":39.5517,"lng":2.7388},{"iata":"PMO","name":"Palermo","country":"IT","region":"IT-82","lat":38.176,"lng":13.091},{"iata":"PMQ","name":"Perito Moreno","country":"AR","region":"AR-Z","lat":-46.5379,"lng":-70.9787},{"iata":"PMR","name":"Palmerston North","country":"NZ","region":"NZ-MWT","lat":-40.3206,"lng":175.617},{"iata":"PMS","name":"Tadmur","country":"SY","region":"SY-HI","lat":34.5574,"lng":38.3169},{"iata":"PMV","name":"Isla Margarita","country":"VE","region":"VE-O","lat":10.9126,"lng":-63.9666},{"iata":"PMW","name":"Palmas","country":"BR","region":"BR-TO","lat":-10.2915,"lng":-48.357},{"iata":"PMY","name":"Puerto Madryn","country":"AR","region":"AR-U","lat":-42.7592,"lng":-65.1027},{"iata":"PMZ","name":"Palmar Sur","country":"CR","region":"CR-P","lat":8.951,"lng":-83.4686},{"iata":"PNA","name":"Pamplona","country":"ES","region":"ES-NC","lat":42.77,"lng":-1.6463},{"iata":"PNB","name":"Porto Nacional","country":"BR","region":"BR-TO","lat":-10.7194,"lng":-48.3997},{"iata":"PNC","name":"Ponca City","country":"US","region":"US-OK","lat":36.732,"lng":-97.0998},{"iata":"PNE","name":"Philadelphia","country":"US","region":"US-PA","lat":40.0824,"lng":-75.0106},{"iata":"PNH","name":"Phnom Penh (Pou Senchey)","country":"KH","region":"KH-12","lat":11.5472,"lng":104.8447},{"iata":"PNI","name":"Pohnpei Island","country":"FM","region":"FM-PNI","lat":6.9851,"lng":158.2099},{"iata":"PNK","name":"Pontianak","country":"ID","region":"ID-KB","lat":-0.1523,"lng":109.4045},{"iata":"PNL","name":"Pantelleria (TP)","country":"IT","region":"IT-82","lat":36.8165,"lng":11.9689},{"iata":"PNP","name":"Popondetta","country":"PG","region":"PG-NPP","lat":-8.8045,"lng":148.309},{"iata":"PNQ","name":"Pune","country":"IN","region":"IN-MM","lat":18.5821,"lng":73.9197},{"iata":"PNR","name":"Pointe Noire","country":"CG","region":"CG-5","lat":-4.816,"lng":11.8866},{"iata":"PNS","name":"Pensacola","country":"US","region":"US-FL","lat":30.4727,"lng":-87.1866},{"iata":"PNT","name":"Puerto Natales","country":"CL","region":"CL-MA","lat":-51.6707,"lng":-72.5291},{"iata":"PNV","name":"Panev\u0117\u017eys","country":"LT","region":"LT-PN","lat":55.7294,"lng":24.4608},{"iata":"PNX","name":"Denison","country":"US","region":"US-TX","lat":33.7141,"lng":-96.6737},{"iata":"PNY","name":"Puducherry (Pondicherry)","country":"IN","region":"IN-PY","lat":11.968,"lng":79.812},{"iata":"PNZ","name":"Petrolina","country":"BR","region":"BR-PE","lat":-9.3624,"lng":-40.5691},{"iata":"POA","name":"Porto Alegre","country":"BR","region":"BR-RS","lat":-29.994,"lng":-51.1675},{"iata":"POB","name":"Fort Bragg","country":"US","region":"US-NC","lat":35.1709,"lng":-79.0145},{"iata":"POE","name":"Fort Polk","country":"US","region":"US-LA","lat":31.0448,"lng":-93.1917},{"iata":"POG","name":"Port Gentil","country":"GA","region":"GA-8","lat":-0.7117,"lng":8.7544},{"iata":"POI","name":"Potos\u00ed","country":"BO","region":"BO-P","lat":-19.5433,"lng":-65.7237},{"iata":"POL","name":"Pemba","country":"MZ","region":"MZ-P","lat":-12.9933,"lng":40.5249},{"iata":"POM","name":"Port Moresby","country":"PG","region":"PG-NCD","lat":-9.4434,"lng":147.22},{"iata":"POO","name":"Po\u00e7os De Caldas","country":"BR","region":"BR-MG","lat":-21.8425,"lng":-46.5698},{"iata":"POP","name":"Puerto Plata","country":"DO","region":"DO-18","lat":19.7579,"lng":-70.57},{"iata":"POR","name":"Pori","country":"FI","region":"FI-17","lat":61.4617,"lng":21.8},{"iata":"POS","name":"Port of Spain","country":"TT","region":"TT-TUP","lat":10.5978,"lng":-61.3375},{"iata":"POT","name":"Ken Jones","country":"JM","region":"JM-04","lat":18.1988,"lng":-76.5345},{"iata":"POU","name":"Poughkeepsie","country":"US","region":"US-NY","lat":41.6266,"lng":-73.8842},{"iata":"POW","name":"Se\u010dovlje","country":"SI","region":"SI-090","lat":45.472,"lng":13.616},{"iata":"POX","name":"Cormeilles-en-Vexin, Val-d'Oise","country":"FR","region":"FR-IDF","lat":49.0961,"lng":2.0355},{"iata":"POZ","name":"Pozna\u0144","country":"PL","region":"PL-WP","lat":52.4216,"lng":16.8234},{"iata":"PPB","name":"Presidente Prudente","country":"BR","region":"BR-SP","lat":-22.1751,"lng":-51.4246},{"iata":"PPG","name":"Pago Pago","country":"AS","region":"AS-WT","lat":-14.331,"lng":-170.71},{"iata":"PPI","name":"Port Pirie Airport","country":"AU","region":"AU-SA","lat":-33.2389,"lng":137.995},{"iata":"PPK","name":"Petropavl","country":"KZ","region":"KZ-SEV","lat":54.7756,"lng":69.1874},{"iata":"PPN","name":"Popay\u00e1n","country":"CO","region":"CO-CAU","lat":2.4544,"lng":-76.6093},{"iata":"PPP","name":"Proserpine","country":"AU","region":"AU-QLD","lat":-20.4944,"lng":148.5536},{"iata":"PPQ","name":"Paraparaumu Airport","country":"NZ","region":"NZ-WGN","lat":-40.9047,"lng":174.989},{"iata":"PPS","name":"Puerto Princesa","country":"PH","region":"PH-PLW","lat":9.742,"lng":118.7591},{"iata":"PPT","name":"Papeete","country":"PF","region":"PF-U-A","lat":-17.5535,"lng":-149.6069},{"iata":"PQC","name":"Phu Quoc Island","country":"VN","region":"VN-SW","lat":10.1698,"lng":103.9935},{"iata":"PQI","name":"Presque Isle","country":"US","region":"US-ME","lat":46.689,"lng":-68.0448},{"iata":"PQQ","name":"Port Macquarie","country":"AU","region":"AU-NSW","lat":-31.4358,"lng":152.863},{"iata":"PRA","name":"Parana","country":"AR","region":"AR-E","lat":-31.7948,"lng":-60.4804},{"iata":"PRB","name":"Paso Robles","country":"US","region":"US-CA","lat":35.6729,"lng":-120.627},{"iata":"PRC","name":"Prescott","country":"US","region":"US-AZ","lat":34.6535,"lng":-112.4199},{"iata":"PRG","name":"Prague","country":"CZ","region":"CZ-PR","lat":50.1009,"lng":14.2599},{"iata":"PRH","name":"Phrae Airport","country":"TH","region":"TH-54","lat":18.1322,"lng":100.165},{"iata":"PRI","name":"Praslin Island","country":"SC","region":"SC-14","lat":-4.3193,"lng":55.6916},{"iata":"PRM","name":"Portim\u00e3o","country":"PT","region":"PT-08","lat":37.1493,"lng":-8.584},{"iata":"PRN","name":"Prishtina","country":"XK","region":"XK-01","lat":42.5728,"lng":21.0358},{"iata":"PRV","name":"P\u0159erov","country":"CZ","region":"CZ-OL","lat":49.4258,"lng":17.4047},{"iata":"PRX","name":"Paris","country":"US","region":"US-TX","lat":33.6366,"lng":-95.4508},{"iata":"PRY","name":"Pretoria","country":"ZA","region":"ZA-GT","lat":-25.6539,"lng":28.2242},{"iata":"PSA","name":"Pisa (PI)","country":"IT","region":"IT-52","lat":43.6839,"lng":10.3927},{"iata":"PSC","name":"Pasco","country":"US","region":"US-WA","lat":46.2647,"lng":-119.119},{"iata":"PSD","name":"Port Said","country":"EG","region":"EG-PTS","lat":31.2793,"lng":32.2406},{"iata":"PSE","name":"Ponce","country":"PR","region":"PR-U-A","lat":18.0083,"lng":-66.563},{"iata":"PSG","name":"Petersburg","country":"US","region":"US-AK","lat":56.8017,"lng":-132.945},{"iata":"PSI","name":"Pasni","country":"PK","region":"PK-BA","lat":25.2905,"lng":63.3451},{"iata":"PSJ","name":"Poso-Celebes Island","country":"ID","region":"ID-ST","lat":-1.4141,"lng":120.6592},{"iata":"PSM","name":"Portsmouth","country":"US","region":"US-NH","lat":43.0779,"lng":-70.8233},{"iata":"PSO","name":"Chachag\u00fc\u00ed","country":"CO","region":"CO-NAR","lat":1.3967,"lng":-77.2909},{"iata":"PSP","name":"Palm Springs","country":"US","region":"US-CA","lat":33.8297,"lng":-116.507},{"iata":"PSR","name":"Pescara","country":"IT","region":"IT-65","lat":42.4311,"lng":14.183},{"iata":"PSS","name":"Posadas","country":"AR","region":"AR-N","lat":-27.3858,"lng":-55.9707},{"iata":"PSU","name":"Putussibau-Borneo Island","country":"ID","region":"ID-KB","lat":0.8346,"lng":112.9402},{"iata":"PSZ","name":"Puerto Su\u00e1rez","country":"BO","region":"BO-S","lat":-18.9753,"lng":-57.8206},{"iata":"PTG","name":"Polokwane","country":"ZA","region":"ZA-NP","lat":-23.8453,"lng":29.4586},{"iata":"PTH","name":"Port Heiden","country":"US","region":"US-AK","lat":56.9579,"lng":-158.6302},{"iata":"PTJ","name":"Portland Airport","country":"AU","region":"AU-VIC","lat":-38.3181,"lng":141.471},{"iata":"PTK","name":"Pontiac","country":"US","region":"US-MI","lat":42.6655,"lng":-83.4201},{"iata":"PTM","name":"Palmarito","country":"VE","region":"VE-C","lat":7.5755,"lng":-70.1744},{"iata":"PTP","name":"Pointe-\u00e0-Pitre","country":"GP","region":"GP-U-A","lat":16.2654,"lng":-61.5328},{"iata":"PTU","name":"Platinum","country":"US","region":"US-AK","lat":59.0177,"lng":-161.8279},{"iata":"PTX","name":"Pitalito","country":"CO","region":"CO-HUI","lat":1.8578,"lng":-76.0857},{"iata":"PTY","name":"Tocumen","country":"PA","region":"PA-8","lat":9.0714,"lng":-79.3835},{"iata":"PUB","name":"Pueblo","country":"US","region":"US-CO","lat":38.2891,"lng":-104.497},{"iata":"PUD","name":"Puerto Deseado","country":"AR","region":"AR-Z","lat":-47.7353,"lng":-65.9041},{"iata":"PUF","name":"Pau/Pyr\u00e9n\u00e9es (Uzein)","country":"FR","region":"FR-NAQ","lat":43.38,"lng":-0.4186},{"iata":"PUG","name":"Port Augusta Airport","country":"AU","region":"AU-SA","lat":-32.5069,"lng":137.717},{"iata":"PUJ","name":"Punta Cana","country":"DO","region":"DO-11","lat":18.5671,"lng":-68.3646},{"iata":"PUQ","name":"Punta Arenas","country":"CL","region":"CL-MA","lat":-53.0026,"lng":-70.8546},{"iata":"PUS","name":"Busan","country":"KR","region":"KR-26","lat":35.1795,"lng":128.938},{"iata":"PUT","name":"Puttaparthi","country":"IN","region":"IN-AP","lat":14.1493,"lng":77.7911},{"iata":"PUU","name":"Puerto As\u00eds","country":"CO","region":"CO-PUT","lat":0.5052,"lng":-76.5008},{"iata":"PUW","name":"Pullman","country":"US","region":"US-WA","lat":46.7416,"lng":-117.1116},{"iata":"PUY","name":"Pula","country":"HR","region":"HR-18","lat":44.8935,"lng":13.9222},{"iata":"PUZ","name":"Puerto Cabezas","country":"NI","region":"NI-AN","lat":14.0472,"lng":-83.3867},{"iata":"PVA","name":"Providencia","country":"CO","region":"CO-SAP","lat":13.3575,"lng":-81.358},{"iata":"PVD","name":"Providence/Warwick","country":"US","region":"US-RI","lat":41.725,"lng":-71.4257},{"iata":"PVG","name":"Shanghai (Pudong)","country":"CN","region":"CN-31","lat":31.1434,"lng":121.805},{"iata":"PVH","name":"Porto Velho","country":"BR","region":"BR-RO","lat":-8.7085,"lng":-63.9023},{"iata":"PVK","name":"Preveza","country":"GR","region":"GR-D","lat":38.9255,"lng":20.7653},{"iata":"PVO","name":"Portoviejo","country":"EC","region":"EC-M","lat":-1.0416,"lng":-80.4722},{"iata":"PVR","name":"Puerto Vallarta","country":"MX","region":"MX-JAL","lat":20.6799,"lng":-105.2544},{"iata":"PVS","name":"Chukotka","country":"RU","region":"RU-CHU","lat":64.3781,"lng":-173.243},{"iata":"PVU","name":"Provo","country":"US","region":"US-UT","lat":40.2189,"lng":-111.7224},{"iata":"PWE","name":"Apapelgino","country":"RU","region":"RU-CHU","lat":69.7833,"lng":170.597},{"iata":"PWK","name":"Chicago/Prospect Heights/Wheeling","country":"US","region":"US-IL","lat":42.1142,"lng":-87.9015},{"iata":"PWM","name":"Portland","country":"US","region":"US-ME","lat":43.6462,"lng":-70.3093},{"iata":"PWQ","name":"Pavlodar","country":"KZ","region":"KZ-PAV","lat":52.195,"lng":77.0731},{"iata":"PWT","name":"Bremerton","country":"US","region":"US-WA","lat":47.4902,"lng":-122.765},{"iata":"PWY","name":"Pinedale","country":"US","region":"US-WY","lat":42.7955,"lng":-109.807},{"iata":"PXM","name":"Puerto Escondido","country":"MX","region":"MX-OAX","lat":15.8768,"lng":-97.0891},{"iata":"PXO","name":"Vila Baleira","country":"PT","region":"PT-30","lat":33.0734,"lng":-16.35},{"iata":"PXR","name":"Surin","country":"TH","region":"TH-32","lat":14.8683,"lng":103.498},{"iata":"PXU","name":"Pleiku","country":"VN","region":"VN-CH","lat":14.0045,"lng":108.017},{"iata":"PYH","name":"Puerto Ayacucho","country":"VE","region":"VE-Z","lat":5.62,"lng":-67.6061},{"iata":"PYJ","name":"Yakutia","country":"RU","region":"RU-SA","lat":66.4004,"lng":112.03},{"iata":"PYK","name":"Karaj","country":"IR","region":"IR-30","lat":35.7761,"lng":50.8267},{"iata":"PYR","name":"Andravida","country":"GR","region":"GR-G","lat":37.9207,"lng":21.2926},{"iata":"PZA","name":"Paz de Ariporo","country":"CO","region":"CO-CAS","lat":5.8761,"lng":-71.8867},{"iata":"PZB","name":"Pietermaritzburg","country":"ZA","region":"ZA-NL","lat":-29.649,"lng":30.3987},{"iata":"PZH","name":"Fort Sandeman","country":"PK","region":"PK-BA","lat":31.3584,"lng":69.4636},{"iata":"PZI","name":"Panzhihua (Renhe)","country":"CN","region":"CN-51","lat":26.54,"lng":101.7985},{"iata":"PZO","name":"Guyana City","country":"VE","region":"VE-F","lat":8.2885,"lng":-62.7604},{"iata":"PZS","name":"Temuco","country":"CL","region":"CL-AR","lat":-38.7668,"lng":-72.6371},{"iata":"PZU","name":"Port Sudan","country":"SD","region":"SD-26","lat":19.4346,"lng":37.2341},{"iata":"PZY","name":"Pie\u0161\u0165any","country":"SK","region":"SK-TA","lat":48.6252,"lng":17.8284},{"iata":"QBC","name":"Bella Coola","country":"CA","region":"CA-BC","lat":52.3875,"lng":-126.596},{"iata":"QCY","name":"Lincoln, Lincolnshire","country":"GB","region":"GB-ENG","lat":53.093,"lng":-0.166},{"iata":"QGU","name":"Gifu","country":"JP","region":"JP-21","lat":35.3941,"lng":136.87},{"iata":"QGY","name":"Gy\u0151r","country":"HU","region":"HU-GS","lat":47.6284,"lng":17.8047},{"iata":"QHR","name":"Debre Zeyit","country":"ET","region":"ET-OR","lat":8.7163,"lng":39.0059},{"iata":"QLG","name":"Landshut","country":"DE","region":"DE-BY","lat":48.512,"lng":12.0349},{"iata":"QMJ","name":"Masjed Soleyman","country":"IR","region":"IR-06","lat":32.0017,"lng":49.2686},{"iata":"QNS","name":"Porto Alegre","country":"BR","region":"BR-RS","lat":-29.9459,"lng":-51.1444},{"iata":"QOW","name":"Owerri","country":"NG","region":"NG-IM","lat":5.4271,"lng":7.206},{"iata":"QPG","name":"Paya Lebar","country":"SG","region":"SG-04","lat":1.3604,"lng":103.91},{"iata":"QPS","name":"Pirassununga","country":"BR","region":"BR-SP","lat":-21.9847,"lng":-47.3412},{"iata":"QRA","name":"Johannesburg","country":"ZA","region":"ZA-GT","lat":-26.2425,"lng":28.1512},{"iata":"QRM","name":"Narromine Airport","country":"AU","region":"AU-NSW","lat":-32.2147,"lng":148.225},{"iata":"QRO","name":"Quer\u00e9taro","country":"MX","region":"MX-QUE","lat":20.6188,"lng":-100.1864},{"iata":"QRW","name":"Okpe","country":"NG","region":"NG-DE","lat":5.5982,"lng":5.8187},{"iata":"QSF","name":"S\u00e9tif","country":"DZ","region":"DZ-19","lat":36.1785,"lng":5.3299},{"iata":"QSR","name":"Salerno","country":"IT","region":"IT-72","lat":40.6204,"lng":14.9113},{"iata":"QSZ","name":"Shache","country":"CN","region":"CN-65","lat":38.2454,"lng":77.0561},{"iata":"QUO","name":"Uyo","country":"NG","region":"NG-AK","lat":4.8725,"lng":8.093},{"iata":"RAB","name":"Kokopo","country":"PG","region":"PG-EBR","lat":-4.3405,"lng":152.38},{"iata":"RAE","name":"Arar","country":"SA","region":"SA-08","lat":30.9066,"lng":41.1382},{"iata":"RAH","name":"Rafha","country":"SA","region":"SA-08","lat":29.6264,"lng":43.4906},{"iata":"RAI","name":"Praia","country":"CV","region":"CV-S","lat":14.9411,"lng":-23.4847},{"iata":"RAJ","name":"Rajkot","country":"IN","region":"IN-GJ","lat":22.3092,"lng":70.7795},{"iata":"RAK","name":"Marrakesh","country":"MA","region":"MA-07","lat":31.6048,"lng":-8.0358},{"iata":"RAL","name":"Riverside","country":"US","region":"US-CA","lat":33.9519,"lng":-117.445},{"iata":"RAO","name":"Ribeir\u00e3o Preto","country":"BR","region":"BR-SP","lat":-21.1343,"lng":-47.7741},{"iata":"RAP","name":"Rapid City","country":"US","region":"US-SD","lat":44.0453,"lng":-103.057},{"iata":"RAR","name":"Avarua","country":"CK","region":"CK-U-A","lat":-21.2027,"lng":-159.806},{"iata":"RAS","name":"Rasht","country":"IR","region":"IR-01","lat":37.3233,"lng":49.6178},{"iata":"RAZ","name":"Rawalakot","country":"PK","region":"PK-JK","lat":33.8497,"lng":73.7981},{"iata":"RBA","name":"Rabat","country":"MA","region":"MA-04","lat":34.0515,"lng":-6.7515},{"iata":"RBE","name":"Ratanakiri","country":"KH","region":"KH-16","lat":13.73,"lng":106.987},{"iata":"RBL","name":"Red Bluff","country":"US","region":"US-CA","lat":40.1507,"lng":-122.252},{"iata":"RBR","name":"Rio Branco","country":"BR","region":"BR-AC","lat":-9.869,"lng":-67.894},{"iata":"RBY","name":"Ruby","country":"US","region":"US-AK","lat":64.7272,"lng":-155.47},{"iata":"RCA","name":"Rapid City","country":"US","region":"US-SD","lat":44.145,"lng":-103.104},{"iata":"RCB","name":"Richards Bay","country":"ZA","region":"ZA-NL","lat":-28.741,"lng":32.0921},{"iata":"RCH","name":"Riohacha","country":"CO","region":"CO-LAG","lat":11.5262,"lng":-72.926},{"iata":"RCO","name":"Rochefort/Saint-Agnant","country":"FR","region":"FR-NAQ","lat":45.8878,"lng":-0.9831},{"iata":"RCQ","name":"Reconquista","country":"AR","region":"AR-S","lat":-29.2103,"lng":-59.6833},{"iata":"RCU","name":"Rio Cuarto","country":"AR","region":"AR-X","lat":-33.0851,"lng":-64.2613},{"iata":"RDD","name":"Redding","country":"US","region":"US-CA","lat":40.509,"lng":-122.293},{"iata":"RDG","name":"Reading","country":"US","region":"US-PA","lat":40.3785,"lng":-75.9652},{"iata":"RDL","name":"El Hassana","country":"EG","region":"EG-SIN","lat":30.4107,"lng":33.1553},{"iata":"RDM","name":"Redmond","country":"US","region":"US-OR","lat":44.2541,"lng":-121.15},{"iata":"RDO","name":"Radom","country":"PL","region":"PL-MZ","lat":51.3894,"lng":21.2147},{"iata":"RDP","name":"Durgapur","country":"IN","region":"IN-WB","lat":23.6225,"lng":87.243},{"iata":"RDR","name":"Grand Forks","country":"US","region":"US-ND","lat":47.9611,"lng":-97.4012},{"iata":"RDS","name":"Rincon de los Sauces","country":"AR","region":"AR-Q","lat":-37.3906,"lng":-68.9042},{"iata":"RDU","name":"Raleigh/Durham","country":"US","region":"US-NC","lat":35.8787,"lng":-78.7873},{"iata":"RDZ","name":"Rodez/Marcillac","country":"FR","region":"FR-OCC","lat":44.4079,"lng":2.4827},{"iata":"REA","name":"Reao","country":"PF","region":"PF-U-A","lat":-18.4665,"lng":-136.4385},{"iata":"REC","name":"Recife","country":"BR","region":"BR-PE","lat":-8.1275,"lng":-34.923},{"iata":"REG","name":"Reggio Calabria","country":"IT","region":"IT-78","lat":38.0712,"lng":15.6516},{"iata":"REL","name":"Rawson","country":"AR","region":"AR-U","lat":-43.2105,"lng":-65.2703},{"iata":"REN","name":"Orenburg","country":"RU","region":"RU-ORE","lat":51.7927,"lng":55.4572},{"iata":"RER","name":"Retalhuleu","country":"GT","region":"GT-RE","lat":14.5214,"lng":-91.697},{"iata":"RES","name":"Resistencia","country":"AR","region":"AR-H","lat":-27.4499,"lng":-59.0561},{"iata":"REU","name":"Reus","country":"ES","region":"ES-CT","lat":41.1475,"lng":1.1684},{"iata":"REW","name":"Rewa","country":"IN","region":"IN-MP","lat":24.5034,"lng":81.2203},{"iata":"REX","name":"Reynosa","country":"MX","region":"MX-TAM","lat":26.0089,"lng":-98.2285},{"iata":"RFD","name":"Chicago/Rockford","country":"US","region":"US-IL","lat":42.1954,"lng":-89.0972},{"iata":"RFP","name":"Uturoa","country":"PF","region":"PF-U-A","lat":-16.7229,"lng":-151.466},{"iata":"RGA","name":"Rio Grande","country":"AR","region":"AR-V","lat":-53.7777,"lng":-67.7494},{"iata":"RGI","name":"Rangiroa Airport","country":"PF","region":"PF-U-A","lat":-14.9543,"lng":-147.661},{"iata":"RGK","name":"Gorno-Altaysk","country":"RU","region":"RU-AL","lat":51.9692,"lng":85.8365},{"iata":"RGL","name":"Rio Gallegos","country":"AR","region":"AR-Z","lat":-51.6088,"lng":-69.3089},{"iata":"RGN","name":"Yangon","country":"MM","region":"MM-06","lat":16.9073,"lng":96.1332},{"iata":"RGO","name":"Hoemun-ri","country":"KP","region":"KP-09","lat":41.4285,"lng":129.6476},{"iata":"RGS","name":"Burgos","country":"ES","region":"ES-CL","lat":42.3576,"lng":-3.6208},{"iata":"RGT","name":"Rengat-Sumatra Island","country":"ID","region":"ID-RI","lat":-0.3528,"lng":102.335},{"iata":"RHD","name":"Termas de R\u00edo Hondo","country":"AR","region":"AR-G","lat":-27.4966,"lng":-64.936},{"iata":"RHI","name":"Rhinelander","country":"US","region":"US-WI","lat":45.6312,"lng":-89.4675},{"iata":"RHO","name":"Rhodes","country":"GR","region":"GR-L","lat":36.4054,"lng":28.0862},{"iata":"RIA","name":"Santa Maria","country":"BR","region":"BR-RS","lat":-29.7114,"lng":-53.6882},{"iata":"RIB","name":"Riberalta","country":"BO","region":"BO-B","lat":-11.0094,"lng":-66.0755},{"iata":"RIC","name":"Richmond","country":"US","region":"US-VA","lat":37.5052,"lng":-77.3197},{"iata":"RIJ","name":"Rioja","country":"PE","region":"PE-SAM","lat":-6.0679,"lng":-77.16},{"iata":"RIL","name":"Rifle","country":"US","region":"US-CO","lat":39.5263,"lng":-107.727},{"iata":"RIS","name":"Rishiri","country":"JP","region":"JP-01","lat":45.242,"lng":141.186},{"iata":"RIV","name":"Riverside","country":"US","region":"US-CA","lat":33.8807,"lng":-117.259},{"iata":"RIW","name":"Riverton","country":"US","region":"US-WY","lat":43.0642,"lng":-108.46},{"iata":"RIX","name":"Riga","country":"LV","region":"LV-062","lat":56.9208,"lng":23.9707},{"iata":"RIY","name":"Mukalla(Riyan)","country":"YE","region":"YE-HD","lat":14.6622,"lng":49.3753},{"iata":"RIZ","name":"Rizhao (Donggang)","country":"CN","region":"CN-37","lat":35.405,"lng":119.3244},{"iata":"RJA","name":"Madhurapudi","country":"IN","region":"IN-AP","lat":17.1058,"lng":81.8132},{"iata":"RJH","name":"Rajshahi","country":"BD","region":"BD-5","lat":24.4372,"lng":88.6165},{"iata":"RJK","name":"Rijeka(Omi\u0161alj)","country":"HR","region":"HR-08","lat":45.2164,"lng":14.5709},{"iata":"RJL","name":"Logro\u00f1o","country":"ES","region":"ES-RI","lat":42.461,"lng":-2.3222},{"iata":"RJN","name":"Rafsanjan","country":"IR","region":"IR-08","lat":30.2983,"lng":56.049},{"iata":"RKD","name":"Rockland","country":"US","region":"US-ME","lat":44.0601,"lng":-69.0992},{"iata":"RKE","name":"Roskilde","country":"DK","region":"DK-85","lat":55.5856,"lng":12.1314},{"iata":"RKS","name":"Rock Springs","country":"US","region":"US-WY","lat":41.5942,"lng":-109.065},{"iata":"RKT","name":"Ras Al Khaimah","country":"AE","region":"AE-RK","lat":25.6135,"lng":55.9388},{"iata":"RKV","name":"Reykjav\u00edk","country":"IS","region":"IS-1","lat":64.1287,"lng":-21.9376},{"iata":"RKZ","name":"Xigaz\u00ea (Samzhubz\u00ea)","country":"CN","region":"CN-54","lat":29.3509,"lng":89.2992},{"iata":"RLG","name":"Laage","country":"DE","region":"DE-MV","lat":53.9182,"lng":12.2783},{"iata":"RLK","name":"Bayannur","country":"CN","region":"CN-15","lat":40.9264,"lng":107.7409},{"iata":"RMA","name":"Roma","country":"AU","region":"AU-QLD","lat":-26.545,"lng":148.775},{"iata":"RME","name":"Rome","country":"US","region":"US-NY","lat":43.2338,"lng":-75.407},{"iata":"RMF","name":"Marsa Alam","country":"EG","region":"EG-BA","lat":25.5555,"lng":34.5924},{"iata":"RMG","name":"Rome","country":"US","region":"US-GA","lat":34.3506,"lng":-85.158},{"iata":"RMI","name":"Rimini (RN)","country":"IT","region":"IT-45","lat":44.02,"lng":12.6122},{"iata":"RMK","name":"Renmark Airport","country":"AU","region":"AU-SA","lat":-34.1964,"lng":140.674},{"iata":"RML","name":"Colombo","country":"LK","region":"LK-1","lat":6.8216,"lng":79.8859},{"iata":"RMO","name":"Chi\u015fin\u0103u","country":"MD","region":"MD-CU","lat":46.9277,"lng":28.9317},{"iata":"RMQ","name":"Taichung (Qingshui)","country":"TW","region":"TW-TXG","lat":24.2647,"lng":120.621},{"iata":"RMS","name":"Ramstein-Miesenbach","country":"DE","region":"DE-RP","lat":49.4369,"lng":7.6003},{"iata":"RMU","name":"Corvera","country":"ES","region":"ES-MC","lat":37.8029,"lng":-1.1249},{"iata":"RMZ","name":"Tobolsk","country":"RU","region":"RU-TYU","lat":58.0597,"lng":68.348},{"iata":"RNB","name":"Ronneby","country":"SE","region":"SE-K","lat":56.2667,"lng":15.265},{"iata":"RND","name":"Universal City","country":"US","region":"US-TX","lat":29.5297,"lng":-98.2789},{"iata":"RNE","name":"Saint-L\u00e9ger-sur-Roanne","country":"FR","region":"FR-ARA","lat":46.0538,"lng":3.999},{"iata":"RNH","name":"New Richmond","country":"US","region":"US-WI","lat":45.1483,"lng":-92.5381},{"iata":"RNJ","name":"Yoron","country":"JP","region":"JP-46","lat":27.0438,"lng":128.4016},{"iata":"RNN","name":"R\u00f8nne","country":"DK","region":"DK-84","lat":55.0633,"lng":14.7596},{"iata":"RNO","name":"Reno","country":"US","region":"US-NV","lat":39.4991,"lng":-119.768},{"iata":"RNS","name":"Saint-Jacques-de-la-Lande, Ille-et-Vilaine","country":"FR","region":"FR-BRE","lat":48.0695,"lng":-1.7348},{"iata":"ROA","name":"Roanoke","country":"US","region":"US-VA","lat":37.3255,"lng":-79.9754},{"iata":"ROB","name":"Monrovia","country":"LR","region":"LR-MG","lat":6.2338,"lng":-10.3623},{"iata":"ROC","name":"Rochester","country":"US","region":"US-NY","lat":43.1189,"lng":-77.6724},{"iata":"ROD","name":"Robertson","country":"ZA","region":"ZA-WC","lat":-33.8122,"lng":19.9028},{"iata":"ROI","name":"Roi Et","country":"TH","region":"TH-45","lat":16.1168,"lng":103.774},{"iata":"ROK","name":"Rockhampton","country":"AU","region":"AU-QLD","lat":-23.38,"lng":150.4754},{"iata":"ROO","name":"Rondon\u00f3polis","country":"BR","region":"BR-MT","lat":-16.5843,"lng":-54.7248},{"iata":"ROP","name":"Rota Island","country":"MP","region":"MP-U-A","lat":14.1733,"lng":145.2411},{"iata":"ROR","name":"Babelthuap Island","country":"PW","region":"PW-004","lat":7.367,"lng":134.5441},{"iata":"ROS","name":"Rosario","country":"AR","region":"AR-S","lat":-32.9036,"lng":-60.785},{"iata":"ROT","name":"Rotorua","country":"NZ","region":"NZ-BOP","lat":-38.1092,"lng":176.317},{"iata":"ROV","name":"Rostov-on-Don","country":"RU","region":"RU-ROS","lat":47.4939,"lng":39.9247},{"iata":"ROW","name":"Roswell","country":"US","region":"US-NM","lat":33.3016,"lng":-104.531},{"iata":"ROZ","name":"Rota","country":"ES","region":"ES-AN","lat":36.6452,"lng":-6.3495},{"iata":"RPM","name":"Ngukurr Airport","country":"AU","region":"AU-NT","lat":-14.7228,"lng":134.747},{"iata":"RPN","name":"Rosh Pina","country":"IL","region":"IL-Z","lat":32.981,"lng":35.5719},{"iata":"RPR","name":"Raipur","country":"IN","region":"IN-CT","lat":21.1804,"lng":81.7388},{"iata":"RQA","name":"Ruoqiang Town","country":"CN","region":"CN-65","lat":38.9747,"lng":88.0083},{"iata":"RQW","name":"Qayyarah","country":"IQ","region":"IQ-NI","lat":35.7672,"lng":43.1251},{"iata":"RQY","name":"Shimoga","country":"IN","region":"IN-KA","lat":13.858,"lng":75.6189},{"iata":"RRE","name":"Marree Airport","country":"AU","region":"AU-SA","lat":-29.6633,"lng":138.065},{"iata":"RRG","name":"Port Mathurin","country":"MU","region":"MU-RO","lat":-19.7567,"lng":63.3593},{"iata":"RRJ","name":"Rio de Janeiro","country":"BR","region":"BR-RJ","lat":-22.9868,"lng":-43.3722},{"iata":"RRK","name":"Rourkela","country":"IN","region":"IN-OR","lat":22.2566,"lng":84.8152},{"iata":"RRS","name":"R\u00f8ros","country":"NO","region":"NO-50","lat":62.5784,"lng":11.3423},{"iata":"RSA","name":"Santa Rosa","country":"AR","region":"AR-L","lat":-36.5883,"lng":-64.2757},{"iata":"RSD","name":"Rock Sound","country":"BS","region":"BS-SE","lat":24.8916,"lng":-76.1776},{"iata":"RSI","name":"Hanak","country":"SA","region":"SA-07","lat":25.628,"lng":37.0889},{"iata":"RSL","name":"Russell","country":"US","region":"US-KS","lat":38.8721,"lng":-98.8118},{"iata":"RST","name":"Rochester","country":"US","region":"US-MN","lat":43.9083,"lng":-92.5},{"iata":"RSU","name":"Yeosu","country":"KR","region":"KR-46","lat":34.8423,"lng":127.617},{"iata":"RSW","name":"Fort Myers","country":"US","region":"US-FL","lat":26.5347,"lng":-81.7528},{"iata":"RTB","name":"Coxen Hole","country":"HN","region":"HN-IB","lat":16.3168,"lng":-86.523},{"iata":"RTC","name":"Ratnagiri Airport","country":"IN","region":"IN-MM","lat":17.0136,"lng":73.3278},{"iata":"RTE","name":"S\u00e3o Paulo","country":"BR","region":"BR-SP","lat":-23.5091,"lng":-46.6378},{"iata":"RTM","name":"Rotterdam","country":"NL","region":"NL-ZH","lat":51.9569,"lng":4.4372},{"iata":"RUA","name":"Arua","country":"UG","region":"UG-N","lat":3.0492,"lng":30.9117},{"iata":"RUG","name":"Rugao (Nantong)","country":"CN","region":"CN-32","lat":32.2583,"lng":120.5011},{"iata":"RUH","name":"Riyadh","country":"SA","region":"SA-01","lat":24.9576,"lng":46.6988},{"iata":"RUI","name":"Alto","country":"US","region":"US-NM","lat":33.4628,"lng":-105.535},{"iata":"RUN","name":"Sainte-Marie","country":"RE","region":"RE-SD","lat":-20.8901,"lng":55.5189},{"iata":"RUR","name":"Rurutu Airport","country":"PF","region":"PF-U-A","lat":-22.4341,"lng":-151.361},{"iata":"RUT","name":"Rutland","country":"US","region":"US-VT","lat":43.5294,"lng":-72.9496},{"iata":"RUV","name":"Rubelsanto","country":"GT","region":"GT-AV","lat":15.992,"lng":-90.4453},{"iata":"RVK","name":"R\u00f8rvik","country":"NO","region":"NO-50","lat":64.8383,"lng":11.1461},{"iata":"RVN","name":"Rovaniemi","country":"FI","region":"FI-10","lat":66.5633,"lng":25.8298},{"iata":"RVS","name":"Tulsa","country":"US","region":"US-OK","lat":36.0396,"lng":-95.9846},{"iata":"RVY","name":"Rivera/Santana do Livramento","country":"UY","region":"UY-RV","lat":-30.9746,"lng":-55.4762},{"iata":"RWF","name":"Redwood Falls","country":"US","region":"US-MN","lat":44.5472,"lng":-95.0823},{"iata":"RWI","name":"Rocky Mount","country":"US","region":"US-NC","lat":35.8563,"lng":-77.8919},{"iata":"RWL","name":"Rawlins","country":"US","region":"US-WY","lat":41.8056,"lng":-107.2},{"iata":"RWN","name":"Rivne","country":"UA","region":"UA-19","lat":50.6071,"lng":26.1416},{"iata":"RXS","name":"Roxas City","country":"PH","region":"PH-CAP","lat":11.5977,"lng":122.752},{"iata":"RYB","name":"Rybinsk","country":"RU","region":"RU-YAR","lat":58.1042,"lng":38.9294},{"iata":"RYK","name":"Rahim Yar Khan","country":"PK","region":"PK-PB","lat":28.3839,"lng":70.2796},{"iata":"RYN","name":"Royan/M\u00e9dis","country":"FR","region":"FR-NAQ","lat":45.6281,"lng":-0.9725},{"iata":"RZA","name":"Puerto Santa Cruz","country":"AR","region":"AR-Z","lat":-50.0165,"lng":-68.5792},{"iata":"RZE","name":"Jasionka","country":"PL","region":"PL-PK","lat":50.1098,"lng":22.0242},{"iata":"RZR","name":"Ramsar","country":"IR","region":"IR-02","lat":36.907,"lng":50.6873},{"iata":"RZV","name":"Rize","country":"TR","region":"TR-53","lat":41.1798,"lng":40.8488},{"iata":"SAB","name":"Zion's Hill","country":"BQ","region":"BQ-SA","lat":17.6453,"lng":-63.2205},{"iata":"SAC","name":"Sacramento","country":"US","region":"US-CA","lat":38.5125,"lng":-121.493},{"iata":"SAF","name":"Santa Fe","country":"US","region":"US-NM","lat":35.6171,"lng":-106.089},{"iata":"SAG","name":"Kakadi","country":"IN","region":"IN-MM","lat":19.6892,"lng":74.3737},{"iata":"SAH","name":"Sanaa","country":"YE","region":"YE-SA","lat":15.4763,"lng":44.2197},{"iata":"SAI","name":"Siem Reap","country":"KH","region":"KH-17","lat":13.3697,"lng":104.2238},{"iata":"SAL","name":"San Salvador (San Luis Talpa)","country":"SV","region":"SV-PA","lat":13.4445,"lng":-89.0558},{"iata":"SAN","name":"San Diego","country":"US","region":"US-CA","lat":32.7336,"lng":-117.19},{"iata":"SAP","name":"San Pedro Sula","country":"HN","region":"HN-CR","lat":15.4526,"lng":-87.9236},{"iata":"SAQ","name":"Andros Island","country":"BS","region":"BS-NS","lat":25.0538,"lng":-78.049},{"iata":"SAT","name":"San Antonio","country":"US","region":"US-TX","lat":29.5337,"lng":-98.4698},{"iata":"SAV","name":"Savannah","country":"US","region":"US-GA","lat":32.1266,"lng":-81.2},{"iata":"SAW","name":"Pendik, Istanbul","country":"TR","region":"TR-34","lat":40.8986,"lng":29.3092},{"iata":"SBA","name":"Santa Barbara","country":"US","region":"US-CA","lat":34.4262,"lng":-119.84},{"iata":"SBD","name":"San Bernardino","country":"US","region":"US-CA","lat":34.0967,"lng":-117.2366},{"iata":"SBH","name":"Gustavia","country":"BL","region":"BL-U-A","lat":17.9044,"lng":-62.8433},{"iata":"SBK","name":"Tr\u00e9muson, C\u00f4tes-d'Armor","country":"FR","region":"FR-BRE","lat":48.5386,"lng":-2.8535},{"iata":"SBL","name":"Santa Ana del Yacuma","country":"BO","region":"BO-B","lat":-13.7622,"lng":-65.4352},{"iata":"SBN","name":"South Bend","country":"US","region":"US-IN","lat":41.7083,"lng":-86.3169},{"iata":"SBP","name":"San Luis Obispo","country":"US","region":"US-CA","lat":35.2368,"lng":-120.642},{"iata":"SBT","name":"Sabetta","country":"RU","region":"RU-YAN","lat":71.2192,"lng":72.0522},{"iata":"SBU","name":"Springbok","country":"ZA","region":"ZA-NC","lat":-29.6893,"lng":17.9396},{"iata":"SBW","name":"Sibu","country":"MY","region":"MY-13","lat":2.2616,"lng":111.985},{"iata":"SBY","name":"Salisbury","country":"US","region":"US-MD","lat":38.3405,"lng":-75.5103},{"iata":"SBZ","name":"Sibiu","country":"RO","region":"RO-SB","lat":45.7858,"lng":24.0867},{"iata":"SCC","name":"Deadhorse","country":"US","region":"US-AK","lat":70.1947,"lng":-148.465},{"iata":"SCE","name":"State College","country":"US","region":"US-PA","lat":40.8494,"lng":-77.8485},{"iata":"SCH","name":"Schenectady","country":"US","region":"US-NY","lat":42.8525,"lng":-73.9289},{"iata":"SCI","name":"San Crist\u00f3bal","country":"VE","region":"VE-S","lat":7.8013,"lng":-72.2029},{"iata":"SCK","name":"Stockton","country":"US","region":"US-CA","lat":37.8933,"lng":-121.2381},{"iata":"SCL","name":"Santiago","country":"CL","region":"CL-RM","lat":-33.393,"lng":-70.7858},{"iata":"SCN","name":"Saarbr\u00fccken","country":"DE","region":"DE-SL","lat":49.2145,"lng":7.1097},{"iata":"SCO","name":"Aktau","country":"KZ","region":"KZ-MAN","lat":43.8601,"lng":51.0909},{"iata":"SCQ","name":"Santiago de Compostela","country":"ES","region":"ES-GA","lat":42.8963,"lng":-8.4151},{"iata":"SCR","name":"Malung-S\u00e4len","country":"SE","region":"SE-W","lat":61.1651,"lng":12.8335},{"iata":"SCT","name":"Mori","country":"YE","region":"YE-SU","lat":12.6321,"lng":53.9062},{"iata":"SCU","name":"Santiago","country":"CU","region":"CU-13","lat":19.9747,"lng":-75.8355},{"iata":"SCV","name":"Suceava","country":"RO","region":"RO-SV","lat":47.6875,"lng":26.3541},{"iata":"SCW","name":"Syktyvkar","country":"RU","region":"RU-KO","lat":61.647,"lng":50.8451},{"iata":"SDB","name":"Langebaanweg","country":"ZA","region":"ZA-WC","lat":-32.9689,"lng":18.1603},{"iata":"SDD","name":"Lubango","country":"AO","region":"AO-HUI","lat":-14.9248,"lng":13.5767},{"iata":"SDE","name":"Santiago del Estero","country":"AR","region":"AR-G","lat":-27.7656,"lng":-64.31},{"iata":"SDF","name":"Louisville","country":"US","region":"US-KY","lat":38.1706,"lng":-85.7351},{"iata":"SDG","name":"Sanandaj Airport","country":"IR","region":"IR-12","lat":35.2459,"lng":47.0092},{"iata":"SDJ","name":"Natori","country":"JP","region":"JP-04","lat":38.1397,"lng":140.917},{"iata":"SDK","name":"Sandakan","country":"MY","region":"MY-12","lat":5.9009,"lng":118.059},{"iata":"SDL","name":"Sundsvall/ H\u00e4rn\u00f6sand","country":"SE","region":"SE-Y","lat":62.5281,"lng":17.4439},{"iata":"SDM","name":"San Diego","country":"US","region":"US-CA","lat":32.5726,"lng":-116.98},{"iata":"SDP","name":"Sand Point","country":"US","region":"US-AK","lat":55.3139,"lng":-160.5221},{"iata":"SDQ","name":"Santo Domingo","country":"DO","region":"DO-01","lat":18.4297,"lng":-69.6689},{"iata":"SDR","name":"Santander","country":"ES","region":"ES-CB","lat":43.4271,"lng":-3.82},{"iata":"SDS","name":"Sado","country":"JP","region":"JP-15","lat":38.0602,"lng":138.414},{"iata":"SDT","name":"Saidu Sharif","country":"PK","region":"PK-KP","lat":34.8136,"lng":72.3528},{"iata":"SDU","name":"Rio de Janeiro","country":"BR","region":"BR-RJ","lat":-22.9104,"lng":-43.1628},{"iata":"SDW","name":"Chipi","country":"IN","region":"IN-MM","lat":16.0026,"lng":73.5298},{"iata":"SDY","name":"Sidney","country":"US","region":"US-MT","lat":47.7051,"lng":-104.1944},{"iata":"SEA","name":"Seattle","country":"US","region":"US-WA","lat":47.4479,"lng":-122.3103},{"iata":"SEB","name":"Sabha","country":"LY","region":"LY-SB","lat":26.9925,"lng":14.4662},{"iata":"SEK","name":"Srednekolymsk","country":"RU","region":"RU-SA","lat":67.4805,"lng":153.7364},{"iata":"SEN","name":"Southend-on-Sea, Essex","country":"GB","region":"GB-ENG","lat":51.5706,"lng":0.6936},{"iata":"SES","name":"Svetlogorsk","country":"RU","region":"RU-KYA","lat":66.84,"lng":88.4033},{"iata":"SEZ","name":"Victoria","country":"SC","region":"SC-20","lat":-4.6743,"lng":55.5218},{"iata":"SFA","name":"Sfax","country":"TN","region":"TN-61","lat":34.718,"lng":10.691},{"iata":"SFB","name":"Orlando","country":"US","region":"US-FL","lat":28.7743,"lng":-81.2346},{"iata":"SFD","name":"San Fernando de Apure","country":"VE","region":"VE-C","lat":7.8833,"lng":-67.444},{"iata":"SFE","name":"San Fernando","country":"PH","region":"PH-LUN","lat":16.5956,"lng":120.303},{"iata":"SFF","name":"Spokane","country":"US","region":"US-WA","lat":47.6829,"lng":-117.3219},{"iata":"SFG","name":"Grand Case","country":"MF","region":"MF-U-A","lat":18.1001,"lng":-63.0474},{"iata":"SFJ","name":"Kangerlussuaq","country":"GL","region":"GL-QA","lat":67.0104,"lng":-50.7153},{"iata":"SFN","name":"Santa Fe","country":"AR","region":"AR-S","lat":-31.7117,"lng":-60.8117},{"iata":"SFO","name":"San Francisco","country":"US","region":"US-CA","lat":37.6198,"lng":-122.3748},{"iata":"SFS","name":"Olongapo","country":"PH","region":"PH-ZMB","lat":14.7948,"lng":120.2719},{"iata":"SFT","name":"Skellefte\u00e5","country":"SE","region":"SE-AC","lat":64.6248,"lng":21.0769},{"iata":"SGC","name":"Surgut","country":"RU","region":"RU-KHM","lat":61.3405,"lng":73.4058},{"iata":"SGD","name":"S\u00f8nderborg","country":"DK","region":"DK-83","lat":54.9644,"lng":9.7917},{"iata":"SGE","name":"Burbach","country":"DE","region":"DE-NW","lat":50.7077,"lng":8.083},{"iata":"SGF","name":"Springfield","country":"US","region":"US-MO","lat":37.245,"lng":-93.3886},{"iata":"SGH","name":"Springfield","country":"US","region":"US-OH","lat":39.8403,"lng":-83.8402},{"iata":"SGI","name":"Sargodha","country":"PK","region":"PK-PB","lat":32.0486,"lng":72.665},{"iata":"SGL","name":"Cavite","country":"PH","region":"PH-CAV","lat":14.4954,"lng":120.904},{"iata":"SGN","name":"Ho Chi Minh City","country":"VN","region":"VN-SE","lat":10.8188,"lng":106.652},{"iata":"SGR","name":"Houston","country":"US","region":"US-TX","lat":29.6223,"lng":-95.6565},{"iata":"SGU","name":"St George","country":"US","region":"US-UT","lat":37.0364,"lng":-113.5103},{"iata":"SGZ","name":"Songkhla Airport","country":"TH","region":"TH-90","lat":7.1866,"lng":100.608},{"iata":"SHA","name":"Shanghai (Minhang)","country":"CN","region":"CN-31","lat":31.1981,"lng":121.3343},{"iata":"SHB","name":"Nakashibetsu","country":"JP","region":"JP-01","lat":43.5775,"lng":144.96},{"iata":"SHD","name":"Weyers Cave","country":"US","region":"US-VA","lat":38.2638,"lng":-78.8964},{"iata":"SHE","name":"Shenyang","country":"CN","region":"CN-21","lat":41.6398,"lng":123.4837},{"iata":"SHI","name":"Miyakojima","country":"JP","region":"JP-47","lat":24.8267,"lng":125.145},{"iata":"SHJ","name":"Sharjah","country":"AE","region":"AE-SH","lat":25.3286,"lng":55.5172},{"iata":"SHL","name":"Shillong","country":"IN","region":"IN-ML","lat":25.7036,"lng":91.9787},{"iata":"SHM","name":"Shirahama","country":"JP","region":"JP-30","lat":33.6622,"lng":135.364},{"iata":"SHO","name":"Mpaka","country":"SZ","region":"SZ-LU","lat":-26.3586,"lng":31.7169},{"iata":"SHR","name":"Sheridan","country":"US","region":"US-WY","lat":44.7692,"lng":-106.98},{"iata":"SHS","name":"Jingzhou (Shashi)","country":"CN","region":"CN-42","lat":30.2928,"lng":112.4485},{"iata":"SHT","name":"Shepparton Airport","country":"AU","region":"AU-VIC","lat":-36.4283,"lng":145.3915},{"iata":"SHV","name":"Shreveport","country":"US","region":"US-LA","lat":32.4466,"lng":-93.8256},{"iata":"SHW","name":"Sharurah","country":"SA","region":"SA-10","lat":17.4669,"lng":47.1214},{"iata":"SIA","name":"Xi'an (Baqiao)","country":"CN","region":"CN-61","lat":34.3767,"lng":109.12},{"iata":"SID","name":"Espargos","country":"CV","region":"CV-B","lat":16.7414,"lng":-22.9494},{"iata":"SIG","name":"San Juan","country":"PR","region":"PR-U-A","lat":18.4568,"lng":-66.0981},{"iata":"SIJ","name":"Siglufj\u00f6r\u00f0ur","country":"IS","region":"IS-6","lat":66.1378,"lng":-18.9082},{"iata":"SIN","name":"Singapore","country":"SG","region":"SG-04","lat":1.3502,"lng":103.994},{"iata":"SIO","name":"Smithton Airport","country":"AU","region":"AU-TAS","lat":-40.835,"lng":145.084},{"iata":"SIP","name":"Simferopol","country":"UA","region":"UA-43","lat":45.0522,"lng":33.9751},{"iata":"SIR","name":"Sion","country":"CH","region":"CH-VS","lat":46.2192,"lng":7.3269},{"iata":"SIS","name":"Sishen","country":"ZA","region":"ZA-NC","lat":-27.6486,"lng":22.9993},{"iata":"SIT","name":"Sitka","country":"US","region":"US-AK","lat":57.0471,"lng":-135.362},{"iata":"SJC","name":"San Jose","country":"US","region":"US-CA","lat":37.3625,"lng":-121.9292},{"iata":"SJD","name":"San Jos\u00e9 del Cabo","country":"MX","region":"MX-BCS","lat":23.1519,"lng":-109.7207},{"iata":"SJE","name":"San Jos\u00e9 Del Guaviare","country":"CO","region":"CO-GUV","lat":2.5797,"lng":-72.6394},{"iata":"SJI","name":"San Jose","country":"PH","region":"PH-MDC","lat":12.3615,"lng":121.047},{"iata":"SJJ","name":"Sarajevo","country":"BA","region":"BA-BIH","lat":43.8246,"lng":18.3315},{"iata":"SJK","name":"S\u00e3o Jos\u00e9 Dos Campos","country":"BR","region":"BR-SP","lat":-23.2292,"lng":-45.8615},{"iata":"SJL","name":"S\u00e3o Gabriel da Cachoeira","country":"BR","region":"BR-AM","lat":-0.1484,"lng":-66.9855},{"iata":"SJO","name":"San Jos\u00e9 (Alajuela)","country":"CR","region":"CR-A","lat":9.9939,"lng":-84.2088},{"iata":"SJP","name":"S\u00e3o Jos\u00e9 do Rio Preto","country":"BR","region":"BR-SP","lat":-20.8171,"lng":-49.407},{"iata":"SJT","name":"San Angelo","country":"US","region":"US-TX","lat":31.3577,"lng":-100.496},{"iata":"SJU","name":"San Juan","country":"PR","region":"PR-U-A","lat":18.4394,"lng":-66.0018},{"iata":"SJW","name":"Shijiazhuang","country":"CN","region":"CN-13","lat":38.2807,"lng":114.697},{"iata":"SJX","name":"Sartaneja","country":"BZ","region":"BZ-CZL","lat":18.3561,"lng":-88.1308},{"iata":"SJY","name":"Sein\u00e4joki / Ilmajoki","country":"FI","region":"FI-03","lat":62.6921,"lng":22.8323},{"iata":"SJZ","name":"Velas","country":"PT","region":"PT-20","lat":38.6655,"lng":-28.1758},{"iata":"SKA","name":"Spokane","country":"US","region":"US-WA","lat":47.6151,"lng":-117.656},{"iata":"SKB","name":"Basseterre","country":"KN","region":"KN-U-A","lat":17.3108,"lng":-62.7191},{"iata":"SKD","name":"Samarkand","country":"UZ","region":"UZ-SA","lat":39.7018,"lng":66.9815},{"iata":"SKF","name":"San Antonio","country":"US","region":"US-TX","lat":29.3842,"lng":-98.5811},{"iata":"SKG","name":"Thessaloniki","country":"GR","region":"GR-B","lat":40.5193,"lng":22.97},{"iata":"SKN","name":"Hadsel","country":"NO","region":"NO-18","lat":68.5788,"lng":15.0334},{"iata":"SKO","name":"Sokoto","country":"NG","region":"NG-SO","lat":12.9157,"lng":5.2075},{"iata":"SKP","name":"Ilinden","country":"MK","region":"MK-008","lat":41.9581,"lng":21.6226},{"iata":"SKS","name":"Vojens","country":"DK","region":"DK-83","lat":55.221,"lng":9.267},{"iata":"SKT","name":"Sialkot","country":"PK","region":"PK-PB","lat":32.5359,"lng":74.3646},{"iata":"SKV","name":"Saint Catherine","country":"EG","region":"EG-JS","lat":28.6843,"lng":34.0644},{"iata":"SKX","name":"Saransk","country":"RU","region":"RU-MO","lat":54.1251,"lng":45.2123},{"iata":"SKZ","name":"Sukkur","country":"PK","region":"PK-SD","lat":27.722,"lng":68.7917},{"iata":"SLA","name":"Salta","country":"AR","region":"AR-A","lat":-24.856,"lng":-65.4862},{"iata":"SLC","name":"Salt Lake City","country":"US","region":"US-UT","lat":40.7889,"lng":-111.9799},{"iata":"SLD","name":"Slia\u010d","country":"SK","region":"SK-BC","lat":48.6378,"lng":19.1341},{"iata":"SLE","name":"Salem","country":"US","region":"US-OR","lat":44.9095,"lng":-123.003},{"iata":"SLK","name":"Saranac Lake","country":"US","region":"US-NY","lat":44.3869,"lng":-74.2046},{"iata":"SLL","name":"Salalah","country":"OM","region":"OM-ZU","lat":17.0387,"lng":54.0913},{"iata":"SLM","name":"Salamanca","country":"ES","region":"ES-CL","lat":40.9521,"lng":-5.502},{"iata":"SLN","name":"Salina","country":"US","region":"US-KS","lat":38.791,"lng":-97.6522},{"iata":"SLP","name":"San Luis Potos\u00ed","country":"MX","region":"MX-SLP","lat":22.262,"lng":-100.9357},{"iata":"SLU","name":"Castries","country":"LC","region":"LC-02","lat":14.0202,"lng":-60.9929},{"iata":"SLW","name":"Saltillo","country":"MX","region":"MX-COA","lat":25.5379,"lng":-100.9283},{"iata":"SLY","name":"Salekhard","country":"RU","region":"RU-YAN","lat":66.5908,"lng":66.611},{"iata":"SLZ","name":"S\u00e3o Lu\u00eds","country":"BR","region":"BR-MA","lat":-2.5864,"lng":-44.235},{"iata":"SMA","name":"Vila do Porto","country":"PT","region":"PT-20","lat":36.9714,"lng":-25.1706},{"iata":"SME","name":"Somerset","country":"US","region":"US-KY","lat":37.0534,"lng":-84.6159},{"iata":"SMF","name":"Sacramento","country":"US","region":"US-CA","lat":38.6954,"lng":-121.591},{"iata":"SMI","name":"Samos Island","country":"GR","region":"GR-K","lat":37.69,"lng":26.9117},{"iata":"SML","name":"Stella Maris","country":"BS","region":"BS-LI","lat":23.5823,"lng":-75.2686},{"iata":"SMN","name":"Salmon","country":"US","region":"US-ID","lat":45.1222,"lng":-113.882},{"iata":"SMO","name":"Santa Monica","country":"US","region":"US-CA","lat":34.0158,"lng":-118.451},{"iata":"SMR","name":"Santa Marta","country":"CO","region":"CO-MAG","lat":11.1196,"lng":-74.2306},{"iata":"SMS","name":"Vohilava","country":"MG","region":"MG-A","lat":-17.0939,"lng":49.8158},{"iata":"SMV","name":"Samedan","country":"CH","region":"CH-GR","lat":46.5341,"lng":9.8841},{"iata":"SMW","name":"Smara","country":"EH","region":"EH-U-A","lat":26.732,"lng":-11.6837},{"iata":"SMX","name":"Santa Maria","country":"US","region":"US-CA","lat":34.8989,"lng":-120.457},{"iata":"SNA","name":"Santa Ana","country":"US","region":"US-CA","lat":33.6751,"lng":-117.8693},{"iata":"SNB","name":"Milikapiti","country":"AU","region":"AU-NT","lat":-11.4177,"lng":130.6485},{"iata":"SNC","name":"Salinas/La Libertad","country":"EC","region":"EC-25","lat":-2.2101,"lng":-80.9851},{"iata":"SNE","name":"Pregui\u00e7a","country":"CV","region":"CV-B","lat":16.5889,"lng":-24.2841},{"iata":"SNF","name":"San Felipe","country":"VE","region":"VE-U","lat":10.2787,"lng":-68.7552},{"iata":"SNI","name":"Greenville","country":"LR","region":"LR-SI","lat":5.0321,"lng":-9.0642},{"iata":"SNJ","name":"Sandino","country":"CU","region":"CU-01","lat":22.1005,"lng":-84.1574},{"iata":"SNN","name":"Shannon","country":"IE","region":"IE-CE","lat":52.702,"lng":-8.9248},{"iata":"SNO","name":"Sakon Nakhon Airport","country":"TH","region":"TH-47","lat":17.1951,"lng":104.119},{"iata":"SNP","name":"St Paul Island","country":"US","region":"US-AK","lat":57.1663,"lng":-170.2226},{"iata":"SNR","name":"Saint-Nazaire/Montoir","country":"FR","region":"FR-PDL","lat":47.3114,"lng":-2.1526},{"iata":"SNS","name":"Salinas","country":"US","region":"US-CA","lat":36.6628,"lng":-121.606},{"iata":"SNU","name":"Santa Clara","country":"CU","region":"CU-05","lat":22.4922,"lng":-79.9431},{"iata":"SNV","name":"Santa Elena de Uair\u00e9n","country":"VE","region":"VE-F","lat":4.5547,"lng":-61.1452},{"iata":"SNW","name":"Thandwe","country":"MM","region":"MM-16","lat":18.4607,"lng":94.3001},{"iata":"SNY","name":"Sidney","country":"US","region":"US-NE","lat":41.1013,"lng":-102.985},{"iata":"SNZ","name":"Rio de Janeiro","country":"BR","region":"BR-RJ","lat":-22.9324,"lng":-43.7191},{"iata":"SOB","name":"S\u00e1rmell\u00e9k","country":"HU","region":"HU-ZA","lat":46.6864,"lng":17.1591},{"iata":"SOC","name":"Surakarta","country":"ID","region":"ID-JT","lat":-7.516,"lng":110.7575},{"iata":"SOF","name":"Sofia","country":"BG","region":"BG-22","lat":42.6964,"lng":23.4177},{"iata":"SOJ","name":"S\u00f8rkjosen","country":"NO","region":"NO-55","lat":69.7868,"lng":20.9594},{"iata":"SOM","name":"El Tigre","country":"VE","region":"VE-B","lat":8.9451,"lng":-64.1511},{"iata":"SON","name":"Luganville","country":"VU","region":"VU-SAM","lat":-15.505,"lng":167.22},{"iata":"SOO","name":"S\u00f6derhamn","country":"SE","region":"SE-X","lat":61.2615,"lng":17.0991},{"iata":"SOQ","name":"Sorong","country":"ID","region":"ID-PB","lat":-0.894,"lng":131.287},{"iata":"SOT","name":"Sodankyla","country":"FI","region":"FI-10","lat":67.395,"lng":26.6191},{"iata":"SOU","name":"Southampton","country":"GB","region":"GB-ENG","lat":50.9503,"lng":-1.3568},{"iata":"SOW","name":"Show Low","country":"US","region":"US-AZ","lat":34.2641,"lng":-110.0071},{"iata":"SOZ","name":"Solenzara","country":"FR","region":"FR-COR","lat":41.9244,"lng":9.406},{"iata":"SPC","name":"Sta Cruz de la Palma, La Palma Island","country":"ES","region":"ES-CN","lat":28.6265,"lng":-17.7556},{"iata":"SPD","name":"Saidpur","country":"BD","region":"BD-5","lat":25.7592,"lng":88.9089},{"iata":"SPI","name":"Springfield","country":"US","region":"US-IL","lat":39.8441,"lng":-89.6779},{"iata":"SPM","name":"Trier","country":"DE","region":"DE-RP","lat":49.9765,"lng":6.6984},{"iata":"SPN","name":"I Fadang, Saipan","country":"MP","region":"MP-U-A","lat":15.1194,"lng":145.7288},{"iata":"SPP","name":"Menongue","country":"AO","region":"AO-CCU","lat":-14.6576,"lng":17.7198},{"iata":"SPR","name":"San Pedro","country":"BZ","region":"BZ-CY","lat":17.9139,"lng":-87.9711},{"iata":"SPS","name":"Wichita Falls","country":"US","region":"US-TX","lat":33.9888,"lng":-98.4919},{"iata":"SPU","name":"Split","country":"HR","region":"HR-17","lat":43.5389,"lng":16.298},{"iata":"SPX","name":"Al Jiza","country":"EG","region":"EG-GZ","lat":30.1082,"lng":30.8957},{"iata":"SPY","name":"San Pedro Airport","country":"CI","region":"CI-BS","lat":4.7467,"lng":-6.6608},{"iata":"SQD","name":"Shangrao (Hengfeng)","country":"CN","region":"CN-36","lat":28.3797,"lng":117.9643},{"iata":"SQG","name":"Sintang","country":"ID","region":"ID-KB","lat":-0.0452,"lng":111.458},{"iata":"SQJ","name":"Sanming (Sha)","country":"CN","region":"CN-35","lat":26.4263,"lng":117.8336},{"iata":"SQL","name":"San Carlos","country":"US","region":"US-CA","lat":37.5131,"lng":-122.2508},{"iata":"SQO","name":"Storuman","country":"SE","region":"SE-AC","lat":64.9609,"lng":17.6966},{"iata":"SQQ","name":"\u0160iauliai","country":"LT","region":"LT-SA","lat":55.8939,"lng":23.395},{"iata":"SQW","name":"Skive","country":"DK","region":"DK-82","lat":56.5502,"lng":9.173},{"iata":"SRE","name":"Sucre","country":"BO","region":"BO-H","lat":-19.2468,"lng":-65.1496},{"iata":"SRG","name":"Semarang","country":"ID","region":"ID-JT","lat":-6.9707,"lng":110.3732},{"iata":"SRP","name":"Leirvik","country":"NO","region":"NO-46","lat":59.7919,"lng":5.3408},{"iata":"SRQ","name":"Sarasota/Bradenton","country":"US","region":"US-FL","lat":27.3946,"lng":-82.5544},{"iata":"SRT","name":"Soroti","country":"UG","region":"UG-E","lat":1.7277,"lng":33.6228},{"iata":"SRX","name":"Sirt","country":"LY","region":"LY-SR","lat":31.0586,"lng":16.5971},{"iata":"SRY","name":"Sari","country":"IR","region":"IR-02","lat":36.6444,"lng":53.1888},{"iata":"SRZ","name":"Santa Cruz","country":"BO","region":"BO-S","lat":-17.8116,"lng":-63.1715},{"iata":"SSA","name":"Salvador","country":"BR","region":"BR-BA","lat":-12.9086,"lng":-38.3225},{"iata":"SSC","name":"Sumter","country":"US","region":"US-SC","lat":33.9727,"lng":-80.4706},{"iata":"SSE","name":"Solapur","country":"IN","region":"IN-MM","lat":17.628,"lng":75.9348},{"iata":"SSF","name":"San Antonio","country":"US","region":"US-TX","lat":29.337,"lng":-98.4711},{"iata":"SSG","name":"Malabo","country":"GQ","region":"GQ-BN","lat":3.7553,"lng":8.7087},{"iata":"SSH","name":"Sharm El Sheikh","country":"EG","region":"EG-JS","lat":27.9773,"lng":34.3947},{"iata":"SSI","name":"St Simons Island","country":"US","region":"US-GA","lat":31.1518,"lng":-81.3913},{"iata":"SSJ","name":"Alstahaug","country":"NO","region":"NO-18","lat":65.9568,"lng":12.4689},{"iata":"SSN","name":"Seongnam","country":"KR","region":"KR-41","lat":37.4447,"lng":127.1127},{"iata":"SST","name":"Santa Teresita","country":"AR","region":"AR-B","lat":-36.5423,"lng":-56.7218},{"iata":"SSY","name":"Mbanza Congo","country":"AO","region":"AO-ZAI","lat":-6.2699,"lng":14.247},{"iata":"SSZ","name":"Guaruj\u00e1","country":"BR","region":"BR-SP","lat":-23.9282,"lng":-46.3002},{"iata":"STA","name":"Skjern","country":"DK","region":"DK-82","lat":55.9901,"lng":8.3539},{"iata":"STB","name":"San Carlos del Zulia","country":"VE","region":"VE-V","lat":8.9746,"lng":-71.9433},{"iata":"STC","name":"Saint Cloud","country":"US","region":"US-MN","lat":45.5466,"lng":-94.0599},{"iata":"STD","name":"Santo Domingo","country":"VE","region":"VE-S","lat":7.5654,"lng":-72.0351},{"iata":"STG","name":"St George","country":"US","region":"US-AK","lat":56.5773,"lng":-169.6638},{"iata":"STI","name":"Santiago","country":"DO","region":"DO-25","lat":19.4041,"lng":-70.6044},{"iata":"STJ","name":"St Joseph","country":"US","region":"US-MO","lat":39.7719,"lng":-94.9097},{"iata":"STL","name":"St Louis","country":"US","region":"US-MO","lat":38.7487,"lng":-90.37},{"iata":"STM","name":"Santar\u00e9m","country":"BR","region":"BR-PA","lat":-2.4224,"lng":-54.7931},{"iata":"STN","name":"London, Essex","country":"GB","region":"GB-ENG","lat":51.885,"lng":0.235},{"iata":"STP","name":"Saint Paul","country":"US","region":"US-MN","lat":44.9348,"lng":-93.06},{"iata":"STR","name":"Stuttgart","country":"DE","region":"DE-BW","lat":48.6899,"lng":9.222},{"iata":"STS","name":"Santa Rosa","country":"US","region":"US-CA","lat":38.509,"lng":-122.813},{"iata":"STT","name":"Charlotte Amalie","country":"VI","region":"VI-ST","lat":18.3371,"lng":-64.9773},{"iata":"STV","name":"Surat","country":"IN","region":"IN-GJ","lat":21.1155,"lng":72.7433},{"iata":"STW","name":"Stavropol","country":"RU","region":"RU-STA","lat":45.1092,"lng":42.1128},{"iata":"STX","name":"Christiansted","country":"VI","region":"VI-SC","lat":17.7014,"lng":-64.8026},{"iata":"STY","name":"Salto","country":"UY","region":"UY-SA","lat":-31.4385,"lng":-57.9853},{"iata":"SUB","name":"Surabaya","country":"ID","region":"ID-JI","lat":-7.3798,"lng":112.787},{"iata":"SUF","name":"Lamezia Terme (CZ)","country":"IT","region":"IT-78","lat":38.9062,"lng":16.246},{"iata":"SUG","name":"Surigao City","country":"PH","region":"PH-SUN","lat":9.7558,"lng":125.4809},{"iata":"SUI","name":"Sukhumi","country":"GE","region":"GE-AB","lat":42.8582,"lng":41.1281},{"iata":"SUJ","name":"Satu Mare","country":"RO","region":"RO-SM","lat":47.7033,"lng":22.8857},{"iata":"SUL","name":"Sui","country":"PK","region":"PK-BA","lat":28.6451,"lng":69.1769},{"iata":"SUN","name":"Hailey","country":"US","region":"US-ID","lat":43.5044,"lng":-114.296},{"iata":"SUS","name":"St Louis","country":"US","region":"US-MO","lat":38.6621,"lng":-90.652},{"iata":"SUU","name":"Fairfield","country":"US","region":"US-CA","lat":38.2627,"lng":-121.927},{"iata":"SUV","name":"Nausori","country":"FJ","region":"FJ-C","lat":-18.0442,"lng":178.5615},{"iata":"SUX","name":"Sioux City","country":"US","region":"US-IA","lat":42.3976,"lng":-96.3822},{"iata":"SVA","name":"Savoonga","country":"US","region":"US-AK","lat":63.6864,"lng":-170.493},{"iata":"SVB","name":"Sambava","country":"MG","region":"MG-D","lat":-14.2786,"lng":50.1747},{"iata":"SVC","name":"Silver City","country":"US","region":"US-NM","lat":32.6367,"lng":-108.1547},{"iata":"SVD","name":"Kingstown","country":"VC","region":"VC-04","lat":13.1597,"lng":-61.1488},{"iata":"SVG","name":"Stavanger","country":"NO","region":"NO-11","lat":58.8767,"lng":5.6378},{"iata":"SVI","name":"San Vicente Del Cagu\u00e1n","country":"CO","region":"CO-CAQ","lat":2.1522,"lng":-74.7663},{"iata":"SVJ","name":"Svolv\u00e6r","country":"NO","region":"NO-18","lat":68.2433,"lng":14.6692},{"iata":"SVL","name":"Savonlinna","country":"FI","region":"FI-04","lat":61.9431,"lng":28.9451},{"iata":"SVN","name":"Savannah","country":"US","region":"US-GA","lat":32.01,"lng":-81.1457},{"iata":"SVO","name":"Moscow","country":"RU","region":"RU-MOS","lat":55.9769,"lng":37.4112},{"iata":"SVP","name":"Kuito","country":"AO","region":"AO-BIE","lat":-12.4046,"lng":16.9474},{"iata":"SVQ","name":"Seville","country":"ES","region":"ES-AN","lat":37.418,"lng":-5.8931},{"iata":"SVW","name":"Sparrevohn","country":"US","region":"US-AK","lat":61.0974,"lng":-155.574},{"iata":"SVX","name":"Yekaterinburg","country":"RU","region":"RU-SVE","lat":56.7431,"lng":60.8027},{"iata":"SVZ","name":"San Antonio del Tachira","country":"VE","region":"VE-S","lat":7.8408,"lng":-72.4399},{"iata":"SWA","name":"Jieyang (Rongcheng)","country":"CN","region":"CN-44","lat":23.552,"lng":116.5033},{"iata":"SWC","name":"Stawell Airport","country":"AU","region":"AU-VIC","lat":-37.0717,"lng":142.741},{"iata":"SWD","name":"Seward","country":"US","region":"US-AK","lat":60.1305,"lng":-149.4186},{"iata":"SWF","name":"Newburgh","country":"US","region":"US-NY","lat":41.5042,"lng":-74.1089},{"iata":"SWH","name":"Swan Hill Airport","country":"AU","region":"AU-VIC","lat":-35.3758,"lng":143.533},{"iata":"SWO","name":"Stillwater","country":"US","region":"US-OK","lat":36.1621,"lng":-97.0856},{"iata":"SWS","name":"Swansea","country":"GB","region":"GB-WLS","lat":51.6014,"lng":-4.071},{"iata":"SWT","name":"Strezhevoy","country":"RU","region":"RU-TOM","lat":60.7094,"lng":77.66},{"iata":"SWU","name":"Suwon","country":"KR","region":"KR-41","lat":37.2394,"lng":127.007},{"iata":"SWV","name":"Evensk","country":"RU","region":"RU-MAG","lat":61.9218,"lng":159.2291},{"iata":"SXB","name":"Strasbourg","country":"FR","region":"FR-GES","lat":48.5383,"lng":7.6282},{"iata":"SXE","name":"Sale","country":"AU","region":"AU-VIC","lat":-38.0908,"lng":146.9653},{"iata":"SXI","name":"Siri","country":"IR","region":"IR-22","lat":25.9089,"lng":54.5394},{"iata":"SXJ","name":"Shanshan","country":"CN","region":"CN-65","lat":42.9117,"lng":90.2475},{"iata":"SXL","name":"Sligo","country":"IE","region":"IE-SO","lat":54.2802,"lng":-8.5992},{"iata":"SXM","name":"Sint Maarten","country":"SX","region":"SX-U-A","lat":18.041,"lng":-63.1089},{"iata":"SXN","name":"Sowa","country":"BW","region":"BW-ST","lat":-20.5534,"lng":26.1158},{"iata":"SXQ","name":"Soldotna","country":"US","region":"US-AK","lat":60.4749,"lng":-151.0385},{"iata":"SXR","name":"Srinagar","country":"IN","region":"IN-JK","lat":33.9871,"lng":74.7742},{"iata":"SXV","name":"Salem","country":"IN","region":"IN-TN","lat":11.7833,"lng":78.0656},{"iata":"SXZ","name":"Siirt","country":"TR","region":"TR-56","lat":37.9789,"lng":41.8404},{"iata":"SYA","name":"Shemya","country":"US","region":"US-AK","lat":52.7123,"lng":174.114},{"iata":"SYD","name":"Sydney (Mascot)","country":"AU","region":"AU-NSW","lat":-33.9461,"lng":151.177},{"iata":"SYJ","name":"Sirjan","country":"IR","region":"IR-08","lat":29.5509,"lng":55.6727},{"iata":"SYO","name":"Shonai","country":"JP","region":"JP-06","lat":38.8122,"lng":139.787},{"iata":"SYP","name":"Santiago","country":"PA","region":"PA-9","lat":8.0856,"lng":-80.9453},{"iata":"SYQ","name":"San Jose","country":"CR","region":"CR-SJ","lat":9.9571,"lng":-84.1398},{"iata":"SYR","name":"Syracuse","country":"US","region":"US-NY","lat":43.1112,"lng":-76.1063},{"iata":"SYS","name":"Saskylakh","country":"RU","region":"RU-SA","lat":71.9279,"lng":114.08},{"iata":"SYT","name":"L'H\u00f4pital-le-Mercier, Sa\u00f4ne-et-Loire","country":"FR","region":"FR-BFC","lat":46.414,"lng":4.0142},{"iata":"SYW","name":"Sehwan Sharif","country":"PK","region":"PK-SD","lat":26.4731,"lng":67.7172},{"iata":"SYX","name":"Sanya (Tianya)","country":"CN","region":"CN-46","lat":18.3029,"lng":109.412},{"iata":"SYY","name":"Stornoway, Western Isles","country":"GB","region":"GB-SCT","lat":58.2156,"lng":-6.3311},{"iata":"SYZ","name":"Shiraz","country":"IR","region":"IR-07","lat":29.5392,"lng":52.5898},{"iata":"SZA","name":"Soyo","country":"AO","region":"AO-ZAI","lat":-6.1411,"lng":12.3718},{"iata":"SZB","name":"Subang","country":"MY","region":"MY-10","lat":3.1306,"lng":101.549},{"iata":"SZF","name":"Samsun","country":"TR","region":"TR-55","lat":41.254,"lng":36.5675},{"iata":"SZG","name":"Salzburg","country":"AT","region":"AT-5","lat":47.7933,"lng":13.0043},{"iata":"SZH","name":"Shuozhou","country":"CN","region":"CN-14","lat":39.2732,"lng":112.6916},{"iata":"SZJ","name":"Isla de la Juventud","country":"CU","region":"CU-99","lat":21.6425,"lng":-82.9551},{"iata":"SZK","name":"Skukuza","country":"ZA","region":"ZA-MP","lat":-24.9609,"lng":31.5886},{"iata":"SZL","name":"Knob Noster","country":"US","region":"US-MO","lat":38.7303,"lng":-93.5479},{"iata":"SZV","name":"Suzhou","country":"CN","region":"CN-32","lat":31.2631,"lng":120.401},{"iata":"SZX","name":"Shenzhen","country":"CN","region":"CN-44","lat":22.6395,"lng":113.8033},{"iata":"SZY","name":"Szymany","country":"PL","region":"PL-WN","lat":53.4819,"lng":20.9377},{"iata":"SZZ","name":"Szczecin(Glewice)","country":"PL","region":"PL-ZP","lat":53.5847,"lng":14.9022},{"iata":"TAB","name":"Scarborough","country":"TT","region":"TT-TOB","lat":11.1496,"lng":-60.8313},{"iata":"TAC","name":"Tacloban City","country":"PH","region":"PH-LEY","lat":11.2278,"lng":125.0278},{"iata":"TAE","name":"Daegu","country":"KR","region":"KR-27","lat":35.8944,"lng":128.657},{"iata":"TAF","name":"Tafraoui","country":"DZ","region":"DZ-31","lat":35.5424,"lng":-0.5323},{"iata":"TAG","name":"Panglao","country":"PH","region":"PH-BOH","lat":9.573,"lng":123.7701},{"iata":"TAH","name":"Tanna Island","country":"VU","region":"VU-TAE","lat":-19.4551,"lng":169.224},{"iata":"TAI","name":"Taiz","country":"YE","region":"YE-TA","lat":13.686,"lng":44.1391},{"iata":"TAK","name":"Takamatsu","country":"JP","region":"JP-37","lat":34.215,"lng":134.0155},{"iata":"TAM","name":"Ciudad Madero","country":"MX","region":"MX-TAM","lat":22.2926,"lng":-97.8671},{"iata":"TAO","name":"Qingdao (Jiaozhou)","country":"CN","region":"CN-37","lat":36.362,"lng":120.0882},{"iata":"TAP","name":"Tapachula","country":"MX","region":"MX-CHP","lat":14.7945,"lng":-92.3699},{"iata":"TAR","name":"Grottaglie","country":"IT","region":"IT-75","lat":40.5175,"lng":17.4032},{"iata":"TAS","name":"Tashkent","country":"UZ","region":"UZ-TO","lat":41.2579,"lng":69.2812},{"iata":"TAT","name":"Poprad","country":"SK","region":"SK-PV","lat":49.071,"lng":20.2414},{"iata":"TAY","name":"Tartu","country":"EE","region":"EE-7B","lat":58.3074,"lng":26.6865},{"iata":"TAZ","name":"Da\u015foguz","country":"TM","region":"TM-D","lat":41.7599,"lng":59.8361},{"iata":"TBB","name":"Tuy Hoa","country":"VN","region":"VN-SCC","lat":13.0496,"lng":109.334},{"iata":"TBF","name":"Tabiteuea North Airport","country":"KI","region":"KI-G","lat":-1.2245,"lng":174.776},{"iata":"TBH","name":"Tablas Island","country":"PH","region":"PH-ROM","lat":12.311,"lng":122.085},{"iata":"TBI","name":"Cat Island","country":"BS","region":"BS-CI","lat":24.3153,"lng":-75.4523},{"iata":"TBJ","name":"Tabarka","country":"TN","region":"TN-32","lat":36.98,"lng":8.8769},{"iata":"TBN","name":"Fort Leonard Wood","country":"US","region":"US-MO","lat":37.7416,"lng":-92.1407},{"iata":"TBP","name":"Tumbes","country":"PE","region":"PE-TUM","lat":-3.5521,"lng":-80.3811},{"iata":"TBS","name":"Tbilisi","country":"GE","region":"GE-TB","lat":41.6692,"lng":44.9547},{"iata":"TBT","name":"Tabatinga","country":"BR","region":"BR-AM","lat":-4.2557,"lng":-69.9358},{"iata":"TBU","name":"Nuku'alofa","country":"TO","region":"TO-04","lat":-21.2414,"lng":-175.1492},{"iata":"TBW","name":"Tambov","country":"RU","region":"RU-TAM","lat":52.8061,"lng":41.4828},{"iata":"TBZ","name":"Tabriz","country":"IR","region":"IR-03","lat":38.1339,"lng":46.235},{"iata":"TCA","name":"Tennant Creek","country":"AU","region":"AU-NT","lat":-19.6344,"lng":134.183},{"iata":"TCB","name":"Treasure Cay","country":"BS","region":"BS-CO","lat":26.7453,"lng":-77.3913},{"iata":"TCC","name":"Tucumcari","country":"US","region":"US-NM","lat":35.1828,"lng":-103.603},{"iata":"TCE","name":"Mihail Kog\u0103lniceanu","country":"RO","region":"RO-TL","lat":45.0625,"lng":28.7143},{"iata":"TCL","name":"Tuscaloosa","country":"US","region":"US-AL","lat":33.2206,"lng":-87.6114},{"iata":"TCM","name":"Tacoma","country":"US","region":"US-WA","lat":47.1377,"lng":-122.476},{"iata":"TCO","name":"Tumaco","country":"CO","region":"CO-NAR","lat":1.8144,"lng":-78.7492},{"iata":"TCP","name":"Taba","country":"EG","region":"EG-JS","lat":29.5945,"lng":34.7758},{"iata":"TCQ","name":"Tacna","country":"PE","region":"PE-TAC","lat":-18.0533,"lng":-70.2758},{"iata":"TCS","name":"Truth or Consequences","country":"US","region":"US-NM","lat":33.2369,"lng":-107.272},{"iata":"TCX","name":"Tabas","country":"IR","region":"IR-21","lat":33.6678,"lng":56.8927},{"iata":"TCZ","name":"Baoshan (Tengchong)","country":"CN","region":"CN-53","lat":24.9381,"lng":98.4858},{"iata":"TDD","name":"Trinidad","country":"BO","region":"BO-B","lat":-14.8187,"lng":-64.918},{"iata":"TDG","name":"Tandag","country":"PH","region":"PH-SUR","lat":9.072,"lng":126.1713},{"iata":"TDK","name":"Taldykorgan","country":"KZ","region":"KZ-JET","lat":45.1225,"lng":78.4428},{"iata":"TDL","name":"Tandil","country":"AR","region":"AR-B","lat":-37.2346,"lng":-59.2286},{"iata":"TDX","name":"Laem Ngop","country":"TH","region":"TH-23","lat":12.2746,"lng":102.319},{"iata":"TEA","name":"Tela","country":"HN","region":"HN-AT","lat":15.7759,"lng":-87.4758},{"iata":"TEB","name":"Teterboro","country":"US","region":"US-NJ","lat":40.8501,"lng":-74.0608},{"iata":"TEC","name":"Tel\u00eamaco Borba","country":"BR","region":"BR-PR","lat":-24.3178,"lng":-50.6516},{"iata":"TED","name":"Thisted","country":"DK","region":"DK-81","lat":57.0688,"lng":8.7052},{"iata":"TEE","name":"T\u00e9bessi","country":"DZ","region":"DZ-12","lat":35.4316,"lng":8.1207},{"iata":"TEF","name":"Telfer Airport","country":"AU","region":"AU-WA","lat":-21.715,"lng":122.229},{"iata":"TEM","name":"Temora","country":"AU","region":"AU-NSW","lat":-34.4214,"lng":147.512},{"iata":"TEN","name":"Tongren (Daxing)","country":"CN","region":"CN-52","lat":27.8833,"lng":109.3089},{"iata":"TEQ","name":"\u00c7orlu","country":"TR","region":"TR-59","lat":41.1382,"lng":27.9191},{"iata":"TER","name":"Praia da Vit\u00f3ria","country":"PT","region":"PT-20","lat":38.7618,"lng":-27.0908},{"iata":"TET","name":"Tete","country":"MZ","region":"MZ-T","lat":-16.1048,"lng":33.6402},{"iata":"TEU","name":"Manapouri Airport","country":"NZ","region":"NZ-STL","lat":-45.5331,"lng":167.65},{"iata":"TEV","name":"Teruel","country":"ES","region":"ES-AR","lat":40.4103,"lng":-1.2174},{"iata":"TEX","name":"Telluride","country":"US","region":"US-CO","lat":37.9538,"lng":-107.908},{"iata":"TEZ","name":"Tezpur Airport","country":"IN","region":"IN-AS","lat":26.7091,"lng":92.7847},{"iata":"TFF","name":"Tef\u00e9","country":"BR","region":"BR-AM","lat":-3.3829,"lng":-64.7241},{"iata":"TFN","name":"Tenerife","country":"ES","region":"ES-CN","lat":28.4828,"lng":-16.3417},{"iata":"TFS","name":"Tenerife","country":"ES","region":"ES-CN","lat":28.0445,"lng":-16.5725},{"iata":"TFU","name":"Chengdu (Jianyang)","country":"CN","region":"CN-51","lat":30.3125,"lng":104.4413},{"iata":"TGA","name":"Western Water Catchment","country":"SG","region":"SG-03","lat":1.3876,"lng":103.7083},{"iata":"TGD","name":"Podgorica","country":"ME","region":"ME-16","lat":42.3594,"lng":19.2519},{"iata":"TGG","name":"Kuala Terengganu","country":"MY","region":"MY-11","lat":5.3826,"lng":103.103},{"iata":"TGJ","name":"Tiga","country":"NC","region":"NC-01","lat":-21.0964,"lng":167.8038},{"iata":"TGK","name":"Taganrog","country":"RU","region":"RU-ROS","lat":47.1983,"lng":38.8492},{"iata":"TGM","name":"Recea","country":"RO","region":"RO-MS","lat":46.4677,"lng":24.4125},{"iata":"TGN","name":"Morwell","country":"AU","region":"AU-VIC","lat":-38.211,"lng":146.4708},{"iata":"TGO","name":"Tongliao","country":"CN","region":"CN-15","lat":43.5567,"lng":122.2},{"iata":"TGP","name":"Bor","country":"RU","region":"RU-KYA","lat":61.5897,"lng":89.994},{"iata":"TGR","name":"Touggourt","country":"DZ","region":"DZ-55","lat":33.0678,"lng":6.0887},{"iata":"TGT","name":"Tanga","country":"TZ","region":"TZ-25","lat":-5.0924,"lng":39.0712},{"iata":"TGU","name":"Tegucigalpa","country":"HN","region":"HN-FM","lat":14.0609,"lng":-87.2172},{"iata":"TGZ","name":"Tuxtla Guti\u00e9rrez","country":"MX","region":"MX-CHP","lat":16.5616,"lng":-93.0257},{"iata":"THE","name":"Teresina","country":"BR","region":"BR-PI","lat":-5.0602,"lng":-42.8237},{"iata":"THG","name":"Biloela","country":"AU","region":"AU-QLD","lat":-24.4949,"lng":150.578},{"iata":"THL","name":"Tachileik","country":"MM","region":"MM-17","lat":20.4838,"lng":99.9354},{"iata":"THN","name":"Trollh\u00e4ttan","country":"SE","region":"SE-Q","lat":58.3181,"lng":12.345},{"iata":"THQ","name":"Tianshui (Maiji)","country":"CN","region":"CN-62","lat":34.5601,"lng":105.8603},{"iata":"THR","name":"Tehran","country":"IR","region":"IR-23","lat":35.6892,"lng":51.3144},{"iata":"THS","name":"Sukhothai Airport","country":"TH","region":"TH-64","lat":17.238,"lng":99.8182},{"iata":"THU","name":"Pituffik","country":"GL","region":"GL-AV","lat":76.5306,"lng":-68.7005},{"iata":"THZ","name":"Tahoua","country":"NE","region":"NE-5","lat":14.8757,"lng":5.2654},{"iata":"TIA","name":"Rinas","country":"AL","region":"AL-02","lat":41.4147,"lng":19.7206},{"iata":"TID","name":"Tiaret","country":"DZ","region":"DZ-14","lat":35.3411,"lng":1.4631},{"iata":"TIF","name":"Taif","country":"SA","region":"SA-02","lat":21.4847,"lng":40.5441},{"iata":"TIH","name":"Tuherahera","country":"PF","region":"PF-U-A","lat":-15.1196,"lng":-148.231},{"iata":"TIJ","name":"Tijuana","country":"MX","region":"MX-BCN","lat":32.541,"lng":-116.97},{"iata":"TIK","name":"Oklahoma City","country":"US","region":"US-OK","lat":35.4147,"lng":-97.3866},{"iata":"TIM","name":"Timika","country":"ID","region":"ID-PT","lat":-4.5298,"lng":136.8874},{"iata":"TIN","name":"Tindouf","country":"DZ","region":"DZ-37","lat":27.7004,"lng":-8.1671},{"iata":"TIQ","name":"Tinian Island","country":"MP","region":"MP-U-A","lat":15.0005,"lng":145.619},{"iata":"TIR","name":"Tirupati","country":"IN","region":"IN-AP","lat":13.632,"lng":79.5399},{"iata":"TIU","name":"Timaru Airport","country":"NZ","region":"NZ-CAN","lat":-44.3028,"lng":171.225},{"iata":"TIV","name":"Tivat","country":"ME","region":"ME-19","lat":42.4047,"lng":18.7233},{"iata":"TIW","name":"Tacoma","country":"US","region":"US-WA","lat":47.2674,"lng":-122.5773},{"iata":"TIX","name":"Titusville","country":"US","region":"US-FL","lat":28.5148,"lng":-80.7992},{"iata":"TJA","name":"Tarija","country":"BO","region":"BO-T","lat":-21.5557,"lng":-64.7013},{"iata":"TJG","name":"Tanta-Tabalong","country":"ID","region":"ID-KS","lat":-2.2166,"lng":115.436},{"iata":"TJH","name":"Toyooka","country":"JP","region":"JP-28","lat":35.5128,"lng":134.787},{"iata":"TJI","name":"Trujillo","country":"HN","region":"HN-CL","lat":15.9266,"lng":-85.9386},{"iata":"TJK","name":"Tokat","country":"TR","region":"TR-60","lat":40.3247,"lng":36.3906},{"iata":"TJM","name":"Tyumen","country":"RU","region":"RU-TYU","lat":57.179,"lng":65.3277},{"iata":"TJU","name":"Kulob","country":"TJ","region":"TJ-KT","lat":37.9881,"lng":69.805},{"iata":"TKA","name":"Talkeetna","country":"US","region":"US-AK","lat":62.3205,"lng":-150.094},{"iata":"TKC","name":"Tiko","country":"CM","region":"CM-SW","lat":4.0892,"lng":9.3605},{"iata":"TKD","name":"Sekondi-Takoradi","country":"GH","region":"GH-WP","lat":4.8961,"lng":-1.7748},{"iata":"TKF","name":"Truckee","country":"US","region":"US-CA","lat":39.3186,"lng":-120.1406},{"iata":"TKG","name":"Bandar Lampung","country":"ID","region":"ID-LA","lat":-5.2468,"lng":105.1825},{"iata":"TKH","name":"Takhli","country":"TH","region":"TH-60","lat":15.2773,"lng":100.296},{"iata":"TKK","name":"Weno Island","country":"FM","region":"FM-TRK","lat":7.4619,"lng":151.843},{"iata":"TKN","name":"Amagi","country":"JP","region":"JP-46","lat":27.8364,"lng":128.8814},{"iata":"TKP","name":"Takapoto Airport","country":"PF","region":"PF-U-A","lat":-14.7095,"lng":-145.246},{"iata":"TKS","name":"Tokushima","country":"JP","region":"JP-36","lat":34.1326,"lng":134.6078},{"iata":"TKT","name":"Tak Airport","country":"TH","region":"TH-63","lat":16.896,"lng":99.2533},{"iata":"TKU","name":"Turku","country":"FI","region":"FI-19","lat":60.5141,"lng":22.2628},{"iata":"TKX","name":"Takaroa Airport","country":"PF","region":"PF-U-A","lat":-14.4558,"lng":-145.025},{"iata":"TLC","name":"Toluca","country":"MX","region":"MX-MEX","lat":19.3369,"lng":-99.5658},{"iata":"TLE","name":"Toliara","country":"MG","region":"MG-U","lat":-23.3834,"lng":43.7285},{"iata":"TLH","name":"Tallahassee","country":"US","region":"US-FL","lat":30.4012,"lng":-84.3543},{"iata":"TLJ","name":"Takotna","country":"US","region":"US-AK","lat":62.8944,"lng":-155.977},{"iata":"TLL","name":"Tallinn","country":"EE","region":"EE-37","lat":59.4132,"lng":24.8326},{"iata":"TLM","name":"Zenata","country":"DZ","region":"DZ-13","lat":35.0127,"lng":-1.4571},{"iata":"TLN","name":"Hy\u00e8res, Var","country":"FR","region":"FR-PAC","lat":43.0973,"lng":6.146},{"iata":"TLQ","name":"Turpan","country":"CN","region":"CN-65","lat":43.0308,"lng":89.0987},{"iata":"TLS","name":"Toulouse/Blagnac","country":"FR","region":"FR-OCC","lat":43.6291,"lng":1.3638},{"iata":"TLV","name":"Tel Aviv","country":"IL","region":"IL-M","lat":32.0114,"lng":34.8867},{"iata":"TLX","name":"Talca","country":"CL","region":"CL-ML","lat":-35.3778,"lng":-71.6017},{"iata":"TMB","name":"Miami","country":"US","region":"US-FL","lat":25.6479,"lng":-80.4328},{"iata":"TME","name":"Tame","country":"CO","region":"CO-ARA","lat":6.4511,"lng":-71.7603},{"iata":"TMH","name":"Tanah Merah","country":"ID","region":"ID-PS","lat":-6.0967,"lng":140.3035},{"iata":"TMJ","name":"Termez","country":"UZ","region":"UZ-SU","lat":37.2873,"lng":67.3119},{"iata":"TML","name":"Tamale","country":"GH","region":"GH-NP","lat":9.5539,"lng":-0.8661},{"iata":"TMM","name":"Toamasina","country":"MG","region":"MG-A","lat":-18.1135,"lng":49.3923},{"iata":"TMO","name":"Tumeremo Airport","country":"VE","region":"VE-F","lat":7.2494,"lng":-61.5289},{"iata":"TMP","name":"Tampere / Pirkkala","country":"FI","region":"FI-11","lat":61.4141,"lng":23.6044},{"iata":"TMR","name":"Tamanrasset","country":"DZ","region":"DZ-11","lat":22.811,"lng":5.4508},{"iata":"TMS","name":"S\u00e3o Tom\u00e9","country":"ST","region":"ST-01","lat":0.3782,"lng":6.7122},{"iata":"TMT","name":"Oriximin\u00e1","country":"BR","region":"BR-PA","lat":-1.4896,"lng":-56.3968},{"iata":"TMW","name":"Tamworth","country":"AU","region":"AU-NSW","lat":-31.0779,"lng":150.8455},{"iata":"TMX","name":"Timimoun","country":"DZ","region":"DZ-54","lat":29.2371,"lng":0.276},{"iata":"TNA","name":"Jinan (Licheng)","country":"CN","region":"CN-37","lat":36.8572,"lng":117.216},{"iata":"TND","name":"Trinidad","country":"CU","region":"CU-07","lat":21.7883,"lng":-79.9972},{"iata":"TNE","name":"Tanegashima","country":"JP","region":"JP-46","lat":30.6051,"lng":130.991},{"iata":"TNF","name":"Toussus-le-Noble, Yvelines","country":"FR","region":"FR-IDF","lat":48.7519,"lng":2.1062},{"iata":"TNG","name":"Tangier","country":"MA","region":"MA-01","lat":35.7317,"lng":-5.9215},{"iata":"TNH","name":"Tonghua","country":"CN","region":"CN-22","lat":42.0484,"lng":125.734},{"iata":"TNJ","name":"Tanjung Pinang-Bintan Island","country":"ID","region":"ID-KR","lat":0.924,"lng":104.5334},{"iata":"TNN","name":"Tainan (Rende)","country":"TW","region":"TW-TNN","lat":22.9504,"lng":120.206},{"iata":"TNR","name":"Antananarivo","country":"MG","region":"MG-T","lat":-18.7969,"lng":47.4788},{"iata":"TNW","name":"Ahuano","country":"EC","region":"EC-N","lat":-1.0602,"lng":-77.5805},{"iata":"TOD","name":"Tioman Island","country":"MY","region":"MY-06","lat":2.8182,"lng":104.16},{"iata":"TOE","name":"Tozeur","country":"TN","region":"TN-72","lat":33.9397,"lng":8.1106},{"iata":"TOF","name":"Tomsk","country":"RU","region":"RU-TOM","lat":56.3803,"lng":85.2083},{"iata":"TOI","name":"Troy","country":"US","region":"US-AL","lat":31.8604,"lng":-86.0121},{"iata":"TOJ","name":"Madrid","country":"ES","region":"ES-MD","lat":40.4879,"lng":-3.4568},{"iata":"TOL","name":"Toledo","country":"US","region":"US-OH","lat":41.5868,"lng":-83.8078},{"iata":"TOM","name":"Timbuktu","country":"ML","region":"ML-7","lat":16.7305,"lng":-3.0076},{"iata":"TOP","name":"Topeka","country":"US","region":"US-KS","lat":39.0699,"lng":-95.6226},{"iata":"TOQ","name":"Tocopilla","country":"CL","region":"CL-AN","lat":-22.1411,"lng":-70.0629},{"iata":"TOS","name":"Troms\u00f8","country":"NO","region":"NO-55","lat":69.6833,"lng":18.9189},{"iata":"TOU","name":"Touho","country":"NC","region":"NC-02","lat":-20.7901,"lng":165.2595},{"iata":"TOY","name":"Toyama","country":"JP","region":"JP-16","lat":36.6484,"lng":137.1874},{"iata":"TPA","name":"Tampa","country":"US","region":"US-FL","lat":27.9755,"lng":-82.5332},{"iata":"TPC","name":"Tarapoa","country":"EC","region":"EC-U","lat":-0.123,"lng":-76.3378},{"iata":"TPE","name":"Taoyuan","country":"TW","region":"TW-TAO","lat":25.0777,"lng":121.233},{"iata":"TPH","name":"Tonopah","country":"US","region":"US-NV","lat":38.0602,"lng":-117.087},{"iata":"TPJ","name":"Taplejung","country":"NP","region":"NP-P1","lat":27.3509,"lng":87.6953},{"iata":"TPL","name":"Temple","country":"US","region":"US-TX","lat":31.1525,"lng":-97.4078},{"iata":"TPP","name":"Tarapoto","country":"PE","region":"PE-SAM","lat":-6.5087,"lng":-76.3732},{"iata":"TPQ","name":"Tepic","country":"MX","region":"MX-NAY","lat":21.4198,"lng":-104.8425},{"iata":"TPS","name":"Trapani (TP)","country":"IT","region":"IT-82","lat":37.9114,"lng":12.488},{"iata":"TQD","name":"Al Habbaniyah","country":"IQ","region":"IQ-AN","lat":33.3381,"lng":43.5971},{"iata":"TQO","name":"Tulum","country":"MX","region":"MX-ROO","lat":20.1721,"lng":-87.6603},{"iata":"TQS","name":"Tres Esquinas","country":"CO","region":"CO-CAQ","lat":0.7459,"lng":-75.234},{"iata":"TRA","name":"Tarama","country":"JP","region":"JP-47","lat":24.6538,"lng":124.6755},{"iata":"TRC","name":"Torre\u00f3n","country":"MX","region":"MX-COA","lat":25.5623,"lng":-103.4046},{"iata":"TRD","name":"Trondheim","country":"NO","region":"NO-50","lat":63.4578,"lng":10.924},{"iata":"TRE","name":"Balemartine, Argyll and Bute","country":"GB","region":"GB-SCT","lat":56.4992,"lng":-6.8692},{"iata":"TRF","name":"Sandefjord(Torp)","country":"NO","region":"NO-39","lat":59.1867,"lng":10.2586},{"iata":"TRG","name":"Tauranga","country":"NZ","region":"NZ-BOP","lat":-37.6719,"lng":176.196},{"iata":"TRI","name":"Blountville","country":"US","region":"US-TN","lat":36.4752,"lng":-82.4074},{"iata":"TRK","name":"Tarakan","country":"ID","region":"ID-KU","lat":3.3251,"lng":117.5642},{"iata":"TRM","name":"Palm Springs","country":"US","region":"US-CA","lat":33.6267,"lng":-116.16},{"iata":"TRN","name":"Caselle Torinese (TO)","country":"IT","region":"IT-21","lat":45.2008,"lng":7.6496},{"iata":"TRO","name":"Taree","country":"AU","region":"AU-NSW","lat":-31.8886,"lng":152.514},{"iata":"TRQ","name":"Tarauac\u00e1","country":"BR","region":"BR-AC","lat":-8.1555,"lng":-70.783},{"iata":"TRR","name":"Trincomalee","country":"LK","region":"LK-5","lat":8.5392,"lng":81.1813},{"iata":"TRS","name":"Ronchi dei Legionari/Trieste","country":"IT","region":"IT-36","lat":45.8275,"lng":13.4722},{"iata":"TRT","name":"Toraja","country":"ID","region":"ID-SS","lat":-3.1858,"lng":119.9177},{"iata":"TRU","name":"Trujillo","country":"PE","region":"PE-LAL","lat":-8.0824,"lng":-79.1088},{"iata":"TRV","name":"Thiruvananthapuram","country":"IN","region":"IN-KL","lat":8.4819,"lng":76.92},{"iata":"TRW","name":"South Tarawa","country":"KI","region":"KI-G","lat":1.3816,"lng":173.147},{"iata":"TRZ","name":"Tiruchirappalli","country":"IN","region":"IN-TN","lat":10.7629,"lng":78.7177},{"iata":"TSA","name":"Taipei (Songshan)","country":"TW","region":"TW-TPE","lat":25.0672,"lng":121.5528},{"iata":"TSB","name":"Tsumeb","country":"NA","region":"NA-OT","lat":-19.2621,"lng":17.7325},{"iata":"TSF","name":"Treviso (TV)","country":"IT","region":"IT-34","lat":45.6484,"lng":12.1944},{"iata":"TSJ","name":"Tsushima","country":"JP","region":"JP-42","lat":34.2849,"lng":129.331},{"iata":"TSM","name":"Taos","country":"US","region":"US-NM","lat":36.4525,"lng":-105.6775},{"iata":"TSN","name":"Tianjin","country":"CN","region":"CN-12","lat":39.1244,"lng":117.346},{"iata":"TSR","name":"Timi\u015foara","country":"RO","region":"RO-TM","lat":45.8099,"lng":21.3379},{"iata":"TST","name":"Trang","country":"TH","region":"TH-92","lat":7.5087,"lng":99.6166},{"iata":"TSV","name":"Townsville","country":"AU","region":"AU-QLD","lat":-19.2529,"lng":146.7665},{"iata":"TTA","name":"Tan Tan","country":"MA","region":"MA-10","lat":28.4476,"lng":-11.1617},{"iata":"TTC","name":"Taltal","country":"CL","region":"CL-AN","lat":-25.5643,"lng":-70.3759},{"iata":"TTD","name":"Portland","country":"US","region":"US-OR","lat":45.5494,"lng":-122.401},{"iata":"TTE","name":"Ternate","country":"ID","region":"ID-MU","lat":0.831,"lng":127.3816},{"iata":"TTG","name":"Tartagal","country":"AR","region":"AR-A","lat":-22.6169,"lng":-63.793},{"iata":"TTH","name":"Thumrait","country":"OM","region":"OM-ZU","lat":17.666,"lng":54.0246},{"iata":"TTJ","name":"Tottori","country":"JP","region":"JP-31","lat":35.5301,"lng":134.165},{"iata":"TTN","name":"Ewing Township","country":"US","region":"US-NJ","lat":40.2767,"lng":-74.8135},{"iata":"TTT","name":"Taitung City","country":"TW","region":"TW-TTT","lat":22.755,"lng":121.102},{"iata":"TTU","name":"T\u00e9touan","country":"MA","region":"MA-01","lat":35.5943,"lng":-5.32},{"iata":"TUA","name":"Tulc\u00e1n","country":"EC","region":"EC-C","lat":0.8095,"lng":-77.7081},{"iata":"TUB","name":"Tubuai Airport","country":"PF","region":"PF-U-A","lat":-23.3654,"lng":-149.524},{"iata":"TUC","name":"San Miguel de Tucum\u00e1n","country":"AR","region":"AR-T","lat":-26.8374,"lng":-65.1042},{"iata":"TUD","name":"Tambacounda","country":"SN","region":"SN-TC","lat":13.7368,"lng":-13.6531},{"iata":"TUF","name":"Tours, Indre-et-Loire","country":"FR","region":"FR-CVL","lat":47.4322,"lng":0.7276},{"iata":"TUG","name":"Tuguegarao City","country":"PH","region":"PH-CAG","lat":17.6434,"lng":121.7332},{"iata":"TUI","name":"Turaif","country":"SA","region":"SA-08","lat":31.6922,"lng":38.7315},{"iata":"TUK","name":"Turbat","country":"PK","region":"PK-BA","lat":25.9848,"lng":63.0289},{"iata":"TUL","name":"Tulsa","country":"US","region":"US-OK","lat":36.1971,"lng":-95.8862},{"iata":"TUM","name":"Tumut","country":"AU","region":"AU-NSW","lat":-35.2683,"lng":148.2405},{"iata":"TUN","name":"Tunis","country":"TN","region":"TN-11","lat":36.851,"lng":10.2272},{"iata":"TUO","name":"Taupo","country":"NZ","region":"NZ-WKO","lat":-38.7397,"lng":176.084},{"iata":"TUP","name":"Tupelo","country":"US","region":"US-MS","lat":34.2681,"lng":-88.7699},{"iata":"TUR","name":"Tucuru\u00ed","country":"BR","region":"BR-PA","lat":-3.786,"lng":-49.7203},{"iata":"TUS","name":"Tucson","country":"US","region":"US-AZ","lat":32.115,"lng":-110.9381},{"iata":"TUU","name":"Tabuk","country":"SA","region":"SA-07","lat":28.3711,"lng":36.6249},{"iata":"TUV","name":"Tucupita","country":"VE","region":"VE-Y","lat":9.089,"lng":-62.0942},{"iata":"TVC","name":"Traverse City","country":"US","region":"US-MI","lat":44.7414,"lng":-85.5822},{"iata":"TVF","name":"Thief River Falls","country":"US","region":"US-MN","lat":48.0657,"lng":-96.185},{"iata":"TVL","name":"South Lake Tahoe","country":"US","region":"US-CA","lat":38.8939,"lng":-119.995},{"iata":"TVY","name":"Dawei","country":"MM","region":"MM-05","lat":14.1039,"lng":98.2036},{"iata":"TWF","name":"Twin Falls","country":"US","region":"US-ID","lat":42.4818,"lng":-114.488},{"iata":"TWT","name":"Bongao","country":"PH","region":"PH-TAW","lat":5.0482,"lng":119.7433},{"iata":"TWU","name":"Tawau","country":"MY","region":"MY-12","lat":4.3134,"lng":118.1215},{"iata":"TWZ","name":"Twitzel","country":"NZ","region":"NZ-CAN","lat":-44.235,"lng":170.118},{"iata":"TXC","name":"Orsha","country":"BY","region":"BY-VI","lat":54.44,"lng":30.2967},{"iata":"TXE","name":"Takengon","country":"ID","region":"ID-AC","lat":4.7211,"lng":96.8519},{"iata":"TXK","name":"Texarkana","country":"US","region":"US-AR","lat":33.4537,"lng":-93.991},{"iata":"TXN","name":"Huangshan","country":"CN","region":"CN-34","lat":29.7333,"lng":118.256},{"iata":"TYB","name":"Tibooburra Airport","country":"AU","region":"AU-NSW","lat":-29.4511,"lng":142.058},{"iata":"TYF","name":"Torsby","country":"SE","region":"SE-S","lat":60.1576,"lng":12.9913},{"iata":"TYL","name":"Talara","country":"PE","region":"PE-PIU","lat":-4.5766,"lng":-81.2541},{"iata":"TYM","name":"Staniel Cay","country":"BS","region":"BS-EX","lat":24.1691,"lng":-76.4391},{"iata":"TYN","name":"Taiyuan","country":"CN","region":"CN-14","lat":37.7469,"lng":112.628},{"iata":"TYR","name":"Tyler","country":"US","region":"US-TX","lat":32.3541,"lng":-95.4024},{"iata":"TYS","name":"Knoxville/Maryville","country":"US","region":"US-TN","lat":35.811,"lng":-83.994},{"iata":"TZA","name":"Belize City","country":"BZ","region":"BZ-BZ","lat":17.5172,"lng":-88.1958},{"iata":"TZL","name":"Dubrave Gornje","country":"BA","region":"BA-BIH","lat":44.4599,"lng":18.7236},{"iata":"TZN","name":"Andros","country":"BS","region":"BS-SA","lat":24.1587,"lng":-77.5898},{"iata":"TZX","name":"Trabzon","country":"TR","region":"TR-61","lat":40.9951,"lng":39.7897},{"iata":"UAB","name":"Sar\u0131\u00e7am","country":"TR","region":"TR-01","lat":37.0021,"lng":35.4259},{"iata":"UAI","name":"Suai","country":"TL","region":"TL-CO","lat":-9.3019,"lng":125.2863},{"iata":"UAK","name":"Narsarsuaq","country":"GL","region":"GL-KU","lat":61.1605,"lng":-45.426},{"iata":"UAM","name":"Yigo","country":"GU","region":"GU-U-A","lat":13.584,"lng":144.93},{"iata":"UAQ","name":"San Juan","country":"AR","region":"AR-J","lat":-31.5715,"lng":-68.4182},{"iata":"UAR","name":"Bouarfa","country":"MA","region":"MA-02","lat":32.5143,"lng":-1.9831},{"iata":"UBA","name":"Uberaba","country":"BR","region":"BR-MG","lat":-19.765,"lng":-47.9648},{"iata":"UBJ","name":"Ube","country":"JP","region":"JP-35","lat":33.93,"lng":131.279},{"iata":"UBN","name":"Ulaanbaatar (Sergelen)","country":"MN","region":"MN-047","lat":47.6469,"lng":106.8198},{"iata":"UBP","name":"Ubon Ratchathani","country":"TH","region":"TH-34","lat":15.2513,"lng":104.87},{"iata":"UCB","name":"Ulanqab","country":"CN","region":"CN-15","lat":41.1303,"lng":113.1073},{"iata":"UCT","name":"Ukhta","country":"RU","region":"RU-KO","lat":63.5669,"lng":53.8047},{"iata":"UDE","name":"Uden","country":"NL","region":"NL-NB","lat":51.6572,"lng":5.7078},{"iata":"UDI","name":"Uberl\u00e2ndia","country":"BR","region":"BR-MG","lat":-18.8836,"lng":-48.2259},{"iata":"UDJ","name":"Uzhhorod","country":"UA","region":"UA-21","lat":48.6343,"lng":22.2634},{"iata":"UDR","name":"Udaipur","country":"IN","region":"IN-RJ","lat":24.6177,"lng":73.8961},{"iata":"UEL","name":"Quelimane","country":"MZ","region":"MZ-Q","lat":-17.8555,"lng":36.8691},{"iata":"UEO","name":"Kumejima","country":"JP","region":"JP-47","lat":26.3634,"lng":126.7138},{"iata":"UET","name":"Quetta","country":"PK","region":"PK-BA","lat":30.2514,"lng":66.9378},{"iata":"UFA","name":"Ufa","country":"RU","region":"RU-BA","lat":54.5575,"lng":55.8744},{"iata":"UGA","name":"Bulgan","country":"MN","region":"MN-067","lat":48.855,"lng":103.476},{"iata":"UGC","name":"Urgench","country":"UZ","region":"UZ-XO","lat":41.5827,"lng":60.6434},{"iata":"UGO","name":"Uige","country":"AO","region":"AO-UIG","lat":-7.6031,"lng":15.0278},{"iata":"UGU","name":"Bilogai","country":"ID","region":"ID-PT","lat":-3.7395,"lng":137.0312},{"iata":"UHE","name":"Uhersk\u00e9 Hradi\u0161t\u011b","country":"CZ","region":"CZ-ZL","lat":49.0294,"lng":17.4397},{"iata":"UIB","name":"Quibd\u00f3","country":"CO","region":"CO-CHO","lat":5.6908,"lng":-76.6412},{"iata":"UIH","name":"Quy Nohn","country":"VN","region":"VN-SCC","lat":13.955,"lng":109.042},{"iata":"UIN","name":"Quincy","country":"US","region":"US-IL","lat":39.9427,"lng":-91.1946},{"iata":"UIO","name":"Quito","country":"EC","region":"EC-P","lat":-0.1254,"lng":-78.3543},{"iata":"UIP","name":"Quimper/Pluguffan","country":"FR","region":"FR-BRE","lat":47.973,"lng":-4.1697},{"iata":"UKB","name":"Kobe","country":"JP","region":"JP-28","lat":34.6328,"lng":135.224},{"iata":"UKI","name":"Ukiah","country":"US","region":"US-CA","lat":39.126,"lng":-123.201},{"iata":"UKK","name":"Ust-Kamenogorsk (Oskemen)","country":"KZ","region":"KZ-VOS","lat":50.035,"lng":82.4961},{"iata":"UKS","name":"Sevastopol","country":"UA","region":"UA-43","lat":44.6918,"lng":33.5746},{"iata":"UKX","name":"Ust-Kut","country":"RU","region":"RU-IRK","lat":56.8567,"lng":105.73},{"iata":"ULA","name":"San Julian","country":"AR","region":"AR-Z","lat":-49.3068,"lng":-67.8026},{"iata":"ULD","name":"Ulundi","country":"ZA","region":"ZA-NL","lat":-28.3206,"lng":31.4165},{"iata":"ULG","name":"\u00d6lgii","country":"MN","region":"MN-071","lat":48.9933,"lng":89.9225},{"iata":"ULH","name":"Al-Ula","country":"SA","region":"SA-03","lat":26.4836,"lng":38.117},{"iata":"ULK","name":"Lensk","country":"RU","region":"RU-SA","lat":60.7206,"lng":114.826},{"iata":"ULN","name":"Ulaanbaatar","country":"MN","region":"MN-1","lat":47.8431,"lng":106.767},{"iata":"ULO","name":"Ulaangom","country":"MN","region":"MN-046","lat":50.0666,"lng":91.9383},{"iata":"ULP","name":"Quilpie Airport","country":"AU","region":"AU-QLD","lat":-26.6092,"lng":144.2537},{"iata":"ULQ","name":"Tulu\u00e1","country":"CO","region":"CO-VAC","lat":4.0884,"lng":-76.2351},{"iata":"ULU","name":"Gulu","country":"UG","region":"UG-N","lat":2.8056,"lng":32.2718},{"iata":"ULV","name":"Ulyanovsk","country":"RU","region":"RU-ULY","lat":54.2683,"lng":48.2267},{"iata":"ULY","name":"Cherdakly","country":"RU","region":"RU-ULY","lat":54.401,"lng":48.8027},{"iata":"UMB","name":"Kalumbila","country":"ZM","region":"ZM-06","lat":-12.2536,"lng":25.4443},{"iata":"UME","name":"Ume\u00e5","country":"SE","region":"SE-AC","lat":63.7918,"lng":20.2828},{"iata":"UND","name":"Kunduz","country":"AF","region":"AF-KDZ","lat":36.6651,"lng":68.9108},{"iata":"UNI","name":"Union Island","country":"VC","region":"VC-06","lat":12.6001,"lng":-61.4119},{"iata":"UNK","name":"Unalakleet","country":"US","region":"US-AK","lat":63.8884,"lng":-160.799},{"iata":"UNN","name":"Ranong","country":"TH","region":"TH-85","lat":9.7776,"lng":98.5855},{"iata":"UOX","name":"Oxford","country":"US","region":"US-MS","lat":34.3843,"lng":-89.5368},{"iata":"UPB","name":"Havana","country":"CU","region":"CU-15","lat":23.0328,"lng":-82.5794},{"iata":"UPG","name":"Makassar","country":"ID","region":"ID-SN","lat":-5.0755,"lng":119.5537},{"iata":"UPL","name":"Upala","country":"CR","region":"CR-A","lat":10.8922,"lng":-85.0162},{"iata":"UPN","name":"Uruapan","country":"MX","region":"MX-MIC","lat":19.3967,"lng":-102.039},{"iata":"URA","name":"Uralsk","country":"KZ","region":"KZ-ZAP","lat":51.152,"lng":51.5437},{"iata":"URC","name":"\u00dcr\u00fcmqi","country":"CN","region":"CN-65","lat":43.9136,"lng":87.4794},{"iata":"URE","name":"Kuressaare","country":"EE","region":"EE-74","lat":58.2299,"lng":22.5095},{"iata":"URG","name":"Uruguaiana","country":"BR","region":"BR-RS","lat":-29.7822,"lng":-57.0382},{"iata":"URJ","name":"Uray","country":"RU","region":"RU-KHM","lat":60.1033,"lng":64.8267},{"iata":"URO","name":"Boos","country":"FR","region":"FR-NOR","lat":49.3849,"lng":1.1791},{"iata":"URS","name":"Kursk","country":"RU","region":"RU-KRS","lat":51.7506,"lng":36.2956},{"iata":"URT","name":"Surat Thani","country":"TH","region":"TH-84","lat":9.1326,"lng":99.1356},{"iata":"URY","name":"Gurayat","country":"SA","region":"SA-12","lat":31.4124,"lng":37.2789},{"iata":"USA","name":"Concord","country":"US","region":"US-NC","lat":35.3878,"lng":-80.7091},{"iata":"USH","name":"Ushuaia","country":"AR","region":"AR-V","lat":-54.8433,"lng":-68.2958},{"iata":"USK","name":"Usinsk","country":"RU","region":"RU-KO","lat":66.0047,"lng":57.3672},{"iata":"USM","name":"Na Thon (Ko Samui Island)","country":"TH","region":"TH-84","lat":9.5478,"lng":100.062},{"iata":"USN","name":"Ulsan","country":"KR","region":"KR-31","lat":35.5935,"lng":129.352},{"iata":"USQ","name":"U\u015fak","country":"TR","region":"TR-64","lat":38.6815,"lng":29.4717},{"iata":"USR","name":"Ust-Nera","country":"RU","region":"RU-SA","lat":64.55,"lng":143.115},{"iata":"UST","name":"St Augustine","country":"US","region":"US-FL","lat":29.9592,"lng":-81.3398},{"iata":"USU","name":"Coron","country":"PH","region":"PH-PLW","lat":12.1219,"lng":120.1008},{"iata":"UTH","name":"Udon Thani","country":"TH","region":"TH-41","lat":17.3862,"lng":102.7886},{"iata":"UTI","name":"Utti / Valkeala","country":"FI","region":"FI-09","lat":60.8964,"lng":26.9384},{"iata":"UTN","name":"Upington","country":"ZA","region":"ZA-NC","lat":-28.4002,"lng":21.2636},{"iata":"UTO","name":"Utopia Creek","country":"US","region":"US-AK","lat":65.9928,"lng":-153.704},{"iata":"UTP","name":"Rayong","country":"TH","region":"TH-21","lat":12.6799,"lng":101.005},{"iata":"UTS","name":"Ust-Tsylma","country":"RU","region":"RU-KO","lat":65.4373,"lng":52.2003},{"iata":"UTT","name":"Mthatha","country":"ZA","region":"ZA-EC","lat":-31.5464,"lng":28.6734},{"iata":"UTW","name":"Queenstown","country":"ZA","region":"ZA-EC","lat":-31.9202,"lng":26.8822},{"iata":"UUA","name":"Bugulma","country":"RU","region":"RU-TA","lat":54.6412,"lng":52.8002},{"iata":"UUD","name":"Ulan Ude","country":"RU","region":"RU-BU","lat":51.8086,"lng":107.4397},{"iata":"UUN","name":"Baruun Urt Airport","country":"MN","region":"MN-051","lat":46.6603,"lng":113.285},{"iata":"UUS","name":"Yuzhno-Sakhalinsk","country":"RU","region":"RU-SAK","lat":46.8855,"lng":142.7175},{"iata":"UVE","name":"Ouv\u00e9a","country":"NC","region":"NC-01","lat":-20.6409,"lng":166.573},{"iata":"UVF","name":"Vieux Fort","country":"LC","region":"LC-11","lat":13.7332,"lng":-60.9526},{"iata":"UYL","name":"Nyala","country":"SD","region":"SD-11","lat":12.0535,"lng":24.9562},{"iata":"UYN","name":"Yulin","country":"CN","region":"CN-61","lat":38.3597,"lng":109.5909},{"iata":"UZC","name":"Stapari","country":"RS","region":"RS-16","lat":43.8989,"lng":19.6977},{"iata":"UZU","name":"Curuzu Cuatia","country":"AR","region":"AR-W","lat":-29.7706,"lng":-57.9789},{"iata":"VAA","name":"Vaasa","country":"FI","region":"FI-12","lat":63.0502,"lng":21.7625},{"iata":"VAD","name":"Valdosta","country":"US","region":"US-GA","lat":30.9678,"lng":-83.193},{"iata":"VAF","name":"Chabeuil, Dr\u00f4me","country":"FR","region":"FR-ARA","lat":44.9216,"lng":4.9699},{"iata":"VAG","name":"Varginha","country":"BR","region":"BR-MG","lat":-21.5914,"lng":-45.4741},{"iata":"VAI","name":"Vanimo","country":"PG","region":"PG-SAN","lat":-2.6926,"lng":141.3028},{"iata":"VAM","name":"Maamigili","country":"MV","region":"MV-00","lat":3.4718,"lng":72.8326},{"iata":"VAN","name":"Van","country":"TR","region":"TR-65","lat":38.4682,"lng":43.3323},{"iata":"VAQ","name":"Vanavara","country":"RU","region":"RU-KYA","lat":60.3562,"lng":102.3096},{"iata":"VAR","name":"Varna","country":"BG","region":"BG-03","lat":43.2321,"lng":27.8251},{"iata":"VAV","name":"Vava'u Island","country":"TO","region":"TO-05","lat":-18.5853,"lng":-173.962},{"iata":"VAW","name":"Vard\u00f8","country":"NO","region":"NO-56","lat":70.3554,"lng":31.0449},{"iata":"VBG","name":"Lompoc","country":"US","region":"US-CA","lat":34.7373,"lng":-120.584},{"iata":"VBS","name":"Montichiari (BS)","country":"IT","region":"IT-25","lat":45.4289,"lng":10.3306},{"iata":"VBY","name":"Visby","country":"SE","region":"SE-I","lat":57.6628,"lng":18.3462},{"iata":"VCA","name":"Can Tho","country":"VN","region":"VN-SW","lat":10.0834,"lng":105.7094},{"iata":"VCE","name":"Venezia (VE)","country":"IT","region":"IT-34","lat":45.5053,"lng":12.3519},{"iata":"VCP","name":"Campinas","country":"BR","region":"BR-SP","lat":-23.0074,"lng":-47.1345},{"iata":"VCS","name":"Con Dao","country":"VN","region":"VN-SE","lat":8.7318,"lng":106.633},{"iata":"VCT","name":"Victoria","country":"US","region":"US-TX","lat":28.8526,"lng":-96.9185},{"iata":"VDC","name":"Vit\u00f3ria da Conquista","country":"BR","region":"BR-BA","lat":-14.9079,"lng":-40.9148},{"iata":"VDE","name":"El Hierro Island","country":"ES","region":"ES-CN","lat":27.8148,"lng":-17.8871},{"iata":"VDH","name":"Dong Hoi","country":"VN","region":"VN-NC","lat":17.515,"lng":106.5906},{"iata":"VDM","name":"Viedma / Carmen de Patagones","country":"AR","region":"AR-R","lat":-40.8692,"lng":-63.0004},{"iata":"VDO","name":"Van Don","country":"VN","region":"VN-NE","lat":21.1207,"lng":107.4154},{"iata":"VDP","name":"Valle de La Pascua Airport","country":"VE","region":"VE-J","lat":9.222,"lng":-65.9936},{"iata":"VDR","name":"Villa Dolores","country":"AR","region":"AR-X","lat":-31.9452,"lng":-65.1463},{"iata":"VDS","name":"Vads\u00f8","country":"NO","region":"NO-56","lat":70.0653,"lng":29.8447},{"iata":"VDZ","name":"Valdez","country":"US","region":"US-AK","lat":61.1327,"lng":-146.2466},{"iata":"VEL","name":"Vernal","country":"US","region":"US-UT","lat":40.4362,"lng":-109.5117},{"iata":"VEO","name":"Severo-Yeniseysk","country":"RU","region":"RU-KYA","lat":60.3733,"lng":93.0117},{"iata":"VER","name":"Veracruz","country":"MX","region":"MX-VER","lat":19.1396,"lng":-96.1886},{"iata":"VEY","name":"Vestmannaeyjar","country":"IS","region":"IS-8","lat":63.4243,"lng":-20.2789},{"iata":"VFA","name":"Victoria Falls","country":"ZW","region":"ZW-MN","lat":-18.0974,"lng":25.8369},{"iata":"VGA","name":"Vijayawada","country":"IN","region":"IN-AP","lat":16.53,"lng":80.8049},{"iata":"VGD","name":"Vologda","country":"RU","region":"RU-VLG","lat":59.2825,"lng":39.9444},{"iata":"VGO","name":"Vigo","country":"ES","region":"ES-GA","lat":42.2318,"lng":-8.6268},{"iata":"VGT","name":"Las Vegas","country":"US","region":"US-NV","lat":36.2091,"lng":-115.194},{"iata":"VHC","name":"Saurimo","country":"AO","region":"AO-LSU","lat":-9.6891,"lng":20.4319},{"iata":"VHM","name":"Vilhelmina","country":"SE","region":"SE-AC","lat":64.5791,"lng":16.8336},{"iata":"VHY","name":"Charmeil, Allier","country":"FR","region":"FR-ARA","lat":46.1697,"lng":3.4036},{"iata":"VIE","name":"Vienna","country":"AT","region":"AT-9","lat":48.1103,"lng":16.5697},{"iata":"VIG","name":"El Vig\u00eda","country":"VE","region":"VE-L","lat":8.6241,"lng":-71.6727},{"iata":"VII","name":"Vinh","country":"VN","region":"VN-NC","lat":18.7376,"lng":105.671},{"iata":"VIJ","name":"Spanish Town","country":"VG","region":"VG-U-A","lat":18.4466,"lng":-64.4279},{"iata":"VIL","name":"Dakhla","country":"EH","region":"EH-U-A","lat":23.7183,"lng":-15.932},{"iata":"VIN","name":"Vinnitsa","country":"UA","region":"UA-05","lat":49.2425,"lng":28.6138},{"iata":"VIP","name":"Payerne","country":"CH","region":"CH-FR","lat":46.8432,"lng":6.9151},{"iata":"VIR","name":"Durban","country":"ZA","region":"ZA-NL","lat":-29.7706,"lng":31.0584},{"iata":"VIS","name":"Visalia","country":"US","region":"US-CA","lat":36.3187,"lng":-119.393},{"iata":"VIT","name":"Alava","country":"ES","region":"ES-PV","lat":42.8828,"lng":-2.7245},{"iata":"VIX","name":"Vit\u00f3ria","country":"BR","region":"BR-ES","lat":-20.258,"lng":-40.285},{"iata":"VIY","name":"V\u00e9lizy-Villacoublay, Yvelines","country":"FR","region":"FR-IDF","lat":48.7744,"lng":2.2031},{"iata":"VKG","name":"Rach Gia","country":"VN","region":"VN-SW","lat":9.958,"lng":105.1324},{"iata":"VKO","name":"Moscow","country":"RU","region":"RU-MOW","lat":55.5915,"lng":37.2615},{"iata":"VKT","name":"Vorkuta","country":"RU","region":"RU-KO","lat":67.4886,"lng":63.9931},{"iata":"VKV","name":"Arkhangelsk","country":"RU","region":"RU-ARK","lat":64.4417,"lng":40.4217},{"iata":"VLC","name":"Valencia","country":"ES","region":"ES-VC","lat":39.4892,"lng":-0.481},{"iata":"VLD","name":"Valdosta","country":"US","region":"US-GA","lat":30.7825,"lng":-83.2767},{"iata":"VLG","name":"Villa Gesell","country":"AR","region":"AR-B","lat":-37.2354,"lng":-57.0292},{"iata":"VLI","name":"Port Vila","country":"VU","region":"VU-SEE","lat":-17.6993,"lng":168.32},{"iata":"VLL","name":"Valladolid","country":"ES","region":"ES-CL","lat":41.7061,"lng":-4.8519},{"iata":"VLM","name":"Villamontes","country":"BO","region":"BO-T","lat":-21.2552,"lng":-63.4056},{"iata":"VLN","name":"Valencia","country":"VE","region":"VE-G","lat":10.1497,"lng":-67.9284},{"iata":"VLO","name":"Vlor\u00eb","country":"AL","region":"AL-12","lat":40.6056,"lng":19.4261},{"iata":"VLR","name":"Vallenar","country":"CL","region":"CL-AT","lat":-28.5964,"lng":-70.756},{"iata":"VLV","name":"Valera","country":"VE","region":"VE-T","lat":9.3405,"lng":-70.5841},{"iata":"VLY","name":"Angelsey","country":"GB","region":"GB-WLS","lat":53.2481,"lng":-4.5353},{"iata":"VME","name":"Villa Mercedes","country":"AR","region":"AR-D","lat":-33.7299,"lng":-65.3874},{"iata":"VMI","name":"Puerto Vallemi","country":"PY","region":"PY-1","lat":-22.1594,"lng":-57.9424},{"iata":"VMU","name":"Baimuru","country":"PG","region":"PG-GPK","lat":-7.497,"lng":144.8218},{"iata":"VNE","name":"Vannes/Meucon","country":"FR","region":"FR-BRE","lat":47.7233,"lng":-2.7186},{"iata":"VNO","name":"Vilnius","country":"LT","region":"LT-VL","lat":54.6341,"lng":25.2858},{"iata":"VNS","name":"Varanasi","country":"IN","region":"IN-UP","lat":25.4522,"lng":82.8625},{"iata":"VNX","name":"Vilanculo","country":"MZ","region":"MZ-I","lat":-22.0184,"lng":35.3133},{"iata":"VNY","name":"Van Nuys","country":"US","region":"US-CA","lat":34.2098,"lng":-118.49},{"iata":"VOD","name":"Vodochody","country":"CZ","region":"CZ-ST","lat":50.2166,"lng":14.3958},{"iata":"VOG","name":"Volgograd","country":"RU","region":"RU-VGG","lat":48.7813,"lng":44.3392},{"iata":"VOH","name":"Vohemar","country":"MG","region":"MG-D","lat":-13.3758,"lng":50.0028},{"iata":"VOK","name":"Camp Douglas","country":"US","region":"US-WI","lat":43.939,"lng":-90.2534},{"iata":"VOL","name":"Nea Anchialos","country":"GR","region":"GR-E","lat":39.2196,"lng":22.7943},{"iata":"VOZ","name":"Voronezh","country":"RU","region":"RU-VOR","lat":51.8137,"lng":39.2317},{"iata":"VPE","name":"Ngiva","country":"AO","region":"AO-CNN","lat":-17.0435,"lng":15.6838},{"iata":"VPN","name":"Vopnafj\u00f6r\u00f0ur","country":"IS","region":"IS-7","lat":65.7206,"lng":-14.8506},{"iata":"VPS","name":"Valparaiso","country":"US","region":"US-FL","lat":30.4813,"lng":-86.5158},{"iata":"VPY","name":"Chimoio","country":"MZ","region":"MZ-B","lat":-19.1513,"lng":33.429},{"iata":"VPZ","name":"Valparaiso","country":"US","region":"US-IN","lat":41.454,"lng":-87.0071},{"iata":"VQQ","name":"Jacksonville","country":"US","region":"US-FL","lat":30.2187,"lng":-81.8767},{"iata":"VQS","name":"Vieques","country":"PR","region":"PR-U-A","lat":18.1348,"lng":-65.4936},{"iata":"VRA","name":"Matanzas","country":"CU","region":"CU-04","lat":23.0344,"lng":-81.4353},{"iata":"VRB","name":"Vero Beach","country":"US","region":"US-FL","lat":27.6556,"lng":-80.4179},{"iata":"VRC","name":"Virac","country":"PH","region":"PH-CAT","lat":13.5764,"lng":124.206},{"iata":"VRE","name":"Vredendal","country":"ZA","region":"ZA-WC","lat":-31.641,"lng":18.5448},{"iata":"VRK","name":"Varkaus / Joroinen","country":"FI","region":"FI-04","lat":62.1711,"lng":27.8686},{"iata":"VRL","name":"Vila Real","country":"PT","region":"PT-17","lat":41.2743,"lng":-7.7205},{"iata":"VRN","name":"Caselle (VR)","country":"IT","region":"IT-34","lat":45.395,"lng":10.8873},{"iata":"VRO","name":"Santa Marta","country":"CU","region":"CU-04","lat":23.124,"lng":-81.3016},{"iata":"VRU","name":"Vyrburg","country":"ZA","region":"ZA-NW","lat":-26.9824,"lng":24.7288},{"iata":"VSA","name":"Villahermosa","country":"MX","region":"MX-TAB","lat":17.9943,"lng":-92.8182},{"iata":"VSE","name":"Viseu","country":"PT","region":"PT-18","lat":40.7255,"lng":-7.889},{"iata":"VST","name":"Stockholm / V\u00e4ster\u00e5s","country":"SE","region":"SE-U","lat":59.5894,"lng":16.6336},{"iata":"VTB","name":"Vitebsk","country":"BY","region":"BY-VI","lat":55.1265,"lng":30.3496},{"iata":"VTE","name":"Vientiane","country":"LA","region":"LA-VT","lat":17.9851,"lng":102.5667},{"iata":"VTM","name":"Beersheba","country":"IL","region":"IL-D","lat":31.2083,"lng":35.0123},{"iata":"VTN","name":"Valentine","country":"US","region":"US-NE","lat":42.8562,"lng":-100.5492},{"iata":"VTU","name":"Las Tunas","country":"CU","region":"CU-10","lat":20.9876,"lng":-76.9358},{"iata":"VTZ","name":"Visakhapatnam","country":"IN","region":"IN-AP","lat":17.7235,"lng":83.2277},{"iata":"VUP","name":"Valledupar","country":"CO","region":"CO-CES","lat":10.435,"lng":-73.2495},{"iata":"VUS","name":"Velikiy Ustyug","country":"RU","region":"RU-VLG","lat":60.7883,"lng":46.26},{"iata":"VVC","name":"Villavicencio","country":"CO","region":"CO-MET","lat":4.1679,"lng":-73.6138},{"iata":"VVI","name":"Santa Cruz","country":"BO","region":"BO-S","lat":-17.6448,"lng":-63.1354},{"iata":"VVO","name":"Artyom","country":"RU","region":"RU-PRI","lat":43.3963,"lng":132.1482},{"iata":"VVZ","name":"Illizi","country":"DZ","region":"DZ-33","lat":26.7235,"lng":8.6227},{"iata":"VXC","name":"Lichinga","country":"MZ","region":"MZ-A","lat":-13.274,"lng":35.2663},{"iata":"VXE","name":"S\u00e3o Pedro","country":"CV","region":"CV-B","lat":16.8334,"lng":-25.0553},{"iata":"VXO","name":"V\u00e4xj\u00f6","country":"SE","region":"SE-G","lat":56.9291,"lng":14.728},{"iata":"VYI","name":"Vilyuisk","country":"RU","region":"RU-SA","lat":63.7567,"lng":121.6933},{"iata":"WAE","name":"Wadi Al Dawasir","country":"SA","region":"SA-01","lat":20.5043,"lng":45.1996},{"iata":"WAG","name":"Wanganui","country":"NZ","region":"NZ-MWT","lat":-39.9635,"lng":175.0244},{"iata":"WAI","name":"Antsohihy","country":"MG","region":"MG-M","lat":-14.8988,"lng":47.9939},{"iata":"WAT","name":"Waterford","country":"IE","region":"IE-WD","lat":52.1872,"lng":-7.087},{"iata":"WAW","name":"Warsaw","country":"PL","region":"PL-MZ","lat":52.1657,"lng":20.9671},{"iata":"WBG","name":"Jagel","country":"DE","region":"DE-SH","lat":54.4593,"lng":9.5163},{"iata":"WBM","name":"Wapenamanda","country":"PG","region":"PG-EPW","lat":-5.6353,"lng":143.8922},{"iata":"WCH","name":"Chait\u00e9n","country":"CL","region":"CL-LL","lat":-42.7819,"lng":-72.835},{"iata":"WDH","name":"Windhoek","country":"NA","region":"NA-KH","lat":-22.4799,"lng":17.4709},{"iata":"WDS","name":"Shiyan (Maojian)","country":"CN","region":"CN-42","lat":32.5929,"lng":110.9063},{"iata":"WEF","name":"Weifang (Kuiwen)","country":"CN","region":"CN-37","lat":36.6467,"lng":119.119},{"iata":"WEH","name":"Weihai","country":"CN","region":"CN-37","lat":37.1871,"lng":122.229},{"iata":"WEI","name":"Weipa","country":"AU","region":"AU-QLD","lat":-12.6775,"lng":141.9226},{"iata":"WFI","name":"Fianarantsoa","country":"MG","region":"MG-F","lat":-21.4416,"lng":47.1117},{"iata":"WFR","name":"Queen Maud Island","country":"AQ","region":"AQ-U-A","lat":-71.5264,"lng":8.7995},{"iata":"WGA","name":"Forest Hill","country":"AU","region":"AU-NSW","lat":-35.1635,"lng":147.4683},{"iata":"WGE","name":"Walgett Airport","country":"AU","region":"AU-NSW","lat":-30.0328,"lng":148.126},{"iata":"WGN","name":"Shaoyang (Wugang)","country":"CN","region":"CN-43","lat":26.8061,"lng":110.641},{"iata":"WGT","name":"Laceby","country":"AU","region":"AU-VIC","lat":-36.4179,"lng":146.3069},{"iata":"WHA","name":"Wuhu","country":"CN","region":"CN-34","lat":31.1045,"lng":118.6669},{"iata":"WHB","name":"Eliwana","country":"AU","region":"AU-WA","lat":-22.4284,"lng":116.8879},{"iata":"WHK","name":"Whakat\u0101ne","country":"NZ","region":"NZ-BOP","lat":-37.9222,"lng":176.917},{"iata":"WHN","name":"Wuhan (Hannan)","country":"CN","region":"CN-42","lat":30.2552,"lng":114.0628},{"iata":"WIC","name":"Wick","country":"GB","region":"GB-SCT","lat":58.4589,"lng":-3.0931},{"iata":"WIE","name":"Wiesbaden","country":"DE","region":"DE-HE","lat":50.0498,"lng":8.3254},{"iata":"WIL","name":"Nairobi","country":"KE","region":"KE-110","lat":-1.3217,"lng":36.8148},{"iata":"WIN","name":"Winton Airport","country":"AU","region":"AU-QLD","lat":-22.3636,"lng":143.086},{"iata":"WIR","name":"Wairoa","country":"NZ","region":"NZ-HKB","lat":-39.0119,"lng":177.4044},{"iata":"WJF","name":"Lancaster","country":"US","region":"US-CA","lat":34.7411,"lng":-118.219},{"iata":"WJR","name":"Wajir","country":"KE","region":"KE-500","lat":1.7332,"lng":40.0916},{"iata":"WJU","name":"Wonju","country":"KR","region":"KR-42","lat":37.4371,"lng":127.9601},{"iata":"WKA","name":"Wanaka","country":"NZ","region":"NZ-OTA","lat":-44.7221,"lng":169.2463},{"iata":"WKB","name":"Warracknabeal Airport","country":"AU","region":"AU-VIC","lat":-36.3211,"lng":142.419},{"iata":"WKF","name":"Pretoria","country":"ZA","region":"ZA-GT","lat":-25.83,"lng":28.2225},{"iata":"WKJ","name":"Wakkanai","country":"JP","region":"JP-01","lat":45.4042,"lng":141.801},{"iata":"WKK","name":"Aleknagik","country":"US","region":"US-AK","lat":59.2826,"lng":-158.618},{"iata":"WLG","name":"Wellington","country":"NZ","region":"NZ-WGN","lat":-41.3268,"lng":174.8069},{"iata":"WLS","name":"Wallis Island","country":"WF","region":"WF-U-A","lat":-13.2394,"lng":-176.1986},{"iata":"WMC","name":"Winnemucca","country":"US","region":"US-NV","lat":40.8966,"lng":-117.806},{"iata":"WME","name":"Mount Keith Airport","country":"AU","region":"AU-WA","lat":-27.2873,"lng":120.5549},{"iata":"WMH","name":"Mountain Home","country":"US","region":"US-AR","lat":36.3689,"lng":-92.4705},{"iata":"WMI","name":"Nowy Dw\u00f3r Mazowiecki","country":"PL","region":"PL-MZ","lat":52.4511,"lng":20.6518},{"iata":"WMN","name":"Maroantsetra","country":"MG","region":"MG-A","lat":-15.4377,"lng":49.6891},{"iata":"WMR","name":"Mananara Nord","country":"MG","region":"MG-A","lat":-16.1639,"lng":49.7738},{"iata":"WMT","name":"Zunyi","country":"CN","region":"CN-52","lat":27.9618,"lng":106.4354},{"iata":"WMX","name":"Wamena","country":"ID","region":"ID-PP","lat":-4.0973,"lng":138.9524},{"iata":"WNI","name":"Wangi-wangi Island","country":"ID","region":"ID-SG","lat":-5.2921,"lng":123.6362},{"iata":"WNP","name":"Naga","country":"PH","region":"PH-CAS","lat":13.5849,"lng":123.27},{"iata":"WNR","name":"Windorah","country":"AU","region":"AU-QLD","lat":-25.4106,"lng":142.6684},{"iata":"WNS","name":"Nawabashah","country":"PK","region":"PK-SD","lat":26.2194,"lng":68.3901},{"iata":"WNZ","name":"Wenzhou (Longwan)","country":"CN","region":"CN-33","lat":27.9106,"lng":120.8535},{"iata":"WOE","name":"Hoogerheide","country":"NL","region":"NL-NB","lat":51.4491,"lng":4.342},{"iata":"WOL","name":"Albion Park Rail","country":"AU","region":"AU-NSW","lat":-34.5611,"lng":150.789},{"iata":"WOS","name":"Wonsan","country":"KP","region":"KP-07","lat":39.1652,"lng":127.4879},{"iata":"WPC","name":"Pincher Creek","country":"CA","region":"CA-AB","lat":49.5204,"lng":-113.997},{"iata":"WPR","name":"Porvenir","country":"CL","region":"CL-MA","lat":-53.2537,"lng":-70.3192},{"iata":"WPU","name":"Puerto Williams","country":"CL","region":"CL-MA","lat":-54.9311,"lng":-67.6263},{"iata":"WRB","name":"Warner Robins","country":"US","region":"US-GA","lat":32.6401,"lng":-83.5919},{"iata":"WRE","name":"Whangarei","country":"NZ","region":"NZ-NTL","lat":-35.7693,"lng":174.3637},{"iata":"WRG","name":"Wrangell","country":"US","region":"US-AK","lat":56.4843,"lng":-132.37},{"iata":"WRI","name":"Wrightstown","country":"US","region":"US-NJ","lat":40.0156,"lng":-74.5917},{"iata":"WRL","name":"Worland","country":"US","region":"US-WY","lat":43.9657,"lng":-107.951},{"iata":"WRO","name":"Wroc\u0142aw","country":"PL","region":"PL-DS","lat":51.1037,"lng":16.8821},{"iata":"WRT","name":"Warton","country":"GB","region":"GB-ENG","lat":53.7451,"lng":-2.8831},{"iata":"WST","name":"Westerly","country":"US","region":"US-RI","lat":41.3496,"lng":-71.8034},{"iata":"WSZ","name":"Westport","country":"NZ","region":"NZ-WTC","lat":-41.7371,"lng":171.579},{"iata":"WTB","name":"Toowoomba","country":"AU","region":"AU-QLD","lat":-27.5583,"lng":151.7933},{"iata":"WTN","name":"Lincoln, Lincolnshire","country":"GB","region":"GB-ENG","lat":53.1662,"lng":-0.5238},{"iata":"WUA","name":"Wuhai","country":"CN","region":"CN-15","lat":39.7934,"lng":106.7993},{"iata":"WUH","name":"Wuhan (Huangpi)","country":"CN","region":"CN-42","lat":30.7748,"lng":114.2137},{"iata":"WUN","name":"Wiluna Airport","country":"AU","region":"AU-WA","lat":-26.6292,"lng":120.221},{"iata":"WUS","name":"Wuyishan","country":"CN","region":"CN-35","lat":27.7019,"lng":118.001},{"iata":"WUU","name":"Wau","country":"SS","region":"SS-BW","lat":7.7258,"lng":27.975},{"iata":"WUX","name":"Wuxi","country":"CN","region":"CN-32","lat":31.497,"lng":120.4304},{"iata":"WUZ","name":"Tangbu","country":"CN","region":"CN-45","lat":23.4032,"lng":111.0933},{"iata":"WVB","name":"Walvis Bay(Rooikop)","country":"NA","region":"NA-ER","lat":-22.9793,"lng":14.6471},{"iata":"WVK","name":"Manakara","country":"MG","region":"MG-F","lat":-22.1197,"lng":48.0217},{"iata":"WWA","name":"Wasilla","country":"US","region":"US-AK","lat":61.5717,"lng":-149.54},{"iata":"WWD","name":"Wildwood","country":"US","region":"US-NJ","lat":39.0085,"lng":-74.9083},{"iata":"WWK","name":"Wewak","country":"PG","region":"PG-ESW","lat":-3.5838,"lng":143.669},{"iata":"WWR","name":"Woodward","country":"US","region":"US-OK","lat":36.438,"lng":-99.5227},{"iata":"WWY","name":"West Wyalong","country":"AU","region":"AU-NSW","lat":-33.9372,"lng":147.191},{"iata":"WYA","name":"Whyalla","country":"AU","region":"AU-SA","lat":-33.0589,"lng":137.514},{"iata":"WYE","name":"Yengema","country":"SL","region":"SL-E","lat":8.6105,"lng":-11.0454},{"iata":"WYS","name":"West Yellowstone","country":"US","region":"US-MT","lat":44.6884,"lng":-111.118},{"iata":"XAI","name":"Xinyang","country":"CN","region":"CN-41","lat":32.5408,"lng":114.0791},{"iata":"XAP","name":"Chapec\u00f3","country":"BR","region":"BR-SC","lat":-27.1342,"lng":-52.6566},{"iata":"XBJ","name":"Birjand","country":"IR","region":"IR-29","lat":32.8965,"lng":59.2813},{"iata":"XCH","name":"Flying Fish Cove","country":"CX","region":"CX-U-A","lat":-10.4504,"lng":105.6911},{"iata":"XCR","name":"Chalons en Champagne","country":"FR","region":"FR-GES","lat":48.7733,"lng":4.2061},{"iata":"XEN","name":"Huludao (Xingcheng)","country":"CN","region":"CN-21","lat":40.5803,"lng":120.7004},{"iata":"XFN","name":"Xiangyang (Xiangzhou)","country":"CN","region":"CN-42","lat":32.1522,"lng":112.2917},{"iata":"XFW","name":"Hamburg","country":"DE","region":"DE-HH","lat":53.5353,"lng":9.8356},{"iata":"XGN","name":"Xangongo","country":"AO","region":"AO-CNN","lat":-16.7554,"lng":14.9653},{"iata":"XIC","name":"Liangshan (Xichang)","country":"CN","region":"CN-51","lat":27.9891,"lng":102.184},{"iata":"XIJ","name":"Ahmed Al Jaber AB","country":"KW","region":"KW-AH","lat":28.9348,"lng":47.7919},{"iata":"XIL","name":"Xilinhot","country":"CN","region":"CN-15","lat":43.9156,"lng":115.964},{"iata":"XIY","name":"Xianyang (Weicheng)","country":"CN","region":"CN-61","lat":34.4471,"lng":108.752},{"iata":"XJD","name":"Ar Rayyan","country":"QA","region":"QA-RA","lat":25.1173,"lng":51.315},{"iata":"XJM","name":"Mangla","country":"PK","region":"PK-PB","lat":33.0501,"lng":73.6384},{"iata":"XKS","name":"Kasabonika","country":"CA","region":"CA-ON","lat":53.5247,"lng":-88.6428},{"iata":"XLS","name":"Saint Louis","country":"SN","region":"SN-SL","lat":16.0498,"lng":-16.461},{"iata":"XMH","name":"Manihi Airport","country":"PF","region":"PF-U-A","lat":-14.4368,"lng":-146.07},{"iata":"XMN","name":"Xiamen","country":"CN","region":"CN-35","lat":24.5439,"lng":118.1275},{"iata":"XMS","name":"Macas","country":"EC","region":"EC-S","lat":-2.2992,"lng":-78.1208},{"iata":"XNA","name":"Fayetteville/Springdale/Rogers","country":"US","region":"US-AR","lat":36.2819,"lng":-94.3068},{"iata":"XNH","name":"Nasiriyah","country":"IQ","region":"IQ-DQ","lat":30.9358,"lng":46.0901},{"iata":"XNN","name":"Haidong (Huzhu Tu Autonomous County)","country":"CN","region":"CN-63","lat":36.5277,"lng":102.0402},{"iata":"XPL","name":"Palmerola","country":"HN","region":"HN-CM","lat":14.3824,"lng":-87.6212},{"iata":"XQP","name":"Quepos","country":"CR","region":"CR-P","lat":9.4432,"lng":-84.1298},{"iata":"XQU","name":"Qualicum Beach","country":"CA","region":"CA-BC","lat":49.3375,"lng":-124.3931},{"iata":"XRH","name":"Richmond","country":"AU","region":"AU-NSW","lat":-33.6047,"lng":150.7831},{"iata":"XRR","name":"Ross River","country":"CA","region":"CA-YT","lat":61.9706,"lng":-132.423},{"iata":"XRY","name":"Jerez de la Frontera","country":"ES","region":"ES-AN","lat":36.7446,"lng":-6.0601},{"iata":"XSB","name":"Sir Bani Yas","country":"AE","region":"AE-AZ","lat":24.2836,"lng":52.5803},{"iata":"XSC","name":"South Caicos","country":"TC","region":"TC-SC","lat":21.5157,"lng":-71.5285},{"iata":"XSP","name":"Seletar","country":"SG","region":"SG-02","lat":1.4156,"lng":103.8667},{"iata":"XTG","name":"Thargomindah","country":"AU","region":"AU-QLD","lat":-27.9864,"lng":143.8121},{"iata":"XUZ","name":"Xuzhou","country":"CN","region":"CN-32","lat":34.0591,"lng":117.5553},{"iata":"XWA","name":"Williston","country":"US","region":"US-ND","lat":48.2609,"lng":-103.7512},{"iata":"YAA","name":"Anahim Lake","country":"CA","region":"CA-BC","lat":52.4515,"lng":-125.3038},{"iata":"YAG","name":"Fort Frances","country":"CA","region":"CA-ON","lat":48.6557,"lng":-93.4435},{"iata":"YAH","name":"La Grande-4","country":"CA","region":"CA-QC","lat":53.7547,"lng":-73.6753},{"iata":"YAI","name":"Chillan","country":"CL","region":"CL-NB","lat":-36.5825,"lng":-72.0314},{"iata":"YAK","name":"Yakutat","country":"US","region":"US-AK","lat":59.5087,"lng":-139.6604},{"iata":"YAM","name":"Sault Ste Marie","country":"CA","region":"CA-ON","lat":46.4832,"lng":-84.5085},{"iata":"YAO","name":"Yaound\u00e9","country":"CM","region":"CM-CE","lat":3.836,"lng":11.5235},{"iata":"YAP","name":"Yap Island","country":"FM","region":"FM-YAP","lat":9.4989,"lng":138.083},{"iata":"YAY","name":"St. Anthony","country":"CA","region":"CA-NL","lat":51.3919,"lng":-56.0832},{"iata":"YAZ","name":"Tofino","country":"CA","region":"CA-BC","lat":49.0798,"lng":-125.7756},{"iata":"YBC","name":"Baie-Comeau","country":"CA","region":"CA-QC","lat":49.1325,"lng":-68.2044},{"iata":"YBG","name":"Saguenay","country":"CA","region":"CA-QC","lat":48.3301,"lng":-70.992},{"iata":"YBK","name":"Baker Lake","country":"CA","region":"CA-NU","lat":64.2989,"lng":-96.0778},{"iata":"YBL","name":"Campbell River","country":"CA","region":"CA-BC","lat":49.9508,"lng":-125.271},{"iata":"YBP","name":"Yibin (Cuiping)","country":"CN","region":"CN-51","lat":28.8584,"lng":104.5262},{"iata":"YBR","name":"Brandon","country":"CA","region":"CA-MB","lat":49.91,"lng":-99.9519},{"iata":"YBX","name":"Blanc-Sablon","country":"CA","region":"CA-QC","lat":51.4436,"lng":-57.1853},{"iata":"YBY","name":"Bonnyville","country":"CA","region":"CA-AB","lat":54.3042,"lng":-110.744},{"iata":"YCB","name":"Cambridge Bay","country":"CA","region":"CA-NU","lat":69.1081,"lng":-105.138},{"iata":"YCC","name":"Cornwall","country":"CA","region":"CA-ON","lat":45.0926,"lng":-74.5677},{"iata":"YCD","name":"Nanaimo","country":"CA","region":"CA-BC","lat":49.055,"lng":-123.8699},{"iata":"YCE","name":"Huron Park","country":"CA","region":"CA-ON","lat":43.2856,"lng":-81.5083},{"iata":"YCG","name":"Castlegar","country":"CA","region":"CA-BC","lat":49.2964,"lng":-117.632},{"iata":"YCH","name":"Miramichi","country":"CA","region":"CA-NB","lat":47.0078,"lng":-65.4492},{"iata":"YCL","name":"Charlo","country":"CA","region":"CA-NB","lat":47.9908,"lng":-66.3303},{"iata":"YCM","name":"Niagara-on-the-Lake","country":"CA","region":"CA-ON","lat":43.1916,"lng":-79.1717},{"iata":"YCN","name":"Cochrane","country":"CA","region":"CA-ON","lat":49.1056,"lng":-81.0136},{"iata":"YCQ","name":"Chetwynd","country":"CA","region":"CA-BC","lat":55.6872,"lng":-121.627},{"iata":"YCU","name":"Yuncheng (Yanhu)","country":"CN","region":"CN-61","lat":35.1178,"lng":111.034},{"iata":"YDA","name":"Dawson City","country":"CA","region":"CA-YT","lat":64.0431,"lng":-139.128},{"iata":"YDB","name":"Burwash Landing","country":"CA","region":"CA-YT","lat":61.3711,"lng":-139.041},{"iata":"YDF","name":"Deer Lake","country":"CA","region":"CA-NL","lat":49.2082,"lng":-57.3961},{"iata":"YDG","name":"Digby","country":"CA","region":"CA-NS","lat":44.5458,"lng":-65.7854},{"iata":"YDN","name":"Dauphin","country":"CA","region":"CA-MB","lat":51.1008,"lng":-100.052},{"iata":"YDO","name":"Dolbeau-Saint-Felicien","country":"CA","region":"CA-QC","lat":48.7785,"lng":-72.375},{"iata":"YDQ","name":"Dawson Creek","country":"CA","region":"CA-BC","lat":55.7412,"lng":-120.1833},{"iata":"YDT","name":"Delta","country":"CA","region":"CA-BC","lat":49.0743,"lng":-123.0069},{"iata":"YEC","name":"Yecheon-ri","country":"KR","region":"KR-47","lat":36.6304,"lng":128.3497},{"iata":"YEG","name":"Edmonton","country":"CA","region":"CA-AB","lat":53.3097,"lng":-113.58},{"iata":"YEI","name":"Yeni\u015fehir","country":"TR","region":"TR-16","lat":40.2552,"lng":29.5626},{"iata":"YEL","name":"Elliot Lake","country":"CA","region":"CA-ON","lat":46.3514,"lng":-82.5614},{"iata":"YEM","name":"Sheguiandah","country":"CA","region":"CA-ON","lat":45.8424,"lng":-81.8576},{"iata":"YEN","name":"Estevan","country":"CA","region":"CA-SK","lat":49.2103,"lng":-102.966},{"iata":"YEO","name":"Yeovil, Somerset","country":"GB","region":"GB-ENG","lat":51.0094,"lng":-2.6388},{"iata":"YES","name":"Yasuj","country":"IR","region":"IR-17","lat":30.7022,"lng":51.543},{"iata":"YET","name":"Edson","country":"CA","region":"CA-AB","lat":53.5789,"lng":-116.465},{"iata":"YEV","name":"Inuvik","country":"CA","region":"CA-NT","lat":68.3042,"lng":-133.483},{"iata":"YEY","name":"Amos","country":"CA","region":"CA-QC","lat":48.5639,"lng":-78.2497},{"iata":"YFB","name":"Iqaluit","country":"CA","region":"CA-NU","lat":63.7564,"lng":-68.5558},{"iata":"YFC","name":"Fredericton","country":"CA","region":"CA-NB","lat":45.8687,"lng":-66.5299},{"iata":"YFE","name":"Forestville","country":"CA","region":"CA-QC","lat":48.7461,"lng":-69.0972},{"iata":"YFR","name":"Fort Resolution","country":"CA","region":"CA-NT","lat":61.1808,"lng":-113.69},{"iata":"YFS","name":"Fort Simpson","country":"CA","region":"CA-NT","lat":61.7602,"lng":-121.237},{"iata":"YGJ","name":"Yonago","country":"JP","region":"JP-31","lat":35.4922,"lng":133.236},{"iata":"YGK","name":"Kingston","country":"CA","region":"CA-ON","lat":44.2253,"lng":-76.5969},{"iata":"YGL","name":"La Grande Rivi\u00e8re","country":"CA","region":"CA-QC","lat":53.6253,"lng":-77.7042},{"iata":"YGM","name":"Gimli","country":"CA","region":"CA-MB","lat":50.6281,"lng":-97.0433},{"iata":"YGP","name":"Gasp\u00e9","country":"CA","region":"CA-QC","lat":48.7749,"lng":-64.4819},{"iata":"YGQ","name":"Geraldton","country":"CA","region":"CA-ON","lat":49.7783,"lng":-86.9394},{"iata":"YGR","name":"Les \u00celes-de-la-Madeleine","country":"CA","region":"CA-QC","lat":47.4252,"lng":-61.7786},{"iata":"YGV","name":"Havre-Saint-Pierre","country":"CA","region":"CA-QC","lat":50.2819,"lng":-63.6114},{"iata":"YGW","name":"Kuujjuarapik","country":"CA","region":"CA-QC","lat":55.2819,"lng":-77.7653},{"iata":"YHD","name":"Dryden","country":"CA","region":"CA-ON","lat":49.8317,"lng":-92.7442},{"iata":"YHF","name":"Hearst","country":"CA","region":"CA-ON","lat":49.7142,"lng":-83.6861},{"iata":"YHM","name":"Hamilton","country":"CA","region":"CA-ON","lat":43.1735,"lng":-79.9312},{"iata":"YHN","name":"Hornepayne","country":"CA","region":"CA-ON","lat":49.1931,"lng":-84.7589},{"iata":"YHT","name":"Haines Junction","country":"CA","region":"CA-YT","lat":60.7892,"lng":-137.546},{"iata":"YHU","name":"Montr\u00e9al","country":"CA","region":"CA-QC","lat":45.5175,"lng":-73.4169},{"iata":"YHY","name":"Hay River","country":"CA","region":"CA-NT","lat":60.8397,"lng":-115.783},{"iata":"YHZ","name":"Halifax","country":"CA","region":"CA-NS","lat":44.8808,"lng":-63.5086},{"iata":"YIA","name":"Yogyakarta","country":"ID","region":"ID-YO","lat":-7.9053,"lng":110.0573},{"iata":"YIB","name":"Atikokan","country":"CA","region":"CA-ON","lat":48.7739,"lng":-91.6386},{"iata":"YIC","name":"Yichun","country":"CN","region":"CN-36","lat":27.8025,"lng":114.3062},{"iata":"YIE","name":"Arxan","country":"CN","region":"CN-15","lat":47.3106,"lng":119.9117},{"iata":"YIF","name":"St-Augustin","country":"CA","region":"CA-QC","lat":51.2117,"lng":-58.6583},{"iata":"YIH","name":"Yichang (Xiaoting)","country":"CN","region":"CN-42","lat":30.5541,"lng":111.4826},{"iata":"YIN","name":"Ili (Yining / Ghulja)","country":"CN","region":"CN-65","lat":43.9558,"lng":81.3303},{"iata":"YIP","name":"Detroit","country":"US","region":"US-MI","lat":42.2379,"lng":-83.5304},{"iata":"YIV","name":"Island Lake","country":"CA","region":"CA-MB","lat":53.8572,"lng":-94.6536},{"iata":"YIW","name":"Yiwu/Jinhua","country":"CN","region":"CN-33","lat":29.3421,"lng":120.0312},{"iata":"YJF","name":"Fort Liard","country":"CA","region":"CA-NT","lat":60.2358,"lng":-123.469},{"iata":"YJN","name":"St Jean","country":"CA","region":"CA-QC","lat":45.2944,"lng":-73.2811},{"iata":"YJT","name":"Stephenville","country":"CA","region":"CA-NL","lat":48.5434,"lng":-58.5529},{"iata":"YKA","name":"Kamloops","country":"CA","region":"CA-BC","lat":50.703,"lng":-120.4486},{"iata":"YKD","name":"Kincardine","country":"CA","region":"CA-ON","lat":44.2014,"lng":-81.6067},{"iata":"YKF","name":"Breslau","country":"CA","region":"CA-ON","lat":43.4608,"lng":-80.3786},{"iata":"YKH","name":"Yingkou (Laobian)","country":"CN","region":"CN-21","lat":40.5425,"lng":122.3586},{"iata":"YKJ","name":"Key Lake","country":"CA","region":"CA-SK","lat":57.2561,"lng":-105.618},{"iata":"YKL","name":"Schefferville","country":"CA","region":"CA-QC","lat":54.8053,"lng":-66.8053},{"iata":"YKM","name":"Yakima","country":"US","region":"US-WA","lat":46.5682,"lng":-120.544},{"iata":"YKN","name":"Yankton","country":"US","region":"US-SD","lat":42.9167,"lng":-97.3859},{"iata":"YKO","name":"Hakkari","country":"TR","region":"TR-30","lat":37.5497,"lng":44.2381},{"iata":"YKS","name":"Yakutsk","country":"RU","region":"RU-SA","lat":62.0933,"lng":129.771},{"iata":"YKX","name":"Kirkland Lake","country":"CA","region":"CA-ON","lat":48.2103,"lng":-79.9814},{"iata":"YKY","name":"Kindersley","country":"CA","region":"CA-SK","lat":51.5175,"lng":-109.181},{"iata":"YLD","name":"Chapleau","country":"CA","region":"CA-ON","lat":47.82,"lng":-83.3467},{"iata":"YLI","name":"Ylivieska","country":"FI","region":"FI-14","lat":64.0547,"lng":24.7253},{"iata":"YLJ","name":"Meadow Lake","country":"CA","region":"CA-SK","lat":54.1253,"lng":-108.523},{"iata":"YLK","name":"Barrie","country":"CA","region":"CA-ON","lat":44.4851,"lng":-79.5547},{"iata":"YLL","name":"Lloydminster","country":"CA","region":"CA-AB","lat":53.3092,"lng":-110.073},{"iata":"YLR","name":"Leaf Rapids","country":"CA","region":"CA-MB","lat":56.5133,"lng":-99.9853},{"iata":"YLT","name":"Alert","country":"CA","region":"CA-NU","lat":82.5173,"lng":-62.283},{"iata":"YLW","name":"Kelowna","country":"CA","region":"CA-BC","lat":49.9561,"lng":-119.378},{"iata":"YLX","name":"Yulin","country":"CN","region":"CN-45","lat":22.433,"lng":110.12},{"iata":"YLY","name":"Langley","country":"CA","region":"CA-BC","lat":49.1008,"lng":-122.631},{"iata":"YMA","name":"Mayo","country":"CA","region":"CA-YT","lat":63.6164,"lng":-135.868},{"iata":"YME","name":"Matane","country":"CA","region":"CA-QC","lat":48.8569,"lng":-67.4533},{"iata":"YMG","name":"Manitouwadge","country":"CA","region":"CA-ON","lat":49.0839,"lng":-85.8606},{"iata":"YMJ","name":"Moose Jaw","country":"CA","region":"CA-SK","lat":50.3303,"lng":-105.559},{"iata":"YML","name":"Charlevoix","country":"CA","region":"CA-QC","lat":47.5975,"lng":-70.2239},{"iata":"YMM","name":"Fort McMurray","country":"CA","region":"CA-AB","lat":56.6533,"lng":-111.222},{"iata":"YMO","name":"Moosonee","country":"CA","region":"CA-ON","lat":51.2911,"lng":-80.6078},{"iata":"YMS","name":"Yurimaguas","country":"PE","region":"PE-LOR","lat":-5.8938,"lng":-76.1182},{"iata":"YMT","name":"Chibougamau","country":"CA","region":"CA-QC","lat":49.7719,"lng":-74.5281},{"iata":"YMX","name":"Montr\u00e9al","country":"CA","region":"CA-QC","lat":45.6795,"lng":-74.0387},{"iata":"YNA","name":"Natashquan","country":"CA","region":"CA-QC","lat":50.1901,"lng":-61.789},{"iata":"YNB","name":"Yanbu","country":"SA","region":"SA-03","lat":24.1442,"lng":38.0634},{"iata":"YND","name":"Gatineau","country":"CA","region":"CA-QC","lat":45.5217,"lng":-75.5636},{"iata":"YNG","name":"Youngstown/Warren","country":"US","region":"US-OH","lat":41.2607,"lng":-80.6791},{"iata":"YNJ","name":"Yanji","country":"CN","region":"CN-22","lat":42.8828,"lng":129.451},{"iata":"YNL","name":"Points North Landing","country":"CA","region":"CA-SK","lat":58.2767,"lng":-104.082},{"iata":"YNM","name":"Matagami","country":"CA","region":"CA-QC","lat":49.7617,"lng":-77.8028},{"iata":"YNT","name":"Yantai","country":"CN","region":"CN-37","lat":37.6597,"lng":120.9781},{"iata":"YNY","name":"Gonghang-ro","country":"KR","region":"KR-42","lat":38.0605,"lng":128.6698},{"iata":"YNZ","name":"Yancheng (Tinghu)","country":"CN","region":"CN-32","lat":33.4283,"lng":120.2054},{"iata":"YOA","name":"Ekati","country":"CA","region":"CA-NT","lat":64.6989,"lng":-110.615},{"iata":"YOD","name":"Cold Lake","country":"CA","region":"CA-AB","lat":54.405,"lng":-110.279},{"iata":"YOJ","name":"High Level","country":"CA","region":"CA-AB","lat":58.6214,"lng":-117.165},{"iata":"YOL","name":"Yola","country":"NG","region":"NG-AD","lat":9.2576,"lng":12.4304},{"iata":"YOO","name":"Oshawa","country":"CA","region":"CA-ON","lat":43.9228,"lng":-78.895},{"iata":"YOP","name":"Rainbow Lake","country":"CA","region":"CA-AB","lat":58.4914,"lng":-119.408},{"iata":"YOS","name":"Owen Sound","country":"CA","region":"CA-ON","lat":44.5903,"lng":-80.8375},{"iata":"YOW","name":"Ottawa","country":"CA","region":"CA-ON","lat":45.3225,"lng":-75.6692},{"iata":"YPA","name":"Prince Albert","country":"CA","region":"CA-SK","lat":53.2142,"lng":-105.673},{"iata":"YPE","name":"Peace River","country":"CA","region":"CA-AB","lat":56.2269,"lng":-117.447},{"iata":"YPG","name":"Portage la Prairie","country":"CA","region":"CA-MB","lat":49.9031,"lng":-98.2738},{"iata":"YPL","name":"Pickle Lake","country":"CA","region":"CA-ON","lat":51.4464,"lng":-90.2142},{"iata":"YPN","name":"Port-Menier","country":"CA","region":"CA-QC","lat":49.8364,"lng":-64.2886},{"iata":"YPQ","name":"Peterborough","country":"CA","region":"CA-ON","lat":44.2323,"lng":-78.3621},{"iata":"YPR","name":"Prince Rupert","country":"CA","region":"CA-BC","lat":54.2861,"lng":-130.445},{"iata":"YPS","name":"Port Hawkesbury","country":"CA","region":"CA-NS","lat":45.6567,"lng":-61.3681},{"iata":"YPW","name":"Powell River","country":"CA","region":"CA-BC","lat":49.8342,"lng":-124.5},{"iata":"YPX","name":"Puvirnituq","country":"CA","region":"CA-QC","lat":60.0506,"lng":-77.2869},{"iata":"YPY","name":"Fort Chipewyan","country":"CA","region":"CA-AB","lat":58.7672,"lng":-111.117},{"iata":"YPZ","name":"Burns Lake","country":"CA","region":"CA-BC","lat":54.3764,"lng":-125.951},{"iata":"YQA","name":"Gravenhurst","country":"CA","region":"CA-ON","lat":44.9754,"lng":-79.3065},{"iata":"YQB","name":"Quebec","country":"CA","region":"CA-QC","lat":46.7911,"lng":-71.3933},{"iata":"YQD","name":"The Pas","country":"CA","region":"CA-MB","lat":53.9714,"lng":-101.091},{"iata":"YQF","name":"Springbrook","country":"CA","region":"CA-AB","lat":52.1822,"lng":-113.894},{"iata":"YQG","name":"Windsor","country":"CA","region":"CA-ON","lat":42.2756,"lng":-82.9556},{"iata":"YQH","name":"Watson Lake","country":"CA","region":"CA-YT","lat":60.1168,"lng":-128.822},{"iata":"YQI","name":"Yarmouth","country":"CA","region":"CA-NS","lat":43.8269,"lng":-66.0881},{"iata":"YQK","name":"Kenora","country":"CA","region":"CA-ON","lat":49.7883,"lng":-94.3631},{"iata":"YQL","name":"Lethbridge","country":"CA","region":"CA-AB","lat":49.6303,"lng":-112.8},{"iata":"YQM","name":"Moncton","country":"CA","region":"CA-NB","lat":46.1132,"lng":-64.6772},{"iata":"YQN","name":"Nakina","country":"CA","region":"CA-ON","lat":50.1828,"lng":-86.6964},{"iata":"YQQ","name":"Comox","country":"CA","region":"CA-BC","lat":49.7108,"lng":-124.887},{"iata":"YQR","name":"Regina","country":"CA","region":"CA-SK","lat":50.4319,"lng":-104.6609},{"iata":"YQS","name":"St Thomas","country":"CA","region":"CA-ON","lat":42.77,"lng":-81.1108},{"iata":"YQT","name":"Thunder Bay","country":"CA","region":"CA-ON","lat":48.3719,"lng":-89.3239},{"iata":"YQU","name":"Grande Prairie","country":"CA","region":"CA-AB","lat":55.1797,"lng":-118.885},{"iata":"YQV","name":"Yorkton","country":"CA","region":"CA-SK","lat":51.2647,"lng":-102.462},{"iata":"YQW","name":"North Battleford","country":"CA","region":"CA-SK","lat":52.7694,"lng":-108.2437},{"iata":"YQX","name":"Gander","country":"CA","region":"CA-NL","lat":48.9363,"lng":-54.5677},{"iata":"YQY","name":"Sydney","country":"CA","region":"CA-NS","lat":46.1611,"lng":-60.0498},{"iata":"YQZ","name":"Quesnel","country":"CA","region":"CA-BC","lat":53.0261,"lng":-122.51},{"iata":"YRB","name":"Resolute Bay","country":"CA","region":"CA-NU","lat":74.7169,"lng":-94.9694},{"iata":"YRI","name":"Rivi\u00e8re-du-Loup","country":"CA","region":"CA-QC","lat":47.7644,"lng":-69.5847},{"iata":"YRJ","name":"Roberval","country":"CA","region":"CA-QC","lat":48.5197,"lng":-72.2657},{"iata":"YRL","name":"Red Lake","country":"CA","region":"CA-ON","lat":51.0669,"lng":-93.7931},{"iata":"YRO","name":"Ottawa","country":"CA","region":"CA-ON","lat":45.4605,"lng":-75.644},{"iata":"YRQ","name":"Trois-Rivi\u00e8res","country":"CA","region":"CA-QC","lat":46.3528,"lng":-72.6794},{"iata":"YRT","name":"Rankin Inlet","country":"CA","region":"CA-NU","lat":62.8114,"lng":-92.1158},{"iata":"YRV","name":"Revelstoke","country":"CA","region":"CA-BC","lat":50.9622,"lng":-118.1843},{"iata":"YSB","name":"Sudbury","country":"CA","region":"CA-ON","lat":46.625,"lng":-80.7989},{"iata":"YSC","name":"Sherbrooke","country":"CA","region":"CA-QC","lat":45.4386,"lng":-71.6914},{"iata":"YSF","name":"Stony Rapids","country":"CA","region":"CA-SK","lat":59.2503,"lng":-105.841},{"iata":"YSH","name":"Smiths Falls","country":"CA","region":"CA-ON","lat":44.9458,"lng":-75.9406},{"iata":"YSJ","name":"Saint John","country":"CA","region":"CA-NB","lat":45.3161,"lng":-65.8903},{"iata":"YSL","name":"Saint-L\u00e9onard","country":"CA","region":"CA-NB","lat":47.1571,"lng":-67.8362},{"iata":"YSM","name":"Fort Smith","country":"CA","region":"CA-NT","lat":60.0203,"lng":-111.962},{"iata":"YSN","name":"Salmon Arm","country":"CA","region":"CA-BC","lat":50.6828,"lng":-119.229},{"iata":"YSP","name":"Marathon","country":"CA","region":"CA-ON","lat":48.7553,"lng":-86.3444},{"iata":"YSQ","name":"Qian Gorlos Mongol Autonomous County","country":"CN","region":"CN-22","lat":44.9311,"lng":124.5521},{"iata":"YSU","name":"Slemon Park","country":"CA","region":"CA-PE","lat":46.4406,"lng":-63.8336},{"iata":"YTA","name":"Pembroke","country":"CA","region":"CA-ON","lat":45.8644,"lng":-77.2517},{"iata":"YTD","name":"Thicket Portage","country":"CA","region":"CA-MB","lat":55.3189,"lng":-97.7078},{"iata":"YTF","name":"Alma","country":"CA","region":"CA-QC","lat":48.5089,"lng":-71.6419},{"iata":"YTH","name":"Thompson","country":"CA","region":"CA-MB","lat":55.8011,"lng":-97.8642},{"iata":"YTM","name":"La Macaza","country":"CA","region":"CA-QC","lat":46.4094,"lng":-74.78},{"iata":"YTR","name":"Trenton","country":"CA","region":"CA-ON","lat":44.1189,"lng":-77.5281},{"iata":"YTS","name":"Timmins","country":"CA","region":"CA-ON","lat":48.5697,"lng":-81.3767},{"iata":"YTY","name":"Yangzhou","country":"CN","region":"CN-32","lat":32.5634,"lng":119.7198},{"iata":"YTZ","name":"Toronto","country":"CA","region":"CA-ON","lat":43.6279,"lng":-79.3955},{"iata":"YUA","name":"Chuxiong (Yuanmou)","country":"CN","region":"CN-53","lat":25.7375,"lng":101.882},{"iata":"YUL","name":"Montr\u00e9al","country":"CA","region":"CA-QC","lat":45.4678,"lng":-73.7423},{"iata":"YUM","name":"Yuma","country":"US","region":"US-AZ","lat":32.6509,"lng":-114.6094},{"iata":"YUS","name":"Yushu (Batang)","country":"CN","region":"CN-63","lat":32.8364,"lng":97.0364},{"iata":"YUX","name":"Sanirajak","country":"CA","region":"CA-NU","lat":68.7761,"lng":-81.2425},{"iata":"YUY","name":"Rouyn-Noranda","country":"CA","region":"CA-QC","lat":48.2061,"lng":-78.8356},{"iata":"YVB","name":"Bonaventure","country":"CA","region":"CA-QC","lat":48.0711,"lng":-65.4603},{"iata":"YVC","name":"La Ronge","country":"CA","region":"CA-SK","lat":55.1514,"lng":-105.262},{"iata":"YVE","name":"Vernon","country":"CA","region":"CA-BC","lat":50.2462,"lng":-119.331},{"iata":"YVO","name":"Val-d'Or","country":"CA","region":"CA-QC","lat":48.0533,"lng":-77.7828},{"iata":"YVP","name":"Kuujjuaq","country":"CA","region":"CA-QC","lat":58.0961,"lng":-68.4269},{"iata":"YVQ","name":"Norman Wells","country":"CA","region":"CA-NT","lat":65.2816,"lng":-126.798},{"iata":"YVR","name":"Vancouver","country":"CA","region":"CA-BC","lat":49.1939,"lng":-123.184},{"iata":"YVV","name":"Wiarton","country":"CA","region":"CA-ON","lat":44.7458,"lng":-81.1072},{"iata":"YWG","name":"Winnipeg","country":"CA","region":"CA-MB","lat":49.91,"lng":-97.2399},{"iata":"YWK","name":"Wabush","country":"CA","region":"CA-NL","lat":52.9219,"lng":-66.8644},{"iata":"YWL","name":"Williams Lake","country":"CA","region":"CA-BC","lat":52.1831,"lng":-122.054},{"iata":"YWY","name":"Wrigley","country":"CA","region":"CA-NT","lat":63.2094,"lng":-123.437},{"iata":"YXC","name":"Cranbrook","country":"CA","region":"CA-BC","lat":49.6108,"lng":-115.782},{"iata":"YXE","name":"Saskatoon","country":"CA","region":"CA-SK","lat":52.1707,"lng":-106.7008},{"iata":"YXH","name":"Medicine Hat","country":"CA","region":"CA-AB","lat":50.0189,"lng":-110.721},{"iata":"YXJ","name":"Fort Saint John","country":"CA","region":"CA-BC","lat":56.2381,"lng":-120.74},{"iata":"YXK","name":"Rimouski","country":"CA","region":"CA-QC","lat":48.4776,"lng":-68.4963},{"iata":"YXL","name":"Sioux Lookout","country":"CA","region":"CA-ON","lat":50.1139,"lng":-91.9053},{"iata":"YXQ","name":"Beaver Creek","country":"CA","region":"CA-YT","lat":62.4103,"lng":-140.867},{"iata":"YXR","name":"Earlton","country":"CA","region":"CA-ON","lat":47.6974,"lng":-79.8473},{"iata":"YXS","name":"Prince George","country":"CA","region":"CA-BC","lat":53.8843,"lng":-122.6666},{"iata":"YXT","name":"Terrace","country":"CA","region":"CA-BC","lat":54.4685,"lng":-128.576},{"iata":"YXU","name":"London","country":"CA","region":"CA-ON","lat":43.0328,"lng":-81.149},{"iata":"YXX","name":"Abbotsford","country":"CA","region":"CA-BC","lat":49.0253,"lng":-122.361},{"iata":"YXY","name":"Whitehorse","country":"CA","region":"CA-YT","lat":60.7085,"lng":-135.0657},{"iata":"YXZ","name":"Wawa","country":"CA","region":"CA-ON","lat":47.9667,"lng":-84.7867},{"iata":"YYA","name":"Yueyang (Yueyanglou)","country":"CN","region":"CN-43","lat":29.3117,"lng":113.2816},{"iata":"YYB","name":"North Bay","country":"CA","region":"CA-ON","lat":46.3636,"lng":-79.4228},{"iata":"YYC","name":"Calgary","country":"CA","region":"CA-AB","lat":51.1188,"lng":-114.0099},{"iata":"YYD","name":"Smithers","country":"CA","region":"CA-BC","lat":54.8247,"lng":-127.183},{"iata":"YYE","name":"Fort Nelson","country":"CA","region":"CA-BC","lat":58.8364,"lng":-122.597},{"iata":"YYF","name":"Penticton","country":"CA","region":"CA-BC","lat":49.4631,"lng":-119.602},{"iata":"YYG","name":"Charlottetown","country":"CA","region":"CA-PE","lat":46.2889,"lng":-63.1252},{"iata":"YYJ","name":"Victoria","country":"CA","region":"CA-BC","lat":48.6472,"lng":-123.4278},{"iata":"YYL","name":"Lynn Lake","country":"CA","region":"CA-MB","lat":56.8639,"lng":-101.076},{"iata":"YYN","name":"Swift Current","country":"CA","region":"CA-SK","lat":50.2919,"lng":-107.691},{"iata":"YYQ","name":"Churchill","country":"CA","region":"CA-MB","lat":58.7392,"lng":-94.065},{"iata":"YYR","name":"Goose Bay","country":"CA","region":"CA-NL","lat":53.3192,"lng":-60.4258},{"iata":"YYT","name":"St. John's","country":"CA","region":"CA-NL","lat":47.6186,"lng":-52.7519},{"iata":"YYU","name":"Kapuskasing","country":"CA","region":"CA-ON","lat":49.4116,"lng":-82.4696},{"iata":"YYW","name":"Armstrong","country":"CA","region":"CA-ON","lat":50.2903,"lng":-88.9097},{"iata":"YYY","name":"Mont-Joli","country":"CA","region":"CA-QC","lat":48.6086,"lng":-68.2081},{"iata":"YYZ","name":"Toronto","country":"CA","region":"CA-ON","lat":43.6759,"lng":-79.6294},{"iata":"YZA","name":"Cache Creek","country":"CA","region":"CA-BC","lat":50.7753,"lng":-121.3213},{"iata":"YZE","name":"Gore Bay","country":"CA","region":"CA-ON","lat":45.8853,"lng":-82.5678},{"iata":"YZF","name":"Yellowknife","country":"CA","region":"CA-NT","lat":62.4628,"lng":-114.44},{"iata":"YZH","name":"Slave Lake","country":"CA","region":"CA-AB","lat":55.2929,"lng":-114.7773},{"iata":"YZP","name":"Sandspit","country":"CA","region":"CA-BC","lat":53.2543,"lng":-131.814},{"iata":"YZR","name":"Sarnia","country":"CA","region":"CA-ON","lat":42.9994,"lng":-82.3089},{"iata":"YZS","name":"Coral Harbour","country":"CA","region":"CA-NU","lat":64.1933,"lng":-83.3594},{"iata":"YZT","name":"Port Hardy","country":"CA","region":"CA-BC","lat":50.6806,"lng":-127.367},{"iata":"YZU","name":"Whitecourt","country":"CA","region":"CA-AB","lat":54.1439,"lng":-115.787},{"iata":"YZV","name":"Sept-\u00celes","country":"CA","region":"CA-QC","lat":50.2233,"lng":-66.2656},{"iata":"YZW","name":"Teslin","country":"CA","region":"CA-YT","lat":60.1728,"lng":-132.743},{"iata":"YZX","name":"Greenwood","country":"CA","region":"CA-NS","lat":44.9844,"lng":-64.9169},{"iata":"YZY","name":"Zhangye (Ganzhou)","country":"CN","region":"CN-62","lat":38.8019,"lng":100.675},{"iata":"ZAD","name":"Zadar","country":"HR","region":"HR-13","lat":44.097,"lng":15.3536},{"iata":"ZAG","name":"Velika Gorica","country":"HR","region":"HR-01","lat":45.7429,"lng":16.0688},{"iata":"ZAH","name":"Zahedan","country":"IR","region":"IR-11","lat":29.4757,"lng":60.9062},{"iata":"ZAL","name":"Valdivia","country":"CL","region":"CL-LR","lat":-39.65,"lng":-73.0861},{"iata":"ZAM","name":"Zamboanga","country":"PH","region":"PH-ZMC","lat":6.9224,"lng":122.06},{"iata":"ZAO","name":"Cahors","country":"FR","region":"FR-OCC","lat":44.3514,"lng":1.4753},{"iata":"ZAR","name":"Zaria","country":"NG","region":"NG-KD","lat":11.1302,"lng":7.6858},{"iata":"ZAT","name":"Zhaotong","country":"CN","region":"CN-53","lat":27.2058,"lng":103.6915},{"iata":"ZAZ","name":"Zaragoza","country":"ES","region":"ES-AR","lat":41.6662,"lng":-1.0415},{"iata":"ZBF","name":"South Tetagouche","country":"CA","region":"CA-NB","lat":47.6297,"lng":-65.7389},{"iata":"ZBM","name":"Bromont","country":"CA","region":"CA-QC","lat":45.2908,"lng":-72.7414},{"iata":"ZBR","name":"Konarak","country":"IR","region":"IR-11","lat":25.4432,"lng":60.3822},{"iata":"ZCL","name":"Zacatecas","country":"MX","region":"MX-ZAC","lat":22.8949,"lng":-102.6872},{"iata":"ZCO","name":"Temuco","country":"CL","region":"CL-AR","lat":-38.9259,"lng":-72.6515},{"iata":"ZEC","name":"Secunda","country":"ZA","region":"ZA-MP","lat":-26.5241,"lng":29.1701},{"iata":"ZEL","name":"Bella Bella","country":"CA","region":"CA-BC","lat":52.185,"lng":-128.157},{"iata":"ZER","name":"Ziro","country":"IN","region":"IN-AR","lat":27.5883,"lng":93.8281},{"iata":"ZFA","name":"Faro","country":"CA","region":"CA-YT","lat":62.2075,"lng":-133.376},{"iata":"ZGF","name":"Grand Forks","country":"CA","region":"CA-BC","lat":49.0156,"lng":-118.431},{"iata":"ZGU","name":"Gaua Island","country":"VU","region":"VU-TOB","lat":-14.2181,"lng":167.587},{"iata":"ZHA","name":"Zhanjiang","country":"CN","region":"CN-44","lat":21.4817,"lng":110.5903},{"iata":"ZHY","name":"Zhongwei (Shapotou)","country":"CN","region":"CN-64","lat":37.5731,"lng":105.1545},{"iata":"ZIA","name":"Moscow","country":"RU","region":"RU-MOS","lat":55.5533,"lng":38.15},{"iata":"ZIC","name":"Victoria","country":"CL","region":"CL-AR","lat":-38.2456,"lng":-72.3486},{"iata":"ZIG","name":"Ziguinchor","country":"SN","region":"SN-ZG","lat":12.5556,"lng":-16.2833},{"iata":"ZIH","name":"Ixtapa","country":"MX","region":"MX-GRO","lat":17.6018,"lng":-101.4606},{"iata":"ZIX","name":"Zhigansk","country":"RU","region":"RU-SA","lat":66.7965,"lng":123.361},{"iata":"ZJG","name":"Jenpeg","country":"CA","region":"CA-MB","lat":54.5189,"lng":-98.0461},{"iata":"ZJN","name":"Swan River","country":"CA","region":"CA-MB","lat":52.1206,"lng":-101.236},{"iata":"ZKP","name":"Zyryanka","country":"RU","region":"RU-SA","lat":65.7485,"lng":150.8889},{"iata":"ZLO","name":"Manzanillo","country":"MX","region":"MX-COL","lat":19.1448,"lng":-104.559},{"iata":"ZMT","name":"Masset","country":"CA","region":"CA-BC","lat":54.0275,"lng":-132.125},{"iata":"ZND","name":"Zinder","country":"NE","region":"NE-7","lat":13.779,"lng":8.9838},{"iata":"ZNE","name":"Newman","country":"AU","region":"AU-WA","lat":-23.4178,"lng":119.803},{"iata":"ZNZ","name":"Zanzibar","country":"TZ","region":"TZ-07","lat":-6.222,"lng":39.2249},{"iata":"ZOS","name":"Osorno","country":"CL","region":"CL-LL","lat":-40.6112,"lng":-73.061},{"iata":"ZQN","name":"Queenstown","country":"NZ","region":"NZ-OTA","lat":-45.0192,"lng":168.7464},{"iata":"ZQZ","name":"Zhangjiakou","country":"CN","region":"CN-13","lat":40.7387,"lng":114.9334},{"iata":"ZRH","name":"Zurich","country":"CH","region":"CH-ZH","lat":47.4581,"lng":8.5481},{"iata":"ZRI","name":"Serui","country":"ID","region":"ID-PA","lat":-1.8284,"lng":136.0624},{"iata":"ZSA","name":"San Salvador","country":"BS","region":"BS-SS","lat":24.063,"lng":-74.5232},{"iata":"ZSE","name":"Saint-Pierre","country":"RE","region":"RE-SR","lat":-21.3194,"lng":55.4225},{"iata":"ZSJ","name":"Sandy Lake","country":"CA","region":"CA-ON","lat":53.0642,"lng":-93.3444},{"iata":"ZST","name":"Stewart","country":"CA","region":"CA-BC","lat":55.9354,"lng":-129.9824},{"iata":"ZTH","name":"Zakynthos","country":"GR","region":"GR-F","lat":37.7509,"lng":20.8843},{"iata":"ZTU","name":"Zaqatala","country":"AZ","region":"AZ-ZAQ","lat":41.5578,"lng":46.6695},{"iata":"ZUC","name":"Ignace","country":"CA","region":"CA-ON","lat":49.4282,"lng":-91.7204},{"iata":"ZUH","name":"Zhuhai (Jinwan)","country":"CN","region":"CN-44","lat":22.0064,"lng":113.376},{"iata":"ZVA","name":"Miandrivazo","country":"MG","region":"MG-U","lat":-19.5628,"lng":45.4508},{"iata":"ZVK","name":"Savannakhet Airport","country":"LA","region":"LA-SV","lat":16.5566,"lng":104.76},{"iata":"ZWA","name":"Andapa Airport","country":"MG","region":"MG-D","lat":-14.6517,"lng":49.6206},{"iata":"ZXT","name":"Zabrat","country":"AZ","region":"AZ-BA","lat":40.4949,"lng":49.9771},{"iata":"ZYI","name":"Zunyi","country":"CN","region":"CN-52","lat":27.8107,"lng":107.2472},{"iata":"ZYL","name":"Sylhet","country":"BD","region":"BD-6","lat":24.9631,"lng":91.8669},{"iata":"ZZU","name":"Mzuzu","country":"MW","region":"MW-MZ","lat":-11.4447,"lng":34.0118},{"iata":"ZZV","name":"Zanesville","country":"US","region":"US-OH","lat":39.9444,"lng":-81.8921}] diff --git a/api_docs/SUMMARY.md b/api_docs/SUMMARY.md new file mode 100644 index 0000000..31e8885 --- /dev/null +++ b/api_docs/SUMMARY.md @@ -0,0 +1,155 @@ +# Airline Load Data API Summary + +Goal: Get **number of open seats** and **number of people on standby list** per flight. + +--- + +## United Airlines - BEST + +### Endpoints +| Endpoint | URL | +|----------|-----| +| **Standby List** | `POST https://mobileapi.united.com/standbylistservice/api/GetStandbyList` | +| **Upgrade List** | `POST https://mobileapi.united.com/upgradelistservice/api/GetUpgradeList` | +| Flight Status | `GET https://mobileapi.united.com/flightstatusservice/api/GetFlightStatus_UAandStar` | +| Flight Status (segment) | `GET https://mobileapi.united.com/flightstatusservice/api/GetSegmentFlightStatusWithDestination_UAandStar` | +| Pass Rider List | `POST https://mobileapi.united.com/passriderlistservice/api/PassRiderList` | + +### Data Fields (confirmed from embedded mock JSON) +- `CustomersOnStandbyList` — list of passengers on standby +- `SeatsAvailable` — available seat count (nullable) +- `AvailabiltyCount` — availability count string +- `ShowStandby` — whether standby is shown for segment +- `enableStandbyList` — boolean toggle on flight status +- `enableUpgradeList` — boolean toggle on flight status +- `businessStandByList` — business class standby list +- `standByListPassengers` — passenger details +- `availableSeat11AMto5PM` / `availableSeatBefore11AM` / `availableSeatAfter5PM` — time-bucketed availability + +### Security +- No SSL pinning +- No PairIP/anti-tamper +- No emulator detection +- Auth: session-based (needs login token) + +### Completeness: 95% +- Open seats: YES (`SeatsAvailable`, `AvailabiltyCount`, time-bucketed seat fields) +- Standby count: YES (`CustomersOnStandbyList`, `standByListPassengers`) +- Standby names: YES (passenger objects) +- Upgrade list: YES (separate endpoint) +- Missing: Need to capture actual API request body format. Can do via emulator + mitmproxy since no protections exist. + +--- + +## Delta Air Lines - GOOD + +### Endpoints +| Endpoint | URL | +|----------|-----| +| **Airport Standby List** | `POST https://www.delta.com/api/mobile/asl` | +| Upgrade Eligibility | `POST https://www.delta.com/api/mobile/getUpgradeEligibilityInfo` | +| Flight Status | `POST https://www.delta.com/api/mobile/getFlightStatus` | +| Flight Status by Leg | `POST https://www.delta.com/api/mobile/getFlightStatusByLeg` | + +### Data Fields +- `seatsAvailableCount` — number of open seats +- `seatsRemainingLabel` — display text for remaining seats +- `upgradeCount` — number on upgrade list +- `UpgradeSeatRemaining` — seats remaining per cabin class +- `getClearedStandbyPassengers` — passengers who cleared +- `getWaitingStandbyPassengers` — passengers still waiting +- `getStandbyTotalWaitList` — total on standby waitlist +- `getStandbySeatRemaining` — seats available for standby +- `standbyPriority` / `standbyPriorityCode` — priority info +- `hasStandbyFlightNoSeatsAvailable` — boolean indicator + +### Security +- No SSL pinning +- No PairIP/anti-tamper +- No emulator detection +- Auth: session-based via `/api/mobile/login` + +### Completeness: 90% +- Open seats: YES (`seatsAvailableCount`, `UpgradeSeatRemaining` per cabin) +- Standby count: YES (`getStandbyTotalWaitList`, cleared vs waiting) +- Standby names: YES (`StandbyPassengerPositionView`, `StandbyPassengerStatusAdapter`) +- Upgrade list: YES (`upgradeCount`, `upgradeList`) +- Missing: Need to capture actual request/response JSON format. Can do via emulator + mitmproxy. Need to determine if auth is required or if ASL endpoint works without login. + +--- + +## Spirit Airlines - PARTIAL + +### Endpoints +| Endpoint | URL | +|----------|-----| +| **BOA Status** | `POST https://api.spirit.com/customermobileprod/2.8.0/v1/getboastatus` | +| BOA Parameters | `GET https://api.spirit.com/customermobileprod/2.8.0/v1/getboaparameters` | +| Flight Search | `POST https://api.spirit.com/customermobileprod/2.8.0/v5/Flight/Search` | + +### Data Fields +- `isStandby` — boolean standby flag +- `standby` — standby details on segment +- `boaStatus` — Board of Availability status +- `capacity` — flight capacity +- `availableUnits` — available units + +### Security +- No SSL pinning +- No PairIP/anti-tamper +- Akamai Bot Manager present (may block non-app requests) +- Auth: token-based via `/v2/Token` + +### Completeness: 50% +- Open seats: UNCLEAR — `availableUnits` and `capacity` exist but unclear if they represent seat counts. Spirit may not expose granular seat availability. +- Standby count: UNCLEAR — `boaStatus` exists but the response format is unknown. Spirit's BOA system is simpler than Delta/United. +- Standby names: UNCLEAR — no `StandbyPassenger` model found. May only show status, not individual passengers. +- Missing: Need actual API call to determine what `getboastatus` returns. Emulator capture needed. Spirit may have a more limited standby system (being an ULCC). + +--- + +## American Airlines - BLOCKED + +### Endpoints +| Endpoint | URL | +|----------|-----| +| Flight Status (web) | `POST https://www.aa.com/flightinfo/v1.2/` | +| Standby/Waitlist | **UNKNOWN** — mobile app only, SSL pinned | + +### Data Fields (from iOS app screenshot) +- "Available seats: 23" — seat count per cabin +- Passenger names on standby list +- Standby vs Upgrade lists +- Cabin-specific breakdown + +### Security +- SSL pinning on key domains +- PairIP anti-tamper on Android (crashes on emulators) +- Akamai WAF on web endpoints + +### Completeness: 20% +- Open seats: CONFIRMED EXISTS (screenshot shows "Available seats 23") but API endpoint unknown +- Standby count: CONFIRMED EXISTS (screenshot shows passenger list) but API endpoint unknown +- Flight status: CAPTURED (`/flightinfo/v1.2/` — gates, times, status, equipment) +- Missing: The standby/waitlist API endpoint is mobile-app-only, protected by SSL pinning (iOS) and PairIP (Android). Cannot be captured without jailbroken iOS device or rooted physical Android with Magisk+Shamiko. + +--- + +## Action Items + +### Immediately actionable (no additional capture needed): +1. **AA Flight Status** — `/flightinfo/v1.2/` is working. Can get gates, times, delays, equipment. + +### Needs emulator + mitmproxy capture (no protections, straightforward): +2. **United Standby List** — Boot emulator, install APK, login, call `GetStandbyList`. No pinning/anti-tamper. Full data including seat counts and passenger names. +3. **Delta ASL** — Same approach. Boot emulator, install APK, login, call `/api/mobile/asl`. Full data. +4. **Spirit BOA** — Boot emulator, install APK, login, call `/v1/getboastatus`. Determine what data is actually returned. + +### Requires physical device: +5. **AA Standby/Waitlist** — Needs jailbroken iPhone + SSL Kill Switch, or rooted physical Android + Magisk + Shamiko + Frida. + +### Priority order for implementation: +1. **United** (most data, easiest to capture, dedicated standby service endpoint) +2. **Delta** (rich data model, no protections) +3. **Spirit** (uncertain data granularity) +4. **AA** (blocked without specialized hardware) diff --git a/api_docs/delta_api.md b/api_docs/delta_api.md new file mode 100644 index 0000000..b396b54 --- /dev/null +++ b/api_docs/delta_api.md @@ -0,0 +1,154 @@ +# Delta Air Lines Mobile API + +Extracted from `com.delta.mobile.android` v6.7 (build 24019) + +## Base URLs + +| Environment | URL | +|-------------|-----| +| Production | `https://www.delta.com` | +| CDN | `https://content.delta.com` | +| Embed Web | `https://api.delta.com/embedweb` | + +## Key Endpoints + +### Airport Standby List (ASL) +``` +POST https://www.delta.com/api/mobile/asl +``` +**This is the standby/upgrade list endpoint.** Uses `AirportStandbyListRequest` with fields: +- `departureDate` — flight departure date +- Request likely includes flight number, origin, destination +- Returns `AirportUpgradeStandbyModel` with upgrade list and standby list data + +### Flight Status +``` +POST https://www.delta.com/api/mobile/getFlightStatus +POST https://www.delta.com/api/mobile/getFlightStatusByLeg +``` + +### Upgrade Eligibility +``` +POST https://www.delta.com/api/mobile/getUpgradeEligibilityInfo +POST https://www.delta.com/api/mobile/purchaseEfirst +``` + +### Complimentary Upgrade (from DEX strings) +``` +/getComplimentaryUpgrade +/processComplimentaryUpgrade +/purchaseUpgrade +``` + +## All Mobile API Endpoints + +| Endpoint | Path | +|----------|------| +| **Standby List** | `/api/mobile/asl` | +| Flight Status | `/api/mobile/getFlightStatus` | +| Flight Status By Leg | `/api/mobile/getFlightStatusByLeg` | +| Flight Schedule | `/api/mobile/getFlightSchedule` | +| Login | `/api/mobile/login` | +| Logout | `/api/mobile/logout` | +| Check Login | `/api/mobile/checkLogin` | +| Get Profile | `/api/mobile/getprofile` | +| Manage Profile | `/api/mobile/manageProfile` | +| Get PNR | `/api/mobile/getPnr` | +| Validate PNR | `/api/mobile/validatePnr` | +| Dashboard | `/api/mobile/getDashboard` | +| Check-in | `/api/mobile/checkin` | +| Seat Map | `/api/mobile/getSeatMap` | +| Change Seat | `/api/mobile/changeSeat` | +| Upgrade Eligibility | `/api/mobile/getUpgradeEligibilityInfo` | +| Purchase E-First | `/api/mobile/purchaseEfirst` | +| Bag Info | `/api/mobile/getBagInfo` | +| Add Bags | `/api/mobile/addBags` | +| Get Bags | `/api/mobile/getBags` | +| Bag Carousel | `/api/mobile/getBagCarousel` | +| Weather | `/api/mobile/getWeather` | +| Account Activity | `/api/mobile/getAcctActivity` | +| SkyClub Info | `/api/mobile/getSkyclubInfo` | +| Purchase SkyClub | `/api/mobile/purchaseSkyclub` | +| Receipts | `/api/mobile/getReceipts` | +| Email Receipt | `/api/mobile/processEmailReceipt` | +| Merchandise | `/api/mobile/getMerchandise` | +| Promotions | `/api/mobile/getPromotions` | +| Airport Mode | `/api/mobile/getAirportMode` | +| Passenger Info | `/api/mobile/getPaxInfo` | +| Manage Passenger | `/api/mobile/managePaxInfo` | +| Travel Documents | `/api/mobile/getTravelDoc` | +| Add Travel Doc | `/api/mobile/addTravelDoc` | +| Emergency Contact | `/api/mobile/addEmergencyContact` | +| Manage Cart | `/api/mobile/manageCart` | +| Get Cart | `/api/mobile/getCart` | +| Clear Cart | `/api/mobile/clearCart` | +| Eligible FOP | `/api/mobile/getEligibleFop` | +| SSR | `/api/mobile/getSsr` | +| Available SSR | `/api/mobile/getAvailableSsr` | +| Manage SSR | `/api/mobile/manageSsr` | +| Manage FF | `/api/mobile/manageFF` | +| Validate Address | `/api/mobile/validateAddress` | +| Forgot Username | `/api/mobile/forgotUserName` | +| Country Reference | `/api/mobile/getCountryReferenceData` | +| Address Fields | `/api/mobile/getAddressFields` | +| Enroll SkyMiles | `/api/mobile/enrollSM` | +| Upsell Info | `/api/mobile/getPnrUpsellInfo` | +| Upsell Fare Rules | `/api/mobile/getUpsellFareRules` | +| Purchase Upsell | `/api/mobile/purchaseUpsell` | +| Supported Version | `/api/mobile/supportedVersion` | +| SkyMiles Info | `/api/mobile/getSMInfo` | +| SkyMiles Pass | `/api/mobile/getSMPass` | +| SC Info | `/api/mobile/getSCInfo` | +| SC Pass | `/api/mobile/getSCPass` | +| Membership Status | `/api/mobile/getMembershipStatusInfo` | +| EOD Eligibility | `/api/mobile/getEODEligibility` | +| Store Password | `/api/mobile/storePassword` | +| Store Email | `/api/mobile/storeEmail` | +| Update Password | `/api/mobile/updatePassword` | +| Security Questions | `/api/mobile/getSecurityQuestions` | +| Get SQA | `/api/mobile/getSQA` | +| Store SQA | `/api/mobile/storeSQA` | +| App Info | `/api/mobile/getinfo` | + +## Request Headers (from DEX analysis) + +The app uses an `AirlineRequest` pattern with these common headers: +- `Content-Type: application/json` +- Custom auth headers (session-based after `/api/mobile/login`) + +## ASL Data Model (from DEX class analysis) + +### AirportStandbyListRequest +- `requestInfo` — flight identification +- `departureDate` — date string + +### AirportUpgradeStandbyModel +Contains: +- Upgrade list (by cabin class) +- Standby list +- `standbyPriority` / `standbyPriorityCode` +- `upgradeList` entries +- `ASLStandby` — individual standby entries +- `ASLUpgrade` — individual upgrade entries +- `UpgradeSeatRemaining` — available seats per cabin +- `PassengerChiclet` — passenger display data + +### UpgradeStandbyParams +- `airportModeResponse` +- Flight leg details +- Eligibility flags + +## Security Notes + +- **No SSL pinning** in `network_security_config.xml` (only trusts system CAs) +- **No PairIP or anti-tamper** — app runs on emulators +- Auth is session-based via `/api/mobile/login` +- The ASL endpoint likely requires an authenticated session +- No Akamai bot detection observed on the mobile API path + +## Next Steps + +1. Call `/api/mobile/login` with Delta credentials to get a session +2. Call `/api/mobile/getFlightStatus` with a flight number +3. Call `/api/mobile/asl` with the flight details from the status response +4. The ASL response should contain upgrade and standby lists diff --git a/api_docs/spirit_api.md b/api_docs/spirit_api.md new file mode 100644 index 0000000..272c81b --- /dev/null +++ b/api_docs/spirit_api.md @@ -0,0 +1,176 @@ +# Spirit Airlines Mobile API + +Extracted from `com.spirit.customerapp` v4.7.0 (build 1340) + +## Base URL + +| Environment | URL | +|-------------|-----| +| **Production** | `https://api.spirit.com/customermobileprod/2.8.0/` | +| QA1 | `https://apiqa.spirit.com/qa01-customermobileapi/` | +| QA2 | `https://apiqa.spirit.com/qa02-customermobileapi/` | +| Dev1 | `https://apiqa.spirit.com/dev01-customermobileapi/` | +| Dev2 | `https://apiqa.spirit.com/dev02-customermobileapi/` | +| Stage | `https://api.spirit.com/stage-customermobileapi/` | +| CMS | `https://content.spirit.com/api/content/` | + +## Standby / Board of Availability (BOA) + +Spirit uses "BOA" (Board of Availability) as their standby system: + +``` +GET https://api.spirit.com/customermobileprod/2.8.0/v1/getboaparameters +POST https://api.spirit.com/customermobileprod/2.8.0/v1/getboastatus +``` + +### BOA Status Request +- **Method:** POST +- **Body:** `BoaStatusRequestDto` (JSON) +- **Response:** `BoaStatusResponseDto` containing `BoaStatus` objects + +### BOA Data Model +- `BoaStatusInfo` — status of standby position +- `boaStatusChecker` — polls for status updates using a `boaUniqueSessionToken` +- `isStandby` — boolean flag on trip/flight objects +- `standby` — standby details on trip segments + +### BOA Flow +1. Call `v1/getboaparameters` to get BOA config +2. Call `v1/getboastatus` with flight/booking details +3. Poll using `boaStatusChecker` with session token for updates + +## All API Endpoints + +### Authentication +| Method | Path | Description | +|--------|------|-------------| +| POST | `v2/Token` | Fetch auth token | +| POST | `v3/Token` | Fetch v3 auth token | +| PUT | `v3/Token` | Refresh v3 token | + +### Init & Config +| Method | Path | Description | +|--------|------|-------------| +| GET | `v1/init` | App initialization | +| GET | `v1/stations` | Airport station list | +| GET | `v1/OnD/Countries` | Country reference data | + +### Flight Search & Status +| Method | Path | Description | +|--------|------|-------------| +| POST | `v5/Flight/Search` | Search flights | +| POST | `v3/GetFlightInfoBI` | Flight info | +| POST | `v1/booking/flightdetails` | Flight details | +| POST | `v1/calendar/availabledates` | Available dates calendar | + +### Booking +| Method | Path | Description | +|--------|------|-------------| +| GET | `v1/booking/retrieve` | Retrieve booking (params: RecordLocator, LastName) | +| GET | `v1/booking` | Get booking state | +| GET | `v1/booking?screenType=ReviewTempStay` | Booking review | +| PUT | `v2/booking` | Update booking | +| POST | `v1/booking/book` | Confirm booking | +| POST | `v1/trip/sell` | Sell trip | +| POST | `v2/ValidateBookingRequest` | Validate booking | + +### Standby / BOA +| Method | Path | Description | +|--------|------|-------------| +| **GET** | **`v1/getboaparameters`** | **Get BOA (standby) parameters** | +| **POST** | **`v1/getboastatus`** | **Get standby status** | + +### Check-in & Boarding +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/booking/checkin/journey` | Check in for journey | +| POST | `v2/booking/boardingpasses/journey` | Get boarding passes | + +### Trip Management +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/managetrip` | Manage trip | +| POST | `v2/tripdetails` | Get trip details | +| POST | `v3/mytrips` | Get my trips | +| POST | `v1/booking/passengers/passengerreturndates` | Passenger return dates | + +### Seats +| Method | Path | Description | +|--------|------|-------------| +| GET | `v1/booking/seatmap` | Get seat map | +| GET | `v4/booking/seatmaps/` | Get seat maps v4 | +| POST | `v4/booking/passengers/{passengerKey}/seats/{unitKey}` | Assign seat | + +### Bags +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/bags` | Get bags | +| PUT | `v1/bags/update` | Update bags | + +### Bundles & Upsell +| Method | Path | Description | +|--------|------|-------------| +| GET | `v3/options` | Get options | +| PUT | `v1/options/update` | Update options | +| POST | `v1/bundle/UpsellAvailability` | Upsell availability | +| POST | `v3/bundle/ssrs` | Bundle SSRs | +| POST | `v4/bundle/ssrs` | Bundle SSRs v4 | +| POST | `v2/cart` | Manage cart | + +### Payments +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/booking/payments/fetchredemptiondetail` | Fetch redemption | +| POST | `v1/booking/payments/redeem` | Redeem points | +| DELETE | `V3/User/Person/StoredPayments/{key}` | Delete stored payment | + +### Account +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/FreeSpirit/CreateAccount` | Create Free Spirit account | +| POST | `v1/FreeSpirit/Booking/CreateAccount` | Create account during booking | +| GET | `v1/User/Person` | Get user profile | +| POST | `v1/account/password/reset` | Reset password | +| POST | `v1/account/updateexpiredpassword` | Update expired password | +| POST | `v1/account/points` | Account points | +| POST | `v1/points` | Points | +| POST | `v1/MemberInfo/ValidateFSNumber` | Validate Free Spirit number | +| POST | `v1/registerForPromotion` | Register for promotion | + +### Documents & SSR +| Method | Path | Description | +|--------|------|-------------| +| POST | `v1/booking/passengers/{key}/documents` | Add travel doc | +| PUT | `v1/booking/passengers/{key}/documents/{docKey}` | Update travel doc | +| POST | `v1/booking/passengers/{key}/infant/documents` | Add infant doc | +| POST | `v1/document/validate` | Validate document | +| POST | `v1/booking/ssrs/add/acia` | Add SSR | +| POST | `v2/trip/specialassistance` | Special assistance | +| POST | `v3/ssrs/health-ack/accept` | Accept health acknowledgment | +| POST | `v3/ssrs/health-ack/decline` | Decline health acknowledgment | + +### Other +| Method | Path | Description | +|--------|------|-------------| +| GET | `v1/GetContent/help` | Help content | +| POST | `v1/getdynamiccontent` | Dynamic content | +| POST | `v1/booking/touristtax` | Tourist tax | +| POST | `v1/booking/passengers/temporarystay/address` | Temp stay address | +| POST | `v1/travelguard/getquote` | Travel insurance quote | + +## Security Notes + +- **No SSL pinning** in network_security_config.xml +- **No PairIP or anti-tamper** protection +- Uses Retrofit2 for HTTP +- Auth via token-based system (`v2/Token`, `v3/Token`) +- `libakamaibmp.so` present — Akamai Bot Manager for bot detection +- App runs fine on emulators + +## CMS Endpoints + +| Path | Description | +|------|-------------| +| `en-US?path=mobile/book/paxtravelingui` | Passenger traveling UI content | +| `en-US?path=mobile/localnotification` | Local notification content | +| `en-US?path=mobile/mytripui` | My trips UI content | diff --git a/api_docs/united_api.md b/api_docs/united_api.md new file mode 100644 index 0000000..dd36600 --- /dev/null +++ b/api_docs/united_api.md @@ -0,0 +1,137 @@ +# United Airlines Mobile API + +Extracted from `united-airlines.apk` (11 DEX files, ~100MB) + +## Base URLs + +| Environment | URL | +|-------------|-----| +| **Production** | `https://mobileapi.united.com` | +| QA | `https://mobileapi.qa.united.com` | +| Dev | `https://mobileapi.dev.united.com` | +| Stage | `https://mobileapi.stage.united.com` | +| PreProd | `https://mobileapi.preprod.united.com` | +| Preview | `https://mobileapi.preview.united.com` | + +## Load Data Endpoints + +### Standby List +``` +POST https://mobileapi.united.com/standbylistservice/api/GetStandbyList +``` +Returns `MOBStandByListResponse`: +- `standByListPassengers` — passenger list with names, status +- `CustomersOnStandbyList` — customers on standby +- `businessStandByList` — business class standby +- `isStandByListAvailable` — availability flag +- `showStandbyListButton` — UI toggle + +### Upgrade List +``` +POST https://mobileapi.united.com/upgradelistservice/api/GetUpgradeList +``` +Returns `MOBUpgradeListResponse`: +- Upgrade passengers with status +- Cabin eligibility + +### Pass Rider List (Employee/Non-Rev) +``` +POST https://mobileapi.united.com/passriderlistservice/api/PassRiderList +POST https://mobileapi.united.com/passriderlistservice/api/TravelerMisConnect +``` + +## Flight Status Data Fields (from embedded JSON) + +Per segment in the response: +- `SeatsAvailable` — nullable seat count +- `AvailabiltyCount` — availability string +- `CustomersOnStandbyList` — standby passengers +- `ShowStandby` — whether standby is displayed +- `enableStandbyList` — boolean +- `enableUpgradeList` — boolean +- `availableSeat11AMto5PM` — time-bucketed availability +- `availableSeatBefore11AM` — morning availability +- `availableSeatAfter5PM` — evening availability + +## All 60+ Microservices + +| Service | Base Path | +|---------|-----------| +| **standbylistservice** | `/standbylistservice/api/` | +| **upgradelistservice** | `/upgradelistservice/api/` | +| **flightstatusservice** | `/flightstatusservice/api/` | +| passriderlistservice | `/passriderlistservice/api/` | +| passridersservice | `/passridersservice/api/` | +| checkinservice | `/checkinservice/api/` | +| checkinebpservice | `/checkinebpservice/api/` | +| checkinmerchservice | `/checkinmerchservice/api/` | +| seatmapservice | `/seatmapservice/api/` | +| seatengineservice | `/seatengineservice/api/` | +| bagcalculatorservice | `/bagcalculatorservice/api/` | +| bagtrackingservice | `/bagtrackingservice/api/` | +| bookingtripsservice | `/bookingtripsservice/api/` | +| completebookingservice | `/completebookingservice/api/` | +| cancelreservationservice | `/cancelreservationservice/api/` | +| shoppingservice | `/shoppingservice/api/` | +| shoptripsservice | `/shoptripsservice/api/` | +| shopbundlesservice | `/shopbundlesservice/api/` | +| shopflightdetailsservice | `/shopflightdetailsservice/api/` | +| shopfarewheelservice | `/shopfarewheelservice/api/` | +| shopawardservice | `/shopawardservice/api/` | +| shopseatsservice | `/shopseatsservice/api/` | +| flightsearchresultservice | `/flightsearchresultservice/api/` | +| myunitedservice | `/myunitedservice/api/` | +| customerprofileservice | `/customerprofileservice/api/` | +| memberprofileservice | `/memberprofileservice/api/` | +| memberinformationservice | `/memberinformationservice/api/` | +| memberbenefitsservice | `/memberbenefitsservice/api/` | +| updatememberprofileservice | `/updatememberprofileservice/api/` | +| enrollmentservice | `/enrollmentservice/api/` | +| premieractivityservice | `/premieractivityservice/api/` | +| recentactivityservice | `/recentactivityservice/api/` | +| balanceservice | `/balanceservice/api/` | +| mywalletservice | `/mywalletservice/api/` | +| etcservice | `/etcservice/api/` | +| travelcreditservice | `/travelcreditservice/api/` | +| clubservice | `/clubservice/api/` | +| unitedclubservice | `/unitedclubservice/api/` | +| productservice | `/productservice/api/` | +| msccheckoutservice | `/msccheckoutservice/api/` | +| mscpaymentservice | `/mscpaymentservice/api/` | +| mscregisterservice | `/mscregisterservice/api/` | +| postbookingservice | `/postbookingservice/api/` | +| tripplannerservice | `/tripplannerservice/api/` | +| tripplannergetservice | `/tripplannergetservice/api/` | +| savetripservice | `/savetripservice/api/` | +| travelersservice | `/travelersservice/api/` | +| traveloffersservice | `/traveloffersservice/api/` | +| homescreenservice | `/homescreenservice/api/` | +| inboxservice | `/inboxservice/api/` | +| receiptservice | `/receiptservice/api/` | +| inflightamenityservice | `/inflightamenityservice/api/` | +| locationservice | `/locationservice/api/` | +| airportsservice | `/airportsservice/api/` | +| securityquestionsservice | `/securityquestionsservice/api/` | +| addressvalidationservice | `/addressvalidationservice/api/` | +| syncservice | `/syncservice/api/` | +| subscriptionsservice | `/subscriptionsservice/api/` | +| paymentoptionservice | `/paymentoptionservice/api/` | +| otpandchasecardsservice | `/otpandchasecardsservice/api/` | +| promocodeservice | `/promocodeservice/api/` | +| moneyplusmilesservice | `/moneyplusmilesservice/api/` | +| alertcheckfsrservice | `/alertcheckfsrservice/api/` | +| cceservice | `/cceservice/api/` | +| mpcservice | `/mpcservice/api/` | +| trcservice | `/trcservice/api/` | +| employeeprofileservice | `/employeeprofileservice/api/` | +| employeepassbalanceservice | `/employeepassbalanceservice/api/` | +| unfinishedbookingservice | `/unfinishedbookingservice/api/` | +| viewresseatmapservice | `/viewresseatmapservice/api/` | + +## Security Notes + +- **No SSL pinning** — `network_security_config.xml` only allows cleartext for inflight WiFi domains +- **No PairIP or anti-tamper** +- **No emulator detection** +- Auth: session/token based +- Can be fully captured via emulator + mitmproxy diff --git a/design/generate_icon_options.swift b/design/generate_icon_options.swift new file mode 100644 index 0000000..c341a16 --- /dev/null +++ b/design/generate_icon_options.swift @@ -0,0 +1,723 @@ +import AppKit +import Foundation + +let canvasSize = CGSize(width: 1024, height: 1024) + +enum Palette { + static let accent = NSColor(hex: 0x6366F1) + static let accentLight = NSColor(hex: 0x818CF8) + static let boarding = NSColor(hex: 0x3B82F6) + static let mint = NSColor(hex: 0x10B981) + static let slate = NSColor(hex: 0x0F172A) + static let sky = NSColor(hex: 0x38BDF8) + static let cloud = NSColor(hex: 0xE2E8F0) + static let mist = NSColor(hex: 0xF8FAFC) + static let ink = NSColor(hex: 0x111827) +} + +struct IconOption { + let fileName: String + let label: String + let draw: (CGRect) -> Void +} + +extension NSColor { + convenience init(hex: UInt32, alpha: CGFloat = 1.0) { + self.init( + calibratedRed: CGFloat((hex >> 16) & 0xFF) / 255.0, + green: CGFloat((hex >> 8) & 0xFF) / 255.0, + blue: CGFloat(hex & 0xFF) / 255.0, + alpha: alpha + ) + } +} + +extension CGRect { + var center: CGPoint { CGPoint(x: midX, y: midY) } +} + +func roundedRectPath(_ rect: CGRect, radius: CGFloat) -> NSBezierPath { + NSBezierPath(roundedRect: rect, xRadius: radius, yRadius: radius) +} + +func circleRect(center: CGPoint, radius: CGFloat) -> CGRect { + CGRect(x: center.x - radius, y: center.y - radius, width: radius * 2, height: radius * 2) +} + +func withGraphicsState(_ draw: () -> Void) { + NSGraphicsContext.saveGraphicsState() + draw() + NSGraphicsContext.restoreGraphicsState() +} + +func applyShadow( + color: NSColor, + blur: CGFloat, + x: CGFloat = 0, + y: CGFloat = 0, + draw: () -> Void +) { + withGraphicsState { + let shadow = NSShadow() + shadow.shadowColor = color + shadow.shadowBlurRadius = blur + shadow.shadowOffset = NSSize(width: x, height: y) + shadow.set() + draw() + } +} + +func fillPath(_ path: NSBezierPath, colors: [NSColor], angle: CGFloat) { + guard let gradient = NSGradient(colors: colors) else { return } + gradient.draw(in: path, angle: angle) +} + +func strokePath(_ path: NSBezierPath, color: NSColor, lineWidth: CGFloat) { + color.setStroke() + path.lineWidth = lineWidth + path.stroke() +} + +func fillCircle(center: CGPoint, radius: CGFloat, color: NSColor) { + let path = NSBezierPath(ovalIn: circleRect(center: center, radius: radius)) + color.setFill() + path.fill() +} + +func fillRoundedRect(_ rect: CGRect, radius: CGFloat, colors: [NSColor], angle: CGFloat) { + let path = roundedRectPath(rect, radius: radius) + fillPath(path, colors: colors, angle: angle) +} + +func drawSymbol( + _ name: String, + in rect: CGRect, + pointSize: CGFloat, + tint: NSColor, + weight: NSFont.Weight = .regular, + scale: NSImage.SymbolScale = .large, + rotationDegrees: CGFloat = 0, + alpha: CGFloat = 1.0 +) { + guard + let symbol = NSImage(systemSymbolName: name, accessibilityDescription: nil), + let configured = symbol.withSymbolConfiguration(.init(pointSize: pointSize, weight: weight, scale: scale)) + else { + return + } + + let tinted = NSImage(size: configured.size) + tinted.lockFocus() + let imageRect = NSRect(origin: .zero, size: configured.size) + configured.draw(in: imageRect, from: NSRect.zero, operation: NSCompositingOperation.sourceOver, fraction: 1.0) + tint.withAlphaComponent(alpha).set() + imageRect.fill(using: NSCompositingOperation.sourceAtop) + tinted.unlockFocus() + + withGraphicsState { + let transform = NSAffineTransform() + transform.translateX(by: rect.midX, yBy: rect.midY) + transform.rotate(byDegrees: rotationDegrees) + transform.translateX(by: -rect.midX, yBy: -rect.midY) + transform.concat() + tinted.draw(in: rect, from: NSRect.zero, operation: NSCompositingOperation.sourceOver, fraction: 1.0) + } +} + +func quadraticPath(start: CGPoint, control: CGPoint, end: CGPoint) -> NSBezierPath { + let cp1 = CGPoint( + x: start.x + ((control.x - start.x) * 2.0 / 3.0), + y: start.y + ((control.y - start.y) * 2.0 / 3.0) + ) + let cp2 = CGPoint( + x: end.x + ((control.x - end.x) * 2.0 / 3.0), + y: end.y + ((control.y - end.y) * 2.0 / 3.0) + ) + let path = NSBezierPath() + path.move(to: start) + path.curve(to: end, controlPoint1: cp1, controlPoint2: cp2) + return path +} + +func quadraticPoint(start: CGPoint, control: CGPoint, end: CGPoint, t: CGFloat) -> CGPoint { + let oneMinusT = 1 - t + let x = (oneMinusT * oneMinusT * start.x) + (2 * oneMinusT * t * control.x) + (t * t * end.x) + let y = (oneMinusT * oneMinusT * start.y) + (2 * oneMinusT * t * control.y) + (t * t * end.y) + return CGPoint(x: x, y: y) +} + +func quadraticAngle(start: CGPoint, control: CGPoint, end: CGPoint, t: CGFloat) -> CGFloat { + let dx = (2 * (1 - t) * (control.x - start.x)) + (2 * t * (end.x - control.x)) + let dy = (2 * (1 - t) * (control.y - start.y)) + (2 * t * (end.y - control.y)) + return atan2(dy, dx) * 180 / .pi +} + +func drawRouteArc( + start: CGPoint, + control: CGPoint, + end: CGPoint, + color: NSColor, + lineWidth: CGFloat, + dash: [CGFloat] = [22, 18] +) { + let path = quadraticPath(start: start, control: control, end: end) + color.setStroke() + path.lineWidth = lineWidth + path.lineCapStyle = .round + path.setLineDash(dash, count: dash.count, phase: 0) + path.stroke() +} + +func drawRing(center: CGPoint, radius: CGFloat, width: CGFloat, color: NSColor, alpha: CGFloat = 1.0) { + let path = NSBezierPath(ovalIn: circleRect(center: center, radius: radius)) + strokePath(path, color: color.withAlphaComponent(alpha), lineWidth: width) +} + +func drawGlobe( + center: CGPoint, + radius: CGFloat, + fillColors: [NSColor], + landTint: NSColor, + gridColor: NSColor, + highlightColor: NSColor, + landAlpha: CGFloat = 0.35, + strokeColor: NSColor? = nil, + glowColor: NSColor? = nil +) { + let globeRect = circleRect(center: center, radius: radius) + let globePath = NSBezierPath(ovalIn: globeRect) + + if let glowColor { + applyShadow(color: glowColor, blur: 48) { + fillCircle(center: center, radius: radius * 0.96, color: glowColor.withAlphaComponent(0.35)) + } + } + + fillPath(globePath, colors: fillColors, angle: 90) + + withGraphicsState { + globePath.addClip() + + let continentsRect = globeRect.insetBy(dx: radius * 0.12, dy: radius * 0.12) + drawSymbol( + "globe.americas.fill", + in: continentsRect.offsetBy(dx: radius * 0.03, dy: radius * -0.02), + pointSize: radius * 1.3, + tint: landTint, + weight: .regular, + rotationDegrees: 0, + alpha: landAlpha + ) + + let meridians: [CGFloat] = [0.42, 0.72] + for scale in meridians { + let ellipse = NSBezierPath( + ovalIn: CGRect( + x: center.x - radius * scale, + y: center.y - radius, + width: radius * scale * 2, + height: radius * 2 + ) + ) + strokePath(ellipse, color: gridColor.withAlphaComponent(0.9), lineWidth: 5) + } + + let parallels: [CGFloat] = [0.30, 0.62, 0.86] + for scale in parallels { + let ellipse = NSBezierPath( + ovalIn: CGRect( + x: center.x - radius, + y: center.y - radius * scale, + width: radius * 2, + height: radius * scale * 2 + ) + ) + strokePath(ellipse, color: gridColor.withAlphaComponent(0.68), lineWidth: 4) + } + + let specular = NSBezierPath( + ovalIn: CGRect( + x: center.x - radius * 0.62, + y: center.y + radius * 0.16, + width: radius * 0.70, + height: radius * 0.36 + ) + ) + highlightColor.withAlphaComponent(0.18).setFill() + specular.fill() + } + + if let strokeColor { + strokePath(globePath, color: strokeColor, lineWidth: 6) + } +} + +func drawTopographicLines(rect: CGRect, color: NSColor, count: Int, inset: CGFloat) { + for index in 0.. Void) -> NSBitmapImageRep { + let rep = NSBitmapImageRep( + bitmapDataPlanes: nil, + pixelsWide: Int(size.width), + pixelsHigh: Int(size.height), + bitsPerSample: 8, + samplesPerPixel: 4, + hasAlpha: true, + isPlanar: false, + colorSpaceName: .deviceRGB, + bytesPerRow: 0, + bitsPerPixel: 0 + )! + + rep.size = size + + let graphicsContext = NSGraphicsContext(bitmapImageRep: rep)! + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = graphicsContext + draw(CGRect(origin: .zero, size: size)) + graphicsContext.flushGraphics() + NSGraphicsContext.restoreGraphicsState() + return rep +} + +func savePNG(_ rep: NSBitmapImageRep, to url: URL) throws { + guard let data = rep.representation(using: .png, properties: [:]) else { + throw NSError(domain: "IconGenerator", code: 1) + } + try data.write(to: url) +} + +func drawComparisonSheet(options: [IconOption], imageDirectory: URL, outputURL: URL) throws { + let sheetSize = CGSize(width: 2190, height: 1620) + let rep = renderBitmap(size: sheetSize) { rect in + fillRoundedRect( + rect, + radius: 120, + colors: [NSColor(hex: 0xF8FAFC), NSColor(hex: 0xEEF2FF)], + angle: 90 + ) + + let titleAttributes: [NSAttributedString.Key: Any] = [ + .font: NSFont.systemFont(ofSize: 82, weight: .bold), + .foregroundColor: Palette.slate + ] + let subtitleAttributes: [NSAttributedString.Key: Any] = [ + .font: NSFont.systemFont(ofSize: 34, weight: .medium), + .foregroundColor: Palette.ink.withAlphaComponent(0.70) + ] + NSAttributedString(string: "Flights App Icon Concepts", attributes: titleAttributes) + .draw(at: CGPoint(x: 112, y: 1470)) + NSAttributedString( + string: "1 to 5. Same palette, different attitude.", + attributes: subtitleAttributes + ) + .draw(at: CGPoint(x: 118, y: 1412)) + + let cardWidth: CGFloat = 354 + let cardHeight: CGFloat = 474 + let horizontalGap: CGFloat = 52 + let verticalGap: CGFloat = 50 + let startX: CGFloat = 112 + let startY: CGFloat = 856 + + for (index, option) in options.enumerated() { + let row = index / 3 + let column = index % 3 + let x = startX + CGFloat(column) * (cardWidth + horizontalGap) + let y = startY - CGFloat(row) * (cardHeight + verticalGap) + let cardRect = CGRect(x: x, y: y, width: cardWidth, height: cardHeight) + + let cardPath = roundedRectPath(cardRect, radius: 52) + applyShadow(color: NSColor.black.withAlphaComponent(0.10), blur: 20, y: -8) { + fillPath(cardPath, colors: [NSColor.white, NSColor(hex: 0xF8FAFC)], angle: 90) + } + + let imageURL = imageDirectory.appendingPathComponent(option.fileName) + if let image = NSImage(contentsOf: imageURL) { + image.draw(in: CGRect(x: x + 27, y: y + 116, width: 300, height: 300)) + } + + let labelAttributes: [NSAttributedString.Key: Any] = [ + .font: NSFont.monospacedSystemFont(ofSize: 30, weight: .bold), + .foregroundColor: Palette.accent + ] + let titleAttributes: [NSAttributedString.Key: Any] = [ + .font: NSFont.systemFont(ofSize: 34, weight: .semibold), + .foregroundColor: Palette.slate + ] + NSAttributedString(string: "\(index + 1).", attributes: labelAttributes) + .draw(at: CGPoint(x: x + 28, y: y + 58)) + NSAttributedString(string: option.label, attributes: titleAttributes) + .draw(at: CGPoint(x: x + 82, y: y + 54)) + } + } + + try savePNG(rep, to: outputURL) +} + +let options: [IconOption] = [ + .init(fileName: "01_orbital-route.png", label: "Orbital Route", draw: drawOrbitalRoute), + .init(fileName: "02_window-badge.png", label: "Window Badge", draw: drawWindowBadge), + .init(fileName: "03_atlas-tile.png", label: "Atlas Tile", draw: drawAtlasTile), + .init(fileName: "04_night-ring.png", label: "Night Ring", draw: drawNightRing), + .init(fileName: "05_route-card.png", label: "Route Card", draw: drawRouteCard) +] + +let fileManager = FileManager.default +let root = URL(fileURLWithPath: fileManager.currentDirectoryPath) +let outputDirectory = root.appendingPathComponent("design/icon-options", isDirectory: true) +try fileManager.createDirectory(at: outputDirectory, withIntermediateDirectories: true) + +for option in options { + let rep = renderBitmap(draw: option.draw) + try savePNG(rep, to: outputDirectory.appendingPathComponent(option.fileName)) +} + +try drawComparisonSheet( + options: options, + imageDirectory: outputDirectory, + outputURL: outputDirectory.appendingPathComponent("comparison-sheet.png") +) + +print("Generated \(options.count) icons in \(outputDirectory.path)") diff --git a/design/icon-options/01_orbital-route.png b/design/icon-options/01_orbital-route.png new file mode 100644 index 0000000..e54927c Binary files /dev/null and b/design/icon-options/01_orbital-route.png differ diff --git a/design/icon-options/02_window-badge.png b/design/icon-options/02_window-badge.png new file mode 100644 index 0000000..971b841 Binary files /dev/null and b/design/icon-options/02_window-badge.png differ diff --git a/design/icon-options/03_atlas-tile.png b/design/icon-options/03_atlas-tile.png new file mode 100644 index 0000000..7cd9b81 Binary files /dev/null and b/design/icon-options/03_atlas-tile.png differ diff --git a/design/icon-options/04_night-ring.png b/design/icon-options/04_night-ring.png new file mode 100644 index 0000000..f6d65e2 Binary files /dev/null and b/design/icon-options/04_night-ring.png differ diff --git a/design/icon-options/05_route-card.png b/design/icon-options/05_route-card.png new file mode 100644 index 0000000..368309b Binary files /dev/null and b/design/icon-options/05_route-card.png differ diff --git a/design/icon-options/README.md b/design/icon-options/README.md new file mode 100644 index 0000000..bc96e4e --- /dev/null +++ b/design/icon-options/README.md @@ -0,0 +1,14 @@ +Generated app icon concepts for `Flights`. + +Files: +- `01_orbital-route.png`: dark, route-led, strongest "fly everywhere" story. +- `02_window-badge.png`: bright and premium, centered globe with orbital motion. +- `03_atlas-tile.png`: editorial/lightweight, dark inset tile on an airy base. +- `04_night-ring.png`: bold and futuristic, orbit-ring treatment on a dark field. +- `05_route-card.png`: clean iOS card language using the app's UI motif. +- `comparison-sheet.png`: all five options on one board. + +Regenerate: +```sh +swift -module-cache-path /tmp/swift-module-cache design/generate_icon_options.swift +``` diff --git a/design/icon-options/comparison-sheet.png b/design/icon-options/comparison-sheet.png new file mode 100644 index 0000000..87dc914 Binary files /dev/null and b/design/icon-options/comparison-sheet.png differ diff --git a/flow.md b/flow.md new file mode 100644 index 0000000..65a3fb8 --- /dev/null +++ b/flow.md @@ -0,0 +1,230 @@ +# FlightConnections.com - API Flow + +> Captured 2026-04-07 from HAR file. User flow: Homepage -> Select DFW -> View destinations -> Select MAD -> View flight calendar for American Airlines. + +## User Flow Summary + +``` +Homepage (flightconnections.com/) + | + |-- User types "d", "dfw" in airport search + | GET autocomplete_location.php?term=d -> returns DFW, DXB, DEN + countries + | GET autocomplete_location.php?term=dfw -> returns DFW (id=2138) + | + |-- User selects DFW -> navigates to /flights-from-dallas-fort-worth-dfw + | GET aircrafts_url.php?depAps=2138 -> 45 aircraft types (filter options) + | GET airlines_url.php?depAps=2138 -> 34 airlines (filter options) + | Map tiles load showing all destinations from DFW + | + |-- User selects Madrid (MAD, id=186) -> /flights-from-dfw-to-mad + | POST validity.php dep=2138 & des=186 & id=300 (AA) + | -> Returns 19 schedule entries for AA flight 36 (DFW->MAD) + | -> Calendar datepicker renders available dates +``` + +--- + +## API Endpoints + +### 1. Airport Autocomplete + +``` +GET https://www.flightconnections.com/autocomplete_location.php +``` + +| Param | Type | Example | Description | +|--------|--------|---------|-----------------------| +| `lang` | string | `en` | Language | +| `term` | string | `dfw` | Search term (as-you-type) | + +**Response:** +```json +{ + "airports": [ + { + "value": "DFW - Dallas-Fort Worth", + "airport": "Dallas-Fort Worth (DFW)", + "id": "2138" + } + ], + "countries": [ + { "name": "Denmark", "code": "DK", "id": "57" } + ], + "continents": [] +} +``` + +- Returns airports, countries, and continents matching the search term +- Airport `id` is the internal numeric identifier used in all subsequent calls + +--- + +### 2. Airlines Filter List + +``` +GET https://www.flightconnections.com/airlines_url.php +``` + +| Param | Type | Example | Description | +|----------|--------|---------|----------------------------| +| `lang` | string | `en` | Language | +| `ids` | string | (empty) | Filter by airline IDs | +| `cl` | string | (empty) | Class filter | +| `depAps` | int | `2138` | Departure airport ID | +| `desAps` | int | (empty) | Destination airport ID | + +**Response:** HTML fragment of `
` elements, each with: +- `id` - internal airline ID (e.g. `300` = American Airlines) +- `data-name` - airline name +- `data-iata` - IATA code +- `data-fleet` - comma-separated aircraft type IDs +- CSS classes: `cl-f` (first), `cl-b` (business), `cl-p` (premium economy), `cl-e` (economy) + +**Airlines serving DFW (34 total):** +Aerolineas Argentinas (AR), Aeromexico (AM), Air Canada (AC), Air France (AF), Alaska (AS), American Airlines (AA), Avelo Airlines (XP), Avianca (AV), Breeze Airways (MX), British Airways (BA), Cathay Pacific (CX), Contour Aviation (LF), Delta (DL), Emirates (EK), EVA Air (BR), Fiji Airways (FJ), Finnair (AY), Frontier Airlines (F9), Iberia (IB), Japan Airlines (JL), JetBlue (B6), Key Lime Air (KG), Korean Air (KE), Lufthansa (LH), Qantas (QF), Qatar Airways (QR), Royal Jordanian (RJ), Southern Airways Express (9X), Spirit Airlines (NK), Sun Country Airlines (SY), Turkish Airlines (TK), United Airlines (UA), VivaAerobus (VB), Volaris (Y4) + +--- + +### 3. Aircraft Filter List + +``` +GET https://www.flightconnections.com/aircrafts_url.php +``` + +| Param | Type | Example | Description | +|----------|--------|---------|----------------------------| +| `lang` | string | `en` | Language | +| `ids` | string | (empty) | Filter by aircraft IDs | +| `cl` | string | (empty) | Class filter | +| `depAps` | int | `2138` | Departure airport ID | +| `desAps` | int | (empty) | Destination airport ID | + +**Response:** HTML fragment of `
` elements, each with: +- `id` - e.g. `ac-44` (Boeing 777-200) +- `data-name` - aircraft name +- `data-code` - ICAO type code +- `data-id` - internal aircraft ID +- `data-airlines` - comma-separated airline IDs that operate this type +- `data-alliances` - alliance IDs + +**45 aircraft types** serving DFW including A220, A319, A320neo, A321neo, 737 MAX, 777-200, 787-9, etc. + +--- + +### 4. Flight Schedule / Calendar Data + +``` +POST https://www.flightconnections.com/validity.php +Content-Type: application/x-www-form-urlencoded +``` + +| Param | Type | Example | Description | +|-------------|--------|---------|--------------------------------| +| `dep` | int | `2138` | Departure airport ID (DFW) | +| `des` | int | `186` | Destination airport ID (MAD) | +| `id` | int | `300` | Airline ID (American Airlines) | +| `startDate` | int | `2026` | Start year | +| `endDate` | int | `2027` | End year | +| `lang` | string | `en` | Language | + +**Response:** +```json +{ + "airline": "American Airlines", + "flights": [ + { + "flightnumber": "AA 36", + "ac_id": "44", + "aircraft": "Boeing 777-200", + "deptime": "16:45:00", + "destime": "09:05:00", + "datefrom": "2026-04-07", + "dateto": "2026-05-06", + "su": "0", "mo": "0", "tu": "1", "we": "1", + "th": "0", "fr": "0", "sa": "0", + "classes": "0111" + } + ] +} +``` + +**Flight fields:** +| Field | Description | +|----------------|----------------------------------------------------------| +| `flightnumber` | Flight number (e.g. "AA 36") | +| `ac_id` | Aircraft type ID (maps to aircrafts_url.php) | +| `aircraft` | Aircraft name | +| `deptime` | Departure time (local) | +| `destime` | Arrival time (local) | +| `datefrom` | Schedule validity start date | +| `dateto` | Schedule validity end date | +| `su`-`sa` | Day-of-week flags ("1" = operates, "0" = does not) | +| `classes` | 4-char string: First/Business/PremEcon/Economy ("0"/"1") | + +**DFW -> MAD captured schedule (AA 36, 19 entries):** + +| Depart | Arrive | Dates | Days of Week | Aircraft | +|--------|--------|--------------------------|----------------------|---------------| +| 16:45 | 09:05 | 2026-04-07 to 2026-05-06 | Tu We | Boeing 777-200 | +| 16:45 | 09:05 | 2026-04-09 to 2026-05-04 | Su Mo Th Fr Sa | Boeing 777-200 | +| 17:20 | 09:35 | 2026-05-07 to 2026-05-18 | Su Mo Th Fr Sa | Boeing 777-200 | +| 17:20 | 09:35 | 2026-05-12 to 2026-05-20 | Tu We | Boeing 777-200 | +| 16:40 | 09:05 | 2026-05-21 to 2026-06-29 | Su Mo Th Fr Sa | Boeing 777-200 | +| 16:40 | 09:05 | 2026-05-26 to 2026-07-01 | Tu We | Boeing 777-200 | +| 16:55 | 09:05 | 2026-07-02 to 2026-10-23 | Su Mo Th Fr Sa | Boeing 777-200 | +| 16:55 | 09:05 | 2026-07-07 to 2026-10-21 | Tu We | Boeing 777-200 | +| 18:10 | 09:20 | 2026-10-24 to 2026-10-24 | Sa (DST transition) | Boeing 777-200 | +| 18:20 | 09:20 | 2026-10-25 to 2026-10-31 | Su Tu Th Fr Sa | Boeing 777-200 | +| 18:20 | 09:20 | 2026-10-26 to 2026-10-28 | Mo We | Boeing 777-200 | +| 17:20 | 09:20 | 2026-11-01 to 2026-12-01 | Su Tu Th Fr Sa | Boeing 777-200 | +| 17:20 | 09:20 | 2026-11-02 to 2026-11-30 | Mo We | Boeing 777-200 | +| 17:20 | 09:20 | 2026-12-02 to 2027-03-03 | Mo We | Boeing 787-9 | +| 17:20 | 09:20 | 2026-12-03 to 2027-03-02 | Su Tu Th Fr Sa | Boeing 787-9 | +| 17:20 | 09:20 | 2027-03-04 to 2027-03-13 | Su Tu Th Fr Sa | Boeing 777-200 | +| 17:20 | 09:20 | 2027-03-08 to 2027-03-10 | Mo We | Boeing 777-200 | +| 18:20 | 09:20 | 2027-03-14 to 2027-03-27 | Su Tu Th Fr Sa | Boeing 777-200 | +| 18:20 | 09:20 | 2027-03-15 to 2027-03-24 | Mo We | Boeing 777-200 | + +--- + +## URL Patterns + +| Page | URL Pattern | +|------------------------|-----------------------------------------------------| +| Homepage | `https://www.flightconnections.com/` | +| Flights from airport | `/flights-from-dallas-fort-worth-dfw` | +| Flights between cities | `/flights-from-dfw-to-mad` | + +--- + +## Map Tiles + +``` +GET https://cdn.flightconnections.com/maptiles/en/{z}/{x}/{y}.webp +GET https://cdn.flightconnections.com/maptiles/en/{z}/{x}/{y}@2x.webp (retina) +``` + +Custom map tiles showing airport locations and route lines. Zoom level 2 tiles observed in this capture. + +--- + +## Third-Party Services (ads/analytics) + +| Domain | Purpose | +|-----------------------------------|------------------------| +| `compare.flightconnections.com` | Ad serving (ClickTripz integration) | +| `compare.flightconnections.com/x/pas` | Partner ad auction | +| `compare.flightconnections.com/c11g` | Ad slot configuration | +| `compare.flightconnections.com/b9s` | Event logging | + +--- + +## Key Internal IDs + +| Entity | ID | +|------------------|--------| +| DFW airport | `2138` | +| MAD airport | `186` | +| American Airlines| `300` | +| Boeing 777-200 | `44` | +| Boeing 787-9 | `59` | diff --git a/frida/okhttp_hook.js b/frida/okhttp_hook.js new file mode 100644 index 0000000..17df433 --- /dev/null +++ b/frida/okhttp_hook.js @@ -0,0 +1,206 @@ +/* + * Universal OkHttp Response Interceptor + * Hooks OkHttp's response chain to capture ALL HTTP responses. + * Works with Spirit, Delta, United (all use OkHttp/Retrofit). + * + * Sends captured data to a local server via Frida's send(). + */ + +Java.perform(function() { + console.log("[*] OkHttp Response Interceptor starting..."); + + // Filter: only capture responses from these domains + var targetDomains = [ + "api.spirit.com", + "www.delta.com", + "mobileapi.united.com", + "content.spirit.com", + "content.delta.com" + ]; + + // Filter: only capture these API paths + var targetPaths = [ + // Spirit + "/customermobileprod/", + "/v1/getboastatus", + "/v1/getboaparameters", + "/v2/Token", + "/v3/mytrips", + "/v1/booking", + "/v3/GetFlightInfoBI", + "/v5/Flight/Search", + + // Delta + "/api/mobile/asl", + "/api/mobile/getFlightStatus", + "/api/mobile/getFlightStatusByLeg", + "/api/mobile/login", + "/api/mobile/getDashboard", + "/api/mobile/getUpgradeEligibilityInfo", + + // United + "/standbylistservice/", + "/upgradelistservice/", + "/flightstatusservice/", + "/checkinservice/", + "/passriderlistservice/" + ]; + + function shouldCapture(url) { + var domainMatch = false; + var pathMatch = false; + + for (var i = 0; i < targetDomains.length; i++) { + if (url.indexOf(targetDomains[i]) !== -1) { + domainMatch = true; + break; + } + } + + if (!domainMatch) return false; + + for (var j = 0; j < targetPaths.length; j++) { + if (url.indexOf(targetPaths[j]) !== -1) { + pathMatch = true; + break; + } + } + + return pathMatch; + } + + // === Hook OkHttp3 RealCall.getResponseWithInterceptorChain === + try { + var OkHttpClient = Java.use("okhttp3.OkHttpClient"); + var Request = Java.use("okhttp3.Request"); + var Response = Java.use("okhttp3.Response"); + var ResponseBody = Java.use("okhttp3.ResponseBody"); + var BufferClass = Java.use("okio.Buffer"); + var MediaType = Java.use("okhttp3.MediaType"); + + // Hook the Interceptor.Chain.proceed to capture request+response + var RealInterceptorChain = Java.use("okhttp3.internal.http.RealInterceptorChain"); + + RealInterceptorChain.proceed.overload("okhttp3.Request").implementation = function(request) { + var url = request.url().toString(); + var response = this.proceed(request); + + if (shouldCapture(url)) { + try { + var method = request.method(); + var reqBody = null; + + // Capture request body + if (request.body() !== null) { + var reqBuffer = BufferClass.$new(); + request.body().writeTo(reqBuffer); + reqBody = reqBuffer.readUtf8(); + } + + // Capture request headers + var reqHeaders = {}; + var headerNames = request.headers(); + for (var i = 0; i < headerNames.size(); i++) { + reqHeaders[headerNames.name(i)] = headerNames.value(i); + } + + // Capture response + var statusCode = response.code(); + var respBody = null; + var respHeaders = {}; + + // Response headers + var respHeaderObj = response.headers(); + for (var j = 0; j < respHeaderObj.size(); j++) { + respHeaders[respHeaderObj.name(j)] = respHeaderObj.value(j); + } + + // Response body (need to peek without consuming) + var body = response.body(); + if (body !== null) { + var source = body.source(); + source.request(Long.MAX_VALUE); + var buffer = source.getBuffer().clone(); + respBody = buffer.readUtf8(); + } + + var captured = { + type: "HTTP_RESPONSE", + timestamp: new Date().toISOString(), + method: method, + url: url, + status: statusCode, + requestHeaders: reqHeaders, + requestBody: reqBody, + responseHeaders: respHeaders, + responseBody: respBody + }; + + // Send to Frida host + send(captured); + + console.log("[+] CAPTURED: " + method + " " + url + " -> " + statusCode + " (" + (respBody ? respBody.length : 0) + " chars)"); + + } catch(e) { + console.log("[-] Capture error for " + url + ": " + e); + } + } + + return response; + }; + + console.log("[+] OkHttp RealInterceptorChain.proceed hooked"); + + } catch(e) { + console.log("[-] OkHttp3 hook failed: " + e); + console.log("[*] Trying alternative hook..."); + + // Alternative: Hook at a higher level + try { + var Interceptor = Java.use("okhttp3.Interceptor"); + // This approach hooks via adding our own interceptor + console.log("[*] Alternative approach needed - see app-specific hooks"); + } catch(e2) { + console.log("[-] Alternative also failed: " + e2); + } + } + + // === Also hook Retrofit response callbacks === + try { + var CallbackClass = Java.use("retrofit2.OkHttpCall"); + CallbackClass.parseResponse.implementation = function(rawResponse) { + var response = this.parseResponse(rawResponse); + try { + var url = rawResponse.request().url().toString(); + if (shouldCapture(url)) { + var body = response.body(); + if (body !== null) { + console.log("[+] Retrofit response: " + url); + console.log("[+] Body class: " + body.getClass().getName()); + console.log("[+] Body: " + body.toString().substring(0, Math.min(500, body.toString().length))); + + send({ + type: "RETROFIT_RESPONSE", + timestamp: new Date().toISOString(), + url: url, + bodyClass: body.getClass().getName(), + body: body.toString() + }); + } + } + } catch(e) { + // Ignore parse errors + } + return response; + }; + console.log("[+] Retrofit parseResponse hooked"); + } catch(e) { + console.log("[-] Retrofit hook failed: " + e); + } + + // === Java Long for buffer request === + var Long = Java.use("java.lang.Long"); + Long.MAX_VALUE.value; + + console.log("[*] OkHttp Response Interceptor ready. Waiting for traffic..."); +}); diff --git a/frida/run.sh b/frida/run.sh new file mode 100755 index 0000000..9d079a2 --- /dev/null +++ b/frida/run.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# Boot emulator, setup Frida, and run the capture server for airline apps. +# Usage: ./run.sh [spirit|delta|united|all] + +set -e + +EMU=/Users/treyt/Library/Android/sdk/emulator/emulator +ADB=/Users/treyt/Library/Android/sdk/platform-tools/adb +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +FRIDA_SERVER="/data/local/tmp/frida-server" + +AIRLINE=${1:-spirit} + +# Map airline to package name +case "$AIRLINE" in + spirit) PKG="com.spirit.customerapp" ;; + delta) PKG="com.delta.mobile.android" ;; + united) PKG="com.united.mobile.android" ;; + all) PKG="all" ;; + *) echo "Usage: $0 [spirit|delta|united|all]"; exit 1 ;; +esac + +echo "=========================================" +echo "Airline API Capture via Frida" +echo "Target: $AIRLINE ($PKG)" +echo "=========================================" + +# 1. Check if emulator is running +if ! $ADB devices 2>/dev/null | grep -q "emulator"; then + echo "[1/5] Booting emulator..." + $EMU -avd Pixel_6_API_28 -writable-system -no-snapshot-load -no-audio -gpu swiftshader_indirect & + sleep 30 + $ADB wait-for-device + $ADB root + sleep 3 + $ADB remount +else + echo "[1/5] Emulator already running" +fi + +# 2. Start Frida server +echo "[2/5] Starting Frida server..." +$ADB root 2>/dev/null +sleep 1 +if ! $ADB shell "ps -A | grep frida-server" 2>/dev/null | grep -q frida; then + if ! $ADB shell "test -f $FRIDA_SERVER" 2>/dev/null; then + echo " Pushing frida-server..." + $ADB push /tmp/frida-server $FRIDA_SERVER + $ADB shell chmod 755 $FRIDA_SERVER + fi + $ADB shell "$FRIDA_SERVER -D &" + sleep 3 +fi +echo " Frida server running" + +# 3. Verify Frida connection +echo "[3/5] Verifying Frida..." +frida-ps -U | head -3 +echo " Connected" + +# 4. Install app if needed +echo "[4/5] Checking app installation..." +if [ "$PKG" = "all" ]; then + for pkg in com.spirit.customerapp com.delta.mobile.android com.united.mobile.android; do + if ! $ADB shell pm list packages | grep -q "$pkg"; then + echo " $pkg not installed - install manually first" + else + echo " $pkg OK" + fi + done +else + if ! $ADB shell pm list packages | grep -q "$PKG"; then + echo " Installing $PKG..." + case "$AIRLINE" in + spirit) $ADB install ~/Desktop/code/flights/apps/com.spirit.customerapp*.apk ;; + delta) $ADB install-multiple /tmp/delta_apk/base.apk /tmp/delta_apk/split_config.arm64_v8a.apk /tmp/delta_apk/split_config.xxhdpi.apk ;; + united) $ADB install ~/Desktop/code/flights/apps/united-airlines.apk ;; + esac + else + echo " $PKG installed" + fi +fi + +# 5. Launch app and start capture +echo "[5/5] Launching capture..." +if [ "$PKG" = "all" ]; then + echo "Run this script separately for each airline" + exit 0 +fi + +# Launch the app +$ADB shell monkey -p $PKG -c android.intent.category.LAUNCHER 1 2>/dev/null +sleep 5 + +echo "" +echo "=========================================" +echo "Starting Frida capture server..." +echo "Interact with the $AIRLINE app to trigger API calls." +echo "=========================================" +echo "" + +python3 "$SCRIPT_DIR/server.py" "$PKG" "$SCRIPT_DIR/okhttp_hook.js" diff --git a/frida/server.py b/frida/server.py new file mode 100644 index 0000000..0f2f681 --- /dev/null +++ b/frida/server.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +Frida data receiver server. +Receives captured HTTP responses from the Frida hook and saves them. +Also provides a simple API to query captured data. +""" + +import json +import frida +import sys +import os +import time +from pathlib import Path +from http.server import HTTPServer, BaseHTTPRequestHandler +import threading + +CAPTURE_DIR = Path(__file__).parent / "captures" +CAPTURE_DIR.mkdir(exist_ok=True) + +captured_data = [] + + +def on_message(message, data): + """Handle messages from Frida hook.""" + if message["type"] == "send": + payload = message["payload"] + captured_data.append(payload) + + url = payload.get("url", "unknown") + status = payload.get("status", "?") + method = payload.get("method", "?") + body_len = len(payload.get("responseBody", "") or "") + + print(f"\n{'='*60}") + print(f"[CAPTURED] {method} {url}") + print(f" Status: {status} | Response: {body_len} chars") + + # Save to file + ts = time.strftime("%Y%m%d_%H%M%S") + domain = url.split("/")[2] if "/" in url else "unknown" + filename = f"{ts}_{domain}_{method}_{status}.json" + filepath = CAPTURE_DIR / filename + + with open(filepath, "w") as f: + json.dump(payload, f, indent=2) + + print(f" Saved: {filepath.name}") + + # Print response body preview + resp_body = payload.get("responseBody", "") + if resp_body: + try: + parsed = json.loads(resp_body) + print(f" Response preview: {json.dumps(parsed, indent=2)[:500]}") + except: + print(f" Response preview: {resp_body[:300]}") + + elif message["type"] == "error": + print(f"[ERROR] {message['stack']}") + + +def attach_to_app(package_name, script_path): + """Attach Frida to a running app and load the hook script.""" + device = frida.get_usb_device() + print(f"[*] Connected to: {device.name}") + + # Try to attach to running process first + try: + session = device.attach(package_name) + print(f"[*] Attached to running process: {package_name}") + except frida.ProcessNotFoundError: + # Spawn it + print(f"[*] Spawning: {package_name}") + pid = device.spawn([package_name]) + session = device.attach(pid) + device.resume(pid) + print(f"[*] Spawned and attached: PID {pid}") + + with open(script_path) as f: + script_code = f.read() + + script = session.create_script(script_code) + script.on("message", on_message) + script.load() + + print(f"[*] Script loaded. Intercepting traffic for {package_name}...") + return session + + +def main(): + if len(sys.argv) < 2: + print("Usage: python server.py [hook_script.js]") + print("") + print("Examples:") + print(" python server.py com.spirit.customerapp") + print(" python server.py com.delta.mobile.android") + print(" python server.py com.united.mobile.android") + print("") + print("Default hook script: okhttp_hook.js") + sys.exit(1) + + package_name = sys.argv[1] + script_path = sys.argv[2] if len(sys.argv) > 2 else str(Path(__file__).parent / "okhttp_hook.js") + + print(f"[*] Target: {package_name}") + print(f"[*] Script: {script_path}") + print(f"[*] Captures: {CAPTURE_DIR}") + print("") + + session = attach_to_app(package_name, script_path) + + print("") + print("[*] Ready. Interact with the app to trigger API calls.") + print("[*] Press Ctrl+C to stop.") + print("") + + try: + sys.stdin.read() + except KeyboardInterrupt: + print("\n[*] Stopping...") + session.detach() + + # Save all captured data + if captured_data: + summary_path = CAPTURE_DIR / f"all_captures_{time.strftime('%Y%m%d_%H%M%S')}.json" + with open(summary_path, "w") as f: + json.dump(captured_data, f, indent=2) + print(f"[*] Saved {len(captured_data)} captures to {summary_path}") + + +if __name__ == "__main__": + main() diff --git a/frida/simple_hook.js b/frida/simple_hook.js new file mode 100644 index 0000000..f4c10f3 --- /dev/null +++ b/frida/simple_hook.js @@ -0,0 +1,101 @@ +/* + * Simple URL connection logger. + * Hooks at the lowest level to catch ALL HTTP traffic regardless of OkHttp version. + */ +Java.perform(function() { + console.log("[*] Simple HTTP hook starting..."); + + // Hook HttpURLConnection + try { + var HttpURLConnection = Java.use("java.net.HttpURLConnection"); + HttpURLConnection.getInputStream.implementation = function() { + var url = this.getURL().toString(); + var code = this.getResponseCode(); + console.log("[HTTP] " + code + " " + url); + return this.getInputStream(); + }; + console.log("[+] HttpURLConnection.getInputStream hooked"); + } catch(e) { + console.log("[-] HttpURLConnection hook failed: " + e); + } + + // Hook OkHttp Response - try multiple class paths + var okHttpClasses = [ + "okhttp3.internal.http.RealInterceptorChain", + "okhttp3.internal.connection.RealInterceptorChain", + "okhttp3.RealCall" + ]; + + for (var i = 0; i < okHttpClasses.length; i++) { + try { + var cls = Java.use(okHttpClasses[i]); + var methods = cls.class.getDeclaredMethods(); + console.log("[*] Found " + okHttpClasses[i] + " with " + methods.length + " methods:"); + for (var j = 0; j < methods.length; j++) { + console.log(" " + methods[j].getName()); + } + } catch(e) { + console.log("[-] " + okHttpClasses[i] + ": not found"); + } + } + + // Hook OkHttp Response.body() to see what responses come back + try { + var Response = Java.use("okhttp3.Response"); + Response.body.implementation = function() { + var body = this.body(); + try { + var url = this.request().url().toString(); + var code = this.code(); + console.log("[OkHttp] " + code + " " + url); + + if (body !== null && url.indexOf("spirit.com") !== -1 || + url.indexOf("delta.com") !== -1 || url.indexOf("united.com") !== -1) { + + // Try to peek at the body + try { + var source = body.source(); + source.request(java_lang_Long.MAX_VALUE.value); + var buffer = source.getBuffer().clone(); + var bodyStr = buffer.readUtf8(); + + if (bodyStr.length > 0) { + console.log("[BODY] (" + bodyStr.length + " chars) " + bodyStr.substring(0, Math.min(2000, bodyStr.length))); + + send({ + type: "RESPONSE", + url: url, + status: code, + body: bodyStr + }); + } + } catch(be) { + console.log("[BODY-ERR] " + be); + } + } + } catch(e) { + // ignore + } + return body; + }; + console.log("[+] OkHttp Response.body() hooked"); + } catch(e) { + console.log("[-] OkHttp Response hook failed: " + e); + } + + var java_lang_Long = Java.use("java.lang.Long"); + + // Also hook URL.openConnection for non-OkHttp traffic + try { + var URL = Java.use("java.net.URL"); + URL.openConnection.overload().implementation = function() { + console.log("[URL] " + this.toString()); + return this.openConnection(); + }; + console.log("[+] URL.openConnection hooked"); + } catch(e) { + console.log("[-] URL hook failed: " + e); + } + + console.log("[*] Simple HTTP hook ready."); +});