Инженерный тур. 2 этап
Северный морской путь (СМП) — кратчайшая морская трасса между Европейской частью России и Дальним Востоком, важнейший транспортный коридор национального и мирового значения. В 2022 году был утвержден план развития Северного морского пути до 2035 года, цель которого — обеспечить надежную и безопасную перевозку грузов и товаров для людей, живущих в районах Крайнего Севера, а также создать условия для реализации инвестиционных проектов в Арктической зоне страны.
Моря, по которым проходит СМП, отличаются суровым климатом и сложными ледовыми условиями, от которых зависит безопасность навигации.
В рамках второго этапа участники решают задачи ледового и экологического мониторинга северных морей.
Дан один кадр аэрофотосъемки, он получен 7 сентября 1991 года и охватывает территорию площадью около 18 км\(^2\): https://disk.yandex.ru/d/h2bTjsQcvgnL4g/1.
Этот кадр попадает на лист топографической карты масштаба \(1:200000\), номенклатура которого R-45-XXIX, XXX.
Выполните привязку кадра аэрофотосъемки. В качестве ответа укажите координаты центра кадра после его привязки в проекции UTM.
Решать задачу необходимо по следующему плану:
- определить границу территории, отображенную на топографической карте, номенклатура которой R-45-XXIX, XXX;
- внутри границ, определенных на первом шаге, найти территорию, которая запечатлена на кадре;
- скачать космический снимок, дата получения которого наиболее близка к дате получения аэрофотоснимка; это снимок, полученный съемочной системой Landsat-5 31 августа 1991 года;
- осуществить привязку кадра к скачанному снимку;
- вычислить координаты центра кадра после привязки.
\(X= 605784; Y= 7629653\).
Если введенные в ответе координаты удалены от эталонных координат не более, чем на 30 м, участнику присуждается 10 баллов.
Более, чем на 30 м, но менее, чем на 60 м — 8 баллов.
Более, чем на 60 м, но менее, чем на 90 — 6 баллов.
В прочих случаях — 0 баллов.
Дан радиолокационный снимок: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/2.
Выполните его предварительную обработку, которая включает фильтрацию спекл-шума, радиометрическую калибровку, геокодирование и ортотрансформирование.
В качестве ответа укажите, сколько судов находилось в море в момент съемки. Суда, стоящие на рейде в портах или на удалении менее 1 км от берега, учитывать не нужно.

