如何在Plotly Express scatter_mapbox中使用本地GeoTIFF文件作为底图图层?
如何在Plotly scatter_mapbox中加载本地GeoTIFF作为栅格图层
嘿,这个问题我之前也碰到过——Plotly的Mapbox图层确实不支持直接加载本地GeoTIFF文件,因为它的栅格图层依赖的是瓦片服务(比如WMTS)或者Mapbox托管的瓦片集,本地文件路径没法直接被解析。不过咱们可以通过两步解决:先把GeoTIFF转成Mapbox兼容的瓦片,再用本地服务器提供这些瓦片。
步骤1:将GeoTIFF转换为Mapbox兼容的XYZ瓦片
Mapbox的栅格图层需要的是按{z}/{x}/{y}结构组织的瓦片文件,我们可以用GDAL的gdal2tiles.py工具来完成转换(GDAL是GIS领域常用的开源工具,你可以通过conda或pip安装)。
打开终端,运行以下命令:
# 替换your_flood.tif为你的本地GeoTIFF路径,flood_tiles是输出瓦片的文件夹 gdal2tiles.py -z 5-12 -s EPSG:3857 your_flood.tif flood_tiles
参数说明:
-z 5-12:指定生成的瓦片缩放级别(从5级到12级,你可以根据数据范围调整)-s EPSG:3857:强制将GeoTIFF转换为Web Mercator投影(Mapbox的标准投影)flood_tiles:输出文件夹,里面会自动生成按缩放级别、x、y分类的瓦片文件
步骤2:启动本地静态文件服务器
Plotly需要通过HTTP协议访问瓦片文件,所以我们要把刚才生成的瓦片文件夹变成一个静态文件服务。用Python自带的http.server就能快速搞定:
在终端中切换到瓦片文件夹的上级目录,然后运行:
python -m http.server 8000
这会在本地8000端口启动一个服务器,瓦片的访问路径会是http://localhost:8000/flood_tiles/{z}/{x}/{y}.png(如果生成的是jpg格式就换成.jpg)。
步骤3:修改Plotly代码加载本地瓦片
把你原来的WMTS图层代码替换成下面的内容,核心是修改source为本地服务器的瓦片URL:
import geopandas as gpd import plotly.express as px gdf = gpd.read_file(asset_path, layer='kast') gdf = gdf.to_crs('EPSG:4326') fig = px.scatter_mapbox(gdf, lat=gdf.geometry.y, lon=gdf.geometry.x, color='waterdepth_48hr') fig.update_mapboxes( accesstoken=mapbox_token, layers=[{ 'below': 'traces', 'sourcetype': 'raster', # 替换为你的本地瓦片URL 'source': ['http://localhost:8000/flood_tiles/{z}/{x}/{y}.png'] }], style='white-bg' ) fig.show()
额外注意事项
- 确保你的GeoTIFF数据范围和瓦片缩放级别匹配,避免加载不出瓦片
- 如果是很小范围的GeoTIFF(比如单张图片就能覆盖),也可以把它转成Base64编码后直接作为
source,但这种方法只适合小文件,大文件还是用瓦片更高效 - 本地服务器启动后不要关闭,否则Plotly无法访问瓦片
内容的提问来源于stack exchange,提问作者Jochem 't Hart
相关产品推荐
相关产品推荐

