Люди пересекают многополосную городскую улицу на пешеходном переходе.

Воздух для завтрашнего дня: картирование цифрового ландшафта качества воздуха, от хранилищ и типов данных до стартового кода.

Понимание качества воздуха: доступ к имеющимся данным, интерпретация типов данных и выполнение пусковых кодов.

Делиться

e82cb18f359cb86dd24ec3d956fe1804

Представьте себе: пыльная дорога в Лаосе. Школа находится в 200 метрах. Гул машин, дым от горящего мусора поднимается над дорогой, и дети идут прямо сквозь него. Чем они дышат сегодня? Без местных данных никто толком не знает.

В Восточной Азии и Тихоокеанском регионе 325 миллионов детей [1] ежедневно дышат токсичным воздухом, иногда в концентрациях, в 10 раз превышающих допустимые пределы. Последствия часто незаметны: поражение легких, астма, но в острых случаях это может привести к пропуску школьных занятий. На кону будущее. В долгосрочной перспективе системы здравоохранения испытывают перегрузку, и экономика вынуждена нести издержки.

Во многих случаях данные о качестве воздуха даже недоступны.

Никаких мониторов. Никаких улик. Никакой защиты.

Во второй части этой серии статей в блоге [2] мы рассмотрим хранилища данных, где доступны полезные данные о качестве воздуха, как их импортировать и как запустить в вашем ноутбуке. Мы также разберем форматы данных, такие как GeoJSON, Parquet/GeoParquet, NetCDF/HDF5, COG, GRIB и Zarr, чтобы вы могли выбрать подходящий инструмент для работы. Мы постепенно продвигаемся вперед, чтобы в следующей части шаг за шагом рассказать о том, как мы разработали модель качества воздуха с открытым исходным кодом.

В последние несколько лет наблюдается значительный рост интереса к сбору и использованию данных о качестве воздуха. Эти данные поступают из разных источников, и, соответственно, их качество варьируется. Несколько хранилищ могут помочь в их количественной оценке: регулирующие станции для получения достоверной информации, общедоступные датчики для понимания локальных вариаций, спутники для регионального контекста и реанализы моделей для оценок (рис. 2). Хорошая новость: большая часть этих данных находится в открытом доступе. Еще лучше: код для начала работы относительно короткий.

7873db6652938a374b106263eb0a2f75

Краткие руководства по запуску репозитория (с минимальным набором Python)

В этом разделе мы переходим от концепций к практике. Ниже мы рассмотрим набор часто используемых репозиториев с открытым исходным кодом и покажем минимальный код, необходимый для начала извлечения данных из каждого из них. Все примеры предполагают использование Python ≥3.10 с установленным pip install по мере необходимости.

Для каждого пронумерованного репозитория вы найдете:

  • Краткое описание источника данных и способа его поддержки.
  • Типичные сценарии использования (когда этот источник подходит),
  • как получить к нему доступ (ключи API, примечания при регистрации или прямые URL-адреса), и
  • Минимальный фрагмент кода на Python для извлечения данных.

Представьте это как практическое руководство, где вы можете бегло просмотреть описания, выбрать источник, соответствующий вашей проблеме, а затем адаптировать код для непосредственного подключения к вашему собственному конвейеру анализа или моделирования.

Совет: Не храните секреты в коде. Используйте переменные окружения для токенов (например, export AIRNOW_API_KEY=…).

1) OpenAQ (глобальные наземные измерения; открытый API)

OpenAQ [3] — это платформа данных с открытым исходным кодом, которая размещает глобальные данные о качестве воздуха, такие как PM2.5, PM10 и O3. Они предоставляют данные о качестве воздуха, сотрудничая с различными государственными партнерами, общественными организациями и компаниями-производителями датчиков качества воздуха, такими как Air Gradient, IQAir и другими.

Отлично подходит для: быстрой обработки данных по всей стране, согласования единиц измерения/метаданных, создания воспроизводимых конвейеров обработки данных.

Зарегистрируйтесь и получите ключ API OpenAQ по адресу https://explore.openaq.org. После регистрации найдите свой ключ API в настройках. Используйте этот ключ для аутентификации запросов.

!pip install openaq pandas import pandas as pd from pandas import json_normalize from openaq import OpenAQ import datetime from datetime import timedelta import geopandas as gpd import requests import time import json # Следуйте инструкциям в кратком руководстве, чтобы получить ключ API https://docs.openaq.org/using-the-api/quick-start api_key = '' # Введите свой ключ API перед выполнением client = OpenAQ(api_key=api_key) # Используйте ключ API, сгенерированный ранее # Получите местоположение всех датчиков в выбранных странах codes: https://docs.openaq.org/resources/countries locations = client.locations.list( countries_id=[68,111], limit = 1000 ) data_locations = locations.dict() df_sensors_country = json_normalize(data_locations ['results']) df_sensors_exploded = df_sensors_country.explode('sensors') df_sensors_exploded['sensor_id']=df_sensors_exploded['sensors'].apply(lambda x: x['id']) df_sensors_exploded['sensor_type']=df_sensors_exploded['sensors'].apply(lambda x: x['name']) df_sensors_pm25 = df_sensors_exploded[df_sensors_exploded['sensor_type'] == «pm25 µg/m³»] df_sensors_pm25 # Проходим по каждому местоположению и извлекаем почасовые измерения df_concat_aq_data=pd.DataFrame() to_date = datetime.datetime.now() from_date = to_date — timedelta(days=2) # Получаем прошлое 2 дня данных sensor_list = df_sensors_pm25.sensor_id for sensor_id in sensor_list[0:5]: print(«——«) response = client.measurements.list( sensors_id= sensor_id, datetime_from = from_date, datetime_to = to_date, limit = 500 ) print(response) data_measurements = response.dict() df_hourly_data = json_normalize(data_measurements ['results']) df_hourly_data[«sensor_id»] = sensor_id if len(df_hourly_data) > 0: df_concat_aq_data=pd.concat([df_concat_aq_data,df_hourly_data]) df_concat_aq_data = df_concat_aq_data[[«sensor_id»,»period.datetime_from.utc»,»period.datetime_to.utc»,»parameter.name»,»value»]] df_concat_aq_data

