Spaces:
Runtime error
Runtime error
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() | |