Spaces:
Running
Running
| 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") | |