2) EPA AQS Data Mart (архив нормативных документов США; требуется токен)

EPA AQS Data Mart [4] — это американский архив нормативных данных, в котором хранятся данные о качестве воздуха, полученные с тысяч станций мониторинга по всей стране. Он предоставляет долгосрочные записи о загрязняющих веществах, таких как PM₂․₅, PM₁₀, O₃, NO₂, SO₂ и CO, а также подробные метаданные станций и флаги контроля качества. Доступ к нему можно получить через API после регистрации и получения токена доступа. Он также предоставляет метеорологические данные.

Отлично подходит для: получения достоверных данных контроля качества в США.

Зарегистрируйтесь в системе AQS Data Mart на веб-сайте Агентства по охране окружающей среды США по адресу: https://aqs.epa.gov/aqsweb/documents/data_api.html
Создайте файл .env в вашей среде и добавьте свои учетные данные, включая адрес электронной почты AQS и ключ AQS.

# pip install requests pandas import os, requests, pandas as pd AQS_EMAIL = os.getenv(«AQS_EMAIL») AQS_KEY = os.getenv(«AQS_KEY») url = «https://aqs.epa.gov/data/api/sampleData/byState» params = {«email»: AQS_EMAIL, «key»: AQS_KEY, «param»: «88101», «b date»:»20250101″, «edate»: «20250107», «state»: «06»} r = requests.get(url, params=params, timeout=60) df = pd.json_normalize(r.json()[«Data»]) print(df[[«state_name»,»county_name»,»date_local»,»sample_measurement»,»units_of_measure»]].head())

3) AirNow (американские индексы в режиме реального времени; ключ API)

AirNow [5] — это платформа правительства США, которая предоставляет информацию об индексе качества воздуха (AQI) в режиме, близком к реальному времени, на основе данных мониторинга регулирующих органов. Она публикует текущие и прогнозируемые значения AQI для загрязняющих веществ, таких как PM₂․₅ и O₃, а также пороговые значения категорий («Хорошее», «Умеренное» и т. д.), которые легко донести до общественности. Доступ к данным можно получить программно через API AirNow после регистрации и получения ключа API.

Отлично подходит для: визуализации лесных пожаров и показателей качества воздуха в общественных местах.

Зарегистрируйте учетную запись AirNow API через портал AirNow API: https://docs.airnowapi.org/

На странице входа выберите «Запросить учетную запись AirNow API» и заполните регистрационную форму, указав свой адрес электронной почты и основные данные. После активации учетной записи вы найдете свой API-ключ в панели управления AirNow API; используйте этот ключ для аутентификации всех вызовов к веб-сервисам AirNow.

import os, requests, pandas as pd API_KEY = os.getenv(«AIRNOW_API_KEY») url = «https://www.airnowapi.org/aq/observation/latLong/current/» params = {«format»:»application/json», «latitude»: 37.7749, «longitude»: -122.4194, «distance»:25, «API_KEY»: API_KEY} df = pd.DataFrame(requests.get(url, params=params, timeout=30).json()) print(df[[«ParameterName», «AQI» ,»Category.Name «,»DateObserved», «HourObserved»]])

4) Служба мониторинга атмосферы Copernicus (CAMS; Хранилище данных об атмосфере)

Служба мониторинга атмосферы Copernicus [6], реализуемая ECMWF для программы Copernicus ЕС, предоставляет глобальные реанализы и прогнозы состава атмосферы в режиме, близком к реальному времени. Через хранилище данных об атмосфере (ADS) можно получить доступ к сеточным полям для аэрозолей, реактивных газов (O₃, NO₂ и т. д.), парниковых газов и связанных метеорологических переменных, с многолетними данными, подходящими как для исследовательских, так и для оперативных приложений. Все продукты CAMS в ADS являются открытыми и бесплатными при условии принятия лицензии Copernicus.

Отлично подходит для: глобальных фоновых значений (аэрозоли и следовые газы), прогнозов и реанализа.

Как зарегистрироваться и получить доступ к API

  1. Перейдите в хранилище данных об атмосфере: https://ads.atmosphere.copernicus.eu.
  1. Нажмите «Войти / Зарегистрироваться» в правом верхнем углу и создайте (бесплатную) учетную запись Copernicus/ECMWF.
  1. После подтверждения адреса электронной почты войдите в систему и перейдите на страницу своего профиля , чтобы найти свой ключ API ADS (UID + ключ).
  1. Следуйте инструкциям ADS «Как использовать API», чтобы создать файл конфигурации (обычно ~/.cdsapirc), содержащий:
  1. URL: https://ads.atmosphere.copernicus.eu/api
  1. ключ: <ВАШ UID>:<ВАШ API-КЛЮЧ>
  1. На веб-странице каждого набора данных CAMS, который вы хотите использовать, перейдите на вкладку «Загрузка данных» и один раз примите лицензионное соглашение внизу страницы; только после этого запросы API к этому набору данных будут успешными.

После завершения настройки вы сможете использовать стандартный Python-клиент cdsapi для программной загрузки наборов данных CAMS из ADS.

# pip install cdsapi xarray cfgrib import cdsapi c = cdsapi.Client() # Пример: глобальный реанализ CAMS (EAC4) общего содержания озона в столбце (простой пример) c.retrieve( «cams-global-reanalysis-eac4», {«variable»:»total_column_ozone»,»date»:»2025-08-01/2025-08-02″,»time»:[«00:00″,»12:00»], «format»:»grib»}, «cams_ozone.grib»)

5) NASA Earthdata (LAADS DAAC/GES DISC; токен/логин)

