Leaflet 破折号传单获取标记位置

Leaflet 破折号传单获取标记位置,leaflet,plotly-dash,Leaflet,Plotly Dash,我正在使用仪表板在地图上绘制点位置,因此用户可以选择该点,并为该位置显示一些附加数据。它与MapBox配合得很好,但我无法在dash中找到一种方法来对位置进行聚类。然而,我发现dash plotly库非常擅长聚类,并尝试将我的地图更改为传单,但现在我无法通过单击它来获取标记ID?我肯定我错过了一些琐碎的事情 那么,有没有一种方法可以修改此代码,在单击标记时返回标记ID,而不仅仅是返回地图上的坐标 import dash import dash_html_components as html im

我正在使用仪表板在地图上绘制点位置,因此用户可以选择该点,并为该位置显示一些附加数据。它与MapBox配合得很好,但我无法在dash中找到一种方法来对位置进行聚类。然而,我发现dash plotly库非常擅长聚类,并尝试将我的地图更改为传单,但现在我无法通过单击它来获取标记ID?我肯定我错过了一些琐碎的事情

那么,有没有一种方法可以修改此代码,在单击标记时返回标记ID,而不仅仅是返回地图上的坐标

import dash
import dash_html_components as html
import dash_leaflet as dl
from dash.dependencies import Input, Output

markers = [dl.Marker(children=dl.Tooltip("test"), position=a) for a in [(11,11),(33,33), 
    (55,55)]]
cluster = dl.MarkerClusterGroup(id="markers", children=markers, options={"polygonOptions": 
    {"color": "red"}})

app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div(
        children=[
        html.Div(
            dl.Map([dl.TileLayer(),
                    dl.LayerGroup(id="layer"),
                    cluster
            ],
                   id="map", style={'width': '100%', 'height': '50vh', 'margin': "auto", "display": "block"})),
        html.P("EHEE"),
        html.Div(id='clickdata')
    ])

@app.callback(Output("clickdata", "children"),
              [Input("map", "click_lat_lng")])
def map_click(click_lat_lng):
    return "{}".format(click_lat_lng)

if __name__ == '__main__':
    app.run_server()

我希望继续使用Python接口,我对JavaScript的自定义工作不感兴趣。

获取被单击的标记id的最简单方法是侦听标记上的属性更改,而不是映射本身。通过这种方法,可以从回调上下文中提取制造商id信息。下面是一个基于您的代码的小示例

import dash
import dash_html_components as html
import dash_leaflet as dl
from dash.dependencies import Input, Output

positions = [(11, 11), (33, 33), (55, 55)]
markers = [dl.Marker(dl.Tooltip("test"), position=pos, id="marker{}".format(i)) for i, pos in enumerate(positions)]
cluster = dl.MarkerClusterGroup(id="markers", children=markers, options={"polygonOptions": {"color": "red"}})

app = dash.Dash(prevent_initial_callbacks=True)
app.layout = html.Div([
    html.Div(dl.Map([dl.TileLayer(), cluster], center=(33, 33), zoom=3, id="map",
                    style={'width': '100%', 'height': '50vh', 'margin': "auto", "display": "block"})),
    html.Div(id='clickdata')
])


@app.callback(Output("clickdata", "children"),
              [Input(marker.id, "n_clicks") for marker in markers])
def marker_click(*args):
    marker_id = dash.callback_context.triggered[0]["prop_id"].split(".")[0]
    return "Hello from {}".format(marker_id)


if __name__ == '__main__':
    app.run_server()