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

478 lines
25 KiB
Python
Raw Normal View History

# Part 2: Middle East + Africa ports
# This will be concatenated with the main generate_ports.py
part2_ports = []
def p2(name, country, cc, unlocode, lat, lon, size="M"):
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}
# ============================================================
# 1. PERSIAN GULF / MIDDLE EAST (~120 ports)
# ============================================================
gulf = [
# --- UAE (~25) ---
("Jebel Ali", "UAE", "AE", "AEJEA", 25.0044, 55.0644, "L"),
("Khalifa Port", "UAE", "AE", "AEKHL", 24.8103, 54.6451, "L"),
("Fujairah", "UAE", "AE", "AEFJR", 25.1164, 56.3361, "L"),
("Sharjah", "UAE", "AE", "AESHJ", 25.3573, 55.3903, "M"),
("Ajman", "UAE", "AE", "AEAJM", 25.4167, 55.4333, "S"),
("Ras Al Khaimah", "UAE", "AE", "AERAK", 25.7953, 55.9432, "M"),
("Hamriyah", "UAE", "AE", "AEHAM", 25.4575, 55.5281, "M"),
("Khor Fakkan", "UAE", "AE", "AEKLF", 25.3397, 56.3517, "M"),
("Ruwais", "UAE", "AE", "AERUW", 24.1114, 52.7306, "M"),
("Das Island", "UAE", "AE", "AEDAS", 25.1533, 52.8722, "M"),
("Mina Zayed", "UAE", "AE", "AEMZD", 24.5183, 54.3828, "M"),
("Mina Saqr", "UAE", "AE", "AEMSQ", 25.7136, 56.0461, "M"),
("Jebel Dhanna", "UAE", "AE", "AEJDH", 24.1786, 52.6025, "S"),
("Mina Rashid", "UAE", "AE", "AEMRA", 25.2717, 55.2783, "M"),
("Zirku Island", "UAE", "AE", "AEZIR", 24.8833, 53.0667, "S"),
("Umm Al Quwain", "UAE", "AE", "AEUAQ", 25.5725, 55.5536, "S"),
("Fateh Terminal", "UAE", "AE", "AEFAT", 25.2333, 54.5167, "S"),
("Mubarraz Island", "UAE", "AE", "AEMUB", 24.2667, 53.3167, "S"),
("Sir Abu Nuair", "UAE", "AE", "AESAN", 25.2208, 54.2208, "S"),
("Al Hamra", "UAE", "AE", "AEAHA", 25.7247, 55.7878, "S"),
("Mina Al Fahal", "UAE", "AE", "AEMAF", 23.6264, 58.5267, "S"),
("Taweelah", "UAE", "AE", "AETAW", 24.6842, 54.6553, "S"),
("Port Rashid", "UAE", "AE", "AEPRA", 25.2667, 55.2750, "M"),
("Dibba Al Fujairah", "UAE", "AE", "AEDIB", 25.5928, 56.2619, "S"),
("Sila Port", "UAE", "AE", "AESIL", 24.0892, 51.6861, "S"),
# --- Saudi Arabia (~25) ---
("Jeddah", "Saudi Arabia", "SA", "SAJED", 21.4858, 39.1925, "L"),
("King Abdullah Port", "Saudi Arabia", "SA", "SAKAP", 22.9561, 38.9783, "L"),
("Dammam", "Saudi Arabia", "SA", "SADAM", 26.4486, 50.1025, "L"),
("Jubail", "Saudi Arabia", "SA", "SAJUB", 27.0114, 49.6597, "L"),
("Ras Tanura", "Saudi Arabia", "SA", "SARAT", 26.6436, 50.1614, "L"),
("Yanbu", "Saudi Arabia", "SA", "SAYAN", 24.0878, 38.0617, "L"),
("Jizan", "Saudi Arabia", "SA", "SAJIZ", 16.8894, 42.5511, "M"),
("Ras Al Khair", "Saudi Arabia", "SA", "SARAK", 27.4833, 49.2333, "M"),
("Dhuba", "Saudi Arabia", "SA", "SADUB", 27.3444, 35.6917, "S"),
("King Fahd Industrial Port Yanbu", "Saudi Arabia", "SA", "SAKFY", 23.9736, 38.2167, "M"),
("King Fahd Industrial Port Jubail", "Saudi Arabia", "SA", "SAKFJ", 27.0333, 49.5833, "M"),
("Rabigh", "Saudi Arabia", "SA", "SARAB", 22.7628, 39.0361, "M"),
("Shuqaiq", "Saudi Arabia", "SA", "SASHU", 17.7342, 41.9850, "M"),
("Khafji", "Saudi Arabia", "SA", "SAKHA", 28.4167, 48.5000, "S"),
("Ras Al Mishab", "Saudi Arabia", "SA", "SARAM", 28.0833, 48.6167, "S"),
("Haql", "Saudi Arabia", "SA", "SAHQL", 29.2833, 34.9333, "S"),
("Thuwal", "Saudi Arabia", "SA", "SATHU", 22.2833, 39.1000, "S"),
("Al Lith", "Saudi Arabia", "SA", "SALIT", 20.1500, 40.2667, "S"),
("Jazan Economic City Port", "Saudi Arabia", "SA", "SAJEC", 16.8000, 42.5833, "M"),
("Farasan Island", "Saudi Arabia", "SA", "SAFAR", 16.7000, 42.1167, "S"),
("Al Wajh", "Saudi Arabia", "SA", "SAWAJ", 26.2333, 36.4500, "S"),
("Ras Al Ghar", "Saudi Arabia", "SA", "SARAG", 26.5500, 50.1833, "S"),
("Ju'aymah", "Saudi Arabia", "SA", "SAJUA", 26.8000, 49.8833, "L"),
("Zuluf", "Saudi Arabia", "SA", "SAZUL", 27.6333, 50.1333, "S"),
("Safaniyah", "Saudi Arabia", "SA", "SASAF", 28.1000, 48.8667, "S"),
# --- Qatar (~8) ---
("Hamad Port", "Qatar", "QA", "QAHAM", 25.3850, 51.5475, "L"),
("Ras Laffan", "Qatar", "QA", "QARLF", 25.9225, 51.5739, "L"),
("Mesaieed", "Qatar", "QA", "QAMES", 24.9786, 51.5542, "L"),
("Doha Port", "Qatar", "QA", "QADOH", 25.2944, 51.5278, "M"),
("Al Ruwais", "Qatar", "QA", "QARUW", 26.1333, 51.2167, "S"),
("Halul Island", "Qatar", "QA", "QAHAL", 25.6667, 52.4000, "S"),
("Umm Said", "Qatar", "QA", "QAUMS", 24.9500, 51.5667, "M"),
("Al Shaheen", "Qatar", "QA", "QASHA", 25.8333, 51.9500, "S"),
# --- Kuwait (~8) ---
("Shuwaikh", "Kuwait", "KW", "KWSWK", 29.3564, 47.9308, "L"),
("Shuaiba", "Kuwait", "KW", "KWSHU", 29.0333, 48.1667, "L"),
("Mina Al Ahmadi", "Kuwait", "KW", "KWMAA", 29.0667, 48.1500, "L"),
("Mina Abdullah", "Kuwait", "KW", "KWMAB", 28.9833, 48.1833, "M"),
("Bubiyan", "Kuwait", "KW", "KWBUB", 29.7833, 48.2167, "S"),
("Doha Port Kuwait", "Kuwait", "KW", "KWDOH", 29.3667, 47.8833, "M"),
("Az Zawr", "Kuwait", "KW", "KWAZW", 28.7333, 48.3833, "M"),
("Failaka Island", "Kuwait", "KW", "KWFAI", 29.4500, 48.3500, "S"),
# --- Bahrain (~5) ---
("Mina Salman", "Bahrain", "BH", "BHMIN", 26.2000, 50.6167, "M"),
("Khalifa bin Salman", "Bahrain", "BH", "BHKBS", 26.0278, 50.4828, "L"),
("Sitrah", "Bahrain", "BH", "BHSIT", 26.1333, 50.6167, "M"),
("Bahrain Petroleum Port", "Bahrain", "BH", "BHBPP", 26.1500, 50.6000, "M"),
("Hidd Port", "Bahrain", "BH", "BHHID", 26.2333, 50.6667, "S"),
# --- Iraq (~8) ---
("Umm Qasr", "Iraq", "IQ", "IQUQR", 30.0353, 47.9289, "L"),
("Basra", "Iraq", "IQ", "IQBSR", 30.5131, 47.8381, "L"),
("Khor Al Zubair", "Iraq", "IQ", "IQKAZ", 30.1833, 47.8833, "M"),
("Al Fao", "Iraq", "IQ", "IQFAO", 29.9667, 48.4667, "M"),
("Al Bakr Oil Terminal", "Iraq", "IQ", "IQABT", 29.6833, 48.8000, "L"),
("Khor Al Amaya", "Iraq", "IQ", "IQKAA", 29.7833, 48.8167, "M"),
("Abu Flus", "Iraq", "IQ", "IQAFL", 30.6333, 47.7833, "S"),
("Maqal", "Iraq", "IQ", "IQMAQ", 30.5500, 47.8167, "M"),
# --- Iran (~25) ---
("Bandar Abbas", "Iran", "IR", "IRBND", 27.1833, 56.2667, "L"),
("Bushehr", "Iran", "IR", "IRBUZ", 28.9667, 50.8333, "M"),
("Bandar Imam Khomeini", "Iran", "IR", "IRBIK", 30.4333, 49.0833, "L"),
("Chabahar", "Iran", "IR", "IRZBR", 25.2917, 60.6333, "L"),
("Assaluyeh", "Iran", "IR", "IRASA", 27.4833, 52.6000, "L"),
("Kish Island", "Iran", "IR", "IRKIS", 26.5333, 54.0167, "S"),
("Bandar Lengeh", "Iran", "IR", "IRBDL", 26.5500, 54.8833, "M"),
("Bandar Mahshahr", "Iran", "IR", "IRMAH", 30.4500, 49.1667, "M"),
("Genaveh", "Iran", "IR", "IRGEN", 29.5833, 50.5167, "M"),
("Neka", "Iran", "IR", "IRNKA", 36.6500, 53.3000, "M"),
("Amirabad", "Iran", "IR", "IRAMB", 36.8833, 53.3667, "M"),
("Nowshahr", "Iran", "IR", "IRNSH", 36.6500, 51.5000, "M"),
("Bandar Anzali", "Iran", "IR", "IRANZ", 37.4667, 49.4667, "M"),
("Astara", "Iran", "IR", "IRAST", 38.4333, 48.8667, "S"),
("Kharg Island", "Iran", "IR", "IRKHR", 29.2333, 50.3333, "L"),
("Lavan Island", "Iran", "IR", "IRLVN", 26.7833, 53.3667, "M"),
("Sirri Island", "Iran", "IR", "IRSIR", 25.8833, 54.5333, "S"),
("Bandar Emam Hassan", "Iran", "IR", "IRBEH", 27.1333, 56.2833, "M"),
("Jask", "Iran", "IR", "IRJSK", 25.6333, 57.7667, "M"),
("Kangan", "Iran", "IR", "IRKGN", 27.8333, 52.0500, "S"),
("Bandar Dayyer", "Iran", "IR", "IRDYR", 27.8333, 51.9333, "S"),
("Tombak", "Iran", "IR", "IRTMB", 27.6167, 52.3167, "M"),
("Hormuz Island", "Iran", "IR", "IRHOR", 27.0667, 56.4500, "S"),
("Qeshm Island", "Iran", "IR", "IRQSH", 26.9500, 56.2667, "M"),
("Bandar Torkaman", "Iran", "IR", "IRBTR", 36.8833, 54.0667, "S"),
# --- Oman (~15) ---
("Muscat (Sultan Qaboos)", "Oman", "OM", "OMMUS", 23.6250, 58.5667, "L"),
("Salalah", "Oman", "OM", "OMSLL", 16.9406, 54.0033, "L"),
("Sohar", "Oman", "OM", "OMSOH", 24.3478, 56.7336, "L"),
("Duqm", "Oman", "OM", "OMDUQ", 19.6667, 57.7167, "L"),
("Sur", "Oman", "OM", "OMSUR", 22.5667, 59.5333, "M"),
("Khasab", "Oman", "OM", "OMKHS", 26.1833, 56.2500, "M"),
("Mina Al Fahal Oman", "Oman", "OM", "OMMFH", 23.6264, 58.5267, "L"),
("Mina Qabus", "Oman", "OM", "OMMQB", 23.6250, 58.5667, "M"),
("Shinas", "Oman", "OM", "OMSHN", 24.7500, 56.4667, "S"),
("Ras Markaz", "Oman", "OM", "OMRMZ", 20.7333, 58.1167, "M"),
("Qalhat LNG", "Oman", "OM", "OMQAL", 22.9500, 59.3667, "M"),
("Suwadi", "Oman", "OM", "OMSWI", 23.4833, 57.8833, "S"),
("Liwa", "Oman", "OM", "OMLWA", 23.5167, 56.9333, "S"),
("Masirah Island", "Oman", "OM", "OMMAS", 20.6833, 58.9000, "S"),
("Haima", "Oman", "OM", "OMHMA", 19.9667, 56.2833, "S"),
]
for t in gulf:
part2_ports.append({**p2(*t), "region": "GULF"})
# ============================================================
# 2. EAST AFRICA / RED SEA (~80 ports)
# ============================================================
ered = [
# --- Egypt (~15) ---
("Port Said", "Egypt", "EG", "EGPSD", 31.2589, 32.3019, "L"),
("Port Said East", "Egypt", "EG", "EGPSE", 31.2333, 32.3667, "L"),
("Suez", "Egypt", "EG", "EGSUZ", 29.9667, 32.5500, "L"),
("Alexandria", "Egypt", "EG", "EGALY", 31.1975, 29.8836, "L"),
("Damietta", "Egypt", "EG", "EGDAM", 31.4167, 31.8167, "L"),
("El Dekheila", "Egypt", "EG", "EGDEK", 31.1500, 29.8000, "L"),
("Ain Sokhna", "Egypt", "EG", "EGAIS", 29.6000, 32.3333, "L"),
("Safaga", "Egypt", "EG", "EGSGA", 26.7333, 33.9333, "M"),
("Hurghada", "Egypt", "EG", "EGRGH", 27.2333, 33.8500, "M"),
("Adabiya", "Egypt", "EG", "EGADB", 29.8667, 32.5333, "M"),
("Abu Qir", "Egypt", "EG", "EGABQ", 31.3167, 30.0667, "M"),
("El Hamra", "Egypt", "EG", "EGELH", 30.9833, 28.9167, "M"),
("Marsa Alam", "Egypt", "EG", "EGMAL", 25.0667, 34.9000, "S"),
("Berenice", "Egypt", "EG", "EGBRN", 23.9333, 35.4833, "S"),
("El Arish", "Egypt", "EG", "EGAR2", 31.1333, 33.8000, "S"),
# --- Sudan (~5) ---
("Port Sudan", "Sudan", "SD", "SDPZU", 19.6000, 37.2167, "L"),
("Suakin", "Sudan", "SD", "SDSUA", 19.1000, 37.3333, "S"),
("Osman Digna", "Sudan", "SD", "SDOSM", 19.0833, 37.3333, "S"),
("Bashayer Marine Terminal", "Sudan", "SD", "SDBMT", 19.7333, 37.3833, "M"),
("Marsa Alam Sudan", "Sudan", "SD", "SDMAS", 19.6500, 37.2500, "S"),
# --- Eritrea (~3) ---
("Massawa", "Eritrea", "ER", "ERMSW", 15.6100, 39.4500, "M"),
("Assab", "Eritrea", "ER", "ERASA", 13.0100, 42.7400, "M"),
("Tio", "Eritrea", "ER", "ERTIO", 15.5333, 39.5167, "S"),
# --- Djibouti (~5) ---
("Djibouti", "Djibouti", "DJ", "DJJIB", 11.5944, 43.1500, "L"),
("Doraleh", "Djibouti", "DJ", "DJDOR", 11.5833, 43.0833, "L"),
("Doraleh Multipurpose Port", "Djibouti", "DJ", "DJDMP", 11.5750, 43.0750, "L"),
("Tadjoura", "Djibouti", "DJ", "DJTAD", 11.7833, 42.8833, "S"),
("Goubet", "Djibouti", "DJ", "DJGOU", 11.5333, 42.5667, "S"),
# --- Somalia (~8) ---
("Mogadishu", "Somalia", "SO", "SOMGQ", 2.0333, 45.3500, "M"),
("Berbera", "Somalia", "SO", "SOBER", 10.4333, 45.0333, "M"),
("Bosaso", "Somalia", "SO", "SOBSA", 11.2833, 49.1833, "M"),
("Kismayo", "Somalia", "SO", "SOKMU", -0.3500, 42.5333, "M"),
("Marka", "Somalia", "SO", "SOMRK", 1.7000, 44.7667, "S"),
("Eyl", "Somalia", "SO", "SOEYL", 7.9833, 49.8167, "S"),
("Zeila", "Somalia", "SO", "SOZEI", 11.3500, 43.4667, "S"),
("Hobyo", "Somalia", "SO", "SOHOB", 5.3500, 48.5333, "S"),
# --- Yemen (~10) ---
("Aden", "Yemen", "YE", "YEADE", 12.7900, 45.0367, "L"),
("Hodeidah", "Yemen", "YE", "YEHOD", 14.7500, 42.9500, "M"),
("Mukalla", "Yemen", "YE", "YEMKX", 14.5333, 49.1333, "M"),
("Saleef", "Yemen", "YE", "YESAL", 15.3167, 42.6833, "M"),
("Mocha", "Yemen", "YE", "YEMOC", 13.3167, 43.2500, "S"),
("Nishtun", "Yemen", "YE", "YENSH", 15.7833, 52.1833, "S"),
("Ash Shihr", "Yemen", "YE", "YEASH", 14.7500, 49.6000, "M"),
("Ras Isa", "Yemen", "YE", "YERSI", 15.2000, 42.7667, "M"),
("Balhaf LNG", "Yemen", "YE", "YEBLH", 13.9667, 48.1833, "M"),
("Socotra", "Yemen", "YE", "YESCO", 12.5000, 54.0000, "S"),
# --- Kenya (~5) ---
("Mombasa", "Kenya", "KE", "KEMBA", -4.0433, 39.6658, "L"),
("Lamu", "Kenya", "KE", "KELAU", -2.2667, 40.9000, "M"),
("Kilifi", "Kenya", "KE", "KEKIL", -3.6333, 39.8500, "S"),
("Malindi", "Kenya", "KE", "KEMAL", -3.2167, 40.1167, "S"),
("Shimoni", "Kenya", "KE", "KESHI", -4.6500, 39.3833, "S"),
# --- Tanzania (~8) ---
("Dar es Salaam", "Tanzania", "TZ", "TZDAR", -6.8333, 39.2833, "L"),
("Zanzibar", "Tanzania", "TZ", "TZZNZ", -6.1600, 39.1914, "M"),
("Tanga", "Tanzania", "TZ", "TZTGT", -5.0667, 39.1000, "M"),
("Mtwara", "Tanzania", "TZ", "TZMTW", -10.2667, 40.1833, "M"),
("Bagamoyo", "Tanzania", "TZ", "TZBAG", -6.4333, 38.9000, "M"),
("Lindi", "Tanzania", "TZ", "TZLDI", -10.0000, 39.7167, "S"),
("Kilwa Masoko", "Tanzania", "TZ", "TZKMA", -8.9333, 39.5167, "S"),
("Pangani", "Tanzania", "TZ", "TZPAN", -5.8333, 38.9667, "S"),
# --- Mozambique (~8) ---
("Maputo", "Mozambique", "MZ", "MZMPM", -25.9667, 32.5833, "L"),
("Beira", "Mozambique", "MZ", "MZBEW", -19.8333, 34.8667, "L"),
("Nacala", "Mozambique", "MZ", "MZMNC", -14.5333, 40.6667, "L"),
("Quelimane", "Mozambique", "MZ", "MZUEL", -17.8833, 36.8833, "M"),
("Pemba", "Mozambique", "MZ", "MZPOL", -12.9667, 40.5167, "M"),
("Inhambane", "Mozambique", "MZ", "MZINH", -23.8667, 35.3833, "S"),
("Chinde", "Mozambique", "MZ", "MZCHI", -18.5833, 36.4500, "S"),
("Matola", "Mozambique", "MZ", "MZMAT", -25.9833, 32.5333, "M"),
]
for t in ered:
part2_ports.append({**p2(*t), "region": "ERED"})
# ============================================================
# 3. WEST AFRICA (~120 ports)
# ============================================================
wafr = [
# --- Nigeria (~20) ---
("Lagos Apapa", "Nigeria", "NG", "NGAPP", 6.4500, 3.3667, "L"),
("Tin Can Island", "Nigeria", "NG", "NGTCI", 6.4167, 3.3500, "L"),
("Onne", "Nigeria", "NG", "NGONN", 4.7167, 7.1500, "L"),
("Warri", "Nigeria", "NG", "NGWAR", 5.5167, 5.7333, "M"),
("Calabar", "Nigeria", "NG", "NGCBQ", 4.9667, 8.3333, "M"),
("Port Harcourt", "Nigeria", "NG", "NGPHC", 4.7667, 7.0167, "L"),
("Bonny", "Nigeria", "NG", "NGBON", 4.4333, 7.1667, "L"),
("Lekki Deep Sea Port", "Nigeria", "NG", "NGLEK", 6.3833, 3.5833, "L"),
("Escravos", "Nigeria", "NG", "NGESC", 5.6167, 5.2000, "M"),
("Burutu", "Nigeria", "NG", "NGBUR", 5.3500, 5.5167, "S"),
("Sapele", "Nigeria", "NG", "NGSAP", 5.9000, 5.6833, "S"),
("Okrika", "Nigeria", "NG", "NGOKR", 4.7333, 7.0833, "S"),
("Brass", "Nigeria", "NG", "NGBRA", 4.3167, 6.2500, "S"),
("Pennington", "Nigeria", "NG", "NGPEN", 4.2833, 6.0000, "S"),
("Forcados", "Nigeria", "NG", "NGFOR", 5.3500, 5.3500, "M"),
("Qua Iboe", "Nigeria", "NG", "NGQUA", 4.5333, 7.9333, "M"),
("Agbami", "Nigeria", "NG", "NGAGB", 4.2833, 4.9000, "S"),
("Akassa", "Nigeria", "NG", "NGAKA", 4.2833, 6.0667, "S"),
("Koko", "Nigeria", "NG", "NGKOK", 5.9833, 5.4833, "S"),
("Badagry", "Nigeria", "NG", "NGBAD", 6.4167, 2.8833, "S"),
# --- Ghana (~10) ---
("Tema", "Ghana", "GH", "GHTEM", 5.6333, -0.0167, "L"),
("Takoradi", "Ghana", "GH", "GHTKD", 4.8833, -1.7500, "L"),
("Saltpond", "Ghana", "GH", "GHSAP", 5.2167, -1.0667, "S"),
("Cape Coast", "Ghana", "GH", "GHCAC", 5.1000, -1.2500, "S"),
("Axim", "Ghana", "GH", "GHAXM", 4.8667, -2.2333, "S"),
("Ada", "Ghana", "GH", "GHADA", 5.8167, 0.6333, "S"),
("FPSO Jubilee", "Ghana", "GH", "GHJUB", 4.5667, -2.7667, "S"),
("TEN FPSO", "Ghana", "GH", "GHTEN", 4.5333, -2.8500, "S"),
("Keta", "Ghana", "GH", "GHKET", 5.9167, 0.9833, "S"),
("Elmina", "Ghana", "GH", "GHELM", 5.0833, -1.3500, "S"),
# --- Ivory Coast (~8) ---
("Abidjan", "Ivory Coast", "CI", "CIABJ", 5.2833, -4.0167, "L"),
("San Pedro", "Ivory Coast", "CI", "CISPY", 4.7500, -6.6333, "M"),
("Tabou", "Ivory Coast", "CI", "CITAB", 4.4167, -7.3500, "S"),
("Sassandra", "Ivory Coast", "CI", "CISAS", 4.9500, -6.0833, "S"),
("Grand Bassam", "Ivory Coast", "CI", "CIGBA", 5.2000, -3.7333, "S"),
("Jacqueville", "Ivory Coast", "CI", "CIJAC", 5.2000, -4.4167, "S"),
("Grand Lahou", "Ivory Coast", "CI", "CIGLH", 5.1333, -5.0000, "S"),
("Vridi", "Ivory Coast", "CI", "CIVRI", 5.2667, -4.0333, "M"),
# --- Senegal (~8) ---
("Dakar", "Senegal", "SN", "SNDKR", 14.6833, -17.4333, "L"),
("Saint Louis", "Senegal", "SN", "SNSTL", 16.0333, -16.5000, "S"),
("Kaolack", "Senegal", "SN", "SNKLC", 14.1500, -16.0667, "S"),
("Ziguinchor", "Senegal", "SN", "SNZIG", 12.5833, -16.2667, "S"),
("Mbour", "Senegal", "SN", "SNMBO", 14.4167, -16.9667, "S"),
("Joal Fadiouth", "Senegal", "SN", "SNJOA", 14.1667, -16.8333, "S"),
("Foundioungne", "Senegal", "SN", "SNFOU", 14.1333, -16.4667, "S"),
("Matam", "Senegal", "SN", "SNMAT", 15.6500, -13.2500, "S"),
# --- Cameroon (~8) ---
("Douala", "Cameroon", "CM", "CMDLA", 4.0500, 9.7167, "L"),
("Kribi", "Cameroon", "CM", "CMKBI", 2.9500, 9.9167, "L"),
("Limbe", "Cameroon", "CM", "CMLMB", 4.0167, 9.2000, "M"),
("Tiko", "Cameroon", "CM", "CMTKO", 4.0667, 9.3667, "S"),
("Campo", "Cameroon", "CM", "CMCAM", 2.3667, 9.8333, "S"),
("Garoua", "Cameroon", "CM", "CMGAR", 9.3000, 13.3833, "S"),
("Bonaberi", "Cameroon", "CM", "CMBON", 4.0667, 9.6833, "M"),
("Idenau", "Cameroon", "CM", "CMIDE", 4.2333, 8.9833, "S"),
# --- Togo (~3) ---
("Lome", "Togo", "TG", "TGLFW", 6.1333, 1.2833, "L"),
("Kpeme", "Togo", "TG", "TGKPE", 6.2000, 1.5167, "S"),
("Aneho", "Togo", "TG", "TGANH", 6.2333, 1.6000, "S"),
# --- Benin (~3) ---
("Cotonou", "Benin", "BJ", "BJCOO", 6.3500, 2.4333, "L"),
("Seme", "Benin", "BJ", "BJSEM", 6.3667, 2.6333, "S"),
("Grand Popo", "Benin", "BJ", "BJGPO", 6.2667, 1.8167, "S"),
# --- Guinea (~5) ---
("Conakry", "Guinea", "GN", "GNCKY", 9.5092, -13.7122, "L"),
("Kamsar", "Guinea", "GN", "GNKMS", 10.6500, -14.6167, "M"),
("Boke", "Guinea", "GN", "GNBOK", 10.9333, -14.3000, "S"),
("Benti", "Guinea", "GN", "GNBEN", 9.9333, -14.2833, "S"),
("Kissidougou Wharf", "Guinea", "GN", "GNKIS", 9.1833, -10.1000, "S"),
# --- Sierra Leone (~4) ---
("Freetown", "Sierra Leone", "SL", "SLFNA", 8.4833, -13.2333, "M"),
("Pepel", "Sierra Leone", "SL", "SLPEP", 8.5833, -13.0500, "S"),
("Bonthe", "Sierra Leone", "SL", "SLBON", 7.5333, -12.5000, "S"),
("Niti", "Sierra Leone", "SL", "SLNIT", 8.4000, -13.1667, "S"),
# --- Liberia (~4) ---
("Monrovia", "Liberia", "LR", "LRMLW", 6.3333, -10.8000, "M"),
("Buchanan", "Liberia", "LR", "LRBUC", 5.8833, -10.0500, "M"),
("Greenville", "Liberia", "LR", "LRGRV", 5.0167, -9.0333, "S"),
("Harper", "Liberia", "LR", "LRHAR", 4.3833, -7.7167, "S"),
# --- Gambia (~3) ---
("Banjul", "Gambia", "GM", "GMBJL", 13.4500, -16.5833, "M"),
("Barra", "Gambia", "GM", "GMBAR", 13.4833, -16.5500, "S"),
("Kaur", "Gambia", "GM", "GMKAU", 13.6833, -15.3333, "S"),
# --- Guinea-Bissau (~2) ---
("Bissau", "Guinea-Bissau", "GW", "GWOXB", 11.8500, -15.5833, "M"),
("Cacheu", "Guinea-Bissau", "GW", "GWCAC", 12.2667, -16.1667, "S"),
# --- Mauritania (~3) ---
("Nouakchott", "Mauritania", "MR", "MRNKC", 18.0833, -15.9667, "M"),
("Nouadhibou", "Mauritania", "MR", "MRNDB", 20.9333, -17.0500, "M"),
("Point Central", "Mauritania", "MR", "MRPTC", 19.4167, -17.1000, "S"),
# --- Cape Verde (~3) ---
("Praia", "Cape Verde", "CV", "CVRAI", 14.9167, -23.5167, "M"),
("Mindelo", "Cape Verde", "CV", "CVMND", 16.8833, -25.0000, "M"),
("Palmeira", "Cape Verde", "CV", "CVPAL", 16.7500, -22.9833, "S"),
# --- Equatorial Guinea (~3) ---
("Malabo", "Equatorial Guinea", "GQ", "GQSSG", 3.7500, 8.7833, "M"),
("Bata", "Equatorial Guinea", "GQ", "GQBSG", 1.8500, 9.7667, "M"),
("Luba", "Equatorial Guinea", "GQ", "GQLUB", 3.4500, 8.5500, "S"),
# --- Gabon (~5) ---
("Libreville", "Gabon", "GA", "GALBV", 0.3833, 9.4500, "M"),
("Port Gentil", "Gabon", "GA", "GAPOG", -0.7167, 8.7833, "M"),
("Owendo", "Gabon", "GA", "GAOWE", 0.2833, 9.5000, "M"),
("Mayumba", "Gabon", "GA", "GAMAY", -3.4167, 10.6500, "S"),
("Gamba", "Gabon", "GA", "GAGAM", -2.7667, 10.0167, "S"),
# --- Congo (~3) ---
("Pointe Noire", "Congo", "CG", "CGPNR", -4.8000, 11.8500, "L"),
("Brazzaville", "Congo", "CG", "CGBZV", -4.2667, 15.2833, "M"),
("Djeno", "Congo", "CG", "CGDJE", -4.7500, 11.8833, "S"),
# --- DRC (~3) ---
("Matadi", "DRC", "CD", "CDMAT", -5.8167, 13.4500, "M"),
("Boma", "DRC", "CD", "CDBOM", -5.8500, 13.0500, "M"),
("Banana", "DRC", "CD", "CDBAN", -6.0000, 12.4000, "S"),
# --- Angola (~8) ---
("Luanda", "Angola", "AO", "AOLAD", -8.8000, 13.2333, "L"),
("Lobito", "Angola", "AO", "AOLOB", -12.3500, 13.5500, "M"),
("Namibe", "Angola", "AO", "AOMSZ", -15.1667, 12.1500, "M"),
("Cabinda", "Angola", "AO", "AOCAB", -5.5500, 12.1833, "M"),
("Soyo", "Angola", "AO", "AOSOY", -6.1333, 12.3667, "M"),
("Porto Amboim", "Angola", "AO", "AOPAM", -10.7167, 13.7500, "S"),
("Malongo Terminal", "Angola", "AO", "AOMAL", -5.3833, 12.1833, "M"),
("Takula Terminal", "Angola", "AO", "AOTAK", -6.0000, 11.8833, "S"),
# --- Sao Tome (~2) ---
("Sao Tome", "Sao Tome and Principe", "ST", "STTMS", 0.3333, 6.7333, "S"),
("Santo Antonio", "Sao Tome and Principe", "ST", "STSAN", 1.6500, 7.4167, "S"),
]
for t in wafr:
part2_ports.append({**p2(*t), "region": "WAFR"})
# ============================================================
# 4. SOUTHERN AFRICA (~60 ports)
# ============================================================
safr = [
# --- South Africa (~15) ---
("Durban", "South Africa", "ZA", "ZADUR", -29.8667, 31.0500, "L"),
("Cape Town", "South Africa", "ZA", "ZACPT", -33.9000, 18.4333, "L"),
("Richards Bay", "South Africa", "ZA", "ZARBY", -28.8000, 32.0833, "L"),
("Port Elizabeth", "South Africa", "ZA", "ZAPLZ", -33.7667, 25.6333, "L"),
("Saldanha Bay", "South Africa", "ZA", "ZASAL", -33.0167, 17.9333, "L"),
("East London", "South Africa", "ZA", "ZAELS", -33.0333, 27.9167, "M"),
("Mossel Bay", "South Africa", "ZA", "ZAMOB", -34.1833, 22.1500, "M"),
("Coega Ngqura", "South Africa", "ZA", "ZANGQ", -33.8000, 25.7667, "L"),
("Simons Town", "South Africa", "ZA", "ZASIM", -34.1833, 18.4333, "S"),
("Port Nolloth", "South Africa", "ZA", "ZAPNO", -29.2500, 16.8667, "S"),
("Gansbay", "South Africa", "ZA", "ZAGAN", -34.5833, 19.3500, "S"),
("Kleinmond", "South Africa", "ZA", "ZAKLM", -34.3333, 19.0333, "S"),
("Lamberts Bay", "South Africa", "ZA", "ZALBY", -32.0833, 18.3000, "S"),
("Hermanus", "South Africa", "ZA", "ZAHER", -34.4167, 19.2333, "S"),
("Hout Bay", "South Africa", "ZA", "ZAHBY", -34.0500, 18.3500, "S"),
# --- Namibia (~3) ---
("Walvis Bay", "Namibia", "NA", "NAWVB", -22.9500, 14.5000, "L"),
("Luderitz", "Namibia", "NA", "NALUD", -26.6500, 15.1667, "M"),
("Henties Bay", "Namibia", "NA", "NAHEN", -22.1167, 14.2833, "S"),
# --- Madagascar (~8) ---
("Toamasina", "Madagascar", "MG", "MGTMM", -18.1500, 49.4000, "L"),
("Mahajanga", "Madagascar", "MG", "MGMJN", -15.7167, 46.3167, "M"),
("Nosy Be", "Madagascar", "MG", "MGNSB", -13.3333, 48.2667, "M"),
("Antsiranana", "Madagascar", "MG", "MGDIE", -12.2667, 49.2833, "M"),
("Toliary", "Madagascar", "MG", "MGTLY", -23.3500, 43.6667, "S"),
("Mananjary", "Madagascar", "MG", "MGMNJ", -21.2333, 48.3500, "S"),
("Morondava", "Madagascar", "MG", "MGMOV", -20.2833, 44.2833, "S"),
("Antsirabe Port Ehoala", "Madagascar", "MG", "MGEHL", -25.0333, 46.9667, "M"),
# --- Mauritius (~3) ---
("Port Louis", "Mauritius", "MU", "MUPLU", -20.1500, 57.5000, "L"),
("Mahebourg", "Mauritius", "MU", "MUMAH", -20.4167, 57.7000, "S"),
("Grand Baie", "Mauritius", "MU", "MUGBI", -20.0167, 57.5833, "S"),
# --- Reunion (~2) ---
("Le Port Reunion", "Reunion", "RE", "RELPT", -20.9333, 55.2833, "M"),
("Sainte Marie", "Reunion", "RE", "RESTM", -20.9167, 55.5333, "S"),
# --- Seychelles (~2) ---
("Victoria Seychelles", "Seychelles", "SC", "SCVIC", -4.6167, 55.4500, "M"),
("Praslin Island", "Seychelles", "SC", "SCPRI", -4.3167, 55.7333, "S"),
# --- Comoros (~2) ---
("Moroni", "Comoros", "KM", "KMYVA", -11.7000, 43.2500, "M"),
("Mutsamudu", "Comoros", "KM", "KMMUT", -12.1667, 44.3833, "S"),
]
for t in safr:
part2_ports.append({**p2(*t), "region": "SAFR"})
# ============================================================
# Summary
# ============================================================
if __name__ == "__main__":
from collections import Counter
region_counts = Counter(p["region"] for p in part2_ports)
print(f"Total Part 2 ports: {len(part2_ports)}")
for region, count in sorted(region_counts.items()):
print(f" {region}: {count}")
# Sanity checks
keys = [p["key"] for p in part2_ports]
dupes = [k for k, v in Counter(keys).items() if v > 1]
if dupes:
print(f"\nWARNING: Duplicate keys: {dupes}")
else:
print("\nNo duplicate keys found.")