最近在 GIS 界有很多大神在讨论如何将图像下面混合一幅地形数据,这样看起来是 3D 的比较酷炫。
比如这样:
以上图片来自网络,是在专业软件中制作的。 GEEMAP 中是否可行呢?当然没问题,使用 blend 即可。下面的例子请笑纳:
首先引入模块:
import ee
import geemap
import geemap.colormaps as cm
定义地图:
Map = geemap.Map(
scroll_wheel_zoom = False,
attribution_ctrl = False,
basemap = 'Esri.OceanBasemap'
)
Map
随便找个 ROI ,我选择了浪漫的土耳其:
roi = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017').filter(
ee.Filter.inList('country_na', ['Turkey'])
)
Map.centerObject(roi, 6)
Map
加入地形图:
elevation = ee.Image('USGS/SRTMGL1_003').clipToCollection(roi)
vis_elevation = {
'min': 0,
'max': 4000,
'palette': cm.palettes.dem
}
vis_roi = {
'color': '000000',
'width': 2,
'lineType': 'solid',
'fillColor': '00000000'
}
Map.addLayer(elevation, vis_elevation, 'Elevation')
计算山体阴影图,并将地形图与山影图合并:
exaggeration = 20
hillshade = ee.Terrain.hillshade(elevation.multiply(exaggeration))
Map.addLayer(hillshade, {}, 'Hillshade')
blend = geemap.blend(
bottom_layer = hillshade,
top_layer = elevation,
top_vis = vis_elevation,
hillshade = False,
)
Map.addLayer(blend, {}, 'Terrain_Blend')
怎么样?有点儿意思了吧?那我就想了,可否将一幅完整的真彩色卫星图片叠加上来看看效果呢?继续:
def maskS2clouds(image):
qa = image.select('QA60')
cloudBitMask = 1 << 10
cirrusBitMask = 1 << 11
mask = qa.bitwiseAnd(cloudBitMask).eq(0).And(qa.bitwiseAnd(cirrusBitMask).eq(0))
return image.updateMask(mask).divide(10000)
collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') \
.filterBounds(roi).filterDate('2022-05-01', '2022-09-01') \
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',40)) \
.map(maskS2clouds)
image = collection.median().clip(roi)
vis_image = {
'min': 0.0,
'max': 0.25,
'bands': ['B4', 'B3', 'B2'],
'gamma': 1.3
}
blend = geemap.blend(
bottom_layer = hillshade,
top_layer = image,
top_vis = vis_image,
hillshade = False,
)
Map.addLayer(blend, {}, 'RGB_Blend')
Map.addLayer(roi.style(**vis_roi), {}, 'ROI')
看看局部放大效果:
说实话,没有我的预期好。我就又想了一下,是否可以把土地利用图叠加来看看?必须滴:
dw = ee.ImageCollection('GOOGLE/DYNAMICWORLD/V1').filter(roi)
landcover = geemap.dynamic_world(roi, '2021-01-01', '2022-01-01', return_type='hillshade').clip(roi)
vis_image = {
'gamma': 1.8
}
blend = geemap.blend(
bottom_layer = hillshade,
top_layer = landcover,
top_vis = vis_image,
hillshade = False,
)
Map.addLayer(blend, {}, 'DW_Blend')
Map.add_legend(title="Dynamic World Land Cover", builtin_legend='Dynamic_World')
Map.addLayer(roi.style(**vis_roi), {}, 'ROI')
再放大看看:
怎么样?还有点儿好玩吧?其实小伙伴们也可以自己考虑一下能否把其他的图片混合后效果更好呢?
其实本地图片也可以做到,但是如果那样的话就直接用本地软件了,效果会更好,GEEMAP 就主打个云计算嘛!