montana/Русский/Логистика/generate_ports.py

1332 lines
81 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""Generate world_ports.json with ~5000 real seaports worldwide."""
import json, os
REGIONS = {
"NEUR": "North Europe", "SEUR": "South Europe/Med", "EASIA": "East Asia",
"SEASIA": "Southeast Asia", "SASIA": "South Asia", "ME": "Middle East",
"EAFR": "East Africa", "WAFR": "West Africa", "NAFR": "North Africa",
"NAMERICA": "North America", "SAMERICA": "South America", "CARIB": "Caribbean",
"OCEANIA": "Oceania", "BALTIC": "Baltic", "BSEA": "Black Sea"
}
def p(name, country, cc, unlocode, lat, lon, size="M", region="NEUR"):
"""Create a port entry."""
key = name.lower().replace(" ", "_").replace("-", "_").replace("'", "").replace(".", "")
return {"key": key, "name": name, "country": country, "country_code": cc,
"unlocode": unlocode, "lat": round(lat, 4), "lon": round(lon, 4),
"size": size, "region": region}
ports = []
# ============================================================
# NORTH EUROPE (~200 ports)
# ============================================================
neur = [
# United Kingdom
("London", "United Kingdom", "GB", "GBLON", 51.5074, -0.1278, "VL"),
("Southampton", "United Kingdom", "GB", "GBSOU", 50.9097, -1.4044, "VL"),
("Felixstowe", "United Kingdom", "GB", "GBFXT", 51.9536, 1.3513, "VL"),
("Liverpool", "United Kingdom", "GB", "GBLIV", 53.4084, -2.9916, "L"),
("Immingham", "United Kingdom", "GB", "GBIMM", 53.6309, -0.2106, "L"),
("Tilbury", "United Kingdom", "GB", "GBTIL", 51.4607, 0.3543, "L"),
("Bristol", "United Kingdom", "GB", "GBBRS", 51.4545, -2.5879, "L"),
("Grimsby", "United Kingdom", "GB", "GBGRY", 53.5675, -0.0799, "M"),
("Hull", "United Kingdom", "GB", "GBHUL", 53.7457, -0.3367, "L"),
("Teesport", "United Kingdom", "GB", "GBTES", 54.5973, -1.1418, "L"),
("Aberdeen", "United Kingdom", "GB", "GBABD", 57.1497, -2.0943, "M"),
("Edinburgh Leith", "United Kingdom", "GB", "GBLEI", 55.9833, -3.1700, "M"),
("Dover", "United Kingdom", "GB", "GBDVR", 51.1279, 1.3134, "L"),
("Harwich", "United Kingdom", "GB", "GBHRW", 51.9460, 1.2880, "M"),
("Portsmouth", "United Kingdom", "GB", "GBPME", 50.8198, -1.0880, "M"),
("Plymouth", "United Kingdom", "GB", "GBPLY", 50.3755, -4.1427, "M"),
("Swansea", "United Kingdom", "GB", "GBSWA", 51.6214, -3.9436, "M"),
("Cardiff", "United Kingdom", "GB", "GBCDF", 51.4816, -3.1791, "M"),
("Milford Haven", "United Kingdom", "GB", "GBMLF", 51.7080, -5.0400, "L"),
("Belfast", "United Kingdom", "GB", "GBBEL", 54.6079, -5.9264, "L"),
("Glasgow", "United Kingdom", "GB", "GBGLW", 55.8642, -4.2518, "M"),
("Grangemouth", "United Kingdom", "GB", "GBGRG", 56.0237, -3.7165, "M"),
("Dundee", "United Kingdom", "GB", "GBDND", 56.4620, -2.9707, "S"),
("Inverness", "United Kingdom", "GB", "GBINV", 57.4778, -4.2247, "S"),
("Lerwick", "United Kingdom", "GB", "GBLER", 60.1540, -1.1450, "S"),
("Kirkwall", "United Kingdom", "GB", "GBKWL", 58.9810, -2.9596, "S"),
("Peterhead", "United Kingdom", "GB", "GBPHD", 57.5050, -1.7738, "S"),
("Poole", "United Kingdom", "GB", "GBPOO", 50.7151, -1.9871, "S"),
("Whitby", "United Kingdom", "GB", "GBWHY", 54.4860, -0.6150, "S"),
("Great Yarmouth", "United Kingdom", "GB", "GBGTY", 52.6074, 1.7313, "S"),
# Netherlands
("Rotterdam", "Netherlands", "NL", "NLRTM", 51.9244, 4.4777, "VL"),
("Amsterdam", "Netherlands", "NL", "NLAMS", 52.3676, 4.9041, "VL"),
("Vlissingen", "Netherlands", "NL", "NLVLI", 51.4427, 3.5727, "L"),
("Terneuzen", "Netherlands", "NL", "NLTNZ", 51.3360, 3.8279, "M"),
("Moerdijk", "Netherlands", "NL", "NLMOE", 51.6944, 4.5861, "M"),
("Dordrecht", "Netherlands", "NL", "NLDOR", 51.8133, 4.6901, "M"),
("Eemshaven", "Netherlands", "NL", "NLEEM", 53.4388, 6.8336, "M"),
("Delfzijl", "Netherlands", "NL", "NLDZL", 53.3310, 6.9180, "S"),
("Den Helder", "Netherlands", "NL", "NLDHR", 52.9531, 4.7610, "S"),
("Harlingen", "Netherlands", "NL", "NLHAR", 53.1747, 5.4222, "S"),
# Belgium
("Antwerp", "Belgium", "BE", "BEANR", 51.2213, 4.4051, "VL"),
("Zeebrugge", "Belgium", "BE", "BEZEE", 51.3285, 3.1750, "L"),
("Ghent", "Belgium", "BE", "BEGNE", 51.0543, 3.7174, "L"),
("Ostend", "Belgium", "BE", "BEOST", 51.2254, 2.9263, "M"),
# Germany
("Hamburg", "Germany", "DE", "DEHAM", 53.5511, 9.9937, "VL"),
("Bremerhaven", "Germany", "DE", "DEBRV", 53.5396, 8.5809, "VL"),
("Wilhelmshaven", "Germany", "DE", "DEWVN", 53.5147, 8.1118, "L"),
("Bremen", "Germany", "DE", "DEBRE", 53.0793, 8.8017, "L"),
("Rostock", "Germany", "DE", "DERSK", 54.0887, 12.1407, "L"),
("Lubeck", "Germany", "DE", "DELBC", 53.8655, 10.6866, "M"),
("Kiel", "Germany", "DE", "DEKEL", 54.3233, 10.1228, "M"),
("Emden", "Germany", "DE", "DEEME", 53.3590, 7.2060, "M"),
("Brunsbüttel", "Germany", "DE", "DEBRU", 53.8949, 9.1380, "M"),
("Cuxhaven", "Germany", "DE", "DECUX", 53.8711, 8.7060, "S"),
("Flensburg", "Germany", "DE", "DEFLF", 54.7937, 9.4469, "S"),
("Wismar", "Germany", "DE", "DEWIS", 53.8917, 11.4583, "S"),
("Stralsund", "Germany", "DE", "DESTR", 54.3150, 13.0900, "S"),
("Sassnitz", "Germany", "DE", "DESAS", 54.5114, 13.6413, "S"),
# France (Atlantic/Channel)
("Le Havre", "France", "FR", "FRLEH", 49.4944, 0.1079, "VL"),
("Dunkirk", "France", "FR", "FRDKK", 51.0383, 2.3775, "L"),
("Rouen", "France", "FR", "FRROU", 49.4432, 1.0993, "L"),
("Nantes Saint Nazaire", "France", "FR", "FRSNE", 47.2780, -2.1700, "L"),
("Brest", "France", "FR", "FRBES", 48.3904, -4.4861, "M"),
("Calais", "France", "FR", "FRCQF", 50.9513, 1.8587, "M"),
("Boulogne", "France", "FR", "FRBOL", 50.7264, 1.6147, "M"),
("Cherbourg", "France", "FR", "FRCER", 49.6337, -1.6222, "M"),
("Lorient", "France", "FR", "FRLRT", 47.7477, -3.3700, "S"),
("La Rochelle", "France", "FR", "FRLRH", 46.1591, -1.1520, "M"),
("Bordeaux", "France", "FR", "FRBOD", 44.8378, -0.5792, "L"),
("Bayonne", "France", "FR", "FRBAY", 43.4832, -1.4841, "S"),
("Dieppe", "France", "FR", "FRDPE", 49.9255, 1.0845, "S"),
("Saint Malo", "France", "FR", "FRSML", 48.6493, -2.0060, "S"),
# Ireland
("Dublin", "Ireland", "IE", "IEDUB", 53.3498, -6.2603, "L"),
("Cork", "Ireland", "IE", "IEORK", 51.8969, -8.4863, "L"),
("Shannon Foynes", "Ireland", "IE", "IESNN", 52.6140, -9.0640, "M"),
("Waterford", "Ireland", "IE", "IEWAT", 52.2593, -7.1101, "M"),
("Galway", "Ireland", "IE", "IEGAL", 53.2707, -9.0568, "S"),
("Rosslare", "Ireland", "IE", "IEROS", 52.2547, -6.3389, "S"),
("Drogheda", "Ireland", "IE", "IEDRO", 53.7179, -6.3474, "S"),
# Norway
("Bergen", "Norway", "NO", "NOBGO", 60.3913, 5.3221, "L"),
("Oslo", "Norway", "NO", "NOOSL", 59.9139, 10.7522, "L"),
("Stavanger", "Norway", "NO", "NOSVG", 58.9700, 5.7331, "L"),
("Trondheim", "Norway", "NO", "NOTRD", 63.4305, 10.3951, "M"),
("Kristiansand", "Norway", "NO", "NOKRS", 58.1599, 8.0182, "M"),
("Tromso", "Norway", "NO", "NOTOS", 69.6496, 18.9560, "M"),
("Narvik", "Norway", "NO", "NONVK", 68.4385, 17.4273, "M"),
("Hammerfest", "Norway", "NO", "NOHFT", 70.6634, 23.6821, "S"),
("Bodo", "Norway", "NO", "NOBOO", 67.2804, 14.4049, "S"),
("Alesund", "Norway", "NO", "NOAES", 62.4722, 6.1495, "M"),
("Molde", "Norway", "NO", "NOMOL", 62.7375, 7.1610, "S"),
("Haugesund", "Norway", "NO", "NOHAU", 59.4138, 5.2680, "M"),
("Fredrikstad", "Norway", "NO", "NOFRK", 59.2181, 10.9298, "S"),
("Drammen", "Norway", "NO", "NODRM", 59.7440, 10.2045, "S"),
("Larvik", "Norway", "NO", "NOLAR", 59.0530, 10.0345, "S"),
("Moss", "Norway", "NO", "NOMOS", 59.4340, 10.6590, "S"),
("Kirkenes", "Norway", "NO", "NOKKN", 69.7271, 30.0458, "S"),
("Mongstad", "Norway", "NO", "NOMON", 60.8100, 5.0300, "M"),
("Florø", "Norway", "NO", "NOFRO", 61.5997, 5.0322, "S"),
("Sandefjord", "Norway", "NO", "NOSAD", 59.1314, 10.2166, "S"),
("Leirvik", "Norway", "NO", "NOLEI", 59.7792, 5.5003, "S"),
("Måløy", "Norway", "NO", "NOMAY", 61.9340, 5.1140, "S"),
("Vardø", "Norway", "NO", "NOVAO", 70.3716, 31.1089, "S"),
("Honningsvåg", "Norway", "NO", "NOHVG", 70.9827, 25.9706, "S"),
("Sortland", "Norway", "NO", "NOSOL", 68.6933, 15.4134, "S"),
("Harstad", "Norway", "NO", "NOHAR", 68.7989, 16.5417, "S"),
("Svolvær", "Norway", "NO", "NOSVJ", 68.2342, 14.5684, "S"),
# Denmark
("Copenhagen", "Denmark", "DK", "DKCPH", 55.6761, 12.5683, "L"),
("Aarhus", "Denmark", "DK", "DKAAR", 56.1629, 10.2039, "L"),
("Fredericia", "Denmark", "DK", "DKFRC", 55.5660, 9.7520, "M"),
("Esbjerg", "Denmark", "DK", "DKEBJ", 55.4760, 8.4519, "M"),
("Aalborg", "Denmark", "DK", "DKAAL", 57.0488, 9.9217, "M"),
("Odense", "Denmark", "DK", "DKODE", 55.3959, 10.3883, "S"),
("Rønne", "Denmark", "DK", "DKRNN", 55.1000, 14.7000, "S"),
("Kalundborg", "Denmark", "DK", "DKKAL", 55.6833, 11.0833, "S"),
("Helsingør", "Denmark", "DK", "DKHLS", 56.0361, 12.6136, "S"),
# Iceland
("Reykjavik", "Iceland", "IS", "ISREY", 64.1466, -21.9426, "M"),
("Akureyri", "Iceland", "IS", "ISAKU", 65.6835, -18.0878, "S"),
("Ísafjörður", "Iceland", "IS", "ISISF", 66.0748, -23.1273, "S"),
("Vestmannaeyjar", "Iceland", "IS", "ISVES", 63.4422, -20.2700, "S"),
# Faroe Islands
("Tórshavn", "Faroe Islands", "FO", "FOTOR", 62.0079, -6.7906, "S"),
("Klaksvík", "Faroe Islands", "FO", "FOKLA", 62.2266, -6.5900, "S"),
]
for t in neur:
ports.append(p(*t, region="NEUR") if len(t) == 7 else p(*t))
# ============================================================
# BALTIC (~150 ports)
# ============================================================
baltic = [
# Sweden
("Gothenburg", "Sweden", "SE", "SEGOT", 57.7089, 11.9746, "VL"),
("Stockholm", "Sweden", "SE", "SESTO", 59.3293, 18.0686, "L"),
("Malmo", "Sweden", "SE", "SEMMA", 55.6050, 13.0038, "L"),
("Helsingborg", "Sweden", "SE", "SEHEL", 56.0465, 12.6945, "M"),
("Norrköping", "Sweden", "SE", "SENRK", 58.5942, 16.1826, "M"),
("Luleå", "Sweden", "SE", "SELUL", 65.5848, 22.1547, "M"),
("Gävle", "Sweden", "SE", "SEGVX", 60.6749, 17.1413, "M"),
("Sundsvall", "Sweden", "SE", "SESUN", 62.3908, 17.3069, "M"),
("Umeå", "Sweden", "SE", "SEUME", 63.8258, 20.2630, "S"),
("Kalmar", "Sweden", "SE", "SEKLR", 56.6634, 16.3566, "S"),
("Karlshamn", "Sweden", "SE", "SEKAN", 56.1706, 14.8618, "M"),
("Trelleborg", "Sweden", "SE", "SETRE", 55.3757, 13.1574, "M"),
("Visby", "Sweden", "SE", "SEVIS", 57.6407, 18.2948, "S"),
("Oxelösund", "Sweden", "SE", "SEOXL", 58.6667, 17.1000, "M"),
("Karlskrona", "Sweden", "SE", "SEKAA", 56.1612, 15.5869, "S"),
("Skellefteå", "Sweden", "SE", "SESKE", 64.7507, 20.9528, "S"),
("Halmstad", "Sweden", "SE", "SEHAL", 56.6739, 12.8572, "S"),
("Ystad", "Sweden", "SE", "SEYSD", 55.4295, 13.8200, "S"),
("Piteå", "Sweden", "SE", "SEPIT", 65.3173, 21.4796, "S"),
("Västerås", "Sweden", "SE", "SEVST", 59.6099, 16.5448, "S"),
("Söderhamn", "Sweden", "SE", "SESOD", 61.3042, 17.0590, "S"),
("Hudiksvall", "Sweden", "SE", "SEHUD", 61.7282, 17.1057, "S"),
("Örnsköldsvik", "Sweden", "SE", "SEORN", 63.2909, 18.7152, "S"),
# Finland
("Helsinki", "Finland", "FI", "FIHEL", 60.1699, 24.9384, "L"),
("Turku", "Finland", "FI", "FITKU", 60.4518, 22.2666, "M"),
("Kotka", "Finland", "FI", "FIKTK", 60.4664, 26.9458, "L"),
("Hamina", "Finland", "FI", "FIHMN", 60.5693, 27.1978, "M"),
("Rauma", "Finland", "FI", "FIRAU", 61.1286, 21.5115, "M"),
("Pori", "Finland", "FI", "FIPOR", 61.4851, 21.7974, "M"),
("Oulu", "Finland", "FI", "FIOUL", 65.0121, 25.4651, "M"),
("Vaasa", "Finland", "FI", "FIVAA", 63.0951, 21.6165, "M"),
("Kokkola", "Finland", "FI", "FIKOK", 63.8384, 23.1304, "M"),
("Hanko", "Finland", "FI", "FIHAN", 59.8236, 22.9688, "M"),
("Naantali", "Finland", "FI", "FINAA", 60.4673, 22.0333, "M"),
("Pietarsaari", "Finland", "FI", "FIPIE", 63.6752, 22.7027, "S"),
("Kemi", "Finland", "FI", "FIKEM", 65.7361, 24.5634, "S"),
("Tornio", "Finland", "FI", "FITOR", 65.8493, 24.1441, "S"),
("Raahe", "Finland", "FI", "FIRHE", 64.6841, 24.4794, "S"),
("Mariehamn", "Finland", "FI", "FIMHQ", 60.0971, 19.9348, "S"),
# Estonia
("Tallinn", "Estonia", "EE", "EETLL", 59.4370, 24.7536, "L"),
("Muuga", "Estonia", "EE", "EEMUG", 59.4900, 24.9600, "L"),
("Paldiski", "Estonia", "EE", "EEPAL", 59.3483, 24.0538, "M"),
("Pärnu", "Estonia", "EE", "EEPRN", 58.3859, 24.4964, "S"),
("Sillamäe", "Estonia", "EE", "EESIL", 59.3960, 27.7750, "M"),
("Kunda", "Estonia", "EE", "EEKUN", 59.5167, 26.5333, "S"),
# Latvia
("Riga", "Latvia", "LV", "LVRIX", 56.9496, 24.1052, "L"),
("Ventspils", "Latvia", "LV", "LVVEN", 57.3942, 21.5606, "L"),
("Liepaja", "Latvia", "LV", "LVLPX", 56.5047, 21.0107, "M"),
# Lithuania
("Klaipeda", "Lithuania", "LT", "LTKLY", 55.7172, 21.1175, "L"),
("Butinge", "Lithuania", "LT", "LTBUT", 56.0667, 21.0500, "M"),
# Poland
("Gdansk", "Poland", "PL", "PLGDN", 54.3520, 18.6466, "VL"),
("Gdynia", "Poland", "PL", "PLGDY", 54.5189, 18.5305, "L"),
("Szczecin", "Poland", "PL", "PLSZZ", 53.4285, 14.5528, "L"),
("Swinoujscie", "Poland", "PL", "PLSWI", 53.9108, 14.2477, "M"),
("Kolobrzeg", "Poland", "PL", "PLKOL", 54.1776, 15.5761, "S"),
("Elblag", "Poland", "PL", "PLELB", 54.1523, 19.4044, "S"),
("Police", "Poland", "PL", "PLPLC", 53.5561, 14.5694, "S"),
# Russia (Baltic)
("Saint Petersburg", "Russia", "RU", "RULED", 59.9311, 30.3609, "VL"),
("Kaliningrad", "Russia", "RU", "RUKGD", 54.7065, 20.5108, "L"),
("Ust-Luga", "Russia", "RU", "RUULU", 59.6800, 28.4000, "L"),
("Primorsk", "Russia", "RU", "RUPRI", 60.3500, 28.6200, "L"),
("Vysotsk", "Russia", "RU", "RUVYS", 60.6275, 28.5736, "M"),
("Vyborg", "Russia", "RU", "RUVYB", 60.7092, 28.7528, "S"),
]
for t in baltic:
ports.append(p(*t, region="BALTIC") if len(t) == 7 else p(*t))
# ============================================================
# SOUTH EUROPE / MEDITERRANEAN (~250 ports)
# ============================================================
seur = [
# Spain
("Barcelona", "Spain", "ES", "ESBCN", 41.3851, 2.1734, "VL"),
("Valencia", "Spain", "ES", "ESVLC", 39.4699, -0.3763, "VL"),
("Algeciras", "Spain", "ES", "ESALG", 36.1275, -5.4434, "VL"),
("Bilbao", "Spain", "ES", "ESBIO", 43.2627, -2.9253, "L"),
("Las Palmas", "Spain", "ES", "ESLPA", 28.1235, -15.4363, "L"),
("Tarragona", "Spain", "ES", "ESTAR", 41.1189, 1.2445, "L"),
("Cartagena", "Spain", "ES", "ESCAR", 37.6000, -0.9864, "L"),
("Vigo", "Spain", "ES", "ESVGO", 42.2406, -8.7207, "L"),
("Gijon", "Spain", "ES", "ESGIJ", 43.5453, -5.6616, "M"),
("Huelva", "Spain", "ES", "ESHUE", 37.2614, -6.9447, "M"),
("Malaga", "Spain", "ES", "ESAGP", 36.7213, -4.4214, "M"),
("Cadiz", "Spain", "ES", "ESCAD", 36.5271, -6.2886, "M"),
("Sevilla", "Spain", "ES", "ESSVQ", 37.3891, -5.9845, "M"),
("A Coruna", "Spain", "ES", "ESLCG", 43.3623, -8.4115, "M"),
("Santander", "Spain", "ES", "ESSDR", 43.4623, -3.8100, "M"),
("Alicante", "Spain", "ES", "ESALC", 38.3452, -0.4810, "M"),
("Castellon", "Spain", "ES", "ESCAS", 39.9864, -0.0513, "M"),
("Ferrol", "Spain", "ES", "ESFER", 43.4843, -8.2328, "M"),
("Pasajes", "Spain", "ES", "ESPAS", 43.3217, -1.9244, "S"),
("Aviles", "Spain", "ES", "ESAVI", 43.5917, -5.9250, "S"),
("Almeria", "Spain", "ES", "ESALM", 36.8340, -2.4637, "S"),
("Motril", "Spain", "ES", "ESMOT", 36.7237, -3.5180, "S"),
("Palma de Mallorca", "Spain", "ES", "ESPMI", 39.5696, 2.6502, "M"),
("Santa Cruz de Tenerife", "Spain", "ES", "ESSCT", 28.4636, -16.2518, "M"),
("Ceuta", "Spain", "ES", "ESCEU", 35.8894, -5.3198, "S"),
("Melilla", "Spain", "ES", "ESMEL", 35.2923, -2.9381, "S"),
("Ibiza", "Spain", "ES", "ESIBZ", 38.9067, 1.4206, "S"),
("Mahon", "Spain", "ES", "ESMAH", 39.8868, 4.2629, "S"),
# Italy
("Genoa", "Italy", "IT", "ITGOA", 44.4056, 8.9463, "VL"),
("Trieste", "Italy", "IT", "ITTRS", 45.6495, 13.7768, "L"),
("Gioia Tauro", "Italy", "IT", "ITGIT", 38.4254, 15.8972, "VL"),
("La Spezia", "Italy", "IT", "ITSPE", 44.1024, 9.8240, "L"),
("Livorno", "Italy", "IT", "ITLIV", 43.5485, 10.3106, "L"),
("Naples", "Italy", "IT", "ITNAP", 40.8518, 14.2681, "L"),
("Venice", "Italy", "IT", "ITVCE", 45.4408, 12.3155, "L"),
("Ravenna", "Italy", "IT", "ITRAN", 44.4184, 12.2035, "M"),
("Taranto", "Italy", "IT", "ITTAR", 40.4764, 17.2270, "M"),
("Cagliari", "Italy", "IT", "ITCAG", 39.2238, 9.1217, "M"),
("Palermo", "Italy", "IT", "ITPMO", 38.1157, 13.3615, "M"),
("Catania", "Italy", "IT", "ITCTA", 37.5079, 15.0934, "M"),
("Ancona", "Italy", "IT", "ITAN", 43.6158, 13.5184, "M"),
("Bari", "Italy", "IT", "ITBRI", 41.1171, 16.8719, "M"),
("Brindisi", "Italy", "IT", "ITBDS", 40.6382, 17.9469, "M"),
("Salerno", "Italy", "IT", "ITSAL", 40.6824, 14.7681, "M"),
("Savona", "Italy", "IT", "ITSVN", 44.3091, 8.4772, "M"),
("Augusta", "Italy", "IT", "ITAUG", 37.2307, 15.2216, "L"),
("Olbia", "Italy", "IT", "ITOLB", 40.9226, 9.5015, "S"),
("Civitavecchia", "Italy", "IT", "ITCVV", 42.0928, 11.7868, "M"),
("Messina", "Italy", "IT", "ITMSN", 38.1938, 15.5540, "M"),
("Piombino", "Italy", "IT", "ITPIO", 42.9261, 10.5283, "S"),
("Trapani", "Italy", "IT", "ITTPS", 38.0174, 12.5140, "S"),
("Marina di Carrara", "Italy", "IT", "ITMDC", 44.0400, 10.0400, "S"),
("Monfalcone", "Italy", "IT", "ITMFN", 45.7833, 13.5333, "S"),
("Porto Torres", "Italy", "IT", "ITPTO", 40.8382, 8.4018, "S"),
("Reggio Calabria", "Italy", "IT", "ITREG", 38.1147, 15.6500, "S"),
("Siracusa", "Italy", "IT", "ITSIR", 37.0755, 15.2866, "S"),
# Portugal
("Lisbon", "Portugal", "PT", "PTLIS", 38.7223, -9.1393, "L"),
("Sines", "Portugal", "PT", "PTSIN", 37.9514, -8.8700, "L"),
("Leixoes", "Portugal", "PT", "PTLEI", 41.1853, -8.7061, "L"),
("Setubal", "Portugal", "PT", "PTSET", 38.5244, -8.8882, "M"),
("Aveiro", "Portugal", "PT", "PTAVE", 40.6443, -8.6455, "S"),
("Faro", "Portugal", "PT", "PTFAO", 37.0194, -7.9322, "S"),
("Funchal", "Portugal", "PT", "PTFNC", 32.6669, -16.9241, "M"),
("Ponta Delgada", "Portugal", "PT", "PTPDL", 37.7394, -25.6687, "S"),
# Greece
("Piraeus", "Greece", "GR", "GRPIR", 37.9475, 23.6370, "VL"),
("Thessaloniki", "Greece", "GR", "GRTHE", 40.6401, 22.9444, "L"),
("Heraklion", "Greece", "GR", "GRHER", 35.3387, 25.1442, "M"),
("Volos", "Greece", "GR", "GRVOL", 39.3666, 22.9507, "M"),
("Patras", "Greece", "GR", "GRPAT", 38.2466, 21.7346, "M"),
("Elefsina", "Greece", "GR", "GRELE", 38.0416, 23.5379, "M"),
("Kavala", "Greece", "GR", "GRKVA", 40.9376, 24.4069, "S"),
("Alexandroupolis", "Greece", "GR", "GRALX", 40.8474, 25.8741, "S"),
("Corfu", "Greece", "GR", "GRCFU", 39.6243, 19.9217, "S"),
("Rhodes", "Greece", "GR", "GRRHO", 36.4510, 28.2278, "S"),
("Chania", "Greece", "GR", "GRCHA", 35.5138, 24.0180, "S"),
("Syros", "Greece", "GR", "GRSYR", 37.4467, 24.9269, "S"),
("Mytilene", "Greece", "GR", "GRMJT", 39.1100, 26.5600, "S"),
("Chios", "Greece", "GR", "GRCHI", 38.3707, 26.1360, "S"),
("Igoumenitsa", "Greece", "GR", "GRIGO", 39.5028, 20.2686, "S"),
("Lavrio", "Greece", "GR", "GRLAV", 37.7114, 24.0542, "S"),
("Agioi Theodoroi", "Greece", "GR", "GRATH", 37.9333, 23.1167, "M"),
("Souda Bay", "Greece", "GR", "GRSUD", 35.4800, 24.0800, "S"),
("Preveza", "Greece", "GR", "GRPVK", 38.9511, 20.7517, "S"),
# Turkey (Mediterranean coast)
("Istanbul", "Turkey", "TR", "TRIST", 41.0082, 28.9784, "VL"),
("Mersin", "Turkey", "TR", "TRMER", 36.7991, 34.6332, "VL"),
("Izmir", "Turkey", "TR", "TRIZM", 38.4237, 27.1428, "L"),
("Iskenderun", "Turkey", "TR", "TRISK", 36.5864, 36.1766, "L"),
("Aliaga", "Turkey", "TR", "TRALI", 38.7986, 26.9675, "L"),
("Gemlik", "Turkey", "TR", "TRGEM", 40.4339, 29.1550, "M"),
("Antalya", "Turkey", "TR", "TRANT", 36.8969, 30.7133, "M"),
("Bodrum", "Turkey", "TR", "TRBXN", 37.0343, 27.4305, "S"),
("Marmaris", "Turkey", "TR", "TRMAR", 36.8514, 28.2714, "S"),
("Cesme", "Turkey", "TR", "TRCES", 38.3261, 26.3059, "S"),
("Bandirma", "Turkey", "TR", "TRBAN", 40.3539, 27.9764, "M"),
("Derince", "Turkey", "TR", "TRDER", 40.7569, 29.8183, "M"),
("Tekirdag", "Turkey", "TR", "TRTEK", 40.9781, 27.5117, "M"),
# Croatia
("Rijeka", "Croatia", "HR", "HRRJK", 45.3271, 14.4422, "L"),
("Split", "Croatia", "HR", "HRSPU", 43.5081, 16.4402, "M"),
("Ploce", "Croatia", "HR", "HRPLO", 43.0553, 17.4340, "M"),
("Dubrovnik", "Croatia", "HR", "HRDBV", 42.6507, 18.0944, "S"),
("Zadar", "Croatia", "HR", "HRZAD", 44.1194, 15.2314, "S"),
("Sibenik", "Croatia", "HR", "HRSIB", 43.7350, 15.8952, "S"),
("Pula", "Croatia", "HR", "HRPUY", 44.8666, 13.8496, "S"),
# Slovenia
("Koper", "Slovenia", "SI", "SIKOP", 45.5469, 13.7294, "L"),
# Montenegro
("Bar", "Montenegro", "ME", "MEBAR", 42.0903, 19.1004, "M"),
("Kotor", "Montenegro", "ME", "MEKOT", 42.4247, 18.7712, "S"),
# Albania
("Durres", "Albania", "AL", "ALDRZ", 41.3246, 19.4565, "M"),
("Vlore", "Albania", "AL", "ALVLO", 40.4661, 19.4914, "S"),
("Sarande", "Albania", "AL", "ALSRN", 39.8661, 20.0050, "S"),
# Malta
("Valletta", "Malta", "MT", "MTMLA", 35.8989, 14.5146, "L"),
("Marsaxlokk", "Malta", "MT", "MTMAR", 35.8420, 14.5430, "L"),
# Cyprus
("Limassol", "Cyprus", "CY", "CYLMS", 34.6786, 33.0413, "L"),
("Larnaca", "Cyprus", "CY", "CYLCA", 34.9003, 33.6232, "M"),
("Vassiliko", "Cyprus", "CY", "CYVAS", 34.7239, 33.3264, "M"),
# Monaco
("Monaco", "Monaco", "MC", "MCMON", 43.7384, 7.4246, "S"),
# Gibraltar
("Gibraltar", "Gibraltar", "GI", "GIGIB", 36.1408, -5.3536, "M"),
# France (Mediterranean)
("Marseille", "France", "FR", "FRMRS", 43.2965, 5.3698, "VL"),
("Fos sur Mer", "France", "FR", "FRFOS", 43.4276, 4.9445, "VL"),
("Nice", "France", "FR", "FRNCE", 43.7102, 7.2620, "S"),
("Sete", "France", "FR", "FRSET", 43.4035, 3.6948, "M"),
("Port la Nouvelle", "France", "FR", "FRPLN", 43.0167, 3.0667, "S"),
("Toulon", "France", "FR", "FRTLN", 43.1242, 5.9280, "M"),
("Ajaccio", "France", "FR", "FRAJA", 41.9194, 8.7386, "S"),
("Bastia", "France", "FR", "FRBIA", 42.6973, 9.4530, "S"),
("Port Vendres", "France", "FR", "FRPVD", 42.5182, 3.1051, "S"),
]
for t in seur:
ports.append(p(*t, region="SEUR") if len(t) == 7 else p(*t))
# ============================================================
# BLACK SEA (~60 ports)
# ============================================================
bsea = [
# Turkey — Black Sea coast
("Samsun", "Turkey", "TR", "TRSSM", 41.2867, 36.3300, "L"),
("Trabzon", "Turkey", "TR", "TRTRB", 41.0015, 39.7178, "M"),
("Zonguldak", "Turkey", "TR", "TRZON", 41.4564, 31.7987, "M"),
("Rize", "Turkey", "TR", "TRRIZ", 41.0201, 40.5234, "S"),
("Giresun", "Turkey", "TR", "TRGIR", 40.9128, 38.3895, "S"),
("Ordu", "Turkey", "TR", "TRORD", 41.0000, 37.8833, "S"),
("Sinop", "Turkey", "TR", "TRSIN", 42.0231, 35.1531, "S"),
("Hopa", "Turkey", "TR", "TRHOP", 41.3933, 41.4086, "S"),
("Bartin", "Turkey", "TR", "TRBAR", 41.6811, 32.3375, "S"),
("Filyos", "Turkey", "TR", "TRFIL", 41.5667, 32.0333, "S"),
("Eregli", "Turkey", "TR", "TRERE", 41.2833, 31.4167, "M"),
("Inebolu", "Turkey", "TR", "TRINE", 41.9775, 33.7614, "S"),
("Unye", "Turkey", "TR", "TRUNY", 41.1333, 37.2833, "S"),
("Fatsa", "Turkey", "TR", "TRFAT", 41.0500, 37.5000, "S"),
("Terme", "Turkey", "TR", "TRTER", 41.2083, 36.9750, "S"),
("Akcakoca", "Turkey", "TR", "TRAKC", 41.0833, 31.1167, "S"),
# Turkey — Sea of Marmara / straits (Black Sea access)
("Istanbul", "Turkey", "TR", "TRIST", 41.0082, 28.9784, "VL"),
("Ambarli", "Turkey", "TR", "TRAMB", 40.9833, 28.6833, "VL"),
("Derince", "Turkey", "TR", "TRDER", 40.7500, 29.8167, "L"),
("Gemlik", "Turkey", "TR", "TRGEM", 40.4333, 29.1667, "M"),
("Bandirma", "Turkey", "TR", "TRBAN", 40.3522, 27.9736, "M"),
("Tekirdag", "Turkey", "TR", "TRTEK", 40.9833, 27.5000, "M"),
# Russia — Black Sea
("Novorossiysk", "Russia", "RU", "RUNVS", 44.7237, 37.7687, "VL"),
("Tuapse", "Russia", "RU", "RUTUA", 44.1007, 39.0710, "M"),
("Taman", "Russia", "RU", "RUTAM", 45.2167, 36.7167, "L"),
("Kavkaz", "Russia", "RU", "RUKAV", 45.3500, 36.6500, "L"),
("Sochi", "Russia", "RU", "RUSOC", 43.5855, 39.7231, "S"),
("Temryuk", "Russia", "RU", "RUTEM", 45.2833, 37.3833, "M"),
("Gelendzhik", "Russia", "RU", "RUGEL", 44.5617, 38.0767, "S"),
("Anapa", "Russia", "RU", "RUANP", 44.8944, 37.3167, "S"),
# Ukraine
("Odessa", "Ukraine", "UA", "UAODS", 46.4843, 30.7326, "VL"),
("Mykolaiv", "Ukraine", "UA", "UAMYK", 46.9750, 31.9946, "L"),
("Kherson", "Ukraine", "UA", "UAKHE", 46.6354, 32.6169, "M"),
("Izmail", "Ukraine", "UA", "UAIZM", 45.3500, 28.8333, "M"),
("Chornomorsk", "Ukraine", "UA", "UACHR", 46.2917, 30.6533, "L"),
("Yuzhny", "Ukraine", "UA", "UAYUZ", 46.6167, 31.0833, "VL"),
("Mariupol", "Ukraine", "UA", "UAMAR", 47.0958, 37.5483, "L"),
("Berdyansk", "Ukraine", "UA", "UABER", 46.7500, 36.8000, "M"),
("Reni", "Ukraine", "UA", "UAREN", 45.4500, 28.2833, "S"),
("Ust-Dunaisk", "Ukraine", "UA", "UAUSD", 45.4333, 29.7500, "S"),
("Kiliya", "Ukraine", "UA", "UAKIL", 45.4500, 29.2667, "S"),
("Skadovsk", "Ukraine", "UA", "UASKA", 46.1167, 32.9167, "S"),
# Romania
("Constanta", "Romania", "RO", "ROCND", 44.1598, 28.6348, "VL"),
("Mangalia", "Romania", "RO", "ROMAN", 43.8000, 28.5833, "M"),
("Galati", "Romania", "RO", "ROGAL", 45.4353, 28.0080, "L"),
("Braila", "Romania", "RO", "ROBRA", 45.2692, 27.9575, "M"),
("Sulina", "Romania", "RO", "ROSUL", 45.1500, 29.6500, "S"),
("Tulcea", "Romania", "RO", "ROTUL", 45.1667, 28.8000, "S"),
("Midia", "Romania", "RO", "ROMID", 44.3167, 28.7000, "M"),
# Bulgaria
("Varna", "Bulgaria", "BG", "BGVAR", 43.2141, 27.9147, "L"),
("Burgas", "Bulgaria", "BG", "BGBOJ", 42.4875, 27.4728, "L"),
("Nesebar", "Bulgaria", "BG", "BGNES", 42.6592, 27.7356, "S"),
("Balchik", "Bulgaria", "BG", "BGBAL", 43.4167, 28.1667, "S"),
# Georgia
("Batumi", "Georgia", "GE", "GEBUS", 41.6168, 41.6367, "L"),
("Poti", "Georgia", "GE", "GEPTI", 42.1500, 41.6667, "L"),
("Supsa", "Georgia", "GE", "GESUP", 42.0000, 41.7833, "M"),
("Kulevi", "Georgia", "GE", "GEKUL", 42.2000, 41.6833, "M"),
("Anaklia", "Georgia", "GE", "GEANA", 42.3833, 41.5833, "S"),
]
for t in bsea:
ports.append(p(*t, region="BSEA") if len(t) == 7 else p(*t))
# ============================================================
# EAST & SOUTHEAST ASIA (~600 ports)
# ============================================================
easia = [
# ---- CHINA (~250 ports) ----
# Major hub ports
("Shanghai", "China", "CN", "CNSHA", 31.2304, 121.4737, "VL"),
("Ningbo-Zhoushan", "China", "CN", "CNNGB", 29.8683, 121.5440, "VL"),
("Shenzhen", "China", "CN", "CNSZX", 22.5431, 114.0579, "VL"),
("Guangzhou", "China", "CN", "CNGZG", 23.1291, 113.2644, "VL"),
("Qingdao", "China", "CN", "CNTAO", 36.0671, 120.3826, "VL"),
("Tianjin", "China", "CN", "CNTSN", 38.9860, 117.7280, "VL"),
("Dalian", "China", "CN", "CNDLC", 38.9140, 121.6147, "VL"),
("Xiamen", "China", "CN", "CNXMN", 24.4798, 118.0894, "VL"),
("Rizhao", "China", "CN", "CNRZH", 35.4164, 119.5269, "L"),
("Yingkou", "China", "CN", "CNYKW", 40.6650, 122.2350, "L"),
("Lianyungang", "China", "CN", "CNLYG", 34.5900, 119.2200, "L"),
("Nanjing", "China", "CN", "CNNKG", 32.0603, 118.7969, "VL"),
("Zhanjiang", "China", "CN", "CNZJG", 21.2707, 110.3594, "L"),
("Yantai", "China", "CN", "CNYNT", 37.4638, 121.4479, "L"),
("Weihai", "China", "CN", "CNWEI", 37.5097, 122.1200, "M"),
("Fuzhou", "China", "CN", "CNFOC", 26.0745, 119.2965, "L"),
("Quanzhou", "China", "CN", "CNQZJ", 24.8741, 118.6757, "L"),
("Wenzhou", "China", "CN", "CNWNZ", 28.0195, 120.6435, "M"),
("Taizhou", "China", "CN", "CNTAZ", 28.6583, 121.4200, "M"),
("Jiaxing", "China", "CN", "CNJXN", 30.7467, 120.7500, "M"),
("Nantong", "China", "CN", "CNNTG", 32.0167, 120.8500, "L"),
("Zhenjiang", "China", "CN", "CNZJG", 32.2044, 119.4550, "M"),
("Changzhou", "China", "CN", "CNCGZ", 31.8100, 119.9700, "M"),
("Huizhou", "China", "CN", "CNHUZ", 22.7872, 114.3960, "M"),
("Dongguan", "China", "CN", "CNDGG", 23.0208, 113.7518, "L"),
("Zhongshan", "China", "CN", "CNZSN", 22.5176, 113.3929, "M"),
("Zhuhai", "China", "CN", "CNZUH", 22.2710, 113.5767, "M"),
("Maoming", "China", "CN", "CNMMG", 21.6618, 110.9178, "M"),
("Beihai", "China", "CN", "CNBHY", 21.4734, 109.1000, "M"),
("Fangchenggang", "China", "CN", "CNFCG", 21.6143, 108.3450, "L"),
("Qinzhou", "China", "CN", "CNQZH", 21.9500, 108.6170, "L"),
("Haikou", "China", "CN", "CNHAK", 20.0174, 110.3492, "L"),
("Sanya", "China", "CN", "CNSYA", 18.2528, 109.5020, "M"),
("Yangpu", "China", "CN", "CNYPU", 19.7000, 109.1333, "L"),
("Dandong", "China", "CN", "CNDDG", 39.9842, 124.3950, "M"),
("Jinzhou", "China", "CN", "CNJZH", 41.1080, 121.1270, "M"),
("Huludao", "China", "CN", "CNHLD", 40.7450, 120.8370, "M"),
("Tangshan", "China", "CN", "CNTGS", 39.3167, 119.1500, "L"),
("Caofeidian", "China", "CN", "CNCFD", 39.2000, 118.5167, "VL"),
("Cangzhou", "China", "CN", "CNCZX", 38.3100, 117.3600, "M"),
("Weifang", "China", "CN", "CNWEF", 36.9000, 119.0500, "M"),
("Binzhou", "China", "CN", "CNBZH", 37.8167, 118.0167, "M"),
("Dongying", "China", "CN", "CNDYG", 37.4614, 118.6747, "M"),
("Longkou", "China", "CN", "CNLKU", 37.6500, 120.3167, "M"),
("Penglai", "China", "CN", "CNPLJ", 37.8167, 120.7500, "S"),
("Laizhou", "China", "CN", "CNLZH", 37.1833, 119.9333, "S"),
("Wuhan", "China", "CN", "CNWUH", 30.5928, 114.3055, "L"),
("Chongqing", "China", "CN", "CNCKG", 29.4316, 106.9123, "L"),
("Yichang", "China", "CN", "CNYCH", 30.7000, 111.2833, "M"),
("Wuhu", "China", "CN", "CNWHU", 31.3346, 118.3622, "M"),
("Anqing", "China", "CN", "CNAQG", 30.5088, 117.0469, "M"),
("Jiujiang", "China", "CN", "CNJIU", 29.7050, 116.0019, "M"),
("Maanshan", "China", "CN", "CNMAS", 31.6700, 118.5100, "M"),
("Tongling", "China", "CN", "CNTOL", 30.9500, 117.8100, "S"),
("Chizhou", "China", "CN", "CNCZH", 30.6600, 117.4900, "S"),
("Taizhou Jiangsu", "China", "CN", "CNTZJ", 32.4500, 119.9200, "M"),
("Yangzhou", "China", "CN", "CNYUZ", 32.3940, 119.4356, "M"),
("Suzhou", "China", "CN", "CNSZV", 31.2990, 120.5853, "L"),
("Jiangyin", "China", "CN", "CNJIY", 31.9200, 120.2630, "L"),
("Zhangjiagang", "China", "CN", "CNZJG", 31.8750, 120.5500, "L"),
("Changshu", "China", "CN", "CNCGS", 31.6500, 120.7500, "M"),
("Taicang", "China", "CN", "CNTCG", 31.4500, 121.1000, "L"),
("Rugao", "China", "CN", "CNRGG", 32.3900, 120.5600, "S"),
("Haimen", "China", "CN", "CNHMN", 31.8700, 121.1500, "S"),
("Jingjiang", "China", "CN", "CNJJG", 32.0167, 120.2667, "M"),
("Shantou", "China", "CN", "CNSTW", 23.3535, 116.6816, "L"),
("Chaozhou", "China", "CN", "CNCZO", 23.6567, 116.6225, "S"),
("Jieyang", "China", "CN", "CNJEY", 23.5500, 116.3667, "S"),
("Shanwei", "China", "CN", "CNSWI", 22.7833, 115.3500, "S"),
("Yangjiang", "China", "CN", "CNYAG", 21.8600, 111.9700, "S"),
("Jiangmen", "China", "CN", "CNJMN", 22.5833, 113.0833, "M"),
("Foshan", "China", "CN", "CNFSH", 23.0292, 113.1056, "M"),
("Nansha", "China", "CN", "CNNSA", 22.7500, 113.6000, "VL"),
("Shekou", "China", "CN", "CNSHK", 22.4833, 113.9167, "VL"),
("Yantian", "China", "CN", "CNYTN", 22.5833, 114.2333, "VL"),
("Chiwan", "China", "CN", "CNCWN", 22.4667, 113.9000, "L"),
("Dachan Bay", "China", "CN", "CNDCB", 22.4167, 113.8167, "L"),
("Putian", "China", "CN", "CNPUT", 25.4333, 119.0167, "M"),
("Ningde", "China", "CN", "CNNDE", 26.6500, 119.5333, "M"),
("Sansha", "China", "CN", "CNSNS", 26.4833, 119.9333, "S"),
("Luoyuan", "China", "CN", "CNLYU", 26.4833, 119.6500, "S"),
("Meizhou Bay", "China", "CN", "CNMZB", 25.1167, 118.9667, "L"),
("Yueyang", "China", "CN", "CNYYX", 29.3775, 113.0933, "M"),
("Changsha", "China", "CN", "CNCSV", 28.1926, 112.9722, "M"),
("Zhoushan", "China", "CN", "CNZOS", 30.0000, 122.1000, "L"),
("Wenling", "China", "CN", "CNWEL", 28.3700, 121.3700, "S"),
("Linhai", "China", "CN", "CNLHI", 28.8500, 121.1200, "S"),
("Yuhuan", "China", "CN", "CNYHU", 28.1333, 121.2333, "S"),
("Haifeng", "China", "CN", "CNHFE", 22.9667, 115.3333, "S"),
("Lufeng", "China", "CN", "CNLUF", 22.9667, 115.6500, "S"),
("Wuzhou", "China", "CN", "CNWUZ", 23.4833, 111.3167, "M"),
("Guigang", "China", "CN", "CNGUG", 23.1000, 109.6000, "M"),
("Nanning", "China", "CN", "CNNNG", 22.8167, 108.3167, "M"),
("Liuzhou", "China", "CN", "CNLZW", 24.3261, 109.4281, "S"),
("Zhaoqing", "China", "CN", "CNZQG", 23.0500, 112.4500, "S"),
("Qingyuan", "China", "CN", "CNQYN", 23.6833, 113.0500, "S"),
("Shaoguan", "China", "CN", "CNSGE", 24.8000, 113.5833, "S"),
("Heyuan", "China", "CN", "CNHEY", 23.7333, 114.6833, "S"),
("Luzhou", "China", "CN", "CNLZV", 28.8717, 105.4425, "M"),
("Yibin", "China", "CN", "CNYBP", 28.7597, 104.6300, "M"),
("Jingzhou", "China", "CN", "CNJGZ", 30.3267, 112.2041, "M"),
("Shashi", "China", "CN", "CNSHA", 30.3000, 112.2500, "S"),
("Huangshi", "China", "CN", "CNHSG", 30.2017, 115.0417, "M"),
("Ezhou", "China", "CN", "CNEZH", 30.3917, 114.8833, "S"),
("Huanggang", "China", "CN", "CNHGG", 30.4500, 114.8833, "S"),
("Xuzhou", "China", "CN", "CNXUZ", 34.2617, 117.1856, "M"),
("Huainan", "China", "CN", "CNHNA", 32.6167, 116.9833, "S"),
("Bengbu", "China", "CN", "CNBBG", 32.9167, 117.3833, "M"),
("Hefei", "China", "CN", "CNHFE", 31.8206, 117.2272, "M"),
("Yueqing", "China", "CN", "CNYUQ", 28.1167, 120.9833, "S"),
("Ruian", "China", "CN", "CNRAN", 27.7833, 120.6500, "S"),
("Cangnan", "China", "CN", "CNCNN", 27.5167, 120.4167, "S"),
("Pingyang", "China", "CN", "CNPYG", 27.6667, 120.5667, "S"),
("Pinghu", "China", "CN", "CNPHU", 30.6833, 121.0167, "S"),
("Haiyan", "China", "CN", "CNHYN", 30.5333, 120.9500, "S"),
("Tongxiang", "China", "CN", "CNTXG", 30.6333, 120.5500, "S"),
("Jiashan", "China", "CN", "CNJSN", 30.8500, 120.9167, "S"),
("Shaoxing", "China", "CN", "CNSHX", 30.0000, 120.5833, "M"),
("Shangyu", "China", "CN", "CNSGY", 30.0167, 120.8500, "S"),
("Cixi", "China", "CN", "CNCXI", 30.1667, 121.2333, "M"),
("Yuyao", "China", "CN", "CNYUY", 30.0333, 121.1500, "S"),
("Fenghua", "China", "CN", "CNFHG", 29.6500, 121.4000, "S"),
("Xiangshan", "China", "CN", "CNXSG", 29.4833, 121.8667, "S"),
("Sanmen", "China", "CN", "CNSMN", 29.1167, 121.4000, "S"),
("Lanshan", "China", "CN", "CNLSN", 35.1167, 119.3167, "M"),
("Shidao", "China", "CN", "CNSDO", 36.8833, 122.4167, "M"),
("Rushan", "China", "CN", "CNRSN", 36.9000, 121.5333, "S"),
("Wendeng", "China", "CN", "CNWDG", 37.1833, 122.0500, "S"),
("Rongcheng", "China", "CN", "CNRCG", 37.1667, 122.4167, "S"),
("Shouguang", "China", "CN", "CNSHG", 36.8833, 118.7500, "S"),
("Laixi", "China", "CN", "CNLXI", 36.8600, 120.5300, "S"),
("Jiaozhou", "China", "CN", "CNJZW", 36.2833, 120.0000, "M"),
("Haiyang", "China", "CN", "CNHYG", 36.7667, 121.1667, "S"),
("Pingtan", "China", "CN", "CNPTN", 25.5000, 119.7833, "M"),
("Zhangzhou", "China", "CN", "CNZZU", 24.5100, 117.6500, "M"),
("Longhai", "China", "CN", "CNLHI", 24.4500, 117.8167, "S"),
("Dongshan", "China", "CN", "CNDOS", 23.7000, 117.5333, "S"),
("Shijiu", "China", "CN", "CNSJU", 24.3667, 117.9667, "S"),
("Gulei", "China", "CN", "CNGUL", 23.8500, 117.6167, "L"),
("Chaoyang", "China", "CN", "CNCYG", 23.2833, 116.5833, "S"),
("Huidong", "China", "CN", "CNHDT", 22.9833, 114.7167, "S"),
("Daya Bay", "China", "CN", "CNDYB", 22.6833, 114.5333, "L"),
("Zhanjiang Port", "China", "CN", "CNZJP", 21.1833, 110.3833, "L"),
("Xuwen", "China", "CN", "CNXWN", 20.3333, 110.1833, "S"),
("Leizhou", "China", "CN", "CNLZR", 20.9167, 110.0667, "S"),
("Dianbai", "China", "CN", "CNDBI", 21.5167, 111.0000, "S"),
("Taishan", "China", "CN", "CNTSH", 22.2500, 112.7833, "S"),
("Enping", "China", "CN", "CNEPG", 22.1833, 112.3167, "S"),
("Kaiping", "China", "CN", "CNKPG", 22.3833, 112.5333, "S"),
("Heshan", "China", "CN", "CNHSN", 22.7667, 112.9667, "S"),
("Sanshui", "China", "CN", "CNSSW", 23.1667, 112.8500, "S"),
("Yingde", "China", "CN", "CNYDE", 24.1833, 113.4000, "S"),
("Basuo", "China", "CN", "CNBSU", 19.0973, 108.6189, "M"),
("Chengmai", "China", "CN", "CNCMI", 19.7500, 109.5833, "S"),
("Wenchang", "China", "CN", "CNWCG", 19.6167, 110.7500, "S"),
("Wanning", "China", "CN", "CNWNG", 18.7833, 110.4000, "S"),
("Lingshui", "China", "CN", "CNLSW", 18.5000, 110.0333, "S"),
("Ledong", "China", "CN", "CNLDO", 18.7333, 108.8333, "S"),
("Changjiang", "China", "CN", "CNCJG", 19.3000, 109.0333, "S"),
("Yantai Port", "China", "CN", "CNYTP", 37.5500, 121.3833, "L"),
("Qingdao Dongjiakou", "China", "CN", "CNDJK", 35.7833, 119.9667, "VL"),
("Bayuquan", "China", "CN", "CNBYQ", 40.2833, 122.1167, "L"),
("Panjin", "China", "CN", "CNPJN", 41.1200, 122.0700, "M"),
("Xingcheng", "China", "CN", "CNXCG", 40.6167, 120.7333, "S"),
("Qinhuangdao", "China", "CN", "CNQHD", 39.9354, 119.5977, "VL"),
("Huanghua", "China", "CN", "CNHHG", 38.3667, 117.3500, "L"),
("Kenli", "China", "CN", "CNKLI", 37.5833, 118.5500, "S"),
("Wudi", "China", "CN", "CNWDI", 37.9167, 117.8500, "S"),
("Zhaoyuan", "China", "CN", "CNZYR", 37.3667, 120.4000, "S"),
("Zhifu", "China", "CN", "CNZFU", 37.5500, 121.4000, "M"),
("Weigang", "China", "CN", "CNWGG", 33.9500, 120.2500, "M"),
("Dafeng", "China", "CN", "CNDFE", 33.2000, 120.4667, "M"),
("Rudong", "China", "CN", "CNRDG", 32.3167, 121.1833, "M"),
("Qidong", "China", "CN", "CNQDG", 31.8167, 121.6500, "M"),
("Luojing", "China", "CN", "CNLJG", 31.4000, 121.4167, "L"),
("Waigaoqiao", "China", "CN", "CNWGQ", 31.3667, 121.5833, "VL"),
("Yangshan", "China", "CN", "CNYSG", 30.6167, 122.0833, "VL"),
# ---- JAPAN (~100 ports) ----
("Tokyo", "Japan", "JP", "JPTYO", 35.6528, 139.8396, "VL"),
("Yokohama", "Japan", "JP", "JPYOK", 35.4437, 139.6380, "VL"),
("Kobe", "Japan", "JP", "JPUKB", 34.6851, 135.1955, "VL"),
("Osaka", "Japan", "JP", "JPOSA", 34.6551, 135.4220, "VL"),
("Nagoya", "Japan", "JP", "JPNGO", 35.0820, 136.8850, "VL"),
("Chiba", "Japan", "JP", "JPCHI", 35.5700, 140.1000, "VL"),
("Kawasaki", "Japan", "JP", "JPKWZ", 35.5107, 139.7350, "L"),
("Kitakyushu", "Japan", "JP", "JPKKJ", 33.9500, 130.9667, "L"),
("Hakata", "Japan", "JP", "JPHKT", 33.6000, 130.4000, "L"),
("Shimizu", "Japan", "JP", "JPSMZ", 35.0167, 138.5000, "M"),
("Mizushima", "Japan", "JP", "JPMZS", 34.5000, 133.7333, "L"),
("Sakai", "Japan", "JP", "JPSKH", 34.5667, 135.4667, "L"),
("Kashima", "Japan", "JP", "JPKSM", 35.9500, 140.7000, "L"),
("Wakayama", "Japan", "JP", "JPWKJ", 34.2167, 135.1500, "M"),
("Tokuyama", "Japan", "JP", "JPTKY", 34.0500, 131.8000, "M"),
("Oita", "Japan", "JP", "JPOIT", 33.2500, 131.6333, "M"),
("Muroran", "Japan", "JP", "JPMUR", 42.3333, 140.9667, "M"),
("Tomakomai", "Japan", "JP", "JPTMK", 42.6333, 141.6333, "L"),
("Niigata", "Japan", "JP", "JPNII", 37.9500, 139.0500, "L"),
("Sendai-Shiogama", "Japan", "JP", "JPSDJ", 38.2667, 141.0167, "L"),
("Akita", "Japan", "JP", "JPAKT", 39.7500, 140.0833, "M"),
("Naoetsu", "Japan", "JP", "JPNAO", 37.1833, 138.2333, "M"),
("Fushiki-Toyama", "Japan", "JP", "JPFSH", 36.7833, 137.0667, "M"),
("Maizuru", "Japan", "JP", "JPMAI", 35.4833, 135.3833, "M"),
("Tsuruga", "Japan", "JP", "JPTRU", 35.6500, 136.0667, "M"),
("Hiroshima", "Japan", "JP", "JPHIJ", 34.3500, 132.4667, "M"),
("Kure", "Japan", "JP", "JPKRE", 34.2333, 132.5667, "M"),
("Imabari", "Japan", "JP", "JPIMB", 34.0667, 133.0167, "M"),
("Matsuyama", "Japan", "JP", "JPMYJ", 33.8500, 132.7833, "M"),
("Takamatsu", "Japan", "JP", "JPTAM", 34.3500, 134.0667, "M"),
("Tokushima", "Japan", "JP", "JPTKS", 34.0667, 134.5667, "M"),
("Kochi", "Japan", "JP", "JPKCZ", 33.5333, 133.5667, "M"),
("Sasebo", "Japan", "JP", "JPSSB", 33.1583, 129.7167, "M"),
("Nagasaki", "Japan", "JP", "JPNGS", 32.7667, 129.8667, "M"),
("Kagoshima", "Japan", "JP", "JPKOJ", 31.5833, 130.5500, "M"),
("Naha", "Japan", "JP", "JPNAH", 26.2167, 127.6667, "M"),
("Yokkaichi", "Japan", "JP", "JPYKK", 34.9667, 136.6333, "L"),
("Kinuura", "Japan", "JP", "JPKNU", 34.7833, 136.9500, "M"),
("Tahara", "Japan", "JP", "JPTAR", 34.6000, 137.1833, "M"),
("Mikawa", "Japan", "JP", "JPMKW", 34.7500, 137.2000, "M"),
("Himeji", "Japan", "JP", "JPHMJ", 34.7833, 134.6500, "M"),
("Matsumoto", "Japan", "JP", "JPMAT", 34.0833, 131.5833, "S"),
("Ube", "Japan", "JP", "JPUBE", 33.9500, 131.2667, "M"),
("Shimonoseki", "Japan", "JP", "JPSMS", 33.9500, 130.9500, "M"),
("Iwakuni", "Japan", "JP", "JPIWK", 34.1667, 132.2167, "S"),
("Onomichi", "Japan", "JP", "JPONO", 34.4000, 133.2000, "M"),
("Fukuyama", "Japan", "JP", "JPFKY", 34.4833, 133.3833, "M"),
("Innoshima", "Japan", "JP", "JPINN", 34.3000, 133.1667, "S"),
("Takehara", "Japan", "JP", "JPTKR", 34.3333, 132.9167, "S"),
("Shibushi", "Japan", "JP", "JPSBH", 31.4833, 131.1000, "M"),
("Hososhima", "Japan", "JP", "JPHSM", 32.4167, 131.6667, "M"),
("Onahama", "Japan", "JP", "JPONH", 36.9333, 140.9167, "M"),
("Hachinohe", "Japan", "JP", "JPHHE", 40.5167, 141.5333, "M"),
("Aomori", "Japan", "JP", "JPAOM", 40.8167, 140.7500, "M"),
("Otaru", "Japan", "JP", "JPOTR", 43.1833, 140.9667, "M"),
("Kushiro", "Japan", "JP", "JPKUS", 42.9667, 144.3833, "M"),
("Rumoi", "Japan", "JP", "JPRMO", 43.9333, 141.6333, "S"),
("Wakkanai", "Japan", "JP", "JPWKN", 45.4000, 141.6833, "S"),
("Ishikari", "Japan", "JP", "JPISK", 43.2500, 141.3167, "M"),
("Abashiri", "Japan", "JP", "JPABS", 44.0167, 144.2833, "S"),
("Nemuro", "Japan", "JP", "JPNEM", 43.3333, 145.5833, "S"),
("Sakata", "Japan", "JP", "JPSKT", 38.9167, 139.8500, "M"),
("Noshiro", "Japan", "JP", "JPNSR", 40.2000, 140.0167, "S"),
("Ishinomaki", "Japan", "JP", "JPISM", 38.4333, 141.3000, "M"),
("Soma", "Japan", "JP", "JPSMA", 37.8333, 140.9667, "S"),
("Hitachi", "Japan", "JP", "JPHIT", 36.5667, 140.6500, "M"),
("Kisarazu", "Japan", "JP", "JPKSZ", 35.3833, 139.9167, "M"),
("Tateyama", "Japan", "JP", "JPTTY", 34.9833, 139.8667, "S"),
("Shimoda", "Japan", "JP", "JPSMX", 34.6667, 138.9500, "S"),
("Tagonoura", "Japan", "JP", "JPTAG", 35.1167, 138.6833, "M"),
("Numazu", "Japan", "JP", "JPNMZ", 35.1000, 138.8667, "S"),
("Owase", "Japan", "JP", "JPOWS", 34.0667, 136.2167, "S"),
("Toba", "Japan", "JP", "JPTOB", 34.4833, 136.8500, "S"),
("Tsukumi", "Japan", "JP", "JPTSU", 33.0667, 131.8667, "S"),
("Usuki", "Japan", "JP", "JPUSK", 33.1167, 131.8000, "S"),
("Miike", "Japan", "JP", "JPMII", 33.0333, 130.4167, "M"),
("Misumi", "Japan", "JP", "JPMIS", 32.6167, 130.4500, "S"),
("Yatsushiro", "Japan", "JP", "JPYAT", 32.5000, 130.6000, "S"),
("Aburatsu", "Japan", "JP", "JPABR", 31.5833, 131.4167, "M"),
("Naze", "Japan", "JP", "JPNZE", 28.3833, 129.5000, "S"),
("Ishigaki", "Japan", "JP", "JPISG", 24.3333, 124.1500, "S"),
("Miyako", "Japan", "JP", "JPMYK", 39.6333, 141.9667, "S"),
("Kamaishi", "Japan", "JP", "JPKMS", 39.2833, 141.8833, "M"),
("Ofunato", "Japan", "JP", "JPOFN", 39.0667, 141.7167, "S"),
("Kesennuma", "Japan", "JP", "JPKSN", 38.9000, 141.5667, "S"),
("Kanazawa", "Japan", "JP", "JPKNZ", 36.6167, 136.6333, "M"),
("Nanao", "Japan", "JP", "JPNNA", 37.0500, 136.9667, "S"),
("Sakai Port", "Japan", "JP", "JPSKP", 36.1333, 135.8500, "S"),
("Hamada", "Japan", "JP", "JPHAM", 34.9000, 132.0833, "S"),
("Sakaiminato", "Japan", "JP", "JPSMN", 35.5500, 133.2333, "M"),
# ---- SOUTH KOREA (~50 ports) ----
("Busan", "South Korea", "KR", "KRPUS", 35.1028, 129.0403, "VL"),
("Incheon", "South Korea", "KR", "KRICN", 37.4563, 126.7052, "VL"),
("Ulsan", "South Korea", "KR", "KRUSN", 35.5384, 129.3114, "VL"),
("Gwangyang", "South Korea", "KR", "KRKWN", 34.9167, 127.7000, "VL"),
("Pyeongtaek", "South Korea", "KR", "KRPTK", 36.9667, 126.8333, "L"),
("Masan", "South Korea", "KR", "KRMSN", 35.1833, 128.5667, "L"),
("Mokpo", "South Korea", "KR", "KRMOK", 34.7833, 126.3833, "M"),
("Gunsan", "South Korea", "KR", "KRKSN", 35.9833, 126.7167, "M"),
("Donghae", "South Korea", "KR", "KRDHE", 37.5000, 129.1167, "M"),
("Pohang", "South Korea", "KR", "KRPHN", 36.0333, 129.3667, "L"),
("Yeosu", "South Korea", "KR", "KRYOS", 34.7500, 127.7500, "L"),
("Daesan", "South Korea", "KR", "KRDAS", 36.9500, 126.3500, "L"),
("Jeju", "South Korea", "KR", "KRJEJ", 33.5167, 126.5333, "M"),
("Samcheonpo", "South Korea", "KR", "KRSCP", 34.9333, 128.0667, "S"),
("Tongyeong", "South Korea", "KR", "KRTYG", 34.8333, 128.4167, "S"),
("Jinhae", "South Korea", "KR", "KRJHE", 35.1500, 128.6833, "M"),
("Sokcho", "South Korea", "KR", "KRSHO", 38.2000, 128.5833, "S"),
("Samcheok", "South Korea", "KR", "KRSCK", 37.4500, 129.1667, "S"),
("Mukho", "South Korea", "KR", "KRMKH", 37.5500, 129.1167, "M"),
("Okpo", "South Korea", "KR", "KROKP", 34.6167, 128.7167, "M"),
("Geoje", "South Korea", "KR", "KRGOJ", 34.8833, 128.6833, "M"),
("Taean", "South Korea", "KR", "KRTAN", 36.7333, 126.2833, "M"),
("Boryeong", "South Korea", "KR", "KRBOR", 36.3333, 126.5000, "S"),
("Wando", "South Korea", "KR", "KRWND", 34.3167, 126.7500, "S"),
("Yongan", "South Korea", "KR", "KRYON", 34.7667, 127.6000, "S"),
("Jangheung", "South Korea", "KR", "KRJHG", 34.6833, 126.9167, "S"),
("Seogwipo", "South Korea", "KR", "KRSOG", 33.2500, 126.5500, "S"),
("Onsan", "South Korea", "KR", "KRONX", 35.4333, 129.3667, "L"),
("Dangjin", "South Korea", "KR", "KRDJN", 36.8833, 126.6333, "M"),
("Hadong", "South Korea", "KR", "KRHDG", 35.0500, 127.7833, "S"),
("Sacheon", "South Korea", "KR", "KRSAE", 35.0000, 128.1000, "S"),
("Goheung", "South Korea", "KR", "KRGHG", 34.6000, 127.2833, "S"),
("Janghang", "South Korea", "KR", "KRJHP", 36.0167, 126.6833, "S"),
("Buan", "South Korea", "KR", "KRBUA", 35.7333, 126.7167, "S"),
("Seocheon", "South Korea", "KR", "KRSEO", 36.0667, 126.7000, "S"),
("Heungnam", "South Korea", "KR", "KRHNG", 39.8333, 127.6167, "S"),
("Goseong", "South Korea", "KR", "KRGSG", 34.9667, 128.3167, "S"),
("Jangseungpo", "South Korea", "KR", "KRJSP", 34.8500, 128.7000, "S"),
# ---- TAIWAN (~25 ports) ----
("Kaohsiung", "Taiwan", "TW", "TWKHH", 22.6146, 120.2975, "VL"),
("Keelung", "Taiwan", "TW", "TWKEL", 25.1333, 121.7500, "VL"),
("Taichung", "Taiwan", "TW", "TWTXG", 24.2833, 120.5167, "L"),
("Hualien", "Taiwan", "TW", "TWHUA", 23.9833, 121.6167, "M"),
("Taipei Port", "Taiwan", "TW", "TWTPE", 25.1667, 121.4000, "L"),
("Mailiao", "Taiwan", "TW", "TWMLI", 23.7833, 120.1833, "L"),
("Suao", "Taiwan", "TW", "TWSUO", 24.5833, 121.8667, "M"),
("Anping", "Taiwan", "TW", "TWANP", 22.9833, 120.1500, "M"),
("Taitung", "Taiwan", "TW", "TWTTT", 22.7500, 121.1500, "S"),
("Penghu", "Taiwan", "TW", "TWMZG", 23.5667, 119.5667, "S"),
("Kinmen", "Taiwan", "TW", "TWKNM", 24.4500, 118.3833, "S"),
("Hsinchu", "Taiwan", "TW", "TWHSC", 24.8500, 120.9167, "M"),
("Tainan", "Taiwan", "TW", "TWTNN", 23.0000, 120.1667, "M"),
("Budai", "Taiwan", "TW", "TWBUD", 23.3833, 120.1667, "S"),
("Donggang", "Taiwan", "TW", "TWDGN", 22.4667, 120.4333, "S"),
("Longde", "Taiwan", "TW", "TWLGD", 22.5833, 120.3833, "S"),
("Houbihu", "Taiwan", "TW", "TWHBH", 21.9500, 120.7500, "S"),
("Shalu", "Taiwan", "TW", "TWSHL", 24.2500, 120.5333, "S"),
("Wuqi", "Taiwan", "TW", "TWWQI", 24.2833, 120.5000, "M"),
("Shenao", "Taiwan", "TW", "TWSAO", 25.1167, 121.8167, "S"),
("Daan", "Taiwan", "TW", "TWDAN", 24.3667, 120.5833, "S"),
# ---- VIETNAM (~30 ports) ----
("Ho Chi Minh City", "Vietnam", "VN", "VNSGN", 10.7626, 106.6602, "VL"),
("Cat Lai", "Vietnam", "VN", "VNCLI", 10.7500, 106.7500, "VL"),
("Hai Phong", "Vietnam", "VN", "VNHPH", 20.8449, 106.6881, "VL"),
("Da Nang", "Vietnam", "VN", "VNDAD", 16.0678, 108.2208, "L"),
("Vung Tau", "Vietnam", "VN", "VNVUT", 10.3500, 107.0833, "L"),
("Quy Nhon", "Vietnam", "VN", "VNQUI", 13.7622, 109.2333, "M"),
("Nha Trang", "Vietnam", "VN", "VNNHA", 12.2388, 109.1967, "M"),
("Cam Ranh", "Vietnam", "VN", "VNCRA", 11.9167, 109.1500, "M"),
("Can Tho", "Vietnam", "VN", "VNCTH", 10.0452, 105.7469, "M"),
("Long An", "Vietnam", "VN", "VNLAN", 10.5333, 106.4167, "M"),
("Phu My", "Vietnam", "VN", "VNPMY", 10.5500, 107.0167, "L"),
("Cai Mep", "Vietnam", "VN", "VNCMT", 10.5167, 107.0333, "VL"),
("Nghi Son", "Vietnam", "VN", "VNNGS", 19.3167, 105.8500, "M"),
("Chan May", "Vietnam", "VN", "VNCMY", 16.3333, 108.0167, "M"),
("Dung Quat", "Vietnam", "VN", "VNDQT", 15.4167, 108.7833, "L"),
("Vinh", "Vietnam", "VN", "VNVIN", 18.6667, 105.6833, "S"),
("Hon La", "Vietnam", "VN", "VNHLA", 17.8833, 106.5500, "S"),
("Sa Dec", "Vietnam", "VN", "VNSDC", 10.2900, 105.7500, "S"),
("My Tho", "Vietnam", "VN", "VNMTH", 10.3500, 106.3500, "S"),
("Ben Tre", "Vietnam", "VN", "VNBTR", 10.2333, 106.3833, "S"),
("Tra Vinh", "Vietnam", "VN", "VNTVI", 9.9333, 106.3500, "S"),
("Soc Trang", "Vietnam", "VN", "VNSOT", 9.6000, 105.9833, "S"),
("Ca Mau", "Vietnam", "VN", "VNCAM", 9.1833, 105.1500, "S"),
("Rach Gia", "Vietnam", "VN", "VNRGA", 10.0000, 105.0833, "S"),
("Ha Tinh", "Vietnam", "VN", "VNHTI", 18.3333, 105.9167, "S"),
("Lach Huyen", "Vietnam", "VN", "VNLHY", 20.7000, 106.8000, "VL"),
("Dinh Vu", "Vietnam", "VN", "VNDVU", 20.8167, 106.8000, "L"),
("Nam Dinh", "Vietnam", "VN", "VNNDI", 20.4333, 106.1667, "S"),
("Thai Binh", "Vietnam", "VN", "VNTBI", 20.4500, 106.3333, "S"),
("Quang Ninh", "Vietnam", "VN", "VNQNI", 21.0000, 107.0500, "M"),
("Cua Lo", "Vietnam", "VN", "VNCLO", 18.8000, 105.7167, "S"),
# ---- THAILAND (~25 ports) ----
("Laem Chabang", "Thailand", "TH", "THLCH", 13.0833, 100.8833, "VL"),
("Bangkok", "Thailand", "TH", "THBKK", 13.7000, 100.5167, "VL"),
("Map Ta Phut", "Thailand", "TH", "THMTP", 12.7167, 101.1500, "L"),
("Songkhla", "Thailand", "TH", "THSGZ", 7.2000, 100.6000, "M"),
("Sattahip", "Thailand", "TH", "THSTH", 12.6667, 100.9000, "L"),
("Phuket", "Thailand", "TH", "THHKT", 7.8167, 98.3833, "M"),
("Ranong", "Thailand", "TH", "THRNG", 9.9667, 98.6333, "S"),
("Surat Thani", "Thailand", "TH", "THURT", 9.1500, 99.3333, "M"),
("Koh Sichang", "Thailand", "TH", "THKSI", 13.1500, 100.8167, "M"),
("Sriracha", "Thailand", "TH", "THSRI", 13.1667, 100.9333, "L"),
("Samut Prakan", "Thailand", "TH", "THSMP", 13.5833, 100.5833, "M"),
("Samut Sakhon", "Thailand", "TH", "THSMK", 13.5333, 100.2833, "M"),
("Chumphon", "Thailand", "TH", "THCPN", 10.5000, 99.1833, "S"),
("Nakhon Si Thammarat", "Thailand", "TH", "THNST", 8.4000, 100.0667, "S"),
("Krabi", "Thailand", "TH", "THKBI", 8.0667, 98.9167, "S"),
("Trang", "Thailand", "TH", "THTSG", 7.5667, 99.6167, "S"),
("Prachuap Khiri Khan", "Thailand", "TH", "THPKK", 11.8167, 99.7833, "S"),
("Hua Hin", "Thailand", "TH", "THHHN", 12.5667, 99.9667, "S"),
("Chanthaburi", "Thailand", "TH", "THCTI", 12.6000, 102.1167, "S"),
("Trat", "Thailand", "TH", "THTRT", 12.2333, 102.5167, "S"),
("Ko Samui", "Thailand", "TH", "THUSM", 9.5167, 100.0500, "S"),
("Pattani", "Thailand", "TH", "THPAT", 6.8667, 101.2500, "S"),
("Narathiwat", "Thailand", "TH", "THNAR", 6.4333, 101.8167, "S"),
("Kantang", "Thailand", "TH", "THKTG", 7.4000, 99.5167, "S"),
("Satun", "Thailand", "TH", "THSTN", 6.6167, 100.0667, "S"),
# ---- PHILIPPINES (~30 ports) ----
("Manila", "Philippines", "PH", "PHMNL", 14.5833, 120.9667, "VL"),
("Cebu", "Philippines", "PH", "PHCEB", 10.3157, 123.8854, "L"),
("Davao", "Philippines", "PH", "PHDVO", 7.0731, 125.6128, "L"),
("Subic Bay", "Philippines", "PH", "PHSFS", 14.8000, 120.2833, "L"),
("Batangas", "Philippines", "PH", "PHBTG", 13.7500, 121.0667, "L"),
("General Santos", "Philippines", "PH", "PHGSA", 6.1167, 125.1667, "M"),
("Cagayan de Oro", "Philippines", "PH", "PHCGY", 8.4833, 124.6500, "M"),
("Iloilo", "Philippines", "PH", "PHILO", 10.6833, 122.5667, "M"),
("Zamboanga", "Philippines", "PH", "PHZAM", 6.9042, 122.0761, "M"),
("Bacolod", "Philippines", "PH", "PHBCD", 10.6833, 122.9333, "M"),
("Tacloban", "Philippines", "PH", "PHTAC", 11.2500, 124.9667, "M"),
("Ozamiz", "Philippines", "PH", "PHOZC", 8.1500, 123.8500, "S"),
("Surigao", "Philippines", "PH", "PHSUG", 9.7833, 125.5000, "S"),
("Cotabato", "Philippines", "PH", "PHCBO", 7.2167, 124.2500, "S"),
("San Fernando La Union", "Philippines", "PH", "PHSFE", 16.6167, 120.3167, "S"),
("Legazpi", "Philippines", "PH", "PHLGP", 13.1500, 123.7500, "S"),
("Puerto Princesa", "Philippines", "PH", "PHPPS", 9.7500, 118.7333, "M"),
("Mariveles", "Philippines", "PH", "PHMAR", 14.4333, 120.4833, "M"),
("Limay", "Philippines", "PH", "PHLIM", 14.5667, 120.6000, "S"),
("Nasipit", "Philippines", "PH", "PHNAS", 8.9667, 125.5333, "S"),
("Tagbilaran", "Philippines", "PH", "PHTAG", 9.6500, 123.8500, "S"),
("Dumaguete", "Philippines", "PH", "PHDGT", 9.3167, 123.3000, "S"),
("Ormoc", "Philippines", "PH", "PHORC", 11.0500, 124.6000, "S"),
("Butuan", "Philippines", "PH", "PHBXU", 8.9500, 125.5333, "S"),
("Polloc", "Philippines", "PH", "PHPOL", 7.3333, 124.2000, "S"),
("Iligan", "Philippines", "PH", "PHIGN", 8.2333, 124.2333, "M"),
("Isabela", "Philippines", "PH", "PHISL", 6.7000, 121.9667, "S"),
("Dipolog", "Philippines", "PH", "PHDPL", 8.5833, 123.3333, "S"),
("Pagadian", "Philippines", "PH", "PHPAG", 7.8333, 123.4333, "S"),
("Jolo", "Philippines", "PH", "PHJOL", 6.0500, 121.0000, "S"),
# ---- MALAYSIA (~25 ports) ----
("Port Klang", "Malaysia", "MY", "MYPKG", 3.0000, 101.3833, "VL"),
("Tanjung Pelepas", "Malaysia", "MY", "MYTPP", 1.3667, 103.5500, "VL"),
("Penang", "Malaysia", "MY", "MYPEN", 5.4167, 100.3500, "L"),
("Kuantan", "Malaysia", "MY", "MYKUA", 3.9667, 103.4333, "M"),
("Johor", "Malaysia", "MY", "MYJHB", 1.4667, 103.7833, "L"),
("Bintulu", "Malaysia", "MY", "MYBTU", 3.1667, 113.0333, "L"),
("Kota Kinabalu", "Malaysia", "MY", "MYBKI", 5.9833, 116.0667, "M"),
("Sandakan", "Malaysia", "MY", "MYSDK", 5.8333, 118.1000, "M"),
("Tawau", "Malaysia", "MY", "MYTWU", 4.2500, 117.8833, "M"),
("Kuching", "Malaysia", "MY", "MYKCH", 1.5500, 110.3500, "M"),
("Sibu", "Malaysia", "MY", "MYSBW", 2.3000, 111.8333, "M"),
("Miri", "Malaysia", "MY", "MYMYY", 4.3833, 114.0000, "M"),
("Kemaman", "Malaysia", "MY", "MYKEM", 4.2333, 103.4333, "M"),
("Labuan", "Malaysia", "MY", "MYLBU", 5.3000, 115.2333, "M"),
("Langkawi", "Malaysia", "MY", "MYLGK", 6.3333, 99.8333, "S"),
("Lumut", "Malaysia", "MY", "MYLUM", 4.2333, 100.6167, "M"),
("Teluk Ramunia", "Malaysia", "MY", "MYTLR", 1.3500, 104.2500, "L"),
("Tanjung Kidurong", "Malaysia", "MY", "MYTKD", 3.2167, 113.0500, "M"),
("Sepanggar Bay", "Malaysia", "MY", "MYSPB", 6.0500, 116.0500, "M"),
("Pasir Gudang", "Malaysia", "MY", "MYPGU", 1.4500, 103.9167, "L"),
("Malacca", "Malaysia", "MY", "MYMKZ", 2.1833, 102.2500, "M"),
("Rajang", "Malaysia", "MY", "MYRAJ", 2.1333, 111.1667, "S"),
("Lahad Datu", "Malaysia", "MY", "MYLDU", 5.0167, 118.3167, "S"),
("Kudat", "Malaysia", "MY", "MYKUD", 6.8833, 116.8500, "S"),
("Mukah", "Malaysia", "MY", "MYMKM", 2.9000, 112.1000, "S"),
# ---- INDONESIA (~50 ports) ----
("Tanjung Priok", "Indonesia", "ID", "IDTPP", -6.1000, 106.8833, "VL"),
("Tanjung Perak", "Indonesia", "ID", "IDSUB", -7.2167, 112.7333, "VL"),
("Belawan", "Indonesia", "ID", "IDBLW", 3.7833, 98.6833, "VL"),
("Makassar", "Indonesia", "ID", "IDUPG", -5.1167, 119.4167, "L"),
("Balikpapan", "Indonesia", "ID", "IDBPN", -1.2667, 116.8000, "L"),
("Semarang", "Indonesia", "ID", "IDSRG", -6.9667, 110.4167, "L"),
("Banjarmasin", "Indonesia", "ID", "IDBDJ", -3.3167, 114.5833, "L"),
("Palembang", "Indonesia", "ID", "IDPLM", -2.9833, 104.7500, "L"),
("Dumai", "Indonesia", "ID", "IDDUI", 1.6833, 101.4500, "L"),
("Cilacap", "Indonesia", "ID", "IDCXP", -7.7333, 109.0167, "M"),
("Pontianak", "Indonesia", "ID", "IDPTK", -0.0167, 109.3333, "M"),
("Samarinda", "Indonesia", "ID", "IDSRI", -0.5000, 117.1500, "M"),
("Jayapura", "Indonesia", "ID", "IDDJJ", -2.5333, 140.7167, "M"),
("Sorong", "Indonesia", "ID", "IDSRN", -0.8833, 131.2500, "M"),
("Ambon", "Indonesia", "ID", "IDAMQ", -3.6833, 128.1833, "M"),
("Manado", "Indonesia", "ID", "IDMDO", 1.4833, 124.8500, "M"),
("Bitung", "Indonesia", "ID", "IDBIT", 1.4333, 125.2000, "M"),
("Kupang", "Indonesia", "ID", "IDKOE", -10.1667, 123.5833, "M"),
("Padang", "Indonesia", "ID", "IDPDG", -1.0000, 100.3500, "M"),
("Bengkulu", "Indonesia", "ID", "IDBKS", -3.7833, 102.2500, "S"),
("Jambi", "Indonesia", "ID", "IDJMB", -1.5833, 103.6333, "M"),
("Pekanbaru", "Indonesia", "ID", "IDPKU", 1.4833, 102.1333, "M"),
("Lhokseumawe", "Indonesia", "ID", "IDLSW", 5.1833, 97.1500, "M"),
("Banda Aceh", "Indonesia", "ID", "IDBTH", 5.5500, 95.3167, "M"),
("Merak", "Indonesia", "ID", "IDMRK", -5.9333, 106.0000, "M"),
("Cigading", "Indonesia", "ID", "IDCIG", -6.0167, 106.0500, "L"),
("Ciwandan", "Indonesia", "ID", "IDCWD", -6.0000, 106.0333, "M"),
("Gresik", "Indonesia", "ID", "IDGRK", -7.1667, 112.6500, "M"),
("Probolinggo", "Indonesia", "ID", "IDPBL", -7.7500, 113.2167, "M"),
("Tuban", "Indonesia", "ID", "IDTBN", -6.9000, 112.0500, "M"),
("Cirebon", "Indonesia", "ID", "IDCBN", -6.7333, 108.5500, "M"),
("Tegal", "Indonesia", "ID", "IDTGL", -6.8667, 109.1333, "S"),
("Pekalongan", "Indonesia", "ID", "IDPKL", -6.8833, 109.6833, "S"),
("Jepara", "Indonesia", "ID", "IDJPR", -6.5833, 110.6667, "S"),
("Surabaya", "Indonesia", "ID", "IDSUB", -7.2500, 112.7500, "VL"),
("Bontang", "Indonesia", "ID", "IDBXT", 0.1167, 117.4833, "M"),
("Tarakan", "Indonesia", "ID", "IDTRK", 3.3000, 117.6333, "M"),
("Nunukan", "Indonesia", "ID", "IDNNK", 4.1167, 117.6667, "S"),
("Gorontalo", "Indonesia", "ID", "IDGTO", 0.5333, 123.0500, "S"),
("Ternate", "Indonesia", "ID", "IDTTE", 0.7833, 127.3833, "S"),
("Kendari", "Indonesia", "ID", "IDKDI", -3.9667, 122.6000, "M"),
("Baubau", "Indonesia", "ID", "IDBAU", -5.4667, 122.6167, "S"),
("Maumere", "Indonesia", "ID", "IDMOF", -8.6167, 122.2333, "S"),
("Ende", "Indonesia", "ID", "IDENK", -8.8500, 121.6500, "S"),
("Waingapu", "Indonesia", "ID", "IDWGP", -9.6500, 120.2667, "S"),
("Fakfak", "Indonesia", "ID", "IDFKQ", -2.9167, 132.3000, "S"),
("Merauke", "Indonesia", "ID", "IDMKQ", -8.4667, 140.3833, "S"),
("Tanjung Intan", "Indonesia", "ID", "IDTIN", -7.7500, 109.0000, "M"),
("Benoa", "Indonesia", "ID", "IDBNO", -8.7500, 115.2167, "M"),
("Lembar", "Indonesia", "ID", "IDLEM", -8.7333, 116.0667, "M"),
# ---- SINGAPORE ----
("Singapore", "Singapore", "SG", "SGSIN", 1.2646, 103.8223, "VL"),
("Jurong", "Singapore", "SG", "SGJUR", 1.3100, 103.7100, "L"),
# ---- MYANMAR (~10 ports) ----
("Yangon", "Myanmar", "MM", "MMRGN", 16.8661, 96.1951, "L"),
("Thilawa", "Myanmar", "MM", "MMTHL", 16.6833, 96.2500, "L"),
("Sittwe", "Myanmar", "MM", "MMSTW", 20.1500, 92.9000, "M"),
("Pathein", "Myanmar", "MM", "MMPAT", 16.7833, 94.7333, "M"),
("Mawlamyine", "Myanmar", "MM", "MMMMU", 16.4833, 97.6167, "M"),
("Dawei", "Myanmar", "MM", "MMDWE", 14.0833, 98.2000, "M"),
("Myeik", "Myanmar", "MM", "MMMEK", 12.4333, 98.6000, "S"),
("Kawthoung", "Myanmar", "MM", "MMKTW", 10.0167, 98.5500, "S"),
("Kyaukphyu", "Myanmar", "MM", "MMKPW", 19.4167, 93.5333, "M"),
("Bhamo", "Myanmar", "MM", "MMBMO", 24.2500, 97.2333, "S"),
# ---- CAMBODIA (~5 ports) ----
("Sihanoukville", "Cambodia", "KH", "KHSHV", 10.6333, 103.5167, "M"),
("Phnom Penh", "Cambodia", "KH", "KHPNH", 11.5449, 104.8922, "M"),
("Kampot", "Cambodia", "KH", "KHKMT", 10.6167, 104.1833, "S"),
("Koh Kong", "Cambodia", "KH", "KHKOK", 11.6167, 102.9833, "S"),
("Stung Treng", "Cambodia", "KH", "KHSTR", 13.5167, 106.0167, "S"),
# ---- BRUNEI (~3 ports) ----
("Muara", "Brunei", "BN", "BNMUA", 5.0167, 115.0667, "M"),
("Seria", "Brunei", "BN", "BNSER", 4.6167, 114.3167, "S"),
("Kuala Belait", "Brunei", "BN", "BNKUB", 4.5833, 114.1833, "S"),
# ---- ADDITIONAL CHINA PORTS ----
("Taixing", "China", "CN", "CNTXN", 32.1667, 120.0167, "S"),
("Rugao Port", "China", "CN", "CNRGP", 32.3833, 120.5500, "S"),
("Dongfang", "China", "CN", "CNDFG", 19.1000, 108.6500, "M"),
("Lingao", "China", "CN", "CNLGA", 19.9000, 109.6833, "S"),
("Danzhou", "China", "CN", "CNDZO", 19.5167, 109.5833, "S"),
("Qionghai", "China", "CN", "CNQHJ", 19.2333, 110.4667, "S"),
("Shangtou", "China", "CN", "CNSTO", 23.3667, 116.6833, "S"),
("Haicang", "China", "CN", "CNHCG", 24.4833, 118.0333, "L"),
("Songxia", "China", "CN", "CNSXA", 24.3333, 117.9500, "S"),
("Gulang", "China", "CN", "CNGLG", 24.4500, 118.0667, "S"),
("Jiangdu", "China", "CN", "CNJDU", 32.4333, 119.5333, "S"),
("Haian", "China", "CN", "CNHAN", 32.5667, 120.4500, "S"),
("Dongtai", "China", "CN", "CNDTJ", 32.8667, 120.3167, "S"),
("Sheyang", "China", "CN", "CNSYG", 33.7667, 120.2500, "S"),
("Xiangshui", "China", "CN", "CNXSH", 34.2000, 119.8833, "S"),
("Guanyun", "China", "CN", "CNGYN", 34.7333, 119.2500, "S"),
("Ganyu", "China", "CN", "CNGYU", 34.8333, 119.1333, "S"),
("Haizhou", "China", "CN", "CNHZW", 34.5833, 119.1500, "S"),
("Langya", "China", "CN", "CNLYA", 35.1000, 119.2833, "S"),
("Jimo", "China", "CN", "CNJMO", 36.3833, 120.4500, "S"),
("Laoshan", "China", "CN", "CNLSH", 36.1667, 120.6500, "S"),
("Gaomi", "China", "CN", "CNGMI", 36.3833, 119.7500, "S"),
("Zhucheng", "China", "CN", "CNZCG", 36.0000, 119.3833, "S"),
("Rongcheng Port", "China", "CN", "CNRCP", 37.1833, 122.4500, "S"),
("Zhaodong", "China", "CN", "CNZDO", 37.0167, 122.5000, "S"),
("Shijiusuo", "China", "CN", "CNSJS", 35.3833, 119.5333, "L"),
("Lanshan Port", "China", "CN", "CNLSP", 35.0833, 119.3500, "M"),
("Zhongjieshan", "China", "CN", "CNZJS", 30.0333, 122.3667, "S"),
("Dinghai", "China", "CN", "CNDHI", 30.0333, 122.1167, "M"),
("Shenjiamen", "China", "CN", "CNSJM", 29.9500, 122.3000, "M"),
("Luhuashan", "China", "CN", "CNLHS", 30.6667, 122.1833, "S"),
("Xiushan", "China", "CN", "CNXSN", 30.0833, 122.2167, "S"),
("Liuheng", "China", "CN", "CNLHG", 29.7833, 122.1500, "S"),
("Jintang", "China", "CN", "CNJTN", 30.0167, 121.9333, "S"),
("Cezi", "China", "CN", "CNCZI", 29.8500, 122.2833, "S"),
("Shengsi", "China", "CN", "CNSSI", 30.7167, 122.4500, "S"),
("Qushan", "China", "CN", "CNQSN", 30.7167, 122.4667, "S"),
("Beilun", "China", "CN", "CNBLN", 29.9667, 121.8667, "VL"),
("Chuanshan", "China", "CN", "CNCHS", 29.7833, 121.8500, "VL"),
("Daxie", "China", "CN", "CNDXI", 29.9333, 121.9333, "L"),
("Meishan", "China", "CN", "CNMSN", 29.8000, 121.9167, "VL"),
("Zhenhai", "China", "CN", "CNZHI", 29.9500, 121.7167, "L"),
("Yongjiang", "China", "CN", "CNYJI", 29.8667, 121.6500, "M"),
("Daishan", "China", "CN", "CNDSA", 30.2500, 122.2000, "S"),
# ---- ADDITIONAL JAPAN PORTS ----
("Mikawa Port", "Japan", "JP", "JPMKP", 34.7833, 137.2167, "M"),
("Komatsushima", "Japan", "JP", "JPKMT", 34.0000, 134.5833, "M"),
("Sakaide", "Japan", "JP", "JPSKD", 34.3333, 133.8500, "M"),
("Marugame", "Japan", "JP", "JPMRG", 34.3000, 133.8000, "S"),
("Nihama", "Japan", "JP", "JPNHM", 33.9500, 133.2833, "M"),
("Uwajima", "Japan", "JP", "JPUWJ", 33.2167, 132.5667, "S"),
("Yawatahama", "Japan", "JP", "JPYWH", 33.4667, 132.4167, "S"),
("Omaezaki", "Japan", "JP", "JPOMZ", 34.6000, 138.2167, "M"),
("Gamagori", "Japan", "JP", "JPGMG", 34.8167, 137.2333, "S"),
("Toyohashi", "Japan", "JP", "JPTYH", 34.7667, 137.3833, "M"),
("Shimotsu", "Japan", "JP", "JPSMT", 34.1333, 135.1333, "M"),
("Gobo", "Japan", "JP", "JPGBO", 33.9000, 135.1500, "S"),
("Tanabe", "Japan", "JP", "JPTNB", 33.7333, 135.3833, "S"),
("Shingu", "Japan", "JP", "JPSGN", 33.7167, 135.9833, "S"),
# ---- ADDITIONAL SOUTH KOREA PORTS ----
("Changwon", "South Korea", "KR", "KRCWN", 35.2167, 128.6833, "M"),
("Yeongam", "South Korea", "KR", "KRYAM", 34.7500, 126.4333, "S"),
("Haenam", "South Korea", "KR", "KRHAE", 34.5667, 126.5833, "S"),
("Gimpo", "South Korea", "KR", "KRGMP", 37.5833, 126.7167, "S"),
("Hwaseong", "South Korea", "KR", "KRHWS", 37.2000, 126.8167, "S"),
# ---- ADDITIONAL INDONESIA PORTS ----
("Tanjung Emas", "Indonesia", "ID", "IDTES", -6.9500, 110.4167, "L"),
("Panjang", "Indonesia", "ID", "IDPJG", -5.4667, 105.3167, "M"),
("Teluk Bayur", "Indonesia", "ID", "IDTBY", -1.0167, 100.3500, "L"),
("Sibolga", "Indonesia", "ID", "IDSBO", 1.7333, 98.7833, "M"),
("Tanjung Balai Asahan", "Indonesia", "ID", "IDTBA", 2.9667, 99.8000, "M"),
("Tanjung Balai Karimun", "Indonesia", "ID", "IDTBK", 1.0500, 103.4167, "M"),
("Batam", "Indonesia", "ID", "IDBTM", 1.0667, 104.0167, "L"),
("Tanjung Pinang", "Indonesia", "ID", "IDTNP", 0.9167, 104.4500, "M"),
("Pangkal Balam", "Indonesia", "ID", "IDPKB", -2.1000, 106.1333, "M"),
("Muntok", "Indonesia", "ID", "IDMTK", -2.0667, 105.1667, "S"),
("Tanjung Pandan", "Indonesia", "ID", "IDTPN", -2.7500, 107.6500, "S"),
("Sampit", "Indonesia", "ID", "IDSMT", -2.5333, 112.9500, "M"),
("Kumai", "Indonesia", "ID", "IDKMA", -2.7333, 111.7333, "S"),
("Kotabaru", "Indonesia", "ID", "IDKTB", -3.2833, 116.2167, "M"),
("Parepare", "Indonesia", "ID", "IDPRE", -4.0167, 119.6167, "M"),
("Pantoloan", "Indonesia", "ID", "IDPNT", -0.7333, 119.8500, "M"),
("Luwuk", "Indonesia", "ID", "IDLUW", -0.9500, 122.8000, "S"),
("Toli Toli", "Indonesia", "ID", "IDTLI", 1.0500, 120.7833, "S"),
("Kolaka", "Indonesia", "ID", "IDKLK", -4.0667, 121.5833, "S"),
("Raha", "Indonesia", "ID", "IDRHA", -4.9667, 122.7167, "S"),
("Namlea", "Indonesia", "ID", "IDNLA", -3.2500, 127.0833, "S"),
("Dobo", "Indonesia", "ID", "IDDBO", -5.7667, 134.2167, "S"),
("Tual", "Indonesia", "ID", "IDTUL", -5.6333, 132.7500, "S"),
("Manokwari", "Indonesia", "ID", "IDMKW", -0.8667, 134.0833, "M"),
("Biak", "Indonesia", "ID", "IDBIK", -1.1833, 136.0833, "S"),
("Nabire", "Indonesia", "ID", "IDNBR", -3.3667, 135.5000, "S"),
("Timika", "Indonesia", "ID", "IDTMK", -4.5333, 136.8833, "S"),
("Agats", "Indonesia", "ID", "IDAGT", -5.5333, 138.1333, "S"),
# ---- ADDITIONAL VIETNAM PORTS ----
("Dong Nai", "Vietnam", "VN", "VNDNI", 10.9667, 106.8333, "M"),
("Binh Duong", "Vietnam", "VN", "VNBDU", 11.0667, 106.6500, "M"),
("My Thoi", "Vietnam", "VN", "VNMTI", 10.3833, 105.4500, "S"),
("Duong Dong", "Vietnam", "VN", "VNDDG", 10.2167, 103.9667, "S"),
("Van Phong", "Vietnam", "VN", "VNVPH", 12.6167, 109.2000, "L"),
# ---- ADDITIONAL PHILIPPINES PORTS ----
("Misamis Oriental", "Philippines", "PH", "PHMOR", 8.5000, 124.6833, "S"),
("Tabaco", "Philippines", "PH", "PHTBC", 13.3500, 123.7333, "S"),
("Calapan", "Philippines", "PH", "PHCLP", 13.4167, 121.1833, "S"),
("Lucena", "Philippines", "PH", "PHLCN", 13.9500, 121.6333, "S"),
("Rosario", "Philippines", "PH", "PHROS", 14.4167, 120.8500, "S"),
# ---- ADDITIONAL THAILAND PORTS ----
("Ban Don", "Thailand", "TH", "THBDN", 9.1500, 99.3167, "S"),
("Ao Makham", "Thailand", "TH", "THAMK", 7.8333, 98.3667, "S"),
("Nong Khai", "Thailand", "TH", "THNKH", 17.8667, 102.7500, "S"),
]
for t in easia:
ports.append(p(*t, region="EASIA") if len(t) == 7 else p(*t))
# ============================================================
# SOUTH ASIA (~200 ports)
# ============================================================
sasia = [
# ---- INDIA (~150 ports) ----
# Major ports (government-administered)
("Mumbai", "India", "IN", "INBOM", 18.9500, 72.8333, "VL"),
("JNPT Nhava Sheva", "India", "IN", "INNSA", 18.9500, 72.9500, "VL"),
("Chennai", "India", "IN", "INMAA", 13.1000, 80.2833, "VL"),
("Kolkata", "India", "IN", "INCCU", 22.5500, 88.3333, "L"),
("Haldia", "India", "IN", "INHAL", 22.0333, 88.0667, "L"),
("Visakhapatnam", "India", "IN", "INVTZ", 17.6833, 83.2833, "VL"),
("Paradip", "India", "IN", "INPRT", 20.2667, 86.6667, "L"),
("Kandla", "India", "IN", "INIXA", 23.0333, 70.2167, "VL"),
("Mundra", "India", "IN", "INMUN", 22.8333, 69.7167, "VL"),
("Pipavav", "India", "IN", "INPPV", 20.9000, 71.5167, "L"),
("Hazira", "India", "IN", "INHZA", 21.1000, 72.6333, "L"),
("Dahej", "India", "IN", "INDAH", 21.7167, 72.5833, "L"),
("Mangalore", "India", "IN", "INIXE", 12.8500, 74.8167, "L"),
("New Mangalore", "India", "IN", "INNML", 12.9167, 74.8000, "L"),
("Cochin", "India", "IN", "INCOK", 9.9667, 76.2667, "L"),
("Tuticorin", "India", "IN", "INTUT", 8.7833, 78.1667, "L"),
("Ennore", "India", "IN", "INENR", 13.2167, 80.3333, "L"),
("Krishnapatnam", "India", "IN", "INKRI", 14.2500, 80.1167, "L"),
("Gangavaram", "India", "IN", "INGVR", 17.6333, 83.2333, "L"),
("Dhamra", "India", "IN", "INDHA", 20.7833, 86.9500, "L"),
("Gopalpur", "India", "IN", "INGPL", 19.2667, 84.9333, "M"),
("Mormugao", "India", "IN", "INMRM", 15.4000, 73.8000, "L"),
("Karaikal", "India", "IN", "INKRK", 10.9167, 79.8500, "M"),
("Kamarajar", "India", "IN", "INKAM", 13.2167, 80.3333, "L"),
("Port Blair", "India", "IN", "INIXA", 11.6667, 92.7333, "M"),
# Gujarat ports
("Porbandar", "India", "IN", "INPBD", 21.6333, 69.6167, "M"),
("Okha", "India", "IN", "INOKH", 22.4667, 69.0667, "M"),
("Veraval", "India", "IN", "INVER", 20.9000, 70.3667, "M"),
("Bhavnagar", "India", "IN", "INBHV", 21.7500, 72.1500, "M"),
("Sikka", "India", "IN", "INSIK", 22.4333, 69.8333, "L"),
("Vadinar", "India", "IN", "INVAD", 22.4500, 69.7000, "L"),
("Navlakhi", "India", "IN", "INNAV", 22.9667, 70.4500, "M"),
("Bedi", "India", "IN", "INBED", 22.5000, 70.0500, "S"),
("Magdalla", "India", "IN", "INMAG", 21.1333, 72.7667, "M"),
("Jamnagar", "India", "IN", "INJAM", 22.4667, 70.0667, "M"),
("Bharuch", "India", "IN", "INBRC", 21.7000, 72.9833, "S"),
("Alang", "India", "IN", "INALG", 21.4167, 72.1833, "M"),
("Ghogha", "India", "IN", "INGHO", 21.6833, 72.2833, "S"),
("Salaya", "India", "IN", "INSLY", 22.3167, 69.6000, "M"),
("Jafrabad", "India", "IN", "INJFR", 20.8667, 71.3667, "S"),
("Mahuva", "India", "IN", "INMHV", 21.1000, 71.7500, "S"),
("Talaja", "India", "IN", "INTLJ", 21.3500, 72.0333, "S"),
("Diu", "India", "IN", "INDIU", 20.7167, 70.9833, "S"),
("Dwarka", "India", "IN", "INDWK", 22.2333, 68.9667, "S"),
("Mandvi", "India", "IN", "INMVI", 22.8333, 69.3500, "S"),
("Koteshwar", "India", "IN", "INKOT", 23.2000, 68.5167, "S"),
("Tuna", "India", "IN", "INTUN", 22.7833, 70.0833, "M"),
("Dholera", "India", "IN", "INDHO", 22.2500, 72.1833, "S"),
("Nargol", "India", "IN", "INNRG", 20.2500, 72.7167, "S"),
("Umbergaon", "India", "IN", "INUMG", 20.1833, 72.7333, "S"),
("Dahanu", "India", "IN", "INDHN", 19.9833, 72.7167, "S"),
("Tarapur", "India", "IN", "INTPR", 19.8500, 72.6833, "S"),
# Maharashtra
("Dharamtar", "India", "IN", "INDRT", 18.6833, 73.0667, "M"),
("Revdanda", "India", "IN", "INRVD", 18.5500, 72.9167, "S"),
("Ratnagiri", "India", "IN", "INRAT", 16.9833, 73.3000, "M"),
("Jaigarh", "India", "IN", "INJGH", 17.3167, 73.2167, "M"),
("Dighi", "India", "IN", "INDIG", 18.2667, 73.3167, "M"),
("Dabhol", "India", "IN", "INDBL", 17.5833, 73.1833, "M"),
("Vijaydurg", "India", "IN", "INVJD", 16.5667, 73.3333, "S"),
("Malvan", "India", "IN", "INMLV", 16.0500, 73.4667, "S"),
("Vengurla", "India", "IN", "INVNG", 15.8667, 73.6333, "S"),
("Jaigad", "India", "IN", "INJGD", 17.3000, 73.2167, "S"),
# Goa
("Panaji", "India", "IN", "INPNJ", 15.4989, 73.8278, "S"),
("Vasco da Gama", "India", "IN", "INVDG", 15.3833, 73.8167, "M"),
# Karnataka
("Karwar", "India", "IN", "INKRW", 14.8000, 74.1333, "M"),
("Belekeri", "India", "IN", "INBLK", 14.7000, 74.1833, "M"),
("Malpe", "India", "IN", "INMLP", 13.3500, 74.7000, "S"),
("Honnavar", "India", "IN", "INHON", 14.2833, 74.4500, "S"),
("Bhatkal", "India", "IN", "INBTK", 13.9833, 74.5667, "S"),
("Tadri", "India", "IN", "INTAD", 14.3833, 74.3167, "S"),
("Belikeri", "India", "IN", "INBKR", 14.7000, 74.1833, "M"),
# Kerala
("Azhikkal", "India", "IN", "INAZK", 11.9167, 75.3167, "S"),
("Beypore", "India", "IN", "INBYP", 11.1667, 75.8000, "S"),
("Vizhinjam", "India", "IN", "INVIZ", 8.3833, 76.9833, "M"),
("Kollam", "India", "IN", "INQLM", 8.8833, 76.6000, "S"),
("Alappuzha", "India", "IN", "INALP", 9.4833, 76.3333, "S"),
("Ponnani", "India", "IN", "INPNI", 10.7833, 75.9167, "S"),
("Munambam", "India", "IN", "INMAM", 10.1833, 76.1667, "S"),
("Vallarpadam", "India", "IN", "INVLP", 9.9833, 76.2833, "L"),
# Tamil Nadu
("Nagapattinam", "India", "IN", "INNPT", 10.7667, 79.8333, "S"),
("Cuddalore", "India", "IN", "INCUD", 11.7333, 79.7667, "S"),
("Kattupalli", "India", "IN", "INKTP", 13.2500, 80.3167, "L"),
("Thiruchopuram", "India", "IN", "INTCP", 10.1833, 79.0833, "S"),
("Rameswaram", "India", "IN", "INRMM", 9.2833, 79.3167, "S"),
("Pamban", "India", "IN", "INPMB", 9.2833, 79.2167, "S"),
("Colachel", "India", "IN", "INCOL", 8.1833, 77.2500, "S"),
("Muttom", "India", "IN", "INMTM", 8.1500, 77.3000, "S"),
("Pondicherry", "India", "IN", "INPDY", 11.9333, 79.8333, "S"),
# Andhra Pradesh
("Machilipatnam", "India", "IN", "INMCH", 16.1833, 81.1333, "M"),
("Kakinada", "India", "IN", "INKAK", 16.9500, 82.2500, "L"),
("Bheemunipatnam", "India", "IN", "INBHM", 17.8833, 83.4500, "S"),
("Vodarevu", "India", "IN", "INVOD", 15.8000, 80.3500, "S"),
("Nellore", "India", "IN", "INNEL", 14.4500, 79.9833, "S"),
("Nizampatnam", "India", "IN", "INNZM", 15.8833, 80.6500, "S"),
("Gangavaram Port", "India", "IN", "INGVP", 17.6167, 83.2333, "L"),
("Mutyalammapalem", "India", "IN", "INMYP", 17.7333, 83.3333, "S"),
# Odisha
("Gopalpur Port", "India", "IN", "INGPP", 19.2667, 84.9333, "M"),
("Dhamra Port", "India", "IN", "INDHP", 20.7833, 86.9500, "L"),
("Chandbali", "India", "IN", "INCHB", 20.7833, 86.7333, "S"),
("Balasore", "India", "IN", "INBLS", 21.5000, 87.0667, "S"),
# West Bengal
("Diamond Harbour", "India", "IN", "INDMH", 22.1833, 88.1833, "M"),
("Sagar Island", "India", "IN", "INSGI", 21.6500, 88.0500, "S"),
("Budge Budge", "India", "IN", "INBGB", 22.4667, 88.1833, "S"),
# Andaman & Nicobar
("Car Nicobar", "India", "IN", "INCNB", 9.1500, 92.8167, "S"),
("Campbell Bay", "India", "IN", "INCBY", 7.0167, 93.9333, "S"),
# Northeast
("Pandu", "India", "IN", "INPND", 26.1500, 91.7000, "S"),
("Dhubri", "India", "IN", "INDHU", 26.0167, 89.9833, "S"),
# Lakshadweep
("Kavaratti", "India", "IN", "INKVA", 10.5667, 72.6333, "S"),
("Minicoy", "India", "IN", "INMIN", 8.2833, 73.0500, "S"),
# Additional minor ports
("Paradip Port", "India", "IN", "INPPT", 20.2667, 86.6500, "L"),
("Deshimukh", "India", "IN", "INDES", 18.0667, 73.4667, "S"),
("Alibag", "India", "IN", "INALB", 18.6500, 72.8667, "S"),
("Rewas", "India", "IN", "INRWS", 18.5000, 73.0500, "S"),
("Thal", "India", "IN", "INTHL", 18.4000, 73.0667, "S"),
("Kelwa", "India", "IN", "INKLW", 19.6167, 72.7667, "S"),
("Arnala", "India", "IN", "INARN", 19.4667, 72.7333, "S"),
("Uttan", "India", "IN", "INUTT", 19.2833, 72.7833, "S"),
("Varsova", "India", "IN", "INVRS", 19.1333, 72.8167, "S"),
("Sassoon Dock", "India", "IN", "INSSD", 18.9167, 72.8333, "M"),
("Nhava Island", "India", "IN", "INNHI", 18.9500, 73.0000, "S"),
("Uran", "India", "IN", "INURN", 18.8833, 73.0500, "M"),
("Ulwe", "India", "IN", "INULW", 19.0333, 73.0333, "S"),
("Marmagao", "India", "IN", "INMRG", 15.4000, 73.8000, "L"),
("Jawahar Dweep", "India", "IN", "INJWD", 18.9167, 72.8500, "M"),
("Butcher Island", "India", "IN", "INBTI", 18.9667, 72.8833, "M"),
# ---- PAKISTAN (~15 ports) ----
("Karachi", "Pakistan", "PK", "PKKHI", 24.8500, 67.0000, "VL"),
("Port Qasim", "Pakistan", "PK", "PKBQM", 24.7833, 67.3500, "VL"),
("Gwadar", "Pakistan", "PK", "PKGWD", 25.1167, 62.3167, "L"),
("Ormara", "Pakistan", "PK", "PKORM", 25.2167, 64.6333, "S"),
("Pasni", "Pakistan", "PK", "PKPSI", 25.2667, 63.4667, "S"),
("Keti Bandar", "Pakistan", "PK", "PKKET", 24.1333, 67.4500, "S"),
("Jiwani", "Pakistan", "PK", "PKJIW", 25.0500, 61.7333, "S"),
("Shah Bandar", "Pakistan", "PK", "PKSHB", 24.1167, 67.5333, "S"),
("Korangi Creek", "Pakistan", "PK", "PKKRC", 24.7833, 67.2333, "M"),
("Bin Qasim", "Pakistan", "PK", "PKBQS", 24.7833, 67.3833, "L"),
("Sonmiani", "Pakistan", "PK", "PKSON", 25.4333, 66.5833, "S"),
("Gadani", "Pakistan", "PK", "PKGAD", 25.1000, 66.7167, "S"),
("Hub", "Pakistan", "PK", "PKHUB", 25.0500, 66.9000, "S"),
# ---- BANGLADESH (~15 ports) ----
("Chittagong", "Bangladesh", "BD", "BDCGP", 22.3000, 91.8000, "VL"),
("Mongla", "Bangladesh", "BD", "BDMGL", 22.4833, 89.6000, "L"),
("Payra", "Bangladesh", "BD", "BDPAY", 21.8000, 90.3167, "L"),
("Dhaka", "Bangladesh", "BD", "BDDAC", 23.7104, 90.4074, "M"),
("Narayanganj", "Bangladesh", "BD", "BDNRJ", 23.6167, 90.5000, "M"),
("Khulna", "Bangladesh", "BD", "BDKHL", 22.8167, 89.5500, "M"),
("Barisal", "Bangladesh", "BD", "BDBSL", 22.7000, 90.3667, "S"),
("Chandpur", "Bangladesh", "BD", "BDCHP", 23.2333, 90.6500, "S"),
("Sylhet", "Bangladesh", "BD", "BDSYL", 24.8833, 91.8833, "S"),
("Bhola", "Bangladesh", "BD", "BDBHL", 22.6833, 90.6500, "S"),
("Patenga", "Bangladesh", "BD", "BDPTG", 22.2333, 91.8000, "M"),
("Pangaon", "Bangladesh", "BD", "BDPGN", 23.6000, 90.4833, "M"),
("Ashuganj", "Bangladesh", "BD", "BDASH", 24.0333, 90.9833, "S"),
("Goalando", "Bangladesh", "BD", "BDGOA", 23.0667, 89.7667, "S"),
# ---- SRI LANKA (~10 ports) ----
("Colombo", "Sri Lanka", "LK", "LKCMB", 6.9500, 79.8500, "VL"),
("Hambantota", "Sri Lanka", "LK", "LKHAM", 6.1167, 81.1167, "L"),
("Trincomalee", "Sri Lanka", "LK", "LKTRR", 8.5667, 81.2333, "L"),
("Galle", "Sri Lanka", "LK", "LKGAL", 6.0333, 80.2167, "M"),
("Jaffna", "Sri Lanka", "LK", "LKJAF", 9.6667, 80.0000, "M"),
("Kankesanturai", "Sri Lanka", "LK", "LKKKS", 9.8167, 80.0500, "S"),
("Point Pedro", "Sri Lanka", "LK", "LKPPD", 9.8167, 80.2333, "S"),
("Oluvil", "Sri Lanka", "LK", "LKOLV", 7.3333, 81.8333, "S"),
("Beruwala", "Sri Lanka", "LK", "LKBRW", 6.4833, 79.9833, "S"),
("Kalpitiya", "Sri Lanka", "LK", "LKKLT", 8.2333, 79.7667, "S"),
# ---- MALDIVES (~5 ports) ----
("Male", "Maldives", "MV", "MVMLE", 4.1750, 73.5093, "M"),
("Hulhumale", "Maldives", "MV", "MVHLM", 4.2167, 73.5500, "M"),
("Addu", "Maldives", "MV", "MVADD", -0.6333, 73.1500, "S"),
("Kulhudhuffushi", "Maldives", "MV", "MVKLH", 6.6167, 73.0667, "S"),
("Hithadhoo", "Maldives", "MV", "MVHTH", -0.5833, 73.0833, "S"),
# ---- ADDITIONAL INDIA PORTS ----
("Krishnapatnam Port", "India", "IN", "INKRP", 14.2500, 80.1333, "L"),
("Adani Vizhinjam", "India", "IN", "INVZM", 8.3667, 76.9833, "L"),
("Thoothukudi", "India", "IN", "INTHO", 8.7833, 78.1500, "L"),
("Cuddalore Port", "India", "IN", "INCUL", 11.7000, 79.7833, "S"),
("Pondicherry Port", "India", "IN", "INPDP", 11.9333, 79.8500, "S"),
("Karaikal Port", "India", "IN", "INKRL", 10.9167, 79.8667, "M"),
("Nagore", "India", "IN", "INNGR", 10.8167, 79.8500, "S"),
("Mandapam", "India", "IN", "INMDP", 9.2833, 79.1333, "S"),
("Thondi", "India", "IN", "INTND", 9.7500, 79.0833, "S"),
("Kanyakumari", "India", "IN", "INKNY", 8.0833, 77.5500, "S"),
("Thankassery", "India", "IN", "INTKS", 8.8833, 76.5833, "S"),
("Kayamkulam", "India", "IN", "INKYM", 9.1833, 76.4833, "S"),
("Chavara", "India", "IN", "INCHV", 8.9667, 76.5333, "S"),
("Kozhikode", "India", "IN", "INKZK", 11.2500, 75.7667, "S"),
("Thalassery", "India", "IN", "INTLY", 11.7500, 75.4833, "S"),
("Kasaragod", "India", "IN", "INKSG", 12.5000, 75.0000, "S"),
("Cannanore", "India", "IN", "INCNN", 11.8667, 75.3667, "S"),
("Mangrol", "India", "IN", "INMRL", 21.1167, 70.1167, "S"),
("Nawabandar", "India", "IN", "INNWB", 20.6833, 71.1167, "S"),
("Rajpara", "India", "IN", "INRJP", 21.0333, 71.8000, "S"),
("Bhagwa", "India", "IN", "INBHG", 21.0667, 72.0500, "S"),
("Gopnath", "India", "IN", "INGPN", 21.2000, 72.1333, "S"),
("Victor Port", "India", "IN", "INVPT", 21.7667, 72.1500, "S"),
("Khambhat", "India", "IN", "INKBT", 22.3167, 72.6167, "S"),
("Billimora", "India", "IN", "INBLM", 20.7667, 72.9500, "S"),
("Valsad", "India", "IN", "INVLS", 20.6000, 72.9333, "S"),
("Surat", "India", "IN", "INSUR", 21.1667, 72.8333, "M"),
# ---- ADDITIONAL PAKISTAN PORTS ----
("Badin", "Pakistan", "PK", "PKBDN", 24.6333, 68.8333, "S"),
("Thatta", "Pakistan", "PK", "PKTHA", 24.7500, 67.9167, "S"),
# ---- ADDITIONAL BANGLADESH PORTS ----
("Cox's Bazar", "Bangladesh", "BD", "BDCXB", 21.4333, 91.9833, "S"),
("Sandwip", "Bangladesh", "BD", "BDSDP", 22.4833, 91.4333, "S"),
("Hatiya", "Bangladesh", "BD", "BDHTY", 22.3167, 91.1000, "S"),
("Patuakhali", "Bangladesh", "BD", "BDPTK", 22.3500, 90.3333, "S"),
# ---- ADDITIONAL SRI LANKA PORTS ----
("Mannar", "Sri Lanka", "LK", "LKMNR", 8.9833, 79.9000, "S"),
("Puttalam", "Sri Lanka", "LK", "LKPTM", 8.0333, 79.8333, "S"),
]
for t in sasia:
ports.append(p(*t, region="SASIA") if len(t) == 7 else p(*t))