写一段利用GEEMap从Landsat影像中提取河流水面宽度的代码
时间: 2024-02-12 20:04:47 浏览: 185
基于landsat遥感数据的岸线提取过程
好的,以下是一段利用GEEMap从 Landsat 影像中提取河流水面宽度的Python代码:
```python
import ee
# 初始化 Earth Engine
ee.Initialize()
# 定义 AOI(Area of Interest)
aoi = ee.Geometry.Point([-122.41942, 37.7749])
# 定义需要用到的图像
landsat = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR") \
.filterBounds(aoi) \
.filterDate('2019-01-01', '2020-01-01') \
.median()
# 定义河流区域
river = ee.FeatureCollection("WWF/HydroSHEDS/v1/FreeFlowingRivers") \
.filterBounds(aoi) \
.first()
# 提取河流区域的水面
water = ee.Image("JRC/GSW1_0/GlobalSurfaceWater") \
.select('occurrence') \
.clip(river.geometry())
# 计算水面和非水面的 NDWI(Normalized Difference Water Index)
ndwi = landsat.normalizedDifference(['B3', 'B5'])
# 将 NDWI 和水面掩膜相乘,得到河流区域的水面 NDWI
ndwi_water = ndwi.multiply(water)
# 将水面 NDWI 转换为二元图像,1 表示水面,0 表示非水面
water_mask = ndwi_water.gt(0.1)
# 将水面二元图像中的连通区域提取出来,得到河流区域的水面
water_area = water_mask.connectedPixelCount(100, True)
# 计算每个水面区域的宽度
water_width = water_area.multiply(30) \
.sqrt() \
.divide(water_area.divide(30))
# 在地图上显示结果
Map = geemap.Map()
Map.centerObject(aoi, 10)
Map.addLayer(water_mask, {'palette': 'blue'}, 'Water Mask')
Map.addLayer(water_width, {'min': 0, 'max': 200, 'palette': 'red'}, 'Water Width')
Map.addLayerControl()
Map```
这段代码利用 Landsat 8 卫星影像、Global Surface Water 数据集和 HydroSHEDS 河流数据集,提取了 AOI 中的河流区域的水面,然后计算了每个水面区域的宽度,并在地图上显示了结果。
阅读全文