feat: новая архитектура UI и расширенная визуализация AIS

Архитектурные улучшения:
- Внедрен UIRenderingCoordinator с централизованным throttling
- Решены проблемы зависания UI через батчинг операций карты
- Добавлен VesselPathController для отслеживания маршрутов
- Реализован MapLibreMapImpl как альтернатива Яндекс.Картам

Визуализация AIS:
- Добавлены векторные иконки для всех типов судов
- Разделение Class A/B судов с соответствующими иконками
- Иконки навигационных статусов (anchor, moored, engine, sail)
- Улучшенный CursorOverlay с информацией о судах

Производительность:
- Throttling UI обновлений (vessel: 500ms, AIS: 1s, paths: 2s)
- Устранение утечек Handler объектов
- Оптимизация GeoJSON операций в MapLibre
This commit is contained in:
2025-10-02 09:15:33 +03:00
parent 41432665ea
commit b5aee265bc
85 changed files with 7132 additions and 449 deletions
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.24 62.18">
<defs>
<style>
.cls-1 {
stroke-width: 4px;
}
.cls-1, .cls-2 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
}
.cls-2 {
stroke-width: 4px;
}
</style>
</defs>
<g id="_Слой_9" data-name="Слой_9">
<circle class="cls-2" cx="30.66" cy="31.22" r="6"/>
<g>
<path class="cls-2" d="M27.25,41.64l-9.4,7.49c-2.27,1.81-5.4,2.07-7.94.66l-1.42-.78c-2.91-1.61-2.83-5.83.15-7.32l7.01-3.52,11.59,3.47Z"/>
<path class="cls-2" d="M19.94,31.19l-10.03-6.62c-2.42-1.6-3.64-4.5-3.08-7.34l.31-1.59c.63-3.27,4.67-4.49,7.01-2.12l5.51,5.58.28,12.1Z"/>
<path class="cls-2" d="M27.61,21l3.2-11.58c.77-2.79,3.15-4.85,6.03-5.2l1.61-.2c3.3-.41,5.71,3.05,4.18,6.01l-3.6,6.97-11.42,4.01Z"/>
<path class="cls-2" d="M39.68,25.15l12.01-.54c2.9-.13,5.59,1.5,6.81,4.13l.68,1.47c1.41,3.02-1.14,6.37-4.42,5.83l-7.74-1.27-7.34-9.62Z"/>
<path class="cls-2" d="M39.46,37.91l4.22,11.25c1.02,2.71.3,5.78-1.82,7.75l-1.18,1.1c-2.43,2.27-6.41.89-6.92-2.4l-1.18-7.75,6.88-9.95Z"/>
</g>
<g>
<g id="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M57.93,41.9l-2.71,4.16s3.31-2.54,2.71-4.16Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-2" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M29.15,59.9l-4.8-1.29s3.44,2.36,4.8,1.29Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-3" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M3.13,38.09l-.25-4.96s-1.19,4,.25,4.96Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-4" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M15.84,6.6l4.64-1.77s-4.17.11-4.64,1.77Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-5" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M49.71,8.96l3.12,3.87s-1.39-3.93-3.12-3.87Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 37.67 44.99">
<defs>
<style>
.cls-1 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 2px;
}
</style>
</defs>
<g id="_Слой_11" data-name="Слой_11">
<path class="cls-1" d="M6.71,43.99V8.86H2.32l6.3-6.67c.7-.74,1.66-1.16,2.68-1.16l14.07-.04c1.5,0,2.93.6,3.97,1.68l5.97,6.18h-4.6l1,35.13H6.71Z"/>
<line class="cls-1" x1="4.21" y1="16.49" x2="33.21" y2="20.49"/>
<line class="cls-1" x1="4.21" y1="20.49" x2="33.21" y2="24.12"/>
<line class="cls-1" x1="4.21" y1="24.12" x2="33.21" y2="27.84"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 731 B

