Giter Club home page Giter Club logo

streamlit-folium's Introduction

streamlit-folium: geospatial made easy in Streamlit!

Run tests each PR

Open in Streamlit

streamlit-folium integrates two great open-source projects in the Python ecosystem: Streamlit and Folium!

Installation

pip install streamlit-folium

or

conda install -c conda-forge streamlit-folium

Usage

Currently, there are two functions defined:

  • st_folium(): a bi-directional Component, taking a Folium/Branca object and plotting to the Streamlit app. Upon mount/interaction with the Streamlit app, st_folium() returns a Dict with selected information including the bounding box and items clicked on

  • folium_static(): takes a folium.Map, folium.Figure, or branca.element.Figure object and displays it in a Streamlit app.

    Note: folium_static() is based on the _repr_html() representation created in Folium. This function should be a strict subset the of functionality of the newer st_folium() function. It is recommended that users switch to st_folium() as soon as possible, as folium_static() will likely be deprecated.

    If there is a reason why folium_static() needs to remain, please leave a GitHub issue describing your use case.

Example

streamlit_folium example

streamlit-folium's People

Contributors

a-slice-of-py avatar bastiengauthier avatar blackary avatar dependabot[bot] avatar hansthen avatar hugosandelius avatar nhridoy avatar patrontheo avatar randyzwitch avatar raptorworks avatar rupestre-campos avatar sfc-gh-zblackwood avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

streamlit-folium's Issues

Dynamically specify required js/css

Right now we load all of the JS and CSS related to all the supported plugins, but most of these aren't used, and it can cause issues with loading the component (e.g. #79).

Render <class 'branca.element.Figure'> to allow resizing without white space

Hey @randyzwitch , thank you for providing this component, it's been very useful.

The only issue so far is that reducing folium width/height produces white space on the borders:

import folium
m = folium.Map(width='70%', height='50%')
m

The solution is to use branca.element.Figure class:

from branca.element import Figure
fig = Figure(width='70%', height='50%')
m = folium.Map()
fig.add_child(m)

However, your component currently is not able to render it. Could you please enable that or suggest a workaround?

Responsive view

Hey, thanks for getting this component up and working. One thing I noticed was that on mobile the map always takes up 700px for the width column, which causes an ugly scroll bar to appear. To fix this I had to hardcode a style into the Streamlit app.
Not sure if this is for all components or just this one, but will just point it out here.

make_map_responsive= """
 <style>
 [title~="st.iframe"] { width: 100%}
 </style>
"""
st.markdown(make_map_responsive, unsafe_allow_html=True)

Use Folium attribute selection to populate ST controls

Hi Randy. I have created a user story for a use case I have which is to use information from selected features in a specific map layer to populate ST controls. An example : populating an image list in a ST dropdown with the currently visible (or selected) features on a given layer in the map.

I'd like to work on a PR for that and wondered if you had thoughts or plans along those lines. Here is the (short) document : https://github.com/ymoisan/streamlit-folium/blob/master/user-stories.md. Comments welcome. Thanx for the component !

folium.LayerControl()

Hi

here is my issue.

Capture2

since I add folium.LayerControl().add_to(map), the map is not showing properly and the width and heigth is not changing the display of the map. I have try on folium.Map and on st_folium

I have tried with folium_static() and it work fine

import streamlit as st
from streamlit_folium import st_folium
import folium
from folium.plugins import MousePosition

map = folium.Map(location=[0, 0], zoom_start=2, )
MousePosition().add_to(map)
map.add_child(folium.ClickForMarker())
folium.LayerControl().add_to(map)

st_data = st_folium(map)

Caching Folium Maps

Hello everyone!

In the meanwhile, that we start making a bidirectional component with javascript, I was wondering how caching Folium Maps.

I have created this example for the purpose of it:

import streamlit as st
import folium
import pandas as pd
import streamlit.components.v1 as components
import numpy as np

def create_test_df():
    data = {"id": range(10000),
            "year": np.random.choice(range(2018, 2021), 10000),
            "type": np.random.choice(["type_a", "type_b", "type_c"], 10000),
            "latitude": np.random.uniform(low=10, high=20, size=10000),
            "longitude": np.random.uniform(low=10, high=20, size=10000)}

    # Respects order
    return pd.DataFrame(data, columns=["id", "year", "type", "latitude", "longitude"])


def _plot_dot(point, map_element, color_col, radius=4, weight=1, color='black'):
    color_dict = {2018: "blue", 2019: "orange", 2020: "red"}

    folium.CircleMarker(location=[point["latitude"], point["longitude"]], radius=radius, weight=weight,
                        color=color, fill=True,
                        fill_color=color_dict[point[color_col]],
                        fill_opacity=0.9,
                        tooltip=f'<b>id: </b>{str(point["id"])}'
                                f'<br></br>'f'<b>year: </b>{str(point["year"])}'
                                f'<br></br>'f'<b>type: </b>{str(point["type"])}',
                        popup=f'<b>id: </b>{str(point["id"])}'
                              f'<br></br>'f'<b>year: </b>{str(point["year"])}'
                              f'<br></br>'f'<b>type: </b>{str(point["type"])}'
                        ).add_to(map_element)


def generate_map(df):
    map_element = folium.Map(location=[15, 15], zoom_start=6, tiles='cartodbpositron')

    df.apply(_plot_dot, axis=1, args=[map_element, "year"])

    return map_element


def folium_static(fig, width=700, height=500):
    if isinstance(fig, folium.Map):
        fig = folium.Figure().add_child(fig)

    return components.html(fig.render(), height=(fig.height or height) + 10, width=width)


if __name__ == "__main__":
    st.title("Caching Folium Maps")

    df = create_test_df()

    option = st.selectbox('Select year?', df['year'].unique())
    st.write('You selected: ', option)

    dict_years = {}
    for year in df['year'].unique():
        dict_years[year] = generate_map(df[df["year"] == year])

    folium_static(dict_years[option])

This code runs correctly:
1

I had tried to @st.cache functions with no positive results:
Capture

