Dash:点击 Scattermapbox 地图任意位置后的回调

问题描述 投票:0回答:1

我正在寻找一个 Dash 回调,它可以在单击或将鼠标悬停在 Mapbox 地图上后通过

go.Scattermapbox()
任何坐标(经度和纬度)进行访问。

如果

dcc.Graph
包含图像,则可以访问图像坐标,如下所示:https://github.com/AIMPED/plotly_dash/blob/master/plotlyDash_get_clickInfo.py

也可以通过回调

dash-leaflet
使用
dl.Map()
访问地图坐标。但是,我想在我的项目中使用 Mapbox。

最后,在Javascript中可以通过鼠标悬停获取坐标,如Mapbox官网所示:https://docs.mapbox.com/mapbox-gl-js/example/mouse-position/ 还有纯Python的吗不使用任何 Javascript 的内置功能?

python mapbox plotly-dash
1个回答
0
投票

按照5eb的建议,点击时可以使用

clickData
返点。如下所示:

from dash import dash_table, dcc, html, Input, Output, State
from datetime import date
import dash_bootstrap_components as dbc
import pandas as pd
import dash
from urllib.request import urlopen
import json
import plotly.express as px

df = px.data.carshare()
fig = px.scatter_mapbox(df, 
                        lat="centroid_lat", 
                        lon="centroid_lon", 
                        color="peak_hour", 
                        size="car_hours", 
                        mapbox_style="carto-positron",
                        hover_name='centroid_lat',
                        hover_data=['centroid_lat'],
                        color_continuous_scale=px.colors.cyclical.IceFire, 
                        size_max=15, 
                        zoom=10)

app = dash.Dash(__name__,external_stylesheets=[dbc.themes.LUX])
app.layout = dbc.Container([
    dbc.Row([
        dbc.Col([
            dcc.Graph(id='maps', figure=fig)
        ],width={'size':10}),
        dbc.Col([
            html.Div(id='contents')
        ],width={'size':2})
    ])
],fluid=True)

@app.callback(Output('contents','children'),
             Input('maps','clickData'))

def update_contents(clickData):
    if clickData:
        fips = clickData['points'][0]['hovertext']
        dff= df[df['centroid_lat']==fips]
        return html.Div([dash_table.DataTable(id='table',
                                    columns=[{"name":i,"id":i} for i in dff.columns],
                                    data=dff.to_dict(orient='records'))
                        ])
        
if __name__ == "__main__":
    app.run_server(debug=False)

点击前:

点击后:

© www.soinside.com 2019 - 2024. All rights reserved.