/* * Copyright (c) 2025 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProtonVPN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProtonVPN. If not, see . */ using ProtonVPN.Client.Logic.Servers.Contracts.Models; namespace ProtonVPN.Client.UI.Main.Map; public class CoordinatesProvider : ICoordinatesProvider { private readonly Dictionary _countryCoordinates = new() { { "AF", (33.93911, 67.709953) }, { "AL", (41.153332, 20.168331) }, { "DZ", (28.033886, 1.659626) }, { "AD", (42.546245, 1.601554) }, { "AO", (-11.202692, 17.873887) }, { "AG", (17.060816, -61.796428) }, { "AR", (-38.416097, -63.616672) }, { "AM", (40.069099, 45.038189) }, { "AU", (-25.274398, 133.775136) }, { "AT", (47.516231, 14.550072) }, { "AZ", (40.143105, 47.576927) }, { "BS", (25.03428, -77.39628) }, { "BH", (26.0667, 50.5577) }, { "BD", (23.685, 90.3563) }, { "BB", (13.193887, -59.543198) }, { "BY", (53.709807, 27.953389) }, { "BE", (50.503887, 4.469936) }, { "BZ", (17.189877, -88.49765) }, { "BJ", (9.30769, 2.315834) }, { "BT", (27.514162, 90.433601) }, { "BO", (-16.290154, -63.588653) }, { "BA", (43.915886, 17.679076) }, { "BW", (-22.328474, 24.684866) }, { "BR", (-14.235004, -51.92528) }, { "BN", (4.535277, 114.727669) }, { "BG", (42.733883, 25.48583) }, { "BF", (12.238333, -1.561593) }, { "BI", (-3.373056, 29.918886) }, { "CV", (16.002082, -24.013197) }, { "KH", (12.565679, 104.990963) }, { "CM", (7.369722, 12.354722) }, { "CA", (56.130366, -106.346771) }, { "CF", (6.611111, 20.939444) }, { "TD", (15.454166, 18.732207) }, { "CL", (-35.675147, -71.542969) }, { "CN", (35.86166, 104.195397) }, { "CO", (4.570868, -74.297333) }, { "KM", (-11.804381, 43.387865) }, { "CD", (-4.038333, 21.758664) }, { "CG", (-0.228021, 15.827659) }, { "CR", (9.748917, -83.753428) }, { "CI", (7.539989, -5.54708) }, { "HK", (22.542565, 114.135993) }, { "HR", (45.1, 15.2) }, { "CU", (21.521757, -77.781167) }, { "CY", (35.126413, 33.429859) }, { "CZ", (49.817492, 15.472962) }, { "DK", (56.26392, 9.501785) }, { "DJ", (11.825138, 42.590275) }, { "DO", (18.735693, -70.162651) }, { "EC", (-1.831239, -78.183406) }, { "EG", (26.820553, 30.802498) }, { "SV", (13.794185, -88.89653) }, { "GQ", (1.650801, 10.267895) }, { "ER", (15.179384, 39.782334) }, { "EE", (58.595272, 25.013607) }, { "SZ", (-26.522503, 31.465866) }, { "ET", (9.145, 40.489673) }, { "FJ", (-17.713371, 178.065032) }, { "FI", (61.92411, 25.748151) }, { "FR", (46.227638, 2.213749) }, { "GA", (-0.803689, 11.609444) }, { "GM", (13.443182, -15.310139) }, { "GE", (42.315407, 43.356892) }, { "DE", (51.165691, 10.451526) }, { "GH", (7.946527, -1.023194) }, { "GR", (39.074208, 21.824312) }, { "GD", (12.262776, -61.604171) }, { "GT", (15.783471, -90.230759) }, { "GN", (9.945587, -9.696645) }, { "GW", (11.803749, -15.180413) }, { "GY", (4.860416, -58.93018) }, { "HT", (18.971187, -72.285215) }, { "HN", (15.199999, -86.241905) }, { "HU", (47.162494, 19.503304) }, { "IS", (64.963051, -19.020835) }, { "IN", (20.593684, 78.96288) }, { "ID", (-6.196710, 106.824293) }, { "IR", (32.427908, 53.688046) }, { "IQ", (33.223191, 43.679291) }, { "IE", (53.41291, -8.24389) }, { "IL", (31.046051, 34.851612) }, { "IT", (41.87194, 12.56738) }, { "JM", (18.109581, -77.297508) }, { "JP", (36.204824, 138.252924) }, { "JO", (30.585164, 36.238414) }, { "KZ", (48.019573, 66.923684) }, { "KE", (-0.023559, 37.906193) }, { "KI", (-3.370417, -168.734039) }, { "KP", (40.339852, 127.510093) }, { "KR", (35.907757, 127.766922) }, { "KW", (29.31166, 47.481766) }, { "KG", (41.20438, 74.766098) }, { "LA", (19.85627, 102.495496) }, { "LV", (56.879635, 24.603189) }, { "LB", (33.854721, 35.862285) }, { "LS", (-29.609988, 28.233608) }, { "LR", (6.428055, -9.429499) }, { "LY", (26.3351, 17.228331) }, { "LI", (47.166, 9.555373) }, { "LT", (55.169438, 23.881275) }, { "LU", (49.815273, 6.129583) }, { "MG", (-18.766947, 46.869107) }, { "MW", (-13.254308, 34.301525) }, { "MY", (4.210484, 101.975766) }, { "MV", (3.202778, 73.22068) }, { "ML", (17.570692, -3.996166) }, { "MT", (35.937496, 14.375416) }, { "MH", (7.131474, 171.184478) }, { "MR", (21.00789, -10.940835) }, { "MU", (-20.348404, 57.552152) }, { "MX", (23.634501, -102.552784) }, { "FM", (7.425554, 150.550812) }, { "MA", (31.791702, -7.09262) }, { "MC", (43.750298, 7.412841) }, { "MD", (47.411631, 28.369885) }, { "ME", (42.708678, 19.37439) }, { "MM", (21.913965, 95.956223) }, { "MN", (46.862496, 103.846656) }, { "MO", (22.1987, 113.5439) }, { "MZ", (-18.665695, 35.529562) }, { "NA", (-22.95764, 18.49041) }, { "NR", (-0.533, 166.9167) }, { "NP", (28.394857, 84.124008) }, { "NL", (52.132633, 5.291266) }, { "NZ", (-41.295115, 174.773309) }, { "NI", (12.865416, -85.207229) }, { "NE", (17.607789, 8.081666) }, { "NG", (9.081999, 8.675277) }, { "MK", (41.608635, 21.745275) }, { "NO", (60.472024, 8.468946) }, { "OM", (21.512583, 55.923255) }, { "PK", (30.375321, 69.345116) }, { "PR", (18.200446, -66.425973) }, { "PW", (7.51498, 134.58252) }, { "PS", (31.952162, 35.233154) }, { "PA", (8.537981, -80.782127) }, { "PG", (-6.314993, 143.95555) }, { "PY", (-23.442503, -58.443832) }, { "PE", (-9.189967, -75.015152) }, { "PH", (14.602918, 121.006537) }, { "PL", (51.919438, 19.145136) }, { "PT", (39.399872, -8.224454) }, { "QA", (25.354826, 51.183884) }, { "RO", (45.943161, 24.96676) }, { "RU", (55.751244, 37.6173) }, { "RW", (-1.940278, 29.873888) }, { "KN", (17.357822, -62.782998) }, { "LC", (13.909444, -60.978893) }, { "VC", (12.984305, -61.287228) }, { "WS", (-13.759029, -172.104629) }, { "SM", (43.94236, 12.457777) }, { "ST", (0.18636, 6.613081) }, { "SA", (23.885942, 45.079162) }, { "SN", (14.497401, -14.452362) }, { "RS", (44.016521, 21.005859) }, { "SC", (-4.679574, 55.491977) }, { "SL", (8.460555, -11.779889) }, { "SG", (1.352083, 103.819836) }, { "SK", (48.669026, 19.699024) }, { "SI", (46.151241, 14.995463) }, { "SB", (-9.64571, 160.156194) }, { "SO", (5.152149, 46.199616) }, { "ZA", (-30.559482, 22.937506) }, { "SS", (6.877, 31.307) }, { "ES", (40.463667, -3.74922) }, { "LK", (7.873054, 80.771797) }, { "SD", (12.862807, 30.217636) }, { "SR", (3.919305, -56.027783) }, { "SE", (60.128161, 18.643501) }, { "CH", (46.818188, 8.227512) }, { "SY", (34.802075, 38.996815) }, { "TW", (23.69781, 120.960515) }, { "TJ", (38.861034, 71.276093) }, { "TZ", (-6.369028, 34.888822) }, { "TH", (15.870032, 100.992541) }, { "TL", (-8.874217, 125.727539) }, { "TG", (8.619543, 0.824782) }, { "TO", (-21.178986, -175.198242) }, { "TT", (10.691803, -61.222503) }, { "TN", (33.886917, 9.537499) }, { "TR", (38.963745, 35.243322) }, { "TM", (38.969719, 59.556278) }, { "TV", (-7.109535, 177.64933) }, { "UG", (1.373333, 32.290275) }, { "UA", (48.379433, 31.16558) }, { "AE", (23.424076, 53.847818) }, { "UK", (55.378051, -3.435973) }, { "US", (39.831137, -101.482897) }, { "UY", (-32.522779, -55.765835) }, { "UZ", (41.377491, 64.585262) }, { "VU", (-15.376706, 166.959158) }, { "VA", (41.902916, 12.453389) }, { "VE", (6.42375, -66.58973) }, { "VN", (14.058324, 108.277199) }, { "YE", (15.552727, 48.516388) }, { "ZM", (-13.133897, 27.849332) }, { "ZW", (-19.015438, 29.154857) }, { "AI", (18.2206, -63.0686) }, { "AQ", (-75.250973, -0.071389) }, { "AS", (-14.2710, -170.1322) }, { "AW", (12.5211, -69.9683) }, { "AX", (60.1785, 19.9156) }, { "BL", (17.9000, -62.8333) }, { "BM", (32.3078, -64.7505) }, { "BQ", (12.1784, -68.2385) }, { "BV", (-54.4208, 3.3464) }, { "CC", (-12.1642, 96.8710) }, { "CK", (-21.2367, -159.7777) }, { "CW", (12.1696, -68.9900) }, { "CX", (-10.4475, 105.6904) }, { "DM", (15.4150, -61.3710) }, { "EH", (24.2155, -12.8858) }, { "FK", (-51.7963, -59.5236) }, { "FO", (61.8926, -6.9118) }, { "GB", (55.3781, -3.4360) }, { "GF", (3.9339, -53.1258) }, { "GG", (49.4657, -2.5853) }, { "GI", (36.1408, -5.3536) }, { "GL", (71.7069, -42.6043) }, { "GP", (16.9950, -62.0677) }, { "GS", (-54.4296, -36.5877) }, { "GU", (13.4443, 144.7937) }, { "HM", (-53.0818, 73.5042) }, { "IM", (54.2361, -4.5481) }, { "IO", (-6.3432, 71.8765) }, { "JE", (49.1859, -2.1100) }, { "KY", (19.3133, -81.2546) }, { "MF", (18.0708, -63.0501) }, { "MP", (15.0979, 145.6739) }, { "MQ", (14.6415, -61.0242) }, { "MS", (16.7425, -62.1874) }, { "NC", (-20.9043, 165.6180) }, { "NF", (-29.0408, 167.9547) }, { "NU", (-19.0544, -169.8672) }, { "PF", (-17.6797, -149.4068) }, { "PM", (46.8852, -56.3159) }, { "PN", (-24.3768, -128.3242) }, { "RE", (-21.1151, 55.5364) }, { "SH", (-15.9650, -5.7089) }, { "SJ", (77.5536, 23.6703) }, { "SX", (18.0425, -63.0548) }, { "TC", (21.6940, -71.7979) }, { "TF", (-49.2804, 69.3486) }, { "TK", (-8.9670, -171.8320) }, { "UM", (19.2823, 166.6470) }, { "VG", (18.4207, -64.6400) }, { "VI", (18.3358, -64.8963) }, { "WF", (-13.7687, -177.1561) }, { "XK", (42.6026, 20.9030) }, { "YT", (-12.8275, 45.1662) }, }; public (double Latitude, double Longitude)? GetCoordinates(ILocation location) { return location switch { Country country => GetCountryCoordinates(country.Code), _ => null }; } public (double Latitude, double Longitude)? GetCountryCoordinates(string countryCode) { return _countryCoordinates.TryGetValue(countryCode, out (double Latitude, double Longitude) value) ? value : null; } }