I understand that I must get deeper into advanced caching (https://docs.streamlit.io/en/stable/advanced_caching.html). Any guidelines about this are welcome.

change color of maker on click in examples/interactive_app.py

Nice project.

in https://share.streamlit.io/randyzwitch/streamlit-folium/examples/interactive_app.py would be cool to have some way of changing color of the marker on click.

Motivation is my college @wxman22 would like to use the dashboard to plan his next foray into a national park. We said it would be cool if you could click on a marker and indicate you have been to that park (e.g. change the color of the marker, maybe make it have a strikethrough?) so that he is left to decide which national park to enjoy next.

Feature request: return map bounds to streamlit

I have a pandas dataframe that contains the lat/lon location of a bunch of markers (plus other data) and am displaying that when a pin is clicked on via a popup, with the map generated by:

import folium
from folium import IFrame
import pandas as pd

df = pd.read_csv("my.csv")

location = df['latitude'].mean(), df['longitude'].mean()
m = folium.Map(location=location, zoom_start=15)

width = 900
height = 600 
fat_wh = 1 # border around image

for i in range(0, len(df)):
    html = pd.DataFrame(df[["latitude", "longitude", "time"]].iloc[i]).to_html()
    iframe = IFrame(html, width=width*fat_wh, height=height*fat_wh)
    popup  = folium.Popup(iframe, parse_html = True, max_width=2000)
    folium.Marker([df['latitude'].iloc[i], df['longitude'].iloc[i]], popup=popup).add_to(m)

folium_static(m)

Now this dataframe may in future get VERY large as it potentially covers the whole world, so I only want to return the markers that are in the current map view, and do some clever aggregation when the map is zoomed out. For this I need to get the extent of the map view coordinates, and use these to filter the dataframe (I probably also want to do some caching somewhere). Can you advise if this is possible/requires a new feature?
Many thanks

Map flickering

I am trying to add some Google Earth Engine layers (XYZ tile layers) to the map. You can see that the layers have been added successfully, but the map keeps refreshing. Any advice?

import ee
import geemap.foliumap as geemap
import streamlit as st
from streamlit_folium import st_folium

m = geemap.Map()
dem = ee.Image("USGS/SRTMGL1_003")
m.addLayer(dem, {}, "DEM")
st_data = st_folium(m, width=1000)

Peek 2022-05-07 22-25

To test it in a notebook:

import ee
import geemap.foliumap as geemap

m = geemap.Map()
dem = ee.Image("USGS/SRTMGL1_003")
m.addLayer(dem, {}, "DEM")
m

How to get lat/lon from mouse click position?

How can I get the GPS (lat/lon) point for the last clicked mouse position, and have this info displayed in the console continuously?

I have tried with the following code.

Click to see code
import time
import streamlit as st
from streamlit_folium import st_folium
import folium

def draw_folium_map():
   center = [53.4844, -2.2952]
   tiles = ["cartodbpositron", "Stamen Toner", "OpenStreetMap"]
   map = folium.Map(
       location        = [center[0], center[1]],
       zoom_start      = 15,
       zoom_control    = True,
       scrollWheelZoom = False,
       tiles           = tiles[0],
   )

   folium.Marker(
       location=[53.4844, -2.2952],
       popup=f"A location!",
       icon=folium.Icon(color="blue", icon="star"),
   ).add_to(map)

   return map

#----------------------------------------------------------------------
#  Main
#----------------------------------------------------------------------

m = draw_folium_map()

output = st_folium(m, key="map", width=650, height=600)

if not output['last_clicked'] == None:
   print('map:  ({}, {})'.format(output['last_clicked']['lat'], output['last_clicked']['lng']) )

st.write(output)

#xy = [ map['last_clicked']['lat'], map['last_clicked']['lng'] ]
#print('Lat: {}, Lon : {}'.format(xy[0], xy[1])) 

while True:
   try:
       #if not map['last_clicked'] == None:
       #    print('map: ', map['last_clicked'])
       time.sleep(2)
   except KeyboardInterrupt:
       print('\n [INFO] Program Interrupted by user.')
       st.stop()
       exit(1)

Legend of the map is not displayed

The legend of my map is not displayed using the st_folium when colorbar= false. The code:

import pandas as pd
import folium
import geopandas as gpd
import numpy as np
import mapclassify
import streamlit as st
from streamlit_folium import st_folium

url = ("https://raw.githubusercontent.com/python-visualization/folium/master/examples/data")
state_geo = f"{url}/us-states.json"
state_unemployment = f"{url}/US_Unemployment_Oct2012.csv"

state_unemployment = pd.read_csv(state_unemployment)
geoJSON_df = gpd.read_file(state_geo)

geoJSON_df.rename(columns={'id': 'State'}, inplace=True)

gdf = state_unemployment.merge(geoJSON_df, on='State', how='left')
gdf = gpd.GeoDataFrame(gdf)

bins = mapclassify.Quantiles(gdf['Unemployment'], k=5).bins
choropleth = gdf.explore(
    column='Unemployment',
    scheme='UserDefined',
    classification_kwds=dict(bins=bins),
    legend=True,
    legend_kwds=dict(colorbar=False),
)

st_folium(choropleth, width=700,height=500)

Displayed:
displayed

Expected:
expected

Projection

Thanks for the great library, it's awesome.

Quick question, what is the projection of the coords passed back from the last clicked component?

How to feed click-data from Python back to map

Hi!

Thanks for creating this plugin, you rock! :)

I'm new to both Streamlit and Folium and may be missing something fundamental here, but I can't seem to feed the data returned from click events back to the map! My use case is simple: center the map on the coordinate where the user clicked!

Creating the map as per the bi-directional data example works and I can see the data returned from clicks in st_data.

I've tried to zoom the map by setting the map bounds with m.fit_bounds, using the click event coordinates plus arbitrary deltas like so: m.fit_bounds(bounds=[st_data["last_clicked"]["lat"] - 0.001, st_data["last_clicked"]["lng"] - 0.001], padding=5, max_zoom=20). This seems to do nothing.

I have also tried setting data from st_data in the session state and use the session_state vars for initializing the map, hoping it would re-render, but to no avail.

What's the recommended way to do this? Or am I missing something and this is not supported?

st_folium map update after add_to(m)

Hi! Im trying to apply superior interactivity of st_folium module to get data on map according the screen bounds but the original st_folium map wont show the added layer when the code reruns. Not sure if this is an issue at all or am I just doing something wrong here (still quite newbie in python&streamlit..). Something related to reruns? How could/should I workaround here? ๐Ÿ™
See test & code: https://share.streamlit.io/teemuja/st_folium_test/main/app1.py

Just a question: extract more values based on user click on Draw plugin.

Hi, thanks for this great library. Really helpful!

btw I am a beginner in the web developing and github as well, I am so sorry if there are some stupidities on my questions.

I would like to ask, is it possible to return every value of click event?

At the moment, I am trying to present folium map on Streamlit. I used the st_folium with Draw plugin and then utilized some of its return values. However I would like to go further.

For instance, I want user to be able comment on a certain feature or a drawn polygon. For that I created a Popup page that contains a html from. I succeeded to attach the form into the GeojsonPopup however I have struggled to find a way to return the comment and not found it yet. Do you have any idea how to solve it?

Another example regarding clicking event, I would like to get clicking event when a features e.g., a polygon has finished to be created/edited. Is it possible to return a value on that event?

Thank you for you time.

Best wishes,
Leclab Research Assistance,

Add marker or change marker position based on click

Is it possible to position a marker where you click on the map. I have tried something like this but the marker is not shown.

m = folium.Map(location=[39.949610, -75.150282], zoom_start=16)
st_data = st_folium(m, width = 725)

if st_data['last_clicked'] is not None:
  st.write(st_data['last_clicked'])
  lc = st_data['last_clicked']
  marker = folium.Marker(
    [lc['lat'], lc['lng']],
  ).add_to(m)
  st.write(m._children)
  st.write(marker.location)

folium-vectorgrid support?

Hi, currently using 0.8.1 of streamlit-folium to render a map and I was hoping to use folium.plugins.VectroGridProtobuf as a layer to serve vector tiles. If i save out my folium to an index.html i'm getting a good map with vector tiles displaying, but using streamlit-folium i'm seeing

Uncaught TypeError: L.vectorGrid is undefined
    <anonymous> index.html:22
    onRender index.tsx:192
    dispatchEvent event-target.mjs:337
    onRenderMessage streamlit.js:172
    onMessageEvent streamlit.js:143
index.html:22:38
    <anonymous> index.html:22
    onRender index.tsx:192
    dispatchEvent event-target.mjs:337
    onRenderMessage streamlit.js:172
    onMessageEvent streamlit.js:143

Do I need to do something extra to build vectrogrid support into the JS that is bundled? Sorry my familiarity with the javascript ecosystem is somewhat limited. Thanks for all your hard work!

Dynamic width foliummap stuck at 50%

When using setting the width=None, to leverage the new dynamic width functionnalities, maps are being displayed as if they were DualMap (with width 50%).
I'm not good with web dev but I think the issue is related to the HTML element .float-child with has a width of 50% even for single maps.

If my explanation isn't clear, please try out the script below, you'll see the issue is very obvious.

