Plotly Mapbox GeoJSON图层:线条正常显示,符号图层无法渲染
Plotly Mapbox符号图层无法渲染的解决方法
问题背景
使用Plotly Scattermapbox绘制带动态缩放的地图,需求是缩放至足够大时渲染特定要素,但符号图层始终无法显示,线条图层正常;尝试修改几何类型为Point、移除线条图层等操作均无效。
问题代码
数据准备代码
latHit = [42.1,42.2,42.3] longHit = [-83.4,-83.5,-83.6] coords=[] for lo, la in zip(list(longHit), list(latHit)): coords.append([lo, la]) layersLi = go.layout.mapbox.Layer(sourcetype='geojson', source=dict(type='Feature',geometry=dict(type="LineString",coordinates=coords)), type='line') layersPt = go.layout.mapbox.Layer(sourcetype='geojson', source=dict(type='Feature',geometry=dict(type="MultiPoint",coordinates=coords)), type='symbol')
绘图代码
fig = go.Figure(go.Scattermapbox( lat=[42.15,42.25], lon=[-83.45,-83.55], mode='markers', )) fig.update_layout( hovermode='closest', mapbox=dict( bearing=0, center=go.layout.mapbox.Center( lat=42.2, lon=-83.5 ), style='white-bg', pitch=0, zoom=10, layers=[layersLi , layersPt] ), height=1000 ) fig.show()
问题原因
Plotly Mapbox的符号图层(type='symbol')默认未配置可见的符号样式,必须显式指定icon-image(使用Mapbox预设图标或自定义图标)或text-field(显示文本标签)才能渲染。
解决方法
修改符号图层的配置,添加必要的样式属性,同时可结合minzoom实现“缩放至足够大才渲染”的需求:
方案1:使用Mapbox预设图标
layersPt = go.layout.mapbox.Layer( sourcetype='geojson', source=dict(type='Feature', geometry=dict(type="MultiPoint", coordinates=coords)), type='symbol', icon-image='circle-15', # Mapbox预设圆形图标 icon-size=3, icon-color='red', minzoom=12 # 仅当缩放级别≥12时显示 )
方案2:显示文本标签
layersPt = go.layout.mapbox.Layer( sourcetype='geojson', source=dict(type='Feature', geometry=dict(type="MultiPoint", coordinates=coords)), type='symbol', text-field='{lat}', # 显示纬度,可自定义文本内容 text-size=12, text-color='blue', minzoom=12 )
验证用完整代码
import plotly.graph_objects as go latHit = [42.1,42.2,42.3] longHit = [-83.4,-83.5,-83.6] coords=[] for lo, la in zip(list(longHit), list(latHit)): coords.append([lo, la]) layersLi = go.layout.mapbox.Layer(sourcetype='geojson', source=dict(type='Feature',geometry=dict(type="LineString",coordinates=coords)), type='line') layersPt = go.layout.mapbox.Layer( sourcetype='geojson', source=dict(type='Feature', geometry=dict(type="MultiPoint", coordinates=coords)), type='symbol', icon-image='circle-15', icon-size=3, icon-color='red', minzoom=10 ) fig = go.Figure(go.Scattermapbox( lat=[42.15,42.25], lon=[-83.45,-83.55], mode='markers', )) fig.update_layout( hovermode='closest', mapbox=dict( bearing=0, center=go.layout.mapbox.Center( lat=42.2, lon=-83.5 ), style='white-bg', pitch=0, zoom=10, layers=[layersLi , layersPt] ), height=1000 ) fig.show()
内容的提问来源于stack exchange,提问作者Chris W
相关产品推荐
相关产品推荐

