I’m trying to integrate Cesium into my Plotly Dash application but it doesn’t render the Cesium app in Plotly Dash when I run this locally from my Jupyter notebook. My python code is as follows:
import dash
import dash_html_components as html
external_css = ['https://cesium.com/downloads/cesiumjs/releases/1.76/Build/Cesium/Widgets/widgets.css']
app = dash.Dash(__name__,
title='Cesium Test',
external_stylesheets=external_css)
app.layout = html.Div(id='blah',
children=[
'Testing...',
html.Script(src='https://cesium.com/downloads/cesiumjs/releases/1.76/Build/Cesium/Cesium.js'),
html.Div(id='cesiumContainer'),
html.Script('''
Cesium.Ion.defaultAccessToken = 'any_code_works';
var viewer = new Cesium.Viewer('cesiumContainer');
''')
])
if __name__ == '__main__':
app.run_server(debug=True, use_reloader=False)
Here is a working example (Click on the “Show” button to see it renders the Cesium app):
html.Script tags are not executed by browsers when their code is added dynamically. There’s been some discussion about removing this and other components entirely (see eg here) but for now we’re following the lead of React and keeping it, despite it not working as you might expect.
My suggestion would be:
(1) add Cesium.js to external_scripts
(2) create a dummy clientside callback - based on cesiumContainer so you know it’ll only trigger when the container has been created - that instantiates the viewer. Something like:
I initially had success with the code above, but after a few tries it seems like it’s taking a long time to load and the cesium view doesn’t appear anymore.
Loading…and no respon. Any suggestion? please
import dash
from dash import html
from dash.dependencies import Input, Output
Thank you @alexcjohnson and @nmill this is a great solution and works! But the “var viewer = new Cesium.Viewer(id)” generates a view of the entire globe. I added lines of code to generate a view that flies to specific coordinates, and it worked. However, when I tried to call a specific Cesium tileset, it does not work. Below is the code that doesn’t work in Dash (received error: “Cannot read properties of undefined (reading ‘428f37966fc6dfc9715770e145fa65e3’)”). FYI, when I write the code blow as an html file and read it into a Flask app, it works well, I’m just trying to make it work in a Dash callback. Any help would be greatly appreciated.