giswqs commited on
Commit
81d914f
·
1 Parent(s): 9722c39

Added pydeck gallery

Browse files
Files changed (2) hide show
  1. app.py +1 -1
  2. 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 app():
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- import pydeck as pdk
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- layers=[polygon, geojson],
42
- initial_view_state=INITIAL_VIEW_STATE,
43
- height=1000,
44
- width="100%",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  )
46
 
47
- st.pydeck_chart(r)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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())