tracker / app.py
rezaatashi's picture
Create app.py
75b5149 verified
Raw
History Blame Contribute Delete
3.22 kB
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")