import streamlit as st
from streamlit_folium import folium_static, st_folium
import folium

m = folium.Map(location=[39.949610, -75.150282], zoom_start=16)
st_folium(m, width=None)

Question ? is it possible to redraw the same map

Thanks for component.
I got the map to work and got the last click coordinates working just fine, then I use those coordinates to Query a database that return some points next to the point, it work very well, my Question is there a way to redraw the same map using these new data, currently the only way I can see is to create another map, which is not very convinient

thanks again
cheers

st_folium gives type "None" instead of dictionary when running example (or indeed any) code

I first encountered this in my own project, but it also happens in the interactive example provided in this repository. st_folium outputs Type None, instead of a dictionary.

I have tried to create a new conda env on Windows 10, using Python 3.9, with only st_folium (version 0.6.4 from pip) and its dependencies, but st_folium still won't output a dictionary. As a result I cannot monitor for clicks on my app, as I get the expected error "TypeError: 'NoneType' object is not subscriptable".

st_folium also appears to still disable folium popups, as listed in this issue https://github.com/randyzwitch/streamlit-folium/issues/34

Are these known issues, or is there something wrong with my personal environment or computer setup? folium_static is working without issue. Thank you for any help and I am happy to provide further information.

Popup in Folium.Marker not working

import folium
from streamlit_folium import st_folium


m = folium.Map([45, 0], zoom_start=4)

folium.Marker([45, -30], popup="inline implicit popup").add_to(m)

folium.CircleMarker(
    location=[45, -10],
    radius=25,
    fill=True,
    popup=folium.Popup("inline explicit Popup"),
).add_to(m)

ls = folium.PolyLine(
    locations=[[43, 7], [43, 13], [47, 13], [47, 7], [43, 7]], color="red"
)

ls.add_child(folium.Popup("outline Popup on Polyline"))
ls.add_to(m)

gj = folium.GeoJson(
    data={"type": "Polygon", "coordinates": [[[27, 43], [33, 43], [33, 47], [27, 47]]]}
)

gj.add_child(folium.Popup("outline Popup on GeoJSON"))
gj.add_to(m)

st_folium(m)

output

st_folium() autorefresh issue

I recently switched from using folium_static() to st_folium() but I have an issue with its autorefresh. Whenever the folium map is interacted with, the website refreshes from the very top of the page. My project involves scraping data from a website, so anytime the page refreshes, all the code runs again. This makes it virtually impossible to interact with the map. Below is the streamlit app and code

Code (code for map beings on line 248): https://github.com/daniyal-d/COVID-19-Tracker-Web-App/blob/main/coronavirus_web_app.py
Streamlit app (using st_folium): https://daniyal-d-covid-19-tracker-web-app-coronavirus-web-app-fah46j.streamlitapp.com/

I am unsure if this is an issue with my code or the function. Either way, using folium_static() doesn't lead to any issues. If this problem can't be solved, would you be able to not depreciate 'folium_static()` as the app uses it?

Thank you

float-container

Hi,

I am having trouble rendering the folium map in the width of the folium app.
I see in the iframe there is a div with the class "float-container" containing two div's with class "float-child":

<div class="float-container">
    <div class="float-child">
        <div id="map_div" class="leaflet-container leaflet-touch leaflet-fade-anim leaflet-grab leaflet-touch-drag leaflet-touch-zoom" tabindex="0" style="height: 700px; width: 725px; position: relative; outline: none;"> # I have removed the contents of this div to reduce the code
        </div>
    </div>
    <div class="float-child">
        <div id="map_div2" style="height: 700px; width: 725px;">
        </div>
    </div>
</div>
.float-child {
    width: 50%;
    float: left;
}

It appears that these two div's CSS is overwitten by <div id="map_divstyle="height: 700px; width: 725px;">" and <div id="map_div2"style="height: 700px; width: 725px;"> which is from:

st_data = st_folium(m, width=725)

If we could only have one column

and not have the two div's with class "float-child", and rely on Streamlit's column structure if we need more than one column, we would not need to rely on widths?

Sorry I am a bit of a newbie to Streamlit.

Is this a Streamlit issue?
Is there a workaround?

Error message running streamlit-folium... AttributeError: module 'click' has no attribute 'get_os_args'

Windows 10
I get an error message: Error message after installing streamlit-folium... AttributeError: module 'click' has no attribute 'get_os_args'

I start the application from the "Examples" directory with the command:

streamlit run streamlit_app.py

streamlit_folium_RandyZwitch\examples>streamlit run streamlit_app.py

My environment is called "metview_vapor"
(metview_vapor) C:\Users\PowerUser\Desktop\Geospatial_maps\streamlit_folium_RandyZwitch\examples>streamlit run streamlit_app.py
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\envs\metview_vapor\Scripts\streamlit-script.py", line 9, in
sys.exit(main())
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\click\core.py", line 1130, in call
return self.main(*args, **kwargs)
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\click\core.py", line 1055, in main
rv = self.invoke(ctx)
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\click\core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\click\core.py", line 760, in invoke
return __callback(*args, **kwargs)
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\streamlit\cli.py", line 204, in main_run
_main_run(target, args, flag_options=kwargs)
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\streamlit\cli.py", line 232, in _main_run
command_line = _get_command_line_as_string()
File "C:\ProgramData\Anaconda3\envs\metview_vapor\lib\site-packages\streamlit\cli.py", line 221, in _get_command_line_as_string
cmd_line_as_list.extend(click.get_os_args())
AttributeError: module 'click' has no attribute 'get_os_args'

Here is my environment:

`conda list

packages in environment at C:\ProgramData\Anaconda3\envs\metview_vapor:

Name Version Build Channel

affine 2.3.1 pyhd8ed1ab_0 conda-forge
altair 4.2.0 pyhd8ed1ab_1 conda-forge
anyio 3.6.2 pyhd8ed1ab_0 conda-forge
appdirs 1.4.4 pyh9f0ad1d_0 conda-forge
argon2-cffi 21.3.0 pyhd8ed1ab_0 conda-forge
argon2-cffi-bindings 21.2.0 py310h8d17308_3 conda-forge
arrow-cpp 10.0.1 h9c18f36_3_cpu conda-forge
astor 0.8.1 pyh9f0ad1d_0 conda-forge
asttokens 2.0.8 pyhd8ed1ab_0 conda-forge
attrs 22.1.0 pyh71513ae_1 conda-forge
aws-c-auth 0.6.21 h1ba0662_1 conda-forge
aws-c-cal 0.5.20 h4b5e85a_3 conda-forge
aws-c-common 0.8.5 hcfcfb64_0 conda-forge
aws-c-compression 0.2.16 h3dc32ea_0 conda-forge
aws-c-event-stream 0.2.16 hb67f86a_0 conda-forge
aws-c-http 0.6.29 h844ee93_0 conda-forge
aws-c-io 0.13.11 hea55e33_2 conda-forge
aws-c-mqtt 0.7.13 h461ce70_10 conda-forge
aws-c-s3 0.2.1 h0f2ed3e_2 conda-forge
aws-c-sdkutils 0.1.7 h3dc32ea_0 conda-forge
aws-checksums 0.1.14 h3dc32ea_0 conda-forge
aws-crt-cpp 0.18.16 h09df7fd_5 conda-forge
aws-sdk-cpp 1.9.379 h4d30238_6 conda-forge
babel 2.10.3 pyhd8ed1ab_0 conda-forge
backcall 0.2.0 pyh9f0ad1d_0 conda-forge
backports 1.0 py_2 conda-forge
backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge
base58 2.1.1 pyhd8ed1ab_0 conda-forge
beautifulsoup4 4.11.1 pyha770c72_0 conda-forge
bleach 5.0.1 pyhd8ed1ab_0 conda-forge
blinker 1.5 pyhd8ed1ab_0 conda-forge
blosc 1.21.1 h74325e0_3 conda-forge
bokeh 2.4.3 pyhd8ed1ab_3 conda-forge
boltons 21.0.0 pyhd8ed1ab_0 conda-forge
boost-cpp 1.78.0 h9f4b32c_1 conda-forge
boto3 1.26.45 pyhd8ed1ab_0 conda-forge
botocore 1.29.45 pyhd8ed1ab_0 conda-forge
bottleneck 1.3.5 py310h9b08ddd_1 conda-forge
bqplot 0.12.36 pyhd8ed1ab_0 conda-forge
branca 0.6.0 pyhd8ed1ab_0 conda-forge
brotli 1.0.9 hcfcfb64_8 conda-forge
brotli-bin 1.0.9 hcfcfb64_8 conda-forge
brotli-python 1.0.9 py310h00ffb61_8 conda-forge
brotlipy 0.7.0 py310h8d17308_1005 conda-forge
bzip2 1.0.8 h8ffe710_4 conda-forge
c-ares 1.18.1 h8ffe710_0 conda-forge
ca-certificates 2022.12.7 h5b45459_0 conda-forge
cachetools 5.2.0 pyhd8ed1ab_0 conda-forge
cairo 1.16.0 hd694305_1014 conda-forge
cartopy 0.21.0 py310h05326cb_1 conda-forge
certifi 2022.12.7 pyhd8ed1ab_0 conda-forge
cffi 1.15.1 py310h628cb3f_2 conda-forge
cfgrib 0.9.10.2 pyhd8ed1ab_0 conda-forge
cfitsio 4.1.0 h5a969a9_0 conda-forge
cftime 1.6.2 py310h9b08ddd_1 conda-forge
charset-normalizer 2.1.1 pyhd8ed1ab_0 conda-forge
click 8.1.3 win_pyhd8ed1ab_2 conda-forge
click-plugins 1.1.1 py_0 conda-forge
cligj 0.7.2 pyhd8ed1ab_1 conda-forge
cloudpickle 2.2.0 pyhd8ed1ab_0 conda-forge
colorama 0.4.6 pyhd8ed1ab_0 conda-forge
colorcet 3.0.1 pyhd8ed1ab_0 conda-forge
colour 0.1.5 py_0 conda-forge
conda 22.9.0 py310h5588dad_2 conda-forge
conda-package-handling 1.9.0 py310h635b8f1_1 conda-forge
contextily 1.2.0 pyhd8ed1ab_0 conda-forge
contourpy 1.0.5 py310h232114e_1 conda-forge
cryptography 38.0.2 py310h6e82f81_2 conda-forge
curl 7.86.0 heaf79c2_0 conda-forge
cycler 0.11.0 pyhd8ed1ab_0 conda-forge
cytoolz 0.12.0 py310h8d17308_1 conda-forge
dash 2.7.1 pyhd8ed1ab_0 conda-forge
dash-bootstrap-components 1.3.0 pyhd8ed1ab_0 conda-forge
dash-core-components 2.0.0 pyhd8ed1ab_1 conda-forge
dash-daq 0.5.0 pyh9f0ad1d_1 conda-forge
dash-html-components 2.0.0 pyhd8ed1ab_1 conda-forge
dash_colorscales 0.0.4 pyh9f0ad1d_0 conda-forge
dask 2022.2.1 pyhd3eb1b0_0
dask-core 2022.2.1 pyhd3eb1b0_0
datashader 0.14.2 pyh6c4a22f_0 conda-forge
datashape 0.5.4 py_1 conda-forge
debugpy 1.6.3 py310h00ffb61_1 conda-forge
decorator 5.1.1 pyhd8ed1ab_0 conda-forge
defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge
dill 0.3.6 pyhd8ed1ab_1 conda-forge
distributed 2022.2.1 pyhd3eb1b0_0
dtale 2.9.1 pyhd8ed1ab_0 conda-forge
eccodes 2.27.0 hc5f4f04_0 conda-forge
entrypoints 0.4 pyhd8ed1ab_0 conda-forge
et_xmlfile 1.0.1 py_1001 conda-forge
executing 1.1.1 pyhd8ed1ab_0 conda-forge
expat 2.5.0 h1537add_0 conda-forge
filelock 3.9.0 pyhd8ed1ab_0 conda-forge
findlibs 0.0.2 pyhd8ed1ab_0 conda-forge
fiona 1.8.22 py310h4a685fe_5 conda-forge
flask 2.2.2 pyhd8ed1ab_0 conda-forge
flask-compress 1.13 pyhd8ed1ab_0 conda-forge
flit-core 3.7.1 pyhd8ed1ab_0 conda-forge
folium 0.14.0 pyhd8ed1ab_0 conda-forge
font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge
font-ttf-inconsolata 3.000 h77eed37_0 conda-forge
font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge
font-ttf-ubuntu 0.83 hab24e00_0 conda-forge
fontconfig 2.14.1 hbde0cde_0 conda-forge
fonts-conda-ecosystem 1 0 conda-forge
fonts-conda-forge 1 0 conda-forge
fonttools 4.38.0 py310h8d17308_1 conda-forge
freeglut 3.2.2 h0e60522_1 conda-forge
freetype 2.12.1 h546665d_0 conda-forge
freexl 1.0.6 h67ca5e6_1 conda-forge
fsspec 2022.10.0 pyhd8ed1ab_0 conda-forge
future 0.18.2 pyhd8ed1ab_6 conda-forge
gdal 3.6.0 py310he15e4ab_1 conda-forge
gdown 4.6.0 pyhd8ed1ab_0 conda-forge
geographiclib 1.52 pyhd8ed1ab_0 conda-forge
geojson 2.5.0 py_0 conda-forge
geopandas 0.9.0 pyhd8ed1ab_0 conda-forge
geopandas-base 0.12.1 pyha770c72_1 conda-forge
geopy 2.3.0 pyhd8ed1ab_0 conda-forge
geos 3.11.0 h39d44d4_0 conda-forge
geotiff 1.7.1 h4ffd875_4 conda-forge
geoviews 1.9.5 pyhd8ed1ab_0 conda-forge
geoviews-core 1.9.5 pyha770c72_0 conda-forge
gettext 0.21.1 h5728263_0 conda-forge
gflags 2.2.2 ha925a31_1004 conda-forge
gitdb 4.0.10 pyhd8ed1ab_0 conda-forge
gitpython 3.1.30 pyhd8ed1ab_0 conda-forge
glog 0.6.0 h4797de2_0 conda-forge
gmaps 0.9.0 py_0 conda-forge
hdf4 4.2.15 h0e5069d_4 conda-forge
hdf5 1.12.2 nompi_h57737ce_100 conda-forge
heapdict 1.0.1 py_0 conda-forge
holoviews 1.15.2 pyhd8ed1ab_0 conda-forge
icu 70.1 h0e60522_0 conda-forge
idna 3.4 pyhd8ed1ab_0 conda-forge
importlib-metadata 5.0.0 pyha770c72_1 conda-forge
importlib_resources 5.10.0 pyhd8ed1ab_0 conda-forge
intel-openmp 2022.1.0 h57928b3_3787 conda-forge
ipyevents 2.0.1 pyhd8ed1ab_0 conda-forge
ipyfilechooser 0.6.0 pyhd8ed1ab_0 conda-forge
ipykernel 6.16.2 pyh025b116_0 conda-forge
ipyleaflet 0.17.2 pyhd8ed1ab_0 conda-forge
ipysheet 0.7.0 pyhd8ed1ab_0 conda-forge
ipython 8.5.0 pyh08f2357_1 conda-forge
ipython_genutils 0.2.0 py_1 conda-forge
ipytree 0.2.2 pyhd8ed1ab_0 conda-forge
ipywidgets 7.7.2 pyhd8ed1ab_0 conda-forge
isodate 0.6.1 pypi_0 pypi
itsdangerous 2.1.2 pyhd8ed1ab_0 conda-forge
jasper 2.0.33 h77af90b_0 conda-forge
jedi 0.18.1 pyhd8ed1ab_2 conda-forge
jinja2 3.1.2 pyhd8ed1ab_1 conda-forge
jmespath 1.0.1 pyhd8ed1ab_0 conda-forge
joblib 1.2.0 pyhd8ed1ab_0 conda-forge
jpeg 9e h8ffe710_2 conda-forge
json5 0.9.5 pyh9f0ad1d_0 conda-forge
jsonschema 4.16.0 pyhd8ed1ab_0 conda-forge
jupyter_client 7.4.4 pyhd8ed1ab_0 conda-forge
jupyter_core 4.11.1 py310h5588dad_1 conda-forge
jupyter_server 1.21.0 pyhd8ed1ab_0 conda-forge
jupyterlab 3.5.2 pyhd8ed1ab_0 conda-forge
jupyterlab_execute_time 2.3.1 pyhd8ed1ab_0 conda-forge
jupyterlab_pygments 0.2.2 pyhd8ed1ab_0 conda-forge
jupyterlab_server 2.16.1 pyhd8ed1ab_0 conda-forge
jupyterlab_widgets 1.1.1 pyhd8ed1ab_0 conda-forge
kealib 1.4.15 hdf81f3a_1 conda-forge
keplergl 0.3.2 pyhd8ed1ab_0 conda-forge
kiwisolver 1.4.4 py310h232114e_1 conda-forge
krb5 1.19.3 hc8ab02b_0 conda-forge
lcms2 2.14 h90d422f_0 conda-forge
leafmap 0.15.0 pyhd8ed1ab_0 conda-forge
lerc 4.0.0 h63175ca_0 conda-forge
libabseil 20220623.0 cxx17_h1a56200_6 conda-forge
libaec 1.0.6 h39d44d4_0 conda-forge
libarrow 10.0.1 h226723c_3_cpu conda-forge
libblas 3.9.0 16_win64_mkl conda-forge
libbrotlicommon 1.0.9 hcfcfb64_8 conda-forge
libbrotlidec 1.0.9 hcfcfb64_8 conda-forge
libbrotlienc 1.0.9 hcfcfb64_8 conda-forge
libcblas 3.9.0 16_win64_mkl conda-forge
libcrc32c 1.1.2 h0e60522_0 conda-forge
libcurl 7.86.0 heaf79c2_0 conda-forge
libdeflate 1.14 hcfcfb64_0 conda-forge
libffi 3.4.2 h8ffe710_5 conda-forge
libgdal 3.6.0 hc5f2fbc_1 conda-forge
libglib 2.74.1 he8f3873_1 conda-forge
libgoogle-cloud 2.5.0 h5fc25aa_1 conda-forge
libgrpc 1.51.1 h6a6baca_0 conda-forge
libiconv 1.17 h8ffe710_0 conda-forge
libkml 1.3.0 hf2ab4e4_1015 conda-forge
liblapack 3.9.0 16_win64_mkl conda-forge
libnetcdf 4.8.1 nompi_h85765be_104 conda-forge
libpng 1.6.38 h19919ed_0 conda-forge
libpq 14.5 hf15792c_2 conda-forge
libprotobuf 3.21.12 h12be248_0 conda-forge
librttopo 1.1.0 h2842628_11 conda-forge
libsodium 1.0.18 h8d14728_1 conda-forge
libspatialindex 1.9.3 h39d44d4_4 conda-forge
libspatialite 5.0.1 hd560d62_21 conda-forge
libsqlite 3.39.4 hcfcfb64_0 conda-forge
libssh2 1.10.0 h9a1e1f7_3 conda-forge
libthrift 0.16.0 h9ce19ad_2 conda-forge
libtiff 4.4.0 h8e97e67_4 conda-forge
libutf8proc 2.8.0 h82a8f57_0 conda-forge
libwebp-base 1.2.4 h8ffe710_0 conda-forge
libxcb 1.13 hcd874cb_1004 conda-forge
libxml2 2.10.3 hc3477c8_0 conda-forge
libzip 1.9.2 h519de47_1 conda-forge
libzlib 1.2.13 hcfcfb64_4 conda-forge
llvmlite 0.39.1 py310hb84602e_1 conda-forge
locket 1.0.0 pyhd8ed1ab_0 conda-forge
lxml 4.9.2 pypi_0 pypi
lz4 4.2.0 py310hbbb2075_0 conda-forge
lz4-c 1.9.3 h8ffe710_1 conda-forge
m2w64-gcc-libgfortran 5.3.0 6 conda-forge
m2w64-gcc-libs 5.3.0 7 conda-forge
m2w64-gcc-libs-core 5.3.0 7 conda-forge
m2w64-gmp 6.1.0 2 conda-forge
m2w64-libwinpthread-git 5.0.0.4634.697f757 2 conda-forge
markdown 3.4.1 pyhd8ed1ab_0 conda-forge
markupsafe 2.1.1 py310h8d17308_2 conda-forge
matplotlib-base 3.6.1 py310h51140c5_1 conda-forge
matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge
menuinst 1.4.19 py310h5588dad_1 conda-forge
mercantile 1.2.1 pyhd8ed1ab_0 conda-forge
metpy 1.3.1 pyhd8ed1ab_0 conda-forge
metview-python 1.13.0 pyhd8ed1ab_0 conda-forge
missingno 0.4.2 py_1 conda-forge
mistune 2.0.4 pyhd8ed1ab_0 conda-forge
mkl 2022.1.0 h6a75c08_874 conda-forge
msgpack-python 1.0.4 py310h232114e_1 conda-forge
msys2-conda-epoch 20160418 1 conda-forge
multipledispatch 0.6.0 py_0 conda-forge
multiprocess 0.70.14 py310h8d17308_3 conda-forge
munch 2.5.0 py_0 conda-forge
munkres 1.1.4 pyh9f0ad1d_0 conda-forge
nbclassic 0.4.5 pyhd8ed1ab_0 conda-forge
nbclient 0.7.0 pyhd8ed1ab_0 conda-forge
nbconvert 7.2.3 pyhd8ed1ab_0 conda-forge
nbconvert-core 7.2.3 pyhd8ed1ab_0 conda-forge
nbconvert-pandoc 7.2.3 pyhd8ed1ab_0 conda-forge
nbformat 5.7.0 pyhd8ed1ab_0 conda-forge
nest-asyncio 1.5.6 pyhd8ed1ab_0 conda-forge
netcdf4 1.6.1 nompi_py310h459bb5f_101 conda-forge
networkx 2.8.8 pyhd8ed1ab_0 conda-forge
noaa-coops 0.1.9 pypi_0 pypi
noaa-sdk 0.1.21 pypi_0 pypi
notebook 6.5.1 pyha770c72_0 conda-forge
notebook-shim 0.2.0 pyhd8ed1ab_0 conda-forge
numba 0.56.3 py310h19bcfe9_0 conda-forge
numpy 1.23.4 py310h4a8f9c9_1 conda-forge
nwsapy 1.0.3 pypi_0 pypi
openjpeg 2.5.0 hc9384bd_1 conda-forge
openpyxl 3.0.10 py310h8d17308_2 conda-forge
openssl 3.0.7 hcfcfb64_2 conda-forge
packaging 21.3 pyhd8ed1ab_0 conda-forge
pandas 1.5.3 py310h1c4a608_0 conda-forge
pandoc 2.19.2 h57928b3_1 conda-forge
pandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge
panel 0.14.1 pyhd8ed1ab_0 conda-forge
param 1.12.2 pyh6c4a22f_0 conda-forge
parquet-cpp 1.5.1 2 conda-forge
parso 0.8.3 pyhd8ed1ab_0 conda-forge
partd 1.3.0 pyhd8ed1ab_0 conda-forge
pathos 0.3.0 pyhd8ed1ab_0 conda-forge
patsy 0.5.3 pyhd8ed1ab_0 conda-forge
pcre 8.45 h0e60522_0 conda-forge
pcre2 10.40 h17e33f8_0 conda-forge
pickleshare 0.7.5 py_1003 conda-forge
pillow 9.2.0 py310hd4fb230_3 conda-forge
pint 0.20.1 pyhd8ed1ab_0 conda-forge
pip 22.3 pyhd8ed1ab_0 conda-forge
pixman 0.40.0 h8ffe710_0 conda-forge
pkgutil-resolve-name 1.3.10 pyhd8ed1ab_0 conda-forge
platformdirs 2.6.2 pypi_0 pypi
plotly 5.9.0 py310haa95532_0
pooch 1.6.0 pyhd8ed1ab_0 conda-forge
poppler 22.11.0 ha6c1112_0 conda-forge
poppler-data 0.4.11 hd8ed1ab_0 conda-forge
postgresql 14.5 h58a5ca5_2 conda-forge
pox 0.3.2 pyhd8ed1ab_0 conda-forge
ppft 1.7.6.6 pyhd8ed1ab_0 conda-forge
proj 9.1.0 h3863b3b_0 conda-forge
prometheus_client 0.15.0 pyhd8ed1ab_0 conda-forge
prompt-toolkit 3.0.31 pyha770c72_0 conda-forge
protobuf 4.21.12 py310h00ffb61_0 conda-forge
pscript 0.7.7 pyhd8ed1ab_0 conda-forge
psutil 5.9.3 py310h8d17308_1 conda-forge
pthread-stubs 0.4 hcd874cb_1001 conda-forge
pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge
pyarrow 10.0.1 py310hf00d861_3_cpu conda-forge
pycosat 0.6.4 py310h8d17308_1 conda-forge
pycparser 2.21 pyhd8ed1ab_0 conda-forge
pycrs 1.0.2 py_0 conda-forge
pyct 0.4.6 py_0 conda-forge
pyct-core 0.4.6 py_0 conda-forge
pydeck 0.8.0 pyhd8ed1ab_0 conda-forge
pygments 2.13.0 pyhd8ed1ab_0 conda-forge
pympler 1.0.1 pyhd8ed1ab_0 conda-forge
pyopenssl 22.1.0 pyhd8ed1ab_0 conda-forge
pyparsing 3.0.9 pyhd8ed1ab_0 conda-forge
pyproj 3.4.0 py310h0e9dbc5_2 conda-forge
pyrsistent 0.18.1 py310h8d17308_2 conda-forge
pyshp 2.3.1 pyhd8ed1ab_0 conda-forge
pysocks 1.7.1 pyh0701188_6 conda-forge
pystac 1.6.1 pyhd8ed1ab_1 conda-forge
pystac-client 0.5.1 pyhd8ed1ab_0 conda-forge
python 3.10.6 hcf16a7b_0_cpython conda-forge
python-awips 18.1.11 pyhd8ed1ab_0 conda-forge
python-box 6.1.0 py310h8d17308_0 conda-forge
python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge
python-eccodes 1.4.2 py310h2873277_0 conda-forge
python-fastjsonschema 2.16.2 pyhd8ed1ab_0 conda-forge
python-tzdata 2022.7 pyhd8ed1ab_0 conda-forge
python_abi 3.10 2_cp310 conda-forge
pytz 2022.5 pyhd8ed1ab_0 conda-forge
pytz-deprecation-shim 0.1.0.post0 py310h5588dad_3 conda-forge
pyviz_comms 2.2.1 pyhd8ed1ab_1 conda-forge
pywin32 304 py310h00ffb61_2 conda-forge
pywinpty 2.0.9 py310h00ffb61_0 conda-forge
pyyaml 6.0 py310h8d17308_5 conda-forge
pyzmq 24.0.1 py310hcd737a0_1 conda-forge
rasterio 1.3.4 py310h1f46e14_0 conda-forge
re2 2022.06.01 h0e60522_1 conda-forge
requests 2.28.2 pyhd8ed1ab_0 conda-forge
requests-file 1.5.1 pypi_0 pypi
requests-toolbelt 0.10.1 pypi_0 pypi
rtree 1.0.1 py310h1cbd46b_1 conda-forge
ruamel.yaml 0.17.21 py310h8d17308_2 conda-forge
ruamel.yaml.clib 0.2.7 py310h8d17308_1 conda-forge
ruamel_yaml 0.15.80 py310h8d17308_1008 conda-forge
s3transfer 0.6.0 pyhd8ed1ab_0 conda-forge
scikit-learn 1.2.0 py310had3394f_0 conda-forge
scipy 1.9.3 py310h578b7cb_1 conda-forge
scooby 0.7.0 pyhd8ed1ab_1 conda-forge
seaborn 0.10.1 py_0 conda-forge
semver 2.13.0 pyh9f0ad1d_0 conda-forge
send2trash 1.8.0 pyhd8ed1ab_0 conda-forge
setuptools 65.5.0 pyhd8ed1ab_0 conda-forge
shapely 1.8.5 py310h3734685_1 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
smmap 3.0.5 pyh44b312d_0 conda-forge
snappy 1.1.9 hfb803bf_2 conda-forge
sniffio 1.3.0 pyhd8ed1ab_0 conda-forge
snuggs 1.4.7 py_0 conda-forge
sortedcontainers 2.4.0 pyhd8ed1ab_0 conda-forge
soupsieve 2.3.2.post1 pyhd8ed1ab_0 conda-forge
sqlite 3.39.4 hcfcfb64_0 conda-forge
squarify 0.4.3 py_0 conda-forge
stack_data 0.5.1 pyhd8ed1ab_0 conda-forge
statsmodels 0.13.5 py310h9b08ddd_2 conda-forge
streamlit 1.8.0 pyhd8ed1ab_0 conda-forge
streamlit-folium 0.11.0 pyhd8ed1ab_0 conda-forge
strsimpy 0.1.9 pyh9f0ad1d_0 conda-forge
tbb 2021.6.0 h91493d7_1 conda-forge
tblib 1.7.0 pyhd8ed1ab_0 conda-forge
tenacity 8.1.0 pyhd8ed1ab_0 conda-forge
terminado 0.17.0 pyh08f2357_0 conda-forge
threadpoolctl 3.1.0 pyh8a188c0_0 conda-forge
tiledb 2.11.3 h3132609_1 conda-forge
tinycss2 1.2.1 pyhd8ed1ab_0 conda-forge
tk 8.6.12 h8ffe710_0 conda-forge
toml 0.10.2 pyhd8ed1ab_0 conda-forge
tomli 2.0.1 pyhd8ed1ab_0 conda-forge
toolz 0.12.0 pyhd8ed1ab_0 conda-forge
tornado 6.2 py310h8d17308_1 conda-forge
tqdm 4.64.1 pyhd8ed1ab_0 conda-forge
traitlets 5.5.0 pyhd8ed1ab_0 conda-forge
traittypes 0.2.1 pyh9f0ad1d_2 conda-forge
typing_extensions 4.4.0 pyha770c72_0 conda-forge
tzdata 2022e h191b570_0 conda-forge
tzlocal 4.2 py310h5588dad_2 conda-forge
ucrt 10.0.22621.0 h57928b3_0 conda-forge
unicodedata2 14.0.0 py310h8d17308_2 conda-forge
urllib3 1.26.11 pyhd8ed1ab_0 conda-forge
validators 0.18.2 pyhd3deb0d_0 conda-forge
vc 14.3 h3d8a991_9 conda-forge
vs2015_runtime 14.32.31332 h1d6e394_9 conda-forge
watchdog 2.2.1 py310h5588dad_0 conda-forge
wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge
webencodings 0.5.1 py_1 conda-forge
websocket-client 1.4.1 pyhd8ed1ab_0 conda-forge
werkzeug 2.2.2 pyhd8ed1ab_0 conda-forge
wheel 0.37.1 pyhd8ed1ab_0 conda-forge
whitebox 2.2.0 pyhd8ed1ab_0 conda-forge
whiteboxgui 2.2.0 pyhd8ed1ab_0 conda-forge
widgetsnbextension 3.6.1 pyha770c72_0 conda-forge
win_inet_pton 1.1.0 py310h5588dad_5 conda-forge
winpty 0.4.3 4 conda-forge
xarray 2022.10.0 pyhd8ed1ab_0 conda-forge
xerces-c 3.2.4 h63175ca_1 conda-forge
xlrd 2.0.1 pyhd8ed1ab_3 conda-forge
xorg-kbproto 1.0.7 hcd874cb_1002 conda-forge
xorg-libx11 1.7.2 hcd874cb_0 conda-forge
xorg-libxau 1.0.9 hcd874cb_0 conda-forge
xorg-libxdmcp 1.1.3 hcd874cb_0 conda-forge
xorg-xproto 7.0.31 hcd874cb_1007 conda-forge
xyzservices 2022.9.0 pyhd8ed1ab_0 conda-forge
xz 5.2.6 h8d14728_0 conda-forge
yaml 0.2.5 h8ffe710_2 conda-forge
zeep 4.2.1 pypi_0 pypi
zeromq 4.3.4 h0e60522_1 conda-forge
zict 2.2.0 pyhd8ed1ab_0 conda-forge
zipp 3.10.0 pyhd8ed1ab_0 conda-forge
zlib 1.2.13 hcfcfb64_4 conda-forge
zstd 1.5.2 h7755175_4 conda-forge`

