遥感影像加载是遥感数据处理工作流中的重要步骤之一,特别是在使用 Google Earth Engine (GEE) 等平台进行大规模影像分析时。无论你是要进行土地覆盖变化分析、气候变化监测,还是农业评估,影像的选择、加载和可视化都是核心环节。本文将从基础知识到进阶技巧,详细讲解如何在 GEE 中加载遥感影像、进行预处理及可视化。
加载常用遥感影像集合
Earth Engine 提供了大量的影像数据集,包括卫星影像、气候数据、地形数据等。可以通过数据集 ID 直接加载。常见的数据集有:
- Landsat 8:
LANDSAT/LC08/C02/T1
- Sentinel-2:
COPERNICUS/S2
- MODIS:
MODIS/006/MOD13A2
# 加载 Landsat 8 影像集合
landsat_collection = ee.ImageCollection('LANDSAT/LC08/C02/T1')
上述代码会加载整个 Landsat 8 数据集。为了节约资源,通常需要对影像进行过滤。
过滤影像集合:时间与空间约束
加载数据集后,通常会通过时间范围和空间区域来进行过滤,以便专注于感兴趣的地区或时间段。
按时间过滤
# 过滤时间范围为2020年
filtered_collection = landsat_collection.filterDate('2020-01-01', '2020-12-31')
按空间范围过滤
你可以使用 ee.Geometry
定义感兴趣区域,例如用矩形、多边形或点过滤影像。
# 定义感兴趣区域(AOI):一个位于加利福尼亚的矩形
region = ee.Geometry.Polygon([[
[-122.5, 37.0], [-122.5, 38.0], [-121.5, 38.0], [-121.5, 37.0]
]])
# 按区域过滤影像
filtered_collection = filtered_collection.filterBounds(region)
可视化遥感影像
通过 folium 库可以方便地将影像结果显示在交互式地图上。你需要为影像设置可视化参数,例如显示的波段、像素值范围等。
import ee
import folium
# 初始化 Earth Engine API
ee.Initialize()
# 加载 Landsat 8 图像集合,并根据日期和区域进行过滤
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1') \
.filterDate('2020-01-01', '2020-12-31') \
.filterBounds(ee.Geometry.Point([-122.3, 37.9])) # 过滤2020年的图像并过滤特定经纬度区域
# 从过滤后的集合中选择第一幅图像
image = collection.first()
# 选择图像中的指定波段,包括用于质量评估的 QA_PIXEL 波段
selected_bands = image.select(['B4', 'B3', 'B2', 'QA_PIXEL']) # 选择红、绿、蓝和质量波段
# 定义可视化参数
vis_params = {
'min': 0, # 最小像素值
'max': 30000, # 最大像素值
'bands': ['B4', 'B3', 'B2'] # 真实颜色:红、绿、蓝
}
# 创建交互式地图,设置初始位置和缩放级别
map = folium.Map(location=[37.9, -122.3], zoom_start=10)
# 自定义函数:添加 Earth Engine 图层到 Folium 地图
def add_ee_layer(self, ee_image_object, vis_params, name):
map_id_dict = ee.Image(ee_image_object).getMapId(vis_params) # 获取地图ID信息
folium.raster_layers.TileLayer(
tiles=map_id_dict['tile_fetcher'].url_format, # 从地图ID获取图块URL
attr='Google Earth Engine', # 图层属性
name=name, # 图层名称
overlay=True, # 是否为叠加层
control=True # 是否在图层控制中显示
).add_to(self) # 将图层添加到地图
# 扩展 Folium 地图,以便添加 Earth Engine 图层
folium.Map.add_ee_layer = add_ee_layer
# 将选择的图像添加到地图上
map.add_ee_layer(selected_bands, vis_params, 'Landsat Image')
# 显示地图
map
遥感影像的预处理(云掩蔽)
Landsat 和其他遥感影像经常受到云层干扰,因此在分析之前需要对影像进行预处理,云掩蔽是常见步骤。
# Landsat 8 SR 云掩蔽函数
def maskL8sr(image):
# 定义云阴影和云的位掩码
cloud_shadow_bit_mask = (1 << 3) # 云阴影位掩码,在 QA 波段的第 3 位
clouds_bit_mask = (1 << 5) # 云位掩码,在 QA 波段的第 5 位
# 从输入图像中选择 QA 波段
qa = image.select('QA_PIXEL') # 选择像素质量 (pixel_qa) 波段以进行云和云阴影检测
# 创建一个掩膜,标识云和云阴影
mask = qa.bitwiseAnd(cloud_shadow_bit_mask).eq(0).And( # 检测云阴影位是否为 0
qa.bitwiseAnd(clouds_bit_mask).eq(0) # 检测云位是否为 0
)
# 更新图像的掩膜,返回经过云掩蔽的图像
return image.updateMask(mask) # 将掩膜应用于图像,像素值在掩膜为 0 的区域将被掩蔽
# 应用云掩蔽到影像集合
filtered_collection = filtered_collection.map(maskL8sr) # 将 maskL8sr 函数应用于影像集合,进行云掩蔽处理
加载和显示 Landsat 8 影像
通过上述步骤,你可以加载 Landsat 8 数据、进行预处理并将其可视化。下面是完整代码示例:
import ee
import folium
# 初始化 Earth Engine
ee.Initialize()
# 加载 Landsat 8 影像集合
landsat_collection = ee.ImageCollection('LANDSAT/LC08/C02/T1')
# 过滤时间和空间
filtered_collection = landsat_collection.filterDate('2020-01-01', '2020-12-31') \
.filterBounds(ee.Geometry.Point([-122.3, 37.9]))
# Landsat 8 SR 云掩蔽函数
def maskL8sr(image):
# 定义云阴影和云的位掩码
cloud_shadow_bit_mask = (1 << 3) # 云阴影位掩码,在 QA 波段的第 3 位
clouds_bit_mask = (1 << 5) # 云位掩码,在 QA 波段的第 5 位
# 从输入图像中选择 QA 波段
qa = image.select('QA_PIXEL') # 选择像素质量 (pixel_qa) 波段以进行云和云阴影检测
# 创建一个掩膜,标识云和云阴影
mask = qa.bitwiseAnd(cloud_shadow_bit_mask).eq(0).And( # 检测云阴影位是否为 0
qa.bitwiseAnd(clouds_bit_mask).eq(0) # 检测云位是否为 0
)
# 更新图像的掩膜,返回经过云掩蔽的图像
return image.updateMask(mask) # 将掩膜应用于图像,像素值在掩膜为 0 的区域将被掩蔽
# 应用云掩蔽到影像集合
filtered_collection = filtered_collection.map(maskL8sr) # 将 maskL8sr 函数应用于影像集合,进行云掩蔽处理
# 应用云掩蔽
filtered_collection = filtered_collection.map(maskL8sr)
# 获取第一幅影像
first_image = filtered_collection.first()
# 设置可视化参数
vis_params = {
'bands': ['B4', 'B3', 'B2']
}
# 创建地图
map = folium.Map(location=[37.9, -122.3], zoom_start=10)
# 添加自定义函数到 folium
def add_ee_layer(self, ee_image_object, 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,
attr='Google Earth Engine',
name=name,
overlay=True,
control=True
).add_to(self)
folium.Map.add_ee_layer = add_ee_layer
# 将影像添加到地图
map.add_ee_layer(first_image, vis_params, 'Landsat Image')
# 显示地图
map
加载 Sentinel-2、MODIS 数据
加载其他数据集如 Sentinel-2 或 MODIS 的步骤类似。以下是加载 Sentinel-2 的示例:
import ee
import folium
# 初始化 Earth Engine
ee.Initialize()
# 加载 Sentinel-2 数据集
sentinel_collection = ee.ImageCollection('COPERNICUS/S2')
# 过滤时间和区域
filtered_sentinel = sentinel_collection.filterDate('2020-01-01', '2020-12-31') \
.filterBounds(ee.Geometry.Point([-122.3, 37.9]))
# 获取第一幅影像
first_sentinel_image = filtered_sentinel.first()
# 设置可视化参数
vis_params = {
'min': 0,
'max': 3000, # Sentinel-2 的反射率一般归一化在 0-3000 的范围
'bands': ['B4', 'B3', 'B2'] # 使用红色、绿色和蓝色波段以形成真实颜色图像
}
# 创建地图
map = folium.Map(location=[37.9, -122.3], zoom_start=10)
# 添加自定义函数到 folium
def add_ee_layer(self, ee_image_object, 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,
attr='Google Earth Engine',
name=name,
overlay=True,
control=True
).add_to(self)
# 将自定义函数添加到 Folium 地图类
folium.Map.add_ee_layer = add_ee_layer
# 将 Sentinel-2 影像添加到地图
map.add_ee_layer(first_sentinel_image, vis_params, 'Sentinel-2 Image')
# 显示地图
map
通过以上步骤,便可以加载和显示多种遥感数据。