{"id":481496,"date":"2026-05-29T06:30:16","date_gmt":"2026-05-29T06:30:16","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481496"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481496","title":{"rendered":"\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0440\u043e\u0433. \u0427\u0430\u0441\u0442\u044c 1 \u2013 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/507\/a20\/418\/507a20418d0535db49ec484a904d57c6.png\" width=\"397\" height=\"397\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/507\/a20\/418\/507a20418d0535db49ec484a904d57c6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/507\/a20\/418\/507a20418d0535db49ec484a904d57c6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430!<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433 \u0432 PostGIS, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043d\u0438\u0437\u0438\u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0438 \u0432 \u0440\u0430\u0437\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432.<\/p>\n<h2>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<ul>\n<li>\n<p><a href=\"#%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D1%82%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%B8%20%D0%B4%D0%BE%D1%80%D0%BE%D0%B3\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u0440\u043e\u0433<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8,%20%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8,%20%D0%BC%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <a href=\"https:\/\/inn-it.pro\/#rec812793961\" rel=\"noopener noreferrer nofollow\">\u00ab\u0418\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0438-\u0418\u0422\u00bb<\/a>, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0440\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0431\u0438\u0437\u043d\u0435\u0441-\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043e\u0442\u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u0441\u0444\u0435\u0440\u0430\u0445 Smart City \u0438 Smart Transport.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0440\u043e\u0433. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 PostGIS.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf6\/bce\/581\/bf6bce5815d66ea84ac9430b8268a221.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\" width=\"916\" height=\"423\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bf6\/bce\/581\/bf6bce5815d66ea84ac9430b8268a221.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bf6\/bce\/581\/bf6bce5815d66ea84ac9430b8268a221.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98c\/d74\/9ad\/98cd749ad982e1dfc6714c67f19a9287.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" width=\"348\" height=\"493\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/98c\/d74\/9ad\/98cd749ad982e1dfc6714c67f19a9287.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98c\/d74\/9ad\/98cd749ad982e1dfc6714c67f19a9287.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<\/strong><\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (layer_id, object_id, zone_id). \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u0445 area \u0438 len \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u043b\u043e\u0449\u0430\u0434\u044c (ST_Area(geom)) \u0438 \u0434\u043b\u0438\u043d\u043d\u0430 (ST_MaxDistance(geom)) \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad8\/7c6\/6c6\/ad87c66c613344e60fbe7057c298f438.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\" width=\"974\" height=\"438\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ad8\/7c6\/6c6\/ad87c66c613344e60fbe7057c298f438.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad8\/7c6\/6c6\/ad87c66c613344e60fbe7057c298f438.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/621\/ea8\/80b\/621ea880b4e4e23c23bcc6ad31057803.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" width=\"424\" height=\"475\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/621\/ea8\/80b\/621ea880b4e4e23c23bcc6ad31057803.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/621\/ea8\/80b\/621ea880b4e4e23c23bcc6ad31057803.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b? <\/strong>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0430\u0445: \u0434\u043e\u0440\u043e\u0436\u043d\u043e-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0441\u0448\u0435\u0441\u0442\u0432\u0438\u044f, \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043b\u044e\u043a\u0438, \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0442\u043d\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0412 \u0446\u0435\u043b\u044f\u0445 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432, \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c: \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0438\u0445 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u0434\u043e\u0440\u043e\u0433\u0438. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u044b \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u043a\u0440\u0443\u0433\u0430\u043c \u0438 \u0440\u0430\u0439\u043e\u043d\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438.<\/p>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e? <\/strong>\u0421\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0433\u0435\u0440\u043e\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0434\u043e\u0440\u043e\u0433\u0438, \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u044f\u0437\u043a\u0438 \u0438 \u043c\u043e\u0441\u0442\u044b. \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b. \u0417\u0430\u044f\u0432\u043a\u0430 \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0414\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043d\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430 \u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0446\u0435\u043d\u043d\u0435\u0439\u0448\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0438 \u0432\u0430\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p><a class=\"anchor\" name=\"%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8\" id=\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438\"><\/a><\/p>\n<h2>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438<\/h2>\n<p><strong>\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0414\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 &#8212; 300 \u043c\u0435\u0442\u0440\u043e\u0432. <\/strong>\u0422\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0435. \u042d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0430\u044f \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 \u043a\u0430\u0440\u0442\u044b. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b &#8212; \u043e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0442\u044f\u0436\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u043e\u0439 300 \u043c\u0435\u0442\u0440\u0430\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0414\u043e\u0440\u043e\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0446\u0435\u043b\u043e \u043d\u0430 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 50 \u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u043c\u0430\u043b\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c, \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u043c. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043a\u0440\u0443\u0433\u043e\u0432 \u0438 \u0440\u0430\u0439\u043e\u043d\u043e\u0432. <\/strong>\u0415\u0441\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u043a\u0440\u0443\u0433\u0430 \u0438\u043b\u0438 \u0440\u0430\u0439\u043e\u043d\u0430, \u0432 \u0442\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. <\/strong>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0434\u043e\u0440\u043e\u0433\u0438 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e 100 \u043a\u043c \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430 5-10 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u0432\u0438\u0434\u0435 SQL-\u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p>layer_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f,<\/p>\n<\/li>\n<li>\n<p>object_id\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 \u0441\u043b\u043e\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/strong>\u00a0\u0417\u0430\u043f\u0438\u0441\u044c (INSERT\/UPDATE)  \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438<\/p>\n<ul>\n<li>\n<p>layer_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f,<\/p>\n<\/li>\n<li>\n<p>object_id\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 \u0441\u043b\u043e\u0435,<\/p>\n<\/li>\n<li>\n<p>zone_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430,<\/p>\n<\/li>\n<li>\n<p>geom \u2014 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435: layer_id\u00a0 = 179, object_id = &#8216;10000257&#8217;. <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb1\/ee9\/329\/eb1ee9329fb45d8fe85f3c86e81b9929.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0437\u043a\u0438\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0437\u043a\u0438\" width=\"974\" height=\"449\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eb1\/ee9\/329\/eb1ee9329fb45d8fe85f3c86e81b9929.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb1\/ee9\/329\/eb1ee9329fb45d8fe85f3c86e81b9929.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0437\u043a\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u2013 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u0438\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b part_id \u0438 \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p><strong>1) \u0417\u0430\u043d\u043e\u0441\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 part_id \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 source_road_solid_parts.<\/strong> \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043e\u043b\u043e\u043d\u043a\u0438: part_id; layer_id &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f \u0434\u043e\u0440\u043e\u0433\u0438; object_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0441\u043b\u043e\u0435; geometry \u2013 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438. \u0412\u0441\u0451 \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043c\u0430\u043b\u044b \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 ST_MaxDistance(geom) &lt;= 300 ), \u0442\u043e \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c zone_id. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p><strong>2) \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f generate_road_skeleton \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043a\u0435\u043b\u0435\u0442 \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_skeleton. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0432\u044b\u0440\u0435\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e: \u043a\u043b\u0443\u043c\u0431, \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u044b\u0445 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043b\u044e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e ( ST_Buffer, ST_SimplifyPreserveTopology, ST_MakePolygon(ST_ExteriorRing(geometry))). \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c ST_StraightSkeleton \u0438\u043b\u0438 ST_ApproximateMedialAxis \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 ST_StraightSkeleton \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u2013 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c ST_ApproximateMedialAxis.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/91a\/83e\/ba7\/91a83eba7bedd5344ce9a109e5474468.png\" alt=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" title=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" width=\"974\" height=\"290\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/91a\/83e\/ba7\/91a83eba7bedd5344ce9a109e5474468.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/91a\/83e\/ba7\/91a83eba7bedd5344ce9a109e5474468.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae0\/f58\/833\/ae0f58833bc6a1143b2a8db156d95d04.png\" alt=\"\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \" title=\"\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \" width=\"394\" height=\"327\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ae0\/f58\/833\/ae0f58833bc6a1143b2a8db156d95d04.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae0\/f58\/833\/ae0f58833bc6a1143b2a8db156d95d04.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 <\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b3\/f3f\/dbb\/9b3f3fdbbe7678efb51a6b053ef414c5.png\" alt=\"\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" title=\"\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" width=\"371\" height=\"406\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9b3\/f3f\/dbb\/9b3f3fdbbe7678efb51a6b053ef414c5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b3\/f3f\/dbb\/9b3f3fdbbe7678efb51a6b053ef414c5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aef\/1a3\/786\/aef1a37867c76905323e6a7890db61ba.png\" alt=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442\" title=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442\" width=\"374\" height=\"407\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/aef\/1a3\/786\/aef1a37867c76905323e6a7890db61ba.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aef\/1a3\/786\/aef1a37867c76905323e6a7890db61ba.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a01\/258\/e52\/a01258e52cfb312d62e93c4c8c8ef898.png\" alt=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" title=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\" width=\"486\" height=\"246\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a01\/258\/e52\/a01258e52cfb312d62e93c4c8c8ef898.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a01\/258\/e52\/a01258e52cfb312d62e93c4c8c8ef898.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f generate_road_skeleton<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">-- \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438CREATE OR REPLACE FUNCTION road_processing.generate_road_skeleton(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    p_tolerance FLOAT default 2.0)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_skeletondelete from road_processing.road_skeletonwhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;with\u2026-- \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0431\u0435\u0437 \u0434\u044b\u0440\u043e\u043afilled_buffered_united_road AS (    SELECT ST_MakePolygon(ST_ExteriorRing(geometry)) as geometry    FROM buffered_united_road),-- \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430simplified_filled_buffered_united_road AS (    SELECT ST_SimplifyPreserveTopology(geometry, p_tolerance) as geometry    FROM filled_buffered_united_road),-- \u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043a\u0435\u043b\u0435\u0442skeleton AS (SELECT COALESCE(ST_StraightSkeleton(geometry), ST_ApproximateMedialAxis(geometry)) as geometry--SELECT ST_ApproximateMedialAxis(geometry) as geometry--    SELECT ST_StraightSkeleton(geometry) as geometry-- SELECT CG_StraightSkeletonPartition(geometry, true) as geometry    FROM simplified_filled_buffered_united_road)-- \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443insert into road_processing.road_skeleton (part_id, layer_id, object_id, geom)select p_part_id,p_layer_id,p_object_id,geometryfrom skeleton;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>3) \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0435\u0433\u043e \u043b\u0438\u043d\u0438\u0438 (LINESTRING).<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_segments \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0435\u0433\u043e \u043b\u0438\u043d\u0438\u0438 \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u0442 \u0438\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_segments.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/968\/07b\/a33\/96807ba33f9076a4753671ca4618b02b.png\" alt=\"\u0421\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043b\u0438\u043d\u0438\u0438\" title=\"\u0421\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043b\u0438\u043d\u0438\u0438\" width=\"468\" height=\"295\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/968\/07b\/a33\/96807ba33f9076a4753671ca4618b02b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/968\/07b\/a33\/96807ba33f9076a4753671ca4618b02b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043b\u0438\u043d\u0438\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_segments<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_road_segments(    p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$BEGIN-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_segmentsdelete from road_processing.road_segmentswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;    INSERT INTO road_processing.road_segments (part_id, layer_id, object_id, id, geom, length)-- \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u0438    WITH dumped AS (        SELECT (ST_Dump(geom)).geom AS geom        FROM road_processing.road_skeleton        WHERE part_id = p_part_id AND  layer_id = p_layer_id AND object_id = p_object_id     ),-- \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e (\u0441\u043f\u0438\u0441\u043e\u043a) \u0438\u0437 \u043b\u0438\u043d\u0438\u0439    collected AS (        SELECT ST_Collect(geom) AS geom        FROM dumped    ),-- \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f,    noded AS (        SELECT ST_Node(geom) AS geom        FROM collected    ),    geometries AS (        SELECT             p_part_id as part_id,             p_layer_id as layer_id,             p_object_id as object_id,             (ST_Dump(geom)).geom AS geom        FROM noded    )    SELECT         part_id,         layer_id,         object_id,        row_number() OVER () as id,        geom,        ST_Length(geom) as length    FROM geometries;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>4) \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430.<\/strong> \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_vertices, \u0445\u0440\u0430\u043d\u044f\u0449\u0443\u044e \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0446\u0430\u043c\u0438 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_segments, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e pgr_extractVertices. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435: id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u0435\u0440\u0448\u0438\u043d\u044b; in_edges, out_edges \u2013 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432 (\u0440\u0451\u0431\u0435\u0440) \u0438\u0437 road_segments; geom \u2013 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b (\u0442\u043e\u0447\u043a\u0430); x, y \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/27b\/a71\/6b0\/27ba716b0f700406dabf73ea051d32d4.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_vertices\" title=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_vertices\" width=\"974\" height=\"370\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/27b\/a71\/6b0\/27ba716b0f700406dabf73ea051d32d4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/27b\/a71\/6b0\/27ba716b0f700406dabf73ea051d32d4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_vertices<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_vertices<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_road_vertices(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_verticesdelete from road_processing.road_verticeswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;INSERT INTO road_processing.road_vertices (part_id, layer_id, object_id, id, in_edges, out_edges, x, y, geom)SELECT    p_part_id,p_layer_id,p_object_id,    id,    in_edges,    out_edges,    x,    y,    geomFROM pgr_extractVertices(format('SELECT id, geom FROM road_processing.road_segments WHERE part_id = %s AND layer_id = %s AND object_id = %L', p_part_id, p_layer_id, p_object_id));END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>5) \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f update_road_segments \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_segments \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 road_vertices. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 (\u0440\u0435\u0431\u0440\u043e) \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (id), \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e (source) \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e (target) \u0432\u0435\u0440\u0448\u0438\u043d\u044b.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f27\/869\/915\/f2786991552afcb30129e90b1540bed1.png\" alt=\"\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_segments\" title=\"\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_segments\" width=\"423\" height=\"300\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f27\/869\/915\/f2786991552afcb30129e90b1540bed1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f27\/869\/915\/f2786991552afcb30129e90b1540bed1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_segments<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f update_road_segments<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.update_road_segments(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$beginUPDATE road_processing.road_segments AS r-- \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0447\u043a\u0443 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430SET source = (    SELECT v.id FROM road_processing.road_vertices v    WHERE part_id = p_part_id AND  layer_id = p_layer_id AND object_id = p_object_id  AND ST_DWithin(ST_StartPoint(r.geom), v.geom, 1)    LIMIT 1),-- \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043e\u043d\u0446\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430target = (    SELECT v.id FROM road_processing.road_vertices v    WHERE part_id = p_part_id AND  layer_id = p_layer_id AND object_id = p_object_id AND ST_DWithin(ST_EndPoint(r.geom), v.geom, 1)    LIMIT 1);END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>6) \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b (\u043b\u0438\u0441\u0442\u044c\u044f).<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_leaf_nodes \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 road_segments \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (vertex_id) \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d (\u043b\u0438\u0441\u0442\u044c\u044f) \u2013 \u0442\u0430\u043a\u0438\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043d\u043e\u0441\u0438\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 leaf_nodes.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b60\/668\/35f\/b6066835f5a8e84544bf0681aa403197.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_nodes\" title=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_nodes\" width=\"367\" height=\"371\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b60\/668\/35f\/b6066835f5a8e84544bf0681aa403197.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b60\/668\/35f\/b6066835f5a8e84544bf0681aa403197.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_nodes<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_leaf_nodes<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_leaf_nodes(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b fill_leaf_nodesdelete from road_processing.leaf_nodeswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;insert into road_processing.leaf_nodes(part_id, layer_id, object_id, vertex_id)SELECT p_part_id as part_id, p_layer_id as layer_id, p_object_id as object_id, vertex_idFROM (    SELECT source AS vertex_id FROM road_processing.road_segmentsWHERE part_id = p_part_id AND  layer_id = p_layer_id AND object_id = p_object_id     UNION ALL    SELECT target FROM road_processing.road_segmentsWHERE part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id ) AS all_verticesGROUP BY vertex_idHAVING COUNT(*) = 1;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>7) \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u0438\u043d\u0443 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_leaf_cost_matrix \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438\u0437 leaf_nodes. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b (pgr_dijkstraCostMatrix). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043d\u043e\u0441\u0438\u043c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 leaf_cost_matrix &#8212; \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043b\u0438\u0441\u0442\u044c\u044f\u043c\u0438. start_vid, end_vid &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, agg_cost \u2013 \u0434\u043b\u0438\u043d\u043d\u0430 \u043f\u0443\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041f\u0443\u0442\u044c, \u0438\u0434\u0443\u0449\u0438\u0439 \u043e\u0442 start_vid \u0434\u043e end_vid, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0443\u043c\u043c\u0430 \u0432\u0441\u0435\u0445 \u0434\u043b\u0438\u043d \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/50d\/c54\/14a\/50dc5414a06137bdb537daa47ae2a99f.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix. \u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0434\u043b\u0438\u043d\u043d\u044b \u043f\u0443\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.\" title=\"\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix. \u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0434\u043b\u0438\u043d\u043d\u044b \u043f\u0443\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.\" width=\"430\" height=\"295\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/50d\/c54\/14a\/50dc5414a06137bdb537daa47ae2a99f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/50d\/c54\/14a\/50dc5414a06137bdb537daa47ae2a99f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix. \u041a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0434\u043b\u0438\u043d\u043d\u044b \u043f\u0443\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_leaf_cost_matrix<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_leaf_cost_matrix(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b leaf_cost_matrixdelete from road_processing.leaf_cost_matrixwhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;insert into road_processing.leaf_cost_matrix(part_id, layer_id, object_id, start_vid, end_vid, agg_cost)select p_part_id as part_id, p_layer_id as layer_id, p_object_id as object_id, start_vid, end_vid, agg_costFROM pgr_dijkstraCostMatrix(    format('SELECT id, source, target, length AS cost FROM road_processing.road_segments WHERE part_id = %s AND layer_id = %s AND object_id = %L',    p_part_id, p_layer_id, p_object_id),    (    select    array_agg(vertex_id) FROM road_processing.leaf_nodes     WHERE part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id    ),    directed := false);END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>8) \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u2013 \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u0433\u0440\u0430\u0444\u0430. <\/strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_diameter_info \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u0435\u0432\u043e\u0439 (\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439) \u043b\u0438\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430, \u0438\u0434\u0443\u0449\u0435\u0439 \u043f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0442\u043d\u0430 \u043e\u0442 \u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e0\/393\/351\/2e0393351a8030861e1f30602c6e17b8.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438.\" title=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438.\" width=\"974\" height=\"78\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2e0\/393\/351\/2e0393351a8030861e1f30602c6e17b8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e0\/393\/351\/2e0393351a8030861e1f30602c6e17b8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 leaf_cost_matrix \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438.<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_diameter_info<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_diameter_info(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b diameter_infodelete from road_processing.diameter_infowhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;insert into road_processing.diameter_info(part_id, layer_id, object_id, start_vid, end_vid, max_distance)SELECT    p_part_id as part_id, p_layer_id as layer_id, p_object_id as object_id, start_vid, end_vid, agg_cost AS max_distanceFROM road_processing.leaf_cost_matrixWHERE part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_idORDER BY agg_cost DESCLIMIT 1;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>9) \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0435\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 (centerline<\/strong>). \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_final_longest_route \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b leaf_cost_matrix. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 final_longest_route.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f6\/199\/bd2\/3f6199bd2041b86dfb096034e4e32b08.png\" alt=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 final_longest_route \u2013 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438\" title=\"\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 final_longest_route \u2013 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438\" width=\"791\" height=\"297\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3f6\/199\/bd2\/3f6199bd2041b86dfb096034e4e32b08.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f6\/199\/bd2\/3f6199bd2041b86dfb096034e4e32b08.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 final_longest_route \u2013 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b7\/244\/6c9\/9b72446c9fb0cae5e21473f6c6251f35.png\" alt=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f\" title=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f\" width=\"332\" height=\"289\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9b7\/244\/6c9\/9b72446c9fb0cae5e21473f6c6251f35.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b7\/244\/6c9\/9b72446c9fb0cae5e21473f6c6251f35.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/824\/08f\/dd7\/82408fdd7d2a05c96be091057cf6b5e3.png\" alt=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f\" title=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f\" width=\"217\" height=\"396\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/824\/08f\/dd7\/82408fdd7d2a05c96be091057cf6b5e3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/824\/08f\/dd7\/82408fdd7d2a05c96be091057cf6b5e3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u043e\u0441\u0435\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>10)\u00a0 \u0421\u0442\u0440\u043e\u0438\u043c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_zones \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e (centerline) \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 (300 \u043c\u0435\u0442\u0440\u043e\u0432). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b road_segment_len \u0438 road_segment_wide \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0434\u043b\u0438\u043d\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0437\u043e\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e ST_Buffer \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0437\u043e\u043d\u044b (\u0431\u0443\u0444\u0435\u0440\u0430) \u0448\u0438\u0440\u0438\u043d\u043e\u0439 road_segment_wide \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0442\u0440\u0435\u0437\u043a\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 road_segment_len. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_zones.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u0438\u043d\u0430 \u0437\u043e\u043d\u044b 300 \u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u0448\u0438\u0440\u0438\u043d\u0430 &#8212; 50 \u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a4a\/84a\/87e\/a4a84a87eb51b6567ee0f41681ebfd88.png\" alt=\"\u041d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0438 \u0438\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" title=\"\u041d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0438 \u0438\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" width=\"392\" height=\"240\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a4a\/84a\/87e\/a4a84a87eb51b6567ee0f41681ebfd88.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a4a\/84a\/87e\/a4a84a87eb51b6567ee0f41681ebfd88.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0438 \u0438\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f  fill_road_zones<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_road_zones(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    road_segment_len DOUBLE precision default 300, -- \u0434\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438    road_segment_wide DOUBLE precision default 50 -- \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438)RETURNS VOID AS $$begin-- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_zonesdelete from road_processing.road_zoneswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;WITH dumped_lines AS (  SELECT     (ST_Dump(geom)).geom AS line_geom,    (ST_Dump(geom)).path[1] as part_order  FROM road_processing.final_longest_route  WHERE part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id),-- \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435ordered_points AS (  SELECT     ST_StartPoint(line_geom) as point,    part_order,    1 as point_type  -- start point  FROM dumped_lines  UNION ALL  SELECT     ST_EndPoint(line_geom) as point,    part_order,    2 as point_type  -- end point  FROM dumped_lines),-- \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b (\u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f)unique_points AS (  SELECT DISTINCT ON (point)     point,    part_order,    point_type  FROM ordered_points  ORDER BY point, part_order, point_type),-- \u043f\u043e\u043b\u0443\u0447\u0435\u0430\u043c Linestring \u0438\u0437 Multilinestringcenterline as (-- \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u0438\u0437 \u0442\u043e\u0447\u0435\u043aSELECT   ST_MakeLine(point ORDER BY part_order, point_type) as linestring_geom,  ST_Length(ST_MakeLine(point ORDER BY part_order, point_type)) as total_lengthFROM unique_points),-- \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e 300 \u043c\u0435\u0442\u0440\u043e\u0432final_segments as (SELECT   generate_series(0, floor(total_length \/ road_segment_len)::int) as seg_num,  ST_LineSubstring(    linestring_geom,    generate_series(0, floor(total_length \/ road_segment_len)::int) * road_segment_len \/ total_length,    LEAST((generate_series(0, floor(total_length \/ road_segment_len)::int) + 1) * road_segment_len \/ total_length, 1.0)  ) as segment_geom,  ST_Length(    ST_LineSubstring(      linestring_geom,      generate_series(0, floor(total_length \/ road_segment_len)::int) * road_segment_len \/ total_length,      LEAST((generate_series(0, floor(total_length \/ road_segment_len)::int) + 1) * road_segment_len \/ total_length, 1.0)    )  ) as segment_lengthFROM centerline)insert into road_processing.road_zones(part_id, layer_id, object_id, zone_id, geom)select p_part_id as part_id, p_layer_id as layer_id, p_object_id as object_id,row_number() over() as zone_id,ST_Buffer(segment_geom, road_segment_wide, 'endcap=flat join=mitre') as geomfrom final_segments;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>11) \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b.<\/strong> \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u044b \u0438 \u0437\u0438\u0433\u0437\u0430\u0433\u0438. \u0422\u0430\u043a\u043e\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043a\u0440\u0438\u0432\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c\u0438 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438 \u0438\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u0438\u043c\u044b\u043a\u0430\u044e\u0449\u0438\u0445 \u0434\u043e\u0440\u043e\u0433, \u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u044b\u0432\u044b \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c, \u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u0437\u0438\u0433\u0437\u0430\u0433\u0430\u043c\u0438 \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0437\u043e\u043d\u044b \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u043b\u0438\u043d\u0435 \u0440\u043e\u0432\u043d\u043e \u043f\u043e 300-\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043d\u0435 \u0432\u0434\u043e\u043b\u044c \u0435\u0451 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f &#8212; \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c \u0438\u043b\u0438 \u043f\u043e\u043f\u0435\u0440\u0451\u043a. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e process_again_and_get_better_zones, \u0441\u0442\u0440\u043e\u044f\u0449\u0443\u044e \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043e\u0441\u0435\u0432\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0435\u043d\u043d\u043e \u0437\u043e\u043d\u044b. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0451 \u0432\u044b\u0448\u0435\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b 3-11. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f centerline \u043f\u043e \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u0437\u043e\u043d.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f01\/25a\/c8b\/f0125ac8beab02a3bb6f1fa3a21945dc.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f.\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f.\" width=\"452\" height=\"277\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f01\/25a\/c8b\/f0125ac8beab02a3bb6f1fa3a21945dc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f01\/25a\/c8b\/f0125ac8beab02a3bb6f1fa3a21945dc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0438 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f.<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>12) \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0437\u043e\u043d\u044b. <\/strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f merge_overlapping_zones \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ST_Union) \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0437\u043e\u043d\u044b. \u0417\u0430 \u043f\u043e\u0440\u043e\u0433 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 tolerance_percent. <\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f merge_overlapping_zones<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.merge_overlapping_zones(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    tolerance_percent DOUBLE PRECISION DEFAULT 50 -- \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0437\u043e\u043d. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0437\u043e\u043d\u044b.)RETURNS VOID AS $$DECLARE    merged INTEGER;    v_id1 INTEGER;    v_id2 INTEGER;    v_union_geom GEOMETRY(GEOMETRY, 3857);BEGIN    LOOP        -- \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0430\u0440\u0443 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f        SELECT             a.zone_id,             b.zone_id,            ST_Union(a.geom, b.geom)        INTO             v_id1,             v_id2,            v_union_geom        FROM road_processing.road_zones a        JOIN road_processing.road_zones b ON a.zone_id &lt; b.zone_id        WHERE road_processing.safe_st_intersects(a.geom, b.geom)            AND ST_Area(road_processing.safe_st_intersection(a.geom, b.geom)) &gt;                 (tolerance_percent \/ 100.0) * LEAST(ST_Area(a.geom), ST_Area(b.geom))and a.part_id = p_part_id AND a.layer_id = p_layer_id AND a.object_id = p_object_idand b.part_id = p_part_id AND b.layer_id = p_layer_id AND b.object_id = p_object_id        LIMIT 1;                -- \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u044b\u0445\u043e\u0434\u0438\u043c        IF NOT FOUND THEN            EXIT;        END IF;                -- \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430        UPDATE road_processing.road_zones         SET geom = v_union_geom         WHERE zone_id = v_id1 AND part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;                GET DIAGNOSTICS merged = ROW_COUNT;                -- \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d        DELETE FROM road_processing.road_zones         WHERE zone_id = v_id2 AND part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;            END LOOP;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>13) \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0437\u043e\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f split_overlapped_zones \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u043e\u043d \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0438\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b zone_id.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f46\/bc6\/6ed\/f46bc66edfa7effe9de4059a2bae5a79.png\" alt=\"\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043c \u0437\u043e\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b.\" title=\"\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043c \u0437\u043e\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b.\" width=\"465\" height=\"323\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f46\/bc6\/6ed\/f46bc66edfa7effe9de4059a2bae5a79.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f46\/bc6\/6ed\/f46bc66edfa7effe9de4059a2bae5a79.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043c \u0437\u043e\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b.<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>14) \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 (\u0448\u0430\u0440\u0434\u044b). <\/strong>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_parts \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u043b\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 (\u0448\u0430\u0440\u0434\u043e\u0432) (ST_Subdivide(ST_Segmentize(geom, segment_len))). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_parts. id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0448\u0430\u0440\u0434\u0430, zone_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u043e\u043d\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0440\u0434.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/070\/768\/603\/0707686032a80da4a44dcab19d4e2a09.png\" alt=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u043e\u0441\u043a\u043e\u043b\u043a\u0438 (\u0448\u0430\u0440\u0434\u044b).\" title=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u043e\u0441\u043a\u043e\u043b\u043a\u0438 (\u0448\u0430\u0440\u0434\u044b).\" width=\"811\" height=\"406\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/070\/768\/603\/0707686032a80da4a44dcab19d4e2a09.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/070\/768\/603\/0707686032a80da4a44dcab19d4e2a09.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u043e\u0441\u043a\u043e\u043b\u043a\u0438 (\u0448\u0430\u0440\u0434\u044b).<\/strong><\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e ST_TriangulatePolygon \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/581\/ff9\/ab6\/581ff9ab697f60bd3a80d8cb70fd6262.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.\" width=\"442\" height=\"318\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/581\/ff9\/ab6\/581ff9ab697f60bd3a80d8cb70fd6262.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/581\/ff9\/ab6\/581ff9ab697f60bd3a80d8cb70fd6262.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_parts<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fill_road_parts(    p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    segment_len double precision default 1.0 -- \u0434\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 )RETURNS VOID AS $$BEGINdelete from road_processing.road_partswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;WITH original_road_part as (select p_part_id as id, geometry as geomfrom  road_processing.road_solid_partswhere p_part_id = part_id  AND p_layer_id = layer_id  AND p_object_id = object_id),road_shards as(        SELECT ST_Subdivide(ST_Segmentize(geom, segment_len)) as geom         FROM original_road_part    )--    select * from road_shards    INSERT INTO road_processing.road_parts(part_id, layer_id, object_id, zone_id, id, geom)    SELECT         p_part_id as part_id,        p_layer_id as layer_id,        p_object_id as object_id,        NULL as zone_id,        row_number() OVER() as id,         geom     FROM road_shards;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>15) \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0448\u0430\u0440\u0434\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fix_invalid_geometries \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0448\u0430\u0440\u0434\u043e\u0432 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ST_IsValid, ST_MakeValid) \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0448\u0438\u0431\u043e\u043a: \u0441\u0430\u043c\u043e\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u043d\u0435\u0437a\u043c\u043a\u043d\u0443\u0442\u043e\u0441\u0442\u044c, \u0440\u0430\u0437\u0440\u044b\u0432 \u0432 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435\u00a0\u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f fix_invalid_geometries<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.fix_invalid_geometries(    p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$BEGIN--\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 road_partsUPDATE road_processing.road_partsSET geom = ST_MakeValid(geom)WHERE NOT ST_IsValid(geom) and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;--\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0433\u0435\u043c\u043e\u0442\u0435\u0440\u0438\u0438 \u0438\u0437 road_partsDELETE FROM road_processing.road_partsWHERE (NOT ST_IsValid(geom)) and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>16) \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u043e\u043d\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f remove_unsuitable_road_zones \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0438 \u0434\u043b\u0438\u043d\u0435 \u0437\u043e\u043d\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435, \u043f\u0443\u0441\u0442\u044b\u0435 \u0438 \u0432 \u0432\u0438\u0434\u0435 \u0442\u043e\u0447\u0435\u043a.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/529\/157\/37c\/52915737c9b0429e692f4509dee83013.png\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_zones.\" title=\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_zones.\" width=\"974\" height=\"389\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/529\/157\/37c\/52915737c9b0429e692f4509dee83013.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/529\/157\/37c\/52915737c9b0429e692f4509dee83013.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_zones.<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>17) \u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0448\u0430\u0440\u0434\u043e\u0432 \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0437\u043e\u043d.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f road_part_classification \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0448\u0430\u0440\u0434\u043e\u0432 (road_parts) \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0437\u043e\u043d (road_zones). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430 zone_id \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_shard. <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a: <\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u0449\u0430\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0448\u0430\u0440\u0434\u0430 \u0438 \u0437\u043e\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0448\u0430\u0440\u0434\u0430 \u0438 \u0437\u043e\u043d\u044b<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438 \u0448\u0430\u0440\u0434\u0430 \u0438 \u0437\u043e\u043d\u044b <\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u0438\u043d\u043d\u0430 \u043d\u0430\u0438\u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0440\u0434\u043e\u043c \u0438 \u0437\u043e\u043d\u043e\u0439 <\/p>\n<\/li>\n<li>\n<p>\u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0448\u0430\u0440\u0434 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0437\u043e\u043d\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0435\u0441, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0435\u0451 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0448\u0430\u0440\u0434\u0443 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u0437\u043e\u043d\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0448\u0430\u0440\u0434\u0443 id \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043e\u043d\u0430 zone_id.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75f\/606\/c45\/75f606c4578cb7fcc5a5f81e207be893.png\" alt=\"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u043e\u043d\u0430\u043c \u0448\u0430\u0440\u0434\u044b.\" title=\"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u043e\u043d\u0430\u043c \u0448\u0430\u0440\u0434\u044b.\" width=\"974\" height=\"505\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/75f\/606\/c45\/75f606c4578cb7fcc5a5f81e207be893.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75f\/606\/c45\/75f606c4578cb7fcc5a5f81e207be893.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u043e\u043d\u0430\u043c \u0448\u0430\u0440\u0434\u044b.<\/strong><\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f road_part_classification<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.road_part_classification(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    intersection_area_weight double precision default 0.2, -- \u0432\u0435\u0441 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f    boundary_length_weight double precision default 0.2, -- \u0432\u0435\u0441 \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438\u0446\u044b    centroid_distance_weight double precision default 0.2, -- \u0432\u0435\u0441 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438    min_distance_weight double precision default 0.2, -- \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f    lies_inside_weight double precision default 1.0 -- \u0432\u0435\u0441 \u0442\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0437\u043e\u043d\u0435    )RETURNS VOID AS $$beginWITH metrics AS (    SELECT         rp.id AS shard_id,        rp.geom AS shard_geom,        rz.zone_id AS zone_id,        rz.geom AS zone_geom,        -- \u041f\u043b\u043e\u0449\u0430\u0434\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f        ST_Area(road_processing.safe_st_intersection(rp.geom, rz.geom)) AS intersection_area,        -- \u0414\u043b\u0438\u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f        ST_Length(road_processing.safe_st_intersection(ST_Boundary(rp.geom), ST_Boundary(rz.geom))) AS boundary_length,        -- \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438        ST_Distance(ST_Centroid(rp.geom), ST_Centroid(rz.geom)) AS centroid_distance,        -- \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438        ST_Distance(rp.geom, rz.geom) AS min_distance,-- \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0437\u043e\u043d\u0435        road_processing.safe_st_within(rp.geom, rz.geom) as lies_inside       FROM road_processing.road_parts rp    CROSS JOIN road_processing.road_zones rzwhere rp.part_id = p_part_id AND rp.layer_id = p_layer_id AND rp.object_id = p_object_id and rz.part_id = p_part_id AND rz.layer_id = p_layer_id AND rz.object_id = p_object_id),--select * from metrics-- \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438normalized_metrics AS (    SELECT         shard_id,        zone_id,        intersection_area,        boundary_length,        centroid_distance,        min_distance,        lies_inside,                -- \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f (\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435)        CASE             WHEN MAX(intersection_area) OVER (PARTITION BY shard_id) &gt; 0             THEN intersection_area \/ MAX(intersection_area) OVER (PARTITION BY shard_id)            ELSE 0         END AS norm_intersection_area,                -- \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438\u0446\u044b (\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435)        CASE             WHEN MAX(boundary_length) OVER (PARTITION BY shard_id) &gt; 0             THEN boundary_length \/ MAX(boundary_length) OVER (PARTITION BY shard_id)            ELSE 0         END AS norm_boundary_length,                -- \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438 (\u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435)        CASE             WHEN MAX(centroid_distance) OVER (PARTITION BY shard_id) &gt; 0             THEN 1 - (centroid_distance \/ MAX(centroid_distance) OVER (PARTITION BY shard_id))            ELSE 1         END AS norm_centroid_distance,                -- \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435)        CASE             WHEN MAX(min_distance) OVER (PARTITION BY shard_id) &gt; 0             THEN 1 - (min_distance \/ MAX(min_distance) OVER (PARTITION BY shard_id))            ELSE 1         END AS norm_min_distance            FROM metrics),--select * from normalized_metrics-- \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044bscored_matches AS (    SELECT         shard_id,        zone_id,        intersection_area,        boundary_length,        centroid_distance,        min_distance,        norm_intersection_area,        norm_boundary_length,        norm_centroid_distance,        norm_min_distance,        lies_inside,                -- \u0412\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043c\u0435\u0442\u0440\u0438\u043a (\u0432\u0435\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438)        (            COALESCE(norm_intersection_area, 0) * intersection_area_weight +      -- \u0432\u0435\u0441 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f 40%            COALESCE(norm_boundary_length, 0) * boundary_length_weight +        -- \u0432\u0435\u0441 \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438\u0446\u044b 30%            COALESCE(norm_centroid_distance, 0) * centroid_distance_weight +      -- \u0432\u0435\u0441 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438 20%            COALESCE(norm_min_distance, 0) * min_distance_weight +            -- \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f 10%            COALESCE(lies_inside, 0) * lies_inside_weight             -- \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0437\u043e\u043d\u0435        ) AS total_score            FROM normalized_metrics),--select * from scored_matches-- \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u0443\u0447\u0448\u0443\u044e \u0437\u043e\u043d\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u0440\u043e\u0433\u0438best_matches AS (    SELECT DISTINCT ON (shard_id)        shard_id,        zone_id,        total_score,        intersection_area,        boundary_length,        centroid_distance,        min_distance,        norm_intersection_area,        norm_boundary_length,        norm_centroid_distance,        norm_min_distance    FROM scored_matches    ORDER BY shard_id, total_score DESC)--select * from best_matches-- \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_parts, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f zone_idUPDATE road_processing.road_parts rpSET zone_id = bm.zone_idFROM best_matches bmWHERE rp.id = bm.shard_id AND rp.part_id = p_part_id AND rp.layer_id = p_layer_id AND rp.object_id = p_object_id;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>18)\u00a0 \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0448\u0430\u0440\u0434\u044b \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b.<\/strong> \u00a0\u0424\u0443\u043d\u043a\u0446\u0438\u044f group_zones_for_road_partition_improved \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0440\u0434\u043e\u0432 \u043f\u043e zone_id. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_partition.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdb\/41f\/e7c\/fdb41fe7c50e0f3310fe13d78b438c27.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_partition\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_partition\" width=\"433\" height=\"271\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fdb\/41f\/e7c\/fdb41fe7c50e0f3310fe13d78b438c27.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdb\/41f\/e7c\/fdb41fe7c50e0f3310fe13d78b438c27.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_partition<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>19) \u0421\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0437\u043e\u043d\u044b.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f merge_small_intersected_zones \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0437\u043e\u043d\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044f \u0438\u0445 \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438. \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_partition.<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f merge_small_intersected_zones<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.merge_small_intersected_zones(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    max_area DOUBLE PRECISION DEFAULT 20000,-- \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430    max_length DOUBLE PRECISION DEFAULT 350,-- \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u043d\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430    min_area DOUBLE PRECISION DEFAULT 5000,      -- \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \"\u043c\u0430\u043b\u044b\u043c\u0438\"    min_length DOUBLE PRECISION DEFAULT 150      -- \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \"\u043c\u0430\u043b\u044b\u043c\u0438\")--RETURNS INTEGER AS $$RETURNS VOID AS $$DECLAREmerged INTEGER;    v_small_id INTEGER;    v_target_id INTEGER;    v_new_geom GEOMETRY(GEOMETRY, 3857);    v_small_geom GEOMETRY(GEOMETRY, 3857);    v_small_area DOUBLE PRECISION;    v_small_length DOUBLE PRECISION;BEGIN    LOOP        -- \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d (\u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0438\u043b\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0443)        SELECT             zone_id,             geom,            ST_Area(geom),            ST_MaxDistance(geom, geom)  -- \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440        INTO             v_small_id,            v_small_geom,            v_small_area,            v_small_length        FROM road_processing.road_partition        WHERE (--ST_Area(geom) &lt;= min_area OR ST_MaxDistance(geom, geom) &lt;= min_length)and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id  AND ST_IsValid(geom)         LIMIT 1;        --         \u0415\u0441\u043b\u0438 \u043c\u0430\u043b\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u043d\u0435\u0442 - \u0432\u044b\u0445\u043e\u0434\u0438\u043c        IF NOT FOUND THEN            EXIT;        END IF;        --         \u0418\u0449\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0441 \u041d\u0410\u0418\u041c\u0415\u041d\u042c\u0428\u0415\u0419 \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e \u0438 \u0434\u043b\u0438\u043d\u0435        SELECT             b.zone_id,            road_processing.safe_st_union(v_small_geom, b.geom)        INTO             v_target_id,            v_new_geom        FROM road_processing.road_partition b        WHERE b.zone_id != v_small_idand road_processing.safe_st_intersects(v_small_geom, b.geom)--          AND ST_Intersects(v_small_geom, b.geom)   and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id-- \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0438 \u0434\u043b\u0438\u043d\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d        ORDER BY  (COALESCE(ST_MaxDistance(v_small_geom, v_small_geom), 0) +              COALESCE(ST_MaxDistance(b.geom, b.geom), 0)) * 0.5 +             (COALESCE(ST_Area(v_small_geom), 0) + COALESCE(ST_Area(b.geom), 0)) * 0.5 ASC        LIMIT 1;                -- \u0415\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u044b\u0445\u043e\u0434\u0438\u043c        IF NOT FOUND THEN            EXIT;        END IF;                -- \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430        UPDATE road_processing.road_partition         SET geom = v_new_geom         WHERE zone_id = v_target_id and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;                GET DIAGNOSTICS merged = ROW_COUNT;                -- \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u0430\u043b\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d        DELETE FROM road_processing.road_partition WHERE zone_id = v_small_id and part_id = p_part_id AND layer_id = p_layer_id AND object_id = p_object_id;    END LOOP;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p><strong>20) \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 final_road_partition.<\/strong> \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_final_road_partition \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 final_road_partition.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 final_road_partition \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438.<\/p>\n<p><a class=\"anchor\" name=\"%D0%98%D1%82%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h2>\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u0441\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u044d\u0442\u0430\u043f\u044b \u0431\u044b\u043b\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; make_part_of_road_segmentation. \u0418 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0451 \u0434\u0432\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: p_layer_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f (layer_id), p_object_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0441\u043b\u043e\u0435 (object_id). \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u0432\u044b\u0437\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"sql\">select road_processing.make_part_of_road_segmentation (p_layer_id =&gt; 179, p_object_id =&gt; '10000257');<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f make_part_of_road_segmentation<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.make_part_of_road_segmentation(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,        standart_segment_len DOUBLE PRECISION DEFAULT 300, -- \u0436\u0435\u043b\u0430\u0435\u043c\u0430\u044f \u0434\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438    standart_segment_wide DOUBLE PRECISION DEFAULT 50, -- \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438    max_segment_area DOUBLE PRECISION DEFAULT 20000,-- \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430    max_segment_length DOUBLE PRECISION DEFAULT 350,-- \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u043d\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430    min_segment_area DOUBLE PRECISION DEFAULT 5000,     -- \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \"\u043c\u0430\u043b\u044b\u043c\u0438\"    min_segment_length DOUBLE PRECISION DEFAULT 150,     -- \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \"\u043c\u0430\u043b\u044b\u043c\u0438\"    merge_area_tolerance_percent DOUBLE PRECISION DEFAULT 50, -- \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 \u0437\u043e\u043d \u0434\u043b\u044f \u0438\u0445 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u0449\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044fintersection_area_weight double precision default 0.2, -- \u0432\u0435\u0441 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification    boundary_length_weight double precision default 0.2, -- \u0432\u0435\u0441 \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification    centroid_distance_weight double precision default 0.2, -- \u0432\u0435\u0441 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification    min_distance_weight double precision default 0.2, -- \u0432\u0435\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification    lies_inside_weight double precision default 1.0, -- \u0432\u0435\u0441 \u0442\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0437\u043e\u043d\u0435 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification    topology_distance_tolerance DOUBLE PRECISION DEFAULT 2.0, --  \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 generate_road_skeleton - \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0432 ST_SimplifyPreserveTopology    shard_segment_len DOUBLE PRECISION DEFAULT 1.0, -- \u0434\u043b\u0438\u043d\u043d\u0430 \"\u043e\u0441\u043a\u043e\u043b\u043a\u0430\" \u0434\u043e\u0440\u043e\u0433\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_parts, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f ST_Segmentize    buffer_distance DOUBLE PRECISION DEFAULT 1.0, -- \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0431\u0443\u0444\u0444\u0435\u0440 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ST_Buffer \u0432 process_again_and_get_better_zones    buffer_distance_for_group_zones DOUBLE PRECISION DEFAULT 0.01, -- \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0440\u0434\u043e\u0432    topology_distance_tolerance_for_group_zones DOUBLE PRECISION default 0.01, -- \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u043a\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0440\u0434\u043e\u0432    grid_size_for_group_zones DOUBLE PRECISION default 0.1, --\u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u0435\u0442\u043a\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0440\u0434\u043e\u0432    unsuitable_road_zones_area_threshold double precision default 100, -- \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0437\u043e\u043d \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e    unsuitable_road_zones_len_threshold double precision default 100  -- \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0437\u043e\u043d \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0434\u043b\u0438\u043d\u043d\u043e\u0439)RETURNS VOID AS $$DECLAREv_should_skip boolean;begin--  \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443 \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443select road_processing.should_skip_segmentation(p_part_id, p_layer_id, p_object_id, max_segment_length) into v_should_skip;if v_should_skipthen perform road_processing.skip_segmentation_and_fill_final_road_partition(p_part_id, p_layer_id, p_object_id)return;end if;PERFORM  road_processing.generate_road_skeleton(p_part_id, p_layer_id, p_object_id, topology_distance_tolerance);--\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b(\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438\/\u043e\u0442\u0440\u0435\u0437\u043a\u0438) \u0438\u0437 \"\u0441\u043a\u0435\u043b\u0435\u0442\u0430\" \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.fill_road_segments(p_part_id, p_layer_id, p_object_id);-- \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0441\u043e\u0435\u0434\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \"\u0441\u043a\u0435\u043b\u0435\u0442\u0430\" \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.fill_road_vertices(p_part_id, p_layer_id, p_object_id);-- \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0438 source \u0438 target \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_segmentsPERFORM  road_processing.update_road_segments(p_part_id, p_layer_id, p_object_id);-- \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b(\u043b\u0438\u0441\u0442\u044c\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0443\u0437\u043b\u044b) \"\u0441\u043a\u0435\u043b\u0435\u0442\u0430\" \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.fill_leaf_nodes(p_part_id, p_layer_id, p_object_id);-- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u0443\u0437\u0430\u043b\u043c\u0438 leaf_cost_matrixPERFORM  road_processing.fill_leaf_cost_matrix(p_part_id, p_layer_id, p_object_id);-- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0434\u0438\u0430\u043c\u0435\u0442\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 - \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435PERFORM  road_processing.fill_diameter_info(p_part_id, p_layer_id, p_object_id);-- \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430 - \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0441\u0435\u0432\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.fill_final_longest_route(p_part_id, p_layer_id, p_object_id);-- \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043e\u043d\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.fill_road_zones(p_part_id, p_layer_id, p_object_id, standart_segment_len, standart_segment_wide);-- \u0437\u0430\u043d\u043e\u0441\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043e\u043d\u044b, \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u043a\u0430\u043a \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043e\u043d   PERFORM road_processing.process_again_and_get_better_zones(p_part_id =&gt; p_part_id, p_layer_id =&gt; p_layer_id, p_object_id =&gt; p_object_id, standart_segment_len =&gt; standart_segment_len, standart_segment_wide =&gt; standart_segment_wide,merge_area_tolerance_percent =&gt; merge_area_tolerance_percent, buffer_distance =&gt; buffer_distance, topology_distance_tolerance =&gt; topology_distance_tolerance);-- \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0437\u043e\u043d\u044bPERFORM  road_processing.merge_overlapping_zones(p_part_id, p_layer_id, p_object_id, merge_area_tolerance_percent);---- \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\/\u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u043e\u043droad_processing.split_overlapped_zones(p_part_id, p_layer_id, p_object_id);---- \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u043e\u0440\u043e\u0433\u0443 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438    PERFORM road_processing.fill_road_parts(p_part_id, p_layer_id, p_object_id, shard_segment_len);-- \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\/\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438PERFORM  road_processing.fix_invalid_geometries(p_part_id, p_layer_id, p_object_id);---- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043f\u043e\u0434\u0445\u044f\u0434\u044f\u0449\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438\u0437 road_partsPERFORM road_processing.remove_unsuitable_road_parts(p_part_id, p_layer_id, p_object_id);---- \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u043e\u043d\u044bPERFORM road_processing.remove_unsuitable_road_zones(p_part_id, p_layer_id, p_object_id, unsuitable_road_zones_area_threshold =&gt; unsuitable_road_zones_area_threshold,unsuitable_road_zones_len_threshold =&gt; unsuitable_road_zones_len_threshold);----\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043a\u0443\u0441\u043e\u0447\u043a\u043e\u0432 \u0434\u043e\u0440\u043e\u0433\u0438PERFORM  road_processing.road_part_classification(p_part_id, p_layer_id, p_object_id,intersection_area_weight, boundary_length_weight, centroid_distance_weight,min_distance_weight, lies_inside_weight);perform road_processing.group_zones_for_road_partition (p_part_id =&gt; p_part_id, p_layer_id =&gt; p_layer_id, p_object_id =&gt; p_object_id,buffer_distance_for_group_zones =&gt; buffer_distance_for_group_zones,topology_distance_tolerance_for_group_zones =&gt; topology_distance_tolerance_for_group_zones,grid_size_for_group_zones =&gt; grid_size_for_group_zones);---- \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043b\u044b\u0435 \u0437\u043e\u043d\u044b PERFORM  road_processing.merge_small_intersected_zones(p_part_id, p_layer_id, p_object_id,max_segment_area, max_segment_length, min_segment_area, min_segment_length);---- \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 final_road_partitionPERFORM  road_processing.fill_final_road_partition(p_part_id, p_layer_id, p_object_id);END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f make_part_of_road_segmentation \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0435\u0442 \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d part_id. \u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f main_road_segmentation, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 make_part_of_road_segmentation \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e part_id.<\/p>\n<pre><code class=\"sql\">select road_processing.main_road_segmentation(p_layer_id =&gt; 179, p_object_id =&gt; '10000257');<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f main_road_segmentation<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION road_processing.main_road_segmentation(    p_layer_id INTEGER,    p_object_id TEXT,    standart_segment_len DOUBLE PRECISION DEFAULT 300,    standart_segment_wide DOUBLE PRECISION DEFAULT 50,    max_segment_area DOUBLE PRECISION DEFAULT 20000,    max_segment_length DOUBLE PRECISION DEFAULT 350,    min_segment_area DOUBLE PRECISION DEFAULT 5000,    min_segment_length DOUBLE PRECISION DEFAULT 150,    merge_area_tolerance_percent DOUBLE PRECISION DEFAULT 50,    intersection_area_weight DOUBLE PRECISION DEFAULT 0.2,    boundary_length_weight DOUBLE PRECISION DEFAULT 0.2,    centroid_distance_weight DOUBLE PRECISION DEFAULT 0.2,    min_distance_weight DOUBLE PRECISION DEFAULT 0.2,    lies_inside_weight DOUBLE PRECISION DEFAULT 1.0,    topology_distance_tolerance DOUBLE PRECISION DEFAULT 2.0,    shard_segment_len DOUBLE PRECISION DEFAULT 1.0,    unsuitable_road_zones_area_threshold double precision default 100,     unsuitable_road_zones_len_threshold double precision default 100  )RETURNS VOID AS $$DECLARE    road_part_record RECORD;BEGIN-- \u0417\u0430\u043d\u043e\u0441\u0438\u043c \u0447\u0430\u0441\u0442\u0438 Multipolygon (\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430) \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 part_id \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 source_road_solid_partsPERFORM road_processing.fill_source_road_solid_parts_multipolygon(p_layer_id, p_object_id);        -- \u0417\u0430\u043d\u043e\u0441\u0438\u043c \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u0440\u043e\u0433\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b source_road_solid_parts \u0432 road_solid_parts    PERFORM road_processing.fill_road_solid_parts(p_layer_id, p_object_id);        -- \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0434\u043e\u0440\u043e\u0433\u0438    PERFORM road_processing.delete_from_final_road_partition(p_layer_id, p_object_id);        -- \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0434\u043e\u0440\u043e\u0433\u0438 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438    FOR road_part_record IN         SELECT DISTINCT part_id         FROM road_processing.road_solid_parts        WHERE layer_id = p_layer_id AND object_id = p_object_id    LOOP        PERFORM road_processing.make_part_of_road_segmentation(            p_part_id =&gt; road_part_record.part_id,            p_layer_id =&gt; p_layer_id,            p_object_id =&gt; p_object_id,            standart_segment_len =&gt; standart_segment_len,            standart_segment_wide =&gt; standart_segment_wide,            max_segment_area =&gt; max_segment_area,            max_segment_length =&gt; max_segment_length,            min_segment_area =&gt; min_segment_area,            min_segment_length =&gt; min_segment_length,            merge_area_tolerance_percent =&gt; merge_area_tolerance_percent,            intersection_area_weight =&gt; intersection_area_weight,            boundary_length_weight =&gt; boundary_length_weight,            centroid_distance_weight =&gt; centroid_distance_weight,            min_distance_weight =&gt; min_distance_weight,            lies_inside_weight =&gt; lies_inside_weight,            topology_distance_tolerance =&gt; topology_distance_tolerance,            shard_segment_len =&gt; shard_segment_len        );    END LOOP;END;$$ LANGUAGE plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 make_part_of_road_segmentation \u0438 main_road_segmentation.<\/summary>\n<div class=\"spoiler__content\">\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\">\u2116<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0418\u043c\u044f   \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u043c\u044b\u0441\u043b\u043e\u0432\u043e\u0435   \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0422\u0438\u043f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435   \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">1<\/p>\n<\/td>\n<td>\n<p align=\"center\">p_layer_id<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440   \u0441\u043b\u043e\u044f layer_id \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043b\u043e\u044f features<\/p>\n<\/td>\n<td>\n<p align=\"center\">INTEGER<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">2<\/p>\n<\/td>\n<td>\n<p align=\"center\">p_object_id<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 semantics-&gt;&gt;&#8217;objectId&#8217; \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043b\u043e\u044f features<\/p>\n<\/td>\n<td>\n<p align=\"center\">TEXT<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">7<\/p>\n<\/td>\n<td>\n<p align=\"center\">standart_segment_len<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0416\u0435\u043b\u0430\u0435\u043c\u0430\u044f   \u0434\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">300<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">8<\/p>\n<\/td>\n<td>\n<p align=\"center\">standart_segment_wide<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0430\u044f   \u0448\u0438\u0440\u0438\u043d\u0430 \u0437\u043e\u043d\u044b \u0434\u043e\u0440\u043e\u0433\u0438<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">50<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">9<\/p>\n<\/td>\n<td>\n<p align=\"center\">max_segment_area<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f   \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 <\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">20 000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">10<\/p>\n<\/td>\n<td>\n<p align=\"center\">max_segment_length<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f   \u0434\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">350<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">11<\/p>\n<\/td>\n<td>\n<p align=\"center\">min_segment_area<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0439   \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f &#171;\u043c\u0430\u043b\u044b\u043c\u0438&#187;<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">5 000<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">12<\/p>\n<\/td>\n<td>\n<p align=\"center\">min_segment_length<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u044b   \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f &#171;\u043c\u0430\u043b\u044b\u043c\u0438&#187;<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">150<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">13<\/p>\n<\/td>\n<td>\n<p align=\"center\">merge_area_tolerance_percent<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0439   \u043f\u043e\u0440\u043e\u0433 \u0434\u043b\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0437\u043e\u043d \u043f\u043e \u043e\u0431\u0449\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">50<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">14<\/p>\n<\/td>\n<td>\n<p align=\"center\">intersection_area_weight<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0412\u0435\u0441   \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">15<\/p>\n<\/td>\n<td>\n<p align=\"center\">boundary_length_weight<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0412\u0435\u0441   \u0434\u043b\u0438\u043d\u044b \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430 road_part_classification<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE PRECISIO DOUBLE PRECISION N<\/p>\n<\/td>\n<td>\n<p align=\"center\">0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">16<\/p>\n<\/td>\n<td>\n<p align=\"center\">centroid_distance_weight<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0412\u0435\u0441   \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u043e\u0438\u0434\u0430\u043c\u0438 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430   road_part_classification<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">17<\/p>\n<\/td>\n<td>\n<p align=\"center\">min_distance_weight<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0412\u0435\u0441   \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430   road_part_classification<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">0.2<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">18<\/p>\n<\/td>\n<td>\n<p align=\"center\">lies_inside_weight<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0412\u0435\u0441   \u0442\u043e\u0433\u043e \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 \u0437\u043e\u043d\u0435 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0448\u0430\u0440\u0434\u0430   road_part_classification<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">1.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">19<\/p>\n<\/td>\n<td>\n<p align=\"center\">topology_distance_tolerance<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 generate_road_skeleton &#8212; \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0432 ST_SimplifyPreserveTopology<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">2.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">20<\/p>\n<\/td>\n<td>\n<p align=\"center\">shard_segment_len<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u043b\u0438\u043d\u043d\u0430   &#171;\u043e\u0441\u043a\u043e\u043b\u043a\u0430&#187; \u0434\u043e\u0440\u043e\u0433\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_parts, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f   ST_Segmentize<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">1.0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">25<\/p>\n<\/td>\n<td>\n<p align=\"center\">unsuitable_road_zones_area_threshold<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f   \u043e\u0442 \u0437\u043e\u043d \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 remove_unsuitable_road_zones<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">26<\/p>\n<\/td>\n<td>\n<p align=\"center\">unsuitable_road_zones_len_threshold<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f   \u043e\u0442 \u0437\u043e\u043d \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 remove_unsuitable_road_zones<\/p>\n<\/td>\n<td>\n<p align=\"center\">DOUBLE   PRECISION<\/p>\n<\/td>\n<td>\n<p align=\"center\">100<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/details>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/strong><\/p>\n<pre><code class=\"sql\">create table if not exists road_processing.road_parts(part_id INTEGER,    layer_id INTEGER,    object_id TEXT,    zone_id INTEGER, id INTEGER,    geom GEOMETRY(GEOMETRY, 3857) );<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0441\u0445\u0435\u043c\u0435 road_processing \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0432\u044b\u043d\u0435\u0441\u043b\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 (extension).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d4a\/b7a\/f1d\/d4ab7af1df6a7ddd7e780637f1228608.png\" alt=\"\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing\" title=\"\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing\" width=\"153\" height=\"362\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d4a\/b7a\/f1d\/d4ab7af1df6a7ddd7e780637f1228608.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d4a\/b7a\/f1d\/d4ab7af1df6a7ddd7e780637f1228608.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/282\/fec\/0f4\/282fec0f4e47edbe89c329ecf5abf79d.png\" alt=\"\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing\" title=\"\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing\" width=\"255\" height=\"378\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/282\/fec\/0f4\/282fec0f4e47edbe89c329ecf5abf79d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/282\/fec\/0f4\/282fec0f4e47edbe89c329ecf5abf79d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing<\/strong><\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044f\u043c object_id, layer_id, part_id.<\/p>\n<pre><code class=\"sql\">CREATE INDEX idx_road_partsON road_processing.road_parts (object_id, layer_id, part_id);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0438\u043f\u0430 GIST \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u043e\u043b\u044e.<\/p>\n<pre><code class=\"sql\">CREATE INDEX idx_road_parts_geom ON road_processing.road_parts USING GIST (geom);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b7f\/1bf\/ae6\/b7f1bfae67bcd3a34f6de2a42dd336fb.png\" alt=\"\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing.\" title=\"\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing.\" width=\"203\" height=\"384\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b7f\/1bf\/ae6\/b7f1bfae67bcd3a34f6de2a42dd336fb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b7f\/1bf\/ae6\/b7f1bfae67bcd3a34f6de2a42dd336fb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0441\u0445\u0435\u043c\u0435 road_processing.<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%B8%20%D0%B4%D0%BE%D1%80%D0%BE%D0%B3\" id=\"\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\"><\/a><\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u0440\u043e\u0433    <\/h2>\n<h3>\u21161<\/h3>\n<pre><code class=\"sql\">-- \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044eselect road_processing.main_road_segmentation(p_layer_id =&gt; 179, p_object_id =&gt; '10000005',merge_area_tolerance_percent =&gt; 50, min_segment_length =&gt; 250, max_segment_length =&gt; 350, shard_segment_len =&gt; 1);-- \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442select *, ST_Area(geom), ST_MaxDistance(geom, geom) as len from road_processing.final_road_partitionwhere layer_id = 179 and object_id = '10000005';<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/084\/f2b\/bb8\/084f2bbb898b38fbbfe834bfc7311019.png\" alt=\"\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438\" title=\"\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438\" width=\"724\" height=\"374\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/084\/f2b\/bb8\/084f2bbb898b38fbbfe834bfc7311019.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/084\/f2b\/bb8\/084f2bbb898b38fbbfe834bfc7311019.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435, \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u0432 \u0435\u0433\u043e \u043d\u0430 12 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0412 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 len \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e ST_MaxDistance, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0451\u043d\u043d\u044b\u043c\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u0440\u043e\u0441 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432: min(len) \u2013 276, max(len) \u2013 652. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043b\u0451\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u044b\u043b\u0438 \u0431\u044b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 300-350 \u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043b\u044b\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0437\u043e\u0432 \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u0440\u043e\u0433\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u21162<\/h3>\n<p><strong>1) \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"sql\">-- \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044eselect road_processing.main_road_segmentation(p_layer_id =&gt; 179, p_object_id =&gt; '10000011',merge_area_tolerance_percent =&gt; 50, min_segment_length =&gt; 250, max_segment_length =&gt; 350,shard_segment_len =&gt; 1);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/591\/781\/3b8\/5917813b83ce1085d8dd0b1be254ec2a.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\" width=\"1009\" height=\"286\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/591\/781\/3b8\/5917813b83ce1085d8dd0b1be254ec2a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/591\/781\/3b8\/5917813b83ce1085d8dd0b1be254ec2a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><strong>2) \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/strong><\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043b\u0438 min_segment_length: \u0432\u043c\u0435\u0441\u0442\u043e 250 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 150. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5cc\/4b0\/85f\/5cc4b085f126bbb4df92699d384b2cc9.png\" alt=\"\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\" title=\"\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\" width=\"1009\" height=\"345\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5cc\/4b0\/85f\/5cc4b085f126bbb4df92699d384b2cc9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5cc\/4b0\/85f\/5cc4b085f126bbb4df92699d384b2cc9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0420\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21163<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/397\/754\/e0d\/397754e0da13d7e86e909576830c8b79.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u043b\u043e\u0441\u044b \u0434\u043e\u0440\u043e\u0433\u0438\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u043b\u043e\u0441\u044b \u0434\u043e\u0440\u043e\u0433\u0438\" width=\"917\" height=\"463\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/397\/754\/e0d\/397754e0da13d7e86e909576830c8b79.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/397\/754\/e0d\/397754e0da13d7e86e909576830c8b79.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u043b\u043e\u0441\u044b \u0434\u043e\u0440\u043e\u0433\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21164<\/h3>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/268\/cc0\/3fa\/268cc03fa4bff5cbc578d896c9e987fc.png\" alt=\"\u0417\u0430\u043c\u043a\u043d\u0443\u0442\u0430\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438\" title=\"\u0417\u0430\u043c\u043a\u043d\u0443\u0442\u0430\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438\" width=\"298\" height=\"365\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/268\/cc0\/3fa\/268cc03fa4bff5cbc578d896c9e987fc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/268\/cc0\/3fa\/268cc03fa4bff5cbc578d896c9e987fc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0417\u0430\u043c\u043a\u043d\u0443\u0442\u0430\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<h2>\u21165<\/h2>\n<pre><code class=\"sql\">select road_processing.main_road_segmentation(p_layer_id =&gt; 179, p_object_id =&gt; '10000991',merge_area_tolerance_percent =&gt; 50, min_segment_length =&gt; 250, max_segment_length =&gt; 350,shard_segment_len =&gt; 1);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/496\/865\/d8c\/496865d8c39a6d1caa6bd1870a52c8e4.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\" title=\"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\" width=\"974\" height=\"352\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/496\/865\/d8c\/496865d8c39a6d1caa6bd1870a52c8e4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/496\/865\/d8c\/496865d8c39a6d1caa6bd1870a52c8e4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21166<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/27a\/be6\/88f\/27abe688f1a6e3a37bf92d84d926871c.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" width=\"974\" height=\"471\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/27a\/be6\/88f\/27abe688f1a6e3a37bf92d84d926871c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/27a\/be6\/88f\/27abe688f1a6e3a37bf92d84d926871c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21167<\/h3>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d3\/0ad\/c82\/4d30adc82d1799cc502ba77f343aee21.png\" alt=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c\" title=\"\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c\" width=\"427\" height=\"331\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4d3\/0ad\/c82\/4d30adc82d1799cc502ba77f343aee21.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d3\/0ad\/c82\/4d30adc82d1799cc502ba77f343aee21.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb5\/930\/b67\/cb5930b67ed8f82a3505421b0da985e3.png\" alt=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438\" title=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438\" width=\"602\" height=\"230\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cb5\/930\/b67\/cb5930b67ed8f82a3505421b0da985e3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb5\/930\/b67\/cb5930b67ed8f82a3505421b0da985e3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21168<\/h3>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438 \u0434\u043e\u0440\u043e\u0433. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0435\u0432\u043e\u0439 (\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439) \u043b\u0438\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430. \u0418 \u0440\u0430\u0437\u0440\u0435\u0437\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0434\u043e\u043b\u044c \u043d\u0435\u0451.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f5\/ed6\/ebe\/7f5ed6ebe81b608a80201f278df48448.png\" alt=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c\" title=\"\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c\" width=\"486\" height=\"341\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f5\/ed6\/ebe\/7f5ed6ebe81b608a80201f278df48448.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f5\/ed6\/ebe\/7f5ed6ebe81b608a80201f278df48448.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435\u043c<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/453\/c50\/05a\/453c5005a2310ef9dffb4c6b2229a719.png\" alt=\"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0432\u044f\u0437\u043e\u043a\" title=\"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0432\u044f\u0437\u043e\u043a\" width=\"333\" height=\"410\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/453\/c50\/05a\/453c5005a2310ef9dffb4c6b2229a719.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/453\/c50\/05a\/453c5005a2310ef9dffb4c6b2229a719.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0432\u044f\u0437\u043e\u043a<\/strong><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/832\/860\/c54\/832860c540bb7e90eaf07ed0bd3ef2d0.png\" alt=\"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\" title=\"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\" width=\"416\" height=\"448\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/832\/860\/c54\/832860c540bb7e90eaf07ed0bd3ef2d0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/832\/860\/c54\/832860c540bb7e90eaf07ed0bd3ef2d0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f (\u043e\u0441\u0435\u0432\u0430\u044f) \u043b\u0438\u043d\u0438\u044f \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d<\/strong><\/figcaption><\/div>\n<\/figure>\n<h3>\u21169<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0443 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<pre><code class=\"sql\">select road_processing.main_road_segmentation(p_layer_id =&gt; 179,p_object_id =&gt; '10000188', process_for_better_zones =&gt; true, process_for_fill_road_parts_considering_zones =&gt; true,merge_area_tolerance_percent =&gt; 50, shard_segment_len =&gt; 1);-- \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:select *, ST_Area(geom), ST_MaxDistance(geom, geom) as lenfrom road_processing.final_road_partitionwhere layer_id = 179 and object_id = '10000188';<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u043e\u0440\u043e\u0433\u0430 \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u0440\u044b\u0432\u0430 \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 part_id.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/787\/77b\/314\/78777b314f9f968175f559d4c9d63c6b.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\" width=\"440\" height=\"335\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/787\/77b\/314\/78777b314f9f968175f559d4c9d63c6b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/787\/77b\/314\/78777b314f9f968175f559d4c9d63c6b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430<\/strong><\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0435\u0432\u043e\u0439 (\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439) \u043b\u0438\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430:<\/p>\n<ul>\n<li>\n<p>\u041e\u043d \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0435\u0442\u0438 \u0434\u043e\u0440\u043e\u0433 &#8212; \u0434\u043e\u0440\u043e\u0433 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0448\u0438\u0440\u043e\u043a\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043a\u0430\u043c\u0438, \u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0434\u043b\u0438\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u041b\u0438\u043d\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0437\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0434\u043e\u0440\u043e\u0433\u0438 <\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u043b\u0438\u043d\u043d\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 5-30 \u0441\u0435\u043a\u0443\u043d\u0434. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u043b\u044b\u0445. <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432 \u0440\u0430\u0437\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0432 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0432 \u0438\u0445 \u043e\u0442 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u044b\u0445 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/p>\n<p>\u0410 \u043a\u0430\u043a \u0431\u044b \u0412\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443? \u041f\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0417\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043c\u044b \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u043c.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u043e\u0440\u043e\u0433.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<p><a class=\"anchor\" name=\"%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8,%20%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8,%20%D0%BC%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8B\" id=\"\u0421\u0441\u044b\u043b\u043a\u0438, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b\"><\/a><\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h2>\n<ol>\n<li>\n<p>Stephen Vincent Mather, Pedro Wightma, Bborie Park, Thomas Kraft. PostGIS Cookbook: Store, organize, manipulate, and analyze spatial data, Second Edition, 2018, \u0441\u0442\u0440. 576<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/enterprise\/18\/index\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Postgres<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgis.net\/docs\/en\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c PostGIS<\/a><\/p>\n<\/li>\n<\/ol>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1040940\/\">https:\/\/habr.com\/ru\/articles\/1040940\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0425\u0430\u0431\u0440\u0430!\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433 \u0432 PostGIS, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043d\u0438\u0437\u0438\u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0438 \u0432 \u0440\u0430\u0437\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432.\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0421\u0441\u044b\u043b\u043a\u0438, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u041c\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0418\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0438-\u0418\u0422\u00bb, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0440\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0431\u0438\u0437\u043d\u0435\u0441-\u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043e\u0442\u0447\u0451\u0442\u043d\u043e\u0441\u0442\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u0441\u0444\u0435\u0440\u0430\u0445 Smart City \u0438 Smart Transport.\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u043e\u0440\u043e\u0433. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 PostGIS.\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (layer_id, object_id, zone_id). \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u0445 area \u0438 len \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u043b\u043e\u0449\u0430\u0434\u044c (ST_Area(geom)) \u0438 \u0434\u043b\u0438\u043d\u043d\u0430 (ST_MaxDistance(geom)) \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b? \u0412 \u043d\u0430\u0448\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0430\u0445: \u0434\u043e\u0440\u043e\u0436\u043d\u043e-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0441\u0448\u0435\u0441\u0442\u0432\u0438\u044f, \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043b\u044e\u043a\u0438, \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0442\u043d\u0430 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0412 \u0446\u0435\u043b\u044f\u0445 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0434\u043e\u0440\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432, \u0442\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c: \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0438\u0445 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u0434\u043e\u0440\u043e\u0433\u0438. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u044b \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u043a\u0440\u0443\u0433\u0430\u043c \u0438 \u0440\u0430\u0439\u043e\u043d\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438.\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e? \u0421\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433 \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0433\u0435\u0440\u043e\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u043e\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0434\u043e\u0440\u043e\u0433\u0438, \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u044f\u0437\u043a\u0438 \u0438 \u043c\u043e\u0441\u0442\u044b. \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u0441\u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b. \u0417\u0430\u044f\u0432\u043a\u0430 \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0414\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043d\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430 \u0438 \u0440\u0443\u0442\u0438\u043d\u043d\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0446\u0435\u043d\u043d\u0435\u0439\u0448\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0438 \u0432\u0430\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0440\u043e\u0433\u0438\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f:\u0414\u043b\u0438\u043d\u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 &#8212; 300 \u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0435. \u042d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0430\u044f \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 \u043a\u0430\u0440\u0442\u044b. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b &#8212; \u043e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0442\u044f\u0436\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u043e\u0439 300 \u043c\u0435\u0442\u0440\u0430\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0414\u043e\u0440\u043e\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0446\u0435\u043b\u043e \u043d\u0430 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0441 \u0434\u043b\u0438\u043d\u043e\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 50 \u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u043c\u0430\u043b\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c, \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u043c. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043a\u0440\u0443\u0433\u043e\u0432 \u0438 \u0440\u0430\u0439\u043e\u043d\u043e\u0432. \u0415\u0441\u043b\u0438 \u0434\u043e\u0440\u043e\u0433\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u043a\u0440\u0443\u0433\u0430 \u0438\u043b\u0438 \u0440\u0430\u0439\u043e\u043d\u0430, \u0432 \u0442\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.\u0411\u044b\u0441\u0442\u0440\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0434\u043e\u0440\u043e\u0433\u0438 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e 100 \u043a\u043c \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430 5-10 \u0441\u0435\u043a\u0443\u043d\u0434.\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u0432\u0438\u0434\u0435 SQL-\u0444\u0443\u043d\u043a\u0446\u0438\u0438:\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:layer_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f,object_id\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 \u0441\u043b\u043e\u0435.\u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:\u00a0\u0417\u0430\u043f\u0438\u0441\u044c (INSERT\/UPDATE)  \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0430\u043a\u0442\u0438\u0432\u043e\u0432 \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438layer_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f,object_id\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0432 \u0441\u043b\u043e\u0435,zone_id \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430,geom \u2014 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435: layer_id\u00a0 = 179, object_id = &#8216;10000257&#8217;. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0437\u043a\u0438\u041e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u2013 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u0438\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b part_id \u0438 \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430.1) \u0417\u0430\u043d\u043e\u0441\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 part_id \u0434\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 source_road_solid_parts. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043e\u043b\u043e\u043d\u043a\u0438: part_id; layer_id &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043b\u043e\u044f \u0434\u043e\u0440\u043e\u0433\u0438; object_id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0441\u043b\u043e\u0435; geometry \u2013 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u0438. \u0412\u0441\u0451 \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435.\u0415\u0441\u043b\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043c\u0430\u043b\u044b \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 ST_MaxDistance(geom) &lt;= 300 ), \u0442\u043e \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c zone_id. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f.2) \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f generate_road_skeleton \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043a\u0435\u043b\u0435\u0442 \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_skeleton. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0432\u044b\u0440\u0435\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e: \u043a\u043b\u0443\u043c\u0431, \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u043d\u044b\u0445 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043b\u044e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e ( ST_Buffer, ST_SimplifyPreserveTopology, ST_MakePolygon(ST_ExteriorRing(geometry))). \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c ST_StraightSkeleton \u0438\u043b\u0438 ST_ApproximateMedialAxis \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 ST_StraightSkeleton \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u2013 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 NULL, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c ST_ApproximateMedialAxis.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0421\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u041f\u043e\u043b\u0438\u0433\u043e\u043d \u0434\u043e\u0440\u043e\u0433\u0438 \u0438 \u0441\u043a\u0435\u043b\u0435\u0442 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)\u0424\u0443\u043d\u043a\u0446\u0438\u044f generate_road_skeleton&#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u0434\u043e\u0440\u043e\u0433\u0438CREATE OR REPLACE FUNCTION road_processing.generate_road_skeleton(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT,    p_tolerance FLOAT default 2.0)RETURNS VOID AS $$begin&#8212; \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_skeletondelete from road_processing.road_skeletonwhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;with\u2026&#8212; \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0431\u0435\u0437 \u0434\u044b\u0440\u043e\u043afilled_buffered_united_road AS (    SELECT ST_MakePolygon(ST_ExteriorRing(geometry)) as geometry    FROM buffered_united_road),&#8212; \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u043a\u0435\u043b\u0435\u0442\u0430simplified_filled_buffered_united_road AS (    SELECT ST_SimplifyPreserveTopology(geometry, p_tolerance) as geometry    FROM filled_buffered_united_road),&#8212; \u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043a\u0435\u043b\u0435\u0442skeleton AS (SELECT COALESCE(ST_StraightSkeleton(geometry), ST_ApproximateMedialAxis(geometry)) as geometry&#8212;SELECT ST_ApproximateMedialAxis(geometry) as geometry&#8212;    SELECT ST_StraightSkeleton(geometry) as geometry&#8212; SELECT CG_StraightSkeletonPartition(geometry, true) as geometry    FROM simplified_filled_buffered_united_road)&#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443insert into road_processing.road_skeleton (part_id, layer_id, object_id, geom)select p_part_id,p_layer_id,p_object_id,geometryfrom skeleton;END;$$ LANGUAGE plpgsql;3) \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0435\u0433\u043e \u043b\u0438\u043d\u0438\u0438 (LINESTRING). \u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_segments \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0435\u0433\u043e \u043b\u0438\u043d\u0438\u0438 \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u0442 \u0438\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_segments.\u0421\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043b\u0438\u043d\u0438\u0438\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_segmentsCREATE OR REPLACE FUNCTION road_processing.fill_road_segments(    p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$BEGIN&#8212; \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_segmentsdelete from road_processing.road_segmentswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;    INSERT INTO road_processing.road_segments (part_id, layer_id, object_id, id, geom, length)&#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u0438    WITH dumped AS (        SELECT (ST_Dump(geom)).geom AS geom        FROM road_processing.road_skeleton        WHERE part_id = p_part_id AND  layer_id = p_layer_id AND object_id = p_object_id     ),&#8212; \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e (\u0441\u043f\u0438\u0441\u043e\u043a) \u0438\u0437 \u043b\u0438\u043d\u0438\u0439    collected AS (        SELECT ST_Collect(geom) AS geom        FROM dumped    ),&#8212; \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f,    noded AS (        SELECT ST_Node(geom) AS geom        FROM collected    ),    geometries AS (        SELECT             p_part_id as part_id,             p_layer_id as layer_id,             p_object_id as object_id,             (ST_Dump(geom)).geom AS geom        FROM noded    )    SELECT         part_id,         layer_id,         object_id,        row_number() OVER () as id,        geom,        ST_Length(geom) as length    FROM geometries;END;$$ LANGUAGE plpgsql;4) \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_vertices, \u0445\u0440\u0430\u043d\u044f\u0449\u0443\u044e \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0446\u0430\u043c\u0438 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_segments, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e pgr_extractVertices. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435: id \u2013 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u0435\u0440\u0448\u0438\u043d\u044b; in_edges, out_edges \u2013 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432 (\u0440\u0451\u0431\u0435\u0440) \u0438\u0437 road_segments; geom \u2013 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b (\u0442\u043e\u0447\u043a\u0430); x, y \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b.\u0417\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_vertices\u0424\u0443\u043d\u043a\u0446\u0438\u044f fill_road_verticesCREATE OR REPLACE FUNCTION road_processing.fill_road_vertices(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS $$begin&#8212; \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b road_verticesdelete from road_processing.road_verticeswhere part_id = p_part_id and layer_id = p_layer_id and object_id = p_object_id;INSERT INTO road_processing.road_vertices (part_id, layer_id, object_id, id, in_edges, out_edges, x, y, geom)SELECT    p_part_id,p_layer_id,p_object_id,    id,    in_edges,    out_edges,    x,    y,    geomFROM pgr_extractVertices(format(&#8216;SELECT id, geom FROM road_processing.road_segments WHERE part_id = %s AND layer_id = %s AND object_id = %L&#8217;, p_part_id, p_layer_id, p_object_id));END;$$ LANGUAGE plpgsql;5) \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f update_road_segments \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 road_segments \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 road_vertices. \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 (\u0440\u0435\u0431\u0440\u043e) \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 (id), \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e (source) \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e (target) \u0432\u0435\u0440\u0448\u0438\u043d\u044b.\u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 road_segments\u0424\u0443\u043d\u043a\u0446\u0438\u044f update_road_segmentsCREATE OR REPLACE FUNCTION road_processing.update_road_segments(p_part_id INTEGER,    p_layer_id INTEGER,    p_object_id TEXT)RETURNS VOID AS&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481496","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481496"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481496\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}