Визуально суда однозначно дешифрируются на радиолокационных снимках. Металлические конструкции усиливают отраженные радиоволны, поэтому они являются наиболее яркими объектами на снимке (рис. 1.1).
8.
При каждой последующей попытке загрузки ответа присуждаемый балл снижается на 1.
Дан радиолокационный снимок и векторный слой, который содержит границы исследования: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/2.
Внутри границы исследования на акватории Обской губы в момент съемки можно выделить:
- открытую воду,
- припай (однолетний лед средней толщины),
- однолетний тонкий лед,
- однолетний тающий лед.
Создайте векторный полигональный слой, в котором должен быть отображен припай. Считайте, что припай примыкает к берегу даже в том случае, когда дешифрируется полоса открытой воды между береговой линией и кромкой льда.
Векторный слой должен быть создан для последующего оформления карты масштаба \(1:200000\) в проекции UTM, в формате шейп-файла (.shp).
В качестве ответа укажите площадь припая в квадратных километрах с точностью до третьего знака после запятой, а также прикрепите полученный векторный слой. Площадь рассчитайте с помощью функции $area.
Точность расчета площади припая зависит от точности векторизации береговой линии. Точность векторизации береговой линии полуострова определяется масштабом будущей карты. Таким образом, острова с линейными размерами менее 1 км должны быть исключены из рассмотрения береговой линии.
Внимательно следите за тем, чтобы к решению были прикреплены все файлы, необходимые для открытия векторного слоя. Если при проверке будет невозможно открыть векторный файл, задача может быть оценена в 0 баллов.
Решать задачу необходимо по следующему плану:
- Выполнить предварительную обработку радиолокационного снимка в программной среде SNAP, экспортировать два растра (результаты съемки территории электромагнитными волнами разной поляризации) в формат
.geotiff. Выполнить дешифрирование береговой линии. В качестве дополнительной информации необходимо использовать многозональные снимки, дата которых близка к дате исходного снимка. Важно, чтобы вся исследуемая территория попадала на одну сцену. Оптимально для дешифрирования береговой зоны использовать цветное изображение, синтезированное в натуральных цветах и ближний инфракрасный канал, в котором вода имеет минимальные значения яркости. На рис. 1.2 представлен фрагмент снимка (поляризация HH), желтой линией показана векторизованная береговая линия.
Рис. 1.2. Фрагмент радиолокационного снимкаВекторизация припая.
Рис. 1.3. Фрагмент радиолокационного снимка, на котором желтым цветом показана береговая линия, штриховкой — припайПрипай — неподвижный морской лед вдоль берега. На снимках в радиолокационном диапазоне имеет достаточно однородную структуру. Для векторизации границ припая (рис. 1.3) необходимо использовать растр, полученный при согласованной горизонтальной (HH) поляризации электромагнитных волн.
3630,350.
- При совпадении векторного слоя участника с эталонным на 90–100% — участнику присуждается 15 баллов.
- При совпадении на 80–90% — 12 баллов.
- При совпадении на 70–80% — 9 баллов.
Данные тепловой съемки применяются для решения широкого круга задач, в число которых входит: изучение пространственно-временного распределения температур земной поверхности и поверхности океана, исследование состояния атмосферы, обнаружение очагов возгорания, наблюдение за вулканической активностью, выявление загрязнения водоемов сточными водами и пр.
Выполните обработку теплового канала снимка, полученного съемочной системой Landsat 9. Для возможности изучения распределения температур безразмерные нормализованные значения пикселей теплового канала (Digital Number/DN) должны быть преобразованы в значения температуры.
Напишите программный код на языке Python для преобразования значений пикселей теплового канала из безразмерных нормализованных значений в значения температуры в градусах Цельсия. Преобразование выполняется в два этапа:
- пересчет значений пикселей в значения спектральной энергетической яркости (TOA Radiance);
- пересчет значений пикселей в значения яркостной температуры на верхней границе атмосферы (Top of Atmosphere Brightness Temperature).
Формулы для пересчета приведены по ссылке: https://www.usgs.gov/landsat-missions/using-usgs-landsat-level-1-data-product (pdf-копия веб-страницы: https://disk.yandex.ru/i/s6YWs7Rk2_UT1g).
Константы, используемые в формулах, должны автоматически считываться программой из метаданных снимка.
Формат входных данных
Входные данные (фрагмент теплового канала, преобразованный в одномерный массив значений пикселей, и текстовые метаданные, преобразованные в формат base64) записаны в json-структуру. Полученная структура подается на вход программе в потоке stdin.
Json-структура может содержать различные пары ключ: значение, среди которых в обязательном порядке должны быть следующие:
- ключ —
MTL: значение — строка, полученная в результате преобразования текстового файла метаданных в форматbase64; - ключ —
B10: значение — одномерный массив чисел, сформированный на основе фрагмента теплового канала снимка (тип данных исходного растра сохранен).
Если подаваемая на вход программе json-структура не содержит одну или обе из приведенных выше пар ключ: значение, программа должна записать в поток stdout строку «999.99» и завершить работу.
Если структура содержит обе необходимые пары ключ: значение, должен быть выполнен пересчет значений пикселей в значения температуры. После завершения пересчета программа должна записать в поток stdout максимальное значение температуры на фрагменте изображения в градусах Цельсия, округленное до сотых (разделитель целой и дробной части — точка), и завершить работу.
Примеры json-структур, подаваемых на вход программе:
{"MTL":"R1JPVVAgPSBMQU5EU0FUX01FVEFE", "B10":[21374, 21385, 21405, 21437, 21467, 21482, 21495, 21524, 21563, 21608, 21650, 21686]}
{"information":"text", "MTL":"R1JPVVAgPSBMQU5EU0FUX01FVEFE", "B10":[21374, 21385, 21405, 21437, 21467, 21482, 21495, 21524, 21563, 21608, 21650, 21686]}
{ "B10":[21374, 21385, 21405, 21437, 21467, 21482, 21495, 21524, 21563, 21608, 21650, 21686]}
Чтение данных из потока stdin должно быть выполнено следующим образом:
input_data = json.loads(sys.stdin.getvalue())
Запись данных в поток stdout должна быть выполнена следующим образом:
sys.stdout.write('some text')
Пример исходных данных (тепловой канал снимка, текстовый файл метаданных и сформированную на их основе json-структуру) можно загрузить по ссылке: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/3.
Ниже представлено решение на языке Python.
import base64
import json
import sys
import array
import math
ML = -1
AL = -1
K1 = -1
K2 = -1
input_data = json.loads(sys.stdin.getvalue())
try:
decoded_str = base64.b64decode(input_data['MTL']).splitlines()
data = array.array('f', input_data['B10'])
for line1 in decoded_str:
line = str(line1)
if 'RADIANCE_MULT_BAND_10' in line:
ML = float(line.replace(' ', '').rstrip("'").split('=')[1])
if 'RADIANCE_ADD_BAND_10' in line:
AL = float(line.replace(' ', '').rstrip("'").split('=')[1])
if 'K1_CONSTANT_BAND_10' in line:
K1 = float(line.replace(' ', '').rstrip("'").split('=')[1])
if 'K2_CONSTANT_BAND_10' in line:
K2 = float(line.replace(' ', '').rstrip("'").split('=')[1])
if ML != -1 and AL != -1 and K1 != -1 and K2 != -1:
data = array.array('f', input_data['B10'])
TOA = [item * ML for item in data]
TOA = [item + AL for item in TOA]
divider = [K1 / item for item in TOA]
divider = [item + 1.0 for item in divider]
divider = [math.log(item) for item in divider]
T = [K2 / item for item in divider]
sys.stdout.write( f"{round(max(T) - 273.15, 2):.2f}" )
except:
sys.stdout.write('999.99')
Тестовые данные
Пример тестовых данных: https://disk.yandex.ru/d/MjNUA-IS_w_qMA.
17.44.
Человек наблюдал объект 25 апреля 2024 года в истинный полдень, разница времени наблюдения и времени по Гринвичскому меридиану составляла 5 ч 3 мин и 5,3 с. Объект находится на территории Российской Федерации.
Высота объекта 32 м, длина тени от объекта, отбрасываемой на горизонтальную плоскость, в момент наблюдения была равной 55,2677 м.
Определите, что это за объект и укажите его название.
Для решения задачи необходимо пренебречь неравномерностью орбитального движения Земли.
Промежуточные расчеты необходимо выполнять с точностью до шестого знака.
Если название состоит из нескольких слов, начиная со второго слова они должны быть введены через пробел. При записи названия объекта запрещено использовать заглавные буквы.
Долготу объекта можно найти по разнице местного и Гринвичского времени. За один час Земля делает поворот на 15°. Чтобы установить долготу объекта, необходимо разницу во времени перевести в градусную меру двугранного угла, который образован плоскостью Гринвичского меридиана и плоскостью меридиана, проходящего через объект.
5 ч соответствует 75°.
3 мин 5,3 с перевести в градусную меру с помощью пропорции: \[\begin{aligned} 15 ° = 3600 \text{ с},\\ x = 185,3 \text{ с}. \end{aligned}\]
Долгота: 75,772083.
Для расчета широты можно использовать упрощенную формулу: \[\text{ВС} = 90 - \phi + C \cdot \sin\left(N \cdot \left(\frac{360}{366}\right)\right),\] где:
- \(\text{ВС}\) — высота Солнца в истинный полдень;
- \(\phi\) — широта;
- \(C\) — угол наклона эклиптики к экватору 23°27\(^\prime\) (23,45);
- \(N\) — порядковый номер дня наблюдения минус порядковый номер дня весеннего равноденствия.
Длина тени: \[L = \frac{h}{\operatorname{tg}(\text{ВС})},\] где \(h\) — высота объекта, \(L\) — длина тени.
Высота Солнца в момент наблюдения: 30,070841.
Порядковый номер даты наблюдения: 116.
Порядковый номер дня весеннего равноденствия (в 2024 г. 20 марта): 80.
\(N = 36\).
Широта: \[\phi = 90 - 30{,070841} + 23{,}45 \cdot \sin\left(36 \cdot \left(\frac{360}{366}\right)\right) = 90 - 30{,070841} + 13{,587422} = 73{,516581}.\]
Широта: 73,516581.
маяк вилькицкого.
При каждой последующей попытке загрузки ответа присуждаемый балл снижается на 1.
Скачайте радиолокационный снимок: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/5.
Выполните дешифрирование нефтяного загрязнения на акватории Печорского моря, источником которого стало судно (в радиусе 28 км от судна).
Рассчитайте суммарную площадь загрязненных участков в квадратных километрах с точностью до третьего знака после запятой. Загрязненные участки, площадь которых менее 0,1 км\(^2\), учитывать его не нужно. Площадь рассчитайте с помощью функции $area.
В качестве ответа укажите рассчитанную площадь, а также прикрепите результаты векторизации загрязнения. Все измерения выполняйте в проекции UTM.
Требования к векторному слою:
- тип геометрии — полигон;
- формат —
.shp; - проекция слоя — UTM;
атрибутивная таблица слоя должна содержать два поля:
Id— уникальный идентификатор объектов, формат целочисленный; все объекты должны иметь сквозную нумерацию, которая начинается с 1;S— поле, в котором указана площадь загрязнения, формат десятичный, точность 3 (длину поля необходимо определить самостоятельно).
Внимательно следите за тем, чтобы к решению были прикреплены все файлы, необходимые для открытия векторного слоя. Если при проверке будет невозможно открыть векторный файл, задача может быть оценена в 0 баллов.
Необходимо найти все суда на снимке и определить, какое судно предположительно стало источником загрязнения (рис. 1.4).
Рис. 1.4. Фрагмент снимка- Построить буферную зону радиусом 28 км от судна.
Выполнить векторизацию загрязнения (рис. 1.5).
Рис. 1.5. Дешифрирование загрязнений- Рассчитать площадь векторизованных участков, исключить все участки, площадь которых менее 0,1 км\(^2\), рассчитать суммарную площадь.
2,326.
| Ответ | Балл |
|---|---|
| [2,226; 2,426] | 10 |
| [2,126; 2,226) или (2,426; 2,526] | 8 |
| [2,026; 2,126) или (2,526; 2,626] | 6 |
| Прочие варианты ответа | 0 |
Дешифрирование снежно-ледовых поверхностей необходимо для мониторинга процессов снеготаяния, составления гидрологического прогноза, исследования ледников и оценки их отклика на изменение климата. Снежно-ледовым поверхностям свойственна высокая отражательная способность в видимом и ближнем инфракрасном диапазонах спектра и ее резкое снижение в среднем инфракрасном диапазоне. Данное свойство позволяет успешно отличать снег и лед от облачности и других ярких объектов при дешифрировании.
Для дешифрирования снежно-ледового покрова может быть использован индекс NDSI (Normalized Difference Snow Index). Формула расчета индекса NDSI для снимков, полученных съемочной системой Landsat, приведена по ссылке: https://www.usgs.gov/landsat-missions/normalized-difference-snow-index (pdf-копия веб-страницы: https://disk.yandex.ru/i/azWNNffAKr4vPQ). Чем ближе значение индекса к 1, тем выше вероятность того, что пиксель содержит снежно-ледовый покров. На основе изображения, полученного в результате расчета индекса NDSI, может быть сформирована маска снежно-ледового покрова.
Кроме того, формирование маски снежно-ледового покрова для снимков, полученных съемочной системой Landsat 8 и Landsat 9, можно выполнить на основе файла с постфиксом QA_PIXEL (QA_PIXEL Band). Значение каждого пикселя файла кодирует тип объекта на изображении (снег, облако, тень и пр.) и вероятность того, что объект классифицирован правильно. Возможные значения пикселей и их интерпретация приведены в таблице по ссылке: https://www.usgs.gov/media/images/collection-2-landsat-8-9-pixel-quality-assessment-qapixel-value-interpretations (pdf-копия веб-страницы: https://disk.yandex.ru/i/Tbo9OhDy0P_UOg).
Напишите программный код на языке Python для формирования маски снежно-ледового покрова для фрагмента снимка, полученного съемочной системой Landsat 9. Сформируйте маску двумя способами:
- на основе файла QA_PIXEL Band,
- на основе индексного изображения,
и сравните полученные результаты.
Определите значения пикселей файла QA_PIXEL Band, которые содержат снежно-ледовый покров, по приведенной таблице. Используйте данное значение при написании кода для формирования маски снежно-ледового покрова на основе файла QA_PIXEL Band. Пикселям, содержащим снежно-ледовый покров, при формировании маски должно быть присвоено значение 1, всем остальным — значение 0.
При написании кода для формирования маски снежно-ледового покрова на основе изображения, полученного в результате расчета индекса NDSI, в качестве порогового значения установите значение 0,6 (пиксели, значения которых больше или равны пороговому, соответствуют снежно-ледовому покрову). Пикселям, содержащим снежно-ледовый покров, при формировании маски должно быть присвоено значение 1, всем остальным — значение 0.
Программа должна выполнить сравнение полученных масок и вывести количество пикселей, которые содержат снежно-ледовый покров согласно обеим маскам (т. е. и на маске, полученной на основе индексного изображения, и на маске, полученной на основе файла QA_PIXEL Band, пиксель должен быть классифицирован как снег/лед).
Формат входных данных
Входные данные (файл QA_PIXEL Band и каналы снимка, преобразованные в одномерные массивы значений пикселей) записаны в json-структуру. Полученная структура подается на вход программе в потоке stdin.
Json-структура может содержать различные пары ключ: значение, среди которых есть следующие:
- Ключ —
QA: значение — одномерный массив чисел, сформированный на основе файла QA_PIXEL Band (тип данных исходного растра сохранен). - Ключ — номер канала (например,
B10,B1): значение — одномерный массив чисел, сформированный на основе канала снимка (тип данных исходного растра сохранен).
Если подаваемая на вход программе json-структура не содержит необходимые для расчетов пары ключ: значение, программа должна записать в поток stdout строку «9.999» и завершить работу.
Если структура содержит все необходимые пары ключ: значение, должно быть выполнено формирование и сравнение масок снежно-ледового покрова, после чего программа должна записать в поток stdout количество пикселей, которые содержат снежно-ледовый покров согласно обеим маскам, и завершить работу (количество пикселей должно быть выведено как строка).
{"B1":[12277, 9675, 17804, 19589, 18023, 21754], "B2":[5931, 5912, 6057, 5932, 6363, 7701],"B3":[12277, 9675, 17804, 19589, 18023, 21754], "B4":[5931, 5912, 6057, 5932, 6363, 7701], "B5":[7009, 6882, 6704, 7020, 7198, 12011], "B6":[15390, 10505, 9400, 9745, 8621, 11708], "B7":[16732, 16827, 11713, 14664, 15053, 17294], "B8":[12277, 9675, 17804, 19589, 18023, 21754], "B9":[5931, 5912, 6057, 5932, 6363, 7701],"QA":[22280, 22280, 30048, 30048, 30048, 62820]}
{"QA":[21374, 21385, 21405, 21437, 21467], "B7":[21374, 21385, 21405, 21437, 21467], "B8":[21374, 21385, 21405, 21437, 21467]}
{"information":"text", "QA":[21374, 21385, 21405, 21437, 21467], "B1":[21374, 21385, 21405, 21437, 21467], "B2":[21374, 21385, 21405, 21437, 21467] ], "B3":[21374, 21385, 21405, 21437, 21467]}
{"B10":[21374, 21385, 21405, 21437, 21467, 21482, 21495, 21524, 21563, 21608, 21650, 21686]}
Чтение данных из потока stdin должно быть выполнено следующим образом:
input_data = json.loads(sys.stdin.getvalue())
Запись данных в поток stdout должна быть выполнена следующим образом:
sys.stdout.write('some text')
Ниже представлено решение на языке Python.
import base64
import json
import sys
import array
import math
input_data = json.loads(sys.stdin.getvalue())
try:
QA = array.array('f', input_data['QA'])
B3 = array.array('f', input_data['B3'])
B6 = array.array('f', input_data['B6'])
divisible = [x - y for x, y in zip(B3, B6)]
divider = [x + y for x, y in zip(B3, B6)]
ndsi = [x / y for x, y in zip(divisible, divider)]
snow_mask_1 = ndsi.copy()
snow_mask_2 = ndsi.copy()
for n in range (0, len(ndsi)):
if ndsi[n] >= 0.6:
snow_mask_1[n] = 1
else:
snow_mask_1[n] = 0
if QA[n] == 30048:
snow_mask_2[n] = 1
else:
snow_mask_2[n] = 0
union = [x * y for x, y in zip(snow_mask_1, snow_mask_2)]
num = sum(union)
sys.stdout.write (str(num))
except:
sys.stdout.write ('9.999')
Тестовые данные
Пример тестовых данных.
{"message":"test6", "B5":[13277, 9675, 17804, 19589, 18023, 21754, 25995, 12416, 12312, 17510, 19553, 22292, 28412, 33798, 15070, 16687, 19885, 24698, 32203, 37156, 35008, 15613, 18132, 23516, 31784, 34715, 29404, 24300, 15597, 16701, 17272, 18552, 23602, 18985, 19849, 17680, 13853, 13336, 15781, 16233, 15288, 16362], "B4":[13277, 9675, 17804, 19589, 18023, 21754, 25995, 12416, 12312, 17510, 19553, 22292, 28412, 33798, 15070, 16687, 19885, 24698, 32203, 37156, 35008, 15613, 18132, 23516, 31784, 34715, 29404, 24300, 15597, 16701, 17272, 18552, 23602, 18985, 19849, 17680, 13853, 13336, 15781, 16233, 15288, 16362], "B3":[21754, 25995, 12416, 12312, 17510, 19553, 22292, 28412, 33798, 15070, 16687, 19885, 24698, 32203, 37156, 35008, 15613, 18132, 23516, 31784, 34715, 29404, 24300, 15597, 16701, 17272, 18552, 23602, 18985, 19849, 17680, 13853, 13336, 15781, 16233, 15288, 16362], "B6":[6121, 6038, 7095, 7139, 5985, 6044, 6082, 6075, 5926, 5992, 5805, 5901, 5901, 5931, 5912, 6057, 5932, 6863, 7701, 7009, 6882, 6704, 7020, 7198, 12011, 15390, 10505, 9400, 9745, 8621, 11708, 16732, 16827, 11713, 14664, 15053, 17294], "QA":[22280, 22280, 30048, 30048, 30048, 62820, 62820, 30304, 30304, 30048, 30048, 62820, 62820, 62820, 30048, 30048, 30048, 62820, 62820, 62820, 62820, 30048, 30048, 62820, 62820, 62820, 30048, 30048, 30048, 63076, 54852, 62820, 62820, 30048, 30048, 63076, 54596]}
3.
Система автоматической идентификации (АИС) позволяет судам по всему миру идентифицировать друг друга и передавать данные о своем местоположении, скорости, курсе другим судам и наземных приемным станциям. Это необходимо для обеспечения безопасной навигации. Напишите программный код на языке Python для обработки данных системы автоматической идентификации судов, сохраненных в файл формата csv (разделитель — точка с запятой).
Исходный csv-файл input.csv, содержащий данные от нескольких судов, необходимо загрузить по ссылке: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/7. Система АИС, установленная на судне, передает информацию о его местоположении в конкретный момент времени по крайней мере 1 раз в несколько минут с помощью сигналов. Каждому сигналу соответствует одна строка файла. Состав и структура данных файла приведены в таблице 1.1.
| Наименование столбца | Тип данных | Содержимое | Пример содержимого |
|---|---|---|---|
ship_name |
строка | наименование судна | AKADEMIK CHEBYSHEV |
latitude |
число с плавающей точкой | широта в градусах (WGS 84) | 71.09113 |
longitude |
число с плавающей точкой | долгота в градусах (WGS 84) | 66.81432 |
ts_pos_utc |
строка | дата и время фиксации сигнала | 10.07.2017 13:16:00 |
Напишите программный код, который на основе данных файла input.csv выполняет формирование трека для каждого указанного в файле судна, последовательно соединяя переданные судном координаты с учетом времени фиксации сигнала. Сформированные треки (линейные векторные объекты) должны быть сохранены в векторный файл с названием routes формата Shape с сохранением географической привязки и метаданных (таблица атрибутов слоя должна содержать столбец ship_name с наименованиями судов). Shape-файл должен корректно открываться в ГИС.
Если для судна в файле input.csv содержится лишь одна запись о его местоположении, судно должно быть исключено из рассмотрения, трек судна формироваться не должен.
После формирования треков программа должна определить длину самого протяженного из полученных треков в метрах. Полученное значение, округленное до тысяч, введите в поле ввода в качестве ответа. Расчет протяженности треков должен быть выполнен в проекции UTM zone 43N (эллипсоид WGS 84).
Программа должна быть сохранена в файл routes.py. Файл программы routes.py и архив с расширением *.zip routes.zip, содержащий Shape-файл с сформированными треками, должны быть в обязательном порядке прикреплены к решению. В случае, если файлы не прикреплены, если содержимое файлов отличается от требуемого, если название или расширение файлов отличаются от требуемых, если Shape-файл не может быть корректно открыт, баллы за задание не начисляются.
Ниже представлено решение на языке Python.
import shapely
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point, LineString
df = pd.read_csv( 'input.csv', sep = ";", encoding = "latin-1", usecols = ['ship_name', 'longitude', 'latitude', 'ts_pos_utc'] )
df[['date', 'time']] = df.ts_pos_utc.str.split(expand=True)
df['date'] = pd.to_datetime(df['date'], format = 'mixed', dayfirst = True)
df['time'] = pd.to_timedelta(df['time']+':00')
df = df.drop_duplicates()
df = df[df.duplicated(subset=['ship_name'], keep=False)]
gdf = gpd.GeoDataFrame( df, geometry = gpd.points_from_xy(df.longitude, df.latitude), crs = "EPSG:4326" )
prj = '32643'
gdf = gdf.to_crs(prj)
gdf = gdf.sort_values(by = ['ship_name', 'date', 'time'])
gdf = gdf.groupby( ['ship_name'] )['geometry'].apply( lambda x: LineString(x.tolist()) if x.size > 1 else x.tolist() )
gdf = gpd.GeoDataFrame( gdf, geometry = 'geometry', crs=prj )
longest_line = max(gdf['geometry'].apply( lambda x: x.length))
print( f"{longest_line:.3f}" )
gdf.to_file('routes.shp', driver='ESRI Shapefile')
1364000 м.
Для решения задачи необходим векторный слой, полученный в задании 2.1.
Если команде не удалось получить векторный слой в задании 2.1, ее члены могут обратиться к организаторам с просьбой выдать слой с судовыми путями. В этом случае команда может получить не более 5 баллов за задачу.
Даны векторные слои с зоной интереса и сеткой, для ячеек которой необходимо будет выполнить расчет: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/8.
Рассчитайте плотность судовых путей в километрах на квадратных километр для каждой ячейки или ее части в границах заданной акватории.
Все промежуточные расчеты выполняйте в проекции UTM N43, все промежуточные расчеты длин выполняйте в километрах с точностью до третьего знака после запятой, все промежуточные расчеты площадей выполняйте в квадратных километрах с точностью до третьего знака после запятой.
Для расчета длин используйте функцию $length, для расчета площадей — $area.
В качестве ответа запишите плотность судовых путей с точностью до третьего знака после запятой.
Решать задачу необходимо по следующему плану:
- Открыть в новом проекте слои, которые содержат векторное представление изучаемой акватории, маршрутов движения судов и сетки, по которой выполняется расчет плотности судовых путей. Проверить, что все векторные слои сохранены в проекции UTM N43. Если проекция слоя отличается, его нужно перепроецировать.
- Обрезать векторный слой маршрутов движения судов по границе акватории.
- Обрезать векторный слой сетки по границе акватории.
- «Разрезать» слой маршрутов слоем сетки таким образом, чтобы каждому фрагменту трека присвоился уникальный идентификатор ячейки сетки, в которую он попадает.
- Выполнить расчет суммарной протяженности маршрутов внутри одной ячейки.
- Рассчитать площадь ячеек.
- Для каждой ячейки рассчитать плотность судовых путей.
9,543 или 9,742.
Дан многозональный снимок: https://disk.yandex.ru/d/h2bTjsQcvgnL4g/9.
Необходимо выполнить дешифрирование загрязнения реки тяжелой фракцией нефти.
Для упрощения визуального дешифрирования выполните синтезирование цветного изображения и расчет индекса: https://custom-scripts.sentinel-hub.com/custom-scripts/sentinel-2/oil-spill-index/.
В качестве ответа укажите площадь загрязнения в квадратных метрах, а также прикрепите результаты векторизации загрязнения. Все измерения выполняйте в проекции UTM. Площадь рассчитывайте с помощью функции $area.
Требования к векторному слою:
- тип геометрии — полигон;
- формат —
.shp; - проекция слоя — UTM;
атрибутивная таблица слоя должна содержать два поля:
Id— уникальный идентификатор объектов, формат целочисленный; все объекты должны иметь сквозную нумерацию, которая начинается с 1;S— поле, в котором указана площадь загрязнения, формат целочисленный.
Внимательно следите за тем, чтобы к решению были прикреплены все файлы, необходимые для открытия векторного слоя. Если при проверке будет невозможно открыть векторный файл, задача может быть оценена в 0 баллов.
Тяжелые фракции нефти на снимках в видимом диапазоне имеют коричневый цвет (рис. 2.1).
226000.
| Ответ | Балл |
|---|---|
| [214700; 237300] | 10 |
| [203400; 214700) или (237300; 248600] | 8 |
| [192100; 203400) или (248600; 259900] | 6 |
| Прочие варианты ответа | 0 |





