【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 ID
    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

# 加载 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 ID
    folium.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 提供了强大的工具,可以处理各种类型的地理空间数据,并进行复杂的分析和建模。

随着你的深入探索,你可以将这些基础操作与更高级的分析结合起来,解决实际的环境监测、土地覆盖变化、气候变化等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值