NASA Earthdata [7] предоставляет единый доступ к широкому спектру данных о науках о Земле, включая спутниковые данные об аэрозолях и следовых газах, которые имеют решающее значение для приложений, связанных с качеством воздуха. Два ключевых центра для определения состава атмосферы:

  • LAADS DAAC (Level-1 and Atmosphere Archive and Distribution System DAAC) — это хранилище данных MODIS, VIIRS и других приборов (например, аэрозольной оптической плотности, облачности, пожаров, излучения).
  • GES DISC (Центр данных и информации по наукам о Земле имени Годдарда), который предоставляет модельные и спутниковые продукты, такие как реанализ MERRA-2, OMI, TROPOMI и связанные с ними атмосферные наборы данных.

Большинство этих наборов данных можно использовать бесплатно, но для доступа к ним требуется учетная запись NASA Earthdata ; загрузка осуществляется либо с помощью базовой HTTP-аутентификации (имя пользователя/пароль хранятся в файле .netrc), либо с помощью персонального токена доступа (PAT) в заголовках запроса.

Отлично подходит для: приборов для анализа следовых газов MODIS/VIIRS AOD, MAIAC, TROPOMI.

Как зарегистрироваться и получить доступ к API/скачиванию:

  1. Создайте учетную запись NASA Earthdata Login по адресу:
    https://urs.earthdata.nasa.gov
  1. Подтвердите свой адрес электронной почты и войдите в свой профиль Earthdata.
  1. В своем профиле сгенерируйте персональный токен доступа (PAT). Сохраните этот токен в безопасном месте; вы можете использовать его в скриптах через заголовок Authorization: Bearer или в инструментах, поддерживающих токены Earthdata.
  1. Для классической загрузки с помощью wget/curl вы можете создать файл ~/.netrc для хранения имени пользователя и пароля Earthdata, например:

machine urs.earthdata.nasa.gov login <ВАШЕ ИМЯ_ПОЛЬЗОВАТЕЛЯ> password <ВАШ_ПАРОЛЬ>

Затем установите права доступа к файлу таким образом, чтобы он был доступен только пользователю (chmod 600 ~/.netrc), чтобы инструменты командной строки могли автоматически проходить аутентификацию.

  1. Для доступа к продуктам LAADS DAAC перейдите по ссылке https://ladsweb.modaps.eosdis.nasa.gov, войдите в систему, используя свои учетные данные Earthdata, и воспользуйтесь интерфейсом «Поиск и загрузка» для создания URL-адресов для скачивания; вы можете скопировать автоматически сгенерированные команды wget/curl в свои скрипты.
  1. Для доступа к наборам данных GES DISC начните с сайта https://disc.gsfc.nasa.gov, выберите набор данных (например, MERRA-2) и воспользуйтесь инструментами «Доступ к данным» или «Выбор подмножества/Получение данных». Сайт может генерировать шаблоны скриптов (Python, wget и т. д.), которые уже содержат необходимые конечные точки для аутентифицированного доступа.

После настройки вашей учетной записи Earthdata и токена, LAADS DAAC и GES DISC будут работать как стандартные API HTTPS: вы можете вызывать их из Python (например, с помощью requests, xarray + pydap/OPeNDAP или s3fs для облачных хранилищ), используя свои учетные данные или токен для аутентифицированной загрузки с помощью скриптов.

#Загрузка через HTTPS с авторизацией Earthdata. # pip install requests import requests url = «https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/6/MCD19A2/2025/214/MCD19A2.A2025214.h21v09.006.2025xxxxxx.hdf» # Требуется действительный токен cookie; рекомендуется использовать .netrc или requests.Session() с аутентификацией # См. документацию NASA для загрузки на основе токена; здесь мы только иллюстрируем шаблон: # s = requests.Session(); s.auth = (USERNAME, PASSWORD); r = s.get(url)

6) Каталоги STAC (поиск спутников программным способом)

Каталог пространственно-временных ресурсов (STAC) [8] — это открытая спецификация для описания геопространственных ресурсов, таких как спутниковые снимки, тайлы и производные продукты, в согласованном, машиночитаемом виде. Вместо того чтобы вручную просматривать порталы загрузки, вы запрашиваете API STAC с фильтрами, такими как время, ограничивающая рамка, облачность, платформа (например, Sentinel-2, Landsat-8, Sentinel-5P) или уровень обработки, и получаете в ответ элементы JSON с прямыми ссылками на COGs, NetCDF, Zarr или другие ресурсы.

Отлично подходит для: поиска и потоковой передачи данных (COGs/NetCDF) без использования специализированных API и хорошо работает с Sentinel-5P, Landsat, Sentinel-2 и другими.

Как зарегистрироваться и получить доступ к API:
STAC сам по себе является лишь стандартом; доступ к нему зависит от конкретного API STAC, который вы используете:

  • Многие общедоступные каталоги STAC (например, демонстрационные или исследовательские конечные точки) полностью открыты и не требуют регистрации — вы можете напрямую обратиться к их конечной точке /search с помощью HTTP POST/GET.
  • Некоторые облачные платформы, предоставляющие доступ к STAC (например, коммерческие или крупные облачные провайдеры), требуют создания бесплатной учетной записи и получения учетных данных, прежде чем вы сможете прочитать базовые ресурсы (например, BLOB-объекты в хранилище S3/Blob), даже если метаданные STAC открыты.

