Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,110 +1,120 @@
|
|
1 |
import streamlit as st
|
2 |
-
import pandas as pd
|
3 |
import folium
|
4 |
from streamlit_folium import st_folium
|
|
|
|
|
|
|
5 |
import ee
|
6 |
|
7 |
-
#
|
8 |
service_account = 'earth-engine-service-account@ee-esmaeilkiani1387.iam.gserviceaccount.com'
|
9 |
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani1387-1b2c5e812a1d.json')
|
10 |
ee.Initialize(credentials)
|
11 |
|
12 |
-
#
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
#
|
20 |
-
st.
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
(position) => {
|
26 |
-
const latitude = position.coords.latitude;
|
27 |
-
const longitude = position.coords.longitude;
|
28 |
-
const url = new URL(window.location.href);
|
29 |
-
url.searchParams.set('latitude', latitude);
|
30 |
-
url.searchParams.set('longitude', longitude);
|
31 |
-
window.location.href = url.toString();
|
32 |
-
},
|
33 |
-
(error) => {
|
34 |
-
alert('Error getting location. Please ensure location services are enabled.');
|
35 |
-
}
|
36 |
-
);
|
37 |
-
}
|
38 |
-
getLocation();
|
39 |
-
</script>
|
40 |
-
""",
|
41 |
-
unsafe_allow_html=True,
|
42 |
-
)
|
43 |
-
|
44 |
-
|
45 |
-
# Extract user location from query params
|
46 |
-
query_params = st.query_params
|
47 |
-
user_lat = query_params.get("latitude", [None])[0]
|
48 |
-
user_lon = query_params.get("longitude", [None])[0]
|
49 |
-
|
50 |
-
# Sidebar input for farm name
|
51 |
-
farm_name = st.sidebar.text_input("Enter farm name:")
|
52 |
-
|
53 |
-
if farm_name:
|
54 |
-
# Find the farm details
|
55 |
-
farm = farm_data[farm_data["farm_name"] == farm_name]
|
56 |
|
|
|
|
|
|
|
|
|
57 |
if not farm.empty:
|
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 |
else:
|
108 |
-
st.
|
109 |
else:
|
110 |
-
st.
|
|
|
1 |
import streamlit as st
|
|
|
2 |
import folium
|
3 |
from streamlit_folium import st_folium
|
4 |
+
import pandas as pd
|
5 |
+
import requests
|
6 |
+
from datetime import datetime
|
7 |
import ee
|
8 |
|
9 |
+
# ---- اتصال به Google Earth Engine ----
|
10 |
service_account = 'earth-engine-service-account@ee-esmaeilkiani1387.iam.gserviceaccount.com'
|
11 |
credentials = ee.ServiceAccountCredentials(service_account, 'ee-esmaeilkiani1387-1b2c5e812a1d.json')
|
12 |
ee.Initialize(credentials)
|
13 |
|
14 |
+
# تنظیمات اولیه صفحه
|
15 |
+
st.set_page_config(page_title="نمایش مسیر و پیشبینی آبوهوا", layout="wide")
|
16 |
+
|
17 |
+
# کلید API هواشناسی
|
18 |
+
openweather_api_key = "ed47316a45379e2221a75f813229fb46" # جایگزین با کلید API خود
|
19 |
+
|
20 |
+
|
21 |
+
# ---- بارگذاری دادههای مزارع از فایل CSV ----
|
22 |
+
@st.cache_data(ttl=3600, max_entries=10) # کش به مدت 1 ساعت و حداکثر 10 ورودی
|
23 |
+
def load_farm_data(file_path):
|
24 |
+
return pd.read_csv(file_path)
|
25 |
+
|
26 |
+
farms_data = load_farm_data("Farm_Details_Export.csv") # مسیر فایل CSV خود را تنظیم کنید
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
28 |
+
|
29 |
+
# ---- تابع برای پیدا کردن مزرعه بر اساس نام ----
|
30 |
+
def find_farm_by_name(farm_name):
|
31 |
+
farm = farms_data[farms_data["farm_name"] == farm_name]
|
32 |
if not farm.empty:
|
33 |
+
return farm.iloc[0] # اولین ردیف مطابقت داده شده
|
34 |
+
return None
|
35 |
+
|
36 |
+
|
37 |
+
# ---- تابع برای دریافت اطلاعات آبوهوا ----
|
38 |
+
@st.cache_data(ttl=600, max_entries=20) # کش پاسخهای API به مدت 10 دقی��ه
|
39 |
+
def get_weather_data(lat, lon):
|
40 |
+
url = f"http://api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&appid={openweather_api_key}&units=metric"
|
41 |
+
response = requests.get(url)
|
42 |
+
if response.status_code == 200:
|
43 |
+
return response.json()
|
44 |
+
else:
|
45 |
+
st.error("خطا در دریافت اطلاعات آبوهوا.")
|
46 |
+
return None
|
47 |
+
|
48 |
+
|
49 |
+
# ---- تابع برای رسم نقشه با Google Earth Engine ----
|
50 |
+
def create_map(user_coords, farm_coords, farm_name):
|
51 |
+
# ایجاد نقشه پایه با استفاده از Google Earth Engine
|
52 |
+
map_ = folium.Map(location=user_coords, zoom_start=12, tiles=None)
|
53 |
+
folium.TileLayer(tiles="https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
|
54 |
+
attr="Google Earth Engine", name="Satellite").add_to(map_)
|
55 |
+
folium.Marker(user_coords, popup="موقعیت شما", icon=folium.Icon(color="blue")).add_to(map_)
|
56 |
+
folium.Marker(farm_coords, popup=f"مزرعه {farm_name}", icon=folium.Icon(color="green")).add_to(map_)
|
57 |
+
|
58 |
+
# اضافه کردن مسیر
|
59 |
+
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"
|
60 |
+
route_response = requests.get(route_url).json()
|
61 |
+
if route_response["code"] == "Ok":
|
62 |
+
route_coords = route_response["routes"][0]["geometry"]["coordinates"]
|
63 |
+
route_points = [[coord[1], coord[0]] for coord in route_coords]
|
64 |
+
folium.PolyLine(route_points, color="blue", weight=5, opacity=0.7).add_to(map_)
|
65 |
+
else:
|
66 |
+
st.warning("مسیر یافت نشد.")
|
67 |
+
return map_
|
68 |
+
|
69 |
+
|
70 |
+
# ---- رابط کاربری ----
|
71 |
+
st.title("نمایش مسیر و پیشبینی آبوهوا")
|
72 |
+
st.sidebar.header("انتخاب مزرعه")
|
73 |
+
|
74 |
+
# وارد کردن نام مزرعه
|
75 |
+
farm_name = st.sidebar.text_input("نام مزرعه", placeholder="نام مزرعه را وارد کنید")
|
76 |
+
user_coords = None
|
77 |
+
|
78 |
+
if st.sidebar.button("موقعیت مکانی من"):
|
79 |
+
# دریافت موقعیت کاربر (به صورت شبیهسازی، موقعیت ثابت را نشان میدهیم)
|
80 |
+
user_coords = [31.513044, 48.737104] # موقعیت پیشفرض؛ این را میتوان با کتابخانه Geolocation جایگزین کرد.
|
81 |
+
st.sidebar.success(f"موقعیت شما: {user_coords}")
|
82 |
+
|
83 |
+
if farm_name and user_coords:
|
84 |
+
farm = find_farm_by_name(farm_name)
|
85 |
+
if farm is not None:
|
86 |
+
farm_coords = [farm["latitude"], farm["longitude"]]
|
87 |
+
|
88 |
+
# نمایش نقشه
|
89 |
+
map_display = create_map(user_coords, farm_coords, farm_name)
|
90 |
+
st_folium(map_display, width=700, height=500)
|
91 |
+
|
92 |
+
# ---- پیشبینی آبوهوا ----
|
93 |
+
st.subheader(f"پیشبینی آبوهوا برای مزرعه {farm_name}")
|
94 |
+
weather_data = get_weather_data(farm["latitude"], farm["longitude"])
|
95 |
+
if weather_data:
|
96 |
+
col1, col2, col3 = st.columns([1, 2, 1]) # تقسیمبندی پنل
|
97 |
+
for i in range(0, 40, 8): # هر روز (۳ ساعت یکبار اطلاعات موجود است)
|
98 |
+
forecast = weather_data["list"][i]
|
99 |
+
date = datetime.strptime(forecast["dt_txt"], "%Y-%m-%d %H:%M:%S")
|
100 |
+
temp = forecast["main"]["temp"]
|
101 |
+
humidity = forecast["main"]["humidity"]
|
102 |
+
wind_speed = forecast["wind"]["speed"]
|
103 |
+
rain = forecast.get("rain", {}).get("3h", 0)
|
104 |
+
icon_url = f"http://openweathermap.org/img/wn/{forecast['weather'][0]['icon']}@2x.png"
|
105 |
+
|
106 |
+
with col2:
|
107 |
+
st.markdown(
|
108 |
+
f"""
|
109 |
+
**{date.strftime('%A')} - {date.strftime('%d %B')}**
|
110 |
+
:thermometer: **دما:** {temp}°C
|
111 |
+
:droplet: **رطوبت:** {humidity}%
|
112 |
+
:dash: **سرعت باد:** {wind_speed} m/s
|
113 |
+
:umbrella: **بارش:** {rain} mm
|
114 |
+
"""
|
115 |
+
)
|
116 |
+
st.image(icon_url, width=50)
|
117 |
else:
|
118 |
+
st.warning("مزرعهای با این نام یافت نشد.")
|
119 |
else:
|
120 |
+
st.info("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.")
|