Question: can we get more information on "last_object_clicked" than 'lat', 'lng'

Hello,

Thank you very much for this library. I am wondering if we can get more information from "last_object_clicked" than 'lat', 'lng'? For example, I set a marker with "popup" and "location". When I click on it and generate an output "last_object_clicked", it generates only 'lat' and 'lng'. I would like to also be able to return 'text from popup'. Is that possible? Or maybe some other attributes related to the marker, so that eventually I can identify which marker was clicked.

Thanks!

st_folium function arguments regarding when outputs is returned and the page rerun

Hi Randy,

Thanks a lot for developing streamlit-folium. I've been using both 'folium_static' and 'st_folium' with great success. st_folium in particular is a highly powerful tool that I have found allows users to interact with the flexibility offered by folium in a whole new way.

I had a question regarding the EventListener/RENDER_EVENT currently implemented by the module (i.e., when the map component triggers a reload of streamlit and returns data).

As I have continued to use st_folium to display burdensome geographic data I have become acutely more aware that I would love flexibility regarding when the map element returns data to python. I understand the philosophy that a python script rendering a folium map should be aware of the boundary box, level of zoom, etc. that is currently being displayed by the folium map object. However, I also believe that information should only be returned to the streamlit page when it is pertinent to do so, as providing flexibility into when a 'rerun' of streamlit is generated enhances the user experience by mitigating load times.

