/*
* 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;
}
}