diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..920cc070 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +EOL_API_KEY=your_key \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..06e98ad1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ + +package-lock.json + +.env diff --git a/data/cities.json b/data/cities.json new file mode 100644 index 00000000..08085248 --- /dev/null +++ b/data/cities.json @@ -0,0 +1,6002 @@ +[ + { + "name": "Москва", + "lat": 55.7540584, + "lon": 37.62049, + "population": 13010112 + }, + { + "name": "Санкт-Петербург", + "lat": 59.9390012, + "lon": 30.3158184, + "population": 5601911 + }, + { + "name": "г. Новосибирск", + "lat": 55.030187, + "lon": 82.920426, + "population": 1633595 + }, + { + "name": "г. Екатеринбург", + "lat": 56.8387061, + "lon": 60.6054943, + "population": 1544376 + }, + { + "name": "г. Казань", + "lat": 55.7944326, + "lon": 49.1115164, + "population": 1308660 + }, + { + "name": "г. Нижний Новгород", + "lat": 56.326794, + "lon": 44.006495, + "population": 1226076 + }, + { + "name": "г. Челябинск", + "lat": 55.1602292, + "lon": 61.4007614, + "population": 1189525 + }, + { + "name": "г. Красноярск", + "lat": 56.0095312, + "lon": 92.8525234, + "population": 1187771 + }, + { + "name": "г. Самара", + "lat": 53.1951774, + "lon": 50.1069625, + "population": 1173299 + }, + { + "name": "г. Уфа", + "lat": 54.734856, + "lon": 55.9577802, + "population": 1144809 + }, + { + "name": "г. Ростов-на-Дону", + "lat": 47.2180329, + "lon": 39.6902714, + "population": 1142162 + }, + { + "name": "г. Омск", + "lat": 54.9849581, + "lon": 73.3675684, + "population": 1125695 + }, + { + "name": "г. Краснодар", + "lat": 45.035453, + "lon": 38.975301, + "population": 1099344 + }, + { + "name": "г. Воронеж", + "lat": 51.6593943, + "lon": 39.196922, + "population": 1057681 + }, + { + "name": "г. Пермь", + "lat": 58.0102668, + "lon": 56.2342725, + "population": 1034002 + }, + { + "name": "г. Волгоград", + "lat": 48.7071653, + "lon": 44.5170212, + "population": 1028036 + }, + { + "name": "г. Саратов", + "lat": 51.533557, + "lon": 46.034257, + "population": 901361 + }, + { + "name": "г. Тюмень", + "lat": 57.1531178, + "lon": 65.5343535, + "population": 847488 + }, + { + "name": "г. Тольятти", + "lat": 53.5205003, + "lon": 49.3895011, + "population": 684709 + }, + { + "name": "г. Барнаул", + "lat": 53.3479774, + "lon": 83.7798977, + "population": 630877 + }, + { + "name": "г. Ижевск", + "lat": 56.8528384, + "lon": 53.211509, + "population": 623472 + }, + { + "name": "г. Махачкала", + "lat": 42.9849039, + "lon": 47.5045541, + "population": 623254 + }, + { + "name": "г. Хабаровск", + "lat": 48.4648124, + "lon": 135.0598539, + "population": 617441 + }, + { + "name": "г. Ульяновск", + "lat": 54.3079032, + "lon": 48.3748473, + "population": 617352 + }, + { + "name": "г. Иркутск", + "lat": 52.2863483, + "lon": 104.2806793, + "population": 617264 + }, + { + "name": "г. Владивосток", + "lat": 43.1163208, + "lon": 131.8824988, + "population": 603519 + }, + { + "name": "г. Ярославль", + "lat": 57.6216293, + "lon": 39.8978921, + "population": 577279 + }, + { + "name": "г. Кемерово", + "lat": 55.3910176, + "lon": 86.0469193, + "population": 557119 + }, + { + "name": "г. Томск", + "lat": 56.4846736, + "lon": 84.9482929, + "population": 556478 + }, + { + "name": "г. Набережные Челны", + "lat": 55.6948843, + "lon": 52.3279115, + "population": 548434 + }, + { + "name": "", + "lat": 44.6167087, + "lon": 33.5253617, + "population": 547820 + }, + { + "name": "г. Ставрополь", + "lat": 45.0444563, + "lon": 41.9691349, + "population": 547443 + }, + { + "name": "г. Оренбург", + "lat": 51.7875335, + "lon": 55.1017803, + "population": 543654 + }, + { + "name": "г. Новокузнецк", + "lat": 53.7943459, + "lon": 87.2142908, + "population": 537480 + }, + { + "name": "г. Рязань", + "lat": 54.6255345, + "lon": 39.7359162, + "population": 528599 + }, + { + "name": "г. Балашиха", + "lat": 55.796991, + "lon": 37.938104, + "population": 520962 + }, + { + "name": "г. Пенза", + "lat": 53.1753947, + "lon": 45.0347408, + "population": 501109 + }, + { + "name": "г. Чебоксары", + "lat": 56.125485, + "lon": 47.377328, + "population": 497807 + }, + { + "name": "г. Липецк", + "lat": 52.6101389, + "lon": 39.5947287, + "population": 496403 + }, + { + "name": "г. Калининград", + "lat": 54.7074298, + "lon": 20.5073482, + "population": 490449 + }, + { + "name": "г. Астрахань", + "lat": 46.3656435, + "lon": 48.0559229, + "population": 475629 + }, + { + "name": "г. Тула", + "lat": 54.1918898, + "lon": 37.6153644, + "population": 473622 + }, + { + "name": "г. Киров", + "lat": 58.6034972, + "lon": 49.6680445, + "population": 468212 + }, + { + "name": "г. Сочи", + "lat": 43.5855182, + "lon": 39.7229922, + "population": 466078 + }, + { + "name": "г. Курск", + "lat": 51.7303825, + "lon": 36.1925546, + "population": 440052 + }, + { + "name": "г. Улан-Удэ", + "lat": 51.8334492, + "lon": 107.584068, + "population": 437565 + }, + { + "name": "г. Тверь", + "lat": 56.8586556, + "lon": 35.9118279, + "population": 416219 + }, + { + "name": "г. Магнитогорск", + "lat": 53.4072599, + "lon": 58.9791822, + "population": 410594 + }, + { + "name": "г. Сургут", + "lat": 61.2541492, + "lon": 73.396236, + "population": 396443 + }, + { + "name": "г. Брянск", + "lat": 53.2420053, + "lon": 34.3653002, + "population": 379152 + }, + { + "name": "г. Иваново", + "lat": 56.9994066, + "lon": 40.9729071, + "population": 361644 + }, + { + "name": "г. Якутск", + "lat": 62.0280605, + "lon": 129.7324858, + "population": 355443 + }, + { + "name": "г. Владимир", + "lat": 56.1280444, + "lon": 40.4082983, + "population": 349951 + }, + { + "name": "г. Симферополь", + "lat": 44.9482789, + "lon": 34.1001275, + "population": 340540 + }, + { + "name": "г. Белгород", + "lat": 50.5975582, + "lon": 36.5858422, + "population": 339978 + }, + { + "name": "г. Нижний Тагил", + "lat": 57.9102289, + "lon": 59.9814188, + "population": 338966 + }, + { + "name": "г. Калуга", + "lat": 54.506025, + "lon": 36.2516145, + "population": 337058 + }, + { + "name": "г. Чита", + "lat": 52.0338828, + "lon": 113.499487, + "population": 334427 + }, + { + "name": "г. Грозный", + "lat": 43.3178923, + "lon": 45.6981421, + "population": 328533 + }, + { + "name": "г. Волжский", + "lat": 48.7979775, + "lon": 44.7462572, + "population": 321479 + }, + { + "name": "город Смоленск", + "lat": 54.782635, + "lon": 32.045251, + "population": 316570 + }, + { + "name": "г. Подольск", + "lat": 55.4389616, + "lon": 37.5703052, + "population": 314934 + }, + { + "name": "г. Саранск", + "lat": 54.1808234, + "lon": 45.1863143, + "population": 314871 + }, + { + "name": "г. Вологда", + "lat": 59.220501, + "lon": 39.891523, + "population": 313944 + }, + { + "name": "г. Курган", + "lat": 55.4443683, + "lon": 65.3162142, + "population": 310911 + }, + { + "name": "г. Череповец", + "lat": 59.1268743, + "lon": 37.9090556, + "population": 305185 + }, + { + "name": "г. Орёл", + "lat": 52.9671928, + "lon": 36.0695725, + "population": 303169 + }, + { + "name": "г. Архангельск", + "lat": 64.53939, + "lon": 40.5170011, + "population": 301199 + }, + { + "name": "г. Владикавказ", + "lat": 43.020552, + "lon": 44.681905, + "population": 295830 + }, + { + "name": "г. Нижневартовск", + "lat": 60.9397399, + "lon": 76.5695505, + "population": 283256 + }, + { + "name": "г. Йошкар-Ола", + "lat": 56.6343266, + "lon": 47.8999167, + "population": 281248 + }, + { + "name": "г. Стерлитамак", + "lat": 53.6302062, + "lon": 55.9317313, + "population": 277410 + }, + { + "name": "г. Мурманск", + "lat": 68.970663, + "lon": 33.074918, + "population": 270384 + }, + { + "name": "г. Кострома", + "lat": 57.768, + "lon": 40.927, + "population": 267481 + }, + { + "name": "г. Новороссийск", + "lat": 44.7234226, + "lon": 37.7686906, + "population": 262293 + }, + { + "name": "г. Тамбов", + "lat": 52.7211576, + "lon": 41.4522156, + "population": 261803 + }, + { + "name": "г. Химки", + "lat": 55.8888467, + "lon": 37.430372, + "population": 257128 + }, + { + "name": "г. Мытищи", + "lat": 55.9104655, + "lon": 37.7363923, + "population": 255429 + }, + { + "name": "г. Нальчик", + "lat": 43.4846449, + "lon": 43.6070943, + "population": 247054 + }, + { + "name": "г. Таганрог", + "lat": 47.2096599, + "lon": 38.9352459, + "population": 245120 + }, + { + "name": "г. Нижнекамск", + "lat": 55.6312304, + "lon": 51.8144719, + "population": 241479 + }, + { + "name": "г. Благовещенск", + "lat": 50.290659, + "lon": 127.527198, + "population": 241437 + }, + { + "name": "г. Комсомольск-на-Амуре", + "lat": 50.5525092, + "lon": 136.9895507, + "population": 238505 + }, + { + "name": "г. Петрозаводск", + "lat": 61.7889739, + "lon": 34.3596538, + "population": 234897 + }, + { + "name": "г. Королёв", + "lat": 55.9161885, + "lon": 37.854422, + "population": 228095 + }, + { + "name": "г. Шахты", + "lat": 47.7085649, + "lon": 40.2158665, + "population": 226452 + }, + { + "name": "г. Энгельс", + "lat": 51.4855068, + "lon": 46.1267008, + "population": 225428 + }, + { + "name": "г. Великий Новгород", + "lat": 58.5214164, + "lon": 31.2754186, + "population": 224286 + }, + { + "name": "г. Люберцы", + "lat": 55.676499, + "lon": 37.898125, + "population": 224195 + }, + { + "name": "г. Братск", + "lat": 56.1514087, + "lon": 101.6341027, + "population": 224071 + }, + { + "name": "г. Старый Оскол", + "lat": 51.297974, + "lon": 37.833231, + "population": 221676 + }, + { + "name": "город Ангарск", + "lat": 52.544898, + "lon": 103.8884509, + "population": 221296 + }, + { + "name": "г. Сыктывкар", + "lat": 61.6687212, + "lon": 50.8356788, + "population": 220580 + }, + { + "name": "г. Дзержинск", + "lat": 56.2375332, + "lon": 43.4598979, + "population": 218630 + }, + { + "name": "г. Псков", + "lat": 57.819825, + "lon": 28.3950685, + "population": 193082 + }, + { + "name": "г. Орск", + "lat": 51.2292952, + "lon": 58.4752502, + "population": 189195 + }, + { + "name": "г. Красногорск", + "lat": 55.8318647, + "lon": 37.3294489, + "population": 187634 + }, + { + "name": "г. Армавир", + "lat": 45.0011356, + "lon": 41.1324283, + "population": 187177 + }, + { + "name": "г. Абакан", + "lat": 53.7223055, + "lon": 91.4436926, + "population": 184769 + }, + { + "name": "г. Балаково", + "lat": 52.0222817, + "lon": 47.7827796, + "population": 184466 + }, + { + "name": "г. Бийск", + "lat": 52.5392784, + "lon": 85.213843, + "population": 183852 + }, + { + "name": "г. Южно-Сахалинск", + "lat": 46.9667029, + "lon": 142.7212958, + "population": 181587 + }, + { + "name": "г. Одинцово", + "lat": 55.6790296, + "lon": 37.2635177, + "population": 180530 + }, + { + "name": "г. Уссурийск", + "lat": 43.8048438, + "lon": 131.9367538, + "population": 180393 + }, + { + "name": "г. Прокопьевск", + "lat": 53.8604228, + "lon": 86.7183302, + "population": 177819 + }, + { + "name": "г. Рыбинск", + "lat": 58.0484021, + "lon": 38.858475, + "population": 177295 + }, + { + "name": "г. Норильск", + "lat": 69.3489906, + "lon": 88.2009379, + "population": 174453 + }, + { + "name": "г. Волгодонск", + "lat": 47.5165757, + "lon": 42.1984573, + "population": 168048 + }, + { + "name": "г. Сызрань", + "lat": 53.1557162, + "lon": 48.4744217, + "population": 165725 + }, + { + "name": "г. Петропавловск-Камчатский", + "lat": 53.0370074, + "lon": 158.65595, + "population": 164900 + }, + { + "name": "г. Каменск-Уральский", + "lat": 56.4148539, + "lon": 61.9188448, + "population": 164192 + }, + { + "name": "г. Новочеркасск", + "lat": 47.4118469, + "lon": 40.1040646, + "population": 163674 + }, + { + "name": "г. Альметьевск", + "lat": 54.9014385, + "lon": 52.297123, + "population": 163512 + }, + { + "name": "г. Златоуст", + "lat": 55.1714213, + "lon": 59.6726478, + "population": 161774 + }, + { + "name": "г. Северодвинск", + "lat": 64.5625626, + "lon": 39.8182183, + "population": 157213 + }, + { + "name": "г. Хасавюрт", + "lat": 43.2504341, + "lon": 46.5850867, + "population": 155144 + }, + { + "name": "г. Керчь", + "lat": 45.3561252, + "lon": 36.4673129, + "population": 154621 + }, + { + "name": "г. Домодедово", + "lat": 55.436403, + "lon": 37.7666001, + "population": 152404 + }, + { + "name": "г. Салават", + "lat": 53.362823, + "lon": 55.9154367, + "population": 148575 + }, + { + "name": "г. Миасс", + "lat": 55.0552642, + "lon": 60.0791765, + "population": 147995 + }, + { + "name": "г. Копейск", + "lat": 55.1167381, + "lon": 61.6179305, + "population": 147806 + }, + { + "name": "г. Пятигорск", + "lat": 44.041234, + "lon": 43.0660504, + "population": 146473 + }, + { + "name": "г. Электросталь", + "lat": 55.784633, + "lon": 38.444699, + "population": 146403 + }, + { + "name": "г. Майкоп", + "lat": 44.609792, + "lon": 40.1005698, + "population": 143385 + }, + { + "name": "г. Находка", + "lat": 42.8111483, + "lon": 132.8844502, + "population": 139931 + }, + { + "name": "г. Березники", + "lat": 59.4079119, + "lon": 56.8039179, + "population": 138069 + }, + { + "name": "г. Коломна", + "lat": 55.1026926, + "lon": 38.7530213, + "population": 134850 + }, + { + "name": "г. Щёлково", + "lat": 55.9233436, + "lon": 37.9783923, + "population": 134211 + }, + { + "name": "г. Серпухов", + "lat": 54.9226176, + "lon": 37.4033624, + "population": 133793 + }, + { + "name": "г. Ковров", + "lat": 56.3554229, + "lon": 41.3171096, + "population": 132417 + }, + { + "name": "г. Нефтекамск", + "lat": 56.0883752, + "lon": 54.2482411, + "population": 131942 + }, + { + "name": "г. Кисловодск", + "lat": 43.9052745, + "lon": 42.7167964, + "population": 127521 + }, + { + "name": "г. Батайск", + "lat": 47.1382139, + "lon": 39.750662, + "population": 126988 + }, + { + "name": "г. Рубцовск", + "lat": 51.5012963, + "lon": 81.2078042, + "population": 126834 + }, + { + "name": "г. Обнинск", + "lat": 55.0944881, + "lon": 36.6121565, + "population": 125376 + }, + { + "name": "г. Кызыл", + "lat": 51.7190588, + "lon": 94.4376984, + "population": 125241 + }, + { + "name": "г. Дербент", + "lat": 42.0590354, + "lon": 48.2908599, + "population": 124953 + }, + { + "name": "г. Нефтеюганск", + "lat": 61.0881688, + "lon": 72.6163369, + "population": 124732 + }, + { + "name": "г. Назрань", + "lat": 43.2256598, + "lon": 44.7646901, + "population": 122350 + }, + { + "name": "г. Каспийск", + "lat": 42.8916263, + "lon": 47.6366936, + "population": 121140 + }, + { + "name": "г. Долгопрудный", + "lat": 55.9385975, + "lon": 37.5100337, + "population": 120907 + }, + { + "name": "г. Новочебоксарск", + "lat": 56.1095538, + "lon": 47.4791596, + "population": 120375 + }, + { + "name": "г. Новомосковск", + "lat": 54.010957, + "lon": 38.2915047, + "population": 119697 + }, + { + "name": "г. Ессентуки", + "lat": 44.0444693, + "lon": 42.8589782, + "population": 119658 + }, + { + "name": "г. Невинномысск", + "lat": 44.6226742, + "lon": 41.9476424, + "population": 117562 + }, + { + "name": "г. Октябрьский", + "lat": 54.4814637, + "lon": 53.4654836, + "population": 115557 + }, + { + "name": "г. Раменское", + "lat": 55.5495378, + "lon": 38.2728835, + "population": 114537 + }, + { + "name": "г. Первоуральск", + "lat": 56.9080096, + "lon": 59.9429936, + "population": 114450 + }, + { + "name": "г. Михайловск", + "lat": 45.1297467, + "lon": 42.0287477, + "population": 114133 + }, + { + "name": "г. Реутов", + "lat": 55.7582708, + "lon": 37.8618288, + "population": 113871 + }, + { + "name": "г. Черкесск", + "lat": 44.228353, + "lon": 42.048278, + "population": 113226 + }, + { + "name": "г. Жуковский", + "lat": 55.5999747, + "lon": 38.1224066, + "population": 111222 + }, + { + "name": "г. Димитровград", + "lat": 54.2168413, + "lon": 49.6262388, + "population": 110968 + }, + { + "name": "г. Пушкино", + "lat": 56.0104754, + "lon": 37.847161, + "population": 110868 + }, + { + "name": "г. Артем", + "lat": 43.3501868, + "lon": 132.1595835, + "population": 109556 + }, + { + "name": "г. Камышин", + "lat": 50.0652955, + "lon": 45.384535, + "population": 107927 + }, + { + "name": "г. Евпатория", + "lat": 45.190629, + "lon": 33.367634, + "population": 107877 + }, + { + "name": "г. Муром", + "lat": 55.563153, + "lon": 42.0230298, + "population": 107497 + }, + { + "name": "г. Ханты-Мансийск", + "lat": 61.0025598, + "lon": 69.0183366, + "population": 107473 + }, + { + "name": "г. Новый Уренгой", + "lat": 66.0839904, + "lon": 76.6810104, + "population": 107251 + }, + { + "name": "г. Северск", + "lat": 56.6032343, + "lon": 84.881027, + "population": 106648 + }, + { + "name": "г. Орехово-Зуево", + "lat": 55.8164825, + "lon": 38.9368137, + "population": 105745 + }, + { + "name": "г. Арзамас", + "lat": 55.3946343, + "lon": 43.8408135, + "population": 104908 + }, + { + "name": "г. Ногинск", + "lat": 55.8760353, + "lon": 38.4231801, + "population": 103891 + }, + { + "name": "г. Новошахтинск", + "lat": 47.7576743, + "lon": 39.9364541, + "population": 103480 + }, + { + "name": "г. Бердск", + "lat": 54.7582184, + "lon": 83.1071527, + "population": 102850 + }, + { + "name": "г. Элиста", + "lat": 46.30821, + "lon": 44.2702746, + "population": 102583 + }, + { + "name": "г. Сергиев Посад", + "lat": 56.3063854, + "lon": 38.1502956, + "population": 101756 + }, + { + "name": "г. Видное", + "lat": 55.5517857, + "lon": 37.7062236, + "population": 101490 + }, + { + "name": "г. Ачинск", + "lat": 56.2537315, + "lon": 90.4793969, + "population": 100621 + }, + { + "name": "г. Тобольск", + "lat": 58.2017257, + "lon": 68.2538473, + "population": 100352 + }, + { + "name": "г. Ноябрьск", + "lat": 63.1920786, + "lon": 75.4454918, + "population": 100188 + }, + { + "name": "г. Елец", + "lat": 52.6152577, + "lon": 38.528899, + "population": 99875 + }, + { + "name": "г. Зеленодольск", + "lat": 55.8465861, + "lon": 48.500966, + "population": 99137 + }, + { + "name": "г. Новокуйбышевск", + "lat": 53.0994719, + "lon": 49.9477255, + "population": 98306 + }, + { + "name": "г. Воткинск", + "lat": 57.0518828, + "lon": 53.9874914, + "population": 97471 + }, + { + "name": "г. Железногорск", + "lat": 52.3379241, + "lon": 35.3517678, + "population": 97038 + }, + { + "name": "г. Междуреченск", + "lat": 53.6865918, + "lon": 88.0702782, + "population": 96174 + }, + { + "name": "г. Воскресенск", + "lat": 55.3070155, + "lon": 38.7028385, + "population": 95495 + }, + { + "name": "г. Гатчина", + "lat": 59.5651362, + "lon": 30.1281234, + "population": 94377 + }, + { + "name": "г. Серов", + "lat": 59.6047459, + "lon": 60.5752389, + "population": 94211 + }, + { + "name": "г. Саров", + "lat": 54.922813, + "lon": 43.3447953, + "population": 93357 + }, + { + "name": "г. Ленинск-Кузнецкий", + "lat": 54.6674801, + "lon": 86.1796673, + "population": 92244 + }, + { + "name": "г. Сарапул", + "lat": 56.4616582, + "lon": 53.8036826, + "population": 91115 + }, + { + "name": "г. Магадан", + "lat": 59.5681947, + "lon": 150.8086939, + "population": 90757 + }, + { + "name": "г. Мичуринск", + "lat": 52.8913406, + "lon": 40.5103713, + "population": 90451 + }, + { + "name": "г. Соликамск", + "lat": 59.6483298, + "lon": 56.7710196, + "population": 89473 + }, + { + "name": "г. Мурино", + "lat": 60.0448984, + "lon": 30.4573012, + "population": 89083 + }, + { + "name": "г. Чехов", + "lat": 55.1506335, + "lon": 37.4532854, + "population": 89025 + }, + { + "name": "г. Клин", + "lat": 56.3424345, + "lon": 36.7240443, + "population": 88511 + }, + { + "name": "г. Бузулук", + "lat": 52.7881715, + "lon": 52.2623964, + "population": 88341 + }, + { + "name": "г. Глазов", + "lat": 58.1359039, + "lon": 52.6634921, + "population": 87762 + }, + { + "name": "г. Канск", + "lat": 56.2050971, + "lon": 95.7051994, + "population": 86816 + }, + { + "name": "г. Великие Луки", + "lat": 56.343703, + "lon": 30.515671, + "population": 86711 + }, + { + "name": "г. Каменск-Шахтинский", + "lat": 48.3204742, + "lon": 40.2689608, + "population": 86365 + }, + { + "name": "г. Губкин", + "lat": 51.2836227, + "lon": 37.5347995, + "population": 85225 + }, + { + "name": "г. Киселевск", + "lat": 54.0383268, + "lon": 86.6605444, + "population": 83431 + }, + { + "name": "г. Ейск", + "lat": 46.7114714, + "lon": 38.2764767, + "population": 82943 + }, + { + "name": "г. Ивантеевка", + "lat": 55.9741839, + "lon": 37.9208717, + "population": 82827 + }, + { + "name": "г. Лобня", + "lat": 56.0328978, + "lon": 37.4614808, + "population": 82764 + }, + { + "name": "г. Железногорск", + "lat": 56.2528775, + "lon": 93.532226, + "population": 82723 + }, + { + "name": "г. Азов", + "lat": 47.1122112, + "lon": 39.4233596, + "population": 81924 + }, + { + "name": "г. Анапа", + "lat": 44.8948984, + "lon": 37.3162896, + "population": 81863 + }, + { + "name": "г. Бугульма", + "lat": 54.5364489, + "lon": 52.7894083, + "population": 81677 + }, + { + "name": "г. Московский", + "lat": 55.597255, + "lon": 37.359448, + "population": 81309 + }, + { + "name": "г. Геленджик", + "lat": 44.5631183, + "lon": 38.0791049, + "population": 80204 + }, + { + "name": "г. Ухта", + "lat": 63.5563841, + "lon": 53.7013827, + "population": 79899 + }, + { + "name": "г. Юрга", + "lat": 55.7202352, + "lon": 84.8885927, + "population": 79693 + }, + { + "name": "г. Усть-Илимск", + "lat": 58.0189147, + "lon": 102.6855314, + "population": 79570 + }, + { + "name": "г. Всеволожск", + "lat": 60.0190286, + "lon": 30.6456654, + "population": 79038 + }, + { + "name": "г. Новоуральск", + "lat": 57.2472236, + "lon": 60.0955422, + "population": 78479 + }, + { + "name": "г. Кузнецк", + "lat": 53.1130584, + "lon": 46.6052642, + "population": 78390 + }, + { + "name": "г. Бор", + "lat": 56.3565886, + "lon": 44.0645547, + "population": 78372 + }, + { + "name": "г. Кинешма", + "lat": 57.442535, + "lon": 42.1689258, + "population": 77694 + }, + { + "name": "г. Озерск", + "lat": 55.7632143, + "lon": 60.7076521, + "population": 76896 + }, + { + "name": "г. Новотроицк", + "lat": 51.1963401, + "lon": 58.3017089, + "population": 75960 + }, + { + "name": "г. Кропоткин", + "lat": 45.4332835, + "lon": 40.5728945, + "population": 75858 + }, + { + "name": "г. Чайковский", + "lat": 56.7780683, + "lon": 54.1477844, + "population": 75837 + }, + { + "name": "г. Черногорск", + "lat": 53.8258374, + "lon": 91.3259463, + "population": 75745 + }, + { + "name": "г. Усолье-Сибирское", + "lat": 52.7566823, + "lon": 103.6387415, + "population": 74762 + }, + { + "name": "г. Ялта", + "lat": 44.4952969, + "lon": 34.1663516, + "population": 74652 + }, + { + "name": "г. Дубна", + "lat": 56.7416155, + "lon": 37.1756531, + "population": 74183 + }, + { + "name": "г. Балашов", + "lat": 51.5388261, + "lon": 43.1839668, + "population": 74057 + }, + { + "name": "посёлок Коммунарка", + "lat": 55.570388, + "lon": 37.475469, + "population": 73735 + }, + { + "name": "г. Елабуга", + "lat": 55.7566788, + "lon": 52.0545017, + "population": 73630 + }, + { + "name": "г. Новоалтайск", + "lat": 53.4120027, + "lon": 83.9309813, + "population": 73049 + }, + { + "name": "г. Выборг", + "lat": 60.7129589, + "lon": 28.7328799, + "population": 72530 + }, + { + "name": "г. Егорьевск", + "lat": 55.3831202, + "lon": 39.0358883, + "population": 71686 + }, + { + "name": "г. Верхняя Пышма", + "lat": 56.9758868, + "lon": 60.5649684, + "population": 71335 + }, + { + "name": "г. Наро-Фоминск", + "lat": 55.386185, + "lon": 36.734484, + "population": 71121 + }, + { + "name": "г. Минеральные Воды", + "lat": 44.2087295, + "lon": 43.1383447, + "population": 70485 + }, + { + "name": "г. Троицк", + "lat": 54.0843322, + "lon": 61.5587093, + "population": 70301 + }, + { + "name": "г. Чапаевск", + "lat": 52.929023, + "lon": 49.8673246, + "population": 70228 + }, + { + "name": "г. Минусинск", + "lat": 53.7104585, + "lon": 91.6871667, + "population": 70089 + }, + { + "name": "г. Биробиджан", + "lat": 48.7946217, + "lon": 132.9217228, + "population": 70064 + }, + { + "name": "г. Шадринск", + "lat": 56.0871041, + "lon": 63.6297172, + "population": 68609 + }, + { + "name": "г. Белово", + "lat": 54.4221568, + "lon": 86.3037406, + "population": 68542 + }, + { + "name": "г. Туймазы", + "lat": 54.5999395, + "lon": 53.6950191, + "population": 68349 + }, + { + "name": "г. Сертолово", + "lat": 60.1446697, + "lon": 30.209571, + "population": 68241 + }, + { + "name": "г. Буйнакск", + "lat": 42.8213541, + "lon": 47.116407, + "population": 68121 + }, + { + "name": "г. Ишим", + "lat": 56.1104734, + "lon": 69.4797226, + "population": 67614 + }, + { + "name": "г. Кирово-Чепецк", + "lat": 58.5560037, + "lon": 50.0317344, + "population": 66651 + }, + { + "name": "г. Анжеро-Судженск", + "lat": 56.0787454, + "lon": 86.0200409, + "population": 66583 + }, + { + "name": "г. Феодосия", + "lat": 45.0320187, + "lon": 35.382384, + "population": 66293 + }, + { + "name": "г. Дмитров", + "lat": 56.3476745, + "lon": 37.5266195, + "population": 65574 + }, + { + "name": "г. Сосновый Бор", + "lat": 59.904224, + "lon": 29.092209, + "population": 65367 + }, + { + "name": "г. Горно-Алтайск", + "lat": 51.9581885, + "lon": 85.9603499, + "population": 65342 + }, + { + "name": "г. Лыткарино", + "lat": 55.5778267, + "lon": 37.9034779, + "population": 65212 + }, + { + "name": "г. Павловский Посад", + "lat": 55.780723, + "lon": 38.6596371, + "population": 65098 + }, + { + "name": "г. Троицк", + "lat": 55.4844981, + "lon": 37.3067485, + "population": 65043 + }, + { + "name": "г. Белорецк", + "lat": 53.967626, + "lon": 58.4100433, + "population": 64525 + }, + { + "name": "г. Ступино", + "lat": 54.886274, + "lon": 38.078228, + "population": 64412 + }, + { + "name": "г. Гудермес", + "lat": 43.3518339, + "lon": 46.1034832, + "population": 64376 + }, + { + "name": "г. Ишимбай", + "lat": 53.4545688, + "lon": 56.0440089, + "population": 64041 + }, + { + "name": "г. Донской", + "lat": 53.9678617, + "lon": 38.3372254, + "population": 63837 + }, + { + "name": "г. Котельники", + "lat": 55.6599375, + "lon": 37.8631583, + "population": 63728 + }, + { + "name": "г. Кстово", + "lat": 56.1432079, + "lon": 44.1663972, + "population": 63646 + }, + { + "name": "г. Урус-Мартан", + "lat": 43.120175, + "lon": 45.539276, + "population": 63449 + }, + { + "name": "г. Георгиевск", + "lat": 44.14794, + "lon": 43.474254, + "population": 63221 + }, + { + "name": "г. Клинцы", + "lat": 52.752875, + "lon": 32.2337792, + "population": 63059 + }, + { + "name": "г. Нягань", + "lat": 62.1454886, + "lon": 65.3945936, + "population": 63034 + }, + { + "name": "г. Славянск-на-Кубани", + "lat": 45.2604694, + "lon": 38.1259659, + "population": 62985 + }, + { + "name": "г. Кунгур", + "lat": 57.4284056, + "lon": 56.9438416, + "population": 62673 + }, + { + "name": "город Сунжа", + "lat": 43.3203629, + "lon": 45.0477848, + "population": 62078 + }, + { + "name": "г. Туапсе", + "lat": 44.1104007, + "lon": 39.0825379, + "population": 61571 + }, + { + "name": "г. Когалым", + "lat": 62.2639797, + "lon": 74.482946, + "population": 61441 + }, + { + "name": "г. Белогорск", + "lat": 50.921219, + "lon": 128.4737866, + "population": 61440 + }, + { + "name": "г. Лениногорск", + "lat": 54.5966119, + "lon": 52.4433347, + "population": 60993 + }, + { + "name": "город Россошь", + "lat": 50.1701985, + "lon": 39.6226453, + "population": 60879 + }, + { + "name": "г. Алексин", + "lat": 54.5084968, + "lon": 37.0478364, + "population": 60842 + }, + { + "name": "г. Кудрово", + "lat": 59.9076688, + "lon": 30.5119611, + "population": 60791 + }, + { + "name": "г. Борисоглебск", + "lat": 51.3654207, + "lon": 42.1009542, + "population": 60687 + }, + { + "name": "г. Фрязино", + "lat": 55.9589291, + "lon": 38.0409827, + "population": 60580 + }, + { + "name": "г. Гуково", + "lat": 48.0450292, + "lon": 39.9485638, + "population": 60361 + }, + { + "name": "г. Ревда", + "lat": 56.7987642, + "lon": 59.9071644, + "population": 60200 + }, + { + "name": "г. Прохладный", + "lat": 43.7590107, + "lon": 44.010051, + "population": 59938 + }, + { + "name": "г. Березовский", + "lat": 56.9136462, + "lon": 60.7852371, + "population": 59698 + }, + { + "name": "г. Белебей", + "lat": 54.1034535, + "lon": 54.1112181, + "population": 59195 + }, + { + "name": "г. Чистополь", + "lat": 55.3699331, + "lon": 50.6285823, + "population": 58815 + }, + { + "name": "г. Заречный", + "lat": 53.1961885, + "lon": 45.1691136, + "population": 58510 + }, + { + "name": "г. Будённовск", + "lat": 44.781467, + "lon": 44.164948, + "population": 58103 + }, + { + "name": "г. Кумертау", + "lat": 52.756471, + "lon": 55.7970469, + "population": 57949 + }, + { + "name": "г. Сальск", + "lat": 46.475234, + "lon": 41.541039, + "population": 57937 + }, + { + "name": "г. Дзержинский", + "lat": 55.6241057, + "lon": 37.8441593, + "population": 57918 + }, + { + "name": "г. Лабинск", + "lat": 44.6354147, + "lon": 40.7244209, + "population": 57428 + }, + { + "name": "г. Асбест", + "lat": 57.0052534, + "lon": 61.4581769, + "population": 57317 + }, + { + "name": "г. Искитим", + "lat": 54.626704, + "lon": 83.2949994, + "population": 57147 + }, + { + "name": "г. Павлово", + "lat": 55.965103, + "lon": 43.064848, + "population": 57116 + }, + { + "name": "г. Александров", + "lat": 56.3918756, + "lon": 38.7110582, + "population": 57053 + }, + { + "name": "г. Воркута", + "lat": 67.497434, + "lon": 64.0611813, + "population": 56985 + }, + { + "name": "г. Щербинка", + "lat": 55.50868, + "lon": 37.5633253, + "population": 56531 + }, + { + "name": "г. Сибай", + "lat": 52.7204622, + "lon": 58.6663921, + "population": 56514 + }, + { + "name": "г. Мелеуз", + "lat": 52.9589874, + "lon": 55.9282514, + "population": 56505 + }, + { + "name": "г. Котлас", + "lat": 61.2528975, + "lon": 46.6332216, + "population": 56093 + }, + { + "name": "г. Михайловка", + "lat": 50.0708708, + "lon": 43.2401092, + "population": 56031 + }, + { + "name": "г. Избербаш", + "lat": 42.5652081, + "lon": 47.8710684, + "population": 55996 + }, + { + "name": "г. Краснотурьинск", + "lat": 59.7638319, + "lon": 60.1935754, + "population": 55875 + }, + { + "name": "г. Белореченск", + "lat": 44.7652692, + "lon": 39.8781164, + "population": 55870 + }, + { + "name": "г. Ржев", + "lat": 56.2629154, + "lon": 34.3290948, + "population": 55757 + }, + { + "name": "г. Лесосибирск", + "lat": 58.2216981, + "lon": 92.503692, + "population": 55730 + }, + { + "name": "г. Тихорецк", + "lat": 45.8546923, + "lon": 40.1258776, + "population": 55686 + }, + { + "name": "г. Тихвин", + "lat": 59.644619, + "lon": 33.54193, + "population": 55415 + }, + { + "name": "г. Шуя", + "lat": 56.8507513, + "lon": 41.3516168, + "population": 55225 + }, + { + "name": "г. Полевской", + "lat": 56.4958618, + "lon": 60.2366252, + "population": 55182 + }, + { + "name": "г. Щекино", + "lat": 54.0021718, + "lon": 37.5177177, + "population": 55109 + }, + { + "name": "г. Шали", + "lat": 43.1487442, + "lon": 45.9010465, + "population": 55054 + }, + { + "name": "г. Вольск", + "lat": 52.0459603, + "lon": 47.3873, + "population": 55035 + }, + { + "name": "г. Крымск", + "lat": 44.9343723, + "lon": 37.9854857, + "population": 54597 + }, + { + "name": "пгт Яблоновский", + "lat": 44.981266, + "lon": 38.936362, + "population": 54291 + }, + { + "name": "г. Зеленогорск", + "lat": 56.1133542, + "lon": 94.5889359, + "population": 54279 + }, + { + "name": "г. Лиски", + "lat": 50.9945381, + "lon": 39.5183454, + "population": 54147 + }, + { + "name": "г. Черемхово", + "lat": 53.1233358, + "lon": 103.1574108, + "population": 53958 + }, + { + "name": "г. Лысьва", + "lat": 58.0996742, + "lon": 57.8087369, + "population": 53855 + }, + { + "name": "г. Нерюнгри", + "lat": 56.6599502, + "lon": 124.7201885, + "population": 53409 + }, + { + "name": "г. Волжск", + "lat": 55.8623164, + "lon": 48.3715777, + "population": 53013 + }, + { + "name": "г. Мегион", + "lat": 61.0318864, + "lon": 76.102504, + "population": 52887 + }, + { + "name": "г. Вязьма", + "lat": 55.2116645, + "lon": 34.2952096, + "population": 51950 + }, + { + "name": "г. Тимашевск", + "lat": 45.6158949, + "lon": 38.9351457, + "population": 51858 + }, + { + "name": "г. Гусь-Хрустальный", + "lat": 55.6199041, + "lon": 40.6578219, + "population": 51552 + }, + { + "name": "г. Краснокаменск", + "lat": 50.09868, + "lon": 118.034118, + "population": 51137 + }, + { + "name": "г. Кириши", + "lat": 59.449699, + "lon": 32.008705, + "population": 51028 + }, + { + "name": "пгт Нахабино рп", + "lat": 55.840381, + "lon": 37.175899, + "population": 50916 + }, + { + "name": "г. Снежинск", + "lat": 56.0852853, + "lon": 60.73251, + "population": 50619 + }, + { + "name": "г. Жигулевск", + "lat": 53.4012735, + "lon": 49.4944877, + "population": 50466 + }, + { + "name": "г. Кизляр", + "lat": 43.8484072, + "lon": 46.7232534, + "population": 49999 + }, + { + "name": "г. Кингисепп", + "lat": 59.3741261, + "lon": 28.611223, + "population": 49716 + }, + { + "name": "г. Апатиты", + "lat": 67.567731, + "lon": 33.4067789, + "population": 49647 + }, + { + "name": "г. Узловая", + "lat": 53.9731953, + "lon": 38.1764288, + "population": 49427 + }, + { + "name": "г. Краснокамск", + "lat": 58.0820673, + "lon": 55.7478889, + "population": 48778 + }, + { + "name": "г. Балахна", + "lat": 56.4950365, + "lon": 43.575846, + "population": 48569 + }, + { + "name": "г. Свободный", + "lat": 51.3612532, + "lon": 128.122028, + "population": 48517 + }, + { + "name": "г. Солнечногорск", + "lat": 56.185102, + "lon": 36.977631, + "population": 48413 + }, + { + "name": "г. Аксай", + "lat": 47.2675888, + "lon": 39.8755792, + "population": 48372 + }, + { + "name": "г. Лесной", + "lat": 58.6349153, + "lon": 59.7980136, + "population": 48261 + }, + { + "name": "г. Арсеньев", + "lat": 44.1621626, + "lon": 133.2696658, + "population": 47937 + }, + { + "name": "г. Салехард", + "lat": 66.5493706, + "lon": 66.6084227, + "population": 47910 + }, + { + "name": "г. Боровичи", + "lat": 58.3840076, + "lon": 33.9176708, + "population": 47883 + }, + { + "name": "г. Рассказово", + "lat": 52.6538108, + "lon": 41.8743764, + "population": 47644 + }, + { + "name": "г. Курганинск", + "lat": 44.8877061, + "lon": 40.5914627, + "population": 47305 + }, + { + "name": "г. Отрадный", + "lat": 53.380127, + "lon": 51.3440385, + "population": 46984 + }, + { + "name": "г. Донецк", + "lat": 48.3350869, + "lon": 39.9459603, + "population": 46623 + }, + { + "name": "г. Надым", + "lat": 65.528146, + "lon": 72.514417, + "population": 45973 + }, + { + "name": "г. Кашира", + "lat": 54.8532793, + "lon": 38.1904181, + "population": 45922 + }, + { + "name": "г. Вышний Волочек", + "lat": 57.5684471, + "lon": 34.5404365, + "population": 45830 + }, + { + "name": "г. Чусовой", + "lat": 58.2975271, + "lon": 57.8193629, + "population": 45471 + }, + { + "name": "г. Рославль", + "lat": 53.9449217, + "lon": 32.847942, + "population": 45416 + }, + { + "name": "г. Назарово", + "lat": 56.0115024, + "lon": 90.4169443, + "population": 45333 + }, + { + "name": "г. Выкса", + "lat": 55.3206313, + "lon": 42.1679983, + "population": 45240 + }, + { + "name": "г. Саяногорск", + "lat": 53.1007127, + "lon": 91.4122756, + "population": 44872 + }, + { + "name": "г. Чебаркуль", + "lat": 54.9818594, + "lon": 60.3774264, + "population": 44693 + }, + { + "name": "г. Канаш", + "lat": 55.5068806, + "lon": 47.4917914, + "population": 44354 + }, + { + "name": "г. Можга", + "lat": 56.4427514, + "lon": 52.2137584, + "population": 44345 + }, + { + "name": "г. Бирск", + "lat": 55.4156358, + "lon": 55.5583061, + "population": 44295 + }, + { + "name": "г. Березовский", + "lat": 55.6693866, + "lon": 86.2745058, + "population": 44073 + }, + { + "name": "г. Грязи", + "lat": 52.4872943, + "lon": 39.9331152, + "population": 43908 + }, + { + "name": "г. Краснознаменск", + "lat": 55.5978331, + "lon": 37.039529, + "population": 43868 + }, + { + "name": "г. Бугуруслан", + "lat": 53.6522761, + "lon": 52.4326104, + "population": 43593 + }, + { + "name": "г. Радужный", + "lat": 62.1342204, + "lon": 77.458477, + "population": 43577 + }, + { + "name": "г. Ливны", + "lat": 52.4286428, + "lon": 37.6040201, + "population": 43549 + }, + { + "name": "г. Североморск", + "lat": 69.07651, + "lon": 33.4178343, + "population": 43327 + }, + { + "name": "г. Карабулак", + "lat": 43.3055756, + "lon": 44.9095113, + "population": 43037 + }, + { + "name": "г. Рузаевка", + "lat": 54.0582232, + "lon": 44.949083, + "population": 42989 + }, + { + "name": "г. Лангепас", + "lat": 61.2537123, + "lon": 75.1806961, + "population": 42701 + }, + { + "name": "г. Сатка", + "lat": 55.0404006, + "lon": 59.0288229, + "population": 42597 + }, + { + "name": "г. Шелехов", + "lat": 52.2101358, + "lon": 104.0973332, + "population": 41998 + }, + { + "name": "г. Куйбышев", + "lat": 55.445949, + "lon": 78.311108, + "population": 41946 + }, + { + "name": "г. Малоярославец", + "lat": 55.0177696, + "lon": 36.4633694, + "population": 41836 + }, + { + "name": "г. Кореновск", + "lat": 45.4642106, + "lon": 39.4589751, + "population": 41826 + }, + { + "name": "г. Большой Камень", + "lat": 43.1111521, + "lon": 132.3479458, + "population": 41825 + }, + { + "name": "станица Каневская", + "lat": 46.0847521, + "lon": 38.9719273, + "population": 41721 + }, + { + "name": "г. Аргун", + "lat": 43.2917917, + "lon": 45.8722923, + "population": 41622 + }, + { + "name": "г. Темрюк", + "lat": 45.2610243, + "lon": 37.4455473, + "population": 41608 + }, + { + "name": "г. Ярцево", + "lat": 55.0565468, + "lon": 32.6902745, + "population": 41452 + }, + { + "name": "г. Урай", + "lat": 60.1297244, + "lon": 64.8038858, + "population": 41315 + }, + { + "name": "г. Заринск", + "lat": 53.7064163, + "lon": 84.93148, + "population": 41272 + }, + { + "name": "г. Торжок", + "lat": 57.041349, + "lon": 34.9602076, + "population": 41116 + }, + { + "name": "г. Верхняя Салда", + "lat": 58.0466272, + "lon": 60.5560133, + "population": 41034 + }, + { + "name": "г. Лянтор", + "lat": 61.6392893, + "lon": 72.1793962, + "population": 40977 + }, + { + "name": "г. Горячий Ключ", + "lat": 44.6344393, + "lon": 39.1355285, + "population": 40903 + }, + { + "name": "г. Кимры", + "lat": 56.8732554, + "lon": 37.3557008, + "population": 40875 + }, + { + "name": "г. Мариинск", + "lat": 56.2128227, + "lon": 87.7454299, + "population": 40779 + }, + { + "name": "г. Белая Калитва", + "lat": 48.176882, + "lon": 40.8032881, + "population": 40448 + }, + { + "name": "г. Сосновоборск", + "lat": 56.120075, + "lon": 93.3354461, + "population": 40442 + }, + { + "name": "г. Осинники", + "lat": 53.598681, + "lon": 87.3371253, + "population": 40367 + }, + { + "name": "г. Курчатов", + "lat": 51.6605387, + "lon": 35.6571025, + "population": 40318 + }, + { + "name": "г. Апшеронск", + "lat": 44.4583753, + "lon": 39.7301418, + "population": 40289 + }, + { + "name": "г. Пыть-Ях", + "lat": 60.7586475, + "lon": 72.8366942, + "population": 40180 + }, + { + "name": "г. Усть-Лабинск", + "lat": 45.2226625, + "lon": 39.6929278, + "population": 40158 + }, + { + "name": "г. Пугачев", + "lat": 52.0159472, + "lon": 48.797175, + "population": 40127 + }, + { + "name": "г. Мыски", + "lat": 53.7126111, + "lon": 87.8056844, + "population": 40109 + }, + { + "name": "г. Мончегорск", + "lat": 67.9386512, + "lon": 32.9359042, + "population": 39962 + }, + { + "name": "г. Заинск", + "lat": 55.2988956, + "lon": 52.0063163, + "population": 39739 + }, + { + "name": "г. Шебекино", + "lat": 50.4004378, + "lon": 36.8878943, + "population": 39680 + }, + { + "name": "г. Тутаев", + "lat": 57.8674415, + "lon": 39.536868, + "population": 39643 + }, + { + "name": "г. Баксан", + "lat": 43.6819288, + "lon": 43.5344884, + "population": 39593 + }, + { + "name": "г. Абинск", + "lat": 44.8679116, + "lon": 38.1617987, + "population": 39511 + }, + { + "name": "г. Кольчугино", + "lat": 56.3328004, + "lon": 39.391268, + "population": 39410 + }, + { + "name": "г. Стрежевой", + "lat": 60.7327472, + "lon": 77.6039789, + "population": 39169 + }, + { + "name": "г. Моршанск", + "lat": 53.4436449, + "lon": 41.8115193, + "population": 39023 + }, + { + "name": "г. Советск", + "lat": 55.0811102, + "lon": 21.8887115, + "population": 38910 + }, + { + "name": "г. Ялуторовск", + "lat": 56.6546647, + "lon": 66.3121926, + "population": 38853 + }, + { + "name": "г. Новозыбков", + "lat": 52.5371414, + "lon": 31.9357361, + "population": 38680 + }, + { + "name": "г. Изобильный", + "lat": 45.3684383, + "lon": 41.7085873, + "population": 38614 + }, + { + "name": "г. Амурск", + "lat": 50.2345703, + "lon": 136.8791531, + "population": 38606 + }, + { + "name": "г. Волхов", + "lat": 59.9004589, + "lon": 32.3520685, + "population": 38511 + }, + { + "name": "г. Тулун", + "lat": 54.5570223, + "lon": 100.5779905, + "population": 38440 + }, + { + "name": "г. Луга", + "lat": 58.735207, + "lon": 29.847945, + "population": 38407 + }, + { + "name": "г. Сафоново", + "lat": 55.1200105, + "lon": 33.233658, + "population": 38403 + }, + { + "name": "г. Кизилюрт", + "lat": 43.2038278, + "lon": 46.872864, + "population": 38335 + }, + { + "name": "г. Югорск", + "lat": 61.3124125, + "lon": 63.3364948, + "population": 38238 + }, + { + "name": "г. Шатура", + "lat": 55.5778265, + "lon": 39.5445373, + "population": 38230 + }, + { + "name": "г. Ртищево", + "lat": 52.2616938, + "lon": 43.7842747, + "population": 37850 + }, + { + "name": "г. Переславль-Залесский", + "lat": 56.7360013, + "lon": 38.8543687, + "population": 37738 + }, + { + "name": "г. Протвино", + "lat": 54.8705841, + "lon": 37.2182922, + "population": 37735 + }, + { + "name": "г. Южноуральск", + "lat": 54.4490432, + "lon": 61.2581713, + "population": 37478 + }, + { + "name": "г. Истра", + "lat": 55.9061876, + "lon": 36.8600649, + "population": 37474 + }, + { + "name": "г. Качканар", + "lat": 58.7050979, + "lon": 59.4839558, + "population": 37307 + }, + { + "name": "г. Красноуфимск", + "lat": 56.612429, + "lon": 57.7635494, + "population": 37301 + }, + { + "name": "г. Коркино", + "lat": 54.8903864, + "lon": 61.4032939, + "population": 37224 + }, + { + "name": "г. Джанкой", + "lat": 45.7092913, + "lon": 34.3883718, + "population": 37014 + }, + { + "name": "г. Ирбит", + "lat": 57.683808, + "lon": 63.0576929, + "population": 37009 + }, + { + "name": "пгт Маркова рп", + "lat": 52.211106, + "lon": 104.207909, + "population": 36971 + }, + { + "name": "г. Мценск", + "lat": 53.2789769, + "lon": 36.5749963, + "population": 36960 + }, + { + "name": "г. Усть-Кут", + "lat": 56.780878, + "lon": 105.745373, + "population": 36918 + }, + { + "name": "г. Моздок", + "lat": 43.7472597, + "lon": 44.657072, + "population": 36784 + }, + { + "name": "г. Заволжье", + "lat": 56.6404919, + "lon": 43.3870929, + "population": 36763 + }, + { + "name": "г. Кинель", + "lat": 53.2209314, + "lon": 50.6343567, + "population": 36729 + }, + { + "name": "г. Урюпинск", + "lat": 50.7904909, + "lon": 42.0289034, + "population": 36669 + }, + { + "name": "г. Реж", + "lat": 57.3716798, + "lon": 61.38338, + "population": 36585 + }, + { + "name": "г. Алексеевка", + "lat": 50.6299988, + "lon": 38.6881066, + "population": 36578 + }, + { + "name": "станица Динская", + "lat": 45.2362774, + "lon": 39.2405427, + "population": 36576 + }, + { + "name": "г. Ефремов", + "lat": 53.137603, + "lon": 38.117673, + "population": 36545 + }, + { + "name": "г. Малгобек", + "lat": 43.5097018, + "lon": 44.5901112, + "population": 36480 + }, + { + "name": "г. Елизово", + "lat": 53.1829398, + "lon": 158.3884312, + "population": 36240 + }, + { + "name": "г. Вязники", + "lat": 56.2977573, + "lon": 42.268676, + "population": 36203 + }, + { + "name": "г. Алапаевск", + "lat": 57.8476947, + "lon": 61.6695786, + "population": 36189 + }, + { + "name": "г. Учалы", + "lat": 54.3066963, + "lon": 59.4127255, + "population": 36175 + }, + { + "name": "г. Черняховск", + "lat": 54.6245018, + "lon": 21.7969164, + "population": 36128 + }, + { + "name": "г. Кыштым", + "lat": 55.706159, + "lon": 60.5562529, + "population": 36045 + }, + { + "name": "пгт Горячеводский рп", + "lat": 44.0236208, + "lon": 43.0973777, + "population": 36032 + }, + { + "name": "г. Беслан", + "lat": 43.1936637, + "lon": 44.533792, + "population": 35929 + }, + { + "name": "Балаклава", + "lat": 44.501414, + "lon": 33.600037, + "population": 35919 + }, + { + "name": "г. Людиново", + "lat": 53.8701272, + "lon": 34.4385772, + "population": 35874 + }, + { + "name": "г. Звенигород", + "lat": 55.7295881, + "lon": 36.8553623, + "population": 35842 + }, + { + "name": "г. Спасск-Дальний", + "lat": 44.5900901, + "lon": 132.8158275, + "population": 35732 + }, + { + "name": "г. Светлоград", + "lat": 45.3286594, + "lon": 42.856594, + "population": 35703 + }, + { + "name": "г. Красный Сулин", + "lat": 47.883196, + "lon": 40.0781926, + "population": 35697 + }, + { + "name": "г. Фролово", + "lat": 49.7648209, + "lon": 43.6649431, + "population": 35661 + }, + { + "name": "г. Ахтубинск", + "lat": 48.2753708, + "lon": 46.1905298, + "population": 35635 + }, + { + "name": "г. Саянск", + "lat": 54.1108195, + "lon": 102.1802309, + "population": 35561 + }, + { + "name": "станица Ленинградская", + "lat": 46.3449638, + "lon": 39.3907816, + "population": 35561 + }, + { + "name": "г. Апрелевка", + "lat": 55.527617, + "lon": 37.0650837, + "population": 35514 + }, + { + "name": "г. Благовещенск", + "lat": 55.0498049, + "lon": 55.9553149, + "population": 35481 + }, + { + "name": "г. Лесозаводск", + "lat": 45.4780131, + "lon": 133.4185314, + "population": 35433 + }, + { + "name": "г. Печора", + "lat": 65.1486942, + "lon": 57.2239645, + "population": 35254 + }, + { + "name": "г. Богородск", + "lat": 56.1020008, + "lon": 43.5135913, + "population": 35068 + }, + { + "name": "г. Миллерово", + "lat": 48.9259954, + "lon": 40.3982659, + "population": 34841 + }, + { + "name": "г. Азнакаево", + "lat": 54.8597519, + "lon": 53.0744925, + "population": 34750 + }, + { + "name": "г. Сокол", + "lat": 59.4757853, + "lon": 40.1114848, + "population": 34742 + }, + { + "name": "деревня Ватутинки", + "lat": 55.4942411, + "lon": 37.3288668, + "population": 34697 + }, + { + "name": "г. Сланцы", + "lat": 59.1177053, + "lon": 28.0882334, + "population": 34628 + }, + { + "name": "г. Коряжма", + "lat": 61.2886248, + "lon": 47.1002365, + "population": 34523 + }, + { + "name": "г. Тайшет", + "lat": 55.9405482, + "lon": 98.0030449, + "population": 34491 + }, + { + "name": "г. Ликино-Дулёво", + "lat": 55.7077293, + "lon": 38.9577959, + "population": 34191 + }, + { + "name": "г. Тосно", + "lat": 59.540686, + "lon": 30.8777641, + "population": 34066 + }, + { + "name": "г. Мирный", + "lat": 62.5362564, + "lon": 113.9667642, + "population": 34045 + }, + { + "name": "г. Новокубанск", + "lat": 45.1036986, + "lon": 41.0475442, + "population": 34000 + }, + { + "name": "г. Нурлат", + "lat": 54.4281036, + "lon": 50.8049432, + "population": 33990 + }, + { + "name": "г. Шарыпово", + "lat": 55.5391274, + "lon": 89.1801041, + "population": 33961 + }, + { + "name": "г. Корсаков", + "lat": 46.6324255, + "lon": 142.7994957, + "population": 33950 + }, + { + "name": "г. Можайск", + "lat": 55.5069403, + "lon": 36.0239829, + "population": 33880 + }, + { + "name": "г. Партизанск", + "lat": 43.1504279, + "lon": 133.1666126, + "population": 33832 + }, + { + "name": "г. Дальнегорск", + "lat": 44.5541197, + "lon": 135.566156, + "population": 33655 + }, + { + "name": "г. Конаково", + "lat": 56.7275398, + "lon": 36.801348, + "population": 33560 + }, + { + "name": "г. Каменка", + "lat": 53.1855489, + "lon": 44.0468101, + "population": 33491 + }, + { + "name": "г. Гулькевичи", + "lat": 45.3605339, + "lon": 40.6918433, + "population": 33357 + }, + { + "name": "г. Новодвинск", + "lat": 64.4136473, + "lon": 40.8206783, + "population": 33294 + }, + { + "name": "г. Гай", + "lat": 51.4650759, + "lon": 58.4436431, + "population": 33280 + }, + { + "name": "г. Губкинский", + "lat": 64.4456403, + "lon": 76.4713798, + "population": 33273 + }, + { + "name": "деревня Рассказовка", + "lat": 55.6317853, + "lon": 37.3132339, + "population": 33259 + }, + { + "name": "г. Нарткала", + "lat": 43.5578132, + "lon": 43.8576082, + "population": 33203 + }, + { + "name": "г. Зеленокумск", + "lat": 44.4032361, + "lon": 43.8841172, + "population": 33187 + }, + { + "name": "пгт Приволжский рп", + "lat": 51.4109503, + "lon": 46.0481131, + "population": 33096 + }, + { + "name": "г. Валуйки", + "lat": 50.211172, + "lon": 38.0999436, + "population": 33032 + }, + { + "name": "г. Чернушка", + "lat": 56.515934, + "lon": 56.0764463, + "population": 32991 + }, + { + "name": "г. Тавда", + "lat": 58.0434995, + "lon": 65.274369, + "population": 32749 + }, + { + "name": "г. Сухой Лог", + "lat": 56.9074957, + "lon": 62.0357985, + "population": 32748 + }, + { + "name": "г. Углич", + "lat": 57.522461, + "lon": 38.3018763, + "population": 32719 + }, + { + "name": "г. Трехгорный", + "lat": 54.8177944, + "lon": 58.4463721, + "population": 32463 + }, + { + "name": "г. Камень-на-Оби", + "lat": 53.7914749, + "lon": 81.3545962, + "population": 32385 + }, + { + "name": "г. Алатырь", + "lat": 54.8372699, + "lon": 46.5339898, + "population": 32265 + }, + { + "name": "г. Кулебаки", + "lat": 55.4296716, + "lon": 42.5124575, + "population": 32184 + }, + { + "name": "г. Усинск", + "lat": 65.9940586, + "lon": 57.5569288, + "population": 32182 + }, + { + "name": "г. Острогожск", + "lat": 50.867943, + "lon": 39.0406177, + "population": 31699 + }, + { + "name": "станица Новотитаровская", + "lat": 45.2376345, + "lon": 38.9765189, + "population": 31520 + }, + { + "name": "г. Дагестанские Огни", + "lat": 42.1152854, + "lon": 48.193977, + "population": 31412 + }, + { + "name": "г. Алушта", + "lat": 44.6763996, + "lon": 34.4100439, + "population": 31364 + }, + { + "name": "г. Тейково", + "lat": 56.8542792, + "lon": 40.5353799, + "population": 31305 + }, + { + "name": "г. Дюртюли", + "lat": 55.4848147, + "lon": 54.8524883, + "population": 31185 + }, + { + "name": "село Иглино", + "lat": 54.834468, + "lon": 56.416165, + "population": 31169 + }, + { + "name": "г. Советский", + "lat": 61.3707009, + "lon": 63.5667177, + "population": 31138 + }, + { + "name": "г. Усть-Джегута", + "lat": 44.0838556, + "lon": 41.9710356, + "population": 31137 + }, + { + "name": "г. Приморско-Ахтарск", + "lat": 46.0515858, + "lon": 38.1704382, + "population": 31087 + }, + { + "name": "Фактория", + "lat": 64.53939, + "lon": 40.5170011, + "population": 31008 + }, + { + "name": "г. Кохма", + "lat": 56.9325054, + "lon": 41.0931324, + "population": 30940 + }, + { + "name": "г. Благодарный", + "lat": 45.098943, + "lon": 43.4306154, + "population": 30827 + }, + { + "name": "село Ачхой-Мартан", + "lat": 43.1872011, + "lon": 45.2863481, + "population": 30739 + }, + { + "name": "г. Дедовск", + "lat": 55.8704582, + "lon": 37.124447, + "population": 30731 + }, + { + "name": "г. Вичуга", + "lat": 57.2044884, + "lon": 41.9131422, + "population": 30694 + }, + { + "name": "город Нововоронеж", + "lat": 51.3091935, + "lon": 39.216289, + "population": 30658 + }, + { + "name": "г. Зима", + "lat": 53.9336544, + "lon": 102.0498973, + "population": 30640 + }, + { + "name": "станица Кущевская", + "lat": 46.569894, + "lon": 39.619836, + "population": 30375 + }, + { + "name": "г. Обь", + "lat": 54.9945378, + "lon": 82.6937661, + "population": 30369 + }, + { + "name": "станица Староминская", + "lat": 46.5331093, + "lon": 39.0535727, + "population": 30362 + }, + { + "name": "пгт Томилино рп", + "lat": 55.663107, + "lon": 37.949918, + "population": 30306 + }, + { + "name": "г. Сердобск", + "lat": 52.4697777, + "lon": 44.2123029, + "population": 30220 + }, + { + "name": "г. Богданович", + "lat": 56.7764214, + "lon": 62.0462888, + "population": 30142 + }, + { + "name": "г. Нижнеудинск", + "lat": 54.896942, + "lon": 99.031408, + "population": 29995 + }, + { + "name": "г. Электрогорск", + "lat": 55.8778372, + "lon": 38.7805887, + "population": 29982 + }, + { + "name": "г. Луховицы", + "lat": 54.7659596, + "lon": 39.2706433, + "population": 29889 + }, + { + "name": "г. Вятские Поляны", + "lat": 56.2285162, + "lon": 51.0616058, + "population": 29742 + }, + { + "name": "г. Фурманов", + "lat": 57.2537548, + "lon": 41.1054731, + "population": 29715 + }, + { + "name": "г. Борзя", + "lat": 50.3877136, + "lon": 116.5235118, + "population": 29596 + }, + { + "name": "г. Богородицк", + "lat": 53.7700594, + "lon": 38.1225087, + "population": 29560 + }, + { + "name": "станица Павловская", + "lat": 46.122016, + "lon": 39.781416, + "population": 29514 + }, + { + "name": "г. Гусев", + "lat": 54.5915197, + "lon": 22.1942896, + "population": 29234 + }, + { + "name": "г. Муравленко", + "lat": 63.795443, + "lon": 74.494826, + "population": 29233 + }, + { + "name": "г. Слободской", + "lat": 58.7312106, + "lon": 50.1669806, + "population": 29148 + }, + { + "name": "г. Кандалакша", + "lat": 67.1566641, + "lon": 32.4142961, + "population": 29138 + }, + { + "name": "пгт Краснообск рп", + "lat": 54.921237, + "lon": 82.991197, + "population": 29086 + }, + { + "name": "пгт Дрожжино рп", + "lat": 55.5277293, + "lon": 37.5937701, + "population": 29072 + }, + { + "name": "г. Балабаново", + "lat": 55.1774068, + "lon": 36.656839, + "population": 29029 + }, + { + "name": "г. Лосино-Петровский", + "lat": 55.869566, + "lon": 38.202852, + "population": 29000 + }, + { + "name": "г. Артемовский", + "lat": 57.3384593, + "lon": 61.8945883, + "population": 28943 + }, + { + "name": "г. Добрянка", + "lat": 58.542592, + "lon": 56.293958, + "population": 28782 + }, + { + "name": "г. Маркс", + "lat": 51.7133247, + "lon": 46.7400877, + "population": 28749 + }, + { + "name": "г. Великий Устюг", + "lat": 60.7602824, + "lon": 46.3053948, + "population": 28670 + }, + { + "name": "г. Городец", + "lat": 56.644865, + "lon": 43.4722664, + "population": 28660 + }, + { + "name": "г. Тында", + "lat": 55.1546593, + "lon": 124.7468001, + "population": 28625 + }, + { + "name": "г. Бахчисарай", + "lat": 44.751299, + "lon": 33.8750748, + "population": 28609 + }, + { + "name": "г. Сорочинск", + "lat": 52.4266473, + "lon": 53.1541824, + "population": 28478 + }, + { + "name": "г. Касимов", + "lat": 54.9373071, + "lon": 41.3913313, + "population": 28443 + }, + { + "name": "г. Кудымкар", + "lat": 59.0168409, + "lon": 54.6573613, + "population": 28293 + }, + { + "name": "пгт Власиха", + "lat": 55.680815, + "lon": 37.1902369, + "population": 28240 + }, + { + "name": "пгт Разумное", + "lat": 50.533611, + "lon": 36.689562, + "population": 28192 + }, + { + "name": "г. Ростов", + "lat": 57.2050397, + "lon": 39.4378513, + "population": 28122 + }, + { + "name": "г. Заречный", + "lat": 56.8103256, + "lon": 61.3380277, + "population": 28112 + }, + { + "name": "г. Киров", + "lat": 54.0789799, + "lon": 34.3076309, + "population": 28097 + }, + { + "name": "город Семилуки", + "lat": 51.6951946, + "lon": 39.0188991, + "population": 27938 + }, + { + "name": "г. Славгород", + "lat": 52.999413, + "lon": 78.6458451, + "population": 27900 + }, + { + "name": "г. Аша", + "lat": 54.990582, + "lon": 57.2784381, + "population": 27890 + }, + { + "name": "пгт Энем", + "lat": 44.9263995, + "lon": 38.9107709, + "population": 27717 + }, + { + "name": "г. Барабинск", + "lat": 55.3515169, + "lon": 78.3464604, + "population": 27648 + }, + { + "name": "г. Еманжелинск", + "lat": 54.7554485, + "lon": 61.3243638, + "population": 27632 + }, + { + "name": "посёлок Придорожный", + "lat": 53.0860041, + "lon": 50.1587223, + "population": 27515 + }, + { + "name": "пгт Иноземцево кп", + "lat": 44.0970899, + "lon": 43.0894193, + "population": 27500 + }, + { + "name": "г. Старая Русса", + "lat": 57.9907473, + "lon": 31.355452, + "population": 27487 + }, + { + "name": "г. Дивногорск", + "lat": 55.9577356, + "lon": 92.380129, + "population": 27477 + }, + { + "name": "г. Похвистнево", + "lat": 53.6497658, + "lon": 52.1234466, + "population": 27333 + }, + { + "name": "г. Киржач", + "lat": 56.1486461, + "lon": 38.8635967, + "population": 27318 + }, + { + "name": "пгт Красково дп", + "lat": 55.65879, + "lon": 37.9885476, + "population": 27306 + }, + { + "name": "г. Кушва", + "lat": 58.2825138, + "lon": 59.7647615, + "population": 27306 + }, + { + "name": "г. Мирный", + "lat": 62.764551, + "lon": 40.336094, + "population": 27262 + }, + { + "name": "г. Кировск", + "lat": 59.875234, + "lon": 30.9815172, + "population": 27238 + }, + { + "name": "село Экажево", + "lat": 43.2082923, + "lon": 44.8190051, + "population": 27224 + }, + { + "name": "г. Топки", + "lat": 55.2765207, + "lon": 85.6152094, + "population": 27158 + }, + { + "name": "г. Камышлов", + "lat": 56.8464908, + "lon": 62.7120309, + "population": 27117 + }, + { + "name": "г. Карталы", + "lat": 53.0537382, + "lon": 60.6477347, + "population": 27103 + }, + { + "name": "г. Заводоуковск", + "lat": 56.5028398, + "lon": 66.5513555, + "population": 27100 + }, + { + "name": "деревня Мисайлово", + "lat": 55.5639995, + "lon": 37.8255811, + "population": 27093 + }, + { + "name": "деревня Путилково", + "lat": 55.865253, + "lon": 37.392526, + "population": 27081 + }, + { + "name": "станица Северская", + "lat": 44.8562413, + "lon": 38.6959282, + "population": 26973 + }, + { + "name": "г. Тара", + "lat": 56.9159295, + "lon": 74.3648797, + "population": 26878 + }, + { + "name": "село Засечное", + "lat": 53.105904, + "lon": 45.0717034, + "population": 26878 + }, + { + "name": "г. Шумерля", + "lat": 55.5229338, + "lon": 46.3752894, + "population": 26873 + }, + { + "name": "г. Балтийск", + "lat": 54.6513858, + "lon": 19.9140642, + "population": 26796 + }, + { + "name": "г. Новоалександровск", + "lat": 45.4932983, + "lon": 41.2153595, + "population": 26767 + }, + { + "name": "г. Гурьевск", + "lat": 54.7705454, + "lon": 20.6039948, + "population": 26760 + }, + { + "name": "г. Котовск", + "lat": 52.5923425, + "lon": 41.5102238, + "population": 26694 + }, + { + "name": "село Кочубеевское", + "lat": 44.6907487, + "lon": 41.8242914, + "population": 26645 + }, + { + "name": "г. Майский", + "lat": 43.6283265, + "lon": 44.051839, + "population": 26632 + }, + { + "name": "г. Кувандык", + "lat": 51.4785827, + "lon": 57.3610986, + "population": 26596 + }, + { + "name": "г. Гагарин", + "lat": 55.5526733, + "lon": 34.9950319, + "population": 26500 + }, + { + "name": "г. Красноармейск", + "lat": 56.105426, + "lon": 38.140838, + "population": 26492 + }, + { + "name": "г. Кимовск", + "lat": 53.9698013, + "lon": 38.538127, + "population": 26475 + }, + { + "name": "г. Волоколамск", + "lat": 56.0356464, + "lon": 35.958479, + "population": 26389 + }, + { + "name": "г. Петровск", + "lat": 52.3094724, + "lon": 45.3851898, + "population": 26319 + }, + { + "name": "г. Соль-Илецк", + "lat": 51.1634754, + "lon": 54.9895396, + "population": 26149 + }, + { + "name": "г. Ипатово", + "lat": 45.7181195, + "lon": 42.8970759, + "population": 26122 + }, + { + "name": "г. Костомукша", + "lat": 64.5890912, + "lon": 30.6015362, + "population": 26048 + }, + { + "name": "пгт Малаховка рп", + "lat": 55.6452616, + "lon": 38.0042385, + "population": 25989 + }, + { + "name": "г. Удомля", + "lat": 57.8787641, + "lon": 35.0166208, + "population": 25950 + }, + { + "name": "г. Янаул", + "lat": 56.2649073, + "lon": 54.9297772, + "population": 25908 + }, + { + "name": "г. Карпинск", + "lat": 59.766559, + "lon": 60.0012125, + "population": 25879 + }, + { + "name": "г. Кондопога", + "lat": 62.2059903, + "lon": 34.2681816, + "population": 25851 + }, + { + "name": "г. Коммунар", + "lat": 59.6215741, + "lon": 30.3935534, + "population": 25793 + }, + { + "name": "г. Отрадное", + "lat": 59.7726485, + "lon": 30.798845, + "population": 25706 + }, + { + "name": "г. Холмск", + "lat": 47.0408656, + "lon": 142.0416132, + "population": 25677 + }, + { + "name": "станица Тбилисская", + "lat": 45.3644521, + "lon": 40.2016871, + "population": 25650 + }, + { + "name": "г. Полысаево", + "lat": 54.6054908, + "lon": 86.2809963, + "population": 25631 + }, + { + "name": "г. Красноперекопск", + "lat": 45.9536596, + "lon": 33.792071, + "population": 25569 + }, + { + "name": "г. Киреевск", + "lat": 53.9320407, + "lon": 37.9219941, + "population": 25560 + }, + { + "name": "пгт Мостовской", + "lat": 44.4144395, + "lon": 40.790292, + "population": 25548 + }, + { + "name": "г. Лабытнанги", + "lat": 66.6593565, + "lon": 66.3881811, + "population": 25501 + }, + { + "name": "село Александровское", + "lat": 44.7105748, + "lon": 43.0049484, + "population": 25479 + }, + { + "name": "город Десногорск", + "lat": 54.1463618, + "lon": 33.2834089, + "population": 25414 + }, + { + "name": "г. Алейск", + "lat": 52.4922482, + "lon": 82.7795177, + "population": 25380 + }, + { + "name": "г. Десногорск", + "lat": 54.1463618, + "lon": 33.2834089, + "population": 25345 + }, + { + "name": "г. Дятьково", + "lat": 53.5958143, + "lon": 34.355106, + "population": 25255 + }, + { + "name": "г. Скопин", + "lat": 53.8235282, + "lon": 39.5493392, + "population": 25238 + }, + { + "name": "пгт Калининец рп", + "lat": 55.559738, + "lon": 36.981914, + "population": 25082 + }, + { + "name": "г. Семенов", + "lat": 56.7890706, + "lon": 44.4902872, + "population": 25075 + }, + { + "name": "пгт Ильский", + "lat": 44.804549, + "lon": 38.546089, + "population": 24932 + }, + { + "name": "г. Асино", + "lat": 56.990811, + "lon": 86.1764966, + "population": 24913 + }, + { + "name": "г. Карасук", + "lat": 53.7343642, + "lon": 78.0422879, + "population": 24890 + }, + { + "name": "г. Кировск", + "lat": 67.6151587, + "lon": 33.6636568, + "population": 24857 + }, + { + "name": "станица Ессентукская", + "lat": 44.0267307, + "lon": 42.8764379, + "population": 24710 + }, + { + "name": "пгт Октябрьский рп", + "lat": 55.6110724, + "lon": 37.9737423, + "population": 24704 + }, + { + "name": "г. Знаменск", + "lat": 48.5866454, + "lon": 45.7369007, + "population": 24628 + }, + { + "name": "г. Гусиноозерск", + "lat": 51.2865987, + "lon": 106.5229836, + "population": 24451 + }, + { + "name": "пгт Пойковский", + "lat": 60.996548, + "lon": 71.902431, + "population": 24440 + }, + { + "name": "г. Североуральск", + "lat": 60.1533388, + "lon": 59.952553, + "population": 24428 + }, + { + "name": "г. Бутурлиновка", + "lat": 50.8312775, + "lon": 40.5977424, + "population": 24397 + }, + { + "name": "г. Озёры", + "lat": 54.8540209, + "lon": 38.5598706, + "population": 24359 + }, + { + "name": "г. Саки", + "lat": 45.13433, + "lon": 33.6032255, + "population": 24285 + }, + { + "name": "г. Калач-на-Дону", + "lat": 48.6889101, + "lon": 43.5307585, + "population": 24277 + }, + { + "name": "г. Унеча", + "lat": 52.8461971, + "lon": 32.6757398, + "population": 24274 + }, + { + "name": "г. Морозовск", + "lat": 48.351132, + "lon": 41.8307844, + "population": 24258 + }, + { + "name": "г. Северобайкальск", + "lat": 55.6355591, + "lon": 109.3361645, + "population": 24233 + }, + { + "name": "г. Советская Гавань", + "lat": 48.9663668, + "lon": 140.2852088, + "population": 24231 + }, + { + "name": "станица Полтавская", + "lat": 45.3654401, + "lon": 38.2109117, + "population": 24164 + }, + { + "name": "г. Родники", + "lat": 57.1024811, + "lon": 41.7298234, + "population": 24101 + }, + { + "name": "г. Зерноград", + "lat": 46.849613, + "lon": 40.3128993, + "population": 24076 + }, + { + "name": "пгт Северный", + "lat": 50.6774988, + "lon": 36.5607698, + "population": 24070 + }, + { + "name": "деревня Новое Девяткино", + "lat": 60.0572998, + "lon": 30.4762703, + "population": 23988 + }, + { + "name": "посёлок Тельмана", + "lat": 59.725444, + "lon": 30.612106, + "population": 23986 + }, + { + "name": "г. Карачаевск", + "lat": 43.7731804, + "lon": 41.9144084, + "population": 23867 + }, + { + "name": "станица Елизаветинская", + "lat": 45.0484348, + "lon": 38.7999276, + "population": 23841 + }, + { + "name": "г. Строитель", + "lat": 50.785172, + "lon": 36.486998, + "population": 23780 + }, + { + "name": "г. Татарск", + "lat": 55.2144722, + "lon": 75.9740764, + "population": 23711 + }, + { + "name": "г. Медногорск", + "lat": 51.4038655, + "lon": 57.5831571, + "population": 23693 + }, + { + "name": "пгт Федоровский", + "lat": 61.6484245, + "lon": 73.488652, + "population": 23614 + }, + { + "name": "г. Дальнереченск", + "lat": 45.9308807, + "lon": 133.7316844, + "population": 23613 + }, + { + "name": "пгт Афипский", + "lat": 44.9034044, + "lon": 38.8411512, + "population": 23592 + }, + { + "name": "г. Уварово", + "lat": 51.983084, + "lon": 42.261, + "population": 23584 + }, + { + "name": "г. Сегежа", + "lat": 63.7437691, + "lon": 34.3126737, + "population": 23543 + }, + { + "name": "г Курчалой", + "lat": 43.2045354, + "lon": 46.0889297, + "population": 23425 + }, + { + "name": "г. Нарьян-Мар", + "lat": 67.6379742, + "lon": 53.0069529, + "population": 23399 + }, + { + "name": "г. Губаха", + "lat": 58.8370347, + "lon": 57.5544775, + "population": 23397 + }, + { + "name": "г. Среднеуральск", + "lat": 56.9919113, + "lon": 60.4771159, + "population": 23344 + }, + { + "name": "г. Кубинка", + "lat": 55.6790296, + "lon": 37.2635177, + "population": 23146 + }, + { + "name": "г. Нефтекумск", + "lat": 44.7545311, + "lon": 44.9865999, + "population": 23137 + }, + { + "name": "станица Троицкая", + "lat": 43.3060175, + "lon": 44.9893927, + "population": 23078 + }, + { + "name": "пгт Свердловский рп", + "lat": 55.9032059, + "lon": 38.1361082, + "population": 23058 + }, + { + "name": "станица Отрадная", + "lat": 44.39317, + "lon": 41.5156681, + "population": 23041 + }, + { + "name": "г. Верхний Уфалей", + "lat": 56.0487398, + "lon": 60.2320146, + "population": 22981 + }, + { + "name": "пгт Городище рп", + "lat": 48.8096322, + "lon": 44.4761656, + "population": 22905 + }, + { + "name": "г. Старая Купавна", + "lat": 55.810648, + "lon": 38.175624, + "population": 22898 + }, + { + "name": "г. Менделеевск", + "lat": 55.8951887, + "lon": 52.3143634, + "population": 22875 + }, + { + "name": "г. Железноводск", + "lat": 44.1320536, + "lon": 43.0304695, + "population": 22863 + }, + { + "name": "г. Голицыно", + "lat": 55.6189919, + "lon": 36.9856491, + "population": 22733 + }, + { + "name": "г. Аткарск", + "lat": 51.8737167, + "lon": 45.000324, + "population": 22709 + }, + { + "name": "пгт Тучково рп", + "lat": 55.6007848, + "lon": 36.4718788, + "population": 22657 + }, + { + "name": "рп Чишмы", + "lat": 54.5892603, + "lon": 55.3803504, + "population": 22597 + }, + { + "name": "г. Лермонтов", + "lat": 44.1053341, + "lon": 42.9731493, + "population": 22444 + }, + { + "name": "посёлок Бугры", + "lat": 60.0700161, + "lon": 30.3997764, + "population": 22428 + }, + { + "name": "город Павловск", + "lat": 50.4533503, + "lon": 40.1369424, + "population": 22384 + }, + { + "name": "г. Тайга", + "lat": 56.1723887, + "lon": 85.4268959, + "population": 22375 + }, + { + "name": "г. Никольское", + "lat": 59.7042138, + "lon": 30.7874065, + "population": 22355 + }, + { + "name": "г. Верещагино", + "lat": 58.0798499, + "lon": 54.6579923, + "population": 22239 + }, + { + "name": "г. Сосногорск", + "lat": 63.599118, + "lon": 53.8762442, + "population": 22189 + }, + { + "name": "г. Гурьевск", + "lat": 54.2859162, + "lon": 85.9477116, + "population": 22134 + }, + { + "name": "г. Хадыженск", + "lat": 44.412253, + "lon": 39.5320316, + "population": 22094 + }, + { + "name": "г. Невьянск", + "lat": 57.4912147, + "lon": 60.218324, + "population": 22061 + }, + { + "name": "г. Тырныауз", + "lat": 43.3981998, + "lon": 42.9214143, + "population": 22056 + }, + { + "name": "г. Котельниково", + "lat": 47.6310339, + "lon": 43.1330384, + "population": 22016 + }, + { + "name": "г. Таштагол", + "lat": 52.7594115, + "lon": 87.8476574, + "population": 21980 + }, + { + "name": "г. Давлеканово", + "lat": 54.222692, + "lon": 55.0311854, + "population": 21834 + }, + { + "name": "г. Бронницы", + "lat": 55.4254542, + "lon": 38.264161, + "population": 21831 + }, + { + "name": "г. Вилючинск", + "lat": 52.9302624, + "lon": 158.4057425, + "population": 21774 + }, + { + "name": "г. Калтан", + "lat": 53.521076, + "lon": 87.2771909, + "population": 21752 + }, + { + "name": "пгт Медведево", + "lat": 56.6332603, + "lon": 47.8032407, + "population": 21752 + }, + { + "name": "г. Вихоревка", + "lat": 56.1208112, + "lon": 101.1704184, + "population": 21719 + }, + { + "name": "г. Семикаракорск", + "lat": 47.517792, + "lon": 40.811485, + "population": 21719 + }, + { + "name": "г. Лысково", + "lat": 56.0262601, + "lon": 45.0357974, + "population": 21657 + }, + { + "name": "г. Сасово", + "lat": 54.3508047, + "lon": 41.9117508, + "population": 21628 + }, + { + "name": "г. Бавлы", + "lat": 54.4063524, + "lon": 53.2458119, + "population": 21628 + }, + { + "name": "г. Железногорск-Илимский", + "lat": 56.5847582, + "lon": 104.1142358, + "population": 21621 + }, + { + "name": "г. Вельск", + "lat": 61.0658321, + "lon": 42.1032464, + "population": 21613 + }, + { + "name": "г. Алдан", + "lat": 58.6095359, + "lon": 125.3817685, + "population": 21590 + }, + { + "name": "пгт Стройкерамика", + "lat": 53.2766484, + "lon": 50.3870415, + "population": 21567 + }, + { + "name": "г. Алагир", + "lat": 43.0416623, + "lon": 44.2197807, + "population": 21550 + }, + { + "name": "пгт Ахтырский", + "lat": 44.8503138, + "lon": 38.2998264, + "population": 21515 + }, + { + "name": "г. Красноуральск", + "lat": 58.3486753, + "lon": 60.0408929, + "population": 21507 + }, + { + "name": "г. Бежецк", + "lat": 57.7859527, + "lon": 36.6905192, + "population": 21466 + }, + { + "name": "г. Усть-Катав", + "lat": 54.9260247, + "lon": 58.1528932, + "population": 21439 + }, + { + "name": "г. Оленегорск", + "lat": 68.1420962, + "lon": 33.2669298, + "population": 21438 + }, + { + "name": "г. Рошаль", + "lat": 55.6632087, + "lon": 39.8656345, + "population": 21401 + }, + { + "name": "г. Ленск", + "lat": 60.7276227, + "lon": 114.9548502, + "population": 21392 + }, + { + "name": "пгт Излучинск", + "lat": 60.9530651, + "lon": 76.891202, + "population": 21389 + }, + { + "name": "г. Калачинск", + "lat": 55.059708, + "lon": 74.5655042, + "population": 21378 + }, + { + "name": "г. Красноармейск", + "lat": 51.0235479, + "lon": 45.6951366, + "population": 21350 + }, + { + "name": "г. Светлый", + "lat": 54.6773492, + "lon": 20.1356707, + "population": 21114 + }, + { + "name": "г. Рыбное", + "lat": 54.7256308, + "lon": 39.5135902, + "population": 21069 + }, + { + "name": "г. Котово", + "lat": 50.3205819, + "lon": 44.803057, + "population": 21028 + }, + { + "name": "г. Остров", + "lat": 57.3452065, + "lon": 28.3437983, + "population": 20923 + }, + { + "name": "г. Бобров", + "lat": 51.0902207, + "lon": 40.031849, + "population": 20871 + }, + { + "name": "пгт Кольцово рп", + "lat": 54.939754, + "lon": 83.189226, + "population": 20862 + }, + { + "name": "село Дыгулыбгей", + "lat": 43.6605157, + "lon": 43.5399799, + "population": 20852 + }, + { + "name": "г. Колпашево", + "lat": 58.3114151, + "lon": 82.9027717, + "population": 20824 + }, + { + "name": "г. Новопавловск", + "lat": 43.957372, + "lon": 43.631908, + "population": 20781 + }, + { + "name": "г. Тогучин", + "lat": 55.2251228, + "lon": 84.4103609, + "population": 20766 + }, + { + "name": "г. Чегем", + "lat": 43.567119, + "lon": 43.5866245, + "population": 20736 + }, + { + "name": "г. Зарайск", + "lat": 54.7624731, + "lon": 38.8851435, + "population": 20736 + }, + { + "name": "село Карабудахкент", + "lat": 42.7101719, + "lon": 47.5652001, + "population": 20710 + }, + { + "name": "г. Октябрьск", + "lat": 53.1641278, + "lon": 48.6707034, + "population": 20703 + }, + { + "name": "г. Армянск", + "lat": 46.1058917, + "lon": 33.6911918, + "population": 20692 + }, + { + "name": "г. Ряжск", + "lat": 53.7068457, + "lon": 40.0521364, + "population": 20634 + }, + { + "name": "г. Сысерть", + "lat": 56.5005302, + "lon": 60.8190383, + "population": 20634 + }, + { + "name": "г. Буй", + "lat": 58.4733865, + "lon": 41.5306164, + "population": 20564 + }, + { + "name": "пгт Безенчук", + "lat": 52.9844016, + "lon": 49.4332576, + "population": 20516 + }, + { + "name": "г. Исилькуль", + "lat": 54.9095226, + "lon": 71.2815165, + "population": 20515 + }, + { + "name": "г. Хотьково", + "lat": 56.2515987, + "lon": 37.9394556, + "population": 20466 + }, + { + "name": "г. Шарья", + "lat": 58.3760015, + "lon": 45.4060912, + "population": 20439 + }, + { + "name": "г. Нижний Ломов", + "lat": 53.5301144, + "lon": 43.6730824, + "population": 20421 + }, + { + "name": "г. Арск", + "lat": 56.0913566, + "lon": 49.8769472, + "population": 20421 + }, + { + "name": "г. Пикалево", + "lat": 59.5131477, + "lon": 34.1772986, + "population": 20388 + }, + { + "name": "г. Оха", + "lat": 53.5868177, + "lon": 142.9412704, + "population": 20357 + }, + { + "name": "пгт Монино рп", + "lat": 55.8393791, + "lon": 38.1953929, + "population": 20313 + }, + { + "name": "г. Инта", + "lat": 66.0367224, + "lon": 60.1153645, + "population": 20271 + }, + { + "name": "г. Сергач", + "lat": 55.5200817, + "lon": 45.4813786, + "population": 20256 + }, + { + "name": "г. Бологое", + "lat": 57.8855456, + "lon": 34.0537078, + "population": 20234 + }, + { + "name": "г. Котельнич", + "lat": 58.3034526, + "lon": 48.3475879, + "population": 20144 + }, + { + "name": "г. Лебедянь", + "lat": 53.0155445, + "lon": 39.143535, + "population": 20049 + }, + { + "name": "станица Зеленчукская", + "lat": 43.8608392, + "lon": 41.5827377, + "population": 20009 + }, + { + "name": "г. Белоярский", + "lat": 63.7120526, + "lon": 66.6773163, + "population": 19994 + }, + { + "name": "г. Агрыз", + "lat": 56.5234282, + "lon": 52.9943111, + "population": 19991 + }, + { + "name": "г. Нерехта", + "lat": 57.4543591, + "lon": 40.5725027, + "population": 19977 + }, + { + "name": "пгт Боровский рп", + "lat": 57.0437279, + "lon": 65.7219998, + "population": 19972 + }, + { + "name": "г. Буинск", + "lat": 54.964071, + "lon": 48.2901712, + "population": 19968 + }, + { + "name": "станица Выселки", + "lat": 45.5801087, + "lon": 39.6553854, + "population": 19955 + }, + { + "name": "г. Терек", + "lat": 43.4837944, + "lon": 44.140333, + "population": 19948 + }, + { + "name": "село Новая Усмань (часть 2)", + "lat": 51.6440564, + "lon": 39.4129162, + "population": 19939 + }, + { + "name": "г. Черепаново", + "lat": 54.2206618, + "lon": 83.3724671, + "population": 19900 + }, + { + "name": "г. Тарко-Сале", + "lat": 64.9117423, + "lon": 77.7610229, + "population": 19900 + }, + { + "name": "г. Никольск", + "lat": 53.7138244, + "lon": 46.0799725, + "population": 19873 + }, + { + "name": "г. Куровское", + "lat": 55.5790488, + "lon": 38.920837, + "population": 19857 + }, + { + "name": "г. Ковылкино", + "lat": 54.0391206, + "lon": 43.9191408, + "population": 19793 + }, + { + "name": "г. Козьмодемьянск", + "lat": 56.3333702, + "lon": 46.5465866, + "population": 19731 + }, + { + "name": "г. Данков", + "lat": 53.2576888, + "lon": 39.1456386, + "population": 19726 + }, + { + "name": "г. Фокино", + "lat": 42.9707585, + "lon": 132.4110104, + "population": 19711 + }, + { + "name": "пгт Каа-Хем", + "lat": 51.6974519, + "lon": 94.559472, + "population": 19686 + }, + { + "name": "г. Усмань", + "lat": 52.0444077, + "lon": 39.7263813, + "population": 19662 + }, + { + "name": "посёлок Строитель", + "lat": 52.6512001, + "lon": 41.4310661, + "population": 19647 + }, + { + "name": "г. Омутнинск", + "lat": 58.6698906, + "lon": 52.189375, + "population": 19629 + }, + { + "name": "рп Приютово", + "lat": 53.8951581, + "lon": 53.9369819, + "population": 19595 + }, + { + "name": "село Чалтырь", + "lat": 47.2826729, + "lon": 39.4992447, + "population": 19583 + }, + { + "name": "г. Пущино", + "lat": 54.8351813, + "lon": 37.6265045, + "population": 19578 + }, + { + "name": "г. Дудинка", + "lat": 69.4032072, + "lon": 86.1909075, + "population": 19556 + }, + { + "name": "поселок Трудовое", + "lat": 43.3002872, + "lon": 132.0632507, + "population": 19543 + }, + { + "name": "г. Черноголовка", + "lat": 56.0099863, + "lon": 38.3792964, + "population": 19530 + }, + { + "name": "г. Оса", + "lat": 57.2889708, + "lon": 55.468868, + "population": 19523 + }, + { + "name": "пгт Кокошкино дп", + "lat": 55.598467, + "lon": 37.167633, + "population": 19490 + }, + { + "name": "пгт Промышленная", + "lat": 54.916573, + "lon": 85.6376222, + "population": 19484 + }, + { + "name": "пгт Ленинкент", + "lat": 42.9703441, + "lon": 47.3535191, + "population": 19438 + }, + { + "name": "поселок Ойсхара", + "lat": 43.2627893, + "lon": 46.2498555, + "population": 19415 + }, + { + "name": "г. Зея", + "lat": 53.7340347, + "lon": 127.2657094, + "population": 19414 + }, + { + "name": "станица Суворовская", + "lat": 44.1975139, + "lon": 42.6499527, + "population": 19378 + }, + { + "name": "г. Зверево", + "lat": 48.0434167, + "lon": 40.1265252, + "population": 19353 + }, + { + "name": "поселок Игра", + "lat": 57.5401354, + "lon": 53.0861913, + "population": 19319 + }, + { + "name": "село Гойты", + "lat": 43.1609736, + "lon": 45.6212637, + "population": 19198 + }, + { + "name": "станица Брюховецкая", + "lat": 45.8020888, + "lon": 38.9971898, + "population": 19154 + }, + { + "name": "станица Незлобная", + "lat": 44.1168985, + "lon": 43.408563, + "population": 19068 + }, + { + "name": "пгт Березовка", + "lat": 56.037108, + "lon": 93.1266, + "population": 19059 + }, + { + "name": "поселок Ува", + "lat": 56.9820545, + "lon": 52.1873031, + "population": 19057 + }, + { + "name": "г. Арамиль", + "lat": 56.6915504, + "lon": 60.8441135, + "population": 19013 + }, + { + "name": "г. Пролетарск", + "lat": 46.7038132, + "lon": 41.7276002, + "population": 18983 + }, + { + "name": "г. Ардон", + "lat": 43.1755904, + "lon": 44.2956828, + "population": 18956 + }, + { + "name": "г. Лодейное Поле", + "lat": 60.7320844, + "lon": 33.5522164, + "population": 18905 + }, + { + "name": "посёлок Саракташ", + "lat": 51.7830951, + "lon": 56.3652582, + "population": 18789 + }, + { + "name": "г. Приозерск", + "lat": 61.03598, + "lon": 30.115586, + "population": 18777 + }, + { + "name": "станица Холмская", + "lat": 44.848128, + "lon": 38.3892456, + "population": 18699 + }, + { + "name": "г. Кировград", + "lat": 57.4298874, + "lon": 60.0624019, + "population": 18698 + }, + { + "name": "село Раевский", + "lat": 54.0650359, + "lon": 54.932837, + "population": 18698 + }, + { + "name": "г. Николаевск-на-Амуре", + "lat": 53.1461923, + "lon": 140.7110577, + "population": 18631 + }, + { + "name": "г. Нелидово", + "lat": 56.223391, + "lon": 32.7766208, + "population": 18603 + }, + { + "name": "пгт Свободы рп", + "lat": 44.0248348, + "lon": 43.0514483, + "population": 18582 + }, + { + "name": "станица Новопокровская", + "lat": 45.9538509, + "lon": 40.7070143, + "population": 18559 + }, + { + "name": "село Чигири", + "lat": 50.3391503, + "lon": 127.5076851, + "population": 18538 + }, + { + "name": "г. Харабали", + "lat": 47.4089236, + "lon": 47.2525264, + "population": 18514 + }, + { + "name": "г. Няндома", + "lat": 61.6654144, + "lon": 40.2063093, + "population": 18473 + }, + { + "name": "село Автуры", + "lat": 43.163267, + "lon": 46.0031899, + "population": 18446 + }, + { + "name": "г. Нижняя Тура", + "lat": 58.6310449, + "lon": 59.8520228, + "population": 18392 + }, + { + "name": "г. Пласт", + "lat": 54.3691735, + "lon": 60.815252, + "population": 18379 + }, + { + "name": "г. Новый Оскол", + "lat": 50.764439, + "lon": 37.863064, + "population": 18359 + }, + { + "name": "пгт Тарки", + "lat": 42.9445024, + "lon": 47.4957949, + "population": 18233 + }, + { + "name": "г. Суровикино", + "lat": 48.6189098, + "lon": 42.8542126, + "population": 18227 + }, + { + "name": "г. Боготол", + "lat": 56.2098683, + "lon": 89.5300867, + "population": 18206 + }, + { + "name": "рп Южный", + "lat": 53.2513304, + "lon": 83.6947313, + "population": 18098 + }, + { + "name": "г. Ершов", + "lat": 51.35079, + "lon": 48.2763191, + "population": 18095 + }, + { + "name": "г. Нефтегорск", + "lat": 52.79725, + "lon": 51.1638245, + "population": 18076 + }, + { + "name": "пгт Тальменка рп", + "lat": 53.8172662, + "lon": 83.5691716, + "population": 18070 + }, + { + "name": "г. Слюдянка", + "lat": 51.6563035, + "lon": 103.7186495, + "population": 18058 + }, + { + "name": "село Бабаюрт", + "lat": 43.6011227, + "lon": 46.7793044, + "population": 18039 + }, + { + "name": "станица Нестеровская", + "lat": 43.2381741, + "lon": 45.0491681, + "population": 17981 + }, + { + "name": "г. Электроугли", + "lat": 55.7170793, + "lon": 38.219367, + "population": 17944 + }, + { + "name": "г. Кукмор", + "lat": 56.1860939, + "lon": 50.8971592, + "population": 17886 + }, + { + "name": "г. Кяхта", + "lat": 50.3466144, + "lon": 106.453365, + "population": 17877 + }, + { + "name": "пгт Удельная дп", + "lat": 55.6349087, + "lon": 38.049353, + "population": 17846 + }, + { + "name": "г. Судак", + "lat": 44.8505071, + "lon": 34.9761502, + "population": 17834 + }, + { + "name": "г. Баймак", + "lat": 52.5913527, + "lon": 58.3111821, + "population": 17833 + }, + { + "name": "пгт Линево рп", + "lat": 54.4570315, + "lon": 83.3815692, + "population": 17779 + }, + { + "name": "посёлок завода Мосрентген", + "lat": 55.620947, + "lon": 37.473815, + "population": 17758 + }, + { + "name": "г. Покров", + "lat": 55.9167157, + "lon": 39.1733602, + "population": 17747 + }, + { + "name": "село Высокая Гора", + "lat": 55.912126, + "lon": 49.312767, + "population": 17736 + }, + { + "name": "г. Стародуб", + "lat": 52.5853129, + "lon": 32.7603416, + "population": 17687 + }, + { + "name": "г. Жуковка", + "lat": 53.5340871, + "lon": 33.7302336, + "population": 17628 + }, + { + "name": "г. Шахунья", + "lat": 57.6763123, + "lon": 46.6128512, + "population": 17626 + }, + { + "name": "г. Калач", + "lat": 50.4240228, + "lon": 41.0162465, + "population": 17624 + }, + { + "name": "г. Суворов", + "lat": 54.122088, + "lon": 36.490348, + "population": 17598 + }, + { + "name": "посёлок ВНИИССОК", + "lat": 55.6569429, + "lon": 37.2117743, + "population": 17597 + }, + { + "name": "г. Радужный", + "lat": 55.9960812, + "lon": 40.3322223, + "population": 17569 + }, + { + "name": "г. Льгов", + "lat": 51.65971, + "lon": 35.261144, + "population": 17557 + }, + { + "name": "г. Енисейск", + "lat": 58.4485678, + "lon": 92.1650748, + "population": 17537 + }, + { + "name": "село Белая Глина", + "lat": 46.0736706, + "lon": 40.8713114, + "population": 17470 + }, + { + "name": "г. Карачев", + "lat": 53.1296862, + "lon": 34.9887384, + "population": 17449 + }, + { + "name": "г. Белогорск", + "lat": 45.0570816, + "lon": 34.599941, + "population": 17445 + }, + { + "name": "г. Собинка", + "lat": 55.9938217, + "lon": 40.0178919, + "population": 17444 + }, + { + "name": "пгт Лучегорск", + "lat": 46.438443, + "lon": 134.289358, + "population": 17437 + }, + { + "name": "станица Медведовская", + "lat": 45.4491448, + "lon": 39.0101617, + "population": 17404 + }, + { + "name": "пгт Ванино", + "lat": 49.0909744, + "lon": 140.2563927, + "population": 17326 + }, + { + "name": "г. Талдом", + "lat": 56.7308601, + "lon": 37.5276018, + "population": 17317 + }, + { + "name": "пгт Васильево", + "lat": 55.8369276, + "lon": 48.7040265, + "population": 17286 + }, + { + "name": "г. Юрьев-Польский", + "lat": 56.4936868, + "lon": 39.6680526, + "population": 17276 + }, + { + "name": "г. Абдулино", + "lat": 53.6778052, + "lon": 53.6473384, + "population": 17274 + }, + { + "name": "станица Старощербиновская", + "lat": 46.6297567, + "lon": 38.6673969, + "population": 17251 + }, + { + "name": "г. Константиновск", + "lat": 47.5773447, + "lon": 41.0967357, + "population": 17207 + }, + { + "name": "село Бачи-Юрт", + "lat": 43.2209854, + "lon": 46.194994, + "population": 17173 + }, + { + "name": "г. Куса", + "lat": 55.3386556, + "lon": 59.4386134, + "population": 17136 + }, + { + "name": "пгт Коченево рп", + "lat": 55.019014, + "lon": 82.2060574, + "population": 17053 + }, + { + "name": "село Осиново", + "lat": 55.8775039, + "lon": 48.8897995, + "population": 16991 + }, + { + "name": "село Нижнее Казанище", + "lat": 42.760984, + "lon": 47.161627, + "population": 16984 + }, + { + "name": "г. Онега", + "lat": 63.9162842, + "lon": 38.0805165, + "population": 16947 + }, + { + "name": "г. Новомичуринск", + "lat": 54.037654, + "lon": 39.7466785, + "population": 16900 + }, + { + "name": "г. Плавск", + "lat": 53.7095277, + "lon": 37.2862058, + "population": 16893 + }, + { + "name": "село Майма", + "lat": 52.0037707, + "lon": 85.8962579, + "population": 16890 + }, + { + "name": "село Цоци-Юрт", + "lat": 43.2426159, + "lon": 46.0018219, + "population": 16890 + }, + { + "name": "пгт Янино-1", + "lat": 59.945394, + "lon": 30.5611967, + "population": 16886 + }, + { + "name": "деревня Сапроново", + "lat": 55.529323, + "lon": 37.712318, + "population": 16817 + }, + { + "name": "деревня Пыхтино", + "lat": 55.6209417, + "lon": 37.3002729, + "population": 16803 + }, + { + "name": "село Кантышево", + "lat": 43.2281058, + "lon": 44.6484198, + "population": 16783 + }, + { + "name": "г. Козельск", + "lat": 54.0348045, + "lon": 35.7806829, + "population": 16759 + }, + { + "name": "село Краснокумское", + "lat": 44.1748104, + "lon": 43.4967116, + "population": 16702 + }, + { + "name": "г. Нытва", + "lat": 57.9336576, + "lon": 55.3355911, + "population": 16675 + }, + { + "name": "г. Осташков", + "lat": 57.1457822, + "lon": 33.1116377, + "population": 16674 + }, + { + "name": "село Кинель-Черкассы", + "lat": 53.4640756, + "lon": 51.5193824, + "population": 16658 + }, + { + "name": "г. Зеленоградск", + "lat": 54.9599261, + "lon": 20.4752742, + "population": 16625 + }, + { + "name": "село Новая Усмань (часть 1)", + "lat": 51.6440564, + "lon": 39.4129162, + "population": 16601 + }, + { + "name": "пгт Шушенское", + "lat": 53.333753, + "lon": 91.935624, + "population": 16573 + }, + { + "name": "г. Туринск", + "lat": 58.0394946, + "lon": 63.6981776, + "population": 16561 + }, + { + "name": "г. Краснослободск", + "lat": 48.7068501, + "lon": 44.5631832, + "population": 16545 + }, + { + "name": "пгт Агинское", + "lat": 51.1036078, + "lon": 114.5378536, + "population": 16511 + }, + { + "name": "г. Нижняя Салда", + "lat": 58.0749078, + "lon": 60.7025219, + "population": 16505 + }, + { + "name": "г. Шимановск", + "lat": 52.005177, + "lon": 127.7005913, + "population": 16488 + }, + { + "name": "село Плиево", + "lat": 43.2854671, + "lon": 44.8359413, + "population": 16440 + }, + { + "name": "станица Гостагаевская", + "lat": 44.8948984, + "lon": 37.3162896, + "population": 16438 + }, + { + "name": "г. Яровое", + "lat": 52.9252719, + "lon": 78.5729219, + "population": 16424 + }, + { + "name": "город Поворино", + "lat": 51.195289, + "lon": 42.2473555, + "population": 16417 + }, + { + "name": "г. Бакал", + "lat": 54.9406707, + "lon": 58.8051112, + "population": 16345 + }, + { + "name": "г. Инза", + "lat": 53.8549261, + "lon": 46.353359, + "population": 16293 + }, + { + "name": "г. Шумиха", + "lat": 55.2281331, + "lon": 63.2901783, + "population": 16264 + }, + { + "name": "пгт Шексна", + "lat": 59.2361104, + "lon": 38.5112653, + "population": 16246 + }, + { + "name": "г. Бикин", + "lat": 46.8185692, + "lon": 134.2550619, + "population": 16240 + }, + { + "name": "г. Жуков", + "lat": 55.0302319, + "lon": 36.7393387, + "population": 16224 + }, + { + "name": "г. Светлогорск", + "lat": 54.9439073, + "lon": 20.1514612, + "population": 16207 + }, + { + "name": "г. Бокситогорск", + "lat": 59.473579, + "lon": 33.8457452, + "population": 16185 + }, + { + "name": "г. Кирсанов", + "lat": 52.6506577, + "lon": 42.7284824, + "population": 16164 + }, + { + "name": "пгт Рощино", + "lat": 60.2408076, + "lon": 29.6288048, + "population": 16162 + }, + { + "name": "г. Камызяк", + "lat": 46.1106454, + "lon": 48.0732549, + "population": 16154 + }, + { + "name": "пгт Белый Яр", + "lat": 61.260563, + "lon": 73.252472, + "population": 16141 + }, + { + "name": "пгт им. Воровского рп", + "lat": 55.7219506, + "lon": 38.3276944, + "population": 16127 + }, + { + "name": "г. Подпорожье", + "lat": 60.912778, + "lon": 34.1567171, + "population": 16123 + }, + { + "name": "посёлок Дубовое", + "lat": 50.5303214, + "lon": 36.5682872, + "population": 16101 + }, + { + "name": "г. Гаврилов-Ям", + "lat": 57.3091517, + "lon": 39.8544895, + "population": 16084 + }, + { + "name": "село Нартан", + "lat": 43.5054195, + "lon": 43.7016693, + "population": 16075 + }, + { + "name": "г. Покачи", + "lat": 61.7422837, + "lon": 75.5940895, + "population": 16040 + }, + { + "name": "г. Поронайск", + "lat": 49.2387506, + "lon": 143.1008839, + "population": 16026 + }, + { + "name": "г. Руза", + "lat": 55.7015428, + "lon": 36.1959789, + "population": 16014 + }, + { + "name": "г. Мензелинск", + "lat": 55.7270085, + "lon": 53.1005154, + "population": 16008 + }, + { + "name": "деревня Куюки", + "lat": 55.7128384, + "lon": 49.3565309, + "population": 15977 + }, + { + "name": "г. Иланский", + "lat": 56.2375329, + "lon": 96.0673849, + "population": 15945 + }, + { + "name": "посёлок Орловский", + "lat": 46.874451, + "lon": 42.05931, + "population": 15942 + }, + { + "name": "село Каякент", + "lat": 42.3862993, + "lon": 47.9054979, + "population": 15923 + }, + { + "name": "г. Сельцо", + "lat": 53.3739073, + "lon": 34.106007, + "population": 15906 + }, + { + "name": "станица Раевская", + "lat": 44.836305, + "lon": 37.5496436, + "population": 15902 + }, + { + "name": "село Учкекен", + "lat": 43.9390432, + "lon": 42.5155851, + "population": 15849 + }, + { + "name": "г. Райчихинск", + "lat": 49.7941325, + "lon": 129.411213, + "population": 15797 + }, + { + "name": "г. Ковдор", + "lat": 67.5662699, + "lon": 30.4741763, + "population": 15770 + }, + { + "name": "деревня Островцы", + "lat": 55.5912674, + "lon": 37.9926244, + "population": 15752 + }, + { + "name": "село Супсех", + "lat": 44.8948984, + "lon": 37.3162896, + "population": 15736 + }, + { + "name": "г. Кондрово", + "lat": 54.7959825, + "lon": 35.9275777, + "population": 15734 + }, + { + "name": "г. Мамадыш", + "lat": 55.7150947, + "lon": 51.4128069, + "population": 15726 + }, + { + "name": "г. Межгорье", + "lat": 54.2396811, + "lon": 57.9612743, + "population": 15697 + }, + { + "name": "посёлок Зимовники", + "lat": 47.1453719, + "lon": 42.4676643, + "population": 15691 + }, + { + "name": "пгт Емельяново", + "lat": 56.1686437, + "lon": 92.6866976, + "population": 15649 + }, + { + "name": "г. Болотное", + "lat": 55.6692803, + "lon": 84.3906602, + "population": 15644 + }, + { + "name": "г. Кизел", + "lat": 59.0512352, + "lon": 57.6471132, + "population": 15619 + }, + { + "name": "пгт Товарково", + "lat": 54.67724, + "lon": 35.942735, + "population": 15606 + }, + { + "name": "село Поселье", + "lat": 51.8057402, + "lon": 107.5376329, + "population": 15603 + }, + { + "name": "станица Анапская", + "lat": 44.8948984, + "lon": 37.3162896, + "population": 15593 + }, + { + "name": "пгт Семендер", + "lat": 42.9911799, + "lon": 47.4021163, + "population": 15565 + }, + { + "name": "пгт Кратово дп", + "lat": 55.5973949, + "lon": 38.1635172, + "population": 15565 + }, + { + "name": "г. Жирновск", + "lat": 50.9769212, + "lon": 44.7857873, + "population": 15555 + }, + { + "name": "посёлок Навля", + "lat": 52.8301087, + "lon": 34.5066338, + "population": 15536 + }, + { + "name": "пгт Заводской", + "lat": 43.1077853, + "lon": 44.6453692, + "population": 15508 + }, + { + "name": "г. Дегтярск", + "lat": 56.7048, + "lon": 60.0790826, + "population": 15497 + }, + { + "name": "г. Свирск", + "lat": 53.0838888, + "lon": 103.3413682, + "population": 15485 + }, + { + "name": "пгт Сузун рп", + "lat": 53.7891996, + "lon": 82.3161043, + "population": 15482 + }, + { + "name": "г. Ясный", + "lat": 51.0368874, + "lon": 59.8742748, + "population": 15471 + }, + { + "name": "село Подстепки", + "lat": 53.5179261, + "lon": 49.1533951, + "population": 15455 + }, + { + "name": "посёлок Зональная Станция", + "lat": 56.4268771, + "lon": 85.0227819, + "population": 15421 + }, + { + "name": "станица Варениковская", + "lat": 45.1198484, + "lon": 37.6385129, + "population": 15385 + }, + { + "name": "г. Касли", + "lat": 55.8869825, + "lon": 60.7422584, + "population": 15383 + }, + { + "name": "посёлок Усть-Ордынский", + "lat": 52.8052189, + "lon": 104.7536738, + "population": 15364 + }, + { + "name": "село Гехи", + "lat": 43.1606137, + "lon": 45.4742778, + "population": 15352 + }, + { + "name": "г. Новоаннинский", + "lat": 50.5295721, + "lon": 42.6666194, + "population": 15351 + }, + { + "name": "пгт Анна", + "lat": 51.489329, + "lon": 40.4242248, + "population": 15316 + }, + { + "name": "\"посёлок подсобного хозяйства \"\"Воскресенское\"\"\"", + "lat": 55.5296175, + "lon": 37.4458356, + "population": 15293 + }, + { + "name": "г. Нерчинск", + "lat": 51.9594649, + "lon": 116.5853127, + "population": 15290 + }, + { + "name": "село Ахты", + "lat": 41.4591981, + "lon": 47.7495262, + "population": 15285 + }, + { + "name": "г. Магас", + "lat": 43.1686871, + "lon": 44.8131101, + "population": 15271 + }, + { + "name": "г. Ясногорск", + "lat": 54.4794749, + "lon": 37.689663, + "population": 15269 + }, + { + "name": "г. Новоузенск", + "lat": 50.4551199, + "lon": 48.1411389, + "population": 15216 + }, + { + "name": "посёлок Знамя Октября", + "lat": 55.47574, + "lon": 37.538359, + "population": 15199 + }, + { + "name": "село Катар-Юрт", + "lat": 43.1688806, + "lon": 45.370387, + "population": 15199 + }, + { + "name": "пгт Запрудня рп", + "lat": 56.5609117, + "lon": 37.4336132, + "population": 15189 + }, + { + "name": "г. Бородино", + "lat": 55.9053464, + "lon": 94.9022323, + "population": 15174 + }, + { + "name": "пгт Рефтинский", + "lat": 57.0906513, + "lon": 61.6564554, + "population": 15164 + }, + { + "name": "пгт Софрино рп", + "lat": 56.1354141, + "lon": 37.9260237, + "population": 15136 + }, + { + "name": "пгт Вырица", + "lat": 59.4172905, + "lon": 30.3469408, + "population": 15086 + }, + { + "name": "г. Рыльск", + "lat": 51.568137, + "lon": 34.6802211, + "population": 15069 + }, + { + "name": "г. Купино", + "lat": 54.3661206, + "lon": 77.2973372, + "population": 15065 + }, + { + "name": "село Хомутово", + "lat": 52.4652523, + "lon": 104.3620353, + "population": 15064 + }, + { + "name": "пгт Большие Вязёмы рп", + "lat": 55.6291397, + "lon": 37.0053667, + "population": 15060 + }, + { + "name": "г. Петровск-Забайкальский", + "lat": 51.2748412, + "lon": 108.8468131, + "population": 15015 + }, + { + "name": "г. Почеп", + "lat": 52.9153976, + "lon": 33.4745131, + "population": 14991 + }, + { + "name": "г. Палласовка", + "lat": 50.0502023, + "lon": 46.8804085, + "population": 14966 + }, + { + "name": "г. Калининск", + "lat": 51.4993043, + "lon": 44.4710883, + "population": 14949 + }, + { + "name": "г. Щигры", + "lat": 51.8785827, + "lon": 36.8911689, + "population": 14927 + }, + { + "name": "г. Барыш", + "lat": 53.6534032, + "lon": 47.1180501, + "population": 14924 + }, + { + "name": "пгт Чернянка", + "lat": 50.940917, + "lon": 37.804134, + "population": 14896 + }, + { + "name": "г. Сортавала", + "lat": 61.7032224, + "lon": 30.6917823, + "population": 14867 + }, + { + "name": "пгт Грибановский", + "lat": 51.4564459, + "lon": 41.9799021, + "population": 14830 + }, + { + "name": "станица Васюринская", + "lat": 45.1181463, + "lon": 39.4216389, + "population": 14829 + }, + { + "name": "г. Талица", + "lat": 57.0123163, + "lon": 63.7320587, + "population": 14808 + }, + { + "name": "г. Сухиничи", + "lat": 54.0973084, + "lon": 35.344484, + "population": 14806 + }, + { + "name": "г. Куртамыш", + "lat": 54.9369493, + "lon": 64.4203207, + "population": 14806 + }, + { + "name": "г. Заполярный", + "lat": 69.4131822, + "lon": 30.7985579, + "population": 14791 + }, + { + "name": "посёлок Развилка", + "lat": 55.5910519, + "lon": 37.7529499, + "population": 14788 + }, + { + "name": "г. Дубовка", + "lat": 49.0554351, + "lon": 44.8269342, + "population": 14779 + }, + { + "name": "пгт Лесной Городок дп", + "lat": 55.636239, + "lon": 37.212612, + "population": 14765 + }, + { + "name": "г. Белокуриха", + "lat": 51.9961123, + "lon": 84.9839441, + "population": 14735 + }, + { + "name": "г. Цимлянск", + "lat": 47.6477932, + "lon": 42.092975, + "population": 14731 + }, + { + "name": "село Кулунда", + "lat": 52.5661304, + "lon": 78.9368917, + "population": 14708 + }, + { + "name": "пгт Новый Городок", + "lat": 54.3036194, + "lon": 86.2934438, + "population": 14691 + }, + { + "name": "г. Навашино", + "lat": 55.5438077, + "lon": 42.1887675, + "population": 14664 + }, + { + "name": "г. Катав-Ивановск", + "lat": 54.7520677, + "lon": 58.1984888, + "population": 14663 + }, + { + "name": "пгт Ильинский рп", + "lat": 55.6202604, + "lon": 38.1055975, + "population": 14645 + }, + { + "name": "г. Краснозаводск", + "lat": 56.4409201, + "lon": 38.2320198, + "population": 14639 + }, + { + "name": "деревня Кондратово", + "lat": 57.9760676, + "lon": 56.1090821, + "population": 14631 + }, + { + "name": "г. Советск", + "lat": 57.5841376, + "lon": 48.9589455, + "population": 14626 + }, + { + "name": "станица Егорлыкская", + "lat": 46.553251, + "lon": 40.683235, + "population": 14602 + }, + { + "name": "село Кулешовка", + "lat": 47.0857816, + "lon": 39.5270717, + "population": 14568 + }, + { + "name": "пгт Селятино рп", + "lat": 55.5141029, + "lon": 36.9798359, + "population": 14523 + }, + { + "name": "г. Грязовец", + "lat": 58.875883, + "lon": 40.2485948, + "population": 14505 + }, + { + "name": "г. Красновишерск", + "lat": 60.3903039, + "lon": 57.0535948, + "population": 14460 + }, + { + "name": "поселок Балезино", + "lat": 57.983878, + "lon": 53.012307, + "population": 14459 + }, + { + "name": "станица Гиагинская", + "lat": 44.8847971, + "lon": 40.0577305, + "population": 14445 + }, + { + "name": "село Алхан-Кала", + "lat": 43.2624396, + "lon": 45.534823, + "population": 14423 + }, + { + "name": "г. Очер", + "lat": 57.8852534, + "lon": 54.7161526, + "population": 14385 + }, + { + "name": "город Богучар", + "lat": 49.93528, + "lon": 40.5591512, + "population": 14370 + }, + { + "name": "г. Волгореченск", + "lat": 57.4424513, + "lon": 41.1592512, + "population": 14355 + }, + { + "name": "село Донское", + "lat": 45.4672559, + "lon": 41.989783, + "population": 14338 + }, + { + "name": "г. Приволжск", + "lat": 57.380718, + "lon": 41.2807571, + "population": 14332 + }, + { + "name": "станица Старовеличковская", + "lat": 45.4329681, + "lon": 38.7244163, + "population": 14310 + }, + { + "name": "г. Ивдель", + "lat": 60.6945985, + "lon": 60.4245258, + "population": 14306 + }, + { + "name": "г. Чудово", + "lat": 59.1248174, + "lon": 31.6866267, + "population": 14302 + }, + { + "name": "г. Красный Кут", + "lat": 50.9597049, + "lon": 46.9711885, + "population": 14296 + }, + { + "name": "г. Яранск", + "lat": 57.3041231, + "lon": 47.8478976, + "population": 14284 + }, + { + "name": "село Старые-Атаги", + "lat": 43.1229624, + "lon": 45.7414172, + "population": 14280 + }, + { + "name": "пгт Средняя Ахтуба рп", + "lat": 48.7136601, + "lon": 44.8600821, + "population": 14241 + }, + { + "name": "г. Агидель", + "lat": 55.8997421, + "lon": 53.9221357, + "population": 14219 + }, + { + "name": "посёлок Нижнесортымский", + "lat": 62.4428117, + "lon": 71.7652884, + "population": 14217 + }, + { + "name": "рп Усть-Абакан", + "lat": 53.8329508, + "lon": 91.3943386, + "population": 14210 + }, + { + "name": "село Красногвардейское", + "lat": 45.8450489, + "lon": 41.5144643, + "population": 14200 + }, + { + "name": "село Новый Хушет", + "lat": 42.8993406, + "lon": 47.5613354, + "population": 14180 + }, + { + "name": "г. Полярные Зори", + "lat": 67.3738152, + "lon": 32.4891688, + "population": 14146 + }, + { + "name": "посёлок Майский", + "lat": 50.5218213, + "lon": 36.4544411, + "population": 14143 + }, + { + "name": "г. Ужур", + "lat": 55.3142192, + "lon": 89.8334338, + "population": 14134 + }, + { + "name": "г. Шлиссельбург", + "lat": 59.9443081, + "lon": 31.0332835, + "population": 14131 + } +] \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..095027fa --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "websec-2", + "version": "1.0.0", + "description": "1. Получить задание\r 2. Сделать форк данного репозитория\r 3. Выполнить задание согласно полученному варианту\r 4. Сделать PR (pull request) в данный репозиторий \r 6. Исправить замечания после code review\r 7. Получить approve \r 8. Прийти на занятие и защитить работу", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/buddyuchiha/websec-2.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/buddyuchiha/websec-2/issues" + }, + "homepage": "https://github.com/buddyuchiha/websec-2#readme", + "dependencies": { + "axios": "^1.14.0", + "cors": "^2.8.6", + "dotenv": "^17.4.1", + "express": "^5.2.1" + } +} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..b2ac11ca --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,332 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: #f5f7fb; +} + +.app { + display: flex; + flex-direction: column; + height: 100vh; +} + +.header { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + color: #1a1a2e; + padding: 12px 24px; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 15px; + z-index: 10; + box-shadow: 0 2px 20px rgba(0, 0, 0, 0.05); + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.header h1 { + font-size: 1.6rem; + font-weight: 600; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.search-box { + position: relative; + min-width: 280px; +} + +#citySearch { + width: 100%; + padding: 12px 20px; + border: 1px solid #e0e0e0; + border-radius: 30px; + font-size: 14px; + outline: none; + transition: all 0.3s ease; + background: white; +} + +#citySearch:focus { + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.search-results { + position: absolute; + top: 100%; + left: 0; + right: 0; + background: white; + border-radius: 16px; + margin-top: 8px; + max-height: 320px; + overflow-y: auto; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12); + z-index: 1000; + display: none; + border: 1px solid #f0f0f0; +} + +.search-results div { + padding: 12px 18px; + cursor: pointer; + color: #333; + border-bottom: 1px solid #f5f5f5; + transition: background 0.2s; + font-size: 14px; +} + +.search-results div:hover { + background: #f8f9ff; + color: #667eea; +} + +.search-results div:last-child { + border-bottom: none; +} + +.map { + flex: 1; + z-index: 1; + border-radius: 0; +} + +.modal { + display: none; + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); + animation: fadeIn 0.25s ease; +} + +.modal-content { + background: white; + margin: 5% auto; + padding: 24px; + width: 90%; + max-width: 700px; + border-radius: 28px; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + animation: slideUp 0.3s ease; + max-height: 85vh; + overflow-y: auto; +} + +.close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + cursor: pointer; + transition: color 0.2s; + line-height: 1; +} + +.close:hover { + color: #667eea; +} + +.weather-info { + font-size: 14px; + margin-top: 8px; +} + +.weather-info p strong { + font-size: 18px; + color: #1a1a2e; +} + +.weather-info hr { + margin: 16px 0; + border: none; + height: 1px; + background: linear-gradient(90deg, #e0e0e0, #667eea, #e0e0e0); +} + +.forecast-list { + display: flex; + flex-direction: column; + gap: 10px; + margin-top: 16px; +} + +.forecast-day { + background: #f8f9fc; + padding: 12px 16px; + border-radius: 20px; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 12px; + transition: all 0.2s; + border: 1px solid #edf2f7; +} + +.forecast-day:hover { + background: #f0f4ff; + transform: translateX(4px); +} + +.day-name { + font-weight: 700; + min-width: 100px; + color: #4a5568; +} + +.temp, .precip, .wind { + font-size: 13px; + font-weight: 500; +} + +.temp { + color: #e53e3e; +} + +.precip { + color: #3182ce; +} + +.wind { + color: #38a169; +} + +.loader { + text-align: center; + padding: 40px; + font-size: 16px; + color: #667eea; +} + +.loader::before { + content: "🌍"; + display: inline-block; + animation: spin 1s infinite; + font-size: 24px; + margin-right: 10px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +#chartsContainer { + margin-top: 28px; + padding-top: 16px; + border-top: 1px solid #edf2f7; +} + +#chartsContainer h3 { + margin: 24px 0 12px 0; + font-size: 16px; + font-weight: 600; + color: #2d3748; + display: flex; + align-items: center; + gap: 8px; +} + +canvas { + max-width: 100%; + height: auto; + background: #ffffff; + border-radius: 20px; + padding: 12px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes slideUp { + from { + transform: translateY(30px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.modal-content::-webkit-scrollbar { + width: 6px; +} + +.modal-content::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 10px; +} + +.modal-content::-webkit-scrollbar-thumb { + background: #cbd5e0; + border-radius: 10px; +} + +.modal-content::-webkit-scrollbar-thumb:hover { + background: #a0aec0; +} + +@media (max-width: 768px) { + .header { + flex-direction: column; + text-align: center; + padding: 16px; + } + + .search-box { + width: 100%; + min-width: auto; + } + + .header h1 { + font-size: 1.3rem; + } + + .modal-content { + margin: 10% auto; + width: 92%; + padding: 20px; + } + + .forecast-day { + flex-direction: column; + text-align: center; + gap: 6px; + } + + .day-name { + min-width: auto; + } +} + +@media (max-width: 480px) { + .modal-content { + margin: 15% auto; + padding: 16px; + } + + .forecast-day { + padding: 10px; + } + + canvas { + height: 180px !important; + } +} \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 00000000..ff537be6 --- /dev/null +++ b/public/index.html @@ -0,0 +1,45 @@ + + + + + + Прогноз погоды на карте + + + + + +
+
+

🌤 Прогноз погоды

+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js new file mode 100644 index 00000000..fbcb7cc6 --- /dev/null +++ b/public/js/app.js @@ -0,0 +1,295 @@ +let map; +let markers = []; + +$(document).ready(function() { + map = L.map('map').setView([55.7558, 37.6173], 5); + + L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png', { + attribution: '© OSM © CartoDB', + subdomains: 'abcd', + maxZoom: 19 + }).addTo(map); + + loadCities(); + + $('#citySearch').on('input', function() { + const query = $(this).val(); + if (query.length >= 2) { + searchCities(query); + } else { + $('#searchResults').hide(); + } + }); + + $(document).on('click', function(e) { + if (!$(e.target).closest('.search-box').length) { + $('#searchResults').hide(); + } + }); + + $('.close').on('click', function() { + $('#weatherModal').hide(); + }); + + $(window).on('click', function(e) { + if ($(e.target).is('#weatherModal')) { + $('#weatherModal').hide(); + } + }); +}); + +function loadCities() { + $.ajax({ + url: '/api/cities', + method: 'GET', + success: function(cities) { + console.log('✅ Загружено городов:', cities.length); + addMarkersToMap(cities); + }, + error: function(err) { + console.error('❌ Ошибка загрузки городов:', err); + } + }); +} + +function addMarkersToMap(cities) { + markers.forEach(marker => map.removeLayer(marker)); + markers = []; + + cities.forEach(city => { + const marker = L.marker([city.lat, city.lon]) + .bindPopup(`${city.name}
Население: ${city.population.toLocaleString()}
Кликни для прогноза`) + .on('click', function() { + showWeather(city); + }); + marker.addTo(map); + markers.push(marker); + }); + + console.log('Добавлено маркеров:', markers.length); +} + +function searchCities(query) { + $.ajax({ + url: `/api/cities/search?q=${encodeURIComponent(query)}`, + method: 'GET', + success: function(cities) { + showSearchResults(cities); + }, + error: function(err) { + console.error('Ошибка поиска:', err); + } + }); +} + +function showSearchResults(cities) { + const $results = $('#searchResults'); + $results.empty(); + + if (cities.length === 0) { + $results.hide(); + return; + } + + cities.forEach(city => { + $results.append(`
${city.name} (${city.population.toLocaleString()} чел.)
`); + }); + + $results.show(); + + $results.find('div').on('click', function() { + const lat = parseFloat($(this).data('lat')); + const lon = parseFloat($(this).data('lon')); + const name = $(this).data('name'); + + map.setView([lat, lon], 12); + + const marker = markers.find(m => { + const pos = m.getLatLng(); + return Math.abs(pos.lat - lat) < 0.0001 && Math.abs(pos.lng - lon) < 0.0001; + }); + + if (marker) { + marker.openPopup(); + const city = { name, lat, lon }; + showWeather(city); + } + + $('#citySearch').val(name); + $('#searchResults').hide(); + }); +} +function showWeather(city) { + $('#modalCityName').text(city.name); + $('#weatherContent').html('
🌍 Загрузка прогноза...
Запрос к Project Eol API
'); + $('#chartsContainer').hide(); + $('#weatherModal').show(); + + $.ajax({ + url: `/api/weather?lat=${city.lat}&lon=${city.lon}&days=5`, + method: 'GET', + timeout: 15000, + success: function(data) { + console.log('Погода получена:', data); + + if (!data.daily || !data.daily.time || data.daily.time.length === 0) { + $('#weatherContent').html(` +

Нет данных о погоде

+

Попробуйте другой город

+ `); + $('#chartsContainer').hide(); + return; + } + + renderWeather(data, city); + }, + error: function(err) { + console.error('Ошибка:', err); + let errorMsg = 'Не удалось загрузить прогноз'; + if (err.status === 504 || err.status === 0) { + errorMsg += '
Таймаут соединения. API может быть недоступен.'; + } + $('#weatherContent').html(` +

${errorMsg}

+

Проверь соединение или попробуй другой город

+

HTTP статус: ${err.status || 'неизвестно'}

+ `); + $('#chartsContainer').hide(); + } + }); +} + +let tempChart = null; +let precipChart = null; +let windChart = null; + +function renderWeather(data, city) { + const daily = data.daily; + const days = daily.time.length; + + const dates = daily.time.map(d => { + const date = new Date(d); + return date.toLocaleDateString('ru-RU', { weekday: 'short', day: 'numeric' }); + }); + + const tempMax = daily.temperature_2m_max; + const tempMin = daily.temperature_2m_min; + const precip = daily.precipitation_sum; + const wind = daily.wind_speed_10m_max; + + let html = ` +
+

📍 ${city.name}

+
+
+ `; + + for (let i = 0; i < days; i++) { + html += ` +
+
${dates[i]}
+
🌡️ ${tempMin[i]}°...${tempMax[i]}°
+
💧 ${precip[i]} мм
+
💨 ${wind[i]} м/с
+
+ `; + } + + html += `

Графики ниже

`; + + $('#weatherContent').html(html); + + $('#chartsContainer').show(); + + if (tempChart) tempChart.destroy(); + if (precipChart) precipChart.destroy(); + if (windChart) windChart.destroy(); + + const ctxTemp = document.getElementById('tempChart').getContext('2d'); + tempChart = new Chart(ctxTemp, { + type: 'line', + data: { + labels: dates, + datasets: [ + { + label: 'Макс. температура (°C)', + data: tempMax, + borderColor: 'rgb(255, 99, 132)', + backgroundColor: 'rgba(255, 99, 132, 0.1)', + tension: 0.3, + fill: true + }, + { + label: 'Мин. температура (°C)', + data: tempMin, + borderColor: 'rgb(54, 162, 235)', + backgroundColor: 'rgba(54, 162, 235, 0.1)', + tension: 0.3, + fill: true + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: true, + plugins: { + legend: { position: 'top' }, + tooltip: { mode: 'index', intersect: false } + }, + scales: { + y: { title: { display: true, text: 'Температура (°C)' } } + } + } + }); + + const ctxPrecip = document.getElementById('precipChart').getContext('2d'); + precipChart = new Chart(ctxPrecip, { + type: 'bar', + data: { + labels: dates, + datasets: [{ + label: 'Осадки (мм)', + data: precip, + backgroundColor: 'rgba(75, 192, 192, 0.6)', + borderColor: 'rgb(75, 192, 192)', + borderWidth: 1 + }] + }, + options: { + responsive: true, + maintainAspectRatio: true, + plugins: { + legend: { position: 'top' } + }, + scales: { + y: { title: { display: true, text: 'Осадки (мм)' }, beginAtZero: true } + } + } + }); + + const ctxWind = document.getElementById('windChart').getContext('2d'); + windChart = new Chart(ctxWind, { + type: 'line', + data: { + labels: dates, + datasets: [{ + label: 'Скорость ветра (м/с)', + data: wind, + borderColor: 'rgb(153, 102, 255)', + backgroundColor: 'rgba(153, 102, 255, 0.1)', + tension: 0.3, + fill: true + }] + }, + options: { + responsive: true, + maintainAspectRatio: true, + plugins: { + legend: { position: 'top' } + }, + scales: { + y: { title: { display: true, text: 'Ветер (м/с)' }, beginAtZero: true } + } + } + }); +} \ No newline at end of file diff --git a/routes/api.js b/routes/api.js new file mode 100644 index 00000000..e56ba119 --- /dev/null +++ b/routes/api.js @@ -0,0 +1,42 @@ +const express = require('express'); +const router = express.Router(); +const WeatherService = require('../services/weatherService'); + +module.exports = function(cities, apiKey) { + const weatherService = new WeatherService(apiKey); + + router.get('/cities', (req, res) => { + res.json(cities); + }); + + router.get('/cities/search', (req, res) => { + const query = req.query.q?.toLowerCase() || ''; + if (!query || query.length < 2) return res.json([]); + + const filtered = cities + .filter(city => city.name.toLowerCase().includes(query)) + .slice(0, 20); + res.json(filtered); + }); + + // Прогноз погоды + router.get('/weather', async (req, res) => { + const { lat, lon, days = 5 } = req.query; + + if (!lat || !lon) { + return res.status(400).json({ error: 'Не указаны координаты' }); + } + + try { + console.log(`Запрос погоды: lat=${lat}, lon=${lon}`); + const weatherData = await weatherService.fetchWeather(lat, lon, days); + console.log(`огода получена (${weatherData.daily.time.length} дней)`); + res.json(weatherData); + } catch (error) { + console.error('Ошибка погоды:', error.message); + res.json(weatherService.getMockData(days)); + } + }); + + return router; +}; \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 00000000..9181e3b2 --- /dev/null +++ b/server.js @@ -0,0 +1,31 @@ +require('dotenv').config(); +const express = require('express'); +const cors = require('cors'); +const path = require('path'); + +const { loadCities } = require('./utils/citiesLoader'); +const createApiRouter = require('./routes/api'); + +const app = express(); +const PORT = 3000; + +const EOL_API_KEY = process.env.EOL_API_KEY; + +if (!EOL_API_KEY) { + console.error('Нет API ключа в .env'); + process.exit(1); +} + +console.log('API ключ загружен'); + +app.use(cors()); +app.use(express.json()); +app.use(express.static('public')); + +const cities = loadCities(); + +app.use('/api', createApiRouter(cities, EOL_API_KEY)); + +app.listen(PORT, () => { + console.log(`Сервер: http://localhost:${PORT}`); +}); \ No newline at end of file diff --git a/services/weatherService.js b/services/weatherService.js new file mode 100644 index 00000000..65dde131 --- /dev/null +++ b/services/weatherService.js @@ -0,0 +1,99 @@ +const axios = require('axios'); + +class WeatherService { + constructor(apiKey) { + this.apiKey = apiKey; + this.baseUrl = 'https://projecteol.ru/api/weather/'; + } + + getDateRange(days) { + const today = new Date(); + const endDate = new Date(today); + endDate.setDate(today.getDate() + parseInt(days) - 1); + + const startStr = today.toISOString().split('T')[0]; + const endStr = endDate.toISOString().split('T')[0]; + return `${startStr},${endStr}`; + } + + groupByDay(data) { + const dailyForecast = {}; + + data.forEach(item => { + const date = item.dt_forecast.split('T')[0]; + if (!dailyForecast[date]) { + dailyForecast[date] = { + temps: [], + winds: [], + precipitations: [] + }; + } + + let tempCelsius = item.temp_2_cel; + if (tempCelsius === undefined || tempCelsius === null) { + tempCelsius = item.temp_2 - 273.15; + } + + dailyForecast[date].temps.push(tempCelsius); + dailyForecast[date].winds.push(item.wind_speed_10 || 0); + dailyForecast[date].precipitations.push(item.prate || 0); + }); + + return dailyForecast; + } + + formatResponse(dailyForecast, days) { + const daysList = Object.keys(dailyForecast).sort().slice(0, parseInt(days)); + + return { + daily: { + time: daysList, + temperature_2m_max: daysList.map(d => Math.max(...dailyForecast[d].temps)), + temperature_2m_min: daysList.map(d => Math.min(...dailyForecast[d].temps)), + precipitation_sum: daysList.map(d => { + const sum = dailyForecast[d].precipitations.reduce((a, b) => a + b, 0); + return Math.round(sum * 10) / 10; + }), + wind_speed_10m_max: daysList.map(d => Math.max(...dailyForecast[d].winds)) + } + }; + } + + getMockData(days = 5) { + const times = []; + for (let i = 0; i < days; i++) { + const d = new Date(); + d.setDate(d.getDate() + i); + times.push(d.toISOString().split('T')[0]); + } + + return { + daily: { + time: times, + temperature_2m_max: [12, 14, 16, 13, 11], + temperature_2m_min: [5, 7, 8, 6, 4], + precipitation_sum: [2.5, 0, 1.2, 3.0, 0], + wind_speed_10m_max: [15, 12, 18, 14, 10] + } + }; + } + + async fetchWeather(lat, lon, days = 5) { + const dateRange = this.getDateRange(days); + + const response = await axios.get(this.baseUrl, { + params: { + lat: parseFloat(lat), + lon: parseFloat(lon), + date: dateRange, + token: this.apiKey + }, + timeout: 15000 + }); + + const dailyForecast = this.groupByDay(response.data); + return this.formatResponse(dailyForecast, days); + } +} + +module.exports = WeatherService; \ No newline at end of file diff --git a/utils/citiesLoader.js b/utils/citiesLoader.js new file mode 100644 index 00000000..0e0588fa --- /dev/null +++ b/utils/citiesLoader.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +const path = require('path'); + +function loadCities() { + try { + const citiesPath = path.join(__dirname, '..', 'data', 'cities.json'); + const citiesData = fs.readFileSync(citiesPath, 'utf8'); + const cities = JSON.parse(citiesData); + console.log(`Загружено ${cities.length} городов`); + return cities; + } catch (error) { + console.error('Ошибка загрузки городов:', error.message); + return []; + } +} + +module.exports = { loadCities }; \ No newline at end of file