Spaces:
Sleeping
Sleeping
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 ---- | |
# کش به مدت 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 | |
# ---- تابع برای دریافت اطلاعات آبوهوا ---- | |
# کش پاسخهای 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("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.") | |