Plotly Mapbox 图层未显示图像

1 投票
1 回答
34 浏览
提问于 2025-04-14 15:50

我正在尝试使用开放街图(open-street-map)创建一个plotly散点地图,并且我想在用户放大地图时叠加一张图片作为图层。

目前我的代码大致是这样的:

import pandas as pd
import plotly.express as px
import os

dir_path = os.path.dirname(os.path.realpath(__file__))

map_file = dir_path + "\\map.png"

df_event = pd.Dataframe()#dataframe containing long and lattitude coordinates

fig = px.scatter_mapbox(df_event, lat="Latitude", lon="Longitude", zoom=10)
fig.update_layout(mapbox_style="open-street-map",
                    mapbox_layers=[
                        {
                            "sourcetype": "image",
                            "source": "file://"+map_file,
                            "coordinates": [[10.0025794227684, 53.6280250042934] [10.0016447071323, 53.6280250042934] [10.0016447071323, 53.6281356890004] [10.0025794227684, 53.6281356890004]]
                        }
                    ])
fig.show()

地图上显示了所有的观察点,但我想叠加的png文件却没有显示出来。

1 个回答

1

如果你想在地图上添加本地图片,你需要先把这些图片转换成base64格式。我参考了plotly社区的一个例子,并把代码调整了一下,以便更好地回答你的问题。因为不太清楚你想叠加什么样的地图,我用了一个本地保存的蒙特利尔交通拥堵地图,来配合参考资料。 我使用了一个图形对象,并用免费的API密钥来获取地图。想了解更多关于Mapbox API的信息,可以查看这里。 底层是openstreetmap,第二层是拥堵信息的图片,最上面是散点图。图层的顺序是通过below="traces"这个参数来控制的。图层的显示范围是根据数据框的最大和最小经纬度手动调整的,这个不是特别精确。如果你知道你想叠加的地图的经纬度,可以直接用它来替换。

import plotly.graph_objects as go
import plotly.express as px

mapbox_access_token = open("mapbox_api_key.txt").read()
df = px.data.carshare()

# add map layer
map_filename = './data/montreal_road_map.png'
montreal_road_map = base64.b64encode(open(map_filename, 'rb').read())

fig = go.Figure()#go.Scattermapbox()

fig.add_trace(go.Scattermapbox(
    lat=df['centroid_lat'],
    lon=df['centroid_lon'],
    mode='markers',
    marker=go.scattermapbox.Marker(
        size=10,
        color=df['peak_hour'],
    ),
))

fig.update_layout(mapbox_style="open-street-map",
                  mapbox_accesstoken=mapbox_access_token,
                  mapbox_center=dict(lat=df.centroid_lat.mean(), lon=df.centroid_lon.mean()),
                  mapbox_zoom=10,
                  mapbox_layers=[{
                      "sourcetype": "image",
                      "opacity": 1.0,
                      "below": "traces", 
                      "source": 'data:image/png;base64,{}'.format(montreal_road_map.decode('utf-8')),
                      "coordinates": 
                      [[-73.73894559925054-0.03, 45.61087892678886+0.015],
                       [-73.5124596370787+0.075, 45.61087892678886+0.015],
                       [-73.5124596370787+0.075, 45.448903185047335-0.025],
                       [-73.73894559925054-0.03, 45.448903185047335-0.025],
                       ]
                        }])

fig.update_layout(height=600)

fig.show()

enter image description here

撰写回答