{"id":265835,"date":"2015-09-17T13:36:03","date_gmt":"2015-09-17T09:36:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=265835"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=265835","title":{"rendered":"\u0420\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u0442\u0430\u0439\u043b\u0430\u0445 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0432 MSSQL"},"content":{"rendered":"<p>       \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0445\u0430\u0431\u0440\u0430-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f CLR \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <i>Microsoft.SqlServer.Types<\/i> \u043c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0438\u0445 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0411\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 MS SQL 2008. \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/6a3\/a68\/6e2\/6a3a686e21ca4a818baa1248891b6e6c.png\"\/>  <\/p>\n<h4>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 <\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  <a href=\"#problem\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/a><br \/>  <a href=\"#source-data\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/a><br \/>  <a href=\"#solution\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/a><br \/>  <a href=\"#tile-storage\">\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#steps-to-prepare-tiles\">\u042d\u0442\u0430\u043f\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#functions-to-be-used\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a><br \/>  <a href=\"#polyline-example\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439<\/a><br \/>  <a href=\"#intersection-detection\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f<\/a><br \/>  <a href=\"#tables-to-store-tile-images\">\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#tile-positioning\">\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/a><br \/>  <a href=\"#tile-combining\">\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#draw-geometry-on-a-tile\">\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/a><br \/>  <a href=\"#conclusion\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><br \/>  <habracut\/><br \/>  <a name=\"problem\"><\/a>  <\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SVG \u0438\u043b\u0438 CANVAS), \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443, \u043d\u043e \u0438 \u043f\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e. <br \/>  \u041f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043a\u043e\u043d\u043e\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<br \/>  <br clear=\"all\"\/>     <\/p>\n<h4>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/h4>\n<p><a name=\"source-data\"><\/a>  <\/p>\n<hr\/>\n<p>  \u041d\u0430\u0431\u043e\u0440 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Microsoft SQL 2008. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0437\u043b\u043e\u0432 \u2013 \u044d\u0442\u043e \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 (EPSG:4326). \u041f\u043e\u043b\u0435 \u0441 \u0433\u0435\u043e-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <i>GEOMETRY<\/i>. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0438\u043a\u043e\u043d\u043a\u0438, \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 <i>Point<\/i>. \u0412 \u0432\u0438\u0434\u0435 \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 <i>Polyline<\/i>. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f Polygon \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u043c. \u0422\u0430\u0439\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 <a href=\"http:\/\/spatialreference.org\/ref\/sr-org\/7483\/\">Web Mercator<\/a><\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/h4>\n<p><a name=\"solution\"><\/a>  <\/p>\n<hr\/>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u0430\u0439\u043b\u0430\u043c\u0438) \u043a\u0430\u043a \u0438 \u0441\u0430\u043c\u0430 \u043a\u0430\u0440\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e <i>Google Web Mercator<\/i>, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0430 google, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e <a href=\"http:\/\/code.google.com\/p\/geographical-dot-net\/source\/browse\/trunk\/GeographicalDotNet\/GeographicalDotNet\/Projection\/GoogleMapsAPIProjection.cs\">\u041c\u0435\u0440\u043a\u0430\u0442\u043e\u0440\u0430<\/a>:<br \/>   \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/239251\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. <br \/>  \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 Sql Server 2008, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOMETRY<\/i> \u0438 <i>GEOGRAPHY<\/i>. <br \/>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0442 Yandex, Google \u0438\u043b\u0438 OpenStreetMap \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 PNG \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043e\u0431\u044b\u0447\u043d\u043e 256&#215;256 \u0442\u043e\u0447\u0435\u043a. \u0425\u043e\u0442\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0433\u0434\u0435 \u0442\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043a\u0430\u043a SVG \u0438\u043b\u0438 CANVAS. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 PNG (picture network graphic). PNG \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043b\u044c\u0444\u0430 \u043a\u0430\u043d\u0430\u043b\u0435), \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0431\u0435\u0437 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0438\u044f, \u043f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043b\u043e\u0451\u0432.<\/p>\n<h4>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 <\/h4>\n<p><a name=\"tile-storage\"><\/a>  <\/p>\n<hr\/>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432. \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 0-\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u2013 1 \u0442\u0430\u0439\u043b:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/68a\/598\/90d\/68a59890d1768a5786cfc0a18fa34555.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 1-\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0430\u0439\u043b\u0430 2 * 2:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/a19\/298\/036\/a192980365ba4a999d4260035d96d4ed.jpg\"\/><br \/>   \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 n \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f 2n * 2n \u0442\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0439\u043b\u043e\u0432 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e.<br \/>   <a name=\"habracut\"><\/a><br \/>  \u0422\u0430\u0439\u043b\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Web-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e http \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<br \/>   <a href=\"http:\/\/someurl\/layer\/\">someurl\/layer<\/a>{Z}\/{X}\/{Y}.png<br \/>   \u0433\u0434\u0435 Z,X,Y \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431, X \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430, Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c url \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u0430\u0439\u043b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0422\u0440\u043e\u0438\u0446\u043a\u043e\u0433\u043e \u043c\u043e\u0441\u0442\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435:<br \/>  <a href=\"http:\/\/b.tile.openstreetmap.org\/15\/19144\/9524.png\">b.tile.openstreetmap.org\/15\/19144\/9524.png<\/a><br \/>  \u0412 \u044d\u0442\u043e\u043c url:<br \/>   15 \u2013 \u043d\u043e\u043c\u0435\u0440 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430;<br \/>   19144\u2013 X \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430;<br \/>   9524 \u2013 Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430.<br \/>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0444\u043e\u0440\u043c\u0430\u0442 URL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430, \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d <a href=\"http:\/\/wiki.openstreetmap.org\/wiki\/QuadTiles\">QUAD-\u043a\u043b\u044e\u0447<\/a>. \u0424\u0430\u0439\u043b\u044b \u0442\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e http \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 X, Y, Z.<br \/>  <a name=\"steps-to-prepare-tiles\"><\/a>  <\/p>\n<h4>\u042d\u0442\u0430\u043f\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<ul>\n<li>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430;<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430;<\/li>\n<li>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430;<\/li>\n<li>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/li>\n<\/ul>\n<p>  <a name=\"functions-to-be-used\"><\/a>\u2003  <\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u043f\u043e X, Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c \u0442\u0430\u0439\u043b\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0442\u0430\u0439\u043b\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0430\u0439\u043b \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0443\u0433\u043b\u043e\u0432, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0448\u0438\u0440\u043e\u0442\u0435 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0435. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SQL CLR. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f SQL CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u0430. \u041a\u043e\u0434 SQL CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Coords2PixelConversion \u0432 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u0430\u0445. <br \/>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0435\u0433\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u0437\u0434\u0435\u0441\u044c \u2013 \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u043e\u0442\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">'POLYGON ((30.322265625 59.955010262062061, 30.322265625 59.949509172252277, 30.333251953125 59.949509172252277, 30.333251953125 59.955010262062061, 30.322265625 59.955010262062061))' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0439 SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0438 tile.GetTileBounds()<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">tile.GetTileBounds(@level int, @x int, @y int) CREATE FUNCTION [tile].[GetTileBounds] (@level int, @x int, @y int) RETURNS geometry AS BEGIN DECLARE  @res GEOMETRY = NULL IF @level IS NOT NULL AND @x IS NOT NULL AND @y IS NOT NULL BEGIN   DECLARE @n1  FLOAT = PI() - 2.0 * PI() * @y \/ POWER(2.0, @level);   DECLARE @n2  FLOAT = PI() - 2.0 * PI() * (@y + 1) \/ POWER(2.0, @level);   DECLARE @top FLOAT = (180.0 \/ PI() * ATAN(0.5 * (EXP(@n1) - EXP(-@n1))));   DECLARE @bottom FLOAT = (180.0 \/ PI() * ATAN(0.5 * (EXP(@n2) - EXP(-@n2))));   DECLARE @tileWidth FLOAT = 360 \/ CONVERT(float, POWER(2, @level))    DECLARE @left FLOAT = @tileWidth * @x - 180,                     @right FLOAT = @tileWidth * (@x + 1) - 180   SET @res = geometry::STPolyFromText('POLYGON (('       + LTRIM(STR(@left, 25, 16)) + ' ' + LTRIM(STR(@top, 25, 16)) + ', '       + LTRIM(STR(@left, 25, 16)) + ' ' + LTRIM(STR(@bottom, 25, 16)) + ', '       + LTRIM(STR(@right, 25, 16)) + ' ' + LTRIM(STR(@bottom, 25, 16)) + ', '       + LTRIM(STR(@right, 25, 16)) + ' ' + LTRIM(STR(@top, 25, 16)) + ', '       + LTRIM(STR(@left, 25, 16)) + ' ' + LTRIM(STR(@top, 25, 16))       + '))', 0)   END   RETURN @res END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0430\u043b\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0439\u043b\u043e\u0432. \u0414\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0439\u043b\u043e\u0432. <br \/>  <br clear=\"all\"\/>  <\/p>\n<h6>\u0421\u043f\u043e\u0441\u043e\u0431 1:<\/h6>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e\u043c: \u0415\u0441\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u0430\u0439\u043b\u043e\u043c, \u0442\u043e \u043d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c 4 \u0442\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0439 \u0442\u0430\u0439\u043b, \u0442\u0430\u043a \u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0430\u0439\u043b\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0442\u0430\u0439\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0422\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u043e\u0441\u043e\u0431\u0435 2.<\/p>\n<h6>\u0421\u043f\u043e\u0441\u043e\u0431 2:<\/h6>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u2013 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0445\u0443\u0434\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>GEOMETRY::STEnvelope()<\/i> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043d\u0430\u0431\u043e\u0440\u0430 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e \u0438\u043b\u0438 \u0434\u043b\u0438\u043d\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0439\u043b\u043e\u0432. <\/p>\n<h6>\u0421\u043f\u043e\u0441\u043e\u0431 3: <\/h6>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0442\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0435\u0442\u043a\u0438, \u043f\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044e \u0441\u0435\u0442\u043a\u0438 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0442\u043e\u0447\u0435\u043a. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0430 \u0442\u0430\u0439\u043b\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0438\u043d\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0442\u043a\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0442\u0430\u0439\u043b\u043e\u0432, \u0438 \u043f\u043e \u044d\u0442\u0438\u043c \u0442\u043e\u0447\u043a\u0430\u043c \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0421\u0435\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0432\u043c\u0435\u0449\u0430\u044e\u0449\u0435\u0439 \u043b\u0438\u043d\u0438\u044e, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u043d\u0438\u0439. \u042d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0439\u043b \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. <br \/>  \u041e\u043f\u0438\u0448\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u0414\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043a\u0440\u0430\u0439\u043d\u0438\u043c\u0438 \u0442\u0430\u0439\u043b\u0430\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 (bbox) \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. <br \/>  \u041f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u043a\u0440\u043e\u043c\u0435 \u0442\u0438\u043f\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 <i>POINT<\/i>) \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 MSSQL <i>GEOMETRY::STEnvelope().<\/i> \u0414\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 <i>POINT<\/i> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b bbox \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0438\u043a\u043e\u043d\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <i>GetImageBound<\/i>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <i>GoogleProjection<\/i>. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u044b \u0432 \u0448\u0438\u0440\u043e\u0442\u0435 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0435. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043d\u043e\u043c\u0435\u0440 \u0442\u0430\u0439\u043b\u0430 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f X \u0438 Y \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u043f\u043e \u0434\u043e\u043b\u0433\u043e\u0442\u0435 \u0438 \u0448\u0438\u0440\u043e\u0442\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a SQL CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0430\u043b\u0435\u0435, \u0442\u0430\u043a \u0438 SQL \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435: <\/p>\n<pre><code class=\"sql\">tile.GetXTilePos((@Longitude FLOAT, @Zoom INT) tile.GetYTilePos((@Latitude FLOAT, @Zoom INT) <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u0430\u0439\u043b\u043e\u0432, \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0433\u043b\u043e\u0432\u044b\u043c\u0438 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"#fetch-geometry-tiles-zoom-deph-fn-source\"><i>tile.fn_FetchGeometryTilesZoomDepth()<\/i><\/a>. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SQL \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f X \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE FUNCTION tile.GetXTilePos(@Longitude FLOAT, @Zoom INT) RETURNS INT AS BEGIN\t\t     DECLARE @D FLOAT,@E FLOAT,@F FLOAT,@G FLOAT, @tileY INT, @tileX INT               SET  @D   = 128 * POWER(2, @Zoom)     SET  @E   = ROUND(@D + @Longitude * 256 \/ 360 * POWER(2, @Zoom), 0)                 SET @tileX  = Floor(@E \/ 256);                RETURN @tileX END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <br clear=\"all\"\/>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Y \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE FUNCTION tile.GetYTilePos(@Latitude FLOAT, @Zoom INT) RETURNS INT AS BEGIN      DECLARE\t\t@A FLOAT, @B FLOAT, @C FLOAT, @D FLOAT, @E FLOAT, @F FLOAT, @G FLOAT, @tileY INT                                 SET @D   = 128 * POWER(2, @Zoom)                             SET @A =\t Sin(PI() \/ 180 * @Latitude)      SET @B =\t -0.9999      SET @C =\t  0.9999      IF @A &lt; @B SET @A = @B      IF @A &gt; @C SET @A = @C      SET @F = @A      SET @G   = Round(@D + 0.5 * Log((1.0 + @F) \/ (1.0 - @F)) * (-256) * POWER(2, @Zoom) \/ (2 * PI()),0)                  SET @tileY  = Floor(@G \/ 256)                                RETURN @tileY END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"#fetch-geometry-tiles-zoom-deph-fn-source\"><i>tile.fn_FetchGeometryTilesZoomDepth()<\/i><\/a> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u0442\u0430\u0439\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e. \u0417\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0444\u0438\u0433\u0443\u0440\u044b \u0441 \u0442\u0430\u0439\u043b\u043e\u043c \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"#get-tiles-by-tile-num-zoom-depth-fn-source\"><i>tile.fn_GetTilesByTileNumZoomDepth()<\/i><\/a> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0434\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<br \/>  <a name=\"fetch-geometry-tiles-zoom-deph-fn-source\"><\/a>   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0430\u0439\u043b\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE FUNCTION tile.fn_FetchGeometryTilesZoomDepth  ( @GeoData GEOMETRY, @Zoom INT, @Depth INT) RETURNS @retTiles TABLE\t(     Zoom INT,    TileX INT,\tTileY INT) AS  BEGIN   DECLARE @Left FLOAT, @Right FLOAT, @Top FLOAT, @Bottom FLOAT   DECLARE @CurrentXTile INT, @CurrentYTile INT, @Quanttiles INT   DECLARE @Envelope GEOMETRY, @RightTop GEOMETRY, @LeftBottom GEOMETRY   DECLARE @CurTileGeom GEOMETRY, @res GEOMETRY   DECLARE @tiletop FLOAT,@tilebottom FLOAT,@tileleft FLOAT, @tileright FLOAT   DECLARE @LeftTilePos INT,@RightTilePos INT,@TopTilePos INT   DECLARE @BottomTilePos INT   SET @envelope = @GeoData.STEnvelope()   SET @RightTop =  @envelope.STPointN(3)               SET @LeftBottom = @envelope.STPointN(1)   SET @Right = @RightTop.STX   SET @Left = @LeftBottom.STX   SET @Top = @RightTop.STY   SET @Bottom = @LeftBottom.STY   SET @LeftTilePos      =\ttile.GetXTilePos( @Left,@Zoom)   SET @RightTilePos    =\ttile.GetXTilePos( @Right,@Zoom)   SET @TopTilePos      =\ttile.GetYTilePos( @Top,@Zoom)   SET @BottomTilePos =\ttile.GetYTilePos( @Bottom,@Zoom)   SET @CurrentXTile    = @LeftTilePos   WHILE @CurrentXTile &lt;= @RightTilePos   BEGIN      SET @currentYTile = @TopTilePos      WHILE @CurrentYTile &lt;= @BottomTilePos\t\t      BEGIN\t\t   \t\t \tINSERT INTO @retTiles (Zoom, TileX, TileY)\t\t\t\t\t\t         SELECT * FROM tile.fn_GetTilesByTileNumZoomDepth ( @GeoData, @Zoom, @CurrentXTile,  @CurrentYTile, @Depth )\t\t\t\t\t\t\t               SET @CurrentYTile = @CurrentYTile + 1     END      SET @CurrentXTile =@CurrentXTile + 1    END     RETURN END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>GEOMETRY::STIntersects()<\/i>. \u0415\u0441\u043b\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0442\u0430\u0439\u043b\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <i>tile.TileOverlap<\/i> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439, \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <i>@Depth<\/i> \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u044b\u043c \u043d\u0430 \u0435\u0434\u0435\u043d\u0438\u0446\u0443. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"#fetch-geometry-tiles-zoom-deph-fn-source\"><i> tile.fn_FetchGeometryTilesZoomDepth()<\/i><\/a>.<br \/>  <a name=\"get-tiles-by-tile-num-zoom-depth-fn-source\"><\/a>   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE FUNCTION tile.fn_GetTilesByTileNumZoomDepth ( @GeoData GEOMETRY, @Zoom INT, @tileX INT, @tileY INT, @Depth INT) RETURNS @retTiles TABLE (   Zoom INT,   X INT,   Y INT) AS  BEGIN DECLARE @currentTile TABLE (   Zoom INT,   X INT,   Y INT) IF\t  GEOGRAPHY::STGeomFromWKB([tile].[GetTileBounds](@Zoom, @tileX, @tileY).STAsBinary(),4326).STIntersects(GEOGRAPHY::STGeomFromWKB(@GeoData.MakeValid().STUnion(@GeoData.STStartPoint()).STAsBinary(),4326)) = 1  BEGIN \tINSERT INTO @currentTile SELECT @Zoom , @tileX , @tileY \t\t\t \tINSERT INTO @retTiles\t\tSELECT d.zoom, d.X, d.Y FROM @currentTile c \tCROSS APPLY (SELECT * FROM [tile].[fn_GetTilesForObjectByTileNumZoomDepth]( @GeoData , c.Zoom + 1, c.X * 2, c.Y * 2, @Depth - 1) WHERE @Depth &gt; 0) AS d \tINSERT INTO @retTiles\tSELECT d.zoom, d.X, d.Y FROM @currentTile c \tCROSS APPLY (SELECT * FROM [tile].[fn_GetTilesForObjectByTileNumZoomDepth]( @GeoData , c.Zoom + 1, c.X * 2 + 1, c.Y * 2, @Depth - 1) WHERE @Depth &gt; 0) AS d \tINSERT INTO @retTiles\tSELECT d.zoom, d.X, d.Y FROM @currentTile c \tCROSS APPLY (SELECT * FROM [tile].[fn_GetTilesForObjectByTileNumZoomDepth]( @GeoData , c.Zoom + 1, c.X * 2, c.Y * 2 + 1, @Depth - 1) WHERE @Depth &gt; 0) AS d \tINSERT INTO @retTiles\tSELECT d.zoom, d.X, d.Y FROM @currentTile c \tCROSS APPLY (SELECT * FROM [tile].[fn_GetTilesForObjectByTileNumZoomDepth]( @GeoData , c.Zoom + 1, c.X * 2 + 1, c.Y * 2 + 1, @Depth - 1) WHERE @Depth &gt; 0) AS d \tINSERT INTO @retTiles SELECT * FROM @currentTile END RETURN END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <br clear=\"all\"\/>  \u0415\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <i>tile.Tile<\/i>, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c. \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. <br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"#get-tiles-by-tile-num-zoom-depth-fn-source\"><i>tile.fn_GetTilesByTileNumZoomDepth()<\/i><\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0442\u0430\u0439\u043b\u0430\u043c\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u0432, \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <i>@Depth<\/i> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <i>@Zoom<\/i> = 2 \u0438 <i>@Depth<\/i> = 1 \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0442\u0430\u0439\u043b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 2, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b 4 \u0442\u0430\u0439\u043b\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 3. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u0438 \u0442\u0430\u0439\u043b\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0442\u0430\u0439\u043b \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOMETRY<\/i> \u0432 <i>GEOGRAPHY<\/i>, \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOGRAPHY<\/i> \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 4326, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0444\u0435\u0440\u0435.<br \/>  <a name=\"polyline-example\"><\/a>  <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043b\u043e\u043c\u0430\u043d\u043d\u043e\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0435\u0439 \u0446\u0435\u043d\u0442\u0440 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0430 \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u041c\u043e\u0441\u043a\u0432\u044b. \u041f\u0440\u043e\u0442\u044f\u0436\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 800 \u043a\u043c. \u041b\u043e\u043c\u0430\u043d\u043d\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b: \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434 \u2014 \u0412\u044b\u0448\u043d\u0438\u0439 \u0432\u043e\u043b\u043e\u0447\u043e\u043a \u2013 \u0422\u0432\u0435\u0440\u044c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0435\u043e\u043c\u0435\u0442\u0438\u044f \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043e\u0442 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0430 \u0434\u043e \u041c\u043e\u0441\u043a\u0432\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">'LINESTRING( 30.381113 59.971474, 31.26002 58.539215, 34.564158 57.591722, 35.915476 56.876838,37.622242 55.773125)' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0441 3 \u043f\u043e 17 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0441\u0435\u0433\u043e \u0442\u0430\u0439\u043b\u043e\u0432 11076, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043f\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 <a href=\"#tiles-count-distribution-by-zoom-table\">\u0442\u0430\u0431\u043b\u0438\u0446\u0435 1<\/a><br \/>  <a name=\"tiles-count-distribution-by-zoom-table\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0430\u0431\u043b\u0438\u0446\u0430 1 &#8212; \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<table>\n<tr>\n<th>\u041c\u0430\u0441\u0448\u0442\u0430\u0431<\/th>\n<th>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0439\u043b\u043e\u0432<\/th>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>7<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>23<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>45<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>88<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>174<\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>347<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>692<\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>1383<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>2766<\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>5529<\/td>\n<\/tr>\n<\/table>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u0439\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f 3-\u043e\u0433\u043e \u0438 4-\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c84\/948\/b5e\/c84948b5e595451caf72736ee6995ae3.png\"\/><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c6a\/fd5\/480\/c6afd548047b418a970c57c2ff2ae7d0.png\"\/><\/p>\n<p>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 \u2013 \u0422\u0430\u0439\u043b\u044b: 3\/4\/2 \u0438 4\/9\/4<\/p>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b. \u041d\u0430 4- 5 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>GEOMETRY::STEnvelope()<\/i> \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u043e. \u0412\u0441\u0435\u0433\u043e \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 4 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 2^4*2^4 = 256. \u041d\u043e \u043d\u0430 16 \u0438 17 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u0439\u043b\u043e\u0432. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u00ab\u043b\u0438\u0448\u043d\u0438\u0445\u00bb \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u0443\u0441\u043a\u043e\u0440\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0443. \u0414\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0442\u043e\u0447\u043a\u0430 (<i>POINT<\/i>), \u043e\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>  <a name=\"intersection-detection\"><\/a>\u2003  <\/p>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <i>GEOMETRY::STIntersects()<\/i> \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0442\u0430\u0439\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f STIntersects() \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 GEOMETRY \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0430 \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f <i>GEOMETRY<\/i> \u0432 \u0442\u0438\u043f <i>GEOGRAPHY<\/i>. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOMETRY<\/i> \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOGRAPHY<\/i> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043b\u0435\u0446 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u0446 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0434\u0442\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438. \u0414\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u0446 (\u043f\u0443\u0441\u0442\u043e\u0442) \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u0446\u0438\u0438 <i>GEOMETRY::MakeValid()<\/i> \u0438 <i>GEOMETRY::STUnion()<\/i> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 GEOMETRY \u0432 \u0442\u0438\u043f GEOGRAPHY. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 SRID = 4326, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 <a href=\"http:\/\/en.wikipedia.org\/wiki\/World_Geodetic_System\">\u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/a>.<\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438: Z, X, Y; \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0440\u0435\u0434\u0435\u0440\u0438\u043d\u0433\u0430 <a href=\"https:\/\/github.com\/mapnik\/mapnik\/wiki\/XMLConfigReference\">mapnik<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 mapnik \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 Microsoft SQL Server \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u043e\u0432 \u0432 mapnik \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438:<br \/>  \u2022 \u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430;<br \/>  \u2022 \u041e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432;<br \/>  \u2022 \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u043f\u043e\u0434\u0440\u044f\u0434.<br \/>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0442\u0430\u0439\u043b\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 MS SQL Server 2008. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435:<br \/>  <i><\/p>\n<ul>\n<li>tile.IconTile(),<\/li>\n<li>tile.ShapeTile(),<\/li>\n<li>tile.TileAgg(),<\/li>\n<li>tile.SaveToFolderByZoomXY()<\/li>\n<\/ul>\n<p><\/i>.<br \/>  <a name=\"tables-to-store-tile-images\"><\/a>  <\/p>\n<h4>\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u041d\u0430 <a href=\"#picture1-tables-to-store-tiles\">\u0440\u0438\u0441\u0443\u043d\u043a\u0435 2<\/a> \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446, \u0433\u0434\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0412 \u043f\u043e\u043b\u0435 Data \u0432 \u044d\u0442\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f PNG \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0442\u0430\u0439\u043b. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u0439\u043b\u043e\u0432 \u0432\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<br \/>  <a name=\"picture1-tables-to-store-tiles\"><\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/010\/700\/c06\/010700c06a0741af99006ddb3310e58b.png\"\/> <br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 \u2013 \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0439\u043b\u043e\u0432<br \/>  <a name=\"tile-positioning\"><\/a>  <\/p>\n<h4>\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 (\u0442\u0438\u043f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 POINT).<br \/>  \u0415\u0441\u0442\u044c \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043a\u043e\u043d\u043a\u0430. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0447\u043d\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<br \/>  1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0448\u0438\u0440\u043e\u0442\u0443 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0443 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b; <br \/>  2. \u0417\u0430\u0442\u0435\u043c, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430, \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430, \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430. \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0442\u0430\u0439\u043b\u0430 (pixXtile,pixYtile) \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 x \u0438 y \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u043d\u0430 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e 256 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439;<br \/>  <a name=\"point-positioning-step3\"><\/a><br \/>  3. \u0420\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0442\u0430\u0439\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f GetPixelXOnTile() \u0438 GetPixelXOnTile(). \u042d\u0442\u0430 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0446\u0435\u043d\u0442\u0440\u0430 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435;<br \/>  4. \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0430. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0438\u043a\u043e\u043d\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438.<br \/>  5. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CLR SQL \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[Microsoft.SqlServer.Server.SqlFunction]     public static SqlBinary IconTile(SqlBinary image, SqlInt32 zoom, SqlDouble Lon, SqlDouble Lat, SqlInt32 xTile, SqlInt32 yTile, SqlDouble scale)     {         SqlBinary result = null;         using (Icon2TileRendering paster = new Icon2TileRendering())         {             using (MemoryStream ms = new MemoryStream())             {                 ms.Write(image.Value, 0, image.Length);                 SetBeginPosition(ms);                 paster.PasteFromStreamScaledImageToTile((int)zoom, (double)Lon, (double)Lat, (int)xTile, (int)yTile, (double)scale, ms);                 result = paster.GetBytes();             }         }         return result;     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\"> #region [Pixel Position Calculation] Rectangle GetTargetBound(int zoom, double Lon, double Lat, int xTile, int yTile, int width, int height) {   int xPix = _conv.FromLongitudeToXPixel(Lon, zoom);   int yPix = _conv.FromLatitudeToYPixel(Lat, zoom);   int xPos = xPix - xTile * TILE_SIZE;   int yPos = yPix - yTile * TILE_SIZE;    int halfWidth = width \/ 2;   int halfHeight = height \/ 2;   return new Rectangle(xPos - halfWidth, yPos - halfHeight, width, height  }   int GetPixelXOnTile(int zoom, double Lon, int xTile) {   return _conv.FromLongitudeToXPixel(Lon, zoom) - xTile * TILE_SIZE; } int GetPixelYOnTile(int zoom, double Lat, int yTile) {              return _conv.FromLatitudeToYPixel(Lat, zoom) - yTile * TILE_SIZE; } #endregion [Pixel Position Calculation] <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary&gt; \/\/\/ \u0420\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;zoom&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Lon&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Lat&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;xTile&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;yTile&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;iconImage&quot;&gt;&lt;\/param&gt; public void PasteImageToTileByLatLon(int zoom, double Lon, double Lat, int xTile, int yTile, Bitmap iconImage) {   int width = iconImage.Width;   int height = iconImage.Height;   CopyRegionIntoImage(iconImage, new Rectangle(0, 0, width, height),  GetTargetBound(zoom, Lon, Lat, xTile, yTile, width, height)); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <a name=\"tile-combining\"><\/a>  <\/p>\n<h4>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u041d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0430\u0439\u043b \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <i>tile.TileAgg()<\/i>, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0430\u044f \u0442\u0430\u0439\u043b\u044b \u0432 \u043e\u0434\u0438\u043d. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0443\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0441 \u0442\u0430\u0439\u043b\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441 BINARY \u043f\u043e\u043b\u0435\u043c, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0442\u0430\u0439\u043b\u0430, \u0441 \u0438\u0437\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0411\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2013 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0442\u0430\u0439\u043b\u0430, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u043a\u043e\u043d\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0447\u0435\u0433\u043e. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0442\u0430\u0439\u043b\u043e\u0432 \u0441 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u043d\u0438\u0445 \u0438\u043a\u043e\u043d\u043a\u0430\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE PROC [tile].[FillObjectTilesIntersection]( @StartZoom INT, @EndZoom INT) \tAS  \tBEGIN \tDECLARE @CurrentZoom INT \tSET @CurrentZoom = @StartZoom WHILE @CurrentZoom  &lt;= @EndZoom BEGIN   INSERT INTO tile.Tile (X,Y,Data,Zoom)   SELECT  t.TileX,t.TileY, [tile].[TileAgg] \t\t(tile.IconTile(i.Data, @CurrentZoom,o.Longitude,o.Latitude,t.tileX,t.tileY, 1.0) \t\t),@CurrentZoom AS Zoom   FROM tile.Shape o   INNER JOIN tile.[Image] i ON i.ImageID = o.ImageID   CROSS APPLY  tile.fn_FetchObjectTiles(tile.GetIconBoundForZoom(o.Longitude, o.Latitude, 64, 64, @CurrentZoom, 0),@CurrentZoom) t   WHERE o.TypeID = @TypeID   GROUP BY  t.TileX,t.TileY   SET @CurrentZoom = @CurrentZoom + 1  END END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <i>tile.Object<\/i> \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0430 \u0438\u043a\u043e\u043d\u043a\u0438, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <i>tile.Image<\/i> \u0432 \u043f\u043e\u043b\u0435 \u0442\u0438\u043f\u0430 <i>Binary<\/i>.   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">C\u043a\u0440\u0438\u043f\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432  3\/4\/2 \u0438 4\/9\/4 \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0434\u043e\u043b\u0433\u043e\u0442\u0435 30.381113 \u0438 \u0448\u0438\u0440\u043e\u0442\u0435 59.971474<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">DECLARE @Image VARBINARY(MAX) SELECT TOP (1) @image =  (   SELECT  * FROM OPENROWSET(BULK N'd:\\media\\icons\\pin_orange.png', SINGLE_BLOB) As tile) SELECT [tile].[SaveToFolderByZoomXY]([tile].[IconTile](@image, 3,30.381113, 59.971474, 4, 2, 1.0), N'D:\\Tiles\\',3,4,2) SELECT [tile].[SaveToFolderByZoomXY]([tile].[IconTile](@image, 4,30.381113, 59.971474, 9, 4, 1.0), N'D:\\Tiles\\',4,9,4) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 \u2013 \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u0441 \u0438\u043a\u043e\u043d\u043a\u043e\u0439<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/52c\/e97\/58b\/52ce9758bcc84a00b61a8f80d8325966.png\"\/><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ddf\/973\/ad1\/ddf973ad106e4baeaf45a45f166b6800.png\"\/>  <\/div>\n<\/div>\n<p>  <a name=\"draw-geometry-on-a-tile\"><\/a>  <\/p>\n<h4>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u0414\u043b\u044f \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 (POLYLINE, MULTIPOLYLINE) \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0442\u0430\u0439\u043b\u0430 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043f\u043e\u043b\u0438\u043b\u0438\u043d\u0438\u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432\u043d\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0442\u0430\u0439\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0438 \u0437\u0430\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e, \u0442\u043e \u0435\u0441\u0442\u044c <i>POLYGON<\/i>, <i>MULTIPOLYGON<\/i>, <i>GEOMETRYCOLLECTION<\/i> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f <i>POLYGON<\/i> \u0438\u043b\u0438 <i>MULTYPOLYGON<\/i>. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <i>ShapeToTileRendering<\/i> \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0430\u043f\u044b:<br \/>  1. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u0448\u0438\u0440\u043e\u0442\u0430, \u0434\u043e\u043b\u0433\u043e\u0442\u0430) \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0438\u0440\u043e\u0442\u044b, \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 PSG3857 (Google \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f) \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e (<b>A<\/b>). \u042d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>ConvertToZoomedPixelZeroedByTileGeometry(poly, Z, X, Y)<\/i><br \/>  2. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>B<\/b>) \u0442\u0430\u0439\u043b\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 <br \/>  <a name=\"geometry-forming-step3\"><\/a><br \/>  3. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>C<\/b>) \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c (<i>STIntersection<\/i>) \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 (<b>B<\/b>) \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (<b>A<\/b>) <br \/>  4. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>D<\/b>) \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>C<\/b>) \u0438 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 (<b>B<\/b>), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430 \u0438 \u0433\u0440\u0430\u043d\u0438\u0447\u0430\u0449\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u0439\u043b\u0430. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>E<\/b>) \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438<i> .STDifference ( other_geometry )<\/i><br \/>  <a name=\"geometry-forming-step5\"><\/a><br \/>  5. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>E<\/b>) \u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0443\u0440 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0442\u0443\u0440\u0430(<i>LINESTRING<\/i> \u0438\u043b\u0438 <i>MULTILINSTRING<\/i>) \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>\u0421<\/b>) \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>D<\/b>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <br \/>  6. \u0417\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>\u0421<\/b>) \u2013 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c<br \/>  7. \u0420\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>E<\/b>) -\u043a\u043e\u043d\u0442\u0443\u0440 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0442\u0430\u0439\u043b\u0430<br \/>  8. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0448\u0430\u0433\u0438 \u0441 1 \u043f\u043e 7 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <i>tile.TileOverlap<\/i><br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0435 3 \u044d\u0442\u0430\u043f\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u0439\u043b\u0430 15-\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0432 X \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 19144 \u0438 Y \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 9524. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e T-SQL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0430\u0439\u043b\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:  <\/p>\n<pre><code class=\"sql\"> SELECT [tile].[GetTileBounds](15,19144,9524).ToString() <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\"> 'POLYGON ((30.322265625 59.955010262062061, 30.322265625 59.949509172252277, 30.333251953125 59.949509172252277, 30.333251953125 59.955010262062061, 30.322265625 59.955010262062061))' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0432 \u0432\u0438\u0434\u0435 \u0440\u043e\u043c\u0431\u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0442\u0430\u0439\u043b\u043e\u043c. \u041f\u0443\u0441\u0442\u044c \u0446\u0435\u043d\u0442\u0440\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u0442\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0435\u043c\u043b\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0437\u0435\u043c\u043b\u044f \u0438\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0441\u0444\u0435\u0440\u044b \u0441 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c 6367 \u043a\u043c. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u043e\u0442\u0430 \u0446\u0435\u043d\u0442\u0440\u0430 \u0434\u0443\u0433\u0438, \u0430\u0437\u0438\u043c\u0443\u0442(\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0442\u043e\u0440\u0430), \u0443\u0433\u043e\u043b \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430 \u0434\u0443\u0433\u0438, \u0440\u0430\u0434\u0438\u0443\u0441 \u0432 \u043c\u0435\u0442\u0440\u0430\u0445 \u0438 \u0448\u0430\u0433 \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0443\u0433\u043b\u0430 \u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u0430\u044f \u0434\u0443\u0433\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0447\u0435\u043a \u0432 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0430\u0437\u0438\u043c\u0443\u0442, \u0443\u0433\u043e\u043b \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442\u0430 \u0440\u0430\u0432\u043d\u044b\u043c 360 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0438 \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u0435 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430\u0448 \u0440\u043e\u043c\u0431. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b, \u0433\u0434\u0435 c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043e\u0440\u043c\u0443\u043b \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0443\u0433\u043b\u0443 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0434\u0443\u0433\u0435 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438, \u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0435\u043c\u043b\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0442\u043e\u0447\u0435\u043a:   <\/p>\n<pre><code class=\"sql\">SELECT [tile].[fn_GetCircleSegment](30.3277587890625, 59.952259717159905,0,360,440,90) <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0441\u0444\u0435\u0440\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE FUNCTION [tile].[fn_ GetCircleSegment] (@X float, @Y float, @azimuth float, @angle float, @distance float, @step FLOAT) RETURNS geometry WITH EXEC AS CALLER AS BEGIN   IF @X IS NULL OR @Y IS NULL OR @azimuth IS NULL OR ISNULL(@angle, 0) = 0 OR ISNULL(@distance, 0) &lt;= 0     RETURN NULL     DECLARE @sectorStepAngle FLOAT   SET @sectorStepAngle = @step   IF ABS(@angle) &gt; 360     SET @angle = 360   DECLARE @pointsStr VARCHAR(MAX)   DECLARE @firstPointsStr VARCHAR(MAX)   DECLARE @earthRadius FLOAT   DECLARE @lat FLOAT   DECLARE @lon FLOAT   DECLARE @d FLOAT     IF ABS(@angle) &lt; 360     SET @pointsStr = LTRIM(STR(@X, 25, 16)) + ' ' + LTRIM(STR(@Y, 25, 16))   ELSE    SET @pointsStr = ''   SET @earthRadius = 6367   SET @lat = RADIANS(@Y)   SET @lon = RADIANS(@X)   SET @d = (@distance \/ 1000) \/ @earthRadius   DECLARE @angleStart FLOAT   DECLARE @angleEnd FLOAT   SET @angleStart = @azimuth - @angle \/ 2;   SET @angleEnd = @azimuth + @angle \/ 2;   DECLARE @pointsCount INT   SET @pointsCount = FLOOR(@angle \/ @sectorStepAngle)    DECLARE @brng FLOAT   DECLARE @latRadians FLOAT   DECLARE @lngRadians FLOAT   DECLARE @ptX FLOAT   DECLARE @ptY FLOAT   DECLARE @i INT   SET @i = 0   DECLARE @addPrefix TINYINT   IF ABS(@angle) &lt; 360     SET @addPrefix = 1   ELSE    SET @addPrefix = 0   WHILE @i &lt;= @pointsCount   BEGIN     SET @brng = RADIANS(@angleStart + @i * @sectorStepAngle);     SET @latRadians = ASIN(SIN(@lat) * COS(@d) + COS(@lat) * SIN(@d) * COS(@brng));     SET @lngRadians = @lon + ATN2(SIN(@brng) * SIN(@d) * COS(@lat), COS(@d) - SIN(@lat) * SIN(@latRadians));     SET @ptX = 180.0 * @lngRadians \/ PI();     SET @ptY = 180.0 * @latRadians \/ PI();     IF @addPrefix = 1     BEGIN       SET @pointsStr += ', ' + LTRIM(STR(@ptX, 25, 16)) + ' ' + LTRIM(STR(@ptY, 25, 16))     END     ELSE     BEGIN       SET @pointsStr += LTRIM(STR(@ptX, 25, 16)) + ' ' + LTRIM(STR(@ptY, 25, 16))             SET @addPrefix = 1     END       IF @i = 0       SET @firstPointsStr = LTRIM(STR(@ptX, 25, 16)) + ' ' + LTRIM(STR(@ptY, 25, 16))     IF @i = @pointsCount AND (@angleStart + @pointsCount * @sectorStepAngle) &lt; @angleEnd     BEGIN       SET @brng = RADIANS(@angleEnd);       SET @latRadians = ASIN(SIN(@lat) * COS(@d) + COS(@lat) * SIN(@d) * COS(@brng));       SET @lngRadians = @lon + ATN2(SIN(@brng) * SIN(@d) * COS(@lat), COS(@d) - SIN(@lat) * SIN(@latRadians));       SET @ptX = 180.0 * @lngRadians \/ PI();       SET @ptY = 180.0 * @latRadians \/ PI();       SET @pointsStr = @pointsStr + ', ' + LTRIM(STR(@ptX, 25, 16)) + ' ' + LTRIM(STR(@ptY, 25, 16))     END     SET @i = @i + 1   END   IF ABS(@angle) &lt; 360     SET @pointsStr += ', ' + LTRIM(STR(@X, 25, 16)) + ' ' + LTRIM(STR(@Y, 25, 16))   ELSE     SET @pointsStr += ', ' + @firstPointsStr   RETURN geometry::STPolyFromText('POLYGON ((' + @pointsStr + '))', 0) END GO <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u0442\u0435 \u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CLR \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary&gt; \/\/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;longitude&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;latitude&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;azimuth&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;angle&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;radius&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;returns&gt;&lt;\/returns&gt; [Microsoft.SqlServer.Server.SqlFunction] public static SqlGeometry DrawGeoSpatialSectorVarAngle(SqlDouble longitude, SqlDouble latitude, SqlDouble azimuth,                                                        SqlDouble angle, SqlDouble radius, SqlDouble stepAngle) {   if (longitude == SqlDouble.Null || latitude == SqlDouble.Null || azimuth == SqlDouble.Null ||                 angle == SqlDouble.Null || radius == SqlDouble.Null || radius == 0 || angle == 0)     return SqlGeometry.Parse(&quot;GEOMETRYCOLLECTION EMPTY&quot;);              SqlGeometryBuilder builder = new SqlGeometryBuilder();   builder.SetSrid(0);   builder.BeginGeometry(OpenGisGeometryType.Polygon);              double firstPointLon;   double firstPointLat;   double sectorStepAngle = (double) stepAngle;   const double earthRadius = 6367.0;   double lat = (double) latitude;   double lon = (double) longitude;   double azim = (double) azimuth;   double ang = (double) angle;   double piRad = (Math.PI\/180.0);   double tLat = piRad*lat;   double tLon = piRad*lon;   double distkm = ((double) radius\/1000)\/earthRadius;   double angleStart = azim - ang\/2;   double angleEnd = azim + ang\/2;    var _angle = Math.Abs(ang);   if (_angle &gt; 360.0)   {      angle = 360.0;   }   int pointCount = (int) Math.Floor(ang\/sectorStepAngle);   double brng;   double latRadians;   double lngRadians;   double ptX;   double ptY;   int i = 0;    if (angle &lt; 360.0)   {     builder.BeginFigure(lon, lat);     firstPointLon = lon;     firstPointLat = lat;   }   else   {     brng = piRad*(angleStart);     latRadians = Math.Asin(Math.Sin(tLat)*Math.Cos(distkm) + Math.Cos(tLat)*Math.Sin(distkm)*Math.Cos(brng));     lngRadians = tLon +    Math.Atan2(Math.Sin(brng)*Math.Sin(distkm)*Math.Cos(tLat),                                         Math.Cos(distkm) - Math.Sin(tLat)*Math.Sin(latRadians));     ptX = 180.0*lngRadians\/Math.PI;     ptY = 180.0*latRadians\/Math.PI;     builder.BeginFigure(ptX, ptY);     firstPointLon = ptX;     firstPointLat = ptY;   }   while (i &lt;= pointCount)   {      brng = piRad*(angleStart + i*sectorStepAngle);     latRadians = Math.Asin(Math.Sin(tLat)*Math.Cos(distkm) + Math.Cos(tLat)*Math.Sin(distkm)*Math.Cos(brng));     lngRadians = tLon +     Math.Atan2(Math.Sin(brng)*Math.Sin(distkm)*Math.Cos(tLat),                                         Math.Cos(distkm) - Math.Sin(tLat)*Math.Sin(latRadians));     ptX = 180.0*lngRadians\/Math.PI;     ptY = 180.0*latRadians\/Math.PI;      builder.AddLine(ptX, ptY);      i = i + 1;   }   if (((angleStart + pointCount * sectorStepAngle) &lt; angleEnd))   {     brng = piRad * (angleEnd);     latRadians = Math.Asin(Math.Sin(tLat) * Math.Cos(distkm) + Math.Cos(tLat) * Math.Sin(distkm) * Math.Cos(brng));     lngRadians = tLon +   Math.Atan2(Math.Sin(brng) * Math.Sin(distkm) * Math.Cos(tLat),                                        Math.Cos(distkm) - Math.Sin(tLat) * Math.Sin(latRadians));     ptX = 180.0 * lngRadians \/ Math.PI;     ptY = 180.0 * latRadians \/ Math.PI;     builder.AddLine(ptX, ptY);    }   builder.AddLine(firstPointLon, firstPointLat);   builder.EndFigure();   builder.EndGeometry();   return builder.ConstructedGeometry; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430\u0439\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u043e\u043c\u0431\u0430 (\u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">DECLARE @bbox GEOMETRY DECLARE @octagon GEOMETRY SELECT @bbox = [tile].[GetTileBounds](15,19144,9524),  @octagon = [tile].[fn_GetCircleSegment](30.3277587890625, 59.952259717159905,0,360,440,90) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c 30.3277587890625, 59.952259717159905 \u2013 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0446\u0435\u043d\u0442\u0440\u0430 \u0442\u0430\u0439\u043b\u0430;<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u0441 \u0448\u0438\u0440\u043e\u0442\u043e\u0439 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u043e\u0439 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445:  <\/p>\n<pre><code class=\"sql\">SELECT @bbox.STIntersection(@octagon) <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0442\u0430\u0439\u043b\u043e\u043c \u0441 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c\u0438 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">'POLYGON ((30.3253442162734 59.949509172234684,  30.3301733618516 59.949509172234684,  30.333251953125 59.9510505967796,  30.333251953125 59.953468509045528,  30.330173073498937 59.955010262085125,  30.325344504626063 59.955010262085125,  30.322265625 59.953468509045528,  30.322265625 59.9510505967796,  30.3253442162734 59.949509172234684))' <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u043e\u0442\u043d\u0435 \u043a\u0430\u0440\u0442\u044b:   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 X \u0438 Y \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">SELECT [tile].[GetPixelXPosFromLongitude](30.3253442162734,15), [tile].[GetPixelYPosFromLatitude](59.949509172234684,15) , [tile].[GetPixelXPosFromLongitude](30.3301733618516,15), [tile].[GetPixelYPosFromLatitude]( 59.949509172234684,15) , [tile].[GetPixelXPosFromLongitude](30.333251953125,15), [tile].[GetPixelYPosFromLatitude](  59.9510505967796,15) , [tile].[GetPixelXPosFromLongitude](30.333251953125,15), [tile].[GetPixelYPosFromLatitude](  59.953468509045528,15) , [tile].[GetPixelXPosFromLongitude](30.330173073498937,15), [tile].[GetPixelYPosFromLatitude](  59.955010262085125,15) , [tile].[GetPixelXPosFromLongitude](30.325344504626063,15), [tile].[GetPixelYPosFromLatitude](   59.955010262085125,15) ,[tile].[GetPixelXPosFromLongitude](30.322265625,15), [tile].[GetPixelYPosFromLatitude](  59.953468509045528,15) , [tile].[GetPixelXPosFromLongitude](30.322265625,15), [tile].[GetPixelYPosFromLatitude](  59.9510505967796,15) , [tile].[GetPixelXPosFromLongitude](30.3253442162734,15), [tile].[GetPixelYPosFromLatitude](  59.949509172234684,15) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<table>\n<tr>\n<th>\u0414\u043e\u043b\u0433\u043e\u0442\u0430<\/th>\n<th>\u0428\u0438\u0440\u043e\u0442\u0430<\/th>\n<th>X \u043f\u0438\u043a\u0441\u0435\u043b\u044c 15-\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430<\/th>\n<th>Y \u043f\u0438\u043a\u0441\u0435\u043b\u044c 15-\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430<\/th>\n<\/tr>\n<tr>\n<td>30.3253442162734<\/td>\n<td>59.949509172234684<\/td>\n<td>4900936<\/td>\n<td>2438400<\/td>\n<\/tr>\n<tr>\n<td>30.3301733618516<\/td>\n<td>59.949509172234684<\/td>\n<td>4901048<\/td>\n<td>2438400<\/td>\n<\/tr>\n<tr>\n<td>30.333251953125<\/td>\n<td>59.9510505967796<\/td>\n<td>4901120<\/td>\n<td>2438328<\/td>\n<\/tr>\n<tr>\n<td>30.333251953125<\/td>\n<td>59.953468509045528<\/td>\n<td>4901120<\/td>\n<td>2438216<\/td>\n<\/tr>\n<tr>\n<td>30.330173073498937<\/td>\n<td>59.955010262085125<\/td>\n<td>4901048<\/td>\n<td>2438144<\/td>\n<\/tr>\n<tr>\n<td>30.325344504626063<\/td>\n<td>59.955010262085125<\/td>\n<td>4900936<\/td>\n<td>2438144<\/td>\n<\/tr>\n<tr>\n<td>30.322265625<\/td>\n<td>59.953468509045528<\/td>\n<td>4900864<\/td>\n<td>2438216<\/td>\n<\/tr>\n<tr>\n<td>30.322265625<\/td>\n<td>59.9510505967796<\/td>\n<td>4900864<\/td>\n<td>2438328<\/td>\n<\/tr>\n<tr>\n<td>30.3253442162734<\/td>\n<td>59.949509172234684<\/td>\n<td>4900936<\/td>\n<td>2438400<\/td>\n<\/tr>\n<\/table>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u0430 \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0442\u0430\u0439\u043b\u0430 \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">SELECT GEOMETRY::STGeomFromText('LINESTRING(4900936\t2438400,\t4901048\t2438400,\t4901120\t2438328,\t4901120\t2438216,\t4901048\t2438144,\t4900936\t2438144,\t4900864\t2438216,\t4900864\t2438328,\t4900936\t2438400 )',0) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>\u0421<\/b>) \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043d\u0430 <a href=\"#geometry-forming-step3\">\u0448\u0430\u0433\u0435 3<\/a>, \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0430\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0435, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u0437\u0435\u043b\u0451\u043d\u044b\u043c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4 \u043d\u0438\u0436\u0435. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bfe\/63b\/6f3\/bfe63b6f342d45e7bdd3f1e29eb557c4.jpg\"\/> <br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4 \u2013 \u043e\u0431\u0449\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0442\u0430\u0439\u043b\u0430 \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/p>\n<p>  \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>D<\/b>) \u043d\u0430\u043c \u043d\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0443\u0436\u043d\u0430, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043b\u0438\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435, \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"#geometry-forming-step5\">\u0448\u0430\u0433\u0435 5<\/a>, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>\u0421<\/b>) \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (<b>D<\/b>), \u0442\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u0441\u0438\u043d\u0438\u043c \u043d\u0430 <a href=\"#geometry-forming-picture5\">\u0440\u0438\u0441\u0443\u043d\u043a\u0435 5.<\/a><br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0438 \u043d\u0430\u0431\u043e\u0440 \u043b\u0438\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0435\u0441\u0442\u044c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f (<b>E<\/b>):  <\/p>\n<pre><code class=\"sql\">SELECT GEOMETRY::STGeomFromText('MULTILINESTRING((4901048\t2438400,\t4901120\t2438328),(\t4901120\t2438216,\t4901048\t2438144),(\t4900936\t2438144,\t4900864\t2438216),\t(4900864\t2438328,\t4900936\t2438400) )',0) <\/code><\/pre>\n<p>  <a name=\"geometry-forming-picture5\"><\/a><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3bd\/aa6\/d99\/3bdaa6d991df4709bc60306b313e7769.jpg\"\/> <br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5 \u2013 \u041a\u043e\u043d\u0442\u0443\u0440 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 (\u0432\u044b\u0434\u0435\u043b\u0435\u043d \u0441\u0438\u043d\u0438\u043c)<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 T-SQL \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PNG \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u0443 Z\/X\/Y. \u041f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u0430\u043f\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">DECLARE @bbox GEOMETRY DECLARE @rhomb GEOMETRY DECLARE @image VARBINARY(MAX) SELECT @bbox = [tile].[GetTileBounds](15,19144,9524), @rhomb = [tile].[fn_GetSector](30.3277587890625, 59.952259717159905,0,360,440,90) SET @image = [tile].[ShapeTile]( @octagon,15,19144,9524,'4400B050','9601B41E',3) SELECT[tile].[SaveToFolderByZoomXY](@image,'d:\/tiles',15,19144,9524) SET @image = [tile].[ShapeTile]( @octagon,15,19143,9524,'4400B050','9601B41E',3) SELECT[tile].[SaveToFolderByZoomXY](@image,'d:\/tiles',15,19143,9524) SET @image = [tile].[ShapeTile]( @octagon,15,19145,9524,'4400B050','9601B41E',3) SELECT[tile].[SaveToFolderByZoomXY](@image,'d:\/tiles',15,19145,9524) SET @image = [tile].[ShapeTile]( @octagon,15,19144,9523,'4400B050','9601B41E',3) SELECT[tile].[SaveToFolderByZoomXY](@image,'d:\/tiles',15,19144,9523) SET @image = [tile].[ShapeTile]( @octagon,15,19144,9525,'4400B050','9601B41E',3) SELECT[tile].[SaveToFolderByZoomXY](@image,'d:\/tiles',15,19144,9525) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 PNG \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c1e\/da1\/b7c\/c1eda1b7c5cd4e4590f9d4219e2b05e7.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/161\/2e8\/1fd\/1612e81fd13e44eebd647b85569dbc82.png\"\/><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/81b\/adf\/f43\/81badff4353b4cecac28cd7c0eb10cc2.png\"\/><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c95\/30e\/b43\/c9530eb433244bbb8fc95d84c2acde94.png\"\/><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bc0\/7bc\/a02\/bc07bca024c44606b56f87af40de525d.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <i>DrawPartObjectShapeOnTile()<\/i> \u043a\u043b\u0430\u0441\u0441\u0430 <i>ShapeToTileRendering<\/i>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0447\u0430\u0441\u0442\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0442\u0430\u0439\u043b\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary&gt; \/\/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0447\u0430\u0441\u0442\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435 \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;shape&quot;&gt;\u041f\u043e\u043b\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442&lt;\/param&gt; \/\/\/ &lt;param name=&quot;X&quot;&gt;X \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Y&quot;&gt;Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Zoom&quot;&gt;\u043d\u043e\u043c\u0435\u0440 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;argbFill&quot;&gt;\u0446\u0432\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 ARGB&lt;\/param&gt; \/\/\/ &lt;param name=&quot;argbStroke&quot;&gt;\u0446\u0432\u0435\u0442 \u043a\u043e\u043d\u0442\u0443\u0440\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;strokeWidth&quot;&gt;\u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0430&lt;\/param&gt; public void DrawPartObjectShapeOnTile(SqlGeometry shape, int X, int Y, int Zoom, string argbFill,                                       string argbStroke, int strokeWidth) {   PasteShapeOnTile(CreateColor(argbFill), CreateColor(argbStroke), strokeWidth,     CutPolygonByZoomedPixelZeroTile(shape, X, Y, Zoom)); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0442\u0434\u0435 <i>PasteShapeOnTile()<\/i> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435.<\/p>\n<pre><code class=\"cs\">private void PasteShapeOnTile(Color fillcolor, Color strokecolor, int width, List&lt;SqlGeometry&gt; geom) {   SqlGeometry shape = geom[0];   int geomnum = (int) shape.STNumGeometries();   SqlGeometry stroke = null;   SqlGeometry ring;   int intnum;   if (geom != null)   switch (GetOpenGisGeometryType(shape))   {     case OpenGisGeometryType.LineString:     case OpenGisGeometryType.MultiLineString:          DrawMultiLineStringBordered2(shape, fillcolor, strokecolor, width, 1);          break;     case OpenGisGeometryType.Polygon:          intnum = (int) shape.STNumInteriorRing();          ring = shape.STExteriorRing();          \/\/ 1. \u0420\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0431\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u0446          FillPolygonOnTile(fillcolor, ring.ToPointsArray());          \/\/ 2. \u0420\u0438\u0441\u0443\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043e\u043b\u044c\u0446\u0430          if (geomnum &gt;= 1) stroke = geom[1];          for (int i = 1; i &lt;= intnum; i++)          {            FillTransparentPolygonOnTile(shape.STInteriorRingN(i).ToPointsArray());          }          \/\/ 3. \u0420\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440          if (geom.Count &gt; 1)          {            stroke = geom[1];            DrawContourOnTile(stroke, strokecolor, width);          }          break;     case OpenGisGeometryType.MultiPolygon:          break;   } } <\/code><\/pre>\n<p>  \u041f\u0443\u043d\u043a\u0442\u044b 3-7, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u043b\u0438\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <i>CutPolygonByZoomedPixelZeroTile()<\/i>, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0436\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.  <\/p>\n<pre><code class=\"cs\">\/\/\/ &lt;summary&gt; \/\/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0441 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u043c \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430 \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;poly&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;X&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Y&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;param name=&quot;Z&quot;&gt;&lt;\/param&gt; \/\/\/ &lt;returns&gt;\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0441 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u043c \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430&lt;\/returns&gt; private List&lt;SqlGeometry&gt; CutPolygonByZoomedPixelZeroTile(SqlGeometry poly, int X, int Y, int Z) {   return CutZoomedPixelPolygonByZeroTile(_parser.ConvertToZoomedPixelZeroedByTileGeometry(poly,Z,X,Y); } <\/code><\/pre>\n<p>  \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <i>GeometryParser<\/i> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u00ab\u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435\u00bb \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043b\u044f \u0442\u0430\u0439\u043b\u0430 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 X, Y. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u044f\u044e\u0442\u0441\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438:<\/p>\n<pre><code class=\"cs\">\/\/\/ &lt;summary \/\/\/  \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438 \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0439  \u0442\u0430\u0439\u043b     \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;shape&quot;&gt;\u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0441 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u043c\u0438 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445&lt;\/param&gt; \/\/\/ &lt;param name=&quot;zoom&quot;&gt;\u043d\u043e\u043c\u0435\u0440 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;tileX&quot;&gt; \u0425 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;tileY&quot;&gt;Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;returns&gt;\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0442\u0430\u0439\u043b\u0435&lt;\/returns&gt; public SqlGeometry ConvertToZoomedPixelZeroedByTileGeometry(SqlGeometry shape,int zoom,          int tileX,int tileY) {   return CreateGeometryFromZoomedPixelInfo           (ConvertToGeometryZoomedPixelsZeroTileShiftedInfo( GetGeometryInfo(shape), zoom, tileX, tileY)); }  \/\/\/ &lt;summary \/\/\/  \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438 \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0439  \u0442\u0430\u0439\u043b     \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;info&quot;&gt;\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438&lt;\/param&gt; \/\/\/ &lt;param name=&quot;zoom&quot;&gt;\u043d\u043e\u043c\u0435\u0440 \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;x&quot;&gt; \u0425 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;param name=&quot;y&quot;&gt;Y \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u0430&lt;\/param&gt; \/\/\/ &lt;returns&gt;\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0442\u0430\u0439\u043b\u0435&lt;\/returns&gt; private GeometryZoomedPixelsInfo ConvertToGeometryZoomedPixelsZeroTileShiftedInfo (GeometryInstanceInfo info, int zoom, int x, int y) {   int tilezeroshiftX = x*TILE_SIZE;   int tilezeroshiftY = y*TILE_SIZE;   var result = new GeometryZoomedPixelsInfo();   var pixelCoordsListList = new List&lt;List&lt;GeometryPixelCoords&gt;&gt;();   var geomPixCoordsList = new List&lt;GeometryPixelCoords&gt;();   var coords = new GeometryPixelCoords {InnerRing = false};   OpenGisGeometryType type = info.ShapeType;   result.ShapeType = type;   switch (type)   {     case OpenGisGeometryType.Point:          PointF[] geopoints = info.Points[0][0].PointList;          coords.PixelCoordList = new[]            {new Point{X = _conv.FromLongitudeToXPixel(geopoints[0].X, zoom) - tilezeroshiftX,                       Y = _conv.FromLatitudeToYPixel(geopoints[0].Y, zoom) - tilezeroshiftY }            };          geomPixCoordsList.Add(coords);          pixelCoordsListList.Add(geomPixCoordsList);          break;     case OpenGisGeometryType.LineString:          coords.PixelCoordList =              GetPixelCoordsShifted(               info.Points[0][0].PointList,               zoom,               tilezeroshiftX,               tilezeroshiftY);          geomPixCoordsList.Add(coords);          pixelCoordsListList.Add(geomPixCoordsList);          break;     case OpenGisGeometryType.Polygon:          foreach (var list in info.Points)            foreach (GeometryPointSequence pointseq in list)            {              coords.PixelCoordList =                 GetPixelCoordsShifted(pointseq.PointList, zoom, tilezeroshiftX, tilezeroshiftY);                coords.InnerRing = pointseq.InnerRing;                geomPixCoordsList.Add(coords);            }          pixelCoordsListList.Add(geomPixCoordsList);          break;     case OpenGisGeometryType.MultiPoint:     case OpenGisGeometryType.MultiLineString:     case OpenGisGeometryType.MultiPolygon:          pixelCoordsListList =           GetGeometryPixelCoordsShifted(info.Points, zoom, tilezeroshiftX, tilezeroshiftY);          break;     case OpenGisGeometryType.GeometryCollection:          GeometryInstanceInfo[] geomColl = info.GeometryInstanceInfoCollection;          int n = info.GeometryInstanceInfoCollection.Length;          var geomPixZoomInfoCollection = new GeometryZoomedPixelsInfo[n];          for (int i = 0; i &lt; n; i++)          {              var geom = new GeometryZoomedPixelsInfo();              geom.ShapeType = geomColl[i].ShapeType;              geom.Points =               GetGeometryPixelCoordsShifted(geomColl[i].Points, zoom, tilezeroshiftX, tilezeroshiftY);              geomPixZoomInfoCollection[i] = geom;          }          result.GeometryInstanceInfoCollection = geomPixZoomInfoCollection;          break;     }     if (type != OpenGisGeometryType.GeometryCollection) result.Points = pixelCoordsListList;   return result; } <\/code><\/pre>\n<p>  \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <i>ShapeToTileRendering<\/i> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 <i>CutZoomedPixelPolygonByZeroTile()<\/i>. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u0440\u0435\u0437\u043a\u0443 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430. \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>poly<\/i> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"cs\"> private List&lt;SqlGeometry&gt; CutZoomedPixelPolygonByZeroTile(SqlGeometry poly, int X, int Y)         {             List&lt;SqlGeometry&gt; result = new List&lt;SqlGeometry&gt;();             SqlGeometry stroke = null;             SqlGeometry contour;             SqlGeometry tileLineString;             SqlGeometry tobecut;             SqlGeometry tile = _conv.GetTilePixelBound(0, 0, 1);             var tiled = poly.STIntersection(tile);             result.Add(tiled);             switch (GetOpenGisGeometryType(tiled))             {                 case OpenGisGeometryType.Polygon:                     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043e\u043b\u044c\u0446\u0430 \u0432 \u0432\u0438\u0434\u0435 MULTILINESTRING                     contour = PolygonToMultiLineString(tiled);                     \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u0441\u0440\u0435\u0437\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430                     tileLineString = tile.ToLineString();                     tobecut = contour.STIntersection(tileLineString);                     stroke = contour.STDifference(tobecut);                     break;                 case OpenGisGeometryType.MultiPolygon:                     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043e\u043b\u044c\u0446\u0430 \u0432 \u0432\u0438\u0434\u0435 MULTILINESTRING                     contour = MultiPolygonToMultiLineString(tiled);                     \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u0441\u0440\u0435\u0437\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u0430\u0439\u043b\u0430                     tileLineString = tile.ToLineString();                     tobecut = contour.STIntersection(tileLineString);                     stroke = contour.STDifference(tobecut);                     break;             }             result.Add(stroke);             return result;         } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443. \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <i>tile.FillShapeTiles<\/i> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>@GeoData<\/i> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>@FolderPath<\/i> \u043f\u0443\u0442\u0438. <br \/>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0411\u0414 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <br \/>  <i><\/p>\n<ul>\n<li><a href=\"#shape-tile-sql-function\">tile.ShapeTile();<\/a><\/li>\n<li>tile.SaveToFolderByZoomXY()<\/li>\n<\/ul>\n<p><\/i>.<br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <i>BitmapFunctions<\/i> SQL CLR \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <i>SqlBitmapOperation<\/i>:<br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <i>ShapeTile()<\/i> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 PNG \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0442\u0430\u0439\u043b\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0439 \u043d\u0430 \u0442\u0430\u0439\u043b \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 xTile, yTile:<br \/>  <a name=\"shape-tile-sql-function\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ShapeTile()<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">[SqlFunction]     public static SqlBinary ShapeTile(SqlGeometry shape, SqlInt32 zoom,  SqlInt32 xTile, SqlInt32 yTile, SqlString argbFill,SqlString argbStroke,SqlInt32 strokeWidth)     {         SqlBinary result = null;         using (ShapeToTileRendering paster = new ShapeToTileRendering())         {             using (MemoryStream ms = new MemoryStream())             {                 try                 {                     paster.DrawPartObjectShapeOnTile(shape, (int) xTile, (int) yTile, (int) zoom, argbFill.ToString(),                                                      argbStroke.ToString(), (int) strokeWidth);                     result = paster.GetBytes();                 }                 catch (System.Exception ex)                 {                     string innerMessage = ex.InnerException.Message;                     throw new Exception(string.Format(&quot;zoom: {1}; X:{2}; Y:{3} {0} , inner: {4}&quot;, shape, zoom, xTile,yTile, innerMessage));                 }                 return result;             }         }                 } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <i>SqlBitmapOperation<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <i>TileRendering<\/i>.<br \/>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 .NET TileRendering \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 .NET \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:  <\/p>\n<ul>\n<li>System<\/li>\n<li>Microsoft.SqlServer.Types<\/li>\n<li>System.Drawing<\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms345099.aspx\">msdn.microsoft.com\/en-us\/library\/ms345099.aspx<\/a><br \/>  \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a <i>SqlBitmapOperation<\/i> \u0438 <i>TileRendering <\/i>, \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE ASSEMBLY [Microsoft.SqlServer.Types] AUTHORIZATION [dbo] FROM 'd:\\SQLCLR\\BIN\\TileRendering\\Microsoft.SqlServer.Types.dll' WITH PERMISSION_SET = UNSAFE GO CREATE ASSEMBLY [System.Drawing] AUTHORIZATION [dbo] FROM 'd:\\SQLCLR\\BIN\\TileRendering\\ System.Drawing.dll' WITH PERMISSION_SET = UNSAFE GO CREATE ASSEMBLY [TileRendering] AUTHORIZATION [dbo] FROM 'd:\\SQLCLR\\BIN\\TileRendering\\TileRendering.dll' WITH PERMISSION_SET = UNSAFE GO CREATE ASSEMBLY nQuant.Core FROM 'd:\\SQLCLR\\BIN\\TileRendering\\ nQuant.Core.dll' WITH PERMISSION_SET = UNSAFE GO CREATE ASSEMBLY SqlBitmapOperation FROM 'd:\\SQLCLR\\BIN\\TileRendering\\SqlBitmapOperation.dll' WITH PERMISSION_SET = UNSAFE GO <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <i>SqlBitmapOperation<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/nquant.codeplex.com\/\">nQuant.Core<\/a> \u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0446\u0435\u043b\u044f\u0445. \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c PNG \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 8 \u0431\u0438\u0442 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u043b\u0438\u0442\u0440\u044b. <\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0438\u043f\u043e\u043c <i>SqlGeometry<\/i> \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <i>Microsoft.SqlServer.Types<\/i> \u0432 \u043d\u0430\u0448\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0442\u043e Microsoft.SqlServer.Types \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0411\u0414.<br \/>  <i>System.Drawing<\/i> \u2013 \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 GDI+ c \u043d\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 <i>EXTERNAL_ACCESS<\/i> \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0437 <i>Sytem.Drawing<\/i>. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0441\u0441\u0438\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 <i>EXTERNAL_ACCESS<\/i> \u0438\u043b\u0438 <i>UNSAFE<\/i> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 T-SQL \u0441\u043a\u0440\u0438\u043f\u0442:<br \/>  <a href=\"https:\/\/msdn.microsoft.com\/en-us\/ms131071\"><\/p>\n<pre><code class=\"sql\">ALTER DATABASE [dataBaseName] SET TRUSTWORTHY ON;  <\/code><\/pre>\n<p><\/a><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 CLR \u0441\u0431\u043e\u0440\u043e\u043a \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u0445:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE AGGREGATE [tile].[TileAgg] (@Value [varbinary](max)) RETURNS[varbinary](max) EXTERNAL NAME [SqlBitmapOperation].[TileAgg] GO    CREATE AGGREGATE [tile].[IconTileAgg] (@Value [varbinary](max), @PixelX [int], @PixelY [int]) RETURNS[varbinary](max) EXTERNAL NAME [SqlBitmapOperation].[IconTileAgg] GO CREATE FUNCTION [tile].[IconTile](@image [varbinary](max), @zoom [int], @Lon [float], @Lat [float], @xTile [int], @yTile [int], @scale [float]) RETURNS [varbinary](max) WITH EXECUTE AS CALLER AS  EXTERNAL NAME [SqlBitmapOperation].[BitmapFunctions].[IconTile] GO --ShapeTile(SqlGeometry shape, SqlInt32 zoom,  SqlInt32 xTile, SqlInt32 yTile, SqlString argbFill,SqlString argbStroke,SqlInt32 strokeWidth) CREATE FUNCTION [tile].[ShapeTile](@shape GEOMETRY, @zoom [int], @xTile [int], @yTile [int], @argbFill NVARCHAR(10),@argbStroke NVARCHAR(10), @strokeWidth INT) RETURNS [varbinary](max) WITH EXECUTE AS CALLER AS  EXTERNAL NAME [SqlBitmapOperation].[BitmapFunctions].[ShapeTile] GO --SaveToFolderByZoomXY(SqlBinary image, SqlString rootFolderPath, SqlInt32 Zoom, SqlInt32 X,SqlInt32 Y) CREATE FUNCTION tile.SaveToFolderByZoomXY(@image VARBINARY(MAX),@rootFolderPat NVARCHAR(512) , @Zoom [int], @xTile [int], @yTile [int]) RETURNS BIT WITH EXECUTE AS CALLER AS  EXTERNAL NAME [SqlBitmapOperation].[BitmapFunctions].[SaveToFolderByZoomXY] GO <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043b\u0430\u0441\u0441 <i>ShapeToTileRendering<\/i> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435. \u041f\u0435\u0440\u0435\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 4326 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u042d\u0442\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 GeometryParser, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0443\u0436\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 PSG3857, \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u0442\u0430\u0439\u043b\u0435.\u041c\u0435\u0442\u043e\u0434 <i>PastShapeOnTile<\/i> \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0443\u044e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>geom<\/i> \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u0439\u043b\u0430. \u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 256 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">     void PasteShapeOnTile(Color fillcolor,Color strokecolor, int width, List&lt;SqlGeometry&gt; geom)         {                        SqlGeometry shape = geom[0];             int geomnum = (int)shape.STNumGeometries();                        SqlGeometry stroke = null;                        SqlGeometry ring;             int intnum;           if  (geom != null)             switch (GetOpenGisGeometryType(shape))             {                 case OpenGisGeometryType.LineString:                 case OpenGisGeometryType.MultiLineString:                     DrawMultiLineStringBordered2(shape, fillcolor, strokecolor, width, 1);                     break;                 case OpenGisGeometryType.Polygon:                                         intnum = (int)shape.STNumInteriorRing();                                        ring = shape.STExteriorRing();                         \/\/ 1. \u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u0431\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043b\u0435\u0446                         FillPolygonOnTile(fillcolor, ring.ToPointsArray());                         \/\/ 2. \u0440\u0438\u0441\u0443\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043e\u043b\u044c\u0446\u0430                         if (geomnum &gt;= 1) stroke = geom[1];                           for (int i = 1; i &lt;= intnum; i++)                         {                             FillTransparentPolygonOnTile(shape.STInteriorRingN(i).ToPointsArray());                         }                         \/\/ 3. \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440                         if (geom.Count &gt; 1)                         {                             stroke = geom[1];                             DrawContourOnTile(stroke, strokecolor, width);                         }                         break;                 case OpenGisGeometryType.MultiPolygon: break;             }                             } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <i>tile.FillShapeTiles<\/i> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0425\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 tile.FillShapeTiles<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE PROC tile.FillShapeTiles  @GeoData GEOMETRY, @fillArgb VARCHAR(20),@strokeArgb VARCHAR(20), @FolderPath NVARCHAR(20), @EndZoom INT = 17, @StartZoom INT = 4, @Thickness INT = 2 AS BEGIN IF @EndZoom &lt; @StartZoom OR @GeoData IS NULL RETURN   INSERT INTO tile.tile (Zoom, X,Y,Data)   SELECT t.Zoom, t.TileX AS X,t.TileY AS Y, tile.ShapeTile(@GeoData, t.Zoom, t.TileX, t.TileY, @fillArgb, @strokeArgb ,@Thickness) AS Data\t\t\t\t\t\t   FROM (SELECT * FROM  tile.fn_FetchGeometryTilesZoomDepth(@GeoData,@StartZoom, @EndZoom - @StartZoom)) t\t\t\t\t\t\t\t\t\t\t\t   SELECT tile.SaveToFolderByZoomXY   (Data, @FolderPath\t,Zoom,X,Y) FROM\ttile.Tile\t\t END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0431\u043e\u043b\u0435\u0435 100 000 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u0439\u043b \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u041e\u0442\u0434\u0430\u0434\u0438\u043c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CLR \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u0433\u0440\u0435\u0433\u0430\u0442. <\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <i>tile.FillShapeTilesIntersection()<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u044e <i>tile.ShapeTile()<\/i> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 .PNG \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u0442\u0430\u0439\u043b\u0430 \u0438 \u0441\u0442\u0438\u043b\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u0442\u043e\u0439 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CLR \u0430\u0433\u0440\u0435\u0433\u0430\u0442 <i>tile.TileAgg(@Data VARBINARY(MAX))<\/i>, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0442\u0430\u0439\u043b\u0430 \u0432 .PNG \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0442\u0430\u0439\u043b\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u044f\u0445 \u0442\u0438\u043f\u0430 VABINARY(MAX).<br \/>  \u0412 \u043b\u044e\u0431\u043e\u0439 CLR \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<br \/>  <i><\/p>\n<ul>\n<li>Init();<\/li>\n<li>Accumulate(value);<\/li>\n<li>Merge(Agg);<\/li>\n<li>Terminate()<\/li>\n<\/ul>\n<p><\/i>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f SQL CLR \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/------------------------------------------------------------------------------ \/\/ &lt;copyright file=&quot;CSSqlAggregate.cs&quot; company=&quot;Microsoft&quot;&gt; \/\/     Copyright (c) Microsoft Corporation.  All rights reserved. \/\/ &lt;\/copyright&gt; \/\/------------------------------------------------------------------------------ using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using TileRendering; using System.IO; using System.Drawing; using System.Drawing.Imaging;    [Serializable] [SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToDuplicates = true, IsInvariantToNulls = true, IsInvariantToOrder = false, IsNullIfEmpty = false, MaxByteSize = -1)] public struct TileAgg : IBinarySerialize {      Bitmap _bitmap;     ImageFormat _format;     Graphics _graphics;     ImageCodecInfo _codecInfo;     const int TILE_SIZE = 256;     Bitmap GetInitialTile()     {          Bitmap DrawArea = new Bitmap(TILE_SIZE, TILE_SIZE);          using (Graphics xGraph = Graphics.FromImage(DrawArea))         {             xGraph.FillRectangle(Brushes.Transparent, 0, 0, TILE_SIZE, TILE_SIZE);             _graphics = Graphics.FromImage(DrawArea);             return DrawArea;         }     }        #region [Aggregate artifacts]         public void Init()     {         _codecInfo = GetEncoderInfo(&quot;image\/png&quot;);         _bitmap = GetInitialTile();         DetectFormat();     }       public void Accumulate(SqlBinary Value)     {          using (MemoryStream ms = new MemoryStream())         {             ms.Write(Value.Value, 0, Value.Length);             ms.Seek(0, SeekOrigin.Begin);             ms.Position = 0;                       PasteFromStreamImageToTile( ms);         }     }        public void Merge(TileAgg Group)     {         PasteGroup(Group.Terminate());     }       public SqlBinary Terminate()     {         return GetBytes();     }   #endregion [Aggregate artifacts]       void PasteFromStreamImageToTile( Stream stream)     {         using (Bitmap iconImage = new Bitmap(stream, false))         {             DetectFormat();             int width = iconImage.Width;             int height = iconImage.Height;             var area = new Rectangle(0, 0, width, height);             CopyRegionIntoImage(iconImage,area, area);         }     }        void CopyRegionIntoImage(Bitmap srcBitmap, Rectangle srcRegion, Rectangle destRegion)     {         _graphics.DrawImage(srcBitmap, destRegion, srcRegion, GraphicsUnit.Pixel);         srcBitmap.Dispose();     }        void PasteGroup(SqlBinary Value)     {         using (MemoryStream ms = new MemoryStream())         {             ms.Write(Value.Value, 0, Value.Length);             ms.Seek(0, SeekOrigin.Begin);             ms.Position = 0;             PasteTile(ms);         }     }       void PasteTile(Stream stream)     {         Rectangle bounds = new Rectangle(0, 0, TILE_SIZE, TILE_SIZE);         CopyRegionIntoImage(new Bitmap(stream), bounds, bounds);     }       byte[] GetBytes()     {         return _bitmap.ToByteArray(ImageFormat.Png);     }       #region [IBinarySerialize]     public void Read(BinaryReader reader)     {         _bitmap = new Bitmap(new MemoryStream(reader.ReadBytes((int)reader.BaseStream.Length)));         DetectFormat();     }       public void Write(BinaryWriter writer)     {         EncoderParameters encodeParams = new EncoderParameters(1);         encodeParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100);         _bitmap.Save(writer.BaseStream, _codecInfo, encodeParams);     }     #endregion [IBinarySerialize]       \/\/\/ &lt;summary&gt;     \/\/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0437\u0430     \/\/\/ &lt;\/summary&gt;     void DetectFormat()     {         _format = _bitmap.GetImageFormat();     }        ImageCodecInfo GetEncoderInfo(string mimeType)     {         \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043f\u043e\u0438\u0441\u043a         string lookupKey = mimeType.ToLower();          ImageCodecInfo foundCodec = null;         Dictionary&lt;string, ImageCodecInfo&gt; encoders = Encoders();          if (encoders.ContainsKey(lookupKey))         {             \/\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0434\u0435\u043a \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430             foundCodec = encoders[lookupKey];         }          return foundCodec;     }       private Dictionary&lt;string, ImageCodecInfo&gt; Encoders()     {         Dictionary&lt;string, ImageCodecInfo&gt; encoders = new Dictionary&lt;string, ImageCodecInfo&gt;();                      foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())         {                         encoders.Add(codec.MimeType.ToLower(), codec);         }         return encoders;      } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>   \u0425\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <a href=\"#forming-tiles-for-set-of-objects\"><i>tile.FillShapeTilesIntersection<\/i><\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b tile.Shape. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435  @StartZoom \u2013 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431,  @EndZoom \u2014 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431. \u0412 \u043f\u043e\u043b\u044f\u0445 <i>tile.Shapes.fillArgb<\/i> \u0438 <i>tile.Shapes.strokeArgb<\/i> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0446\u0432\u0435\u0442 \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0438 \u0446\u0432\u0435\u0442 \u043a\u043e\u043d\u0442\u0443\u0440\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442: <i>AARRGGBB<\/i>,<br \/>  \u0433\u0434\u0435 AA \u2013 \u0430\u043b\u044c\u0444\u0430 \u043a\u0430\u043d\u0430\u043b (\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c), RR \u2013 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, GG \u2014 \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043b\u043d\u0435\u043d\u0442, BB \u2013 \u0441\u0438\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: DDDDFFDD. <br \/>  <a name=\"forming-tiles-for-set-of-objects\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE PROC tile.FillShapeTilesIntersection( @StartZoom INT, @EndZoom INT) AS BEGIN DECLARE @Shape GEOMETRY    DECLARE @CurrentZoom INT DECLARE @ObjectTypeID INT DECLARE @fillArgb NVARCHAR(10), @strokeArgb NVARCHAR(10)             IF @ObjectTypeID IS NOT NULL BEGIN           SET @CurrentZoom = @StartZoom                                           DECLARE shape_cursor CURSOR FOR    SELECT o.Shape, fillARGB, strokeARGB   FROM tile.Shape o                                                      OPEN shape_cursor     FETCH NEXT FROM shape_cursor INTO @Shape, @fillArgb, @strokeArgb                                           WHILE @@FETCH_STATUS = 0   BEGIN     SET @CurrentZoom = @StartZoom     WHILE @CurrentZoom  &lt;= @EndZoom     BEGIN       INSERT INTO tile.tileOverlap (Zoom, X,Y,Data)       SELECT t.Zoom, t.TileX AS X,t.TileY AS Y,               tile.ShapeTile(@Shape, t.Zoom, t.TileX, t.TileY, @fillArgb, @strokeArgb ,2) AS Data       FROM (SELECT * FROM  tile.fn_FetchGeometryTiles(@Shape,@CurrentZoom)) t                                        SET @CurrentZoom = @CurrentZoom + 1     END                                   FETCH NEXT FROM shape_cursor INTO @Shape, @fillArgb, @strokeArgb    END   CLOSE shape_cursor;   DEALLOCATE shape_cursor;                        DELETE tile.TileOverlap   END END <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <a name=\"conclusion\"><\/a>  <\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u041f\u043e\u0434\u0432\u043e\u0434\u044f \u0438\u0442\u043e\u0433, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u043c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432. \u041d\u043e \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0442\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 SQL Server.<br \/>  <a href=\"https:\/\/github.com\/Den367\/TileRendering\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/410\/7bb\/30e\/4107bb30ec3048f3ae5ebfba66665b41.png\"\/>&nbsp;\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 github<\/a><\/p>\n<p>  <a href=\"https:\/\/drive.google.com\/uc?export=download&amp;id=0BzNljve6KtsmZFp1OXMzUzJzQ3c\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0431\u044d\u043a\u0430\u043f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 3.5\u041c\u0431<\/a>               <\/p>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/266363\/\"> http:\/\/habrahabr.ru\/post\/266363\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0445\u0430\u0431\u0440\u0430-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f CLR \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <i>Microsoft.SqlServer.Types<\/i> \u043c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c \u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0438\u0445 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0411\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 MS SQL 2008. \u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/6a3\/a68\/6e2\/6a3a686e21ca4a818baa1248891b6e6c.png\"\/>  <\/p>\n<h4>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 <\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  <a href=\"#problem\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/a><br \/>  <a href=\"#source-data\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/a><br \/>  <a href=\"#solution\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/a><br \/>  <a href=\"#tile-storage\">\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#steps-to-prepare-tiles\">\u042d\u0442\u0430\u043f\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#functions-to-be-used\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a><br \/>  <a href=\"#polyline-example\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439<\/a><br \/>  <a href=\"#intersection-detection\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f<\/a><br \/>  <a href=\"#tables-to-store-tile-images\">\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#tile-positioning\">\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/a><br \/>  <a href=\"#tile-combining\">\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432<\/a><br \/>  <a href=\"#draw-geometry-on-a-tile\">\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0442\u0430\u0439\u043b\u0435<\/a><br \/>  <a href=\"#conclusion\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><br \/>  <habracut\/><br \/>  <a name=\"problem\"><\/a>  <\/p>\n<h4>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h4>\n<p>  <\/p>\n<hr\/>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SVG \u0438\u043b\u0438 CANVAS), \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443, \u043d\u043e \u0438 \u043f\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e. <br \/>  \u041f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u043a\u043e\u043d\u043e\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434.<br \/>  <br clear=\"all\"\/>     <\/p>\n<h4>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/h4>\n<p><a name=\"source-data\"><\/a>  <\/p>\n<hr\/>\n<p>  \u041d\u0430\u0431\u043e\u0440 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Microsoft SQL 2008. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0437\u043b\u043e\u0432 \u2013 \u044d\u0442\u043e \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 (EPSG:4326). \u041f\u043e\u043b\u0435 \u0441 \u0433\u0435\u043e-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <i>GEOMETRY<\/i>. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0438\u043a\u043e\u043d\u043a\u0438, \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 <i>Point<\/i>. \u0412 \u0432\u0438\u0434\u0435 \u043b\u043e\u043c\u0430\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u0434\u043b\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 <i>Polyline<\/i>. \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f Polygon \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u043c. \u0422\u0430\u0439\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 <a href=\"http:\/\/spatialreference.org\/ref\/sr-org\/7483\/\">Web Mercator<\/a><\/p>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/h4>\n<p><a name=\"solution\"><\/a>  <\/p>\n<hr\/>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u0430\u0439\u043b\u0430\u043c\u0438) \u043a\u0430\u043a \u0438 \u0441\u0430\u043c\u0430 \u043a\u0430\u0440\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e <i>Google Web Mercator<\/i>, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0438\u0440\u043e\u0442\u044b \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0430 google, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e <a href=\"http:\/\/code.google.com\/p\/geographical-dot-net\/source\/browse\/trunk\/GeographicalDotNet\/GeographicalDotNet\/Projection\/GoogleMapsAPIProjection.cs\">\u041c\u0435\u0440\u043a\u0430\u0442\u043e\u0440\u0430<\/a>:<br \/>   \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/239251\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. <br \/>  \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 Sql Server 2008, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 <i>GEOMETRY<\/i> \u0438 <i>GEOGRAPHY<\/i>. <br \/>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0442 Yandex, Google \u0438\u043b\u0438 OpenStreetMap \u043a\u0430\u0440\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 PNG \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043e\u0431\u044b\u0447\u043d\u043e 256&#215;256 \u0442\u043e\u0447\u0435\u043a. \u0425\u043e\u0442\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0433\u0434\u0435 \u0442\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043a\u0430\u043a SVG \u0438\u043b\u0438 CANVAS. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 PNG (picture network graphic). PNG \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c (\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043b\u044c\u0444\u0430 \u043a\u0430\u043d\u0430\u043b\u0435), \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0431\u0435\u0437 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0438\u044f, \u043f\u0440\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043b\u043e\u0451\u0432.<\/p>\n<h4>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0442\u0430\u0439\u043b\u043e\u0432 <\/h4>\n<p><a name=\"tile-storage\"><\/a>  <\/p>\n<hr\/>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u0439\u043b\u043e\u0432. \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 0-\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u2013 1 \u0442\u0430\u0439\u043b:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/68a\/598\/90d\/68a59890d1768a5786cfc0a18fa34555.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 1-\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0430\u0439\u043b\u0430 2 * 2:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/a19\/298\/036\/a192980365ba4a999d4260035d96d4ed.jpg\"\/><br \/>   \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 n \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f 2n * 2n \u0442\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0439\u043b\u043e\u0432 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-265835","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/265835","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=265835"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/265835\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=265835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=265835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=265835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}