破折号传单获取标记位置
Dash leaflet get marker location
我正在使用破折号仪表板在地图上绘制点位置,因此用户可以 select 该点并显示该位置的一些附加数据。它与 MapBox 配合得很好,但我无法在破折号内找到一种方法来对位置进行聚类。但是,我发现 dash-plotly 库非常擅长聚类,并尝试将我的地图更改为传单,但现在我无法通过单击它来获取标记 ID?我确定我遗漏了一些微不足道的东西。
那么,有没有一种方法可以在单击标记时将此代码修改为 return 标记 ID,而不仅仅是 return 地图上的坐标?
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 的最简单方法是监听 属性 标记上的变化而不是地图本身。通过这种方法,可以从 callback_context 中提取制造商 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()
我正在使用破折号仪表板在地图上绘制点位置,因此用户可以 select 该点并显示该位置的一些附加数据。它与 MapBox 配合得很好,但我无法在破折号内找到一种方法来对位置进行聚类。但是,我发现 dash-plotly 库非常擅长聚类,并尝试将我的地图更改为传单,但现在我无法通过单击它来获取标记 ID?我确定我遗漏了一些微不足道的东西。
那么,有没有一种方法可以在单击标记时将此代码修改为 return 标记 ID,而不仅仅是 return 地图上的坐标?
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 的最简单方法是监听 属性 标记上的变化而不是地图本身。通过这种方法,可以从 callback_context 中提取制造商 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()