File size: 2,590 Bytes
17e77ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import folium
from streamlit_folium import folium_static
import json


def extract_coordinates(coords):
    """
    只提取前两个数值(经度、纬度),并返回格式化后的坐标列表
    兼容输入可能是 [(lon, lat, ...), (lon, lat, ...)]
    """
    filtered_coords = []
    for coord in coords:
        if isinstance(coord, (list, tuple)) and len(coord) >= 2:
            filtered_coords.append([float(coord[0]), float(coord[1])])  # 只取前两个数值(经度、纬度)
    return filtered_coords


def draw_polygon(coords):
    """ 在 Streamlit 页面上显示地图,并绘制输入的多边形 """
    filtered_coords = extract_coordinates(coords)

    if not filtered_coords:
        st.error("无法解析有效的坐标点,请检查输入格式!")
        return

    # 计算中心点(取第一个点作为地图中心)
    centroid = filtered_coords[0]

    # 创建地图
    my_map = folium.Map(location=[centroid[1], centroid[0]], zoom_start=12)

    # 添加多边形
    folium.Polygon(
        locations=[(lat, lon) for lon, lat in filtered_coords],  # Folium 坐标格式 (纬度, 经度)
        color="blue",
        fill=True,
        fill_color="green",
        fill_opacity=0.3,
        weight=2
    ).add_to(my_map)

    # 显示地图
    folium_static(my_map)


# Streamlit 主函数
def main():
    st.title("多边形地图可视化(支持列表和元组格式)")

    # 默认示例(同时包含列表和元组)
    default_input = '''[
        (151.0214153323324, -33.896092570872, 173.6675068465629),
        [151.022519, -33.897120, 172.53421],
        (151.023621, -33.898150, 170.49214),
        (151.0214153323324, -33.896092570872, 173.6675068465629)
    ]'''

    # 用户输入坐标集
    coord_input = st.text_area("请输入坐标集(JSON 格式)", default_input)

    # 创建按钮
    if st.button("显示地图"):
        try:
            # 解析用户输入的 JSON 格式坐标
            coords = json.loads(coord_input.replace("(", "[").replace(")", "]"))  # 兼容 ( ) 格式
            if isinstance(coords, list) and all(
                    isinstance(coord, (list, tuple)) and len(coord) >= 2 for coord in coords):
                draw_polygon(coords)
            else:
                st.error("请输入正确格式的坐标集,例如:[(经度, 纬度, 可选值), ...] 或 [[经度, 纬度, 可选值], ...]")
        except json.JSONDecodeError:
            st.error("请输入有效的 JSON 格式数据!")


if __name__ == "__main__":
    main()