GEE-15. Отображение карт в разделенном окне
Посмотрим на примере Франции, как изменилась концентрация диоксида азота (NO2) в период пандемии COVID-19 по сравнению с предшествующим периодом.
Порядок работы:
1. Импорт административных границ
2. Импорт концентрации NO2
3. Фильтрация и усреднение значений NO2
4. Добавление данных на карту
5. Отображение карт в разделенном окне
Большинство операций нам уже знакомы. Новым будет размещение двух карт в одном окне, с подвижным разделителем. Это полезно при сравнении состояний “до” и “после” события, да и просто красиво.
Код примера: https://code.earthengine.google.com/8aadb3c53b1c00bb92fe926008ef69cb
Импортируем границы Франции:
Импортируем данные о концентрации диоксида азота в столбе атмосферы.
Выделим период с февраля по март, и рассчитаем для него средние концентрации NO2 в 2019 и 2020 годах. Для наглядности, умножим концентрацию NO2 на 1e6, чтобы перевести ее из моль/м2 в микромоль/м2. С помощью функции
Вместо того, чтобы просто добавить на карту слои “до” и “после”, поступим по-другому. Добавим на карту только слой "до", а для слоя “после” создадим новую карту и добавим его туда;
Свяжем между собой карты Map и Map2:
Теперь создадим виджет
Карты располагаются горизонтально. Первая — в первой (левой) панели, вторая — в правой. Значение параметра
Установим виджет
Вычислим координаты центра карты Map (то есть Франции с учетом Корсики) и центрируем виджет
Чтобы убедится, что то, что мы наблюдаем в 2020 году — не обычные колебания концентрации, посмотрите на данные того же периода за 2021 и 2022 годы.
#GEE #атмосфера
Посмотрим на примере Франции, как изменилась концентрация диоксида азота (NO2) в период пандемии COVID-19 по сравнению с предшествующим периодом.
Порядок работы:
1. Импорт административных границ
2. Импорт концентрации NO2
3. Фильтрация и усреднение значений NO2
4. Добавление данных на карту
5. Отображение карт в разделенном окне
Большинство операций нам уже знакомы. Новым будет размещение двух карт в одном окне, с подвижным разделителем. Это полезно при сравнении состояний “до” и “после” события, да и просто красиво.
Код примера: https://code.earthengine.google.com/8aadb3c53b1c00bb92fe926008ef69cb
Импортируем границы Франции:
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');
var country = countries.filter(ee.Filter.eq('country_na', 'France'));
Импортируем данные о концентрации диоксида азота в столбе атмосферы.
var no2 = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2').select('NO2_column_number_density');
Выделим период с февраля по март, и рассчитаем для него средние концентрации NO2 в 2019 и 2020 годах. Для наглядности, умножим концентрацию NO2 на 1e6, чтобы перевести ее из моль/м2 в микромоль/м2. С помощью функции
clip()
, обрежем карту по границам страны. Карту средней концентрации NO2 до эпидемии назовем pre
, в ходе эпидемии — post
:var filterMonth = ee.Filter.calendarRange(2, 5, 'month');
var no2 = no2.filter(filterMonth);
var filter19 = ee.Filter.calendarRange(2019, 2019, 'year');
var filter20 = ee.Filter.calendarRange(2020, 2020, 'year');
var pre = no2.filter(filter19).mean().multiply(1e6).clip(country);
var post = no2.filter(filter20).mean().multiply(1e6).clip(country);
Вместо того, чтобы просто добавить на карту слои “до” и “после”, поступим по-другому. Добавим на карту только слой "до", а для слоя “после” создадим новую карту и добавим его туда;
Map.addLayer(pre, vizParams, 'NO2 Pre');
var Map2 = ui.Map();
Map2.addLayer(post, vizParams, 'NO2 Post');
Свяжем между собой карты Map и Map2:
var linker = ui.Map.Linker([ui.root.widgets().get(0), Map2]);
Теперь создадим виджет
SplitPanel
, который будет содержать связанные карты:var splitPanel = ui.SplitPanel({
firstPanel: linker.get(0),
secondPanel: linker.get(1),
orientation: 'horizontal',
wipe: true
});
Карты располагаются горизонтально. Первая — в первой (левой) панели, вторая — в правой. Значение параметра
wipe = true
указывает, что перетаскиванием разделителя можно задать, какая часть каждой панели будет показана.Установим виджет
SplitPanel
в качестве корневого (раньше им была карта Map):ui.root.widgets().reset([splitPanel]);
Вычислим координаты центра карты Map (то есть Франции с учетом Корсики) и центрируем виджет
SplitPanel
по этим координатам:var lon = Map.getCenter().coordinates().get(0).getInfo();
var lat = Map.getCenter().coordinates().get(1).getInfo();
linker.get(0).setCenter(lon, lat, 6);
Чтобы убедится, что то, что мы наблюдаем в 2020 году — не обычные колебания концентрации, посмотрите на данные того же периода за 2021 и 2022 годы.
#GEE #атмосфера
Отображение карт в разделенном окне (вверху). Концентрация диоксида азота до пандемии (2019 год) и в период пандемии (2020 год).
Прибор OMI измеряет концентрацию диоксида азота
Кроме TROPOMI, концентрацию диоксида азота в атмосфере измеряет прибор OMI (Ozone Monitoring Instrument) на спутнике Aura. Этими данными пользоваться не так удобно, зато они собираются с 2005 года.
Данные Aura/OMI находятся в Earthdata. Посмотреть их можно в Worldview, в Giovanni (требуется регистрация в Earthdata) и на Global Nitrogen Dioxide Monitoring Home Page. На последней есть временные ряды наблюдений за концентрацией диоксида азота для крупнейших городов мира.
#атмосфера
Кроме TROPOMI, концентрацию диоксида азота в атмосфере измеряет прибор OMI (Ozone Monitoring Instrument) на спутнике Aura. Этими данными пользоваться не так удобно, зато они собираются с 2005 года.
Данные Aura/OMI находятся в Earthdata. Посмотреть их можно в Worldview, в Giovanni (требуется регистрация в Earthdata) и на Global Nitrogen Dioxide Monitoring Home Page. На последней есть временные ряды наблюдений за концентрацией диоксида азота для крупнейших городов мира.
#атмосфера
Диоксид азота и мониторинг пожаров
Данные о концентрации диоксида азота NO2 применяются в мониторинге пожаров. Нередко, уточнить источник происхождения диоксида азота, помогают дополнительные данные, такие как концентрация CO и формальдегида.
Повышенный уровень NO2 (на рисунке слева) наблюдается в районе лесных пожаров, в округах Вентура и Санта-Барбара (Калифорния), а также в Лос-Анджелесе. В районе пожаров одновременно наблюдается высокая концентрация CO (рисунок справа) — гораздо выше, чем в Лос-Анджелесе. Дело в том, что в Лос-Анджелесе основным источником NO2 являются выхлопные газы автомобилей, а они дают значительно меньшие концентрации CO, чем пожары.
Рисунки взяты из: TROPOMI finds source of pollutants, 07 Jan 2019
#атмосфера
Данные о концентрации диоксида азота NO2 применяются в мониторинге пожаров. Нередко, уточнить источник происхождения диоксида азота, помогают дополнительные данные, такие как концентрация CO и формальдегида.
Повышенный уровень NO2 (на рисунке слева) наблюдается в районе лесных пожаров, в округах Вентура и Санта-Барбара (Калифорния), а также в Лос-Анджелесе. В районе пожаров одновременно наблюдается высокая концентрация CO (рисунок справа) — гораздо выше, чем в Лос-Анджелесе. Дело в том, что в Лос-Анджелесе основным источником NO2 являются выхлопные газы автомобилей, а они дают значительно меньшие концентрации CO, чем пожары.
Рисунки взяты из: TROPOMI finds source of pollutants, 07 Jan 2019
#атмосфера
Глобальные цифровые модели рельефа
Цифровая модель рельефа (ЦМР) — это трехмерное компьютерное представление данных о рельефе местности. Обычно ЦМР существует в виде растра — сетки квадратов, в каждом из которых задана высота. Проще говоря, ЦМР — это карта высот.
ЦМР содержит высоту поверхности планеты. В отличие от ЦМР, цифровая модель поверхности (ЦМП) дает высоту поверхности с добавлением высот расположенных на ней искусственных объектов и растительности.
Одни из наиболее точных ЦМР строятся при помощи лидарной съемки. Однако такие ЦМР охватывают сравнительно небольшие участки поверхности (около 1% земной суши). Глобальные ЦМР строятся при помощи спутниковой съемки.
Ключевые данные для построения глобальной ЦМР были получены Shuttle Radar Topography Mission (SRTM) — полета шаттла “Индевор” в феврале 2000 года, в ходе которого высоту поверхности планеты измеряли методом радарной интерферометрии. В результате была построена первая глобальная ЦМР, охватывающая 80% площади земной суши: от 56° ю.ш. до 60° с.ш.
Первая версия ЦМР SRTM содержала много ошибок и пробелов, к тому же за ее пределами находились крайние север и юг планеты. Но огромный плюс этих данных был в том, что они распространялись свободно. В 2009 году появилась новая глобальная ЦМР — ASTER Global Digital Elevation Model (GDEM). Она построена на основе стереосъемки, выполненной прибором ASTER со спутника Terra и охватывает всю поверхность планеты. У новой ЦМР были свои проблемы, но теперь появилась возможность сравнивать.
Третья версия SRTM (SRTM Plus), в которой пробелы были заполнены данными ASTER GDEM и USGS GMTED2010, появилась в 2014 году и имела пространственное разрешение 30 м. Ее легко найти в сети, например на GEE (NASA SRTM Digital Elevation 30m).
В 2020 году появилась Copernicus DEM, GLO-30. Она имеет разрешение 30 м и основана на более свежих и точных наблюдениях — данных TanDEM-X 2011–2015 годов. На GEE данные находятся здесь.
Однако, несмотря на то, что в названиях моделей присутствует DEM (Digital Elevation model, то есть ЦМР), фактически все они остаются цифровыми моделями поверхности, то есть включают высоту зданий, леса и других объектов на поверхности Земли. Это затрудняет гидрологическое моделирование. Например, трудно оценить площадь, которую может затопить наводнение, если считать лес поверхностью, которая ограничивает распространение воды (а это происходит при использовании ЦМП вместо ЦМР). Трудно и оценить высоту леса над поверхностью, не зная высоты этой самой поверхности.
Одной из первых попыток удалить “ненужное” стала MERIT (Multi-Error-Removed Improved-Terrain) DEM. Она имеет разрешение 90 м.
Самой свежей по времени попыткой создания “истинной” глобальной ЦМР является FABDEM (Forest And Buildings removed Copernicus DEM). Она основана на Copernicus DEM, леса и здания с которой удалены при помощи машинного обучения. Обучалась модель на лидарных ЦМР из 12 стран мира. Процесс создания FABDEM описан в работе*. Пространственное разрешение FABDEM — 30 метров. Найти ее можно здесь.
*В статье приведены сравнения FABDEM c другими картами, демонстрирующие преимущества FABDEM. К сожалению, там нет разностных карт, по которым можно было бы оценить ошибку FABDEM относительно лидарных эталонов. Впрочем, это можно сделать самому (темка для статьи!). Лидарные данные есть в свободном доступе, например на OpenTopography.
Все ЦМР (ЦМП) на одной карте: https://code.earthengine.google.com/936241de27a9f0538f53195764c907c6
#DEM #данные #GEE
Цифровая модель рельефа (ЦМР) — это трехмерное компьютерное представление данных о рельефе местности. Обычно ЦМР существует в виде растра — сетки квадратов, в каждом из которых задана высота. Проще говоря, ЦМР — это карта высот.
ЦМР содержит высоту поверхности планеты. В отличие от ЦМР, цифровая модель поверхности (ЦМП) дает высоту поверхности с добавлением высот расположенных на ней искусственных объектов и растительности.
Одни из наиболее точных ЦМР строятся при помощи лидарной съемки. Однако такие ЦМР охватывают сравнительно небольшие участки поверхности (около 1% земной суши). Глобальные ЦМР строятся при помощи спутниковой съемки.
Ключевые данные для построения глобальной ЦМР были получены Shuttle Radar Topography Mission (SRTM) — полета шаттла “Индевор” в феврале 2000 года, в ходе которого высоту поверхности планеты измеряли методом радарной интерферометрии. В результате была построена первая глобальная ЦМР, охватывающая 80% площади земной суши: от 56° ю.ш. до 60° с.ш.
Первая версия ЦМР SRTM содержала много ошибок и пробелов, к тому же за ее пределами находились крайние север и юг планеты. Но огромный плюс этих данных был в том, что они распространялись свободно. В 2009 году появилась новая глобальная ЦМР — ASTER Global Digital Elevation Model (GDEM). Она построена на основе стереосъемки, выполненной прибором ASTER со спутника Terra и охватывает всю поверхность планеты. У новой ЦМР были свои проблемы, но теперь появилась возможность сравнивать.
Третья версия SRTM (SRTM Plus), в которой пробелы были заполнены данными ASTER GDEM и USGS GMTED2010, появилась в 2014 году и имела пространственное разрешение 30 м. Ее легко найти в сети, например на GEE (NASA SRTM Digital Elevation 30m).
В 2020 году появилась Copernicus DEM, GLO-30. Она имеет разрешение 30 м и основана на более свежих и точных наблюдениях — данных TanDEM-X 2011–2015 годов. На GEE данные находятся здесь.
Однако, несмотря на то, что в названиях моделей присутствует DEM (Digital Elevation model, то есть ЦМР), фактически все они остаются цифровыми моделями поверхности, то есть включают высоту зданий, леса и других объектов на поверхности Земли. Это затрудняет гидрологическое моделирование. Например, трудно оценить площадь, которую может затопить наводнение, если считать лес поверхностью, которая ограничивает распространение воды (а это происходит при использовании ЦМП вместо ЦМР). Трудно и оценить высоту леса над поверхностью, не зная высоты этой самой поверхности.
Одной из первых попыток удалить “ненужное” стала MERIT (Multi-Error-Removed Improved-Terrain) DEM. Она имеет разрешение 90 м.
Самой свежей по времени попыткой создания “истинной” глобальной ЦМР является FABDEM (Forest And Buildings removed Copernicus DEM). Она основана на Copernicus DEM, леса и здания с которой удалены при помощи машинного обучения. Обучалась модель на лидарных ЦМР из 12 стран мира. Процесс создания FABDEM описан в работе*. Пространственное разрешение FABDEM — 30 метров. Найти ее можно здесь.
*В статье приведены сравнения FABDEM c другими картами, демонстрирующие преимущества FABDEM. К сожалению, там нет разностных карт, по которым можно было бы оценить ошибку FABDEM относительно лидарных эталонов. Впрочем, это можно сделать самому (темка для статьи!). Лидарные данные есть в свободном доступе, например на OpenTopography.
Все ЦМР (ЦМП) на одной карте: https://code.earthengine.google.com/936241de27a9f0538f53195764c907c6
#DEM #данные #GEE
Различия между ЦМР и ЦМП (источник)
DEM — Digital Elevation model (цифровая модель рельефа), DSM — Digital Surface Model (цифровая модель поверхности).
DEM — Digital Elevation model (цифровая модель рельефа), DSM — Digital Surface Model (цифровая модель поверхности).
Forwarded from АстроФотоБолото 🎄 Атмосферное (Cate Archer)
С первым календарным днем весны. С погодной точки зрения у нас еще есть примерно треть марта, чтоб насладиться зимней погодой и попрощаться с зимой.
Андрей для @astrophotoboloto
Андрей для @astrophotoboloto
GEE-16. Ночные снимки и графики временных рядов
Недавно мы обсуждали ночные снимки, а сейчас поработаем с ними. Сначала мы сравним среднюю освещенность территории в 2014 и 2021 годах, а после построим графики временных рядов средней освещенности для нескольких стран.
Задаем список стран и выбираем нужные фильтром
Импортируем коллекцию снимков VIIRS Day/Night band:
Это — месячные композиты ночных снимков.
Вычислим среднюю освещенностью в 2014 году:
и отобразим ее на карте:
Аналогично поступим с данными 2021 года.
Базовой картой сделаем спутниковые снимки:
Результаты показаны в следующем посте.
Перейдем к построению временных рядов. Возьмем среднюю освещенность за весь период наблюдений (2014–2022 годы):
Построим временные ряды освещенности по странам. Здесь
Свойство
Для закрепления навыка, построим временной ряд для одной страны:
Вместо
Подробности построения графиков описаны в официальном руководстве. На наш взгляд, глубоко погружаться в них не стоит, потому что они тесно связаны с языком программирования. Почти весь рассмотренный нами материал легко перенести на Python, а вот построение графиков специфично для JavaScript. В Python их придется строить по-другому. Не сложнее, а именно по-другому.
Код примера
#GEE #dnb
Недавно мы обсуждали ночные снимки, а сейчас поработаем с ними. Сначала мы сравним среднюю освещенность территории в 2014 и 2021 годах, а после построим графики временных рядов средней освещенности для нескольких стран.
Задаем список стран и выбираем нужные фильтром
ee.Filter.inList
:var countryList = ['Yemen','Eritrea','Djibouti'];
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017')
.filter(ee.Filter.inList('country_na', countryList));
Импортируем коллекцию снимков VIIRS Day/Night band:
var nightlight = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG');
Это — месячные композиты ночных снимков.
Вычислим среднюю освещенностью в 2014 году:
var start = ee.Date.fromYMD(2014,1,1);
var end = ee.Date.fromYMD(2014,12,31);
var nightlights2014 = nightlight.filterDate(start,end);
nightlights2014 = ee.Image(nightlights2014.mean());
nightlights2014 = nightlights2014.select('avg_rad');
nightlights2014 = nightlights2014.clip(countries);
и отобразим ее на карте:
// Палитра для отображения DNB.
var palDNB = ['000000','700000','808080','FFFF00','ffffff','ffffff','ffffff'];
Map.addLayer(nightlights2014, {min:0,max:10,palette:palDNB}, 'Nightlights 2014');
Аналогично поступим с данными 2021 года.
Базовой картой сделаем спутниковые снимки:
Map.setOptions('SATELLITE');
Результаты показаны в следующем посте.
Перейдем к построению временных рядов. Возьмем среднюю освещенность за весь период наблюдений (2014–2022 годы):
var nl = nightlight.select('avg_rad');
Построим временные ряды освещенности по странам. Здесь
ee.Reducer.mean()
вычисляет среднюю освещенность по стране на одном снимке, то есть за один месяц:var chart =
ui.Chart.image
.seriesByRegion({
imageCollection: nl,
regions: countries,
reducer: ee.Reducer.mean(),
scale: 500,
seriesProperty: 'country_na',
xProperty: 'system:time_start'
})
.setOptions({
title: 'Date',
hAxis: {title: 'Date', titleTextStyle: {italic: false, bold: true}},
vAxis: {
title: 'average nighlight',
titleTextStyle: {italic: false, bold: true}
},
lineWidth: 5,
colors: ['e37d05','0f8755','76b349'],
curveType: 'function'
});
print(chart);
Свойство
xProperty
указывает на переменную, играющую роль времени. seriesProperty
задает атрибут regions
, разделяющий данные разных рядов (название страны). Все остальные свойства довольно очевидны. Для закрепления навыка, построим временной ряд для одной страны:
var country = countries.filter(ee.Filter.inList('country_na', ['Yemen']));
var chart =
ui.Chart.image
.series({
imageCollection: nl,
region: country,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
})
.setSeriesNames(['avg_rad'])
.setOptions({
title: 'Date',
hAxis: {title: 'Date', titleTextStyle: {italic: false, bold: true}},
vAxis: {
title: 'average nighlight',
titleTextStyle: {italic: false, bold: true}
},
lineWidth: 5,
colors: ['e37d05'],
curveType: 'function'
});
print(chart);
Вместо
ui.Chart.image.seriesByRegion
здесь использована ui.Chart.image.series
, потому что регион теперь один. Соответственно, вместо regions
использован region
.Подробности построения графиков описаны в официальном руководстве. На наш взгляд, глубоко погружаться в них не стоит, потому что они тесно связаны с языком программирования. Почти весь рассмотренный нами материал легко перенести на Python, а вот построение графиков специфично для JavaScript. В Python их придется строить по-другому. Не сложнее, а именно по-другому.
Код примера
#GEE #dnb