Як заради однієї змінної для ML ми використали дані космічного проєкту SRTM

Я співзасновник Curiosio — путівника для мандрівників-ґіків. Curiosio складається з оптимізатора та онтологічного графа (міста, селища, парки та визначні місця в них). Нещодавно ми виділяли ознаки для нового модуля машинного навчання, і однією з них стала географічна висота. Висота географічної місцевості — це її вертикальна відстань відносно математичної моделі Землі на рівні моря. Завдання здавалося настільки легким, як написати «Hello, World» невідомою мовою програмування. Але виявилось, що все не так просто.

Hello, World!

Я підготував список приблизно із 70 вручну відібраних локацій і фіксував їхню висоту над рівнем моря з Wikidata, Wikipedia та OpenStreetMap (OSM). Одразу виявилися відмінності в тому, де і як було подано дані. Відмінності були такі ж разючі, як у назвах базових понять різними мовами (як-от пес, дощ, їжа). Зрештою, системи довгий час розвивалися незалежно. Висоту вказували під різними назвами та різними способами, а часто її взагалі бракувало:

  • В OSM за неї відповідає ключ — ele;
  • У Wikidata параметр elevation above sea level (P2044);
  • А у Wikipedia є дві мітки: {{Infobox... elevation_m=... }} (у метрах) і {{Infobox... elevation_ft=... }} (у футах).
  • До того ж Wikipedia часто має висоту в довільній формі в тексті сторінки.
Я вирішив перевірити ще одне джерело — GeoNames. Висоту там фіксували точно, але не про всі точки з мого тестового списку були дані.

У GeoNames в таблиці geoname є поле elevation (в метрах).

Я зрозумів, що завдання набагато складніше за «Hello, World!» та одразу сповістив свого бізнес-партнера Романа про можливі проблеми з параметром висоти... Він таки знайшов дані (вони потребували уніфікації). Але що робити в ситуації, коли їх немає? Підвищувати рівень абстракції. Наскільки? Доки не вдасться впоратися з проблемою. І ми підняли планку десь на 240 кілометрів над землею — у космос.

Космічні технології

Радіолокаційно-топографічна місія шатл (Shuttle Radar Topography Mission, SRTM) — міжнародний проєкт, який очолили Національна агенція геопросторової та картографічної інформації (National Imagery and Mapping Agency) та NASA і в якому брав участь Німецький аерокосмічний центр (DLR). Тоді за мету ставили створити найповнішу цифрову топографічну базу даних Землі високої роздільної здатності. Під час SRTM спеціально модифіковану радіолокаційну систему встановили на шатл Endeavour. Вона працювала під час його 11-денного польоту в лютому 2000 року. Ця радіолокаційна система зібрала понад 8 терабайтів даних, на основі яких збудували тривимірні моделі земної поверхні.

60-метрова висувна щогла (світлина NASA)

До оснащення SRTM для збирання топологічних даних входили два радари. Один розміщувався у вантажному відсіку шатла, а інший на кінці 60-метрової щогли, яка висунулася з вантажного відсіку вже на орбіті. SRTM місія покрила приблизно 80% земної поверхні (71% поверхні планети вкриває вода) з роздільною здатністю 30 м для США і 90 м для інших країн світу.

Екіпаж STS-99

Транснаціональний науково-дослідний супутник EOS AM-1 Terra запустили на орбіту 1999 року. Він став флагманом Системи спостереження за Землею (Earth Observing System, EOS). Супутник обладнали модернізованим бортовим радіометром для реєстрації теплового випромінювання і відбиття (Advanced Spaceborne Thermal Emission and Reflection Radiometer, ASTER). Цей радіометр був розроблений у Японії та став одним з п’яти зовнішніх сенсорних пристроїв на борту. Супутник почав збирати дані в лютому 2000 року. Побудовану за допомогою даних з ASTER глобальну цифрову модель висот (Global Digital Elevation Model, GDEM) 2-ї редакції опублікували в жовтні 2011-го. І нерівна гірська місцевість у ній була зроблена значно точніше, ніж у випадку SRTM.

У вересні 2014 року НАСА опублікувала доопрацьовану редакцію SRTM. Попередні її дані про регіони за межами США були опубліковані в роздільній здатності 3 кутові секунди, або 1/1200° широти й довготи, або 90 м. Нові дані мали роздільну здатність 1 кутова секунда, або майже 30 м, що відповідає повній роздільній здатності оригінальних замірів.

Тож заради однієї змінної для машинного навчання одного з модулів Curioso ми беремо SRTM висоту аж з даних космічної місії.

Низький уклін астронавтам, інженерам-картографам Космічного центру Ліндона Джонсона та Лабораторії реактивного руху (Jet Propulsion Laboratory), а також Національній агенції геопросторової розвідки! А тепер спускаймося на Землю...

Дані висоти

Дані про висоту Землі оприлюднили NASA. Це означає, що вони є загальнодоступними. Робота з Open Source взагалі не охоплена правами інтелектуальної власності, наприклад, авторськими правами. Ви можете вільно використовувати дані, навіть з комерційною метою.

