如何让多幅gpxplotter+folium地图的海拔着色基于全局范围保持一致?
用gpxplotter+folium实现全局海拔范围统一着色
完全可以指定全局海拔范围来实现多幅地图的着色一致性,不用依赖单条轨迹的本地海拔数据。核心是利用add_segment_to_map的norm参数,基于全局范围做归一化处理。
具体实现步骤
- 定义全局海拔范围:比如你需要的0-3000米,确定
vmin(最低海拔)和vmax(最高海拔)。 - 创建归一化对象:用matplotlib的
Normalize类生成基于全局范围的归一化规则,所有轨迹的海拔都会按这个规则映射到色谱上。 - 传入归一化参数:在调用
add_segment_to_map时,把这个归一化对象传给norm参数即可。
代码示例
from gpxplotter import read_gpx_file, add_segment_to_map import folium from matplotlib.colors import Normalize from folium import LinearColormap # 1. 设定全局海拔范围 global_vmin = 0 global_vmax = 3000 # 创建全局归一化规则 global_norm = Normalize(vmin=global_vmin, vmax=global_vmax) # 2. 创建对应全局范围的统一色条(可选,方便查看海拔对应颜色) colormap = LinearColormap(colors=['yellow', 'orange', 'red'], vmin=global_vmin, vmax=global_vmax, caption='海拔(米)') # 3. 生成第一幅地图(轨迹海拔0-1500米) map1 = folium.Map(location=[30.123, 120.456], zoom_start=12) # 替换成轨迹的中心坐标 for track in read_gpx_file("track1.gpx"): for segment in track['segments']: add_segment_to_map(map1, segment, color_by='elevation', cmap='YlOrRd_09', norm=global_norm) colormap.add_to(map1) map1.save("map1.html") # 4. 生成第二幅地图(轨迹海拔1000-2000米) map2 = folium.Map(location=[31.789, 121.012], zoom_start=12) # 替换成第二条轨迹的中心坐标 for track in read_gpx_file("track2.gpx"): for segment in track['segments']: add_segment_to_map(map2, segment, color_by='elevation', cmap='YlOrRd_09', norm=global_norm) colormap.add_to(map2) map2.save("map2.html")
原理说明
默认情况下,add_segment_to_map会自动用当前轨迹的最小、最大海拔做归一化,导致不同地图的颜色标尺不统一。指定全局norm后,所有轨迹的海拔值都会被映射到你设定的0-3000米范围:
- 轨迹1里的0米(等于global_vmin)对应色谱最左端(浅黄色),1500米对应色谱中间位置;
- 轨迹2里的1000米对应色谱的1000/3000位置,和轨迹1里0米的颜色一致;2000米对应2000/3000位置,和轨迹1里1500米的颜色一致。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

