import streamlit as st import pandas as pd import folium from streamlit_folium import st_folium from streamlit_js_eval import get_geolocation import time # تنظیمات صفحه st.set_page_config(page_title="برداشت مسیر فیبر نوری", layout="wide") st.title("📍 سامانه ثبت مسیر و نقاط پروژه") st.write("ابتدا اجازه دسترسی به GPS را در مرورگر تایید کنید.") # ایجاد حافظه موقت برای ذخیره نقاط if 'points' not in st.session_state: st.session_state.points = [] # دریافت موقعیت لحظه‌ای از مرورگر location = get_geolocation() col1, col2 = st.columns([1, 3]) with col1: st.subheader("کنترل") if location: lat = location['coords']['latitude'] lon = location['coords']['longitude'] acc = location['coords']['accuracy'] st.success(f"موقعیت یافت شد!\nدقت: {acc} متر") st.info(f"Lat: {lat}\nLon: {lon}") if st.button("📌 ثبت نقطه (باکس/تقاطع)", use_container_width=True): new_point = { "time": time.strftime("%H:%M:%S"), "lat": lat, "lon": lon, "acc": acc } st.session_state.points.append(new_point) st.toast("نقطه با موفقیت ثبت شد") else: st.warning("در حال دریافت سیگنال GPS... (مطمئن شوید Location گوشی روشن است)") if st.button("🗑️ پاکسازی کل مسیر", type="primary", use_container_width=True): st.session_state.points = [] st.rerun() # نمایش لیست نقاط ثبت شده if st.session_state.points: st.write("---") st.write("نقاط ثبت شده:") df = pd.DataFrame(st.session_state.points) st.dataframe(df[["time", "lat", "lon"]], hide_index=True) with col2: # رسم نقشه # مرکز نقشه بر اساس آخرین نقطه یا مختصات پیش‌فرض تهران center_lat = st.session_state.points[-1]['lat'] if st.session_state.points else 35.6892 center_lon = st.session_state.points[-1]['lon'] if st.session_state.points else 51.3890 m = folium.Map(location=[center_lat, center_lon], zoom_start=18) # رسم نقاط و خطوط path_coords = [] for p in st.session_state.points: path_coords.append([p['lat'], p['lon']]) folium.CircleMarker( location=[p['lat'], p['lon']], radius=5, color='red', fill=True, popup=f"Time: {p['time']}" ).add_to(m) # وصل کردن نقاط به هم با خط if len(path_coords) > 1: folium.PolyLine(path_coords, color="blue", weight=3, opacity=0.8).add_to(m) # نمایش نقشه st_folium(m, width="100%", height=600, key="map") # امکان دانلود خروجی ساده if st.session_state.points: csv = pd.DataFrame(st.session_state.points).to_csv(index=False).encode('utf-8') st.download_button("📥 دانلود فایل CSV نقاط", csv, "survey_points.csv", "text/csv")