【RS】GEE(Python):影像加载

遥感影像加载是遥感数据处理工作流中的重要步骤之一,特别是在使用 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

通过以上步骤,便可以加载和显示多种遥感数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值