Примером общего шаблона, который можно описать, является:

  1. Выберите конечную точку API STAC для интересующих вас спутниковых данных (часто она обозначается примерно так: https:///stac или …/stac/search).
  1. Если провайдер требует регистрации, создайте учетную запись на его портале и получите рекомендуемый ключ API или учетные данные для доступа к хранилищу (это может быть токен, URL-адрес SAS или роль доступа к облаку).
  1. Для поиска в каталоге используйте клиентскую библиотеку STAC на Python (например, pystac-client):

# pip install pystac-client from pystac_client import Client api = Client.open(«https://example.com/stac») search = api.search( collections=[«sentinel-2-l2a»], bbox=[102.4, 17.8, 103.0, 18.2], # minx, miny, maxx, maxy datetime=»2024-01-01/2024-01-31″, query={«eo:cloud_cover»: {«lt»: 20}}, ) items = list(search.get_items()) first_item = items[0] assets = first_item.assets # например, COGs, QA bands, metadata

  1. Для каждого возвращенного элемента STAC перейдите по ссылкам href ресурса (часто это URL-адреса HTTPS или URI облачных сервисов, например, s3://…) и прочитайте их с помощью соответствующей библиотеки (rasterio/xarray/zarr и т. д.). Если требуются учетные данные, настройте их с помощью переменных среды или вашего облачного SDK в соответствии с инструкциями поставщика.

После настройки каталоги STAC предоставляют единый программный способ поиска и получения спутниковых данных от разных поставщиков, без необходимости переписывать логику поиска каждый раз при переключении с одного архива на другой.

# pip install pystac-client planetary-computer rasterio from pystac_client import Client from shapely.geometry import box, mapping import geopandas as gpd catalog = Client.open(«https://earth-search.aws.element84.com/v1») aoi = mapping(box(-0.3, 5.5, 0.3, 5.9)) # ограничивающая рамка вокруг Аккры search = catalog.search(collections=[«sentinel-2-l2a»], intersects=aoi, limit=5) items = list(search.get_items()) for it in items: print(it.id, list(it.assets.keys())[:5]) # например, «B04», «B08», «SCL», «visual»

По возможности предпочтительнее использовать STAC, поскольку они предоставляют чистые метаданные, оптимизированные для облака ресурсы и удобную фильтрацию по времени/пространству.

7) Google Earth Engine (GEE; быстрое прототипирование в больших масштабах)

Google Earth Engine [9] — это облачная платформа для геопространственного анализа, которая содержит большой каталог спутниковых, климатических и наземных данных (например, MODIS, Landsat, Sentinel, реанализы) и позволяет обрабатывать их в больших масштабах без необходимости управлять собственной инфраструктурой. Вы пишете короткие скрипты на JavaScript или Python, а GEE берет на себя основную работу, такую как доступ к данным, разбиение на фрагменты, перепроецирование и параллельные вычисления, что делает его идеальным для быстрого прототипирования, исследовательского анализа и обучения.

Однако сама GEE не является открытым исходным кодом : это проприетарная, закрытая платформа, базовый код которой недоступен для публичного доступа. Это имеет последствия для открытых, воспроизводимых рабочих процессов, обсуждавшихся в первом блоге Air for Tomorrow [добавить ссылку]:

Отлично подходит для тестирования методов объединения/уменьшения масштаба данных по городу/региону с использованием наборов данных петабайтного масштаба.

Как зарегистрироваться и получить доступ

  1. Посетите страницу регистрации в Earth Engine: https://earthengine.google.com.
  1. Войдите в систему с помощью учетной записи Google и заполните регистрационную форму для некоммерческого использования , указав предполагаемое использование (исследования, образование или личные некоммерческие проекты).
  1. После одобрения вашей учетной записи вы сможете:
  • Используйте браузерный редактор кода для написания скриптов JavaScript для Earth Engine; и
  • Включите API Earth Engine в Google Cloud и установите пакет Python earthengine-api (pip install earthengine-api), чтобы запускать рабочие процессы из блокнотов Python.
  1. При публикации результатов своей работы рекомендуется экспортировать ключевые промежуточные результаты (например, GeoTIFF/COG, NetCDF/Zarr) и документировать этапы обработки в открытом исходном коде, чтобы другие могли воспроизвести анализ, не полагаясь полностью на GEE.

При таком использовании Earth Engine превращается в мощную «быструю лабораторию» для проверки идей, которые затем можно довести до стадии полностью открытых, портативных конвейеров для производства и долгосрочного управления.

# pip install earthengine-api import ee ee.Initialize() # Первый запуск: ee.Authenticate() в консоли s5p = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2').select('NO2_column_number_density') .filterDate('2025-08-01', '2025-08-07').mean() print(s5p.getInfo()['bands'][0]['id']) # Экспорт и визуализация происходят внутри GEE; вы можете выбрать данные в сетку, а затем .getDownloadURL()

8) ХИМАВАРИ

Himawari-8 и Himawari-9 — это геостационарные метеорологические спутники, эксплуатируемые Японским метеорологическим агентством (JMA). Их усовершенствованный сканер Himawari Imager (AHI) обеспечивает многодиапазонное изображение в видимом, ближнем инфракрасном и инфракрасном диапазонах над Восточной Азией и западной частью центральной части Тихого океана, с полным сканированием диска каждые 10 минут и еще более быстрым обновлением для целевых регионов. Такая высокая частота обновления изображения чрезвычайно полезна для отслеживания дымовых шлейфов, пыли, вулканических извержений, конвективных штормов и суточной эволюции облаков — именно тех процессов, которые влияют на качество воздуха у поверхности земли.

Отлично подходит для: отслеживания суточных шлейфов дымки и пожаров, генерации высокочастотных данных об оптической плотности аэрозолей для заполнения пробелов в данных с полярных орбит, а также для оперативного информирования о ситуации в городах Юго-Восточной Азии (с помощью продуктов JAXA P-Tree L3).

Как получить доступ и зарегистрироваться

