【RS】GEE(Python):数据处理
在前面的章节中,我们已经学习了如何加载影像数据。现在,让我们进一步探讨如何在 Google Earth Engine (GEE) 中进行数据处理。数据处理通常包括图像预处理、裁剪、过滤、重采样等操作。
栅格影像的处理
栅格影像处理包括了裁剪、波段选择、重采样、合成等基本操作。这部分以卫星影像为例,介绍 GEE 中如何处理影像数据。
图像裁剪 (Clipping)
裁剪图像是数据处理中常见的步骤,通常我们只需要分析某个特定区域的数据。GEE 提供了 clip
函数,可以根据给定的几何区域裁剪图像。
import ee
import folium# 初始化 Earth Engine
ee.Initialize()# 加载 Landsat 图像
image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318')# 创建几何区域(多边形),用于裁剪图像
region = ee.Geometry.Polygon([[[-122.5, 37.2], [-121.8, 37.7], [-121.8, 37.2]]
])# 裁剪图像到指定区域
clipped_image = image.clip(region)# 定义可视化参数(RGB波段)
vis_params = {'bands': ['B4', 'B3', 'B2'] # 红、绿、蓝波段
}# 定义添加 Earth Engine 图层到 folium 地图的函数
def add_ee_layer(self, ee_image_object, vis_params, name):"""将 Earth Engine 图像添加到 folium 地图中。参数:self: folium 地图对象ee_image_object: 需要添加的 Earth Engine 图像vis_params: 可视化参数(波段选择等)name: 图层名称"""map_id_dict = ee.Image(ee_image_object).getMapId(vis_params)folium.raster_layers.TileLayer(tiles=map_id_dict['tile_fetcher'].url_format, # 获取图像的 URL 模板attr='Google Earth Engine', # 数据来源name=name, # 图层名称overlay=True, # 叠加到现有图层control=True # 在图层控制中显示).add_to(self)# 将自定义的图层添加函数绑定到 folium.Map 类
folium.Map.add_ee_layer = add_ee_layer# 创建 folium 地图并添加裁剪后的 Landsat 图像
map = folium.Map(location=[37.5, -122.3], zoom_start=10) # 设置初始中心点和缩放级别
map.add_ee_layer(clipped_image, vis_params, 'Clipped Landsat Image') # 添加裁剪后的图像层# 显示地图
map
clip
:用于根据指定的几何形状裁剪图像,使其只保留感兴趣区域的数据。ee.Geometry.Polygon
:定义了一个多边形区域作为裁剪的边界。
裁剪图像后,只剩下指定区域的数据,这对于更高效的数据处理非常重要。
选择波段 (Band Selection)
卫星影像通常包含多个波段,每个波段记录了不同波长范围的反射率。我们可以通过选择波段来提取特定的信息。例如,Landsat 8 影像包括可见光、红外和热红外波段,下面介绍如何选择特定波段进行处理。
# 选择图像的红色、绿色和蓝色波段
selected_bands = image.select(['B4', 'B3', 'B2'])# 添加选择后的波段图像到地图
map.add_ee_layer(selected_bands, vis_params, 'Selected Bands')# 显示地图
map
select
:选择图像中的指定波段,可以是单个波段或多个波段的组合。B4, B3, B2
:分别表示红色、绿色和蓝色波段。
通过波段选择,我们可以聚焦于影像的特定部分,如植被、土壤或水体的反射特性。
图像重采样 (Resampling)
重采样用于改变影像的空间分辨率。GEE 提供了多种重采样方法,如最近邻重采样 (nearest
) 和双线性重采样 (bilinear
)。以下是如何对影像进行重采样的示例:
# 对图像进行双线性重采样
resampled_image = image.resample('bilinear')# 添加重采样后的图像到地图
map.add_ee_layer(resampled_image, vis_params, 'Resampled Image')# 显示地图
map
resample
:用于设置图像的重采样方法,bilinear
表示双线性插值。nearest
:最近邻插值,通常用于分类影像。
重采样后,影像的分辨率可能会发生变化,这可以用于不同分辨率数据的融合或在不同尺度上的分析。
多图像合成 (Image Composite)
在实际应用中,通常需要将多时相的影像合成一个新的影像,去除云层或其他噪声。GEE 中的 ImageCollection
对象允许对多个影像进行合成。
# 创建一个 Landsat 影像集合
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1') \.filterBounds(region) \.filterDate('2020-01-01', '2020-12-31') # 使用中值合成方法去除云层
composite = collection.median()# 添加合成影像到地图
map.add_ee_layer(composite, vis_params, 'Landsat Composite') # 添加图层控制
folium.LayerControl().add_to(map) # 显示地图
map
ImageCollection
:表示影像的集合,可以根据时间范围或空间范围进行过滤。median
:对影像集合使用中值合成的方法,去除异常值,如云层。
合成影像对于长期时间序列分析非常有用,例如研究某地区的植被变化趋势。
矢量数据的处理
矢量数据通常代表离散的地理对象,如边界、道路、河流等。在 GEE 中,矢量数据处理包括几何操作、空间过滤和属性查询等。
空间过滤 (Spatial Filtering)
空间过滤可以帮助我们在某一特定区域内筛选矢量数据。例如,以下代码展示了如何根据地理位置筛选一个国家的边界。该地图为问题地图,请勿在生产实践中使用!!!
import ee # 导入 Google Earth Engine API
import folium # 导入 Folium 库,用于绘制交互式地图# 初始化 Earth Engine
ee.Initialize()# 创建一个 Folium 地图,设置中国中心点及缩放级别
map = folium.Map(location=[37.5, 104.0], zoom_start=5)# 加载 FAO 全球国家边界数据集
countries = ee.FeatureCollection('FAO/GAUL/2015/level0')# 过滤出中国边界,'ADM0_NAME' 字段用于匹配国家名称
china = countries.filter(ee.Filter.eq('ADM0_NAME', 'China'))# 将中国边界数据转换为 GeoJSON 格式,用于 folium 绘图
china_geojson = china.getInfo()# 将中国边界的 GeoJSON 数据添加到 folium 地图
folium.GeoJson(china_geojson, # GeoJSON 数据name='China Boundary', # 图层名称style_function=lambda x: { # 设置样式'color': 'blue', # 边界线颜色'weight': 2, # 边界线宽度'fillOpacity': 0.1 # 填充透明度,确保区域具有透明效果}
).add_to(map)# 添加图层控制,使用户可以在地图上切换图层
folium.LayerControl().add_to(map)# 显示地图
map
filter
:根据特定的条件筛选出符合条件的几何对象或特征集。ee.Filter.eq
:用于进行属性等值比较,筛选出名称为 ‘China’ 的国家边界。
几何操作 (Geometric Operations)
GEE 支持多种几何操作,如缓冲区生成、相交、合并等。以下代码展示了如何生成一个几何对象的缓冲区:
import ee # 导入 Google Earth Engine API
import folium # 导入 Folium 库,用于绘制交互式地图# 初始化 Earth Engine,确保所有 Earth Engine 操作能正常执行
ee.Initialize()# 创建一个 Folium 地图,设置中心点为中国某位置,并指定缩放级别为6
map = folium.Map(location=[30, 120], zoom_start=6)# 创建一个点对象,指定坐标为 (120, 30),这是浙江省附近的一个点
point = ee.Geometry.Point([120, 30])# 生成该点的10公里缓冲区,buffer 参数单位为米,因此 10 公里等于 10000 米
buffer = point.buffer(10000)# 将缓冲区转换为 GeoJSON 格式,以便用于在 folium 地图上显示
buffer_geojson = buffer.getInfo()# 使用 folium.GeoJson 将生成的缓冲区添加到地图中
folium.GeoJson(buffer_geojson, # GeoJSON 数据name='Buffer Zone', # 图层名称为 "Buffer Zone"style_function=lambda x: { # 定义缓冲区的样式'color': 'red', # 缓冲区边界颜色为红色'weight': 2, # 边界线宽度为 2'fillOpacity': 0.4 # 填充透明度为 0.4,确保区域内部可见}
).add_to(map)# 添加图层控制器,允许用户切换查看不同的图层
folium.LayerControl().add_to(map)# 显示地图
map # 在 Jupyter Notebook 或相关环境中显示地图
buffer
:生成几何对象的缓冲区,单位为米。ee.Geometry.Point
:创建一个点对象,可以代表特定的地理位置。
几何操作对于空间分析非常有用,例如计算某个点周围的影响区域或分析相邻几何对象的关系。
矢量数据属性查询
矢量数据中通常包含丰富的属性信息,如行政区划的名称、人口等。我们可以对这些属性进行查询和处理。
# 获取中国边界的属性信息
china_properties = china.first().toDictionary()# 打印属性信息
print(china_properties.getInfo())
first
:返回矢量集合中的第一个特征。toDictionary
:将特征的属性转化为字典格式,方便查询和处理。
通过属性查询,我们可以深入挖掘矢量数据的属性字段,用于统计分析或分类。
气候数据的处理与分析
气候数据通常以时间序列栅格数据的形式提供,在分析时,我们
可能需要计算气候变量的均值、累积量或趋势。以下以 ERA5 数据为例,介绍气候数据的处理与分析。
计算气候变量的年均值
import ee # 导入 Google Earth Engine API
import folium # 导入 Folium 库,用于绘制交互式地图# 初始化 Earth Engine,确保所有操作能正常执行
ee.Initialize()# 创建一个 Folium 地图,中心点设在美国加州,初始缩放级别为 10
map = folium.Map(location=[37.5, -122.3], zoom_start=10)# 定义将 Earth Engine 图像添加到 Folium 地图的函数
def add_ee_layer(self, ee_image_object, vis_params, name):"""将 Earth Engine 图像添加到 folium 地图中。参数:self: folium 地图对象ee_image_object: 需要添加的 Earth Engine 图像vis_params: 可视化参数(如波段选择等)name: 图层名称"""map_id_dict = ee.Image(ee_image_object).getMapId(vis_params) # 获取图像的 Map IDfolium.raster_layers.TileLayer(tiles=map_id_dict['tile_fetcher'].url_format, # 获取图像的 URL 模板attr='Google Earth Engine', # 数据来源name=name, # 图层名称overlay=True, # 叠加到现有图层control=True # 在图层控制中显示).add_to(self)# 将自定义函数添加到 folium.Map 类中
folium.Map.add_ee_layer = add_ee_layer# 加载 ERA5 气候数据集并筛选2020年的数据,选择总降水量字段
era5 = ee.ImageCollection('ECMWF/ERA5/DAILY') \.filterDate('2020-01-01', '2020-12-31') \.select('total_precipitation')# 计算年平均降水量图像
annual_mean_precip = era5.mean()# 设置可视化参数
vis_params = {'min': 0, # 最小值'max': 0.01, # 最大值'palette': ['blue', 'purple', 'cyan'] # 色带,表示不同的降水量
}# 使用自定义函数将年均降水量图像添加到地图中
map.add_ee_layer(annual_mean_precip, vis_params, 'Annual Mean Precipitation')# 添加图层控制,允许用户切换查看不同的图层
folium.LayerControl().add_to(map)# 显示地图
map # 在 Jupyter Notebook 或相关环境中显示地图
mean
:对时间序列进行均值计算,生成一个新的影像。
计算气候数据的累积量
在气候分析中,累积量计算是常用的方法之一。例如,对于降水数据,我们可能需要计算某一时间段内的累积降水量。下面以 ERA5 数据集为例,展示如何计算年内的累积降水量。
import ee # 导入 Google Earth Engine API
import folium # 导入 Folium 库,用于绘制交互式地图# 初始化 Earth Engine,确保所有操作能正常执行
ee.Initialize()# 创建一个 Folium 地图,中心点设在美国加州,初始缩放级别为 10
map = folium.Map(location=[37.5, -122.3], zoom_start=10)# 定义将 Earth Engine 图像添加到 Folium 地图的函数
def add_ee_layer(self, ee_image_object, vis_params, name):"""将 Earth Engine 图像添加到 Folium 地图中。参数:self: folium 地图对象ee_image_object: 需要添加的 Earth Engine 图像vis_params: 可视化参数(如波段选择等)name: 图层名称"""map_id_dict = ee.Image(ee_image_object).getMapId(vis_params) # 获取图像的 Map IDfolium.TileLayer(tiles=map_id_dict['tile_fetcher'].url_format, # 获取图像的 URL 模板attr='Google Earth Engine', # 数据来源name=name, # 图层名称overlay=True, # 叠加到现有图层control=True # 在图层控制中显示).add_to(self)# 将自定义函数添加到 folium.Map 类中
folium.Map.add_ee_layer = add_ee_layer# 加载 ERA5 降水数据集,筛选出 2020 年的数据,并选择总降水量字段
era5 = ee.ImageCollection('ECMWF/ERA5/DAILY') \.filterDate('2020-01-01', '2020-12-31') \.select('total_precipitation')# 计算全年累积降水量
annual_precip_total = era5.sum()# 设置可视化参数
precip_vis_params = {'min': 0, # 最小值'max': 1, # 最大值(单位为米)'palette': ['lightblue', 'blue', 'darkblue'] # 色带,表示不同的降水量
}# 使用自定义函数将全年累积降水量图像添加到地图中
map.add_ee_layer(annual_precip_total, precip_vis_params, 'Annual Precipitation Total')# 添加图层控制器,允许用户切换查看不同图层
folium.LayerControl().add_to(map)# 显示地图
map # 在 Jupyter Notebook 或相关环境中显示地图
sum
:对时间序列中的每个像素进行累加,生成累积量影像。total_precipitation
:ERA5 数据中的降水量变量,以米为单位。
计算累积量可以帮助我们理解特定时间段内的总气候影响,例如研究某地的年降水量是否异常。
总结
通过本教程的学习,我们已经详细介绍了在 Google Earth Engine 中进行数据处理的主要步骤和方法。涵盖了栅格影像的预处理、矢量数据的操作、气候数据的分析。Google Earth Engine 提供了强大的工具,可以处理各种类型的地理空间数据,并进行复杂的分析和建模。
随着你的深入探索,你可以将这些基础操作与更高级的分析结合起来,解决实际的环境监测、土地覆盖变化、气候变化等问题。
相关文章:
【RS】GEE(Python):数据处理
在前面的章节中,我们已经学习了如何加载影像数据。现在,让我们进一步探讨如何在 Google Earth Engine (GEE) 中进行数据处理。数据处理通常包括图像预处理、裁剪、过滤、重采样等操作。 栅格影像的处理 栅格影像处理包括了裁剪、波段选择、重采样、合成…...

非线性磁链观测器推导
<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> 电机方程 电压方程 磁链方程 定义状态变量和输出变量 非线性观测器方程 电角度的计算--锁相环 锁相环调参 电机…...
什么时机用mysql,什么时机用redis,什么时机用本地内存
mysql 的 buffer pool 也是存在内存中,redis 的数据也是存在内存中,为什么不直接存在 mysql 里? 1、数据结构和访问方式 Redis 是一个内存数据库,专门为高效的读写性能而设计。它支持多种数据结构(如字符串、列表、哈…...

Redis八股
缓存 缓存穿透 当查询一个不存在的数据,mysql查询不到数据,无法写入缓存,导致每次都请求数据库 解决方法 缓存空数据,当查询结果未空,将结果进行缓存。 简单但是会消耗内存,而且会出现不一致情况。布隆…...

vue3--通用 popover 气泡卡片组件实现
背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …...

Bluetooth Channel Sounding中关于CS Step及Phase Based Ranging相应Mode介绍
目录 BLE CS中Step定义 BLE CS中交互的数据包/波形格式 BLE CS中Step的不同Mode BLE CS中Step的执行过程 Mode0介绍 Mode0 步骤的作用 Mode0步骤的执行过程 Mode0步骤的执行时间 Mode0步骤的时间精度要求 Mode2介绍 Mode2步骤的作用和执行过程 Mode2步骤的执行时间 B…...
简易STL实现 | Queue 的实现
封装: std::queue 在底层容器的基础上 提供了封装。默认情况下,std::queue 使用 std::deque 作为其底层容器,但也可以配置为使用 std::list 或 其他符合要求的容器 时间复杂度: 入队和出队操作 通常是 常数时间复杂度(…...

【hot100-java】LRU 缓存
链表篇 灵神题解 class LRUCache {private static class Node{int key,value;Node prev,next;Node (int k,int v){keyk;valuev;}}private final int capacity;//哨兵节点private final Node dummynew Node(0,0);private final Map<Integer,Node> keyToNode new HashMap&l…...

Centos7安装ZLMediaKit
一 获取代码 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init git submodule update --init 命令用于初始化和更新 Git 仓库中的子模块(submodules)。这个命令在 Git 仓库中包含对其他 Git 仓库作为依赖时…...

面试问我LLM中的RAG,咱就是说秒过!!!
前言 本篇文章涉及了 RAG 流程中的数据拆分、向量化、查询重写、查询路由等等,在做 RAG 的小伙伴一定知道这些技巧的重要性。推荐仔细阅读,建议收藏,多读几遍,好好实践。 本文是对检索增强生成(Retrieval Augmented …...
python程序操作pdf
python代码进行多个图片合并为pdf: #python代码进行多个图片合并为pdf: from PIL import Image from fpdf import FPDF import osdef images_to_pdf(image_paths, output_pdf, quality85):"""将多个图片合并为一个PDF文件,并…...

【Python报错】ImportError: DLL load failed while importing _network: 找不到指定的模块。
【Python报错】ImportError: DLL load failed while importing _network: 找不到指定的模块。 问题描述报错原因解决方案参考 问题描述 此段Python代码(在Conda环境下运行)昨天还能运行,但在我手痒更新conda(我有罪)之…...

外包干了5天,技术明显退步
我是一名本科生,自2019年起,我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定,但日复一日的重复性工作让我逐渐陷入了舒适区,失去了前进的动力。两年的时光匆匆流逝,我却在原地踏步,技术没有丝毫…...

正则表达式 | Python、Julia 和 Shell 语法详解
正则表达式在网页爬虫、脚本编写等众多任务中都有重要的应用。为了系统梳理其语法,以及 Python、Julia 和 Shell 中与正则表达式相关的工具,本篇将进行详细介绍。 相关学习资源:编程胶囊。 基础语法 通用语法 在大多数支持正则表达式的语…...

JavaScript全面指南(一)
🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南(一) 1、介绍一下JS的内置类型有哪些? 基本数据类型…...
docker-compose与docker
“docker-compose” 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个名为 docker-compose.yml 的配置文件来描述应用程序的服务、网络和卷,然后通过简单的命令就可以管理整个应用。 以下是一些常用的 docker-compose 命令及其用法: 启动…...
DDPM浅析
在机器学习和人工智能领域,生成模型一直是一个备受关注的研究方向。近年来,一种新型的生成模型——扩散概率模型(Diffusion Probabilistic Models,简称DDPM)引起了广泛的关注。本文将探讨DDPM的原理、优势以及应用。 …...

力扣刷题-算法基础
hello各位小伙伴们,为了进行算法的学习,小编特意新开一个专题来讲解一些算法题 1.移除元素. - 力扣(LeetCode) 本题大概意思是给定一个数组和一个数val删除与val相同的元素,不要改变剩余元素的顺序,最后返回剩余元素的个数。 我们在这里使用双指针,这里的双指针并不是…...
理解 Python 中的 Hooks 和装饰器
Python 中的 hooks 和装饰器,虽然它们看起来都有些魔法加成,但实际上各有妙用。下面看看他们到底是做什么的吧。 什么是 Hooks? Hooks 是指在某些操作或事件发生时,可以将自定义的代码插入和执行的一种机制。它们常用于扩展和修…...
Android 原生程序使用gdb, addr2line, readelf调试
Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 一 gdb1. 原生程序添加调试符号2. 主机上adb push 编译好的原生程序到设备3. 设备上使用gdbserver运行原生程序4. 主机上设置adb端口转发5. 主机上运行gdb调试 二 addr2line三 readelf 一 gdb GDB(GNU…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...