From 3d114672fe588e7e57e323d2db9002baa0e2abae Mon Sep 17 00:00:00 2001 From: lekss361 Date: Tue, 15 Sep 2026 06:44:31 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D0=B8=D0=BE=D0=BD=20=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BA=D0=B8=20=D1=80=D0=B5=D0=B7=D0=BE=D0=BB=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D1=8F=D1=89=D0=B5=D0=B9=20=D0=B3=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D0=B5,=20=D0=B0=20=D0=BD=D0=B5=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=D1=83=D0=B3=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D1=83=20(#3052)=20(#3522)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../region_boundaries/boundaries.geojson.json | 1 + tradein-mvp/backend/app/services/regions.py | 142 +++++++++++++++--- .../tests/test_3051_region_registry.py | 12 +- ...test_3051_region_registry_moscow_oblast.py | 30 ++-- .../test_3052_region_polygon_boundary.py | 68 +++++++++ 5 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 tradein-mvp/backend/app/services/region_boundaries/boundaries.geojson.json create mode 100644 tradein-mvp/backend/tests/test_3052_region_polygon_boundary.py diff --git a/tradein-mvp/backend/app/services/region_boundaries/boundaries.geojson.json b/tradein-mvp/backend/app/services/region_boundaries/boundaries.geojson.json new file mode 100644 index 00000000..54c903de --- /dev/null +++ b/tradein-mvp/backend/app/services/region_boundaries/boundaries.geojson.json @@ -0,0 +1 @@ +{"_source":"OpenStreetMap via Nominatim /lookup, polygon_threshold=0.005, fetched 2026-09-13","_license":"ODbL, © OpenStreetMap contributors","regions":{"50":{"osm_id":51490,"osm_type":"relation","name":"Московская область","geometry":{"type":"Polygon","coordinates":[[[35.1484955,55.9575013],[35.2044862,55.9194568],[35.189813,55.9071534],[35.1992791,55.8891257],[35.2042015,55.8988388],[35.2269271,55.9088826],[35.2086372,55.8941466],[35.2274569,55.8926045],[35.2234361,55.8802176],[35.2495471,55.8600748],[35.2500778,55.847059],[35.2845987,55.8224592],[35.2831689,55.7998299],[35.3301221,55.7939413],[35.3317834,55.773311],[35.3387111,55.7694144],[35.3270644,55.7583363],[35.3447524,55.7437299],[35.3164323,55.7449815],[35.304097,55.734377],[35.3128108,55.7284302],[35.3060406,55.7218457],[35.3173746,55.7210403],[35.3165005,55.7081532],[35.3370212,55.7027704],[35.3297507,55.697327],[35.3383906,55.6915197],[35.3316513,55.687851],[35.3355544,55.6835805],[35.3232503,55.6659814],[35.3370767,55.665767],[35.3511319,55.6430166],[35.3595412,55.6452435],[35.3542896,55.6355454],[35.3826398,55.63067],[35.3950027,55.5940825],[35.3646213,55.5878664],[35.3721381,55.575828],[35.3485767,55.572621],[35.3413642,55.5822278],[35.3010622,55.5817885],[35.296951,55.5756835],[35.2981469,55.5507207],[35.3143266,55.5518028],[35.3066302,55.5465234],[35.3388021,55.538373],[35.3446851,55.5275857],[35.3135699,55.5146266],[35.3254352,55.501841],[35.318356,55.4922939],[35.3247616,55.4802053],[35.2890047,55.4723554],[35.2910364,55.4631608],[35.3133942,55.4504663],[35.3038736,55.4350076],[35.3296583,55.4286921],[35.2977928,55.4124335],[35.3055139,55.3976523],[35.2861922,55.3890081],[35.2909614,55.351858],[35.2807584,55.349625],[35.274107,55.3310688],[35.2586455,55.3298816],[35.2614247,55.3225536],[35.2954035,55.3107693],[35.2939244,55.2910955],[35.3098869,55.2911575],[35.3343746,55.27902],[35.3342215,55.271752],[35.3508862,55.2690624],[35.3604365,55.2436917],[35.4085326,55.2375461],[35.4184993,55.2287057],[35.5082323,55.240189],[35.4969598,55.2500285],[35.5038151,55.2552962],[35.5350043,55.2583874],[35.5606456,55.2504208],[35.5764925,55.2622457],[35.5768354,55.2690493],[35.5606366,55.2758549],[35.5748567,55.280911],[35.5730798,55.2902669],[35.6100763,55.2956693],[35.6163315,55.2882532],[35.6368902,55.2895168],[35.6640767,55.2780646],[35.7067615,55.2909036],[35.7224166,55.2794001],[35.7485294,55.2947159],[35.7934115,55.2611045],[35.8289113,55.262209],[35.8267411,55.254675],[35.8176762,55.2576027],[35.8144267,55.2460111],[35.8428331,55.2323148],[35.8866238,55.2380954],[35.8885982,55.2478985],[35.9305037,55.2324186],[35.9588793,55.2417997],[35.9959832,55.2175168],[36.0220261,55.2143613],[36.020911,55.2204367],[36.0453665,55.2264422],[36.0486529,55.215264],[36.0731893,55.2187668],[36.0843759,55.2105611],[36.0956729,55.2142822],[36.1135756,55.2100824],[36.097152,55.2076649],[36.1059624,55.2058237],[36.1229158,55.1792256],[36.1401766,55.1739498],[36.174593,55.1930257],[36.2484951,55.1910412],[36.264784,55.1714839],[36.3134816,55.1857403],[36.295486,55.1908393],[36.3106797,55.2105447],[36.3332969,55.220969],[36.3434699,55.255067],[36.3638133,55.249118],[36.3835472,55.2583722],[36.3721372,55.2644687],[36.379921,55.2728847],[36.368929,55.2772182],[36.3898542,55.2811038],[36.3849938,55.2944235],[36.4178158,55.3088775],[36.4234732,55.2943878],[36.4374356,55.2905597],[36.4855382,55.3045008],[36.5164304,55.2963007],[36.5351953,55.3070732],[36.5369936,55.3240668],[36.5565265,55.3220337],[36.5900255,55.3377039],[36.6008253,55.3512798],[36.6173433,55.3487205],[36.6121067,55.3364301],[36.6003288,55.3346929],[36.627067,55.3160181],[36.6240861,55.3080798],[36.6078371,55.3111815],[36.6129895,55.2943104],[36.6005531,55.2829004],[36.6141387,55.2694668],[36.6321301,55.2660235],[36.6429877,55.2773842],[36.6593265,55.2774903],[36.6964939,55.2619891],[36.7262673,55.2597715],[36.7632458,55.2698276],[36.799951,55.2424725],[36.7939986,55.2252075],[36.8059459,55.2251829],[36.8133835,55.2148325],[36.8017903,55.2060893],[36.8094507,55.1955491],[36.8248916,55.1944441],[36.8410156,55.2078701],[36.8721011,55.2150762],[36.8558391,55.2273425],[36.8719855,55.2326085],[36.9410496,55.237664],[36.9427793,55.2474012],[36.9514323,55.2456509],[36.9525171,55.2648355],[37.0259868,55.2843746],[36.9933511,55.2910392],[36.9838119,55.296971],[36.9864415,55.3155888],[36.94473,55.3293694],[36.9155903,55.3540829],[36.8557881,55.3805025],[36.8628646,55.3848405],[36.8482657,55.3920817],[36.8618745,55.4010347],[36.8031012,55.4408329],[36.8045117,55.465508],[36.8152077,55.4659722],[36.8162398,55.5083513],[36.9194745,55.5058449],[36.9197539,55.5154461],[36.9399755,55.5165588],[36.9350578,55.4961553],[36.9777907,55.4937419],[36.9734462,55.4554605],[36.9940174,55.4583184],[37.0063088,55.4461697],[37.0192337,55.4451288],[37.0200709,55.4567858],[37.0321283,55.4559566],[37.0368186,55.464061],[37.0606131,55.4626603],[37.0586117,55.4546905],[37.0803245,55.4526986],[37.0892834,55.4412316],[37.1127784,55.4492266],[37.1084991,55.4395122],[37.1488482,55.4381762],[37.0922795,55.4649172],[37.0933611,55.4704043],[37.1391906,55.4733418],[37.1382807,55.4826559],[37.1238807,55.4927453],[37.1361965,55.5000219],[37.1384665,55.5148805],[37.1186307,55.5131369],[37.1159062,55.5299985],[37.1225083,55.5383655],[37.1135595,55.538946],[37.1151768,55.5474463],[37.1254702,55.5499634],[37.0872002,55.5904847],[37.0991405,55.5961291],[37.0957269,55.6001139],[37.1164617,55.6056356],[37.132427,55.5991855],[37.1424864,55.6091606],[37.1720429,55.6052282],[37.1886489,55.6201733],[37.2273077,55.6196406],[37.2438889,55.6335642],[37.2350901,55.6373606],[37.2408203,55.6437305],[37.2902143,55.6484944],[37.2885859,55.6548888],[37.290921,55.655349],[37.2902696,55.6484902],[37.3112033,55.646572],[37.3229081,55.6508895],[37.3195225,55.664281],[37.3410192,55.657135],[37.3646174,55.6691244],[37.370952,55.6590578],[37.4154573,55.6647647],[37.4040325,55.6710433],[37.417481,55.6807762],[37.4021617,55.6988389],[37.3748651,55.6889363],[37.357973,55.6917385],[37.3611,55.6820978],[37.3542991,55.6763211],[37.3460859,55.6762989],[37.3262279,55.68276],[37.3348271,55.6824529],[37.3294276,55.6857865],[37.3376329,55.6935156],[37.3438553,55.6892225],[37.3449652,55.6983969],[37.3560893,55.7047715],[37.355769,55.6994601],[37.3709402,55.7036925],[37.3644213,55.7089047],[37.3767396,55.7106743],[37.3781937,55.6968433],[37.3921625,55.6984232],[37.3924774,55.7059193],[37.381352,55.7130943],[37.3652599,55.771728],[37.370622,55.7877908],[37.3705437,55.7883226],[37.3700515,55.7887771],[37.3683562,55.7899745],[37.36724,55.7903819],[37.3867855,55.8069524],[37.3735617,55.8029868],[37.3717466,55.8092419],[37.3878905,55.8097622],[37.3939187,55.829862],[37.3523121,55.8212845],[37.3403714,55.8390079],[37.3490019,55.8437918],[37.3320767,55.8462996],[37.3458799,55.8629437],[37.3774889,55.8683619],[37.3749347,55.8551704],[37.3945561,55.8544023],[37.411428,55.8709576],[37.372761,55.8816241],[37.3773568,55.8927083],[37.3617712,55.9014555],[37.3706763,55.9036305],[37.3660258,55.9153807],[37.377823,55.9211143],[37.3564628,55.9299543],[37.3437067,55.9241832],[37.3313205,55.9338701],[37.3540987,55.9389069],[37.3350259,55.9535891],[37.4224581,55.9513146],[37.4066636,55.939028],[37.4106248,55.925248],[37.3968464,55.9261701],[37.398713,55.9166177],[37.3900178,55.9128443],[37.3902275,55.9033576],[37.4171635,55.8783095],[37.4713061,55.8846992],[37.5363206,55.9075674],[37.5192349,55.9419381],[37.5435935,55.9428103],[37.5374401,55.9528431],[37.5744299,55.9577717],[37.5794223,55.9494679],[37.5624642,55.9510736],[37.5702148,55.9364521],[37.5609557,55.9322714],[37.5559156,55.9092832],[37.5912017,55.9135942],[37.6292697,55.8999289],[37.7315551,55.8856186],[37.8360495,55.8242232],[37.8437616,55.8147738],[37.8431377,55.7792395],[37.8506765,55.7785667],[37.8434007,55.7747346],[37.8426549,55.7467345],[37.8825409,55.7493396],[37.8909533,55.7421946],[37.864238,55.7347168],[37.8724504,55.723377],[37.8824863,55.7190029],[37.9235854,55.7312255],[37.9674277,55.716249],[37.9598592,55.7140911],[37.964077,55.7093106],[37.9496668,55.7113411],[37.9597448,55.7045084],[37.9447161,55.6971238],[37.9602039,55.692774],[37.9637963,55.6739042],[37.9204717,55.676143],[37.9132908,55.6833168],[37.9398067,55.6980146],[37.9151667,55.6970473],[37.9070118,55.7069911],[37.8715322,55.6952975],[37.858176,55.7012543],[37.864792,55.6873501],[37.8568896,55.6757013],[37.8325244,55.6836508],[37.8411397,55.6551916],[37.7321735,55.5887973],[37.6909246,55.5723191],[37.5984891,55.5744262],[37.6035767,55.5645916],[37.589454,55.557683],[37.5784455,55.5216802],[37.6080963,55.509844],[37.6113541,55.4896351],[37.5833567,55.4935768],[37.5870275,55.4867217],[37.5798005,55.4836784],[37.5654849,55.487418],[37.5608448,55.4733871],[37.5447501,55.4726458],[37.5480083,55.4568969],[37.5316055,55.4517498],[37.5352652,55.4362787],[37.5085424,55.4363932],[37.4861087,55.4462039],[37.4985348,55.4500383],[37.492149,55.4561663],[37.4967152,55.4591398],[37.4579022,55.4656842],[37.4646724,55.4708569],[37.4476133,55.4751068],[37.4464698,55.4820796],[37.4112571,55.4629321],[37.3945731,55.4690068],[37.3836378,55.4570306],[37.3879022,55.4535718],[37.3735957,55.4453994],[37.4000303,55.4443934],[37.3866836,55.4344334],[37.426521,55.4323914],[37.4369281,55.4138807],[37.4672927,55.4125651],[37.4609465,55.40157],[37.4705403,55.3900254],[37.4639283,55.3882286],[37.4654688,55.369186],[37.4471078,55.3811656],[37.4275721,55.3646524],[37.4430878,55.3529225],[37.419933,55.3513156],[37.422863,55.3432068],[37.4051145,55.3365341],[37.4208414,55.3289206],[37.4278176,55.3147269],[37.4097827,55.309415],[37.3827304,55.3167873],[37.3950736,55.3080662],[37.392513,55.2995215],[37.4179872,55.2912782],[37.4053152,55.2505764],[37.3344099,55.2380419],[37.3333916,55.2286723],[37.3166632,55.2282851],[37.3169676,55.2207156],[37.3008467,55.2245258],[37.3069924,55.2401223],[37.2715607,55.2588241],[37.2768652,55.2515818],[37.2701554,55.2404862],[37.2455159,55.2392653],[37.2142064,55.2526908],[37.1939404,55.2348099],[37.1633611,55.2315787],[37.1688774,55.1946373],[37.1744385,55.1950437],[37.1672809,55.1854214],[37.169879,55.1643393],[37.1407765,55.1643778],[37.1420798,55.1556758],[37.1112104,55.149187],[37.0448159,55.143376],[37.0423537,55.1338897],[37.060613,55.1270786],[37.0553798,55.1104579],[37.0708249,55.1144449],[37.0969176,55.1084304],[37.098692,55.097106],[37.1163222,55.098063],[37.1105718,55.0807769],[37.1203819,55.073933],[37.1119883,55.0682596],[37.1181446,55.0635164],[37.0838062,55.05655],[37.0968052,55.0442306],[37.0958678,55.0324086],[37.1566435,55.0004043],[37.1342978,54.9913977],[37.1542693,54.9850999],[37.1466764,54.981414],[37.1717409,54.9681521],[37.169917,54.9573483],[37.1612696,54.9650726],[37.1577291,54.9579767],[37.1687408,54.956087],[37.1604962,54.9504442],[37.1929945,54.9232556],[37.1671501,54.8951087],[37.1741524,54.8895129],[37.1687005,54.8799177],[37.1757741,54.8785446],[37.1655448,54.8665854],[37.2038192,54.8487832],[37.2742716,54.8478379],[37.2705996,54.8307784],[37.2946292,54.826633],[37.2952403,54.8461785],[37.3036049,54.8508018],[37.3111188,54.8402504],[37.3343434,54.8460431],[37.3559074,54.8337337],[37.3588899,54.848822],[37.370224,54.8518365],[37.3768147,54.8382917],[37.3905865,54.8439781],[37.4563961,54.8388657],[37.4671942,54.819036],[37.4846344,54.8204393],[37.5039873,54.8073568],[37.4971141,54.7930839],[37.5261344,54.7794902],[37.5447874,54.7804279],[37.5567617,54.7568066],[37.5479964,54.7376042],[37.5637833,54.7319554],[37.5630378,54.7423412],[37.6265155,54.7433466],[37.6868694,54.7138473],[37.6946098,54.7238023],[37.7272611,54.7248492],[37.7629643,54.7439559],[37.7662355,54.7517853],[37.7578732,54.7521669],[37.7638368,54.7716456],[37.7756357,54.7713946],[37.7780288,54.7850239],[37.7703907,54.786313],[37.7645039,54.8037182],[37.779168,54.8156138],[37.7481599,54.8323696],[37.9366237,54.8500031],[37.9744496,54.8398069],[37.9898544,54.8253125],[37.9822012,54.7987548],[37.9539961,54.7806998],[37.9836193,54.7749175],[37.9987494,54.7839709],[38.0164847,54.7831024],[38.0122095,54.7761918],[38.0396567,54.7646729],[38.0448205,54.7342618],[38.0310182,54.7361434],[38.0277781,54.7184914],[38.0501654,54.7208459],[38.0702476,54.7089565],[38.1184603,54.716841],[38.137144,54.6866471],[38.1803166,54.698485],[38.212292,54.6964648],[38.2153323,54.6792128],[38.2341619,54.6669135],[38.2415184,54.6715322],[38.2564763,54.6637424],[38.2912589,54.6775329],[38.3146495,54.661571],[38.3091995,54.6573662],[38.3180289,54.6506996],[38.3456825,54.6581368],[38.388285,54.6382754],[38.3958693,54.648429],[38.4566444,54.6535882],[38.4834903,54.6299448],[38.4823764,54.6164777],[38.5191725,54.5951145],[38.4712925,54.5713611],[38.4461348,54.5725404],[38.4587504,54.5504071],[38.4366853,54.5500877],[38.4509561,54.5366771],[38.4219483,54.545924],[38.3761724,54.5264833],[38.3799194,54.5139641],[38.4002689,54.503249],[38.3945433,54.4992266],[38.39772,54.475176],[38.3865166,54.4666383],[38.4094626,54.4628507],[38.4317623,54.4416816],[38.4507226,54.4400104],[38.4702551,54.4231912],[38.4536547,54.4160738],[38.475554,54.4018178],[38.5273654,54.3950475],[38.5283512,54.3806485],[38.5090403,54.3620008],[38.5130111,54.3544945],[38.5039226,54.3449298],[38.5168604,54.3341345],[38.5071843,54.3277617],[38.5195038,54.3217836],[38.5078617,54.3122813],[38.5189983,54.3061053],[38.5129104,54.2941034],[38.570939,54.2904647],[38.6081432,54.2764764],[38.6321728,54.2805076],[38.6391906,54.2644709],[38.6581138,54.2556959],[38.6960927,54.258976],[38.7156457,54.271418],[38.705648,54.2728099],[38.7199325,54.284554],[38.7036197,54.2908002],[38.7127712,54.3330888],[38.7048645,54.343086],[38.7129832,54.3485324],[38.7781344,54.3635743],[38.7739308,54.3743728],[38.8195781,54.3746255],[38.8350984,54.392948],[38.8546296,54.386906],[38.8579184,54.3701318],[38.8771427,54.3711866],[38.8699131,54.3920786],[38.8895135,54.402096],[38.9406483,54.4079886],[38.9306667,54.4392803],[38.8803523,54.4412877],[38.8771364,54.4491114],[38.8268433,54.4560431],[38.8251772,54.4628246],[38.8009489,54.4534272],[38.7995139,54.4700605],[38.7787912,54.4784471],[38.7880403,54.4935432],[38.8035263,54.4979745],[38.8012612,54.5149561],[38.8082166,54.5243615],[38.8520819,54.5336839],[38.8465253,54.5429835],[38.808944,54.537871],[38.7970105,54.551414],[38.8342854,54.5692185],[38.8226318,54.5790309],[38.8369755,54.5874228],[38.826603,54.6070536],[38.8490231,54.6256199],[38.8678667,54.6148286],[38.9465053,54.6342408],[38.9524964,54.609956],[38.9717641,54.6009771],[38.9939669,54.6159271],[38.9928968,54.6281082],[39.0349771,54.6436492],[39.0447732,54.6354044],[39.0820557,54.6344696],[39.0999549,54.6460406],[39.1112281,54.6328502],[39.1259566,54.6325056],[39.1319502,54.6346588],[39.1273523,54.6459337],[39.1504937,54.6430673],[39.1628133,54.6608409],[39.1822822,54.6380538],[39.2315979,54.63764],[39.2318114,54.6465796],[39.2470448,54.6457979],[39.2435468,54.653923],[39.2571941,54.6616013],[39.2513826,54.6757098],[39.2563206,54.6775577],[39.2321674,54.684576],[39.2407089,54.6959162],[39.2320554,54.7186113],[39.2456112,54.7318686],[39.2682163,54.7358397],[39.3004914,54.7352702],[39.3046872,54.7243383],[39.3369071,54.7190354],[39.3422897,54.721357],[39.330501,54.7313979],[39.370879,54.7473725],[39.3612879,54.7556456],[39.3182586,54.7568972],[39.3352334,54.7629478],[39.3334952,54.775429],[39.362668,54.7828719],[39.3608327,54.7995629],[39.3857913,54.8269635],[39.4151771,54.8399126],[39.3894861,54.8543],[39.3986015,54.866246],[39.4353774,54.877063],[39.4299351,54.8864411],[39.466207,54.892387],[39.4613828,54.9019581],[39.4864987,54.9014258],[39.4736724,54.9095008],[39.4819863,54.9170415],[39.4694293,54.9185467],[39.4655498,54.9314455],[39.4751663,54.9458661],[39.5205833,54.9697545],[39.5175185,54.9838773],[39.6028846,54.9880133],[39.6175838,55.0003833],[39.6253677,55.0250803],[39.6695682,55.0254255],[39.6692176,55.0139728],[39.7013299,55.0059462],[39.7534946,55.0045967],[39.7658922,55.0089831],[39.7555686,55.0351168],[39.7803575,55.0313993],[39.8047924,55.0053824],[39.8625646,55.1111421],[39.8342559,55.1156081],[39.8231044,55.1360545],[39.7990592,55.1376079],[39.7751373,55.116365],[39.7056389,55.1174141],[39.7263526,55.1390003],[39.7539382,55.1504121],[39.7719971,55.1748691],[39.784906,55.1787925],[39.7845029,55.1861897],[39.8057816,55.1880525],[39.8378704,55.2046425],[39.8823582,55.2037864],[39.9222339,55.2152939],[39.9529968,55.2074783],[39.9874837,55.2133185],[39.993914,55.1998972],[40.0046948,55.2240767],[40.0353597,55.2419158],[40.0415935,55.2361504],[40.0940461,55.2568923],[40.1546443,55.2643893],[40.1520309,55.2737241],[40.1795024,55.3120635],[40.2047168,55.315661],[40.1788993,55.3348338],[40.2021424,55.3485537],[40.1788334,55.3939765],[40.1425691,55.4181067],[40.146332,55.4344902],[40.140777,55.4396051],[40.1413046,55.4507267],[40.1534035,55.4605868],[40.1940293,55.4619133],[40.1862173,55.4722438],[40.195328,55.4772179],[40.2001031,55.4983198],[40.1711944,55.5061922],[40.167802,55.5266203],[40.0488709,55.5264979],[40.0468293,55.5818841],[40.0748379,55.57724],[40.0931957,55.6072894],[40.0414473,55.6353208],[40.0535896,55.6553441],[40.0434894,55.6671862],[40.0144231,55.6869003],[39.9942816,55.6876581],[39.9583818,55.722522],[39.9333368,55.7202789],[39.9259402,55.7331675],[39.9030523,55.7418959],[39.8864814,55.7609851],[39.9037451,55.7736916],[39.896797,55.7829849],[39.9092404,55.8029286],[39.8973997,55.8112683],[39.9019591,55.8213414],[39.8891021,55.8331955],[39.8659984,55.8324309],[39.85193,55.8426944],[39.7917232,55.8296956],[39.7876173,55.8413507],[39.7321047,55.8423529],[39.7311959,55.8248826],[39.7143852,55.8234854],[39.7138537,55.8138684],[39.6967644,55.8140878],[39.7034096,55.7874352],[39.6606245,55.7857249],[39.6607636,55.7953936],[39.6279091,55.8054481],[39.627515,55.7990245],[39.594891,55.798161],[39.5950282,55.7886378],[39.5234244,55.7873539],[39.5211385,55.7452268],[39.4828414,55.7449934],[39.4702746,55.7469903],[39.4700788,55.7735567],[39.4236417,55.773447],[39.4372779,55.7807799],[39.4061717,55.7781878],[39.4027621,55.7858035],[39.3896464,55.7857226],[39.3595612,55.7697641],[39.3258435,55.7730178],[39.3210723,55.8028116],[39.308908,55.805798],[39.295963,55.8320328],[39.3271684,55.848],[39.3335777,55.862737],[39.3271743,55.8648631],[39.2803726,55.850979],[39.2768299,55.8414368],[39.2596305,55.8406302],[39.1901036,55.8467792],[39.1676603,55.8400382],[39.1500446,55.8549078],[39.1376705,55.8459278],[39.1076039,55.8450275],[39.1009096,55.8467188],[39.1035851,55.8602778],[39.087574,55.8636967],[39.0591702,55.8573439],[39.0543099,55.8627462],[39.0751246,55.8687463],[39.0775187,55.880623],[39.0650011,55.8835419],[39.0633357,55.8938961],[39.0535653,55.8913272],[39.0492456,55.9026205],[39.0288814,55.9082862],[39.0540501,55.9219713],[39.0586556,55.927002],[39.0530438,55.9301355],[39.0645971,55.9317473],[39.0568124,55.9342429],[39.0612951,55.9379994],[39.0539528,55.9420436],[39.0425635,55.9214295],[39.0080758,55.9362133],[39.016748,55.9441016],[39.031607,55.9357905],[39.049121,55.9428956],[39.0442017,55.9501167],[39.0294624,55.9445295],[39.0084367,55.949303],[38.9572,55.9309546],[38.885039,55.9451996],[38.8382112,55.913746],[38.806929,55.9404211],[38.7317306,55.9796948],[38.6944282,55.9890849],[38.611132,55.9769408],[38.5732421,55.9943187],[38.6126257,56.0153596],[38.589337,56.0248241],[38.59659,56.0280807],[38.5907004,56.0333628],[38.5949964,56.0425583],[38.5828158,56.0451984],[38.584898,56.0554368],[38.5498916,56.0616805],[38.5429328,56.0767864],[38.530566,56.078399],[38.5365077,56.081005],[38.5292933,56.0909269],[38.5365403,56.0964951],[38.5288221,56.102716],[38.5332151,56.1146132],[38.5158835,56.1206749],[38.5103523,56.1327097],[38.5226839,56.1417194],[38.5098833,56.1616303],[38.5216931,56.1830399],[38.5020225,56.1827544],[38.5010887,56.1892904],[38.5280326,56.2134657],[38.5034472,56.2178315],[38.4914829,56.2049276],[38.4594541,56.2026174],[38.4422019,56.2247631],[38.4142879,56.2355799],[38.4095715,56.2515247],[38.4155338,56.2542807],[38.4029957,56.2550854],[38.4037822,56.263878],[38.3961834,56.2661774],[38.4106255,56.275151],[38.3969903,56.2831829],[38.4177752,56.2823472],[38.4358048,56.2922281],[38.43861,56.3126925],[38.4175049,56.3184398],[38.4129629,56.3277814],[38.422418,56.3603406],[38.4462512,56.3870797],[38.4382625,56.3944276],[38.3817863,56.4006346],[38.3941596,56.4119993],[38.3894756,56.4188368],[38.3964857,56.4324518],[38.4152146,56.4330691],[38.401212,56.4416017],[38.3943478,56.4597645],[38.377495,56.4561561],[38.3652409,56.4635655],[38.3542849,56.4527986],[38.3402803,56.4602752],[38.3491254,56.4639501],[38.3430407,56.4810597],[38.3192549,56.4827397],[38.2984363,56.4949604],[38.3359044,56.5055031],[38.339228,56.5151778],[38.297388,56.510653],[38.2993488,56.5188839],[38.2681027,56.5247685],[38.2797887,56.5268719],[38.2757774,56.5335515],[38.2856818,56.5314937],[38.2857681,56.5424134],[38.3132839,56.5495185],[38.3097994,56.5550777],[38.3172642,56.5612484],[38.3386392,56.5636333],[38.3629157,56.5814518],[38.3574591,56.5969077],[38.330983,56.6038127],[38.344648,56.6307426],[38.3148131,56.6450552],[38.3147356,56.6766878],[38.3014476,56.6982403],[38.3140925,56.7036808],[38.3195365,56.721839],[38.3031595,56.7390199],[38.3043538,56.7599757],[38.2442987,56.7934634],[38.2507163,56.7653759],[38.241535,56.760653],[38.2175572,56.7718949],[38.1563227,56.7727552],[38.1038361,56.7597247],[38.0674991,56.7614459],[38.061499,56.7500896],[38.0501312,56.7532365],[38.0515667,56.7678723],[37.9927099,56.7673216],[37.9940019,56.8229022],[37.9833258,56.8252926],[37.9782727,56.8374566],[37.9840009,56.865396],[37.9526399,56.8651378],[37.9625623,56.8709628],[37.9429931,56.8879305],[37.9101601,56.8880069],[37.9105859,56.8785472],[37.8877257,56.8781114],[37.8792325,56.8856217],[37.8827009,56.8937807],[37.8662782,56.9034858],[37.7984616,56.9088192],[37.7852484,56.9296753],[37.7629282,56.9256553],[37.7508946,56.9318385],[37.7581847,56.949991],[37.7346175,56.9558346],[37.6983069,56.9585118],[37.6786386,56.9401727],[37.6493717,56.9460705],[37.645471,56.9351013],[37.5910676,56.9297867],[37.5852034,56.9147382],[37.5482181,56.9184464],[37.5499021,56.911046],[37.5319578,56.9094929],[37.5343522,56.9016448],[37.5247392,56.8925262],[37.5375896,56.8818759],[37.5749445,56.8731774],[37.572519,56.8667903],[37.564686,56.8586373],[37.5458297,56.866268],[37.54146,56.8526736],[37.5520277,56.8395338],[37.5157978,56.8219237],[37.4774222,56.7765864],[37.4631139,56.7769991],[37.4599555,56.7920066],[37.4474127,56.7896552],[37.4429267,56.7965343],[37.3508579,56.7793526],[37.3428329,56.7637859],[37.2809509,56.7754305],[37.2746827,56.7596847],[37.2491964,56.7453807],[37.2336969,56.752584],[37.2252607,56.7670633],[37.2389874,56.772929],[37.2430327,56.7869936],[37.2158839,56.7830645],[37.2062934,56.7697489],[37.14696,56.7751008],[37.0668314,56.7556214],[37.1742501,56.6964249],[37.1542957,56.6905627],[37.1592751,56.6821648],[37.1300137,56.6691206],[37.1587318,56.6622705],[37.1591022,56.6519861],[37.149564,56.6548835],[37.1542617,56.6489768],[37.1149927,56.6407185],[37.1339409,56.6205078],[37.1277033,56.6134154],[37.1352594,56.6101459],[37.1262907,56.6016119],[37.1475785,56.5868672],[37.0982148,56.5404088],[37.0712488,56.5464295],[37.0726397,56.5397968],[37.0538871,56.5313956],[37.0555477,56.526247],[36.9697959,56.5468835],[36.967094,56.5661583],[36.9165772,56.5702749],[36.8861351,56.5847154],[36.8805898,56.5781078],[36.803018,56.5974755],[36.8130779,56.5791033],[36.8003708,56.5686151],[36.6528698,56.5232231],[36.6817212,56.498062],[36.6487413,56.5034985],[36.6525059,56.5162953],[36.6148586,56.517958],[36.5978472,56.5126451],[36.5895697,56.4998356],[36.5404777,56.4967088],[36.537906,56.4726833],[36.4425059,56.4781193],[36.3923507,56.4669331],[36.3929973,56.4592162],[36.3760521,56.4575309],[36.3759766,56.4518982],[36.3056152,56.4414909],[36.273977,56.4175642],[36.1265917,56.3995134],[36.1331958,56.3959986],[36.1246928,56.386915],[36.1073041,56.3881347],[36.099533,56.3802851],[36.0886671,56.3356617],[36.0607159,56.339127],[36.059423,56.350353],[36.0742378,56.3567222],[36.0735255,56.363181],[36.0499488,56.3732563],[36.0370076,56.3729928],[36.0378502,56.3653265],[36.0121549,56.37822],[35.958513,56.3780324],[35.9531026,56.3703943],[35.9058757,56.3772569],[35.8716253,56.3721202],[35.8625285,56.3866408],[35.8435383,56.3808087],[35.8360794,56.3882729],[35.8608106,56.3939448],[35.8482508,56.3982553],[35.8401198,56.3920063],[35.8349581,56.399296],[35.801089,56.406391],[35.769391,56.3897676],[35.7352719,56.3897207],[35.7289805,56.4138302],[35.7181904,56.4110864],[35.6996118,56.428367],[35.681303,56.4291467],[35.6852856,56.4467454],[35.6640864,56.4478095],[35.6585777,56.4600634],[35.621673,56.4585071],[35.6261894,56.4693974],[35.6202404,56.4770525],[35.5996847,56.4777774],[35.5641486,56.4592285],[35.5551694,56.4626949],[35.5535366,56.4497751],[35.5184568,56.4303333],[35.4734054,56.4378063],[35.4833512,56.4455246],[35.4677585,56.4565788],[35.4342706,56.4586556],[35.4248719,56.4434394],[35.4570089,56.4306903],[35.4403239,56.4308169],[35.4378676,56.4204702],[35.429612,56.4208828],[35.4176673,56.3829073],[35.4616288,56.3788701],[35.482958,56.3839234],[35.4979575,56.3995509],[35.5203231,56.39541],[35.5137893,56.3890874],[35.5211739,56.384587],[35.5084676,56.3802636],[35.5054076,56.3675749],[35.482453,56.3735201],[35.4705119,56.3612158],[35.4985516,56.3619959],[35.4789665,56.3586767],[35.4809771,56.3461855],[35.4683578,56.3376181],[35.4776519,56.3360334],[35.4656976,56.3306214],[35.4806214,56.3273097],[35.4769199,56.3128726],[35.4672129,56.3097067],[35.4913424,56.2869627],[35.4722815,56.2840178],[35.4749621,56.2768128],[35.5023101,56.2594863],[35.4616352,56.2409786],[35.438708,56.2394754],[35.4117883,56.2489122],[35.391113,56.2347193],[35.3629376,56.2374402],[35.3157909,56.2279909],[35.320227,56.2092479],[35.3638601,56.1969745],[35.348939,56.1839573],[35.3631294,56.1788714],[35.3349586,56.1630795],[35.3413651,56.1598093],[35.3049316,56.1544679],[35.2919089,56.1404339],[35.3086016,56.1381649],[35.3089851,56.1304535],[35.2845501,56.1249956],[35.2890218,56.1149998],[35.2834149,56.1115943],[35.2872795,56.1033886],[35.3089808,56.1066348],[35.3380258,56.0926377],[35.317324,56.0835908],[35.3234065,56.0774323],[35.3143687,56.0638605],[35.3047358,56.0583108],[35.287845,56.0625881],[35.2667585,56.039058],[35.2439937,56.0466883],[35.2314049,56.0428073],[35.2395544,56.0300835],[35.2176116,56.0110251],[35.1969797,56.0121503],[35.1787787,55.9985981],[35.1738409,55.9834971],[35.1538709,55.977983],[35.1484955,55.9575013]],[[36.8880788,55.7344361],[36.8997282,55.7337604],[36.8968708,55.7421693],[36.9080791,55.7487516],[36.9210193,55.7465802],[36.9332186,55.7544071],[36.968056,55.7600373],[36.9706585,55.7557498],[36.9563714,55.7539658],[36.9669592,55.7474575],[36.9781789,55.7511847],[36.9787545,55.7604866],[36.9911174,55.7484322],[36.9861771,55.7445116],[37.0204704,55.7454183],[37.0219665,55.7349139],[37.0291177,55.7339643],[37.0248364,55.7337855],[37.0240186,55.7322579],[37.0467747,55.7268231],[37.0409758,55.7192852],[37.0737775,55.7301381],[37.1017724,55.7256202],[37.1203158,55.7317722],[37.0943494,55.7287203],[37.082354,55.7325818],[37.0794847,55.7354089],[37.0924909,55.7436487],[37.1073875,55.7415743],[37.1277753,55.7280823],[37.1130095,55.7161027],[37.0788462,55.7154165],[37.0679025,55.7228781],[37.0545397,55.7097566],[37.0338403,55.7139869],[37.0275145,55.7123285],[37.0246619,55.7097268],[37.0344352,55.7066217],[37.0041736,55.7054131],[36.9920438,55.7120899],[37.0242523,55.7095857],[37.0148396,55.7107633],[37.0060733,55.7253243],[36.9912379,55.7189466],[36.9620864,55.7299294],[36.9738432,55.7362565],[36.9856481,55.7273289],[37.0056864,55.7396562],[36.9895569,55.734738],[36.9839527,55.7385296],[36.9925202,55.7398484],[36.9940932,55.7405823],[36.9775837,55.7421556],[36.9476722,55.7317613],[36.9352279,55.7371427],[36.9484381,55.7500398],[36.9436315,55.7546611],[36.9240219,55.7368892],[36.9047674,55.7413271],[36.9237123,55.7368148],[36.9189142,55.7310489],[36.8880788,55.7344361]],[[36.9007522,55.3148568],[36.910332,55.3313028],[36.9228058,55.3239412],[36.9076917,55.3112522],[36.9007522,55.3148568]],[[37.1316021,56.0164459],[37.2073752,56.0171497],[37.2605357,55.9931529],[37.2537923,55.9882694],[37.2644583,55.9871372],[37.2612918,55.9680732],[37.268302,55.9678365],[37.2524878,55.9678978],[37.2419261,55.979338],[37.2205147,55.9813061],[37.2056397,55.9631208],[37.2193881,55.9571182],[37.2174548,55.9480078],[37.149624,55.9622873],[37.1440873,55.9898821],[37.1527443,55.9930578],[37.1511709,55.9995486],[37.1316021,56.0164459]],[[37.290502,55.8019897],[37.2977692,55.803354],[37.3035641,55.8035588],[37.2931684,55.7963971],[37.290502,55.8019897]],[[37.3079191,55.7972282],[37.3494535,55.8064784],[37.3594884,55.8012546],[37.3486793,55.7964211],[37.3705101,55.7880302],[37.3470671,55.7695512],[37.3207023,55.7668207],[37.3084937,55.7705913],[37.3283121,55.781108],[37.3128271,55.7863845],[37.3118433,55.7801654],[37.3100592,55.7920866],[37.3249703,55.7966009],[37.3079191,55.7972282]],[[37.7921011,56.0024925],[37.7928913,56.0038815],[37.7940939,56.0031557],[37.7921011,56.0024925]],[[37.7912235,56.0072852],[37.7985143,56.0097028],[37.7994322,56.0061526],[37.7968376,56.0047609],[37.7912235,56.0072852]],[[37.8453271,55.8135622],[37.8722162,55.8225388],[37.8993112,55.8162911],[37.8830652,55.8162984],[37.8665868,55.8042107],[37.8453271,55.8135622]],[[37.8689418,55.8228697],[37.8735166,55.8252341],[37.8760016,55.8249027],[37.8689418,55.8228697]]]}},"66":{"osm_id":79379,"osm_type":"relation","name":"Свердловская область","geometry":{"type":"Polygon","coordinates":[[[57.226554,56.851958],[57.249563,56.83803],[57.267794,56.836575],[57.262971,56.824266],[57.273283,56.814432],[57.267411,56.802985],[57.343386,56.744302],[57.313196,56.720608],[57.343296,56.71181],[57.351015,56.698446],[57.344259,56.685264],[57.362403,56.680639],[57.395031,56.687554],[57.441313,56.676934],[57.40077,56.640834],[57.349374,56.622198],[57.340446,56.609815],[57.390928,56.597885],[57.421941,56.609933],[57.420848,56.580973],[57.412135,56.581907],[57.391905,56.531084],[57.373325,56.527388],[57.353848,56.467649],[57.360863,56.441242],[57.316128,56.390373],[57.330573,56.373877],[57.374498,56.379682],[57.39223,56.372729],[57.415076,56.346423],[57.404843,56.342934],[57.4325038,56.3130922],[57.4128408,56.2939258],[57.4102968,56.2613534],[57.4458567,56.2460002],[57.4421526,56.2407331],[57.4516809,56.2358233],[57.4581715,56.2164381],[57.5015121,56.2072016],[57.5008273,56.1951045],[57.5070051,56.1933955],[57.4868317,56.187861],[57.4897094,56.1599539],[57.4761532,56.15535],[57.4801749,56.1417669],[57.4660323,56.1300955],[57.5154095,56.1066653],[57.5100956,56.1000586],[57.5160961,56.0972385],[57.5749797,56.0954493],[57.5976238,56.0853868],[57.6111301,56.0952956],[57.6534076,56.0960007],[57.6593257,56.1170337],[57.6862416,56.1366225],[57.7221762,56.1274826],[57.7738167,56.1454524],[57.8603857,56.1487727],[57.9121727,56.1313904],[57.8957308,56.1221405],[57.9194825,56.1059685],[58.0723641,56.1152885],[58.1050071,56.1390469],[58.1293413,56.1324121],[58.164289,56.1395182],[58.1897222,56.1246114],[58.2421387,56.1178057],[58.2619677,56.1050916],[58.3051195,56.1040881],[58.315013,56.1156467],[58.3482455,56.1215083],[58.3579276,56.1106886],[58.3424701,56.0826898],[58.3835903,56.0815522],[58.4121644,56.1027944],[58.4234747,56.1210898],[58.4717748,56.1211247],[58.5090111,56.1715385],[58.5526575,56.1670273],[58.557371,56.1731568],[58.5815172,56.1661117],[58.5966274,56.1390757],[58.6366256,56.1340671],[58.6431523,56.1181106],[58.7139992,56.1168699],[58.7131093,56.0955907],[58.7347314,56.0810951],[58.7670858,56.0880903],[58.831888,56.084951],[58.8345347,56.069043],[58.8837461,56.0745375],[58.9005709,56.0539408],[58.9802751,56.0758063],[59.0385194,56.1280902],[59.0425233,56.1707308],[59.0309122,56.1730591],[59.0188337,56.1979904],[59.1099858,56.1978122],[59.1214302,56.1894168],[59.1332301,56.2023773],[59.1694391,56.1989044],[59.1690856,56.2292188],[59.1994279,56.2716843],[59.1896396,56.2792597],[59.1844688,56.3140709],[59.1531334,56.3154331],[59.1507606,56.3205666],[59.1623982,56.3199493],[59.1503845,56.3234181],[59.1398157,56.3196633],[59.1385009,56.3336025],[59.1629494,56.3332517],[59.1629694,56.326244],[59.1682471,56.339549],[59.1597345,56.3453714],[59.2228215,56.355702],[59.2841857,56.3445918],[59.2794199,56.3308901],[59.2920662,56.3273366],[59.4215219,56.3205862],[59.4127324,56.3360457],[59.5719226,56.3396458],[59.5730404,56.3213904],[59.714939,56.3238023],[59.6366362,56.2481139],[59.7571582,56.2234195],[59.7833019,56.2255969],[59.7857298,56.2329379],[59.8622063,56.2587858],[59.9103294,56.2589118],[59.9519824,56.2395647],[59.9768236,56.2376264],[60.0046072,56.220863],[60.0327071,56.2227694],[60.0637377,56.2123506],[60.172878,56.2166315],[60.1987589,56.2037073],[60.255393,56.1983707],[60.2596553,56.2127796],[60.2891023,56.2290694],[60.3043614,56.2246549],[60.3639439,56.2335999],[60.46553,56.2220231],[60.5042432,56.2360018],[60.5529715,56.2223389],[60.574761,56.3168849],[60.6774898,56.3093427],[60.6549918,56.2145444],[60.6994348,56.2392928],[60.770043,56.2370996],[60.7677966,56.2177993],[60.8243251,56.2222107],[60.8393724,56.2151346],[60.8435597,56.2247596],[60.8784859,56.2205641],[60.873982,56.2146633],[60.9638688,56.1909516],[60.9758853,56.2006812],[61.0140708,56.1851923],[61.0459208,56.2003736],[61.0798288,56.1840579],[61.1035104,56.1816711],[61.185875,56.2082643],[61.1726582,56.2336372],[61.1602009,56.2401544],[61.1456913,56.2801902],[61.091729,56.3192581],[61.0928612,56.3386599],[61.1199343,56.3523817],[61.1542873,56.3562962],[61.1606657,56.3657203],[61.1771275,56.3610981],[61.1796588,56.3531103],[61.2191748,56.3493495],[61.2597267,56.3329822],[61.3101863,56.339583],[61.3188635,56.3297141],[61.3133344,56.3133983],[61.3374566,56.3153711],[61.3979592,56.3416879],[61.4112566,56.3435929],[61.4211401,56.3339171],[61.4421579,56.3529684],[61.4720895,56.3438599],[61.4717903,56.3308294],[61.5056862,56.3308431],[61.5047324,56.3212212],[61.5211397,56.3222213],[61.5390909,56.3058783],[61.563007,56.3092865],[61.5668557,56.283515],[61.5821179,56.2860407],[61.5941962,56.3031493],[61.6050823,56.3017827],[61.6192981,56.319778],[61.6696313,56.3171567],[61.7352128,56.286424],[61.7233862,56.2721294],[61.7427938,56.2698354],[61.7515059,56.257803],[61.7499199,56.2445002],[61.7612019,56.2442727],[61.7724105,56.2268533],[61.835693,56.24013],[61.8707436,56.2226794],[61.8695117,56.2093102],[61.8778347,56.2064997],[61.8724914,56.1982876],[61.8369794,56.1778334],[62.0610577,56.1308206],[62.0780538,56.1986722],[62.0668033,56.2030212],[62.0672849,56.2135084],[62.078744,56.2210937],[62.0764795,56.2335579],[62.0537533,56.248413],[62.069847,56.2963252],[62.1540197,56.2740726],[62.1611509,56.287589],[62.1713733,56.2859331],[62.1787699,56.3035816],[62.1968593,56.3049048],[62.2124653,56.3193193],[62.2660013,56.33847],[62.2463036,56.3458552],[62.2551535,56.3483717],[62.2591241,56.4082744],[62.2930893,56.4305756],[62.3121455,56.431934],[62.309888,56.4383592],[62.3382615,56.4673013],[62.3700046,56.4579647],[62.3781409,56.4876824],[62.4036534,56.4869906],[62.4078602,56.5032635],[62.4003621,56.5090339],[62.5173379,56.5634742],[62.5688241,56.5656193],[62.6043106,56.5484568],[62.5824308,56.5322779],[62.6032461,56.4909379],[62.6219707,56.4970854],[62.6513799,56.4865821],[62.652095,56.5149776],[62.6880058,56.5031281],[62.7246903,56.5078685],[62.7420157,56.5579393],[62.8721876,56.5460351],[62.8888883,56.5908488],[62.9763003,56.5869517],[62.982343,56.5981996],[63.1246267,56.5639735],[63.146495,56.5855283],[63.1532659,56.5855189],[63.1546548,56.56723],[63.1844294,56.5874063],[63.2026018,56.5827743],[63.1899333,56.5694936],[63.2318682,56.561339],[63.2362237,56.5709075],[63.3134484,56.5683981],[63.3175555,56.5257905],[63.3614553,56.5129586],[63.3542932,56.5029723],[63.3582657,56.4913349],[63.3776512,56.4985035],[63.362948,56.5352624],[63.3985444,56.5811988],[63.4001146,56.6098812],[63.4700026,56.5950572],[63.474565,56.611722],[63.4944554,56.6126521],[63.599741,56.5876199],[63.5942632,56.5575975],[63.6452772,56.5472933],[63.7015173,56.5238564],[63.7255103,56.5392855],[63.746833,56.5373502],[63.7475363,56.5290078],[63.7389161,56.526298],[63.7419159,56.5139373],[63.762684,56.50576],[63.773787,56.5098378],[63.8290144,56.4813332],[63.8902379,56.4825288],[63.9961781,56.4687666],[64.0186541,56.489425],[64.0556529,56.486943],[64.0409125,56.4766659],[64.0583278,56.4729852],[64.1787164,56.4610308],[64.214331,56.4915152],[64.2221621,56.5381796],[64.1687721,56.5586401],[64.1826333,56.5855983],[64.2077591,56.5977578],[64.282992,56.605368],[64.3122247,56.6195659],[64.2953912,56.6360419],[64.2977446,56.6462758],[64.3413912,56.6437439],[64.3507863,56.6821192],[64.2939204,56.6990659],[64.3289142,56.7160428],[64.3112673,56.7178446],[64.29185,56.7342263],[64.3278988,56.7565425],[64.4938621,56.7455841],[64.5436842,56.7861934],[64.5399336,56.7987607],[64.5491167,56.8035419],[64.6062238,56.7933843],[64.6816217,56.8140014],[64.766064,56.8126259],[64.7892863,56.8249584],[64.8167631,56.8230941],[64.8305079,56.8422967],[64.8868072,56.8240769],[64.8833247,56.8075285],[64.8651246,56.793932],[64.9122552,56.7877204],[64.9270552,56.7724002],[65.1696827,56.7640353],[65.1893703,56.8484801],[65.2172106,56.8447965],[65.2531476,56.9205059],[65.1281793,56.9082607],[65.1110065,56.886083],[65.0561954,56.9039161],[65.0734827,56.9452135],[65.0386267,56.9451729],[65.0439944,56.9684717],[65.0094813,56.9661647],[65.0308265,56.9938748],[65.0425631,56.9851717],[65.0509864,56.9871836],[65.0345856,57.0059362],[65.0005236,57.0208166],[65.0128795,57.0430722],[64.9831305,57.0581302],[64.9824908,57.0678185],[64.9807029,57.1032673],[64.9958552,57.1079125],[64.9819542,57.118295],[64.9625194,57.156659],[65.0050861,57.2338124],[64.9534504,57.2462385],[64.9210293,57.2657793],[64.9402305,57.2986399],[64.8834,57.2806143],[64.8271919,57.2931197],[64.8432771,57.339535],[64.8979293,57.3323716],[64.856224,57.3645894],[64.8539356,57.3711051],[64.8665324,57.3788019],[64.8829626,57.3794005],[64.869937,57.3882603],[64.8498631,57.4512827],[64.8996966,57.4545962],[64.9057557,57.482204],[64.9268316,57.5000568],[64.9337752,57.5266728],[64.9289461,57.541842],[64.9368375,57.555302],[64.9909012,57.5617401],[64.9968877,57.569804],[64.9890084,57.570368],[64.9660585,57.6050704],[64.9057004,57.5925122],[64.8991327,57.6235827],[64.8633174,57.6211847],[64.8573625,57.6400798],[64.8330882,57.6482501],[65.4067547,57.8258214],[65.4178218,57.8370108],[65.4262351,57.8086433],[65.4523098,57.7882402],[65.4601754,57.7640171],[65.4986626,57.7626775],[65.5039559,57.7419406],[65.5197437,57.7412365],[65.5356723,57.7640018],[65.6074826,57.787278],[65.5959017,57.7907732],[65.5976874,57.7969472],[65.6270391,57.7967765],[65.6555649,57.8248635],[65.6846334,57.8380845],[65.6341846,57.8592729],[65.635426,57.8729062],[65.655795,57.8755435],[65.6565172,57.8858868],[65.67093,57.8922076],[65.6677616,57.898477],[65.6971989,57.8953467],[65.7024909,57.8884262],[65.7487511,57.8943059],[65.7598883,57.8799919],[65.7947688,57.8747983],[65.8249863,57.9326348],[65.877775,57.942558],[65.984069,57.9448616],[65.9807867,57.965104],[66.0367339,57.9845862],[66.0261598,57.9930154],[66.0750121,58.0021328],[66.0689815,57.9958962],[66.1022334,57.9956431],[66.1286912,58.0057537],[66.1848568,58.0109699],[66.0000584,58.2486931],[65.9939409,58.3346599],[65.9504599,58.6145443],[65.6551379,58.6585169],[65.3726848,58.8989522],[65.3398476,59.0088793],[65.2363033,59.2055752],[65.2150855,59.2158865],[65.1522223,59.2094303],[65.121715,59.2163355],[65.1245178,59.222698],[65.1153614,59.2305356],[65.1219108,59.2341116],[65.1046733,59.2349641],[65.1003187,59.2397137],[65.1099429,59.241862],[65.0877653,59.2471742],[65.093449,59.2643962],[65.0732843,59.3127937],[64.4895744,59.37662],[64.0204659,59.3818567],[63.8743126,59.4613009],[63.8487334,59.5667345],[63.8249465,59.7447323],[63.8026787,59.8017427],[63.6059363,60.1017036],[63.6182266,60.1155413],[63.6048818,60.1253581],[63.6107154,60.1299042],[63.606047,60.1371648],[63.5347814,60.1307332],[63.4927737,60.1478703],[63.4442743,60.1501026],[63.1810619,60.2243269],[63.2262836,60.2945176],[62.8673828,60.653825],[62.7601557,60.8533213],[62.826001,61.0005295],[62.645589,61.1706512],[62.4835549,61.2609731],[61.8907409,61.4061957],[61.8877989,61.4361193],[61.4613533,61.5827883],[61.1942791,61.6638243],[60.9974192,61.6948009],[60.8385985,61.6984663],[60.5146097,61.7356999],[59.9891307,61.7194807],[59.9439109,61.7544427],[59.9591725,61.7780462],[59.9405807,61.7945113],[59.9504246,61.8187038],[59.9445396,61.8333991],[59.9752278,61.8505894],[59.9798,61.871935],[59.9732374,61.8825724],[59.926947,61.8991523],[59.8251949,61.9064024],[59.7180224,61.9304868],[59.6295092,61.91755],[59.5829557,61.9454251],[59.5241505,61.9355923],[59.4890224,61.9466153],[59.4038661,61.9106635],[59.3974905,61.8997043],[59.4028384,61.8839547],[59.3647574,61.8743304],[59.3301046,61.8465982],[59.3335694,61.8307293],[59.3156587,61.8023366],[59.3259094,61.7833882],[59.3451425,61.7846269],[59.3597481,61.7696128],[59.4221904,61.7545982],[59.4036576,61.7411743],[59.4003902,61.7292249],[59.3692959,61.7138224],[59.3713419,61.7009827],[59.3522814,61.6932784],[59.3604374,61.671885],[59.348761,61.659883],[59.35563,61.636239],[59.409187,61.614677],[59.413026,61.598962],[59.402528,61.591939],[59.401238,61.580208],[59.413559,61.554066],[59.402947,61.536391],[59.413855,61.523629],[59.446575,61.514169],[59.438258,61.487376],[59.400312,61.463897],[59.429505,61.444258],[59.44483,61.416226],[59.425262,61.398225],[59.367924,61.39385],[59.314454,61.356901],[59.321472,61.335995],[59.315613,61.330151],[59.2530695,61.3117962],[59.261588,61.280449],[59.251629,61.260962],[59.270473,61.230665],[59.288932,61.224505],[59.28449,61.193071],[59.292922,61.177927],[59.284978,61.170224],[59.318297,61.148944],[59.346773,61.099751],[59.347513,61.083533],[59.339819,61.079028],[59.36,61.065843],[59.343091,61.058763],[59.343891,61.051842],[59.362595,61.044015],[59.35936,61.035966],[59.371333,61.025729],[59.374613,60.996888],[59.363358,60.974624],[59.383976,60.959085],[59.387437,60.944683],[59.436026,60.94841],[59.477843,60.9400303],[59.4712795,60.9249893],[59.4775996,60.9120625],[59.4699067,60.8497072],[59.482098,60.827009],[59.425414,60.750586],[59.44487,60.734973],[59.430334,60.72143],[59.417169,60.686094],[59.428753,60.637528],[59.414727,60.625035],[59.408767,60.601635],[59.384023,60.581122],[59.358965,60.523986],[59.286692,60.500598],[59.247203,60.4742],[59.21843,60.444327],[59.222292,60.419398],[59.207228,60.409364],[59.210673,60.398517],[59.1986619,60.3806417],[59.1820098,60.3715121],[59.1859399,60.360946],[59.141027,60.333791],[59.1400819,60.3284661],[59.181821,60.31191],[59.157261,60.28954],[59.162306,60.280212],[59.149705,60.261216],[59.157747,60.249048],[59.147601,60.243491],[59.15284,60.233842],[59.14693,60.219664],[59.102063,60.178693],[59.087665,60.128427],[59.063908,60.117591],[59.076009,60.105278],[59.028408,60.014716],[58.986034,59.984354],[58.964056,59.977876],[58.98104,59.967168],[58.990063,59.906935],[58.840048,59.93274],[58.800544,59.842819],[58.694722,59.85716],[58.601808,59.693865],[58.480318,59.711921],[58.367521,59.47289],[58.458516,59.463701],[58.456692,59.456818],[58.522598,59.435352],[58.541384,59.405027],[58.601337,59.346407],[58.625237,59.298304],[58.681455,59.268503],[58.788377,59.239853],[58.967549,59.235331],[58.989809,59.222658],[58.9957654,59.208907],[59.197619,59.146439],[59.091382,59.001745],[59.204863,58.95445],[59.166456,58.90967],[59.076445,58.906566],[59.085419,58.843382],[59.079796,58.843168],[59.104934,58.7734],[59.144791,58.774982],[59.152895,58.717601],[59.231923,58.724056],[59.313461,58.694248],[59.341552,58.697451],[59.348383,58.707311],[59.39855,58.707498],[59.415091,58.662651],[59.394852,58.584665],[59.452453,58.478414],[59.384223,58.430244],[59.286202,58.419202],[59.274848,58.400288],[59.276627,58.376475],[59.255422,58.353474],[59.263955,58.337934],[59.220662,58.324703],[59.204784,58.328987],[59.188962,58.278374],[59.105975,58.288059],[59.137126,58.260624],[58.92675,58.284391],[58.909342,58.243519],[58.875479,58.246638],[58.861105,58.21],[58.816414,58.215704],[58.805164,58.176815],[58.774678,58.179848],[58.7624,58.142758],[58.73808,58.144611],[58.663315,58.105196],[58.676286,58.069391],[58.650065,58.050072],[58.625987,58.059557],[58.585373,58.042407],[58.597151,58.02145],[58.638486,58.004835],[58.646486,57.987169],[58.641905,57.976132],[58.665682,57.950102],[58.651184,57.944739],[58.686515,57.91311],[58.686734,57.901772],[58.67923,57.898014],[58.709809,57.882971],[58.743803,57.89145],[58.737781,57.854142],[58.873119,57.839224],[58.8334614,57.7450042],[58.83175,57.73232],[58.842374,57.719732],[58.801323,57.725475],[58.536819,57.563884],[58.517156,57.56228],[58.510542,57.573744],[58.460426,57.582375],[58.464381,57.632748],[58.435624,57.656864],[58.434796,57.663186],[58.452109,57.664647],[58.447054,57.67367],[58.250576,57.673877],[58.243132,57.68027],[58.152773,57.682418],[58.144995,57.687522],[58.157205,57.693628],[58.150147,57.696819],[58.127278,57.690332],[58.122596,57.667151],[58.099142,57.653241],[58.125329,57.648056],[58.126515,57.640692],[58.11526,57.639649],[58.114126,57.624442],[58.099657,57.61067],[58.120964,57.6057],[58.123574,57.592771],[58.087469,57.581868],[58.064052,57.58996],[58.064707,57.608911],[58.031125,57.609348],[58.028856,57.56684],[57.993455,57.558106],[57.979179,57.546144],[57.985526,57.535352],[57.968934,57.488857],[58.011779,57.484274],[57.939487,57.315769],[57.979927,57.312057],[57.940107,57.296243],[57.983805,57.293404],[58.022029,57.276818],[58.010894,57.265521],[58.016529,57.252759],[58.047615,57.248703],[58.029116,57.23808],[58.022809,57.213486],[57.992259,57.221508],[57.9863,57.210763],[57.999223,57.189475],[58.02398,57.184981],[58.035982,57.197324],[58.047693,57.193126],[58.032066,57.150658],[58.120835,57.141781],[58.113537,57.121945],[58.094326,57.12831],[58.052611,57.125836],[58.050546,57.118818],[58.034791,57.116775],[58.03231,57.111364],[58.054514,57.103302],[58.086321,57.09901],[58.068642,57.048634],[58.057802,57.045172],[58.058059,57.057864],[58.05145,57.059134],[58.035514,57.053062],[58.035366,57.039397],[58.025525,57.035768],[58.005934,57.042484],[58.005863,57.050482],[57.981445,57.048116],[57.983831,57.039053],[57.965131,57.040901],[57.967566,57.051045],[58.017378,57.057161],[58.013207,57.068129],[58.022038,57.078837],[57.979593,57.078401],[57.964096,57.07106],[57.953566,57.079222],[57.942381,57.073516],[57.951314,57.062422],[57.945316,57.056145],[57.922429,57.058535],[57.92315,57.064312],[57.892073,57.052254],[57.872769,57.056251],[57.856122,57.038302],[57.846718,57.039841],[57.849755,57.01794],[57.839434,57.013246],[57.841925,57.005648],[57.824063,57.007843],[57.840579,56.984981],[57.827395,56.962572],[57.811203,56.968138],[57.817091,56.977906],[57.806635,56.986795],[57.780336,56.990242],[57.787489,56.979335],[57.776868,56.980135],[57.769186,56.97195],[57.775665,56.96308],[57.751577,56.944697],[57.693715,56.958084],[57.661833,56.945004],[57.677392,56.920263],[57.665085,56.910717],[57.600075,56.916345],[57.579687,56.910016],[57.5750523,56.8941589],[57.466508,56.913866],[57.44008,56.953577],[57.428776,56.956194],[57.419619,56.946471],[57.411757,56.949606],[57.388336,56.937811],[57.368702,56.956181],[57.358537,56.936142],[57.31408,56.927657],[57.299402,56.911205],[57.268195,56.902201],[57.226554,56.851958]]]}},"77":{"osm_id":102269,"osm_type":"relation","name":"Москва","geometry":{"type":"MultiPolygon","coordinates":[[[[36.8031012,55.4408329],[36.8618745,55.4010347],[36.8482657,55.3920817],[36.8628646,55.3848405],[36.8557881,55.3805025],[36.9155903,55.3540829],[36.94473,55.3293694],[36.9864415,55.3155888],[36.9838119,55.296971],[36.9933511,55.2910392],[37.0259868,55.2843746],[36.9525171,55.2648355],[36.9514323,55.2456509],[36.9372604,55.2416096],[36.9494394,55.2402372],[36.9470709,55.2185131],[36.9650317,55.21207],[36.9826115,55.1804662],[37.0197139,55.1829503],[37.0152269,55.1599986],[37.0392054,55.1425215],[37.1420798,55.1556758],[37.1407765,55.1643778],[37.1713388,55.1654708],[37.1672809,55.1854214],[37.1744385,55.1950437],[37.1688774,55.1946373],[37.1633611,55.2315787],[37.1939404,55.2348099],[37.2142064,55.2526908],[37.2455159,55.2392653],[37.2701554,55.2404862],[37.2768652,55.2515818],[37.2715607,55.2588241],[37.3069924,55.2401223],[37.3008467,55.2245258],[37.3169676,55.2207156],[37.3166632,55.2282851],[37.3333916,55.2286723],[37.3344099,55.2380419],[37.4053152,55.2505764],[37.4179872,55.2912782],[37.392513,55.2995215],[37.3950736,55.3080662],[37.3827304,55.3167873],[37.4097827,55.309415],[37.4278176,55.3147269],[37.4208414,55.3289206],[37.4051145,55.3365341],[37.422863,55.3432068],[37.419933,55.3513156],[37.4430878,55.3529225],[37.4275721,55.3646524],[37.4471078,55.3811656],[37.4654688,55.369186],[37.4639283,55.3882286],[37.4705403,55.3900254],[37.4609465,55.40157],[37.4672927,55.4125651],[37.4369281,55.4138807],[37.426521,55.4323914],[37.3866836,55.4344334],[37.4000303,55.4443934],[37.3735957,55.4453994],[37.3879022,55.4535718],[37.3910316,55.4666742],[37.4112571,55.4629321],[37.4464698,55.4820796],[37.4476133,55.4751068],[37.4646724,55.4708569],[37.4579022,55.4656842],[37.4967152,55.4591398],[37.492149,55.4561663],[37.4985348,55.4500383],[37.4857718,55.4468986],[37.5030414,55.437886],[37.5383916,55.4374857],[37.5316055,55.4517498],[37.5480083,55.4568969],[37.5447501,55.4726458],[37.5608448,55.4733871],[37.5654849,55.487418],[37.5870275,55.4867217],[37.5833567,55.4935768],[37.6113541,55.4896351],[37.6080963,55.509844],[37.5784455,55.5216802],[37.589454,55.557683],[37.6035767,55.5645916],[37.5984891,55.5744262],[37.6909246,55.5723191],[37.7321735,55.5887973],[37.8411397,55.6551916],[37.8325244,55.6836508],[37.8568896,55.6757013],[37.864792,55.6873501],[37.858176,55.7012543],[37.8715322,55.6952975],[37.9070118,55.7069911],[37.9151667,55.6970473],[37.9398067,55.6980146],[37.9132908,55.6833168],[37.9204717,55.676143],[37.9633779,55.673656],[37.9602039,55.692774],[37.9447161,55.6971238],[37.9597448,55.7045084],[37.9496668,55.7113411],[37.964077,55.7093106],[37.9598592,55.7140911],[37.9674277,55.716249],[37.9235854,55.7312255],[37.8824863,55.7190029],[37.8724504,55.723377],[37.864238,55.7347168],[37.8909533,55.7421946],[37.8825409,55.7493396],[37.8426549,55.7467345],[37.8434007,55.7747346],[37.8506765,55.7785667],[37.8431377,55.7792395],[37.8437616,55.8147738],[37.8360495,55.8242232],[37.7315551,55.8856186],[37.6292697,55.8999289],[37.5912017,55.9135942],[37.5559156,55.9092832],[37.5609557,55.9322714],[37.5702148,55.9364521],[37.5624642,55.9510736],[37.5794223,55.9494679],[37.5744299,55.9577717],[37.5374401,55.9528431],[37.5435935,55.9428103],[37.5192349,55.9419381],[37.5363206,55.9075674],[37.4859353,55.8883988],[37.4266635,55.8774643],[37.4094205,55.8806876],[37.3899171,55.9043205],[37.398713,55.9166177],[37.3943312,55.9226576],[37.4106248,55.925248],[37.4066636,55.939028],[37.4224581,55.9513146],[37.3415703,55.9568281],[37.3364424,55.9507148],[37.3540987,55.9389069],[37.3313205,55.9338701],[37.3437067,55.9241832],[37.3564628,55.9299543],[37.377823,55.9211143],[37.3660258,55.9153807],[37.3706763,55.9036305],[37.3617712,55.9014555],[37.3773568,55.8927083],[37.3712548,55.8833523],[37.411428,55.8709576],[37.3945561,55.8544023],[37.3749347,55.8551704],[37.3774889,55.8683619],[37.3458799,55.8629437],[37.3320767,55.8462996],[37.3490019,55.8437918],[37.3403714,55.8390079],[37.3523121,55.8212845],[37.3939187,55.829862],[37.3878905,55.8097622],[37.3717466,55.8092419],[37.3735617,55.8029868],[37.3867855,55.8069524],[37.36724,55.7903819],[37.3683562,55.7899745],[37.3700515,55.7887771],[37.3705437,55.7883226],[37.370622,55.7877908],[37.3652599,55.771728],[37.381352,55.7130943],[37.3924774,55.7059193],[37.3921625,55.6984232],[37.3781937,55.6968433],[37.3767396,55.7106743],[37.3644213,55.7089047],[37.3709402,55.7036925],[37.355769,55.6994601],[37.3560893,55.7047715],[37.3438553,55.6892225],[37.3376329,55.6935156],[37.3294276,55.6857865],[37.3348271,55.6824529],[37.3262279,55.68276],[37.3542991,55.6763211],[37.3611,55.6820978],[37.357973,55.6917385],[37.3748651,55.6889363],[37.4021617,55.6988389],[37.417481,55.6807762],[37.4040325,55.6710433],[37.4154573,55.6647647],[37.370952,55.6590578],[37.3646174,55.6691244],[37.3410192,55.657135],[37.3195225,55.664281],[37.3229081,55.6508895],[37.3112033,55.646572],[37.2902696,55.6484902],[37.290921,55.655349],[37.2902143,55.6484944],[37.2408203,55.6437305],[37.2350901,55.6373606],[37.2438889,55.6335642],[37.2273077,55.6196406],[37.1886489,55.6201733],[37.1720429,55.6052282],[37.1424864,55.6091606],[37.132427,55.5991855],[37.1164617,55.6056356],[37.0957269,55.6001139],[37.0991405,55.5961291],[37.0872002,55.5904847],[37.1254702,55.5499634],[37.1151768,55.5474463],[37.1135595,55.538946],[37.1225083,55.5383655],[37.1159062,55.5299985],[37.1186307,55.5131369],[37.1384665,55.5148805],[37.1361965,55.5000219],[37.1238807,55.4927453],[37.1382807,55.4826559],[37.1391906,55.4733418],[37.0933611,55.4704043],[37.0922795,55.4649172],[37.1500939,55.4389602],[37.1488482,55.4381762],[37.1084991,55.4395122],[37.1127784,55.4492266],[37.0892834,55.4412316],[37.0803245,55.4526986],[37.0586117,55.4546905],[37.0606131,55.4626603],[37.0368186,55.464061],[37.0321283,55.4559566],[37.0200709,55.4567858],[37.0192337,55.4451288],[37.0063088,55.4461697],[36.9940174,55.4583184],[36.9734462,55.4554605],[36.9777907,55.4937419],[36.9350578,55.4961553],[36.9399755,55.5165588],[36.9197539,55.5154461],[36.9194745,55.5058449],[36.8162398,55.5083513],[36.8152077,55.4659722],[36.8045117,55.465508],[36.8031012,55.4408329]]],[[[36.8997282,55.7337604],[36.8895754,55.7330266],[36.9141952,55.7328392],[36.9189142,55.7310489],[36.9237123,55.7368148],[36.9107236,55.7362346],[36.9102614,55.7365133],[36.9101237,55.736857],[36.9104673,55.7385651],[36.9047674,55.7413271],[36.9240219,55.7368892],[36.9436315,55.7546611],[36.9484381,55.7500398],[36.9352279,55.7371427],[36.9476722,55.7317613],[36.9775837,55.7421556],[36.9940932,55.7405823],[36.9839527,55.7385296],[36.9895569,55.734738],[36.9953439,55.73834],[37.0056864,55.7396562],[36.9856481,55.7273289],[36.9738432,55.7362565],[36.9620864,55.7299294],[36.9912379,55.7189466],[37.0060733,55.7253243],[37.0148396,55.7107633],[37.0242523,55.7095857],[36.9920438,55.7120899],[37.0041736,55.7054131],[37.0344352,55.7066217],[37.0246619,55.7097268],[37.0338403,55.7139869],[37.0545397,55.7097566],[37.0679025,55.7228781],[37.0788462,55.7154165],[37.1130095,55.7161027],[37.1277753,55.7280823],[37.1220161,55.7348608],[37.1073875,55.7415743],[37.0924909,55.7436487],[37.0794847,55.7354089],[37.0943494,55.7287203],[37.1203158,55.7317722],[37.1017724,55.7256202],[37.0737775,55.7301381],[37.0682754,55.7231292],[37.048983,55.7219833],[37.0525396,55.7183531],[37.0409758,55.7192852],[37.0467747,55.7268231],[37.0240186,55.7322579],[37.0291177,55.7339643],[37.0219665,55.7349139],[37.0204704,55.7454183],[36.9861771,55.7445116],[36.9911174,55.7484322],[36.9787545,55.7604866],[36.9781789,55.7511847],[36.9669592,55.7474575],[36.9563714,55.7539658],[36.9706585,55.7557498],[36.968056,55.7600373],[36.9080791,55.7487516],[36.8968708,55.7421693],[36.8997282,55.7337604]]],[[[36.9007522,55.3148568],[36.9076917,55.3112522],[36.9228058,55.3239412],[36.910332,55.3313028],[36.9007522,55.3148568]]],[[[37.1316021,56.0164459],[37.1511709,55.9995486],[37.1527443,55.9930578],[37.1440873,55.9898821],[37.149624,55.9622873],[37.2174548,55.9480078],[37.2193881,55.9571182],[37.2056397,55.9631208],[37.2205147,55.9813061],[37.2419261,55.979338],[37.2524878,55.9678978],[37.268302,55.9678365],[37.2612918,55.9680732],[37.2644583,55.9871372],[37.2537923,55.9882694],[37.2605357,55.9931529],[37.2073752,56.0171497],[37.1316021,56.0164459]]],[[[37.290502,55.8019897],[37.2931684,55.7963971],[37.3035641,55.8035588],[37.2977692,55.803354],[37.290502,55.8019897]]],[[[37.3494535,55.8064784],[37.3126617,55.7956909],[37.3209466,55.7978523],[37.3240838,55.7971166],[37.3249703,55.7966009],[37.3100592,55.7920866],[37.3118433,55.7801654],[37.3128271,55.7863845],[37.3283121,55.781108],[37.3084937,55.7705913],[37.3207023,55.7668207],[37.3470671,55.7695512],[37.3705101,55.7880302],[37.3486793,55.7964211],[37.3594884,55.8012546],[37.3494535,55.8064784]]],[[[37.7928913,56.0038815],[37.7921011,56.0024925],[37.7940939,56.0031557],[37.7928913,56.0038815]]],[[[37.7912235,56.0072852],[37.7968376,56.0047609],[37.7994322,56.0061526],[37.7985143,56.0097028],[37.7912235,56.0072852]]],[[[37.8453271,55.8135622],[37.8665868,55.8042107],[37.8830652,55.8162984],[37.8993112,55.8162911],[37.8722162,55.8225388],[37.8453271,55.8135622]]],[[[37.8735166,55.8252341],[37.8689418,55.8228697],[37.8760016,55.8249027],[37.8735166,55.8252341]]]]}}}} \ No newline at end of file diff --git a/tradein-mvp/backend/app/services/regions.py b/tradein-mvp/backend/app/services/regions.py index 3307f72d..c7347972 100644 --- a/tradein-mvp/backend/app/services/regions.py +++ b/tradein-mvp/backend/app/services/regions.py @@ -10,13 +10,21 @@ Регион 50 (Московская область) отложен сознательно — обоснование в #2996: 10 121 текстовое имя города против 612 у Москвы, вся мина имён — в области. +#3052: `region_for_point` резолвит по НАСТОЯЩЕЙ границе региона (полигон +OSM/Nominatim, `region_boundaries/boundaries.geojson.json`), не по +прямоугольнику `bbox_region` — прямоугольники Москвы и области пересекались +(Химки/Реутов/Котельники/Люберцы уходили в Москву), полигоны нет. + Модуль — ЛИСТ дерева импортов: не импортирует ничего из app.* (его читают -geocoder / location_index / matching.normalize, циклы недопустимы). +geocoder / location_index / matching.normalize, циклы недопустимы). json/ +pathlib — стандартная библиотека, листовость не нарушают. """ from __future__ import annotations +import json from dataclasses import dataclass +from pathlib import Path # bbox = (lat_min, lat_max, lon_min, lon_max) — тот же порядок, что исторический # geocoder.EKB_BBOX_TIGHT (см. is_within_bbox ниже). @@ -90,6 +98,80 @@ def is_within_bbox(lat: float, lon: float, bbox: BBox) -> bool: return lat_min <= lat <= lat_max and lon_min <= lon <= lon_max +# ── #3052: настоящая граница региона (point-in-polygon вместо bbox) ───────── +# +# Источник — region_boundaries/boundaries.geojson.json: полигоны OSM/Nominatim +# (см. поля _source/_license внутри файла, лицензия ODbL требует их хранить). +# Парсим один раз на импорте модуля — 27 точек лишний JSON-parse на каждый +# вызов region_for_point был бы дороже самого ray casting. +# +# Ring — одно кольцо GeoJSON (lon, lat) точек: внешний контур ИЛИ дыра. +# Полигон/мультиполигон региона хранится как ПЛОСКИЙ список всех его колец +# (для MultiPolygon 77 — кольца всех 10 частей вперемешку, у Polygon 50 — +# внешнее кольцо + 9 дыр). Плоский список работает благодаря even-odd +# правилу: точка внутри региона ⟺ она попадает внутрь НЕЧЁТНОГО числа колец +# из списка. Это ОДНОВРЕМЕННО корректно обрабатывает дыры (Москва — дыра в +# кольцах региона 50: попадание в кольцо-дыру снимает чётность, снятую +# внешним кольцом) и непересекающиеся части мультиполигона (попадание ровно +# в одно кольцо — нечётность не портится соседними частями, которые точка не +# задевает) — без явного разделения "внешний контур минус дыры". +Ring = list[tuple[float, float]] + +_BOUNDARIES_PATH = Path(__file__).parent / "region_boundaries" / "boundaries.geojson.json" + + +def _flatten_rings(geometry: dict[str, object]) -> list[Ring]: + """Все кольца геометрии (Polygon или MultiPolygon) одним плоским списком.""" + coords = geometry["coordinates"] + if geometry["type"] == "Polygon": + polygons = [coords] + elif geometry["type"] == "MultiPolygon": + polygons = coords # type: ignore[assignment] + else: + raise ValueError(f"неподдержанный тип геометрии: {geometry['type']}") + rings: list[Ring] = [] + for polygon in polygons: + for ring in polygon: # type: ignore[union-attr] + rings.append([(pt[0], pt[1]) for pt in ring]) # type: ignore[index] + return rings + + +def _load_region_boundaries() -> dict[int, list[Ring]]: + """code региона → плоский список колец его полигона/мультиполигона.""" + with _BOUNDARIES_PATH.open(encoding="utf-8") as f: + payload = json.load(f) + return { + int(code): _flatten_rings(entry["geometry"]) for code, entry in payload["regions"].items() + } + + +_REGION_BOUNDARIES: dict[int, list[Ring]] = _load_region_boundaries() + + +def _point_in_ring(x: float, y: float, ring: Ring) -> bool: + """PNPOLY (W. R. Franklin) ray casting для одного кольца.""" + inside = False + xj, yj = ring[-1] + for xi, yi in ring: + if (yi > y) != (yj > y) and x < (xj - xi) * (y - yi) / (yj - yi) + xi: + inside = not inside + xj, yj = xi, yi + return inside + + +def _point_in_region_polygon(code: int, lat: float, lon: float) -> bool: + """True если (lat, lon) внутри настоящей границы региона `code`. + + even-odd по всем кольцам сразу (см. комментарий выше про плоский список). + Региона без загруженной границы — граничит только по bbox (см. вызов в + region_for_point), сюда такой код не попадает.""" + inside = False + for ring in _REGION_BOUNDARIES[code]: + if _point_in_ring(lon, lat, ring): + inside = not inside + return inside + + # Тиры обогащения (строковые ключи — по label'ам _with_budget в estimator). TIER_AVITO_IMV = "avito_imv" TIER_YANDEX_VALUATION = "yandex_valuation" @@ -262,35 +344,55 @@ def _bbox_area(bbox: BBox) -> float: # Порядок обхода для region_for_point: от САМОГО специфичного (маленький # bbox_region) к самому общему — НЕ sorted(REGIONS) по числовому коду. # -# Почему код региона как ключ порядка сломался: bbox_region(50) (Московская -# область целиком, lat 54.20..56.96/lon 35.14..40.21) геометрически СОДЕРЖИТ -# bbox_region(77) (Москва, 55.10..56.10/36.80..38.10) как прямоугольники — а -# 50 < 66 < 77 по числу. При обходе `sorted(REGIONS)` регион 50 проверялся бы -# ПЕРВЫМ (50 < 77) и забирал бы себе ВСЕ точки Москвы, включая центр -# (55.75, 37.62) — она лежит в bbox_region обоих регионов одновременно. Старый -# докстринг называл это «на случай, если когда-нибудь пересекутся» — случай -# наступил прямо при добавлении региона 50, не гипотетически. +# #3052: сам резолв региона идёт по настоящему полигону (see +# _point_in_region_polygon), не по прямоугольнику — реальные админ-границы +# 50 и 77 не пересекаются (Москва вырезана дырой из полигона области), так +# что для КОНЕЧНОГО результата порядок обхода больше не обязателен: у точки +# есть ровно один полигон-кандидат, bbox какого региона ни проверяй первым. +# Порядок остаётся не как костыль корректности, а как ДЕШЁВЫЙ предварительный +# отсев: bbox_region(50) (Московская область целиком, lat 54.20..56.96/ +# lon 35.14..40.21) геометрически СОДЕРЖИТ bbox_region(77) (Москва, +# 55.10..56.10/36.80..38.10) как прямоугольники, а 50 < 77 по числовому коду. +# Если проверять регионы в порядке `sorted(REGIONS)`, для точки в центре +# Москвы bbox-отсев региона 50 пройдёт ПЕРВЫМ и завернёт в дорогой +# point-in-polygon по 1 227 точкам области раньше, чем дело дойдёт до +# компактного полигона Москвы (386 точек) — лишняя работа на каждый вызов, +# не баг результата (полигон 50 всё равно отвергнет точку — она в дыре), но +# systematic overhead на самом частом случае (Москва/область — соседи). # -# Площадь bbox_region (см. `_bbox_area`) как ключ сортировки решает это БЕЗ -# ручного списка: чем компактнее регион, тем раньше его проверяют, поэтому -# вложенный регион (77 внутри 50) всегда выигрывает у объемлющего, а будущий -# новый регион сам встанет в верную позицию по своей площади — правку этого -# места повторять не придётся. +# Площадь bbox_region (см. `_bbox_area`) как ключ сортировки решает и это без +# ручного списка: чем компактнее регион, тем раньше его bbox-отсев и (при +# совпадении) полигон проверяют, поэтому вложенный по bbox регион (77 внутри +# 50) почти всегда получает свою точку дешевле, а новый регион сам встанет в +# верную позицию по своей площади. _POINT_LOOKUP_ORDER: tuple[int, ...] = tuple( sorted(REGIONS, key=lambda code: (_bbox_area(REGIONS[code].bbox_region), code)) ) def region_for_point(lat: float, lon: float) -> Region | None: - """Регион покрытия, которому принадлежит точка (по bbox_region), или None. + """Регион покрытия, которому принадлежит точка, или None (вне охвата). - Обход — `_POINT_LOOKUP_ORDER` (компактный bbox_region раньше обширного), а - не числовой код региона: код как ключ порядка ломается ровно на паре - 50/77, см. комментарий у `_POINT_LOOKUP_ORDER`. + Два уровня отсева на каждого кандидата (порядок — `_POINT_LOOKUP_ORDER`, + компактный bbox_region раньше обширного, см. комментарий там): + 1. `is_within_bbox` по `bbox_region` — дешёвый прямоугольный предфильтр, + НЕ финальный ответ (прямоугольники Москвы и области пересекаются). + 2. Полигон (`_point_in_region_polygon`) — настоящая граница, решает + результат. Если bbox прошёл, а полигон точку не принял (точка в + прямоугольнике области, но не в её реальных границах — то есть, + например, внутри вырезанной дыры Москвы), идём к следующему + кандидату, а не возвращаем None сразу. + Региона без загруженного полигона в реестре нет (все REGIONS покрыты + boundaries.geojson.json) — на practике до fallback-ветки дело не доходит, + но она есть, чтобы новый регион без границы не «пропадал» молча, а + работал по старому bbox-поведению до того, как для него добавят полигон. """ for code in _POINT_LOOKUP_ORDER: - if is_within_bbox(lat, lon, REGIONS[code].bbox_region): - return REGIONS[code] + region = REGIONS[code] + if not is_within_bbox(lat, lon, region.bbox_region): + continue + if code not in _REGION_BOUNDARIES or _point_in_region_polygon(code, lat, lon): + return region return None diff --git a/tradein-mvp/backend/tests/test_3051_region_registry.py b/tradein-mvp/backend/tests/test_3051_region_registry.py index 5722b714..c348a7ec 100644 --- a/tradein-mvp/backend/tests/test_3051_region_registry.py +++ b/tradein-mvp/backend/tests/test_3051_region_registry.py @@ -50,7 +50,17 @@ def test_regions_do_not_overlap() -> None: — там же настоящий инвариант для вложенной пары: `region_for_point` обязан резолвить точку во ВЛАДЕЮЩИЙ, более специфичный регион по площади bbox, а не по числовому коду). 66 (Урал) физически за тысячи км от 50/77 — для него - старый плоский инвариант «никто ни в кого не попадает» остаётся в силе.""" + старый плоский инвариант «никто ни в кого не попадает» остаётся в силе. + + #3052: этот тест — про СЫРЫЕ прямоугольники (`is_within_bbox` / + `bbox_region`), не про итоговый резолв точки. Переход `region_for_point` + на настоящий полигон (см. regions._point_in_region_polygon) исключение + здесь НЕ снимает: bbox_region(77) геометрически остаётся подмножеством + bbox_region(50) как прямоугольник — полигон это не меняет, он работает + ПОСЛЕ bbox-предфильтра, а не вместо него. Честный инвариант «точка резолвится + ровно в один регион» теперь проверяется на уровне function-результата в + test_3051_region_registry_moscow_oblast.py (Химки/Балашиха и девять + контрольных точек issue #3052), не здесь.""" nested_pairs = {(50, 77), (77, 50)} # Исключение из инварианта обязано опираться на ДОКАЗАННУЮ вложенность, а не # на допущение в докстринге: сначала проверяем, что bbox_region(50) diff --git a/tradein-mvp/backend/tests/test_3051_region_registry_moscow_oblast.py b/tradein-mvp/backend/tests/test_3051_region_registry_moscow_oblast.py index 720f7d7e..30f3bcdd 100644 --- a/tradein-mvp/backend/tests/test_3051_region_registry_moscow_oblast.py +++ b/tradein-mvp/backend/tests/test_3051_region_registry_moscow_oblast.py @@ -13,6 +13,12 @@ bbox_region(77) (Москва) как прямоугольники, а 50 < 77 Область на дату этого PR — тир обогащения пуст (frozenset()), в deals/listings 0 строк (импорт Росреестра из FDW — отдельный PR). Тесты ниже проверяют РЕЕСТР (геометрию/классификацию), не данные. + +#3052: резолв внутри `region_for_point` перестал быть чисто bbox-based — +`_POINT_LOOKUP_ORDER` (регрессия ниже) остался прежним дешёвым предфильтром, +но финальный ответ теперь даёт настоящий полигон границы региона. Тест на +Химки/Балашиху обновлён под это (было «известное ограничение» bbox, теперь — +исправленное поведение). """ from __future__ import annotations @@ -73,20 +79,20 @@ def test_point_outside_all_regions_is_none() -> None: assert res is None -def test_known_limitation_khimki_balashikha_resolve_to_77_via_bbox() -> None: - """ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ, не баг этого PR: bbox_region(77) — генеральный - fallback-net Москвы, по долготе тянется до 38.10 (~13 км восточнее МКАД). - Химки (55.91, 37.41) и Балашиха (55.7965, 37.9388) физически лежат внутри - ЭТОГО прямоугольника, хотя административно это область. region_for_point - (bbox-based) резолвит их в 77; region_by_city (точное имя) — правильно в - 50 (см. test_region_by_city_resolves_moscow_oblast_cities). Сузить - bbox_region(77), чтобы это исправить, — отдельное решение вне скоупа - ordering-фикса (риск задеть geocoder/estimator-потребителей 77 без - возможности перепроверить их в этом PR).""" +def test_khimki_balashikha_resolve_to_50_via_polygon() -> None: + """#3052: bbox_region(77) — генеральный fallback-net Москвы, по долготе + тянется до 38.10 (~13 км восточнее МКАД). Химки (55.91, 37.41) и Балашиха + (55.7965, 37.9388) физически лежат внутри ЭТОГО прямоугольника, хотя + административно это область — до #3052 region_for_point (bbox-based) + резолвил их в 77 («известное ограничение», см. issue #3052: 8 647 + московских лотов уходили в отказ по покрытию, а 11 172 областные сделки + ложно попадали в московское ядро). С настоящим полигоном (bbox остался + только дешёвым предфильтром — см. regions.region_for_point) обе точки + физически вне контура Москвы → резолвятся в 50, как и region_by_city.""" khimki = regions.region_for_point(55.91, 37.41) - assert khimki is not None and khimki.code == 77 + assert khimki is not None and khimki.code == 50 balashikha = regions.region_for_point(55.7965, 37.9388) - assert balashikha is not None and balashikha.code == 77 + assert balashikha is not None and balashikha.code == 50 # ── 2. region_by_city ───────────────────────────────────────────────────── diff --git a/tradein-mvp/backend/tests/test_3052_region_polygon_boundary.py b/tradein-mvp/backend/tests/test_3052_region_polygon_boundary.py new file mode 100644 index 00000000..caac2bdf --- /dev/null +++ b/tradein-mvp/backend/tests/test_3052_region_polygon_boundary.py @@ -0,0 +1,68 @@ +"""#3052: `region_for_point` резолвит по настоящей границе региона (полигон +OSM/Nominatim из `region_boundaries/boundaries.geojson.json`), не по +прямоугольнику `bbox_region`. + +До фикса прямоугольники Москвы (77) и области (50) пересекались — Химки, +Реутов, Котельники, Люберцы резолвились в Москву (8 647 московских лотов +получали отказ по покрытию, 11 172 областные сделки ложно попадали в +московское ядро, при том что коридор ДКП фильтрует строго по коду региона). + +Девять контрольных точек ниже — приёмка issue #3052, значения сверены +`region_for_point` на реальных полигонах до мержа (ray casting с поддержкой +дыр, см. regions._point_in_region_polygon).""" + +from __future__ import annotations + +import os + +os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost:5432/test") + +from app.services import regions + +# (название, lat, lon, ожидаемый code региона или None) +_CONTROL_POINTS: tuple[tuple[str, float, float, int | None], ...] = ( + ("Химки", 55.8970, 37.4297, 50), + ("центр Москвы", 55.7558, 37.6173, 77), + ("Ломоносовский проспект", 55.7020, 37.5140, 77), + ("Серпухов", 54.9147, 37.4147, 50), + ("Балашиха", 55.7965, 37.9391, 50), + ("Зеленоград", 55.9840, 37.2140, 77), + ("Троицк (Новая Москва)", 55.4750, 37.3000, 77), + ("Екатеринбург", 56.8389, 60.6057, 66), + ("Пермь", 58.0105, 56.2502, None), +) + + +def test_nine_control_points_resolve_by_real_boundary() -> None: + for name, lat, lon, expected_code in _CONTROL_POINTS: + res = regions.region_for_point(lat, lon) + got_code = res.code if res is not None else None + assert got_code == expected_code, ( + f"{name} ({lat}, {lon}): ожидался регион {expected_code}, получен {got_code}" + ) + + +def test_point_outside_all_boundaries_is_none() -> None: + """Пермь — вне всех трёх полигонов (не только вне bbox), инвариант отдельно + от общего прогона выше — чтобы регрессия на None была явной сама по себе.""" + assert regions.region_for_point(58.0105, 56.2502) is None + + +def test_ekaterinburg_unaffected_by_polygon_switch() -> None: + """Регион 66 физически за тысячи км от 50/77 — переход на полигон не должен + был задеть его резолв вообще.""" + res = regions.region_for_point(56.8389, 60.6057) + assert res is not None and res.code == 66 + + +def test_bbox_prefilter_never_rejects_what_polygon_would_accept() -> None: + """Инвариант «полигон вложен в свой bbox_region»: если бы это было не так, + дешёвый bbox-предфильтр в region_for_point молча отбрасывал бы точки, + которые честный point-in-polygon принял бы — тихая потеря покрытия.""" + for code, rings in regions._REGION_BOUNDARIES.items(): + bbox = regions.REGIONS[code].bbox_region + for ring in rings: + for lon, lat in ring: + assert regions.is_within_bbox(lat, lon, bbox), ( + f"вершина полигона региона {code} ({lat}, {lon}) вне его bbox_region" + )