VizLib-PyDeck / app.py
awacke1's picture
Update app.py
fdefbdd
raw
history blame
3.38 kB
import streamlit as st
import pydeck as pdk
import numpy as np
# Define a data set
data = np.random.randn(1000, 2) * 0.1
layer = pdk.Layer(
"ScatterplotLayer",
data=data,
get_position="[0, 1]",
get_color="[200, 30, 0, 160]",
get_radius=50,
)
# Define a Pydeck view state
view_state = pdk.ViewState(latitude=37.7749, longitude=-122.4194, zoom=11)
# Define Pydeck initial rendering options
initial_options = pdk.Deck(
map_style="mapbox://styles/mapbox/dark-v9",
layers=[layer],
initial_view_state=view_state,
)
# Define the HTML template for the Three.js canvas
html_template = """
<div id="three-canvas-container"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
var canvasContainer = document.getElementById("three-canvas-container");
var camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
var renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(window.innerWidth, window.innerHeight);
canvasContainer.appendChild(renderer.domElement);
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
</script>
"""
# Define the Streamlit app
def app():
# Define a Pydeck map using a ScatterplotLayer
st.pydeck_chart(initial_options)
# Add a dropdown menu to select Pydeck layer types
layer_type = st.selectbox("Layer type", ["HexagonLayer", "HeatmapLayer", "ScatterplotLayer"])
# Add sliders to adjust the Pydeck layer properties
if layer_type == "HexagonLayer":
layer.radius = st.slider("Radius", 10, 100, 50)
layer.elevation_scale = st.slider("Elevation scale", 0, 10, 1)
layer.elevation_range = st.slider("Elevation range", 0, 1000, 100)
layer.pickable = st.checkbox("Pickable", True)
layer.auto_highlight = st.checkbox("Auto highlight", True)
elif layer_type == "HeatmapLayer":
layer.intensity = st.slider("Intensity", 0, 10, 1)
layer.radius = st.slider("Radius", 10, 100, 50)
layer.color_range = st.color_picker("Color range", ["#008000", "#FFFF00", "#FF0000"])
layer.opacity = st.slider("Opacity", 0, 1, 0.8)
layer.blend_mode = st.selectbox("Blend mode", ["additive", "multiply"])
elif layer_type == "ScatterplotLayer":
layer.get_position = "[0, 1, 2]"
layer.get_color = "[200, 30, 0, 160]"
layer.get_radius = st.slider("Radius", 10, 100, 50)
# Add the updated Pydeck layer to the map
#st.pydeck_chart(pdk.Deck(layers=[layer], initial_view_state=view_state))
st.pydeck_chart(pdk.Deck(layers=[layer]))
# Add the Three.js canvas to the Streamlit app
st.components.v1.html(html_template, height=500)
if name == "main":
app()
# This app has a Pydeck map that displays a scatterplot layer by default, and it allows the user to switch between HexagonLayer, HeatmapLayer, and ScatterplotLayer using a dropdown menu. The user can also adjust the properties of the selected layer using sliders and color pickers. Finally, the app displays a Three.js canvas that rotates a green cube.