PlantPhysiology / app.py
Esmaeilkiani's picture
Update app.py
f1a9eba verified
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("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.")