Задача обхода границы региона
Продолжение. См. предыдущий пост, Рис.4.
Чтобы упорядочить куски границы автоматически, нам необходимо опереться на некоторые факты или, если таковых будет не хватать, сделать некоторые допущения относительно топологии регионов. Граница, очевидно, замкнута.
Проверим, что куски границы одного и того же региона не перекрываются.
select t1.region_id, t1.id_fragment, t2.id_fragment, t1.g.STOverlaps(t2.g) from regions t1 cross join regions t2 where t1.id_fragment > t2.id_fragment and t1.region_id = t2.region_id
Скрипт 1
Значит, будем исходить из того, что следующим куском по отношению к данному идет тот, чья начальная или конечная точка находится ближе всех остальных начальных или конечных других кусков к конечной точке данного куска. Если это конечная точка другого куска, ее нужно сделать началом, т.е. перенаправить кусок в противоположном направлении. Идеальный вариант - если бы конец куска границы просто совпадал с начальной или конечной точкой другого куска и для большинства регионов это действительно так, однако можно видеть,
with
cteNumberOfTouchesWithinRegionBoundary as (
select t1.region_id, sum(cast(t1.g.STTouches(t2.g) as int)) n1 from regions t1 cross join regions t2 where t1.id_fragment > t2.id_fragment and t1.region_id = t2.region_id group by t1.region_id
),
cteNumberOfFragmentsWithinRegionBoundary as (
select region_id, COUNT(id_fragment) n2 from regions group by region_id
)
select cte1.region_id, n1, n2 from cteNumberOfTouchesWithinRegionBoundary cte1 join cteNumberOfFragmentsWithinRegionBoundary cte2 on cte1.region_id = cte2.region_id
Скрипт 2
что существуют регионы, где кол-во кусков границы не совпадает с кол-вом точек касания, поэтому ориентируемся не на расстояние = 0, а на минимальное расстояние.
Предполагаем далее, что регион может быть вогнутым, но не может иметь форму "восьмерки", т.е. когда к конечной точке куска вплотную подходит кусок с противоположного края, так что его начальная или конечная точка оказывается ближе, чем начальная или конечная точка куска, реально являющегося продолжением данного.
Алгоритм действий будет следующий. Поскольку граница региона замкнута, берем ее произвольный кусок в качестве начального и находим минимальное расстояние от его конечной точки до начальных и конечных точек других кусков. Если это конечная точка куска, он инвертируется. Найденный кусок будет следующим по отношению к данному. Берем второй кусок в качестве данного и аналогично находим для него следующий среди оставшихся кусков. Растереть, повторить:
declare @region_id int = 11
update regions set ord = null where region_id = @region_id --в начале работы обнуляем порядок у всех кусков границы региона
update top(1) regions set ord = 1 where region_id = @region_id --выбираем произвольный кусок границы региона в кач-ве первого
while ((select COUNT(1) from regions where region_id = @region_id and ord is null) > 0) exec FindNextFragment @region_id
select dbo.OrderedBoundaryToPolygon(@region_id)
Скрипт 3
Вспомогательная процедура FindNextFragment при условии, что мы имеем упорядоченными n кусков границы региона @region_id, данный код находит к ним n+1-й следующий по порядку кусок.
if OBJECT_ID('FindNextFragment', 'P') is not null drop proc FindNextFragment
go
create proc FindNextFragment @region_id int as
declare @g geometry, @n int
select top 1 @g = g, @n = ord from regions where region_id = @region_id and ord is not null order by ord desc --берем n-й кусок
declare @t table (id_fragment int, d0 float, d1 float) --в эту таблицу будут сложены расстояния от него до всех остальных еще не упорядоченных кусков.
--d0 - до начальной точки каждого отрезка, d1 - до конечной.
insert @t select id_fragment, @g.STDistance(g.STStartPoint()), @g.STDistance(g.STEndPoint()) from regions where region_id = @region_id and ord is null
if @@ROWCOUNT = 0 return --если неупорядоченных кусков не осталось, выходим
declare @id_fragment_min0 int, @id_fragment_min1 int
select top 1 @id_fragment_min0 = id_fragment from @t order by d0 --находим кусок с минимальным расстоянием до своей начальной точки
select top 1 @id_fragment_min1 = id_fragment from @t order by d1 --и кусок с минимальным расстоянием до своей конечной точки
--тот из этих двух кусков, чье расстояние минимальней, и будет следующим
if (select d0 from @t where id_fragment = @id_fragment_min0) < (select d1 from @t where id_fragment = @id_fragment_min1)
update regions set ord = @n + 1 where id_fragment = @id_fragment_min0
else
--если минимальным оказывается расстояние до конечной точки куска, этот кусок инвертируем
update regions set ord = @n + 1, g = dbo.ReverseLinestring(g) where id_fragment = @id_fragment_min1
--Далее можно было бы поставить рекурсивный вызов и упорядочить остальные куски границы, но регион может иметь > 32 кусков
--Msg 217, Level 16, State 1, Procedure FindNextFragment, Line 18
--Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
--exec FindNextFragment @region_id = @region_id
go
Скрипт 4
Вспомогательная функция OrderedBoundaryToPolygon превращает упорядоченные куски границы в полигон. Она проходится по всем linestringам, из которых состоит граница, в порядке, заданном в колонке Ord, который мы навели предыдущей процедурой, и вытаскивает из каждой linestring составляющие ее точки в определение многоугольника.
if OBJECT_ID('OrderedBoundaryToPolygon', 'FN') is not null drop function OrderedBoundaryToPolygon
go
create function OrderedBoundaryToPolygon(@region_id int) returns geometry as begin
declare @g geometry, @s varchar(max) = 'POLYGON((', @ord int = 0
while 1 = 1 begin
select top 1 @g = g from regions where region_id = @region_id and ord > @ord order by ord
if @@ROWCOUNT = 0 break
declare @i int = 1
while @i <= @g.STNumPoints() begin
set @s += cast(cast(@g.STPointN(@i).STX as decimal(20, 9)) as varchar(20)) + ' ' + cast(cast(@g.STPointN(@i).STY as decimal(20, 9)) as varchar(20)) + ', '
set @i += 1
end
set @ord += 1
end
select top 1 @g = g.STStartPoint() from regions where region_id = @region_id order by ord
set @s += cast(cast(@g.STX as decimal(20, 9)) as varchar(20)) + ' ' + cast(cast(@g.STY as decimal(20, 9)) as varchar(20)) + '))'
return geometry::STGeomFromText(@s, 0)
end
go
Скрипт 5
Также, как отмечалось выше, некоторые куски границы приходится инвертировать, т.е. перестраивать составляющие linestring точки в обратном порядке. Среди геопространственных методов SQL Server такого нет, хотя народ намекает, что неплохо бы иметь, (я присоединяюсь). Пока придется написать еще одну функцию:
--Функция переставляет точки в LineString в обратном порядке
if OBJECT_ID('ReverseLinestring', 'FN') is not null drop function ReverseLinestring
go
create function ReverseLinestring(@g geometry) returns geometry as begin
if @g.STGeometryType() <> 'LineString' return null
declare @s varchar(max) = 'LINESTRING(', @i int = @g.STNumPoints(), @p geometry
while (@i >= 1) begin
set @p = @g.STPointN(@i)
set @s += CAST(cast(@p.STX as decimal(20, 9)) as varchar(20)) + ' ' + CAST(cast(@p.STY as decimal(20, 9)) as varchar(20)) + ','
set @i -= 1
end
return geometry::STLineFromText(STUFF(@s, len(@s), 1, ')'), 0)
end
go
Скрипт 6
Выполняем Скрипт 3 и видим, что Рис.4 из предыдущего поста превращается в осмысленную область:
Рис.1
Домашнее задание.
Усложним задачу. В данном посте мы исходили из того, что куски границы привязаны к регионам. Куски могут быть неупорядочены, они могут менять направление, однако известно, какие наборы кусков к какому региону относятся. В жизни это было не так. Посмотрите на Рис.3 в предыдущем посте. Разноцветные ниточки - это куски границ регионов. Никакого указания на region_id нет. Требуется, имея неупорядоченный набор linestring'ов, выделить из них замкнутые циклы, образующие границы регионов и соотнести каждый кусок границы со своим регионом. Как и в случае отдельного региона, некоторые куски, возможно, потребуется развернуть в противоположном направлении.
Забыл сказать, что бифуркации (ответвление границы смежного региона от общей границы)
Рис.2
не могут происходить внутри кусков границы. Видите, везде из этих точек расходятся ребра разных цветов. Постулируя непрерывность и замкнутость границы региона (с учетом замечания Скрипта 2 под непрерывностью понимаем, что расстояние между концом данного куска и началом следующего может быть, вообще говоря, != 0, а < некоторого эпсилон. По-моему, наглядная иллюстрация кротовых нор и дискретности пространства на сверхмалых масштабах :)), это означает, что точки бифуркации могут быть только в начальных/конечных точках linestring’ов (или их эпсилон-окрестности).
В предыдущем посте приводились данные для одного региона. Вот куски границ еще для 4-х вперемешку. Требуется соотнести каждый кусок со своим регионом, упорядочить границы и построить многоугольники.
LINESTRING (-3488867.8 3118322.8, -3495695.2 3110069.5, -3505347.8 3111652, -3511688.8 3109523, -3515923.2 3105488, -3518324 3100537, -3516615 3092007.2, -3514287.2 3087296, -3519644.8 3085294.8, -3524866.5 3083724.2, -3530357.8 3081323.2, -3531090.2 3075803.2, -3530853.5 3069512, -3531295 3061992.5, -3535950.8 3056694.2, -3535741.8 3051368.2, -3536149.5 3045476.5, -3538349 3039914.8, -3543285.2 3037634, -3546856.5 3031594.8, -3552718.8 3030858, -3556165.8 3025915)
LINESTRING (-3180269.8 2984801, -3185437.5 2986759.5, -3189823.5 2989560.5, -3195732 2990476, -3197652.5 2996321.8, -3200201.5 3001132.2, -3202721 3005611, -3207381.8 3008151, -3212373.2 3009702, -3214706 3014431.5, -3220328.8 3012762.8, -3226060.5 3008478.8, -3232204.5 3008118.2, -3237625.2 3009291, -3242911.2 3012282, -3244734 3018715.8, -3247002 3025209.2, -3252430 3026472.2, -3257641.5 3022006.5, -3262793 3018594.5, -3266311 3022395.5, -3266247.5 3027636.5, -3265333 3033196.2, -3267488.8 3040386.5, -3269256 3045846.5, -3269449.8 3051500, -3274034.2 3055233.8, -3277584.8 3059569.5, -3284601.8 3060577, -3288890.8 3070334.8, -3295135 3070985.5, -3300414.2 3069787.2, -3306024.2 3066932.5, -3304455.5 3062192.8, -3307338.2 3057350.2, -3312835.2 3053146.2, -3318707.8 3051296.2, -3322440 3054628.8, -3326774.5 3051144.8, -3331955.2 3047569.8, -3337198.2 3046034.5, -3342718.5 3048017, -3348313 3050401, -3353409.2 3048148.2, -3358674.5 3045929.8, -3363851.8 3045907.8, -3370296.5 3038790.2, -3373071.8 3043208.8, -3376692.8 3048080.8, -3379231 3053463.2, -3382018 3058701.8, -3385508 3062467.5, -3390173.8 3064154.2, -3395726.8 3063574.2, -3404880.5 3064926, -3410042.5 3065467, -3415831.2 3066421.5, -3421687.5 3073001.8, -3429186.2 3074258.8, -3434901.5 3075623.8, -3441356.8 3076612.2, -3447578.8 3083500.5, -3446785.5 3088836, -3456876.8 3087570.5, -3464211.5 3085100.5, -3469513.8 3087144.2, -3472852.8 3090849.2, -3477662.2 3094276.2, -3479554 3099249.8, -3483468.2 3103444.8, -3484178 3109897.2, -3488867.8 3118322.8)
LINESTRING (-3171615.2 2985794.8, -3173543.8 2975664.5, -3169353.2 2972687, -3165245.8 2969679.2, -3160596 2972630.5, -3155449.5 2972949, -3150442.5 2972865.5, -3145360.8 2976063.2, -3139993.5 2973800, -3134698.2 2973263, -3129554.5 2977779, -3124332 2974784, -3120372 2970191.5, -3115630 2967802.2, -3121607.2 2957420.8)
LINESTRING (-3121607.2 2957420.8, -3126573 2949779, -3127163.8 2944718.2)
LINESTRING (-3127163.8 2944718.2, -3128820.5 2937737.5, -3129947.2 2930433.8, -3132735.2 2923219.5, -3129988.2 2918448)
LINESTRING (-3129988.2 2918448, -3135298.8 2914665.8)
LINESTRING (-3135298.8 2914665.8, -3140664.8 2915260, -3146845.2 2916646.2, -3155798 2913397.2, -3161344.5 2912995.2, -3166229.8 2911171.2, -3166261.5 2905090.5, -3164662.5 2899752.2, -3165405.5 2893865, -3166389 2885986, -3172233.5 2887395.5, -3177166.5 2888853, -3181281 2885342.8, -3185029.5 2889318, -3188997.2 2893054.2, -3193316.2 2884483.5, -3197645.2 2880747, -3199555.5 2873886.2, -3201265.5 2866630, -3202545.5 2860981.5, -3206070 2856557.8, -3207170.2 2849197, -3207628.5 2839004.5, -3214126.2 2837684.8, -3216349 2831640, -3220415 2827892.2, -3222344.8 2821921.5, -3222693.2 2816712.8, -3220736.8 2810206.2, -3210709.8 2804556.8, -3213541 2799392.8, -3217892 2795758.2, -3224772.5 2796935.2, -3230109.5 2797278.2, -3232718.2 2791234.5, -3235435 2786482.2, -3239644 2781804, -3244445.8 2779244.8, -3250022 2778956.5, -3253643.8 2774383.8, -3258520.2 2772655.8, -3264275.2 2770251.2)
LINESTRING (-3264275.2 2770251.2, -3269201.8 2763872.5, -3272835.5 2768615.8, -3271429.5 2775099.8, -3266185.5 2779656.2, -3268651 2785105, -3268765.8 2790350.8, -3267270 2795474, -3276241 2802116.2, -3280491.2 2798427.5, -3291461.2 2798691.8, -3299068.2 2803685, -3302530.5 2808188.5, -3305821.2 2812240.2, -3309514.2 2807956.8, -3310981.2 2802658.8, -3316493 2801067, -3320717.8 2795785, -3328179.5 2791429.8, -3330119 2796313.8, -3329168.5 2801499.5, -3335140.5 2810786.5, -3342373.2 2813166.5, -3347068 2815282, -3352819.2 2815382.2, -3359241.5 2820766.2, -3369898 2825971.2, -3374375.8 2829121, -3379545 2831583.8, -3383270.2 2835018.2, -3388120 2844918.5, -3385769 2851924.8, -3386453.2 2858778.5, -3396251.2 2861651.2, -3400547.5 2855759.8, -3405186 2851302, -3409036 2846554.2, -3414545.8 2849377.8, -3419574.2 2847935, -3424551.5 2847765.2, -3428869 2843567.5, -3444088.2 2845814.5)
LINESTRING (-3556165.8 3025915, -3564917.5 3018225.2, -3566011.2 3011414.2, -3566432.2 3001428.2, -3566456.5 2992100.5, -3570850.5 2985632.8, -3576500.5 2978487.8, -3576279.8 2972967.5, -3571728 2969230, -3568895 2964044, -3566953.5 2958918.5, -3561992 2955132.2, -3557793 2948345.8, -3554525 2943626.2, -3552825.2 2938844.2, -3547284 2930184, -3541809.8 2926052.2, -3540150.8 2918101.5, -3536587 2913057.5, -3529280.8 2914291, -3522035.2 2913373.8, -3515831.8 2911140.2, -3510483.5 2914801.2, -3502949.2 2917986.2, -3497609.2 2915718.2, -3495527 2910322, -3497903 2904654.8, -3494865.8 2900489, -3489325.8 2903756.2, -3484918.5 2906863.5, -3480125.2 2904931.2, -3474861.8 2896387.2, -3471575.5 2891156, -3468123 2882548.2, -3467501.8 2877451.2, -3466533.8 2872521.8, -3463266.5 2863684, -3459692.8 2860103, -3460518.8 2852673, -3456261.8 2847798.8, -3450211.2 2845684.8, -3444088.2 2845814.5)
LINESTRING (-3171615.2 2985794.8, -3180269.8 2984801)
LINESTRING (-3411515.8 3236856, -3417517 3237129.5, -3421692.5 3232199.2, -3418784 3227903, -3416545.5 3223278.8, -3417136 3217520.2, -3416404.8 3212169.5, -3412919.2 3203059.2, -3410869.2 3197786, -3416718.2 3194415, -3421751.8 3194503.8, -3426173.8 3191017, -3431712 3187654.5, -3431886.5 3180652.8, -3429370.5 3175260.8, -3442071.8 3175576, -3446684 3172589.8, -3452641.8 3172890.5, -3458419 3171137.8, -3464479.2 3163233.5, -3465384 3158005, -3464927 3152491.2, -3466316.5 3146550.5, -3472005.2 3146210, -3476271.8 3141738.5, -3480719.2 3138318.8, -3486704.8 3134066.5, -3491573.5 3128901.8, -3492425.8 3122258.5, -3488867.8 3118322.8)
LINESTRING (-3373683 3262694.8, -3380396 3259058.5, -3385966.2 3257094.5, -3391169.8 3258258, -3397217.8 3263437, -3405560.5 3257414.8, -3410779.2 3256162.2, -3413771 3251699, -3409249 3243320.8, -3411515.8 3236856)
LINESTRING (-3184156 3134827, -3180465.8 3144925.8, -3179826.2 3150078, -3177367.2 3155851.8, -3177139.8 3161091.8, -3182997.5 3169169.2, -3189045.8 3166900.8, -3191031.5 3171583.8, -3188601.2 3177158.5, -3189606 3188119.8, -3196756 3188500.5, -3201590.8 3190296, -3208157 3190967, -3214088.2 3188782.2, -3218754.2 3185537.2, -3224646.2 3184247, -3230234.5 3185208.5, -3233433.8 3190442.2, -3235886.8 3195433.2, -3231418.2 3199185.2, -3231979.8 3204703, -3227244 3207885.5, -3224246.8 3212630.2, -3221449 3218114, -3220587.2 3224250, -3218679.2 3229768.8, -3219003.8 3235175.2, -3223982.5 3236477.8, -3230677.5 3236272.2, -3233357.8 3241139.8, -3233453.5 3248030, -3241340.8 3247809.2, -3245866.5 3244818.8, -3249579.5 3240966.8, -3254671.5 3240376.2, -3260230 3238710.5, -3266142.5 3237489.8, -3272285.2 3238248, -3278281.8 3239474, -3275763.8 3249937, -3279464.8 3255887.2, -3284548 3256287, -3287088 3251329.5, -3292608.2 3250619.2, -3298356.8 3250098.5, -3305869.2 3252427.8, -3310362.2 3256077.8, -3313305 3251474.5, -3319374.5 3248477, -3327346 3255539, -3331125.2 3260451.8, -3328886.2 3265724, -3331755.8 3270221, -3334448.5 3274830.2, -3339780.8 3273944.8, -3345737.5 3271964, -3350364.5 3267519.5, -3353587.5 3262762.5, -3358969.2 3261159, -3365120.2 3259846.2, -3373683 3262694.8)
LINESTRING (-3166435 3086962, -3170326.8 3078773, -3174110.5 3074110.8, -3175321.8 3068267.8, -3175555.5 3063079.5, -3170226 3061293.8, -3171294 3056077.8, -3176354.5 3056671.8, -3180677 3053358, -3179358 3048510.2, -3178505.5 3043377.8, -3172912.8 3043699.8, -3168885.8 3040540.5, -3166885.2 3035961.5, -3168354.8 3030805.2, -3164802 3027127.5, -3159694.2 3026747.5, -3161339 3021152.5)
LINESTRING (-3161339 3021152.5, -3165279.8 3010484.5, -3162718.2 3005994.2, -3162633.5 3000091.8, -3165529.5 2995287.8, -3167504.2 2990230.8, -3171615.2 2985794.8)
LINESTRING (-3171615.2 2985794.8, -3180269.8 2984801)
LINESTRING (-3180269.8 2984801, -3185437.5 2986759.5, -3189823.5 2989560.5, -3195732 2990476, -3197652.5 2996321.8, -3200201.5 3001132.2, -3202721 3005611, -3207381.8 3008151, -3212373.2 3009702, -3214706 3014431.5, -3220328.8 3012762.8, -3226060.5 3008478.8, -3232204.5 3008118.2, -3237625.2 3009291, -3242911.2 3012282, -3244734 3018715.8, -3247002 3025209.2, -3252430 3026472.2, -3257641.5 3022006.5, -3262793 3018594.5, -3266311 3022395.5, -3266247.5 3027636.5, -3265333 3033196.2, -3267488.8 3040386.5, -3269256 3045846.5, -3269449.8 3051500, -3274034.2 3055233.8, -3277584.8 3059569.5, -3284601.8 3060577, -3288890.8 3070334.8, -3295135 3070985.5, -3300414.2 3069787.2, -3306024.2 3066932.5, -3304455.5 3062192.8, -3307338.2 3057350.2, -3312835.2 3053146.2, -3318707.8 3051296.2, -3322440 3054628.8, -3326774.5 3051144.8, -3331955.2 3047569.8, -3337198.2 3046034.5, -3342718.5 3048017, -3348313 3050401, -3353409.2 3048148.2, -3358674.5 3045929.8, -3363851.8 3045907.8, -3370296.5 3038790.2, -3373071.8 3043208.8, -3376692.8 3048080.8, -3379231 3053463.2, -3382018 3058701.8, -3385508 3062467.5, -3390173.8 3064154.2, -3395726.8 3063574.2, -3404880.5 3064926, -3410042.5 3065467, -3415831.2 3066421.5, -3421687.5 3073001.8, -3429186.2 3074258.8, -3434901.5 3075623.8, -3441356.8 3076612.2, -3447578.8 3083500.5, -3446785.5 3088836, -3456876.8 3087570.5, -3464211.5 3085100.5, -3469513.8 3087144.2, -3472852.8 3090849.2, -3477662.2 3094276.2, -3479554 3099249.8, -3483468.2 3103444.8, -3484178 3109897.2, -3488867.8 3118322.8)
LINESTRING (-3166435 3086962, -3170077.8 3095154.2, -3172084 3100157, -3172567.5 3105550, -3170950.5 3112590, -3178213 3119656, -3183279.2 3120196, -3184321.5 3125508, -3184156 3134827)
LINESTRING (-3371087 3405495.2, -3366112.8 3394492.8, -3366044.2 3387869.8, -3364813.8 3382607.2, -3368574.8 3377352.5, -3370843.8 3372432.2, -3374731.5 3368105.2, -3367561.8 3361860.8, -3365597.2 3356473, -3364299.8 3351614.8, -3363692.5 3344939.2, -3363025.8 3339647.5, -3361766 3334476.2, -3359046.5 3329811, -3363787 3326498, -3365403.5 3316852.8, -3364295.5 3311344.5, -3372616.5 3308057, -3371231 3302359.5, -3375389.8 3298053.5, -3371415 3294904.8, -3372157 3288720.2, -3376870.2 3285891.8, -3378561.8 3280498, -3376336.2 3276007.8, -3377010 3269327.8, -3373683 3262694.8)
LINESTRING (-3371087 3405495.2, -3364953.8 3406883.8, -3359320.2 3409000, -3354236.2 3408882, -3347877.2 3410077.2, -3342135 3411754, -3334657.5 3405927, -3330717.8 3402887.8, -3325826 3404812.8, -3321100.2 3407698, -3319844.5 3412761.8, -3317538 3418640.2, -3310454.2 3421503.2, -3304378.8 3424421.8, -3301080.2 3429353.2, -3297237.8 3433255, -3291198.8 3436476, -3285823.2 3436752.2, -3283157.8 3432149.2, -3288785.8 3426289, -3290820.5 3420611.8, -3284061 3415997, -3279216.5 3418684.8, -3273772.8 3421405.8, -3268260.2 3415707.8, -3269421 3409382.2, -3263516 3401894, -3259817.5 3397603.8, -3254394.5 3397643.8, -3249592.8 3400180.5, -3243251.5 3403521.5, -3238727 3401142.5, -3234484.8 3392320.2, -3233449.2 3386871.5, -3231191.2 3382371.5, -3231695.8 3376600.8, -3228694.8 3367283.5, -3228630 3361001.8, -3228349 3355020, -3226216.2 3350412.2, -3218945 3347116.5, -3214471.2 3350223.5, -3210983.8 3354392, -3214613.8 3363802.2, -3210702.2 3368561, -3203063.8 3375684, -3203097 3381126, -3203752 3388483, -3205502.8 3393606, -3213465 3398972.8, -3216385.5 3404024, -3218768.2 3409246.5, -3221854.5 3418727, -3217788.2 3423299.8, -3215869.5 3429494.8)
LINESTRING (-3215869.5 3429494.8, -3211427.2 3438009.5, -3214127.8 3445787.8, -3212478.2 3451462.8, -3205500.8 3455787.8)
LINESTRING (-3205500.8 3455787.8, -3198472.5 3453841, -3194389.2 3458187, -3189321.5 3462308.5)
LINESTRING (-3180532.5 3467074, -3182942.2 3471829.8, -3194769 3478095.5, -3205430.8 3476949, -3212607.2 3482940.5, -3216174.8 3491950, -3215904.2 3497360.8, -3210885 3497109.2, -3197678.5 3496412.5, -3191585.2 3495525.2, -3186580.5 3494150.5, -3181513 3494777.5, -3176342.8 3492865.8, -3170765.8 3492999.2, -3165639.8 3491889.8, -3160325.5 3490902.2, -3155384 3489694.5, -3153254.2 3484985, -3148235.2 3484812, -3142302.5 3487313.5)
LINESTRING (-3142302.5 3487313.5, -3136523 3486645, -3130551.5 3487235.8, -3126334.5 3483518.5, -3116692.8 3481216.8, -3111456.5 3479767.5, -3105228.8 3478779.2, -3099552.5 3478859.2)
LINESTRING (-3099552.5 3478859.2, -3104180.8 3468323.8, -3102948.2 3462473.8, -3107207 3456349, -3105122.8 3451620, -3102503.8 3443707)
LINESTRING (-3092519.8 3270646.2, -3092487 3278605.8, -3102541.5 3272472.8, -3107173 3269564.8, -3112291.2 3269084, -3118193 3265330.2, -3122848.8 3261929, -3129415.8 3261478.2, -3134812.5 3263330, -3138463.8 3267467.5, -3142949.5 3275745.8, -3138346 3280853, -3136016.5 3286127.5, -3142073.5 3292636.5, -3144446.8 3297081.8, -3146004 3302378, -3152091 3301775, -3159173.5 3303189.5, -3164340.5 3299300, -3169901.2 3299718, -3173491.5 3294750.8, -3177835.2 3290695.2, -3184180 3289869.8, -3188843.8 3293568, -3188150.8 3298839, -3190037.5 3303471.2, -3194079 3311916.2, -3188547.8 3313235, -3183703.2 3315725.8, -3179313.2 3320769.5, -3174350.2 3323877.8, -3169893.8 3328299.5, -3169929.2 3334211.8, -3165686.8 3337817, -3161072.8 3342843.8, -3156859.5 3346405.2, -3152124 3352757.2, -3149069.8 3357946.2, -3144887 3363756.5, -3141694 3368891.2, -3140178 3375044.2, -3140552 3380203.8, -3135653.2 3383338, -3131081.5 3387701.8, -3125633 3388488.8, -3120271 3394138.8, -3118683.5 3399982.5, -3114048.2 3404127.8, -3111399.5 3409080.5, -3108837.8 3416117, -3106569.5 3421918, -3103531.5 3427421, -3103090.8 3434830.8, -3102503.8 3443707)
LINESTRING (-3070581 3281866.2, -3072542 3276332.8, -3077045.2 3272979.2, -3082777.8 3271158.5, -3092519.8 3270646.2)
LINESTRING (-3070581 3281866.2, -3063447 3275404, -3058396.5 3272944.5, -3053501.5 3275153.8, -3048173.5 3277109.5, -3042221.8 3277364.2, -3035976 3274912.5, -3031469.5 3272302, -3026763.5 3278405.5, -3023235.8 3273345.8, -3022493.2 3264935.2, -3020035.5 3259056.5, -3014677.5 3260783.8, -3009012.5 3262932.5, -3004350.2 3265896.2, -3004540.5 3271189, -3007454.8 3276390.8, -3014818.8 3276775.8, -3012457 3282116.5, -3012128 3287203, -3007069 3287971.8, -3000697.8 3288577, -2996549.8 3285050.2, -2990808 3276209.8, -2980341.8 3260875, -2981082.2 3254440, -2973366.8 3250826, -2968336.8 3250892.2, -2960402 3241964, -2956729.2 3237094.8, -2955783.5 3231323.2, -2953686 3225196.8, -2950791 3220949.8, -2944721.8 3219025.8, -2954304.2 3211342.5, -2952374.5 3204750, -2945147.5 3202525.2)
LINESTRING (-2945147.5 3202525.2, -2949771 3193711.2, -2954862.5 3192577.8, -2960388 3190746, -2966487 3193859.8, -2971045.2 3190473.2, -2973468.2 3185279.8)
LINESTRING (-2973468.2 3185279.8, -2984733 3189278, -2989642 3191489, -2995366.8 3190304, -2999798.5 3186640, -3004054 3182771.2, -3006187 3177660, -3010787.5 3172348.2, -3015709 3168651.5, -3020758.5 3165423.2, -3034606.8 3155242, -3039732 3153090.2, -3045174 3152808.2, -3050192.2 3148877.5, -3054936.2 3146530.8, -3058574.5 3142113.2, -3062675.2 3138438.2, -3069407.5 3137775.8, -3066362.2 3131464, -3066101 3125196, -3063130 3120428.8, -3067750.5 3116762.5, -3072916.5 3118495.2, -3077824 3115332.2, -3084850.2 3109199.8, -3089585.2 3104773, -3088335.8 3099672.5)
LINESTRING (-3088335.8 3099672.5, -3098373 3091953.8, -3103526.8 3088489.8, -3109315.2 3090680.8, -3114545.5 3091200.2, -3115034 3085910.2, -3117778.2 3080929.5, -3123034.5 3081517.5, -3127984.5 3082704, -3133324.8 3081584, -3139276.5 3082401, -3143514.8 3085118, -3151042 3091374.5, -3156324.2 3091229.8, -3161374 3090150.8, -3166435 3086962)
LINESTRING (-3166435 3086962, -3170077.8 3095154.2, -3172084 3100157, -3172567.5 3105550, -3170950.5 3112590, -3178213 3119656, -3183279.2 3120196, -3184321.5 3125508, -3184156 3134827)
LINESTRING (-3184156 3134827, -3180465.8 3144925.8, -3179826.2 3150078, -3177367.2 3155851.8, -3177139.8 3161091.8, -3182997.5 3169169.2, -3189045.8 3166900.8, -3191031.5 3171583.8, -3188601.2 3177158.5, -3189606 3188119.8, -3196756 3188500.5, -3201590.8 3190296, -3208157 3190967, -3214088.2 3188782.2, -3218754.2 3185537.2, -3224646.2 3184247, -3230234.5 3185208.5, -3233433.8 3190442.2, -3235886.8 3195433.2, -3231418.2 3199185.2, -3231979.8 3204703, -3227244 3207885.5, -3224246.8 3212630.2, -3221449 3218114, -3220587.2 3224250, -3218679.2 3229768.8, -3219003.8 3235175.2, -3223982.5 3236477.8, -3230677.5 3236272.2, -3233357.8 3241139.8, -3233453.5 3248030, -3241340.8 3247809.2, -3245866.5 3244818.8, -3249579.5 3240966.8, -3254671.5 3240376.2, -3260230 3238710.5, -3266142.5 3237489.8, -3272285.2 3238248, -3278281.8 3239474, -3275763.8 3249937, -3279464.8 3255887.2, -3284548 3256287, -3287088 3251329.5, -3292608.2 3250619.2, -3298356.8 3250098.5, -3305869.2 3252427.8, -3310362.2 3256077.8, -3313305 3251474.5, -3319374.5 3248477, -3327346 3255539, -3331125.2 3260451.8, -3328886.2 3265724, -3331755.8 3270221, -3334448.5 3274830.2, -3339780.8 3273944.8, -3345737.5 3271964, -3350364.5 3267519.5, -3353587.5 3262762.5, -3358969.2 3261159, -3365120.2 3259846.2, -3373683 3262694.8)
LINESTRING (-3102503.8 3443707, -3098207 3449885.2, -3092049.2 3446487.2, -3088051 3440100, -3083103.2 3442893.5, -3078107.5 3441579.8, -3072564.5 3442224.5, -3066392.8 3444304.5, -3061937 3448348.5, -3056461.5 3448709.8, -3051351.8 3443372, -3049078.2 3438154, -3043003.5 3439539.8, -3038748 3443227.8, -3034471.5 3440135.8, -3028765 3442299.8, -3023177.2 3442406.8, -3017238.5 3442774.5, -3020965.5 3436300, -3019452.8 3429343, -3020824.8 3424060.5, -3025341.2 3421138.8, -3024296.5 3416281.8, -3019062.8 3409528.5, -3021427 3401518.8, -3025026 3396405.5, -3027310.8 3391664.2, -3031610.5 3387746.2, -3032793.2 3382288.8, -3034190.8 3375168.2, -3033398.8 3369393.5, -3036568.2 3364436.8, -3037262 3357872.5, -3036392.8 3349916.5, -3036792.8 3344755, -3036656.8 3334610, -3037837.8 3328029.5, -3041444 3321092.2, -3046214.8 3316048, -3050764 3311466, -3053927 3305585.2, -3055953.5 3300061.5, -3058142.2 3294988, -3062338 3291521.5, -3067191 3287969, -3070581 3281866.2)
LINESTRING (-3070581 3281866.2, -3072542 3276332.8, -3077045.2 3272979.2, -3082777.8 3271158.5, -3092519.8 3270646.2)
LINESTRING (-3092519.8 3270646.2, -3092487 3278605.8, -3102541.5 3272472.8, -3107173 3269564.8, -3112291.2 3269084, -3118193 3265330.2, -3122848.8 3261929, -3129415.8 3261478.2, -3134812.5 3263330, -3138463.8 3267467.5, -3142949.5 3275745.8, -3138346 3280853, -3136016.5 3286127.5, -3142073.5 3292636.5, -3144446.8 3297081.8, -3146004 3302378, -3152091 3301775, -3159173.5 3303189.5, -3164340.5 3299300, -3169901.2 3299718, -3173491.5 3294750.8, -3177835.2 3290695.2, -3184180 3289869.8, -3188843.8 3293568, -3188150.8 3298839, -3190037.5 3303471.2, -3194079 3311916.2, -3188547.8 3313235, -3183703.2 3315725.8, -3179313.2 3320769.5, -3174350.2 3323877.8, -3169893.8 3328299.5, -3169929.2 3334211.8, -3165686.8 3337817, -3161072.8 3342843.8, -3156859.5 3346405.2, -3152124 3352757.2, -3149069.8 3357946.2, -3144887 3363756.5, -3141694 3368891.2, -3140178 3375044.2, -3140552 3380203.8, -3135653.2 3383338, -3131081.5 3387701.8, -3125633 3388488.8, -3120271 3394138.8, -3118683.5 3399982.5, -3114048.2 3404127.8, -3111399.5 3409080.5, -3108837.8 3416117, -3106569.5 3421918, -3103531.5 3427421, -3103090.8 3434830.8, -3102503.8 3443707)
LINESTRING (-3189321.5 3462308.5, -3180532.5 3467074)
Алексей Шуленин