Esmaeilkiani commited on
Commit
f1a9eba
·
verified ·
1 Parent(s): f9e981a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -97
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
- # Initialize Google Earth Engine
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
- # Load farm data
13
- @st.cache_data
14
- def load_farm_data():
15
- return pd.read_csv("Farm_Details_Export.csv") # Replace with your CSV filename
16
-
17
- farm_data = load_farm_data()
18
-
19
- # Get user location using JavaScript
20
- st.write(
21
- """
22
- <script>
23
- function getLocation() {
24
- navigator.geolocation.getCurrentPosition(
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
- # Display farm details in a table
59
- st.subheader("Farm Details")
60
- st.table(farm[["farm_name", "age", "variety"]])
61
-
62
- # Get farm coordinates
63
- farm_lat = farm.iloc[0]["latitude"]
64
- farm_lon = farm.iloc[0]["longitude"]
65
-
66
- if user_lat and user_lon:
67
- user_lat = float(user_lat)
68
- user_lon = float(user_lon)
69
-
70
- # Google Earth Engine Map Display
71
- st.subheader(f"Path to {farm_name} on Map")
72
-
73
- # Create a line connecting user location to farm location
74
- user_point = ee.Geometry.Point([user_lon, user_lat])
75
- farm_point = ee.Geometry.Point([farm_lon, farm_lat])
76
- path = ee.Geometry.LineString([user_point.coordinates().getInfo(), farm_point.coordinates().getInfo()])
77
-
78
- # Satellite map using Sentinel-2
79
- satellite_image = ee.ImageCollection("COPERNICUS/S2") \
80
- .filterBounds(path) \
81
- .sort("CLOUD_COVER") \
82
- .first()
83
-
84
- map_id_dict = satellite_image.getMapId({"bands": ["B4", "B3", "B2"], "min": 0, "max": 3000})
85
-
86
- # Create Folium map
87
- m = folium.Map(location=[(user_lat + farm_lat) / 2, (user_lon + farm_lon) / 2], zoom_start=12)
88
-
89
- # Add Satellite Layer
90
- folium.TileLayer(
91
- tiles=map_id_dict["tile_fetcher"].url_format,
92
- attr="Google Earth Engine",
93
- name="Satellite",
94
- overlay=True,
95
- control=True,
96
- ).add_to(m)
97
-
98
- # Add markers and path
99
- folium.Marker([farm_lat, farm_lon], popup=f"Farm: {farm_name}", icon=folium.Icon(color="green")).add_to(m)
100
- folium.Marker([user_lat, user_lon], popup="Your Location", icon=folium.Icon(color="blue")).add_to(m)
101
- folium.PolyLine([(user_lat, user_lon), (farm_lat, farm_lon)], color="red", weight=3, opacity=1).add_to(m)
102
-
103
- # Display map
104
- st_folium(m, width=800, height=600)
105
- else:
106
- st.warning("Please allow location access for map functionality.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  else:
108
- st.error("Farm not found in the dataset!")
109
  else:
110
- st.sidebar.write("Please enter a farm name.")
 
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("لطفاً نام مزرعه را وارد کنید و موقعیت خود را مشخص نمایید.")