ZaliAi / app.py
Esmaeilkianii's picture
Create app.py
5a3e1c9 verified
import streamlit as st
import requests
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)
# اطلاعات منطقه پیش‌فرض
LATITUDE = 31.534442
LONGITUDE = 48.724416
# کلید API هواشناسی
OPENWEATHER_API_KEY = "ed47316a45379e2221a75f813229fb46"
OPENWEATHER_URL = "https://api.openweathermap.org/data/2.5/weather"
# تابع برای دریافت داده‌های هواشناسی
def get_weather(lat, lon):
params = {
"lat": lat,
"lon": lon,
"appid": OPENWEATHER_API_KEY,
"units": "metric",
"lang": "fa"
}
response = requests.get(OPENWEATHER_URL, params=params)
return response.json() if response.status_code == 200 else None
# تابع برای محاسبه NDVI با Google Earth Engine
def calculate_ndvi(lat, lon):
point = ee.Geometry.Point([lon, lat])
s2 = ee.ImageCollection('COPERNICUS/S2') \
.filterBounds(point) \
.filterDate('2023-01-01', '2023-12-31') \
.median() # ترکیب تصاویر
ndvi = s2.normalizedDifference(['B8', 'B4']) # محاسبه NDVI
ndvi_value = ndvi.reduceRegion(
reducer=ee.Reducer.mean(),
geometry=point,
scale=30
).getInfo()
return ndvi_value.get('nd', 'بدون داده')
# رابط کاربری استریم‌لیت
st.title("برنامه مدیریت آب‌وهوا و NDVI")
st.sidebar.title("تنظیمات")
# انتخاب مختصات یا استفاده از پیش‌فرض
use_default = st.sidebar.checkbox("استفاده از مختصات پیش‌فرض (دهخدا)", value=True)
if use_default:
lat, lon = LATITUDE, LONGITUDE
else:
lat = st.sidebar.number_input("عرض جغرافیایی", value=LATITUDE)
lon = st.sidebar.number_input("طول جغرافیایی", value=LONGITUDE)
# نمایش داده‌ها
st.header(f"مختصات انتخابی: {lat}, {lon}")
# دریافت و نمایش وضعیت هوا
weather_data = get_weather(lat, lon)
if weather_data:
st.subheader("وضعیت آب‌وهوا:")
st.write(f"🌡️ دما: {weather_data['main']['temp']}°C")
st.write(f"🌥️ وضعیت: {weather_data['weather'][0]['description']}")
st.write(f"💨 سرعت باد: {weather_data['wind']['speed']} متر بر ثانیه")
else:
st.error("خطا در دریافت داده‌های هواشناسی!")
# محاسبه و نمایش NDVI
ndvi_value = calculate_ndvi(lat, lon)
st.subheader("شاخص NDVI:")
if ndvi_value != 'بدون داده':
st.write(f"🌾 مقدار NDVI: {ndvi_value:.2f}")
else:
st.write("اطلاعات NDVI در دسترس نیست.")
# نقشه منطقه با استریم‌لیت
st.map(data={"lat": [lat], "lon": [lon]}, zoom=12)