File size: 3,127 Bytes
9ad0e2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import os
import fiona
import geopandas as gpd
import streamlit as st


def save_uploaded_file(file_content, file_name):
    """
    Save the uploaded file to a temporary directory
    """
    import tempfile
    import os
    import uuid

    _, file_extension = os.path.splitext(file_name)
    file_id = str(uuid.uuid4())
    file_path = os.path.join(tempfile.gettempdir(), f"{file_id}{file_extension}")

    with open(file_path, "wb") as file:
        file.write(file_content.getbuffer())

    return file_path


def app():

    st.title("Upload Vector Data")

    row1_col1, row1_col2 = st.columns([2, 1])
    width = 950
    height = 600

    with row1_col2:

        backend = st.selectbox(
            "Select a plotting backend", ["folium", "kepler.gl", "pydeck"], index=2
        )

        if backend == "folium":
            import leafmap.foliumap as leafmap
        elif backend == "kepler.gl":
            import leafmap.kepler as leafmap
        elif backend == "pydeck":
            import leafmap.deck as leafmap

        url = st.text_input(
            "Enter a URL to a vector dataset",
            "https://github.com/giswqs/streamlit-geospatial/raw/master/data/us_states.geojson",
        )

        data = st.file_uploader(
            "Upload a vector dataset", type=["geojson", "kml", "zip", "tab"]
        )

        container = st.container()

        if data or url:
            if data:
                file_path = save_uploaded_file(data, data.name)
                layer_name = os.path.splitext(data.name)[0]
            elif url:
                file_path = url
                layer_name = url.split("/")[-1].split(".")[0]

            with row1_col1:
                if file_path.lower().endswith(".kml"):
                    fiona.drvsupport.supported_drivers["KML"] = "rw"
                    gdf = gpd.read_file(file_path, driver="KML")
                else:
                    gdf = gpd.read_file(file_path)
                lon, lat = leafmap.gdf_centroid(gdf)
                if backend == "pydeck":

                    column_names = gdf.columns.values.tolist()
                    random_column = None
                    with container:
                        random_color = st.checkbox("Apply random colors", True)
                        if random_color:
                            random_column = st.selectbox(
                                "Select a column to apply random colors", column_names
                            )

                    m = leafmap.Map(center=(lat, lon))
                    m.add_gdf(gdf, random_color_column=random_column)
                    st.pydeck_chart(m)

                else:
                    m = leafmap.Map(center=(lat, lon), draw_export=True)
                    m.add_gdf(gdf, layer_name=layer_name)
                    # m.add_vector(file_path, layer_name=layer_name)
                    if backend == "folium":
                        m.zoom_to_gdf(gdf)
                    m.to_streamlit(width=width, height=height)

        else:
            with row1_col1:
                m = leafmap.Map()
                st.pydeck_chart(m)