Spaces:
Sleeping
Sleeping
Added pydeck gallery
Browse files- app.py +1 -1
- apps/deck.py +140 -9
app.py
CHANGED
@@ -12,7 +12,7 @@ apps = MultiApp()
|
|
12 |
apps.add_app("U.S. Real Estate", housing.app)
|
13 |
apps.add_app("U.S. Census Data", census.app)
|
14 |
apps.add_app("Upload Vector Data", upload.app)
|
15 |
-
apps.add_app("Pydeck", deck.app)
|
16 |
apps.add_app("Home", home.app)
|
17 |
|
18 |
# The main app
|
|
|
12 |
apps.add_app("U.S. Real Estate", housing.app)
|
13 |
apps.add_app("U.S. Census Data", census.app)
|
14 |
apps.add_app("Upload Vector Data", upload.app)
|
15 |
+
apps.add_app("Pydeck Gallery", deck.app)
|
16 |
apps.add_app("Home", home.app)
|
17 |
|
18 |
# The main app
|
apps/deck.py
CHANGED
@@ -1,11 +1,89 @@
|
|
|
|
1 |
import streamlit as st
|
|
|
|
|
2 |
|
3 |
|
4 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
-
st.title("Property values in Vancouver, Canada")
|
9 |
DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/geojson/vancouver-blocks.json"
|
10 |
LAND_COVER = [
|
11 |
[[-123.0, 49.196], [-123.0, 49.324], [-123.306, 49.324], [-123.306, 49.196]]
|
@@ -37,11 +115,64 @@ def app():
|
|
37 |
get_line_color=[255, 255, 255],
|
38 |
)
|
39 |
|
40 |
-
r = pdk.Deck(
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
)
|
46 |
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
import streamlit as st
|
3 |
+
import pydeck as pdk
|
4 |
+
import pandas as pd
|
5 |
|
6 |
|
7 |
+
def globe_view():
|
8 |
+
|
9 |
+
"""
|
10 |
+
GlobeView
|
11 |
+
=========
|
12 |
+
|
13 |
+
Over 33,000 power plants of the world plotted by their production capacity (given by height)
|
14 |
+
and fuel type (green if renewable) on an experimental deck.gl GlobeView.
|
15 |
+
"""
|
16 |
+
|
17 |
+
COUNTRIES = "https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_admin_0_scale_rank.geojson"
|
18 |
+
POWER_PLANTS = "https://raw.githubusercontent.com/ajduberstein/geo_datasets/master/global_power_plant_database.csv"
|
19 |
+
|
20 |
+
df = pd.read_csv(POWER_PLANTS)
|
21 |
|
22 |
+
def is_green(fuel_type):
|
23 |
+
"""Return a green RGB value if a facility uses a renewable fuel type"""
|
24 |
+
if fuel_type.lower() in (
|
25 |
+
"nuclear",
|
26 |
+
"water",
|
27 |
+
"wind",
|
28 |
+
"hydro",
|
29 |
+
"biomass",
|
30 |
+
"solar",
|
31 |
+
"geothermal",
|
32 |
+
):
|
33 |
+
return [10, 230, 120]
|
34 |
+
return [230, 158, 10]
|
35 |
+
|
36 |
+
df["color"] = df["primary_fuel"].apply(is_green)
|
37 |
+
|
38 |
+
view_state = pdk.ViewState(latitude=51.47, longitude=0.45, zoom=2, min_zoom=2)
|
39 |
+
|
40 |
+
# Set height and width variables
|
41 |
+
view = pdk.View(type="_GlobeView", controller=True, width=1000, height=700)
|
42 |
+
|
43 |
+
layers = [
|
44 |
+
pdk.Layer(
|
45 |
+
"GeoJsonLayer",
|
46 |
+
id="base-map",
|
47 |
+
data=COUNTRIES,
|
48 |
+
stroked=False,
|
49 |
+
filled=True,
|
50 |
+
get_fill_color=[200, 200, 200],
|
51 |
+
),
|
52 |
+
pdk.Layer(
|
53 |
+
"ColumnLayer",
|
54 |
+
id="power-plant",
|
55 |
+
data=df,
|
56 |
+
get_elevation="capacity_mw",
|
57 |
+
get_position=["longitude", "latitude"],
|
58 |
+
elevation_scale=100,
|
59 |
+
pickable=True,
|
60 |
+
auto_highlight=True,
|
61 |
+
radius=20000,
|
62 |
+
get_fill_color="color",
|
63 |
+
),
|
64 |
+
]
|
65 |
+
|
66 |
+
r = pdk.Deck(
|
67 |
+
views=[view],
|
68 |
+
initial_view_state=view_state,
|
69 |
+
tooltip={"text": "{name}, {primary_fuel} plant, {country}"},
|
70 |
+
layers=layers,
|
71 |
+
# Note that this must be set for the globe to be opaque
|
72 |
+
parameters={"cull": True},
|
73 |
+
)
|
74 |
+
|
75 |
+
return r
|
76 |
+
|
77 |
+
|
78 |
+
def geojson_layer():
|
79 |
+
|
80 |
+
"""
|
81 |
+
GeoJsonLayer
|
82 |
+
===========
|
83 |
+
|
84 |
+
Property values in Vancouver, Canada, adapted from the deck.gl example pages. Input data is in a GeoJSON format.
|
85 |
+
"""
|
86 |
|
|
|
87 |
DATA_URL = "https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/geojson/vancouver-blocks.json"
|
88 |
LAND_COVER = [
|
89 |
[[-123.0, 49.196], [-123.0, 49.324], [-123.306, 49.324], [-123.306, 49.196]]
|
|
|
115 |
get_line_color=[255, 255, 255],
|
116 |
)
|
117 |
|
118 |
+
r = pdk.Deck(layers=[polygon, geojson], initial_view_state=INITIAL_VIEW_STATE)
|
119 |
+
return r
|
120 |
+
|
121 |
+
|
122 |
+
def terrain():
|
123 |
+
|
124 |
+
"""
|
125 |
+
TerrainLayer
|
126 |
+
===========
|
127 |
+
|
128 |
+
Extruded terrain using AWS Open Data Terrain Tiles and Mapbox Satellite imagery
|
129 |
+
"""
|
130 |
+
|
131 |
+
# Import Mapbox API Key from environment
|
132 |
+
MAPBOX_API_KEY = os.environ["MAPBOX_API_KEY"]
|
133 |
+
|
134 |
+
# AWS Open Data Terrain Tiles
|
135 |
+
TERRAIN_IMAGE = (
|
136 |
+
"https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png"
|
137 |
+
)
|
138 |
+
|
139 |
+
# Define how to parse elevation tiles
|
140 |
+
ELEVATION_DECODER = {
|
141 |
+
"rScaler": 256,
|
142 |
+
"gScaler": 1,
|
143 |
+
"bScaler": 1 / 256,
|
144 |
+
"offset": -32768,
|
145 |
+
}
|
146 |
+
|
147 |
+
SURFACE_IMAGE = f"https://api.mapbox.com/v4/mapbox.satellite/{{z}}/{{x}}/{{y}}@2x.png?access_token={MAPBOX_API_KEY}"
|
148 |
+
|
149 |
+
terrain_layer = pdk.Layer(
|
150 |
+
"TerrainLayer",
|
151 |
+
elevation_decoder=ELEVATION_DECODER,
|
152 |
+
texture=SURFACE_IMAGE,
|
153 |
+
elevation_data=TERRAIN_IMAGE,
|
154 |
)
|
155 |
|
156 |
+
view_state = pdk.ViewState(
|
157 |
+
latitude=46.24, longitude=-122.18, zoom=11.5, bearing=140, pitch=60
|
158 |
+
)
|
159 |
+
|
160 |
+
r = pdk.Deck(terrain_layer, initial_view_state=view_state)
|
161 |
+
return r
|
162 |
+
|
163 |
+
|
164 |
+
def app():
|
165 |
+
|
166 |
+
st.title("Pydeck Gallery")
|
167 |
+
|
168 |
+
options = ["GeoJsonLayer", "GlobeView", "TerrainLayer"]
|
169 |
+
|
170 |
+
option = st.selectbox("Select a pydeck layer type", options)
|
171 |
+
|
172 |
+
if option == "GeoJsonLayer":
|
173 |
+
st.header("Property values in Vancouver, Canada")
|
174 |
+
st.pydeck_chart(geojson_layer())
|
175 |
+
# elif option == "GlobeView":
|
176 |
+
# st.pydeck_chart(globe_view())
|
177 |
+
elif option == "TerrainLayer":
|
178 |
+
st.pydeck_chart(terrain())
|