120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
|
# Copyright 2018-2022 Streamlit Inc.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
import inspect
|
||
|
import textwrap
|
||
|
from urllib.error import URLError
|
||
|
|
||
|
import pandas as pd
|
||
|
import pydeck as pdk
|
||
|
|
||
|
import streamlit as st
|
||
|
from streamlit.hello.utils import show_code
|
||
|
|
||
|
|
||
|
def mapping_demo():
|
||
|
@st.cache
|
||
|
def from_data_file(filename):
|
||
|
url = (
|
||
|
"http://raw.githubusercontent.com/streamlit/"
|
||
|
"example-data/master/hello/v1/%s" % filename
|
||
|
)
|
||
|
return pd.read_json(url)
|
||
|
|
||
|
try:
|
||
|
ALL_LAYERS = {
|
||
|
"Bike Rentals": pdk.Layer(
|
||
|
"HexagonLayer",
|
||
|
data=from_data_file("bike_rental_stats.json"),
|
||
|
get_position=["lon", "lat"],
|
||
|
radius=200,
|
||
|
elevation_scale=4,
|
||
|
elevation_range=[0, 1000],
|
||
|
extruded=True,
|
||
|
),
|
||
|
"Bart Stop Exits": pdk.Layer(
|
||
|
"ScatterplotLayer",
|
||
|
data=from_data_file("bart_stop_stats.json"),
|
||
|
get_position=["lon", "lat"],
|
||
|
get_color=[200, 30, 0, 160],
|
||
|
get_radius="[exits]",
|
||
|
radius_scale=0.05,
|
||
|
),
|
||
|
"Bart Stop Names": pdk.Layer(
|
||
|
"TextLayer",
|
||
|
data=from_data_file("bart_stop_stats.json"),
|
||
|
get_position=["lon", "lat"],
|
||
|
get_text="name",
|
||
|
get_color=[0, 0, 0, 200],
|
||
|
get_size=15,
|
||
|
get_alignment_baseline="'bottom'",
|
||
|
),
|
||
|
"Outbound Flow": pdk.Layer(
|
||
|
"ArcLayer",
|
||
|
data=from_data_file("bart_path_stats.json"),
|
||
|
get_source_position=["lon", "lat"],
|
||
|
get_target_position=["lon2", "lat2"],
|
||
|
get_source_color=[200, 30, 0, 160],
|
||
|
get_target_color=[200, 30, 0, 160],
|
||
|
auto_highlight=True,
|
||
|
width_scale=0.0001,
|
||
|
get_width="outbound",
|
||
|
width_min_pixels=3,
|
||
|
width_max_pixels=30,
|
||
|
),
|
||
|
}
|
||
|
st.sidebar.markdown("### Map Layers")
|
||
|
selected_layers = [
|
||
|
layer
|
||
|
for layer_name, layer in ALL_LAYERS.items()
|
||
|
if st.sidebar.checkbox(layer_name, True)
|
||
|
]
|
||
|
if selected_layers:
|
||
|
st.pydeck_chart(
|
||
|
pdk.Deck(
|
||
|
map_style=None,
|
||
|
initial_view_state={
|
||
|
"latitude": 37.76,
|
||
|
"longitude": -122.4,
|
||
|
"zoom": 11,
|
||
|
"pitch": 50,
|
||
|
},
|
||
|
layers=selected_layers,
|
||
|
)
|
||
|
)
|
||
|
else:
|
||
|
st.error("Please choose at least one layer above.")
|
||
|
except URLError as e:
|
||
|
st.error(
|
||
|
"""
|
||
|
**This demo requires internet access.**
|
||
|
Connection error: %s
|
||
|
"""
|
||
|
% e.reason
|
||
|
)
|
||
|
|
||
|
|
||
|
st.set_page_config(page_title="Mapping Demo", page_icon="🌍")
|
||
|
st.markdown("# Mapping Demo")
|
||
|
st.sidebar.header("Mapping Demo")
|
||
|
st.write(
|
||
|
"""This demo shows how to use
|
||
|
[`st.pydeck_chart`](https://docs.streamlit.io/library/api-reference/charts/st.pydeck_chart)
|
||
|
to display geospatial data."""
|
||
|
)
|
||
|
|
||
|
mapping_demo()
|
||
|
|
||
|
show_code(mapping_demo)
|