Shapefiles can be burdensome to render and display, as they may be large objects. I have been using st_folium to develop reactive components of a larger app, where other tables, summary information, etc. has been dependent upon which displayed layers have been "last clicked" by the user.

Because this is one piece of a larger dashboard page, there is a lot that is re-processed when the st_folium component is interacted with. I've found that this has negatively affected the processing time of the dashboard whenever it is refreshed. I have been utilising the singleton and memoization (i.e., experimental_singletion & experimental_memo) capabilities as much as I can, however, I believe that further control into when the st_folium element triggers a rerun of streamlit will help in this process.

For example, if I have certain information displayed within the st_folium element, I only want to adjust the information displayed throughout the dashboard when a particular polygon/marker has been selected. An example of this could be polygons of different regions within the United States, where selecting a polygon provides state-level census information throughout the remainder of the streamlit page (tables, etc.). Under the current EventListener of st_folium, however, a trigger occurs if the user moves around on the map, zooms in, etc.

The boundaries and zoom currently viewed on the map is not of significant importance to the information output by the element of this example, as the user may want to get a closer look at the particular boundaries of a polygon by zooming in, move around on the map to view other polygons/markers, zoom out to obtain an aggregated view, etc. Selecting a particular polygon/marker, however, will provide greater information across the streamlit page regarding what they have just reacted to.

Under the current iteration of st_folium, any response to the map element will trigger a complete re-run of the underlying python script. Even if this trigger only takes a second or so, the event being triggered directly impacts the user, as the entire page will transition into a "light gray" as it re-runs the existing python script. This will then occur whenever the user moves around on the map or zooms in/out.

I would therefore love the capability to limit the conditions under which data is returned to streamlit, and a full rerun of the page is triggered.

I have been utilising memoization and singletons as much as I can, but if there are many polygons/markers presented on a st_folium map object, it may a non-trivial amount of time (i.e., more than a second) to re-render the map. Using folium_static will amend this issue, as the streamlit page will no longer re-run whilst interacting with the map. However, folium_static also removes the ability to select, identify, and summarise information within the greater streamlit page.

Including argument(s) that determine the events that trigger outputs to the streamlit page would provide a medium between the folium_static and st_folium functions. It would allow developers greater control regarding how a map element is interacted with. Warning against the potential downsides of disabling certain events could be considered within documentation, but I believe such capability would be of great benefit to both the st_folium function and the wider streamlit-folium and streamlit community.

Please feel free to contact me if you feel that this would be of value to your module, as i'm more than happy to assist in this development process.

Many thanks.

`all_drawings` always empty list?

Unless I'm missing something, the functionality implemented in #32 seems to not be working as expected: the all_drawings list is always [].

The best way to see this is by going to the example and use the Plugin: Draw page.

0.9.0 issues

Hi, FYI I just noticed the update to v0.9.0, and am now getting Uncaught Error: Map container not found with a fresh python virtual environment (python 3.10.9) environment running the example:

import folium
import streamlit as st

from streamlit_folium import st_folium

# center on Liberty Bell, add marker
m = folium.Map(location=[39.949610, -75.150282], zoom_start=16)
folium.Marker(
    [39.949610, -75.150282], popup="Liberty Bell", tooltip="Liberty Bell"
).add_to(m)

# call to render Folium map in Streamlit
st_data = st_folium(m, width=725)```

st_folium breaks some map features

Hi, thank you for adding bi-directional support, this is a great feature! However some map features don't work with st_folium().

  • The marker popup doesn't appear when clicking a marker.
  • When adding a LayerControl the button appears but it flickers when hovering.
  • The map shrinks when adding some elements like an Icon() to the marker or a Draw() plugin.

With st_folium() :
image

With folium_static():
image

Here's the code:

from streamlit_folium import folium_static, st_folium
from folium import plugins
import folium

m = folium.Map(location=[39.94, -75.15], zoom_start=5)
folium.Marker(
    location=[39.94, -75.15],
    popup="Marker",
    icon=folium.Icon(),
).add_to(m)
plugins.Draw().add_to(m)
folium.LayerControl().add_to(m)

# does not work with st_folium
st_folium(m, key="fig1", width=700, height=700)
# everything works with folium_static
folium_static(m)

Returning Latitude, Longitude values from folium map on mouse click to python script (streamlit webapp)

I am writing a webapp where the user will click on the map and the latitude, longitude will be returned to the python script. the webapp is written on streamlit and for the map I am using folium. Currently, I used folium.LatLngPopup() to get the on click lat long of the clicked location, but I am very confused how to retrieve the values in my python script for further processing.

This is how it looks currently:

This is how it looks currently

#code snippet

import streamlit as st
from streamlit_folium import folium_static
import folium
m = folium.Map()
m.add_child(folium.LatLngPopup())
folium_static(m)

There might not be a native solution to it but any workaround will be appreciated!

Way to not rerender/persist the map on rerun

I am constantly adding gps data into a deque and plotting it with streamlit-folium. Every time though, I'm recreating a Folium object and rendering it with this library, resulting in a stuttery appearance because the site is blank for a fraction of a second. I'm wondering if there's any way around this.

I assume there's no easy way or it would be implemented, but maybe there's a out-of-the-box solution, like setting the transition time really long for the iframe so that it doesn't just disappear, giving the appearance of continuity?

Using Draw plugin, drawing a circle doesn't return radius

When doing the draw_support demo, if you draw a circle the screen will show the radius. The radius isn't returned back, but rather a point. Would be great to get the radius back with the point, so that the circle drawn is known

streamlit-folium conda install downgradng streamlit to 1.9.0!

$ conda install -c conda-forge streamlit-folium
$
$ conda list streamlit
# packages in environment at /home/xxx/miniconda3/envs/st:
#
# Name                    Version                   Build  Channel
streamlit                 1.9.0              pyhd8ed1ab_0    conda-forge
streamlit-folium          0.11.0             pyhd8ed1ab_0    conda-forge

Your app is having trouble loading the streamlit_folium.st_folium component.

Hi great job on this library it has been invaluable for my project.

Lately I have been getting this issue
Your app is having trouble loading the streamlit_folium.st_folium component.
both on the locally hosted and on streamlit share version. I have been doing lots of updates so not sure which change actually kicked this off. I have seem other people have this error with other components so not sure the cause (PablocFonseca/streamlit-aggrid#7).

If you leave it a minute or so the map will eventually load (and this issue only occurs sometimes). Does anyone have any thoughts?

Error when I try to add plugins.FloatImage with st_folium

Hi ๐Ÿ‘‹

... and thanks for providing this great addition to streamlit.

I was wondering: are folium.plugins generally supported? I wanted to add a FloatImage to the canvas (using st_folium) but I get an error:

.../lib/python3.11/site-packages/streamlit_folium/__init__.py", line 242, in generate_leaflet_string
    leaflet = m._template.module.script(m)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'TemplateModule' object has no attribute 'script'

I see there's some special magic for the DualMap plugins - so maybe the FloatImage requires some special treatment, too?

I'm using python 3.11 and streamlit-folium 0.7

Cheers,
C

Branca legend not appearing

I followed this example to add a legend to a folium map (although I didn't make mine draggable). The legend appears in the jupyter notebook I used to test my code before developing the streamlit app. The map itself renders correctly in the streamlit map using st_folium() but the legend does not show up.

Problem using st_folium

Hi,
I have an error when I using st_folium(map) instead of folium_static(map). When I usign st_folium I have the error bellow:

leaflet = m._template.module.script(m)
AttributeError: 'TemplateModule' object has no attribute 'script'

When I using folium_static(map) the maps renders perfect.
Thanks!

Code:

#m map generated with folium
st.title('GDM')
#static_map_=folium_static(m, width=1000, height=1000)
st_data_ = st_folium(m, width = 725)
print(sta_data_)
m.save('./GDM_streamlit_'+ parcela + '.html')


Assign map width as percentage in st_folium

Hi there, I am wondering is it possible to assign the map width as percentage in st_folium? If this option is not offered, why?

Not an expert in streamlit component yet. Could anybody explain the reason behind that? Thanks!

Editing+Saving modified drawn layer does not update geometry

Thanks a lot for this great library!

I'm using streamlit-folium in mapa-streamlit and I believe we have found a bug.

Observed Behavior

When drawing a rectangle on the folium map, the streamlit app "Running" mode seems to get triggered whenever the rectangle was finished drawing. I can then access the resulting geojson geometry of the rectangle. That is expected and in line with the desired behavior. However, if I now were to edit the drawn rectangle using the "Edit layers" button (see below picture), the streamlit "running" mode does not get triggered when I click on "Save". At the same time, if I inspect the given geojson geometry, it is still the same and did not get updated to the modified geometry.

Desired Behavior

Updating a drawn layer (e.g. a rectangle) using the edit button updates the output of st_folium.

Picture for reference:
Screenshot 2022-04-10 at 10 59 53

Backdated Folium Version

While I installed streamlit-folium, I noticed that it uninstalled my existing folium module version = 0.12.1 and reinstall folium version = 0.11.0
Then I searched in your github and found in the setup.py file
install_requires=["streamlit>=0.63", "folium==0.11"]
My question is, is it necessary to use folium version 0.11.0? Or Can you set the code
install_requires=["streamlit>=0.63", "folium>=0.11"]
By the way,
Thank you so much for the hard work you have done. This module helps a lot.

Fix test process

Test suite relies on pixel-perfect accuracy between PR code and existing baseline. Tests have been failing this week, presumably from updating the baseline using macOS but running the tests using a Linux image.

Figure out issue, fix

Map width cannot be increased when using st_folium

Hi there, I noticed that the map width doesn't change in my web app when the width argument in st_folium is modified. The height argument works well though. You may find my code to reproduce the web app below. Thank you.

import pandas as pd 
import numpy as np
import json 
from geopy.geocoders import Nominatim 
import requests 
import folium 
import streamlit as st 
from streamlit_folium import folium_static, st_folium


def center():
   address = 'Singapore'
   geolocator = Nominatim(user_agent="id_explorer")
   location = geolocator.geocode(address)
   latitude = location.latitude
   longitude = location.longitude
   return latitude, longitude


def tiles_func(input):
    
    mapping = {
        "OpenStreetMap" : "OpenStreetMap",
        "https://maps-a.onemap.sg/v3/Grey/{z}/{x}/{y}.png" : "OneMap"
    }
    
    output = mapping[input]
    
    return output

centers = center()
options = ("https://maps-a.onemap.sg/v3/Grey/{z}/{x}/{y}.png", "OpenStreetMap")    

add_select = st.sidebar.selectbox(label="Choose your base map", options=options, format_func=tiles_func)

m = folium.Map(tiles=add_select, location=[centers[0], centers[1]], zoom_start=11, attr="map")
m.add_child(folium.LatLngPopup())
st.title('Map of Singapore')

data = st_folium(m, width=2000)

if data["last_clicked"] is None:
    data = ""
else:
    st.text(f'Latitude: {data["last_clicked"]["lat"]}\nLongitude: {data["last_clicked"]["lng"]}')

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.