import streamlit as st import folium from streamlit_folium import st_folium import pandas as pd import requests from datetime import datetime import ee # ---- اتصال به Google Earth Engine ---- service_account = 'earth-engine-service-account@ee-esmaeilkiani1387.iam.gserviceaccount.com' credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani1387-1b2c5e812a1d.json') ee.Initialize(credentials) # تنظیمات اولیه صفحه st.set_page_config(page_title="نمایش مسیر و پیش‌بینی آب‌وهوا", layout="wide") # کلید API هواشناسی openweather_api_key = "ed47316a45379e2221a75f813229fb46" # جایگزین با کلید API خود # ---- بارگذاری داده‌های مزارع از فایل CSV ---- @st.cache_data(ttl=3600, max_entries=10) # کش به مدت 1 ساعت و حداکثر 10 ورودی def load_farm_data(file_path): return pd.read_csv(file_path) farms_data = load_farm_data("Farm_Details_Export.csv") # مسیر فایل CSV خود را تنظیم کنید # ---- تابع برای پیدا کردن مزرعه بر اساس نام ---- def find_farm_by_name(farm_name): farm = farms_data[farms_data["farm_name"] == farm_name] if not farm.empty: return farm.iloc[0] # اولین ردیف مطابقت داده شده return None # ---- تابع برای دریافت اطلاعات آب‌وهوا ---- @st.cache_data(ttl=600, max_entries=20) # کش پاسخ‌های API به مدت 10 دقیقه def get_weather_data(lat, lon): url = f"http://api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&appid={openweather_api_key}&units=metric" response = requests.get(url) if response.status_code == 200: return response.json() else: st.error("خطا در دریافت اطلاعات آب‌وهوا.") return None # ---- تابع برای رسم نقشه با Google Earth Engine ---- def create_map(user_coords, farm_coords, farm_name): # ایجاد نقشه پایه با استفاده از Google Earth Engine map_ = folium.Map(location=user_coords, zoom_start=12, tiles=None) folium.TileLayer(tiles="https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}", attr="Google Earth Engine", name="Satellite").add_to(map_) folium.Marker(user_coords, popup="موقعیت شما", icon=folium.Icon(color="blue")).add_to(map_) folium.Marker(farm_coords, popup=f"مزرعه {farm_name}", icon=folium.Icon(color="green")).add_to(map_) # اضافه کردن مسیر route_url = f"http://router.project-osrm.org/route/v1/driving/{user_coords[1]},{user_coords[0]};{farm_coords[1]},{farm_coords[0]}?overview=full&geometries=geojson" route_response = requests.get(route_url).json() if route_response["code"] == "Ok": route_coords = route_response["routes"][0]["geometry"]["coordinates"] route_points = [[coord[1], coord[0]] for coord in route_coords] folium.PolyLine(route_points, color="blue", weight=5, opacity=0.7).add_to(map_) else: st.warning("مسیر یافت نشد.") return map_ # ---- رابط کاربری ---- st.title("نمایش مسیر و پیش‌بینی آب‌وهوا") st.sidebar.header("انتخاب مزرعه") # وارد کردن نام مزرعه farm_name = st.sidebar.text_input("نام مزرعه", placeholder="نام مزرعه را وارد کنید") user_coords = None if st.sidebar.button("موقعیت مکانی من"): # دریافت موقعیت کاربر (به صورت شبیه‌سازی، موقعیت ثابت را نشان می‌دهیم) user_coords = [31.513044, 48.737104] # موقعیت پیش‌فرض؛ این را می‌توان با کتابخانه Geolocation جایگزین کرد. st.sidebar.success(f"موقعیت شما: {user_coords}") if farm_name and user_coords: farm = find_farm_by_name(farm_name) if farm is not None: farm_coords = [farm["latitude"], farm["longitude"]] # نمایش نقشه map_display = create_map(user_coords, farm_coords, farm_name) st_folium(map_display, width=700, height=500) # ---- پیش‌بینی آب‌وهوا ---- st.subheader(f"پیش‌بینی آب‌وهوا برای مزرعه {farm_name}") weather_data = get_weather_data(farm["latitude"], farm["longitude"]) if weather_data: col1, col2, col3 = st.columns([1, 2, 1]) # تقسیم‌بندی پنل for i in range(0, 40, 8): # هر روز (۳ ساعت یکبار اطلاعات موجود است) forecast = weather_data["list"][i] date = datetime.strptime(forecast["dt_txt"], "%Y-%m-%d %H:%M:%S") temp = forecast["main"]["temp"] humidity = forecast["main"]["humidity"] wind_speed = forecast["wind"]["speed"] rain = forecast.get("rain", {}).get("3h", 0) icon_url = f"http://openweathermap.org/img/wn/{forecast['weather'][0]['icon']}@2x.png" with col2: st.markdown( f""" **{date.strftime('%A')} - {date.strftime('%d %B')}** :thermometer: **دما:** {temp}°C :droplet: **رطوبت:** {humidity}% :dash: **سرعت باد:** {wind_speed} m/s :umbrella: **بارش:** {rain} mm """ ) st.image(icon_url, width=50) else: st.warning("مزرعه‌ای با این نام یافت نشد.") else: st.info("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.")