Производительность очень низкая, когда я передаю сотни точек scattermapbox, используя черту plotly, из запроса sqlite.
Каков наилучший способ передачи данных в scattermapbox в dash-приложении?
Я видел примеры (https://github.com/plotly/dash-uber-rides-demo)
с гораздо большим количеством точек данных, которые работают гораздо лучше.
Я не уверен, если это из-за структуры данных (nd.array, dataframe, результаты запроса sqlalchemy) или используемого интерфейса (graph_objs.scattermapbox vs dcc.graph).
Примеры в документации Dash передают данные по-разному и используют другой импорт / интерфейс. dcc vs. graph_objs.
Я использую dcc.graph, понимание из результатов запроса:
s = session
surveys = s.query(Survey).all()
locations = [s.location for s in surveys if s.location]
figure = {
'data': [
{
'type': 'scattermapbox',
'lat': [l.lat],
'lon': [l.lon],
"mode": "markers",
} for l in [s.location for s in surveys if s.location]
],
'layout': {
'mapbox': {...}
}
}
app.layout = html.Div([
dcc.Graph(
id='map',
figure=figure,
)
])
# Remap based on zip of any clicked point
@app.callback(
[Output('map', 'figure'),
Output('click-data', 'children')],
[Input('map', 'clickData'), Input('button', 'n_clicks')],
# [State('dropdown', 'value')],
)
def on_click(clickData, n_clicks):
data = clickData
point = data['points'][0]
# Use lat, lon to query the database
loc = s.query(Location).filter((Location.lat == point['lat']) & (Location.lon == point['lon'])).first()
locations = s.query(Location).filter(Location.zip == loc.zip)
figure = {
'data': [
{
'type': 'scattermapbox',
'lat': [l.lat],
'lon': [l.lon],
"mode": "markers",
} for l in locations
]
}
return figure
Ожидаемые результаты:
Производительность аналогична Uber Rides Dash
Фактические результаты:
Для загрузки нового запроса на карту требуется около 30 секунд