Дані SRTM організовані в окремі растрові комірки, кожна з яких охоплює один градус на один градус за широтою та довготою. Інтервал вибірки для окремих замірів становить 1 кутова секунда, 3 кутові секунди або 30 кутових секунд, що називаються SRTM1, SRTM3 і SRTM30 відповідно. Оскільки одна кутова секунда на екваторі відповідає приблизно 30 метрам у горизонтальному масштабі, дані SRTM1 і SRTM3 іноді називають даними «30-метровими» або «90-метровими».

Індексна карта (відсутні дані для найпівнічніших і найпівденніших широт)

Основна точка входу до SRTM v2:

Index of /srtm/version2_1
    Documentation/
    NAVMac800QSFile
    SRTM1/
    SRTM3/
    SRTM30/
    SWBD/
Index of /srtm/version2_1/SRTM1
    Parent Directory
    Region_01/
    Region_02/
    Region_03/
    Region_04/
    Region_05/
    Region_06/
    Region_07/
    Region_definition.jpg
Index of /srtm/version2_1/SRTM1/Region_01
    N38W112.hgt.zip
    N38W113.hgt.zip
    N38W114.hgt.zip
    N38W115.hgt.zip
    N38W116.hgt.zip
    N38W117.hgt.zip
    N38W118.hgt.zip
    ...

Назви файлів відповідають широті та довготі нижнього лівого кута комірки. Наприклад, N38W112 має нижній лівий кут на 38 градусах північної широти та 112 градусах західної довготи. Стиснуті файли HGT — це файли з висотами, що представлені моделлю DEM (Data Elevation Models). DEM передбачає 16-бітні цілочисельні дані у простому бінарному растрі. 16-бітні цілочисельні дані показують висоту кожної комірки в метрах, розташованих із заходу на схід, а потім з півночі на південь. У файлі немає байтів заголовка. Дані зберігаються в основному порядку рядків (усі дані для рядка 1, потім всі дані для рядка 2 тощо).

Порядок байтів Big-endian, з першим значущим байтом. Величини можуть варіюватись від −32767 до +32767 метрів, охоплюючи діапазон висот на Землі. Ці дані також містять випадкові пропуски через затінення, фазові аномалії або інші радіолокаційні причини. Пропуски позначені значенням −32768.

Найзручніший спосіб використання даних — за допомогою бібліотеки SRTM.py та її golang-порту go-elevations. Ліцензія бібліотек — Apache 2.0, дозволяє комерційне використання. Обидві бібліотеки розробив tkrajina (Tomo Krajina) — програміст-ґік з Хорватії. Честь і хвала Томо!

Python-приклад, як отримати висоту за геокоординатами:

import srtm
data = srtm.get_data()
print(data.get_elevation(50.8682, 7.1377))
# Cache files with urls of SRTM files are put in HOME dir.
# In case, you need another location, set the cache dir.
import srtm
data = srtm.get_data(local_cache_dir="foo")
print(data.get_elevation(50.8682, 7.1377))
# Voids happen, get interpolated value
# IDW stands for Inverse Distance Weighted
print(data._IDW(50.8682, 7.1377))

Golang-приклад, як отримати висоту за геокоординатами:

import (
    "fmt"
    "net/http"
    "github.com/tkrajina/go-elevations/geoelevations"
)
func main() {
    srtm, err := geoelevations.NewSrtm(http.DefaultClient)
    if err != nil {
        // retry, or reconfig and retry
    }
    ele, err := srtm.GetElevation(http.DefaultClient, 45.2775, 13.726111)
    if err != nil {
        // ...
    }
    fmt.Println(ele)
}

Що з даними поза межами досяжності? Передусім непокрита територія не така вже і велика, як показує проєкція Меркатора. Меркатор розтягує біля полюсів і стискає біля екватора. Ознайомтеся з іншими проєкціями, аби переконатись, що покриття SRTM гарне. По-друге, інші джерела даних (включаючи Wikidata, Wikipedia, GeoNames, GDEM) знадобляться для висот у засніжених широтах.

Endeavour

Космічний корабель Endeavour успішно завершив місію STS-99. Ось посилання на запуск. А ось презентація NASA, присвячена підсумку місії, що містить відео та опис того, як картографічне обладнання працювало на орбіті (дивись із 4 хв 00 с і далі з 10 хв 07 с, у них не склалася щогла). На той час це була найбільша жорстка конструкція на орбіті. Отримані дані записали на 330 касетах з магнітною стрічкою. Endeavour здійснив 25 польотів з травня 1992 року до червня 2011-го. Потім його офіційно вивели з експлуатації та виставили в Каліфорнійському науковому центрі у Лос-Анджелесі. Шлях Endeavour до наукового центру став цілою місією.

Endeavour на вулицях Лос-Анджелеса


Стаття англійською спеціально для DOU.

Похожие статьи:
Brain Academy приглашает работающих ІТ-специалистов на встречу, посвященную теме “Trainer — sprint Ø!”. Что мотивирует стать инструктором?...
Привіт! Мене звати Дмитро Стрілецький, я Python-розробник. Як і ви, я теж колись шукав роботу — і не один раз. У цій статті хочу...
У мережі з’явилась інформація про нібито продаж на форумі RAID особистих даних двох мільйонів українців, що зберігались...
Депутати розробили новий законопроєкт, який змінює процес бронювання співробітників, повідомляє видання Forbes, яке має...
Міжнародна аутстафінгова компанія SD Solutions із представництвом в Україні, Естонії, Польщі, Румунії та на Кіпрі...
Яндекс.Метрика