+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.24 62.18">
<defs>
<style>
.cls-1 {
stroke-width: 4px;
}
.cls-1, .cls-2 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
}
.cls-2 {
stroke-width: 4px;
}
</style>
</defs>
<g id="_Слой_9" data-name="Слой_9">
<circle class="cls-2" cx="30.66" cy="31.22" r="6"/>
<g>
<path class="cls-2" d="M27.25,41.64l-9.4,7.49c-2.27,1.81-5.4,2.07-7.94.66l-1.42-.78c-2.91-1.61-2.83-5.83.15-7.32l7.01-3.52,11.59,3.47Z"/>
<path class="cls-2" d="M19.94,31.19l-10.03-6.62c-2.42-1.6-3.64-4.5-3.08-7.34l.31-1.59c.63-3.27,4.67-4.49,7.01-2.12l5.51,5.58.28,12.1Z"/>
<path class="cls-2" d="M27.61,21l3.2-11.58c.77-2.79,3.15-4.85,6.03-5.2l1.61-.2c3.3-.41,5.71,3.05,4.18,6.01l-3.6,6.97-11.42,4.01Z"/>
<path class="cls-2" d="M39.68,25.15l12.01-.54c2.9-.13,5.59,1.5,6.81,4.13l.68,1.47c1.41,3.02-1.14,6.37-4.42,5.83l-7.74-1.27-7.34-9.62Z"/>
<path class="cls-2" d="M39.46,37.91l4.22,11.25c1.02,2.71.3,5.78-1.82,7.75l-1.18,1.1c-2.43,2.27-6.41.89-6.92-2.4l-1.18-7.75,6.88-9.95Z"/>
</g>
<g>
<g id="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M57.93,41.9l-2.71,4.16s3.31-2.54,2.71-4.16Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-2" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M29.15,59.9l-4.8-1.29s3.44,2.36,4.8,1.29Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-3" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M3.13,38.09l-.25-4.96s-1.19,4,.25,4.96Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-4" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M15.84,6.6l4.64-1.77s-4.17.11-4.64,1.77Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-5" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M49.71,8.96l3.12,3.87s-1.39-3.93-3.12-3.87Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 37.67 44.99">
<defs>
<style>
.cls-1 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 2px;
}
</style>
</defs>
<g id="_Слой_11" data-name="Слой_11">
<path class="cls-1" d="M6.71,43.99V8.86H2.32l6.3-6.67c.7-.74,1.66-1.16,2.68-1.16l14.07-.04c1.5,0,2.93.6,3.97,1.68l5.97,6.18h-4.6l1,35.13H6.71Z"/>
<line class="cls-1" x1="4.21" y1="16.49" x2="33.21" y2="20.49"/>
<line class="cls-1" x1="4.21" y1="20.49" x2="33.21" y2="24.12"/>
<line class="cls-1" x1="4.21" y1="24.12" x2="33.21" y2="27.84"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 731 B

