Як заради однієї змінної для 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 в таблиці geoname є поле elevation (в метрах).
Я зрозумів, що завдання набагато складніше за «Hello, World!» та одразу сповістив свого бізнес-партнера Романа про можливі проблеми з параметром висоти... Він таки знайшов дані (вони потребували уніфікації). Але що робити в ситуації, коли їх немає? Підвищувати рівень абстракції. Наскільки? Доки не вдасться впоратися з проблемою. І ми підняли планку десь на 240 кілометрів над землею — у космос.
Космічні технології
Радіолокаційно-топографічна місія шатл (Shuttle Radar Topography Mission, SRTM) — міжнародний проєкт, який очолили Національна агенція геопросторової та картографічної інформації (National Imagery and Mapping Agency) та NASA і в якому брав участь Німецький аерокосмічний центр (DLR). Тоді за мету ставили створити найповнішу цифрову топографічну базу даних Землі високої роздільної здатності. Під час SRTM спеціально модифіковану радіолокаційну систему встановили на шатл Endeavour. Вона працювала під час його
До оснащення SRTM для збирання топологічних даних входили два радари. Один розміщувався у вантажному відсіку шатла, а інший на кінці
Екіпаж 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)
У вересні 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 іноді називають даними
Індексна карта (відсутні дані для найпівнічніших і найпівденніших широт)
Основна точка входу до 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 передбачає
Порядок байтів 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 року до червня
Endeavour на вулицях Лос-Анджелеса
Стаття англійською спеціально для DOU.