Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
import pydeck as pdk | |
import pandas as pd | |
def globe_view(): | |
""" | |
GlobeView | |
========= | |
Over 33,000 power plants of the world plotted by their production capacity (given by height) | |
and fuel type (green if renewable) on an experimental deck.gl GlobeView. | |
""" | |
COUNTRIES = "https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_admin_0_scale_rank.geojson" | |
POWER_PLANTS = "https://raw.githubusercontent.com/ajduberstein/geo_datasets/master/global_power_plant_database.csv" | |
df = pd.read_csv(POWER_PLANTS) | |
def is_green(fuel_type): | |
"""Return a green RGB value if a facility uses a renewable fuel type""" | |
if fuel_type.lower() in ( | |
"nuclear", | |
"water", | |
"wind", | |
"hydro", | |
"biomass", | |
"solar", | |
"geothermal", | |
): | |
return [10, 230, 120] | |
return [230, 158, 10] | |
df["color"] = df["primary_fuel"].apply(is_green) | |
view_state = pdk.ViewState(latitude=51.47, longitude=0.45, zoom=2, min_zoom=2) | |
# Set height and width variables | |
view = pdk.View(type="_GlobeView", controller=True, width=1000, height=700) | |
layers = [ | |
pdk.Layer( | |
"GeoJsonLayer", | |
id="base-map", | |
data=COUNTRIES, | |
stroked=False, | |
filled=True, | |
get_fill_color=[200, 200, 200], | |
), | |
pdk.Layer( | |
"ColumnLayer", | |
id="power-plant", | |
data=df, | |
get_elevation="capacity_mw", | |
get_position=["longitude", "latitude"], | |
elevation_scale=100, | |
pickable=True, | |
auto_highlight=True, | |
radius=20000, | |
get_fill_color="color", | |
), | |
] | |
r = pdk.Deck( | |
views=[view], | |
initial_view_state=view_state, | |
tooltip={"text": "{name}, {primary_fuel} plant, {country}"}, | |
layers=layers, | |
# Note that this must be set for the globe to be opaque | |
parameters={"cull": True}, | |
) | |
return r | |
def geojson_layer(): | |
""" | |
GeoJsonLayer | |
=========== | |
Property values in Vancouver, Canada, adapted from the deck.gl example pages. Input data is in a GeoJSON format. | |
""" | |
DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/geojson/vancouver-blocks.json" | |
LAND_COVER = [ | |
[[-123.0, 49.196], [-123.0, 49.324], [-123.306, 49.324], [-123.306, 49.196]] | |
] | |
INITIAL_VIEW_STATE = pdk.ViewState( | |
latitude=49.254, longitude=-123.13, zoom=11, max_zoom=16, pitch=45, bearing=0 | |
) | |
polygon = pdk.Layer( | |
"PolygonLayer", | |
LAND_COVER, | |
stroked=False, | |
# processes the data as a flat longitude-latitude pair | |
get_polygon="-", | |
get_fill_color=[0, 0, 0, 20], | |
) | |
geojson = pdk.Layer( | |
"GeoJsonLayer", | |
DATA_URL, | |
opacity=0.8, | |
stroked=False, | |
filled=True, | |
extruded=True, | |
wireframe=True, | |
get_elevation="properties.valuePerSqm / 20", | |
get_fill_color="[255, 255, properties.growth * 255]", | |
get_line_color=[255, 255, 255], | |
) | |
r = pdk.Deck(layers=[polygon, geojson], initial_view_state=INITIAL_VIEW_STATE) | |
return r | |
def terrain(): | |
""" | |
TerrainLayer | |
=========== | |
Extruded terrain using AWS Open Data Terrain Tiles and Mapbox Satellite imagery | |
""" | |
# Import Mapbox API Key from environment | |
MAPBOX_API_KEY = os.environ["MAPBOX_API_KEY"] | |
# AWS Open Data Terrain Tiles | |
TERRAIN_IMAGE = ( | |
"https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png" | |
) | |
# Define how to parse elevation tiles | |
ELEVATION_DECODER = { | |
"rScaler": 256, | |
"gScaler": 1, | |
"bScaler": 1 / 256, | |
"offset": -32768, | |
} | |
SURFACE_IMAGE = f"https://api.mapbox.com/v4/mapbox.satellite/{{z}}/{{x}}/{{y}}@2x.png?access_token={MAPBOX_API_KEY}" | |
terrain_layer = pdk.Layer( | |
"TerrainLayer", | |
elevation_decoder=ELEVATION_DECODER, | |
texture=SURFACE_IMAGE, | |
elevation_data=TERRAIN_IMAGE, | |
) | |
view_state = pdk.ViewState( | |
latitude=46.24, longitude=-122.18, zoom=11.5, bearing=140, pitch=60 | |
) | |
r = pdk.Deck(terrain_layer, initial_view_state=view_state) | |
return r | |
def app(): | |
st.title("Pydeck Gallery") | |
options = ["GeoJsonLayer", "GlobeView", "TerrainLayer"] | |
option = st.selectbox("Select a pydeck layer type", options) | |
if option == "GeoJsonLayer": | |
st.header("Property values in Vancouver, Canada") | |
st.pydeck_chart(geojson_layer()) | |
# elif option == "GlobeView": | |
# st.pydeck_chart(globe_view()) | |
elif option == "TerrainLayer": | |
st.pydeck_chart(terrain()) | |