File size: 5,821 Bytes
513866d
0e02f55
bc2a95a
f1a9eba
 
 
bc2a95a
513866d
f1a9eba
0e02f55
 
 
6786b3d
f1a9eba
 
 
 
 
 
 
 
 
 
 
 
 
bc2a95a
f1a9eba
 
 
 
bc2a95a
f1a9eba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a8a226
f1a9eba
8a8a226
f1a9eba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.")