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()