+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.13 77.5">
<defs>
<style>
.cls-1 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 7px;
}
</style>
</defs>
<g id="_Слой_8" data-name="Слой_8">
<circle class="cls-1" cx="31.09" cy="13" r="9.5"/>
<path class="cls-1" d="M3.09,45.5l4.79,9.05c14.4,27.2,34.78,25.73,48.48-3.49l2.6-5.56"/>
<line class="cls-1" x1="31.09" y1="22.5" x2="31.09" y2="71"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 585 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 236 236">
<defs>
<style>
.cls-1 {
fill: #666;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 3px;
}
</style>
</defs>
<g id="_Слой_22" data-name="Слой_22">
<path class="cls-1" d="M226.29,89.5h-19.67c-7.31,0-10.97-8.84-5.8-14.01l13.91-13.91c3.21-3.21,3.21-8.4,0-11.61l-28.7-28.7c-3.21-3.21-8.4-3.21-11.61,0l-13.91,13.91c-5.17,5.17-14.01,1.51-14.01-5.8V9.71c0-4.53-3.67-8.21-8.21-8.21h-40.58c-4.53,0-8.21,3.67-8.21,8.21v19.67c0,7.31-8.84,10.97-14.01,5.8l-13.91-13.91c-3.21-3.21-8.4-3.21-11.61,0l-28.7,28.7c-3.21,3.21-3.21,8.4,0,11.61l13.91,13.91c5.17,5.17,1.51,14.01-5.8,14.01H9.71c-4.53,0-8.21,3.67-8.21,8.21v40.58c0,4.53,3.67,8.21,8.21,8.21h19.67c7.31,0,10.97,8.84,5.8,14.01l-13.91,13.91c-3.21,3.21-3.21,8.4,0,11.61l28.7,28.7c3.21,3.21,8.4,3.21,11.61,0l13.91-13.91c5.17-5.17,14.01-1.51,14.01,5.8v19.67c0,4.53,3.67,8.21,8.21,8.21h40.58c4.53,0,8.21-3.67,8.21-8.21v-19.67c0-7.31,8.84-10.97,14.01-5.8l13.91,13.91c3.21,3.21,8.4,3.21,11.61,0l28.7-28.7c3.21-3.21,3.21-8.4,0-11.61l-13.91-13.91c-5.17-5.17-1.51-14.01,5.8-14.01h19.67c4.53,0,8.21-3.67,8.21-8.21v-40.58c0-4.53-3.67-8.21-8.21-8.21ZM118.5,158.5c-22.09,0-40-17.91-40-40s17.91-40,40-40,40,17.91,40,40-17.91,40-40,40Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+60
View File
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 137.43 137.43">
<defs>
<style>
.cls-1 {
fill: none;
stroke: #000;
stroke-miterlimit: 10;
}
</style>
</defs>
<g id="_Слой_16" data-name="Слой_16">
<circle class="cls-1" cx="69.22" cy="68.97" r="15.5"/>
<g>
<g id="_x3C_Радиальное_повторение_x3E_">
<g>
<polygon points="50.01 71.14 44.01 70.86 43.99 66.46 49.99 66.14 50.01 71.14"/>
<polygon points="31.34 70.27 18.67 69.68 18.66 67.82 31.33 67.14 31.34 70.27"/>
<polygon points="6 69.09 0 68.82 6 68.49 6 69.09"/>
</g>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-2" data-name="_x3C_Радиальное_повторение_x3E_">
<g>
<polygon points="66.29 50.01 66.57 44.01 70.97 43.99 71.29 49.99 66.29 50.01"/>
<polygon points="67.16 31.34 67.75 18.67 69.62 18.66 70.3 31.33 67.16 31.34"/>
<polygon points="68.34 6 68.62 0 68.94 6 68.34 6"/>
</g>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-3" data-name="_x3C_Радиальное_повторение_x3E_">
<g>
<polygon points="87.43 66.29 93.43 66.57 93.44 70.97 87.44 71.29 87.43 66.29"/>
<polygon points="106.1 67.16 118.76 67.75 118.77 69.62 106.11 70.3 106.1 67.16"/>
<polygon points="131.43 68.34 137.43 68.62 131.44 68.94 131.43 68.34"/>
</g>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-4" data-name="_x3C_Радиальное_повторение_x3E_">
<g>
<polygon points="71.14 87.43 70.86 93.43 66.46 93.44 66.14 87.44 71.14 87.43"/>
<polygon points="70.27 106.1 69.68 118.76 67.82 118.77 67.14 106.11 70.27 106.1"/>
<polygon points="69.09 131.43 68.82 137.43 68.49 131.44 69.09 131.43"/>
</g>
</g>
</g>
<path d="M69.26,70.79c1.93,0,1.93-3,0-3s-1.93,3,0,3h0Z"/>
<g>
<g id="_x3C_Радиальное_повторение_x3E_-5" data-name="_x3C_Радиальное_повторение_x3E_">
<path d="M80.01,134.2c-.42-4.29-.71-8.58-1.01-12.86.01-6.42,0-19.31,0-25.73,0,0,0-3.22,0-3.22v-1.61c-.03-2.95,1.19-5.88,3.31-7.94,1.69-1.64,3.92-2.74,6.27-3.02,2.05-.21,4.54-.04,6.55-.09,0,0,12.86,0,12.86,0h12.86c4.29.34,8.58.59,12.86,1-4.29.41-8.58.66-12.86,1-6.42,0-19.31,0-25.73,0-1.77.05-4.64-.1-6.3.08-1.92.23-3.73,1.12-5.12,2.47-1.74,1.7-2.72,4.08-2.7,6.51,0,0,0,1.61,0,1.61,0,0,0,3.22,0,3.22,0,6.41,0,19.32,0,25.73-.29,4.29-.59,8.58-1.01,12.86h0Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-6" data-name="_x3C_Радиальное_повторение_x3E_">
<path d="M4.26,79.75c4.29-.42,8.58-.71,12.86-1.01,6.42.01,19.31,0,25.73,0,0,0,3.22,0,3.22,0h1.61c2.95-.03,5.88,1.19,7.94,3.31,1.64,1.69,2.74,3.92,3.02,6.27.21,2.05.04,4.54.09,6.55,0,0,0,12.86,0,12.86v12.86c-.34,4.29-.59,8.58-1,12.86-.41-4.29-.66-8.58-1-12.86,0-6.42,0-19.31,0-25.73-.05-1.77.1-4.64-.08-6.3-.23-1.92-1.12-3.73-2.47-5.12-1.7-1.74-4.08-2.72-6.51-2.7,0,0-1.61,0-1.61,0,0,0-3.22,0-3.22,0-6.41,0-19.32,0-25.73,0-4.29-.29-8.58-.59-12.86-1.01h0Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-7" data-name="_x3C_Радиальное_повторение_x3E_">
<path d="M58.72,4c.42,4.29.71,8.58,1.01,12.86-.01,6.42,0,19.31,0,25.73,0,0,0,3.22,0,3.22v1.61c.03,2.95-1.19,5.88-3.31,7.94-1.69,1.64-3.92,2.74-6.27,3.02-2.05.21-4.54.04-6.55.09,0,0-12.86,0-12.86,0h-12.86c-4.29-.34-8.58-.59-12.86-1,4.29-.41,8.58-.66,12.86-1,6.42,0,19.31,0,25.73,0,1.77-.05,4.64.1,6.3-.08,1.92-.23,3.73-1.12,5.12-2.47,1.74-1.7,2.72-4.08,2.7-6.51,0,0,0-1.61,0-1.61,0,0,0-3.22,0-3.22,0-6.41,0-19.32,0-25.73.29-4.29.59-8.58,1.01-12.86h0Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-8" data-name="_x3C_Радиальное_повторение_x3E_">
<path d="M134.46,58.46c-4.29.42-8.58.71-12.86,1.01-6.42-.01-19.31,0-25.73,0,0,0-3.22,0-3.22,0h-1.61c-2.95.03-5.88-1.19-7.94-3.31-1.64-1.69-2.74-3.92-3.02-6.27-.21-2.05-.04-4.54-.09-6.55,0,0,0-12.86,0-12.86v-12.86c.34-4.29.59-8.58,1-12.86.41,4.29.66,8.58,1,12.86,0,6.42,0,19.31,0,25.73.05,1.77-.1,4.64.08,6.3.23,1.92,1.12,3.73,2.47,5.12,1.7,1.74,4.08,2.72,6.51,2.7,0,0,1.61,0,1.61,0,0,0,3.22,0,3.22,0,6.41,0,19.32,0,25.73,0,4.29.29,8.58.59,12.86,1.01h0Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45.83 62.87">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<g id="_Слой_10" data-name="Слой_10">
<g>
<path class="cls-1" d="M41.75,62.87V4.78l-3.87,2.32-6.48,3.89c-9.59,5.76-17.51,13.94-22.94,23.72l-6.71,12.07"/>
<path d="M41.56,62.87c0-16.54.05-34.31-.59-50.83-.1-2.42-.17-4.84-1.23-7.26,0,0,3.03,1.71,3.03,1.71-3.66,2.26-9.09,5.36-12.6,7.63-7.99,5.26-14.73,12.41-19.49,20.71,0,0-7.19,12.91-7.19,12.91,0,0-3.5-1.94-3.5-1.94,0,0,7.22-12.97,7.22-12.97,5.07-8.83,12.25-16.45,20.75-22.05,5.53-3.51,12.26-7.38,17.85-10.79,0,0-2.08,4.78-2.08,4.78-1.8,4.72-1.15,9.64-1.49,14.52-.19,8.41-.24,20.51-.33,29.04-.02,4.84-.03,9.68.01,14.52h-.37Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 859 B

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45.83 65.94">
<defs>
<style>
.cls-1, .cls-2 {
fill: #fff;
}
.cls-2 {
stroke: #000;
stroke-miterlimit: 10;
stroke-width: .5px;
}
</style>
</defs>
<g id="_Слой_10" data-name="Слой_10">
<g>
<path class="cls-1" d="M41.75,62.87V4.78l-3.87,2.32-6.48,3.89c-9.59,5.76-17.51,13.94-22.94,23.72l-6.71,12.07"/>
<path d="M41.56,62.87c0-16.54.05-34.31-.59-50.83-.1-2.42-.17-4.84-1.23-7.26,0,0,3.03,1.71,3.03,1.71-3.66,2.26-9.09,5.36-12.6,7.63-7.99,5.26-14.73,12.41-19.49,20.71,0,0-7.19,12.91-7.19,12.91,0,0-3.5-1.94-3.5-1.94,0,0,7.22-12.97,7.22-12.97,5.07-8.83,12.25-16.45,20.75-22.05,5.53-3.51,12.26-7.38,17.85-10.79,0,0-2.08,4.78-2.08,4.78-1.8,4.72-1.15,9.64-1.49,14.52-.19,8.41-.24,20.51-.33,29.04-.02,4.84-.03,9.68.01,14.52h-.37Z"/>
</g>
<circle class="cls-2" cx="41.47" cy="62.28" r="1"/>
<path class="cls-2" d="M41.47,63.28v1.8h0c-.51.74-1.58.81-2.18.14l-.27-.31"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50.57 51.98">
<defs>
<style>
.cls-1, .cls-2 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
}
.cls-2 {
stroke-width: 2px;
}
</style>
</defs>
<g id="_Слой_12" data-name="Слой_12">
<polyline class="cls-2" points="21.49 2.23 21.49 22.58 21.79 51.97"/>
<line class="cls-2" x1=".79" y1="41.97" x2="50.57" y2="41.97"/>
<polygon class="cls-1" points="25.68 2.23 25.68 38.03 48.81 38.03 25.68 2.23"/>
<polygon class="cls-1" points="17.7 2.23 17.7 38.03 .79 38.03 17.7 2.23"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 711 B

+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.13 77.5">
<defs>
<style>
.cls-1 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 7px;
}
</style>
</defs>
<g id="_Слой_8" data-name="Слой_8">
<circle class="cls-1" cx="31.09" cy="13" r="9.5"/>
<path class="cls-1" d="M3.09,45.5l4.79,9.05c14.4,27.2,34.78,25.73,48.48-3.49l2.6-5.56"/>
<line class="cls-1" x1="31.09" y1="22.5" x2="31.09" y2="71"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 585 B

+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 62.13 77.5">
<defs>
<style>
.cls-1 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 7px;
}
</style>
</defs>
<g id="_Слой_8" data-name="Слой_8">
<circle class="cls-1" cx="31.09" cy="13" r="9.5"/>
<path class="cls-1" d="M3.09,45.5l4.79,9.05c14.4,27.2,34.78,25.73,48.48-3.49l2.6-5.56"/>
<line class="cls-1" x1="31.09" y1="22.5" x2="31.09" y2="71"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 585 B

+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 129 129">
<defs>
<style>
.cls-1 {
fill: none;
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 2px;
}
</style>
</defs>
<g id="_Слой_15" data-name="Слой_15">
<g>
<g id="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M62.39,72.13L12.02,122.94c-1.86,1.87-.53,5.06,2.11,5.06h100.75c2.64,0,3.97-3.19,2.11-5.06l-50.38-50.81c-1.16-1.17-3.06-1.17-4.22,0Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-2" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M56.87,62.39L6.06,12.02c-1.87-1.86-5.06-.53-5.06,2.11v100.75c0,2.64,3.19,3.97,5.06,2.11l50.81-50.38c1.17-1.16,1.17-3.06,0-4.22Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-3" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M66.61,56.87L116.98,6.06c1.86-1.87.53-5.06-2.11-5.06H14.12c-2.64,0-3.97,3.19-2.11,5.06l50.38,50.81c1.16,1.17,3.06,1.17,4.22,0Z"/>
</g>
<g id="_x3C_Радиальное_повторение_x3E_-4" data-name="_x3C_Радиальное_повторение_x3E_">
<path class="cls-1" d="M72.13,66.61l50.81,50.38c1.87,1.86,5.06.53,5.06-2.11V14.12c0-2.64-3.19-3.97-5.06-2.11l-50.81,50.38c-1.17,1.16-1.17,3.06,0,4.22Z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 107 127.1">
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-1, .cls-2, .cls-3 {
stroke: #000;
stroke-miterlimit: 10;
stroke-width: 2px;
}
.cls-2 {
fill: none;
}
.cls-3 {
fill: red;
}
</style>
</defs>
<g id="_Слой_13" data-name="Слой_13">
<line class="cls-1" y1="115.1" x2="43" y2="115.1"/>
<line class="cls-1" x1="64" y1="115.1" x2="107" y2="115.1"/>
<path class="cls-3" d="M95,8.1l-12.08-6.7-35.92,80.7L15,115.1s11.69-.03,28,0c0,0,1-10,11-10,9,0,10,10,10,10,9.54.02,15.06,0,15,0l-5-29L95,8.1Z"/>
<circle class="cls-2" cx="53.5" cy="115.6" r="10.5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 828 B

