Google earth engine как пользоваться
Технический вопрос: работа с API, проблемы с кодом, воспроизводимые ошибки.
- Как убрать из feature collection объекты со значениями NULL?
- Как соединить feature collections и image collections по месту и дате?
- Почему в моей feature collection ничего нет?
Дискуссионный вопрос: расхождения во мнениях, полемика, дистанционное зондирование, методология.
- Как решить проблему отсутствующих данных в снимках с Landsat 7, вызванных поломкой SLC?
- Как исключить из анализа водные пиксели?
- Почему анализ в ArcGIS и Earth Engine дает разные результаты?
- Похоже, у меня возникает ошибка. Замечают ли ее другие разработчики?
- Поищите ответ в руководстве для разработчиков.
- Поищите ответ в Google. Часто так можно найти ссылки на нужную информацию в результатах, найденных на GIS Stack Exchange.
- Поищите ответ на форуме для разработчиков Earth Engine.
- Посмотрите в редакторе кода примеры скриптов (Scripts >Examples).
GIS Stack Exchange
Технические вопросы задавайте в разделе о геоинформационных системах (ГИС) на Stack Exchange. Это сайт, на котором можно задавать свои вопросы по геоинформационным системам и отвечать на чужие.
Как правильно сформулировать вопрос
НЕПРАВИЛЬНО . Не рекомендуется присылать длинные программы и просить других разработчиков найти в них ошибки.
ПРАВИЛЬНО . Используйте тэг Stack Exchange `google-earth-engine`.
ПРАВИЛЬНО . Найдите маленький пример, воспроизводящий проблему. Сформулируйте ее суть в одном предложении, приведите несколько строчек кода.
В вопросах используется язык разметки Markdown, позволяющий выделять текст полужирным, курсивом и тегами code. Используйте их, чтобы вопрос быстрее читался и лучше воспринимался. Форматирование можно добавлять с помощью кнопок вверху формы вопроса. Также см. руководство по синтаксису Markdown и справку по вопросам в разделе о ГИС на Stack Exchange.
Пример правильной формулировки и разметки вопроса:
Почему ee.Reducer.fixedHistogram() выдает дробный результат? (Earth Engine)
Текст вопроса:
Разметка Markdown
Вид на сайте
Я использую для расчета гистограммы ee.Reducer.fixedHistogram() . Во многих случаях число пикселей в разделе оказывается дробным. Почему так? Я думал, эти значения всегда будут целыми.
Вот мой код. Результаты в таблице гистограммы.
Важно, чтобы другие разработчики могли воспроизвести ваш код. Если для него нужно импортировать какие-либо объекты, пожалуйста, опубликуйте их. Всегда окружайте скрипты тэгами `code`. По возможности добавляйте ссылку на скрипт в редакторе кода.Форум Earth Engine для разработчиков
Дискуссионные и общие вопросы об Earth Engine задавайте на форуме для разработчиков в Google Группах.
Вопрос рекомендуется формулировать так, чтобы читающие его люди могли быстро понять, в чем его суть и входит ли он в пределы их компетенции. Пожалуйста, приведите достаточно информации для полного понимания проблемы. Если вопрос касается кода, добавьте ссылку на скрипт и опубликуйте соответствующие импортируемые объекты. Чтобы поделиться скриптом, нажмите кнопку Get Link (Получить ссылку) вверху редактора кода.
Какую ошибку вы нашли? (Подробности читайте по ссылкам. Чтобы посмотреть примеры, нажмите значок плюса.)
Ошибка в API: проблемы со скриптом, неверные результаты.
- Скрипты не загружаются
- Кнопки не работают
- Интерфейс выглядит необычно
- На странице отсутствуют элементы
- Проблемы во взаимодействии с картой
- Поиск по каталогу данных не работает
Чтобы сообщить об ошибке, пожалуйста, выполните следующие действия:
Редактор кода
Ошибки в Earth Engine могут возникать по разным причинам. Чтобы определить источник проблемы и найти ее решение, пожалуйста, выполните следующие действия:
Запросы наборов данных
Чтобы запросить новый набор данных, пожалуйста, выполните следующие действия:
- Проверьте список уже поданных запросов.
- Если найдете подходящий, пометьте его, нажав на звездочку, и при желании напишите комментарий о том, почему вам нужен этот набор данных.
- Если в списке нет подходящего запроса, подайте его.
Запросы на добавление функций
Чтобы предложить добавить в API или редактор кода новую функцию, пожалуйста, выполните следующие действия:
- Проверьте список уже поданных запросов.
- Если найдете подходящий, пометьте его и при желании напишите комментарий о том, зачем вам нужна эта функция.
- Если в списке нет подходящего запроса, подайте его.
Изменения в работе или выходных данных скрипта
Периодически мы вносим изменения в правила, архитектуру или код API Earth Engine. Иногда скрипты в результате начинают работать по-другому или даже выдавать ошибки. В таких случаях нужно сообщать о проблемах с API. Но сначала проверьте следующее:
- Посмотрите в истории скрипта, точно ли в нем ничего не менялось.
- Удостоверьтесь, что подборка входных данных не изменилась. Например, в ней могли появиться новые изображения – проверьте выбранные даты и содержание подборки.
- Проверьте импортируемые модули и общие объекты, используемые в скрипте. Доступны ли они? Ничего ли в них не менялось?
- Не изменился ли регион или набор данных, с которым работает скрипт?
Затем проверьте, не сообщал ли кто-то о подобной ошибке. Если нет, отправьте свой отчет с информацией по всем пунктам выше.
Отсутствующие объекты в каталоге
Воспользуйтесь этим руководством. В нем рассказывается, как удостовериться в отсутствии нужных объектов в каталоге Earth Engine и сообщить об этом нам.
Помощь другим
У вас есть много способов помочь другим разработчикам:
- Редактируйте вопросы в разделе о ГИС на Stack Exchange и отвечайте на них.
- Отвечайте на вопросы на форуме Earth Engine для разработчиков. .
- Выступайте с докладами об использовании Earth Engine у себя на работе или в университете. Для подготовки можно использовать такие ресурсы:
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Для использования Google Earth Engine нужно иметь аккаунт в Goolge, заполнить регистрационную форму и ждать письма подтверждения. Если окажется, что вместо формы на указанной странице написано нечто вроде "We're glad you're interested. Keep an eye on your inbox . ", то можно сразу приступать к работе.
Самый простой способ познакомится с Earth Engine — начать использовать JavaScript API. Краткое введение в JavaScript есть здесь. Мы постараемся быть еще короче.
Идем в редактор кода (Code Editor) и набираем в центральном окне (New Script)
Жмем Run и получаем в консоли:
Еще немного JavaScript:
- Любая операция в JavaScript оканчивается ; .
- Строка комментария начинается с // .
Все вместе это работает так:
Структуры данных
Для хранения географических данных Earth Engine использует типы Image и Feature . Растровые данные Image — изображения или снимки — состоят из каналов (bands) и словаря свойств. Векторные данные Feature , или попросту векторы, состоят из описания геометрии объекта ( Geometry ) и словаря свойств. Стек снимков (например, временной ряд из снимков) хранится в коллекции снимков ImageCollection . Коллекция векторов Feature называется FeatureCollection .
Основными типами данных в Earth Engine являются Dictionary , List , Array , Date , Number и String . Важно запомнить, что все это — серверные объекты и они не находятся на вашей (клиентской) машине.
Серверные классы
Имена серверных классов начинаются с ee. . Представим себе ee.объект как контейнер для объекта, размещенный на сервере.
В примере мы сначала задаем обычную строку, а затем помещаем ее в серверный контейнер, но можно сделать и все сразу:
Действия
Есть несколько способов сделать что-либо с помощью API:
- вызвать метод, привязанный к объекту;
- вызвать алгоритм;
- вызвать специальную функцию Code Editor;
- создать и вызвать собственную функцию.
Отображение на карте
Карта Map — объект, на котором данные располагаются слоями (layer). Возьмем хранящийся на сервере ( ee.Image ) снимок спутника Landsat-8 и добавим его на карту в качестве нового слоя Map.addLayer() :
Не слишком красиво? Настроим отображение снимка:
В переменной vizParams задаем отображаемые каналы снимка ( bands ). Сейчас нам нужны каналы, соответствующие основным цветам: красному ( 'B4' ), зеленому ( 'B3' ) и синему ( 'B2' ). Обозначения каналов Landsat-8 можно посмотреть здесь.
Параметры min и max указывают границы отражательной способности (reflectance) объектов на поверхности Земли. Границы для каждого из каналов можно задать списком.
Кстати, vizParams — это словарь, то есть объект, состоящий из пар ключ:значение. Ключи здесь: bands , min и max , а значения — список ['B4', 'B3', 'B2'] и числа 0 и 0.3.
Импорт готовой коллекции
В каталоге Earth Engine Data Catalog хранятся готовые коллекции снимков и векторов. Наберем в поле поиска ‘Landsat 8’ и увидим множество вариантов:
Кликнем "USGS Landsat 8 Collection 1 Tier 1 TOA Reflectance". В новом окне появится информация о выбранной коллекции. Нажмем Import, чтобы импортировать ее.
Текст вверху скрипта сообщает, что импортированная коллекция сохранена в серверной переменной imageCollection . Имя переменной можно изменить.
Фильтрация и сортировка коллекции
Выберем из коллекции снимки определенной местности. Для этого в нужном месте поставим на карте маркер. Как только это будет сделано, в скрипт импортируется объект-точка.
Переименуем точку в mypoint
и отфильтруем по ней коллекцию. Применим к коллекции два фильтра: снимки должны покрывать заданную точку ( .filterBounds ) и быть сделаны в определенном интервале дат ( .filterDate ).
Результат отсортируем по мере увеличения облачности и выберем из коллекции первый, самый безоблачный снимок.
Снимки коллекции представляют собой список, хранящийся в ее свойстве features . Снимок удобно выбирать по ID. В нашем первом примере с картой мы так и поступили.
Добавим к скрипту уже известный код визуализации:
Работа с каналами
В качестве примера работы с отдельными каналами снимка, расчитаем NDVI. Для этого создадим и применим функцию:
Как вывести результат на карту мы уже знаем:
Небольшие изменения коснулись диапазона значений NDVI и палитры изображения. Подробнее о настройках отображения снимков написано здесь.
Итогом наших усилий станет карта, состоящая из двух слоев:
Загрузка пользовательских данных
Пользовательские данные загружаются во вкладке Assets левой панели редактора кода:
Загрузим векторные границы города в виде шейпфайла dp.shp в проекции EPSG 4326. Вот как это выглядит:
Загруженные данные импортируем в скрипт:
Дальше совсем просто: обрежем ndvi методом clip и отобразим результат на карте:
Экспорт результатов
Следующий код экспортирует NDVI на Google Drive пользователя:
После выполнения кода во вкладке "Tasks" правой панели редактора будет создана новая задача:
Жмем Run для запуска задачи. Вскоре появится окошко, где можно задать параметры изображения:
Скачанный с Google Drive снимок можно посмотреть в QGIS:
Сохранение скриптов
Сохраняем скрипт нажатием Save в центральной панели редактора:
Всего за время работы я сохранил три скрипта. Это видно во вкладке "Scripts" левой панели редактора:
Для скачивания текущего скрипта выберем из списка Get Link пункт Manage Links
Подтвердим выбор скрипта и нажмем Download:
Что делать дальше?
- Читать документацию на сайте разработчиков.
- Знакомиться с примерами, которые можно найти во вкладке Scripts редактора кода:
Комментарии
Дмитрий Храмов
Компьютерное моделирование и все, что с ним связано: сбор данных, их анализ, разработка математических моделей, софт для моделирования, визуализации и оформления публикаций. Ну и за жизнь немного.
Google Earth это уникальная программа, которая используют комбинированные изображения для формирования единой картинки и представляет ее в виде интерактивной карты Земли. Сшивая вместе более миллиарда спутниковых и воздушных изображений, приложение представляет универсальный инструмент, который позволяет отдельным лицам и группам, отслеживать изменение климата, открывать неизвестные географические и экологические особенности нашей планеты, а так же наглядно фиксировать историю развития человечества.
Этот цифровой картографический инструмент является полезным ресурсом для правительств, частных организаций и отдельных лиц, которым требуется собирать какие-либо географические данные.
Через эту систему Google дал возможность защитникам природы наблюдать за изменениями флоры и фауны, правительствам наблюдать за ростом городов по всему миру, а отдельным людям видеть, как выглядит мир во всех уголках земли.
Кто делает Google Earth?
Базовая технология для Google Earth была первоначально разработана компанией Intrinsic Graphics, игровой компанией, которая создавала визуальные базы данных.
Запущенный в 2005 году, Google Earth стал первой широко доступной интерактивной составной картой нашего мира.
В 2015 году команда разработчиков приступила к планированию обновленной версии, ориентированной на большую доступность.
Представленное в 2017 году, новое приложение доступное через браузер Chrome от Google, предложило 3D-реконструкции зданий и объектов, инструменты аннотации и спутниковые снимки, предоставленные NASA, начиная с 1984 года.
Все это позволило пользователям заглянуть в прошлое и оценить то или иное место с разницей в несколько десятков лет.
По мере получения новых изображений с помощью спутниковых и аэрофотоснимков карта постоянно обновляется, отражая постоянно меняющийся мир.
Как создаются изображения?
Google Earth в цифровом виде объединяет миллиарды изображений, сделанных с помощью спутниковой и аэрофотосъемки, используя области самой высокой четкости с каждой фотографии, чтобы создать самый правдоподобный вид, любой части Земли.
Когда вы впервые открываете Google Earth, вы видите изображение, которое состоит из триллионов пикселей со спутниковых фотографий NASA.
Многие области также были визуализированы в 3D, созданные из тысяч аэрофотоснимков одного и того же места под разными углами. Чтобы собрать подобные фотографии, самолет пролетает множество раз над местом, снимая его со всех сторон. Затем сложный алгоритм моделирует ландшафт и создает 3D-вид, с которым пользователи могут взаимодействовать.
Интересный факт , около 99% пользователей впервые использующие программу, посещают свой район в первую очередь. Используя спутниковые снимки NASA, вы можете просмотреть изменения в вашем уголке мира за последние 30 лет.
Сару Брайерли, сирота из Индии, который вырос в Австралии, смог воссоединиться со своей родной семьей после 25 лет разлуки, следуя географическим маркерам на Google Earth. Он подробно описал эти переживания в своей книге "долгий путь домой" (Viking Australia, 2013), которая была адаптирована в полнометражный фильм "Лев" в 2016 году.
Как Google Earth помогает людям?
Новые функции предоставили группам охраны природы и исследователям инструменты для отслеживания нашего меняющегося мира. Одна из новых функций Earth Engine позволила исследователям визуализировать глобальные модели обезлесения, картографировать изменения водных путей и открывать пока неизвестные области по всему миру.
Новостные организации также широко используют Google Earth через функцию Earth Studio, которая позволяет людям экспортировать видео. Каждый раз, когда вы видите, что картинка приближается или выходит из региона, это Earth Studio.
Один из самых прямых и положительных результатов, которые можно было наблюдать это Индонезия. Группа охраны природы смогла осмотреть незаконно вылавливаемые районы у индонезийского побережья. Исходя из этих данных правительство предприняло необходимые действия по поддержанию экологии по всей береговой линии.
Другая группа охраны природы также обнаружила, неизведанный, нетронутый тропический лес на вершине плато в Мозамбике. Они смогли принять меры, чтобы гарантировать, что местоположение этого леса останется скрытым, и его целостность сохранится.
Google Earth постоянно добавляет новые возможности и развивается, так недавно появилась еще одна, если кто-то пожелает видеть, как меняются береговые линии и географические объекты от глобального потепления, то это теперь тоже возможно.
Сервис Google Earth Engine предоставляет возможность бесплатно работать с огромными массивами пространственной информации. К примеру, в считанные минуты можно получить композитную мозаику (сборное изображение) по миллиону космоснимков. Считая, что каждая сцена (набор спектральных каналов) Landsat 8 занимает в сжатом виде 1 ГБ, при таком запросе обрабатывается объем информации порядка 1 ПБ. И все это доступно бесплатно, быстро, и в любое время. Но есть такое мнение (неправильное), что GEE на бесплатных аккаунтах позволяет обработать и экспортировать лишь небольшие наборы данных. На самом деле, такое впечатление вызвано лишь тем, что программировать на GEE можно начать, даже не читая документации сервиса, а вот извлечь много данных, все еще не читая документации, уже не получится. Далее мы рассмотрим три разных решения задачи векторизации растров и двумя разными способами напишем серверную GEE функцию для вычисления геохэша.
Введение
А вы любите работать на суперкомпьютерах? Я — нет! Несмотря на всю их мощь, на практике зачастую полезность таких монстров совсем не очевидна. Вы можете меня упрекнуть в пристрастности (и это правда — для меня линукс дебиан, конечно, лучший, и убунта как его непутевый потомок тоже на что-то годится), но работать на околодесятилетней давности линуксе центос это совсем перебор (он и свежий-то всегда второй свежести, если глянуть на версии пакетов в нем). Впрочем, это еще цветочки. Чтобы зря не тратить драгоценные ресурсы суперкомпьютеров, на них обычно установлен коммерческий компилятор интел, притом очень мохнатого года (может быть старше самого центоса, который, видимо, когда-то уже обновляли). Но и это еще не беда, в конце концов. Планировщики ресурсов на таких системах часто вызывают оторопь, и есть с чего — при попытке запустить задание, скажем, на 128 ядрах, ничего не происходит, ни запуска задания, ни выдачи какой-либо ошибки от утилиты запуска. В процессе оказывается, что число доступных нам ядер равно двум (всегда удивляюсь, почему так мало по умолчанию дают ресурсов), увеличение квоты требует административной работы (зачастую, уже на этом этапе проще переключиться на какой-нибудь Amazon AWS). Но самое худшее начинается позже. С завидным постоянством бинарные модули того самого вышеупомянутого проприетарного компилятора оказываются установлены в домашней директории давно сгинувшего вместе со своей домашней директорией пользователя, а без них компилятор, естественно, ничего не компилирует. Конечно, другого компилятора в системе нет, ведь его код был бы не столь оптимален… Таким образом, ситуация проясняется — нам нужно найти подходящий центос, установить его где-то локально или в облаке, портировать на него нужный софт, сделать статические сборки (поскольку на целевой системе часть системных пакетов может быть заменена непонятно чем и откуда) и тогда, возможно, мы сможем все это запустить на доступных нам двух ядрах кластера (будет ли когда-нибудь доступно большее их количество — предугадать невозможно, по разным причинам). Я мог бы еще многое добавить, но вы уже понимаете, почему лично я не люблю суперкомпьютеры.
Теперь поговорим про другой суперкомпьютер — облачный и общедоступный сервис Google Earth Engine . Все, что нам потребуется для начала работы — открыть ссылку в браузере и можно начинать писать код на javascript и скачивать данные (кстати, можно туда загрузить еще и свои данные, а еще можно использовать API сервиса для доступа из других сред разработки и языков). При этом сразу же доступно огромное количество данных и вычислительных ресурсов. На мой взгляд, все это вполне заслуживает того, чтобы почитать-таки документацию и научиться работать в сервисе достаточно эффективно. Впрочем, обработка и получение растров достаточно очевидны и так, тем более, что ко всем предоставляемым в сервисе наборам данных есть и примеры их визуализации, а для их скачивания на Google Drive (к примеру) в растровом формате (обычно, GeoTIFF) достаточно функции Export.image.toDrive. А вот работа с векторными данными, тем более, преобразование растров в вектор далеко не так очевидны и в интернет зачастую можно встретить жалобы, что не удается выгрузить несколько сот тысяч записей. Вот специально сейчас проверил — за 21 минуту мне удалось выгрузить 10 миллионов записей на Google Drive в формате GeoJSON, получив файл размером 2Гб. И это далеко не предел для бесплатного аккаунта (не говоря уж о том, что можно выгружать данные по частям).
Преобразование растровых данных сервиса в точечные
Рассмотрим три подхода:
- Простейший способ заключается в создании геометрии, включающей в себя требуемые точки, и получении для них атрибутов растра:
Способ пригоден, в основном, при работе с векторными данными, которые мы хотим дополнить информацией с растров. Здесь мы априори знаем координаты всех точек и получаем для них атрибуты растра.
- Способ поинтереснее предполагает преобразование в список всех пикселов растра, попадающих в указанную область. Извлечем сначала только атрибуты пикселов растра:
Метод рабочий, но с подвохом и ресурсоемкий. В чем же подвох? Дело в том, что в некоторых точках растра атрибутивные данные могут быть пропущены и такие точки исключаются в данном методе. То есть метод возвращает от нуля до полного набора точек, которые попадают в заданную область. И как только мы захотим получить и координаты возвращаемых точек, метод может перестать работать (если в данных есть пропуски, как отмечено выше). Посмотрим код примера:
Функция ee.Image.pixelLonLat() создает растр с координатами каждой точки, который мы добавляем к рабочему растру. Этот код прекрасно работает, но только пока в растровых данных нет пропусков и длины списков координат и атрибутов совпадают. Кроме того, необходимо добавить перепроецирование данных, но эта операция ресурсозатратная и сильно ограничивает наши возможности обработки данных на бесплатном аккаунте:
К счастью, возможно разом решить обе проблемы:
Здесь мы принудительно выполняем бесполезное вычисление на данных (предполагается, что первый канал растра содержит числовые данные), чтобы унифицировать длину списков атрибутов и списков координат, а заодно выполнить перепроецирование растра координат. В итоге, все координаты, для которых не определены атрибуты, будут удалены (это может во много раз уменьшить количество полученных точек), растр координа окажется спроецирован на растр атрибутов и данные будут корректно обработаны. Такое вот трюк, основанный на парадигме отложенных (ленивых) вычислений сервиса.
- И, наконец, самый простой и быстрый способ, который позволит обработать много данных:
Создание собственных серверных функций
Сделаем также простую проверку полученных геохэшей
Да, это та же самая функция, только уже в Javascript-стиле, и требует в пять раз меньше вызовов внутренней функции, что позволит нам обработать примерно впятеро раз больше данных на бесплатном аккаунте.
Заключение
Сегодня мы рассмотрели еще кусочек мозаики из мира пространственной обработки данных. Как обычно, я рассказал о том, что бесплатно доступно каждому и легко может быть повторено, поскольку весь код перед вами. Конечно, и этот код будет доступен на моем GitHub (смотрите репозиторий GIS Snippets в поддиректории GEE). Сразу не выложил, поскольку там надо сначала порядок навести — оказывается, чего у меня только не накопилось за два десятилетия работы с пространственными данными и программирования вообще.
Читайте также: