
只需几行代码,在浏览器中探索真实世界的高程数据
你是否想过,用Python轻松创建一个可交互的3D地形图?今天,我将带你用pydeck库实现这个目标——只需十几行代码,就能生成一个基于真实地理数据的立体高程地图,让你像上帝视角一样俯瞰山川起伏。
PyDeck是Uber开源的一个Python库,用于在Jupyter Notebook或网页中创建高性能的3D可视化。它基于deck.gl(一个WebGL驱动的可视化框架),让你能够:
简单来说,PyDeck让地理数据可视化变得像写Python一样简单。
import pydeck as pdk
导入pydeck库,约定俗成地简写为pdk。
terrain = pdk.Layer(
"TerrainLayer",
elevation_data="https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png",
texture="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
elevation_decoder={"rscaler": 256, "gscaler": 1, "bscaler": 1/256},
elevation_scale=30
)
这里创建了一个地形图层,是3D地图的核心:
"TerrainLayer":指定图层类型为地形图层elevation_data:高程数据源,这里使用标准的Terrarium格式切片服务。{z}/{x}/{y}是瓦片坐标的占位符,pydeck会自动根据当前视图加载对应的瓦片texture**:地表纹理,这里使用OpenStreetMap的卫星影像,让地形看起来更真实elevation_decoder:高程解码器。Terrarium格式将高程编码在RGB像素中,这个字典告诉pydeck如何从RGB值还原出实际高度:elevation_scale=30:高程缩放系数,将高度乘以30倍,让地形起伏更明显pdk.Deck(
layers=[terrain],
initial_view_state=pdk.ViewState(
latitude=37.76,
longitude=-122.42,
zoom=11,
pitch=45
)
)
最后,创建一个Deck对象来渲染整个场景:
layers:包含我们刚刚创建的地形图层initial_view_state:初始视图状态,定义了镜头位置:latitude/longitude:镜头对准的经纬度(这里是旧金山附近)zoom=11:缩放级别,数字越大越近pitch=45:倾斜角度,45度让你既能看到平面也能看到高度当你在Jupyter Notebook中运行这段代码,会发生什么?
想看看其他地方?只需修改ViewState中的经纬度:
# 日本富士山
initial_view_state=pdk.ViewState(latitude=35.36, longitude=138.73, zoom=10, pitch=45)
# 瑞士阿尔卑斯山
initial_view_state=pdk.ViewState(latitude=46.56, longitude=8.38, zoom=9, pitch=45)
修改elevation_scale参数:
terrain = pdk.Layer(
"TerrainLayer",
# ... 其他参数不变
elevation_scale=50# 更大的缩放,让山更高
)
可以换成其他风格的底图:
# 使用卫星影像
texture="https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"
# 使用淡色底图(更适合突出高程)
texture="https://cartodb-basemaps-a.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png"
你可以创建多个图层,叠加显示:
# 添加一个散点图层(比如城市位置)
cities = pdk.Layer(
"ScatterplotLayer",
data=[{"lat": 37.76, "lon": -122.42, "name": "San Francisco"}],
get_position='[lon, lat]',
get_radius=1000,
get_fill_color=[255, 0, 0, 160]
)
pdk.Deck(
layers=[terrain, cities], # 叠加两个图层
initial_view_state=...
)
如果你还没安装pydeck:
pip install pydeck
在Jupyter Notebook中使用时,可能需要启用扩展:
jupyter nbextension install --sys-prefix --symlink --overwrite --py pydeck
jupyter nbextension enable --sys-prefix --py pydeck
如果只是想快速预览,也可以将代码保存为.py文件运行,会生成一个HTML文件并在浏览器中打开。
这个简单的3D地形可视化,其实有很多实际用途:
从这段不到15行的代码开始,你已经掌握了用Python创建3D地形可视化的能力。无论是探索地球的壮丽山河,还是为你的数据项目增添地理维度,pydeck都是一个强大而易用的工具。
代码虽短,视野无限。下次我们将在这个基础上,叠加更多地理数据,让可视化真正讲出故事。