Вариант А – Открыть архив через NOAA на AWS (регистрация не требуется)

  1. Ознакомиться с описанием набора данных можно в реестре открытых данных AWS: https://registry.opendata.aws/noaa-himawari/
  1. Изображения со спутников Himawari-8 и Himawari-9 размещены в общедоступных хранилищах S3 (s3://noaa-himawari8/ и s3://noaa-himawari9/). Поскольку эти хранилища доступны для чтения всем пользователям, вы можете просматривать или загружать файлы анонимно, например:

aws s3 ls —no-sign-request s3://noaa-himawari9/

или получить доступ к отдельным объектам через HTTPS (например, https://noaa-himawari9.s3.amazonaws.com/…).

  1. Для рабочих процессов на Python можно использовать такие библиотеки, как s3fs, fsspec, xarray или rasterio, для потоковой передачи данных непосредственно из этих хранилищ без предварительной регистрации, при этом следует учитывать рекомендации JMA/NOAA по указанию авторства при публикации результатов.

Вариант B – JAXA Himawari Monitor / P-Tree (счет для исследований и образования)

  1. Перейдите на портал JAXA Himawari Monitor / P-Tree:
    https://www.eorc.jaxa.jp/ptree/
  1. Нажмите «Регистрация пользователя / Запрос учетной записи» и ознакомьтесь с разделами «Меры предосторожности» и «Условия использования». Доступ к данным ограничен некоммерческими целями, такими как исследования и образование; коммерческим пользователям рекомендуется обратиться в Центр поддержки бизнеса Японской метеорологической службы.
  1. Укажите свой адрес электронной почты в форме запроса на создание учетной записи. Вы получите предварительное подтверждение по электронной почте, а затем ссылку для заполнения ваших пользовательских данных. После ручной проверки JAXA предоставит вам доступ и уведомит вас, как только вы сможете загрузить стандартные данные Himawari и продукты геофизических параметров.
  1. После одобрения вы сможете войти в систему и загрузить данные Himawari в режиме, близком к реальному времени, а также архивные данные через FTP/HTTP-сервисы P-Tree, следуя рекомендациям JAXA относительно запрета на перераспределение и цитирование.

На практике обычно используют наборы данных NOAA/AWS для открытого доступа к необработанным изображениям с возможностью написания скриптов, а продукты JAXA P-Tree — когда требуются дополнительные параметры (например, свойства облаков или аэрозолей) и вы работаете в рамках некоммерческих исследовательских или образовательных проектов.

# Откройте загруженный файл !pip install xarray netCDF4 !pip install rasterio polars_h3 !pip install geopandas pykrige !pip install polars==1.25.2 !pip install dask[complete] rioxarray h3==3.7.7 !pip install h3ronpy==0.21.1 !pip install geowrangler # Himawari использует – JAXA Himawari Monitor / P-Tree # Создайте свою учетную запись здесь и используйте имя пользователя и пароль, отправленные по электронной почте — https://www.eorc.jaxa.jp/ptree/registration_top.html user = '' # Введите имя пользователя password = '' # Введите пароль from ftplib import FTP from pathlib import Path import rasterio from rasterio.transform import from_origin import xarray as xr import os import matplotlib.pyplot as plt def get_himawari_ftp_past_2_days(user, password): # Данные для подключения по FTP ftp = FTP('ftp.ptree.jaxa.jp') ftp.login(user=user, passwd=password) # Проверка содержимого каталога: /pub/himawari/L2/ARP/031/ # Подробности о каталоге AOD здесь: https://www.eorc.jaxa.jp/ptree/documents/README_HimawariGeo_en.txt overall_path= «/pub/himawari/L3/ARP/031/» directories = overall_path.strip(«/»).split(«/») for directory in directories: ftp.cwd(directory) # Список файлов в целевом каталоге date_month_files = ftp.nlst() # Упорядочивание файлов по убыванию date_month_files.sort(reverse=False) print(«Файлы в целевом каталоге:», date_month_files) # получаем список всех месяцев/дней в пути «/pub/himawari/L3/ARP/031/» за последние 2 месяца limited_months_list = date_month_files[-2:] i=0 # для каждого месяца в limited_months_list перечисляем все дни в for month in limited_months_list: ftp.cwd(month) date_day_files = ftp.nlst() date_day_files.sort(reverse=False) # объединяем каждый элемент списка date_day_file с месяцем : month +»/» + date_day_file list_combined_days_month_inter = [month + «/» + date_day_file for date_day_file in date_day_files] if i ==0: list_combined_days_month= list_combined_days_month_inter i=i+1 else: list_combined_days_month= list_combined_days_month + list_combined_days_month_inter ftp.cwd(«..») # удаляем все элементы, содержащие daily или monthly, из list_combined_days_month list_combined_days_month = [item for item in list_combined_days_month if 'daily' not in item and 'monthly' not in item] # получаем список дней, которые хотим загрузить: в нашем случае последние 2 дня — для NRT limited_list_combined_days_month=list_combined_days_month[-2:] for month_day_date in limited_list_combined_days_month: # переходим в соответствующую директорию ftp.cwd(month_day_date) print(f»directory: {month_day_date}») # получаем список почасовых файлов в каждой директории date_hour_files = ftp.nlst() !mkdir -p ./raw_data/{month_day_date} #для каждого почасового файла в списке for date_hour_file in date_hour_files: target_file_path=f»./raw_data/{month_day_date}/{date_hour_file}» # Загрузка целевого файла — только если он еще не существует if not os.path.exists(target_file_path): with open(target_file_path, «wb») as local_file: ftp.retrbinary(f»RETR {date_hour_file}», local_file.write) print(f»Загружен {date_hour_file} успешно!») else: print(f»Файл уже существует: {date_hour_file}») print(«—————«) # вернуться на 2 шага назад по дереву ftp ftp.cwd(«..») ftp.cwd(«..») def transform_to_tif(): # получить список файлов в папке raw_data month_file_list = os.listdir(«./raw_data») month_file_list # упорядочить month_file_list month_file_list.sort(reverse=False) nb_errors=0 # получить список папок каждого дня только за последние 2 месяца for month_file in month_file_list[-2:]: print(f»——————————————«) print(f»Рассматриваемый месяц: {month_file}») date_file_list=os.listdir(f»./raw_data/{month_file}») date_file_list.sort(reverse=False) # получить список файлов для каждой папки дня for date_file in date_file_list[-2:]: print(f»—————————«) print(f»Рассматриваемый день: {date_file}») hour_file_list = os.listdir(f»/raw_data/{month_file}/{date_file}») hour_file_list.sort(reverse=False) # Обрабатываем каждый почасовой файл в файл tif и преобразуем его в обработанный датафрейм h3 for hour_file in hour_file_list: file_path = f»/raw_data/{month_file}/{date_file}/{hour_file}» hour_file_tif = hour_file.replace(«.nc»,».tif») output_tif = f»/tif/{month_file}/{date_file}/{hour_file_tif}» if os.path.exists(output_tif): print(f»Файл уже существует: {output_tif}») else: try: dataset = xr.open_dataset(file_path, engine='netcdf4') except: # Переходим к следующему почасовому файлу print(f»Ошибка при открытии файла {hour_file} — пропуская «) nb_errors=nb_errors+1 continue # Доступ к определенной переменной variable_name = list(dataset.data_vars.keys())[1] # Объединенный продукт AOT data = dataset[variable_name] # Построение графика данных (если они 2D и совместимы) plt.figure() data.plot() plt.title(f'{date_file}') plt.show() # Извлечение метаданных (замените фактическими координатами из ваших данных, если они доступны) lon = dataset['longitude'] if 'longitude' in dataset.coords else None lat = dataset['latitude'] if 'latitude' in dataset.coords else None # Обработка отсутствующих значений широты/долготы (в примере предполагается равномерно расположенная сетка) if lon is None or lat is None: lon_start, lon_step = -180, 0.05 # Примеры значений lat_start, lat_step = 90, -0.05 # Примеры значений lon = xr.DataArray(lon_start + lon_step * range(data.shape[-1]), dims=['x']) lat = xr.DataArray(lat_start + lat_step * range(data.shape[-2]), dims=['y']) # Определение аффинного преобразования для геопривязки transform = from_origin(lon.min().item(), lat.max().item(), abs(lon[1] — lon[0]).item(), abs(lat[0] — lat[1]).item()) # Сохранение в GeoTIFF !mkdir -p ./tif/{month_file}/{date_file} with rasterio.open( output_tif, 'w', driver='GTiff', height=data.shape[-2], width=data.shape[-1], count=1, # Количество полос dtype=data.dtype.name, crs='EPSG:4326', # Система координат (например, WGS84) transform=transform ) as dst: dst.write(data.values, 1) # Запись данных в полосу 1 print(f»Сохранено {output_tif} успешно!») print(f»{nb_errors} ошибок») get_himawari_ftp_past_2_days(user, password) transform_to_tif()

9) NASA — ФИРМЫ [Особый момент]

Система информации о пожарах для управления ресурсами НАСА (FIRMS) [10] предоставляет информацию о действующих пожарах и тепловых аномалиях, обнаруженных такими приборами, как MODIS и VIIRS, практически в режиме реального времени. Она обеспечивает глобальное покрытие с низкой задержкой (от минут до часов), предоставляя такие атрибуты, как мощность излучения пожара, достоверность и время сбора данных. FIRMS широко используется для мониторинга лесных пожаров, сельскохозяйственного сжигания, управления лесами, а также в качестве косвенного входного параметра для моделирования качества воздуха и рассеивания дыма.

Отлично подходит для: точного определения очагов возгорания, вызывающих скачки качества воздуха, отслеживания источников дымовых потоков и продвижения линии огня, мониторинга пожаров на сельскохозяйственных культурах/в лесу, а также для оперативного реагирования. Легкий доступ через CSV/GeoJSON/Shapefile, картографические тайлы/API, с скользящими потоками данных за 24–72 часа и полными архивами для сезонного анализа.

Как зарегистрироваться и получить доступ к API

  1. Создайте бесплатную учетную запись NASA Earthdata по адресу:
    https://urs.earthdata.nasa.gov
  1. Подтвердите свой адрес электронной почты и войдите в систему, используя новые учетные данные.
  1. Перейдите на сайт компании, которую вы планируете использовать, например:
  • Global FIRMS: https://firms.modaps.eosdis.nasa.gov
  • FIRMS США/Канада: https://firms.modaps.eosdis.nasa.gov/usfs/
  1. Нажмите кнопку «Войти» (в правом верхнем углу) и пройдите аутентификацию, используя ваше имя пользователя и пароль Earthdata. После входа в систему вы сможете:
  • настраивайте отображение карт и параметры загрузки через веб-интерфейс, а также
  • Создавайте или используйте URL-адреса веб-сервисов/API FIRMS, которые учитывают вашу аутентифицированную сессию.
  1. Для доступа по скриптам вы можете вызывать конечные точки загрузки FIRMS или веб-сервисов (например, GeoJSON, CSV) с помощью стандартных инструментов HTTP (например, curl, requests в Python). Если конечная точка требует аутентификации, предоставьте свои учетные данные Earthdata через файл .netrc или сессионные cookie, как и для других сервисов Earthdata.

На практике FIRMS — это удобный способ интегрировать данные о недавних пожарах в систему мониторинга качества воздуха: можно получать ежедневные или почасовые данные о пожарах в регионе, преобразовывать их в GeoDataFrame, а затем сопоставлять с полями ветра, данными о населенных пунктах или сетями датчиков, чтобы понять потенциальное воздействие дыма.

#FIRMS !pip install geopandas rtree shapely import pandas as pd import geopandas as gpd from shapely.geometry import Point import numpy as np import matplotlib.pyplot as plt import rtree # Получение границ Таиланда boundaries_country = gpd.read_file(f'https://github.com/wmgeolab/geoBoundaries/raw/fcccfab7523d4d5e55dfc7f63c166df918119fd1/releaseData/gbOpen/THA/ADM0/geoBoundaries-THA-ADM0.geojson') boundaries_country.plot() # Источник данных в реальном времени: https://firms.modaps.eosdis.nasa.gov/active_fire/ # Ссылки за последние 7 дней: modis_7d_url= «https://firms.modaps.eosdis.nasa.gov/data/active_fire/modis-c6.1/csv/MODIS_C6_1_Southeast_Asia_7d.csv» suomi_7d_url= «https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Southeast_Asia_7d.csv» j1_7d_url= «https://firms.modaps.eosdis.nasa.gov/data/active_fire/noaa-20-viirs-c2/csv/J1_VIIRS_C2_Southeast_Asia_7d.csv» j2_7d_url=»https://firms.modaps.eosdis.nasa.gov/data/active_fire/noaa-21-viirs-c2/csv/J2_VIIRS_C2_SouthEast_Asia_7d.csv» urls = [modis_7d_url, suomi_7d_url, j1_7d_url, j2_7d_url] # Создание пустого GeoDataFrame для хранения объединенных данных gdf = gpd.GeoDataFrame() for url in urls: df = pd.read_csv(url) # Создание столбца геометрии из широты и долготы geometry = [Point(xy) for xy in zip(df['longitude'], df['latitude'])] gdf_temp = gpd.GeoDataFrame(df, crs=»EPSG:4326″, geometry=geometry) # Объединение временного GeoDataFrame с основным GeoDataFrame gdf = pd.concat([gdf, gdf_temp], ignore_index=True) # Фильтрация для сохранения только пожаров в пределах границ страны gdf = gpd.sjoin(gdf, boundaries_country, how=»inner», predicate=»within») # Отображение пожаров на карте frp = gdf[«frp»].astype(float) fig, ax = plt.subplots(figsize=(9,9)) boundaries_country.plot(ax=ax, facecolor=»none», edgecolor=»0.3″, linewidth=0.8) gdf.plot(ax=ax, markersize=frp, color=»crimson», alpha=0.55) ax.set_title(«Пожары в пределах границ страны (размер пузырька = Мощность излучения пожара)») ax.set_axis_off() plt.show()

Типы данных, с которыми вы столкнетесь (и как правильно их читать)

Работа с данными о качестве воздуха редко ограничивается одним аккуратным CSV-файлом. Поэтому полезно знать, с какими типами файлов вы столкнетесь. Вам придется работать с многомерными моделями (NetCDF/GRIB/Zarr), спутниковыми растрами (COG/GeoTIFF), точечными измерениями (CSV/Parquet/GeoParquet) и веб-форматами (JSON/GeoJSON), часто в одном и том же блокноте.

Этот раздел представляет собой краткое руководство по этим форматам и способам их открытия без затруднений.

Запоминать все это не нужно, поэтому можете бегло просмотреть список, а затем вернуться к нему, когда столкнетесь с незнакомым расширением файла.

  1. NetCDF4 / HDF5 (самоописывающиеся научные массивы): широко используются для реанализа, спутниковых данных и моделей. Обладают богатыми метаданными, многомерны (время, уровень, широта, долгота). Обычные расширения: .nc, .nc4, .h5, .hdf5

Читать:

# pip install xarray netCDF4 import xarray as xr ds = xr.open_dataset(«modis_aod_2025.nc») ds = ds.sel(time=slice(«2025-08-01″,»2025-08-07»)) print(ds)

  1. Оптимизированный для облачных вычислений GeoTIFF (COG): растровый формат, оптимизированный для HTTP-запросов диапазона (передача только необходимых данных). Распространен для спутниковых снимков и сеточных продуктов. Обычные расширения: .tif, .tiff

Читать:

# pip install rasterio import rasterio with rasterio.open(«https://example-bucket/no2_mean_2025.tif») as src: window = rasterio.windows.from_bounds(*(-0.3,5.5,0.3,5.9), src.transform) arr = src.read(1, window=window)

  1. JSON (вложенный) и GeoJSON (объекты + геометрия): отлично подходят для API и легковесных геопространственных данных. GeoJSON по умолчанию использует WGS84 (EPSG:4326). Обычные расширения: json, .jsonl, .ndjson, .geojsonl, .ndgeojson

Читать:

# pip install geopandas import geopandas as gpd gdf = gpd.read_file(«points.geojson») # столбцы + геометрия gdf = gdf.set_crs(4326) # обеспечить WGS84

  1. GRIB2 (метеорология, результаты моделирования): Компактный, фрагментированный формат; часто используется CAMS/ECMWF/NWP. Обычные расширения: .grib2, .grb2, .grib, .grb. На практике поставщики данных часто добавляют также суффиксы сжатия, например, .grib2.gz или .grb2.bz2.

Читать:

# pip install xarray cfgrib import xarray as xr ds = xr.open_dataset(«cams_ozone.grib», engine=»cfgrib»)

  1. Parquet и GeoParquet (столбцовый, сжатый): лучше всего подходят для больших таблиц: быстрый выбор столбцов, перенос предикатов вниз, секционирование (например, по дате/городу). GeoParquet добавляет стандарт для геометрических данных. Обычные расширения: .parquet, .parquet.gz

Чтение/Запись:

# pip install pandas pyarrow geopandas geoparquet import pandas as pd, geopandas as gpd df = pd.read_parquet(«openaq_accra_2025.parquet») # только столбцы # Преобразование GeoDataFrame в GeoParquet gdf = gpd.read_file(«points.geojson») gdf.to_parquet(«points.geoparquet») # сохраняет геометрию и CRS

  1. CSV/TSV (текстовые таблицы): Простой, универсальный формат. Слабоват в больших масштабах (медленный ввод-вывод, отсутствие схемы), не поддерживает геометрию. Обычные расширения: .csv, .tsv (иногда также .tab, но реже).

Читать:

# pip install pandas import pandas as pd df = pd.read_csv(«measurements.csv», parse_dates=[«datetime»], dtype={«site_id»:»string»})

  1. Zarr (пошаговый, облачный): идеально подходит для анализа в облаке с параллельным чтением (отлично работает с Dask). Обычное расширение: .zarr (часто это каталог/хранилище с расширением .zarr; иногда упаковывается как .zarr.zip)

Читать:

# pip install xarray zarr s3fs import xarray as xr ds = xr.open_zarr(«s3://bucket/cams_eac4_2025.zarr», consolidated=True)

Примечание: Shapefile (устаревший векторный формат): работает, но ненадежен (много файлов, ограничение на поле в 10 символов). Это устаревший формат, и лучше использовать альтернативы, такие как GeoPackage или GeoParquet.

Выбор правильного формата геопространственных (или научных) файлов имеет важное значение, поскольку это не просто решение о хранении, а напрямую влияет на скорость чтения данных, совместимость инструментов, простоту обмена данными и масштабируемость от настольных рабочих процессов до облачной обработки. Следующая таблица (Таблица 1) представляет собой практическую шпаргалку «формат для решения задач»: для каждой распространенной потребности (от быстрого доступа к API до облачных массивов и веб-карт) указан наиболее подходящий формат, расширения, с которыми вы обычно сталкиваетесь, и основная причина, по которой этот формат подходит. Ее можно использовать в качестве отправной точки по умолчанию при проектировании конвейеров обработки данных, публикации наборов данных или выборе того, что нужно загрузить из внешнего репозитория.

Нуждаться Лучшая ставка Обычное расширение Почему
Журналы в удобочитаемом формате или быстрые дампы API. CSV/JSON .csv, .json (также .jsonl, .ndjson) Повсеместно распространены, легко проверяются.
Большие таблицы (миллионы строк) Паркет/Геопаркет .паркет Быстрое сканирование, сокращение количества столбцов и разбиение на разделы.
Большие растровые изображения по протоколу HTTP КОГ .tif, .tiff Запросы диапазона; полная загрузка невозможна.
Многомерные научные данные NetCDF4/HDF5 .nc, .nc4, .h5, .hdf5 Самоописывающие, единицы/атрибуты
Результаты метеорологической модели GRIB2 .grib2, .grb2, .grib, .grb Компактный, широко поддерживаемый инструментами wx.
Массивы облачного масштаба Зарр .zarr Пошаговое + параллельное выполнение; облачные технологии
Обмениваемый векторный файл Геопакет .gpkg Один ряд; надёжный
Геометрии веб-карт GeoJSON .geojsonl,
.ndgeojson
Простой; изначально разработан для веб-технологий.

Совет: Интересная лекция о STAC и типах данных (особенно GeoParquet): https://github.com/GSA/gtcop-wiki/wiki/June-2025:-GeoParquet,-Iceberg-and-Cloud%E2%80%90Native-Spatial-Data-Infrastructures

Теперь доступно множество открытых каталогов STAC, включая общедоступные конечные точки для оптических, радиолокационных и атмосферных продуктов (например, изображения Landsat и Sentinel от таких поставщиков, как Element 84 Earth Search или Microsoft Planetary Computer). STAC значительно упрощает создание скриптов для «поиска и загрузки всех сцен для этого полигона и временного диапазона», а также интеграцию различных наборов данных в один рабочий процесс.

В заключение — от «где» хранятся данные до «как» их использовать.

e31163a05c8a4fe7f5daf2b9635d8820

Воздух для завтрашнего дня : Мы начали с вопроса «Чем дышат эти дети сегодня?» Эта статья предлагает практический путь и инструменты, которые помогут вам ответить на этот вопрос. Теперь вы знаете, где находятся данные о качестве воздуха на открытом воздухе, включая сети регулирования, датчики местных сообществ, спутниковые измерения и реанализ. Вы также понимаете, что представляют собой эти файлы (GeoJSON, Parquet/GeoParquet, NetCDF/HDF5, COG, GRIB, Zarr) и как получить к ним доступ с помощью компактных, воспроизводимых фрагментов. Цель состоит не только в том, чтобы просто загрузить их; она состоит в том, чтобы создавать обоснованные, быстрые и доступные для обмена анализы, которые будут актуальны завтра .

Достоверную картину местности можно составить за несколько часов, а не недель. От очагов возгорания ( рис. 2 ) до расположения школьных маршрутов ( рис. 1 ) можно создать карты распространения огня ( рис. 3 ).

Далее: Мы представим реальную модель качества воздуха, разработанную нами в страновом офисе ЮНИСЕФ в Лаосе совместно с группой по обработке данных ЮНИСЕФ EAPRO. Мы рассмотрим открытый, сквозной конвейер моделирования. Когда появятся потоки данных о качестве воздуха на уровне земли, мы расскажем, как можно разработать признаки, скорректировать смещение, нормализовать данные и создать модель с практической поверхностью, которую региональный респондент сможет использовать уже завтра утром.

Авторы: Притхвирадж Праманик, AQAI; Уго Руис Верастеги, Энтони Моклер, Джудит Ханан, Frontier Data Lab; Рисдианто Ираван, ЮНИСЕФ EAPRO; Сохейб Абдалла, Эндрю Данбрэк, страновой офис ЮНИСЕФ в Лаосской Народно-Демократической Республике; Халим Джун, Даниэль Альварес, Шейн О'Коннор, Управление инноваций ЮНИСЕФ;

Источник: towardsdatascience.com

✅ Найденные теги: Воздух, Данные, Качество, Код, Ландшафт, новости

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.
Спутник исследует черную дыру в космосе, испускающий световой луч.
Пикачу использует электрический разряд на фоне неба.
Черный углеродное волокно с текстурой плетения, отражающий свет.
Круглый экран с изображением замка и горы, рядом электронная плата.
Код на экране компьютера, программирование, интерфейс разработчика.
Статистика использования видеокарт NVIDIA RTX, показывающая изменения за октябрь-февраль.
Макросъемка клетки под микроскопом, текстура и форма на голубом фоне.
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых