478 lines
25 KiB
Python
478 lines
25 KiB
Python
|
|
# 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.")
|