<think>我们使用Google Earth Engine (GEE)的Python API来提取特定区域的PM2.5数据。以下是详细步骤:
### 1. 安装必要的库
确保已安装`earthengine-api`和`geemap`。可以使用以下命令安装:
```bash
pip install earthengine-api geemap
```
### 2. 身份验证和初始化
在开始之前,需要进行GEE身份验证和初始化:
```python
import ee
# 触发身份验证流程(只需第一次运行或令牌过期时)
ee.Authenticate()
# 初始化Earth Engine
ee.Initialize()
```
### 3. 定义感兴趣区域(ROI)
我们可以通过多种方式定义ROI,例如:
- 使用经纬度坐标手动绘制矩形
- 导入已有的矢量边界(如GeoJSON)
- 在地图上交互式绘制
#### 示例1:使用矩形区域
```python
# 定义一个矩形区域(经度,纬度)
roi = ee.Geometry.Rectangle([116.0, 39.0, 117.0, 40.0]) # 北京附近
```
#### 示例2:交互式选择区域(使用geemap)
```python
import geemap
Map = geemap.Map()
Map.centerObject(ee.Geometry.Point([116.0, 39.0]), 8) # 中心点和缩放级别
Map
```
然后使用地图绘制工具(如矩形绘制)选择区域,并获取该区域的几何对象:
```python
# 假设已经绘制了一个矩形,名称为'ROI'
roi = Map.draw_last_feature.geometry() # 注意:运行前需先绘制
```
### 4. 加载PM2.5数据集
GEE提供了多个PM2.5数据集。这里我们使用全球高分辨率PM2.5数据集(Global Annual PM2.5 Grids):
```python
# 加载数据集(示例数据集,具体名称需查阅GEE数据目录)
pm25_dataset = ee.ImageCollection("NASA/ORNL/DAYMET_V3/annual/pm25")
```
注意:请根据实际需求选择合适的数据集。例如,如果需要月数据,可以选择其他数据集。
### 5. 过滤时间和区域
假设我们提取2010年到2020年的数据:
```python
# 设置时间范围
start_date = '2010-01-01'
end_date = '2020-12-31'
# 过滤时间
filtered_pm25 = pm25_dataset.filterDate(start_date, end_date)
# 过滤区域
filtered_pm25 = filtered_pm25.filterBounds(roi)
```
### 6. 计算区域统计值(可选)
如果我们只需要区域内的统计值(如均值),可以:
```python
# 定义一个缩减区域(使用roi几何)和缩减尺度(单位:米)
scale = 1000 # 根据数据集分辨率设定
# 计算每幅图像的均值
def calculate_mean(image):
mean_dict = image.reduceRegion(
reducer=ee.Reducer.mean(),
geometry=roi,
scale=scale,
maxPixels=1e10
)
# 返回图像及其均值,并保留时间信息
return image.set(mean_dict).set('date', image.date().format('YYYY-MM-dd'))
# 映射到整个图像集合
stats_collection = filtered_pm25.map(calculate_mean)
# 获取统计信息列表
stats_list = stats_collection.aggregate_array('pm25').getInfo()
dates_list = stats_collection.aggregate_array('date').getInfo()
# 打印结果
for date, value in zip(dates_list, stats_list):
print(f"Date: {date}, PM2.5 mean: {value}")
```
### 7. 导出为CSV(如果需要详细信息)
如果我们想导出整个区域的时间序列数据(如每幅图像的均值):
```python
# 将集合转换为FeatureCollection(用于导出)
export_collection = stats_collection.map(
lambda image: ee.Feature(None, {
'date': image.get('date'),
'pm25_mean': image.get('pm25')
})
)
# 导出到Google Drive
task = ee.batch.Export.table.toDrive(
collection=export_collection,
description='PM25_export',
fileFormat='CSV'
)
task.start()
```
### 8. 导出图像(如果需要整个区域的图像数据)
```python
# 选择需要导出的图像(例如第一幅)
first_image = filtered_pm25.first()
# 导出到Google Drive
task = ee.batch.Export.image.toDrive(
image=first_image.select('pm25'), # 选择PM2.5波段
description='PM25_image_export',
scale=1000, # 分辨率
region=roi,
fileFormat='GeoTIFF'
)
task.start()
```
### 注意事项:
1. 数据集名称:上述示例使用了`NASA/ORNL/DAYMET_V3/annual/pm25`,但实际上GEE中可能有多个PM2.5数据集,请根据需求选择。例如:
- `MODIS/061/MCD19A2_GRANULES`(气溶胶光学厚度,可转换为PM2.5)
- `COPERNICUS/S5P/OFFL/L3_AER_AI`(哨兵5P气溶胶指数)
- 或者使用GHAP(Global High-Resolution PM2.5)数据集(如果可用)
2. 分辨率:导出的图像分辨率(`scale`参数)应至少等于数据集的分辨率,否则会重采样。
3. 区域大小:区域不能太大,否则在计算统计值时会超出计算限制。可以使用`maxPixels`参数调整。
### 完整代码示例(矩形区域)
```python
import ee
import geemap
# 初始化
ee.Authenticate()
ee.Initialize()
# 定义区域(示例:北京矩形)
roi = ee.Geometry.Rectangle([116.0, 39.0, 117.0, 40.0])
# 加载PM2.5数据集(示例数据集,请替换为实际数据集)
pm25 = ee.ImageCollection("NASA/ORNL/DAYMET_V3/annual/pm25")
# 过滤时间和区域
filtered = pm25.filterDate('2010-01-01', '2020-12-31').filterBounds(roi)
# 计算区域均值(时间序列)
def calculate_mean(image):
mean = image.reduceRegion(ee.Reducer.mean(), roi, 1000, maxPixels=1e10)
return image.set(mean).set('date', image.date().format('YYYY-MM-dd'))
collection = filtered.map(calculate_mean)
# 获取结果
dates = collection.aggregate_array('date').getInfo()
pm25_means = collection.aggregate_array('pm25').getInfo()
# 打印
for d, p in zip(dates, pm25_means):
print(f"{d}: {p}")
# 导出到Google Drive(可选)
# 参考步骤7或8
```
### 参考文献
Google Earth Engine提供了强大的云端处理能力,可以极大地减少本地数据处理负担[^1]。
§§相关问题§§
1. Google Earth Engine中有哪些可用的PM2.5数据集?
2. 如何将导出的PM2.5数据在Python中进行可视化?
3. 如何处理Google Earth Engine任务执行失败的问题?
4. 如何使用GEE Python API提取长时间序列的PM2.5数据并进行趋势分析?
</think>要使用 Google Earth Engine Python API 提取特定区域的 PM2.5 数据,遵循以下步骤:
### 1. 环境配置和数据加载
```python
import ee
import geemap
import pandas as pd
# 身份验证和初始化
ee.Authenticate()
ee.Initialize(project='your-project-id') # 替换为你的GEE项目ID
# 加载PM2.5数据集(示例使用全球高分辨率数据集)
pm25_collection = ee.ImageCollection('NASA/ORNL/DAYMET_V3/annual/pm25')
```
### 2. 定义感兴趣区域(ROI)
```python
# 方法1:坐标点定义矩形区域(北京示例)
roi = ee.Geometry.Rectangle([116.0, 39.0, 117.0, 40.0])
# 方法2:交互式地图选择
Map = geemap.Map(center=[40, 116], zoom=6)
Map.add_layer(pm25_collection.first(), {'min': 0, 'max': 100}, 'PM2.5')
Map
# 在地图上绘制多边形后获取区域
# roi = Map.draw_last_feature.geometry()
```
### 3. 时间范围筛选和时间序列提取
```python
# 设置时间范围(2010-2020年)
filtered = pm25_collection.filterDate('2010-01-01', '2020-12-31')
# 创建提取PM2.5均值的函数
def extract_pm25_mean(image):
mean_dict = image.reduceRegion(
reducer=ee.Reducer.mean(),
geometry=roi,
scale=1000, # 分辨率
maxPixels=1e9
)
return image.set(mean_dict).set('date', image.date().format('YYYY-MM-dd'))
# 应用函数并获取结果
stats_collection = filtered.map(extract_pm25_mean)
stats_list = stats_collection.aggregate_array('pm25').getInfo()
dates_list = stats_collection.aggregate_array('date').getInfo()
# 转换为DataFrame
pm25_df = pd.DataFrame({'Date': dates_list, 'PM2.5': stats_list})
```
### 4. 结果导出
```python
# 导出到CSV
pm25_df.to_csv('pm25_data.csv', index=False)
# 导出为地理栅格数据(可选)
task = ee.batch.Export.image.toDrive(
image=filtered.mean().clip(roi),
description='PM25_export',
scale=1000,
region=roi,
fileFormat='GeoTIFF'
)
task.start()
```
### 5. 可视化(可选)
```python
# 时间序列图
pm25_df.plot(x='Date', y='PM2.5', title='年度PM2.5变化趋势')
# 空间分布图
annual_mean = filtered.mean()
vis_params = {'min': 0, 'max': 100, 'palette': ['blue','green','yellow','red']}
Map.add_layer(annual_mean.clip(roi), vis_params, 'PM2.5 Annual Mean')
Map
```
### 关键说明:
1. **数据集选择**:
- 使用 `NASA/ORNL/DAYMET_V3/annual/pm25` 获取年度数据
- 其他选项:
- `MODIS/061/MCD19A2_GRANULES`(气溶胶光学厚度)
- `COPERNICUS/S5P/OFFL/L3_AER_AI`(哨兵5P气溶胶指数)
2. **参数调整**:
- `scale` 应与数据集分辨率匹配(通常1000-10000米)
- 大区域需增加 `maxPixels` 参数值
3. **提取模式**:
- 区域统计(均值/最大值等)
- 逐像素提取(导出为栅格)
- 时间序列分析
Google Earth Engine 提供强大的云端处理能力,可高效处理全球环境数据[^1]。