+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45.83 65.94">
<defs>
<style>
.cls-1, .cls-2 {
fill: #fff;
}
.cls-2 {
stroke: #000;
stroke-miterlimit: 10;
stroke-width: .5px;
}
</style>
</defs>
<g id="_Слой_10" data-name="Слой_10">
<g>
<path class="cls-1" d="M41.75,62.87V4.78l-3.87,2.32-6.48,3.89c-9.59,5.76-17.51,13.94-22.94,23.72l-6.71,12.07"/>
<path d="M41.56,62.87c0-16.54.05-34.31-.59-50.83-.1-2.42-.17-4.84-1.23-7.26,0,0,3.03,1.71,3.03,1.71-3.66,2.26-9.09,5.36-12.6,7.63-7.99,5.26-14.73,12.41-19.49,20.71,0,0-7.19,12.91-7.19,12.91,0,0-3.5-1.94-3.5-1.94,0,0,7.22-12.97,7.22-12.97,5.07-8.83,12.25-16.45,20.75-22.05,5.53-3.51,12.26-7.38,17.85-10.79,0,0-2.08,4.78-2.08,4.78-1.8,4.72-1.15,9.64-1.49,14.52-.19,8.41-.24,20.51-.33,29.04-.02,4.84-.03,9.68.01,14.52h-.37Z"/>
</g>
<circle class="cls-2" cx="41.47" cy="62.28" r="1"/>
<path class="cls-2" d="M41.47,63.28v1.8h0c-.51.74-1.58.81-2.18.14l-.27-.31"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_Слой_2" data-name="Слой_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50.57 51.98">
<defs>
<style>
.cls-1, .cls-2 {
fill: #fff;
stroke: #000;
stroke-miterlimit: 10;
}
.cls-2 {
stroke-width: 2px;
}
</style>
</defs>
<g id="_Слой_12" data-name="Слой_12">
<polyline class="cls-2" points="21.49 2.23 21.49 22.58 21.79 51.97"/>
<line class="cls-2" x1=".79" y1="41.97" x2="50.57" y2="41.97"/>
<polygon class="cls-1" points="25.68 2.23 25.68 38.03 48.81 38.03 25.68 2.23"/>
<polygon class="cls-1" points="17.7 2.23 17.7 38.03 .79 38.03 17.7 2.23"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 711 B