内容介绍
上期文章介绍如何在网页端导出Landsat8/9数据,本期主要介绍如何在本地GEE-python端导出数据以及出图。
环境配置:Vscode+Jupyter notebook+gee+geemap+python3.10
# 导出所需要的包,注意提前安装ee和geemap
import ee
import os
import numpy as np
import geemap
from geemap.datasets import DATA
from geemap import cartoee
import matplotlib.pyplot as plt
import cartopy
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt
from proplot import rc
# gee初始化认证,如未认证过取消注释
# geemap.set_proxy(port=端口)
# ee.Authenticate()
ee.Initialize()
# 导入矢量数据并显示
start = "2022-10-01";
end = "2022-12-31";
roi = ee.FeatureCollection("projects/ee-用户名/assets/Suzhou1")# 需更改
roi_geometry = roi.geometry()
Map = geemap.Map()
Map.add_tile_layer(
url="https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}&scale=2",
name="HD Google Basemap",
)# 加载谷歌地球高清底图
style = {"color": "#e63e31", "width": 1, "lineType": "solid", "fillColor": "00000000"}
Map.addLayer(roi.style(**style),{},'roi')
Map.centerObject(roi,10)
# 定义函数(比例因子和去云函数)
def applyScaleFactors(image):
opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2)
return image.addBands(opticalBands, None, True)
def cloudRemoval(image):
cloudShadowBitMask = (1 << 4)
cloudsBitMask = (1 << 3)
qa = image.select('QA_PIXEL')
mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0).And(qa.bitwiseAnd(cloudsBitMask).eq(0))
mask2 = image.select("SR_B2").gt(0.2)
return image.updateMask(mask).updateMask(mask2.Not()).toDouble() \
.copyProperties(image) \
.copyProperties(image, ["system:time_start"])
# 调用数据
# 地表反射率
l8_sr= ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') \
.filterBounds(roi) \
.filterDate(start,end) \
.map(applyScaleFactors) \
.map(cloudRemoval) \
.median() \
.clip(roi)
l9_sr= ee.ImageCollection('LANDSAT/LC09/C02/T1_L2') \
.filterBounds(roi) \
.filterDate(start,end) \
.map(applyScaleFactors) \
.map(cloudRemoval) \
.median() \
.clip(roi)
# 表观反射率
l8_toa= ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') \
.filterBounds(roi) \
.filterDate(start,end) \
.median() \
.clip(roi)
l9_toa= ee.ImageCollection('LANDSAT/LC09/C02/T1_TOA') \
.filterBounds(roi) \
.filterDate(start,end) \
.median() \
.clip(roi)
# 结果展示
visualization = {
'bands': ['SR_B4', 'SR_B3', 'SR_B2'],
'min': 0.0,
'max': 0.3,
}
Map.addLayer(l8_sr, visualization, 'Landsat8 True Color (432)')
Map.addLayer(l9_sr, visualization, 'Landsat9 True Color (432)')
Map.addLayer(l8_toa, visualization, 'Landsat8 True Color (432)')
Map.addLayer(l9_toa, visualization, 'Landsat9 True Color (432)')
# TOA全色锐化
hsv1 = l8_toa.select(['B4', 'B3', 'B2']).rgbToHsv()
l8toaimg = ee.Image.cat([
hsv1.select('hue'), hsv1.select('saturation'), l8_toa.select(['B8'])
]).hsvToRgb()
hsv2 = l9_toa.select(['B4', 'B3', 'B2']).rgbToHsv()
l9toaimg = ee.Image.cat([
hsv2.select('hue'), hsv2.select('saturation'), l9_toa.select(['B8'])
]).hsvToRgb()
Map.addLayer(l8toaimg,
{'min': 0, 'max': 0.3, 'gamma': [1.3, 1.3, 1.3]},
'pan-l8toaimg')
Map.addLayer(l9toaimg,
{'min': 0, 'max': 0.3, 'gamma': [1.3, 1.3, 1.3]},
'pan-l9toaimg')
Map
# 数据导出(以Landsat8 SR数据为例)由于GEE下载到本地有50M左右的数据限制,如有需要可以下载导出到云盘geemap.ee_export_image_to_drive()
out_dir = 'E:\\Download'
filename = os.path.join(out_dir, 'landsat8.tif')
output = l8_sr.unmask()
# 多波段单景
# geemap.ee_export_image(
# output, filename=filename, scale=1000, region=roi_geometry, file_per_band=False
# )
# 多波段多景
# geemap.ee_export_image(output, filename=filename, scale=30, region=roi_geometry, file_per_band=True)
# 转换为数组
# img = l8_sr.select(['SR_B4', 'SR_B3', 'SR_B2'])
# aoi = ee.Geometry.Polygon(
# [[[119.915411, 32.047851], [119.915411, 30.76028], [121.382236, 30.76028], [121.382236, 32.047851]]], None, False
# )# 自定义区域
# rgb_img = geemap.ee_to_numpy(img, region = aoi,scale = 30)
# print(aoi.getInfo())
# print(rgb_img.shape)
# # 将数据缩放到[0, 255]以显示为RGB图像.
# rgb_img_test = (255 * ((rgb_img[:, :, 0:3]))).astype('uint8')
# plt.imshow(rgb_img_test)
# plt.show()
# 制图(注意改bbox的区域范围)
# bbox = [115.203,39.389,117.532,41.09] # 北京
bbox = [119.915411,30.76028,121.382236,32.047851]# 苏州
plt.rcParams['font.family'] = 'Times New Roman'
rc['tick.labelsize'] = 20
rc["axes.labelsize"] = 20
rc["axes.labelweight"] = "bold"
rc["tick.labelweight"] = "bold"
l8_sr1 = l8_sr.visualize(**visualization)
imgBlend = l8_sr1.blend(roi.style(**style))
fig = plt.figure(figsize=(20, 22),facecolor='white')
ax = cartoee.get_map(imgBlend, region=bbox)
ax.set_title(label='City', fontsize=20, pad=5)
cartoee.add_gridlines(ax, interval=[1, 1], linestyle="--")
plt.show()