asemanborapps / app.py
imanbakhshi's picture
Update app.py
514f857 verified
# import streamlit as st
# import geopandas as gpd
# import ee
# import json
# import os
# import tempfile
# import geemap.foliumap as geemap
# from io import BytesIO
# from datetime import datetime
# from io import StringIO
# from PIL import Image
# import zipfile
# import rasterio
# from zipfile import ZipFile
#
# # مقداردهی اولیه GEE
# service_account = "iman.e.bakhshipoor@gmail.com"
# credentials = ee.ServiceAccountCredentials(service_account, "IMAN_GEE.json")
# ee.Initialize(credentials)
#
#
# # صفحه اول
# def display_page_one():
# st.title("صفحه اول - پردازش و نمایش Shapefile")
#
# # بارگذاری تصویر
# image = Image.open("ABK.jpg") # مسیر تصویر محلی خود را وارد کنید
#
# # استفاده از Sidebar برای نمایش تصویر در بالای آن
# with st.sidebar:
# st.image(image, use_container_width=True)
# st.markdown('<h2 style="color: green;">شرکت مهندسین مشاور آسمان برج کارون</h2>', unsafe_allow_html=True)
#
# # آپلود فایل ZIP شامل Shapefile
# uploaded_file = st.file_uploader("آپلود یک شیپ فایل فشرده ‌شده (.zip)", type=["zip"])
#
# # استفاده از Sidebar برای انتخاب تاریخ و مقیاس
# with st.sidebar:
# start_date = st.date_input("تاریخ شروع", value=datetime(2025, 1, 1), min_value=datetime(2000, 1, 1),
# max_value=datetime.today())
# end_date = st.date_input("تاریخ پایان", value=datetime(2025, 2, 15), min_value=datetime(2000, 1, 1),
# max_value=datetime.today())
# scale = st.number_input("مقیاس (Scale)", min_value=10, max_value=100, value=10, step=10)
#
# if uploaded_file:
# try:
# gdf = gpd.read_file(BytesIO(uploaded_file.getvalue()))
# if gdf.crs is not None and gdf.crs.to_epsg() != 4326:
# gdf = gdf.to_crs(epsg=4326)
# st.write("CRS Shapefile (converted):", gdf.crs)
# st.write(" Shapefile:", gdf.geometry)
#
# geojson = json.loads(gdf.to_json())
# features = [ee.Feature(feature) for feature in geojson["features"]]
# region = ee.FeatureCollection(features)
#
# start_date_ee = ee.Date.fromYMD(start_date.year, start_date.month, start_date.day)
# end_date_ee = ee.Date.fromYMD(end_date.year, end_date.month, end_date.day)
#
# image = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED") \
# .filterBounds(region) \
# .filterDate(start_date_ee, end_date_ee).median() \
# .clip(region)
#
# if image is None:
# st.error("هیچ تصویری از Sentinel-2 برای این منطقه و بازه زمانی یافت نشد.")
# else:
# ndvi = image.normalizedDifference(["B8", "B4"]).rename("NDVI")
# savi = image.expression(
# "((B8 - B4) / (B8 + B4 + 0.5)) * (1.5)",
# {
# 'B8': image.select('B8'),
# 'B4': image.select('B4')
# }
# ).rename("SAVI")
# mndwi = image.normalizedDifference(["B3", "B11"]).rename("MNDWI")
# gcvi = image.expression("B8 / B3 - 1", {
# 'B8': image.select('B8'),
# 'B3': image.select('B3')
# }).rename("GCVI")
#
# composite = ndvi.addBands([savi, mndwi, gcvi])
#
# Map = geemap.Map(center=[gdf.geometry.centroid.y.mean(), gdf.geometry.centroid.x.mean()], zoom=8)
# Map.add_basemap("OpenStreetMap")
# Map.add_basemap("HYBRID")
# Map.addLayer(ndvi, {'min': 0, 'max': 1, 'palette': ['white', 'green']}, "Crop Detect", False)
# Map.addLayer(mndwi, {'min': -1, 'max': 1, 'palette': ['red', 'blue']}, "Water Body", False)
# Map.addLayer(image, {'min': 0, 'max': 3000, 'bands': ["B4", "B3", "B2"]}, "True Color", True)
# Map.addLayer(region, {}, " Shapefile")
#
# Map.to_streamlit(height=600)
#
# def download_image(image, filename):
# with st.spinner(f"در حال تولید {filename}... ⏳"):
# temp_dir = tempfile.gettempdir()
# temp_path = os.path.join(temp_dir, filename)
# geemap.ee_export_image(image, filename=temp_path, scale=scale,
# region=region.geometry().bounds())
# with open(temp_path, "rb") as f:
# st.download_button(label=f"دانلود {filename}", data=f, file_name=filename,
# mime="image/tiff")
#
# st.subheader("دانلود تصاویر")
# download_image(ndvi, "Crop Detect.tif")
# download_image(mndwi, "Water Body.tif")
# except Exception as e:
# st.error(f"خطا در پردازش Shapefile یا محاسبه شاخص‌ها: {str(e)}")
#
#
#
#
# import streamlit as st
# import folium
# import tempfile
# import rasterio
# from zipfile import ZipFile
#
# # صفحه دوم
# def display_page_two():
# st.title("صفحه دوم - بارگذاری فایل‌های TIFF")
#
# # بارگذاری فایل‌ها از یک file_uploader
# uploaded_files = st.file_uploader("آپلود فایل‌های TIFF", type=["tif"], accept_multiple_files=True)
#
# # دکمه تایید
# if st.button("تایید"):
# if uploaded_files:
# # ایجاد نقشه
# m = folium.Map(location=[32.0, 53.0], zoom_start=6)
#
# # پردازش فایل‌های TIFF
# for uploaded_file in uploaded_files:
# if uploaded_file.name.endswith('.tif'):
# # ایجاد فایل موقت برای ذخیره فایل TIFF
# with tempfile.NamedTemporaryFile(delete=False, suffix=".tif") as tmp_tiff:
# tmp_tiff.write(uploaded_file.read())
# tmp_tiff.close()
#
# # باز کردن و نمایش تصویر TIFF با استفاده از rasterio
# with rasterio.open(tmp_tiff.name) as src:
# tiff_image = src.read(1) # خواندن داده‌ها
# bounds = src.bounds # گرفتن محدوده تصویر
#
# # اضافه کردن تصویر TIFF به نقشه
# folium.raster_layers.ImageOverlay(
# image=tiff_image,
# bounds=[[bounds[1], bounds[0]], [bounds[3], bounds[2]]],
# opacity=0.7,
# name=uploaded_file.name # استفاده از نام فایل به عنوان لایه
# ).add_to(m)
#
# # افزودن کنترل لایه‌ها
# folium.LayerControl().add_to(m)
#
# # نمایش نقشه در Streamlit
# m.save("temp_tiff_map.html")
# st.components.v1.html(open("temp_tiff_map.html", 'r').read(), height=600)
# else:
# st.error("لطفا فایل‌های TIFF را آپلود کنید.")
#
# # تنظیمات نوار کناری برای انتخاب صفحه
# page = st.sidebar.selectbox("انتخاب صفحه", ["صفحه اول", "صفحه دوم"])
#
# if page == "صفحه اول":
# display_page_one()
# else:
# display_page_two()
import streamlit as st
import geopandas as gpd
import ee
import json
import os
import tempfile
import geemap.foliumap as geemap
from io import BytesIO
from datetime import datetime
from io import StringIO
from PIL import Image
import zipfile
import rasterio
from zipfile import ZipFile
# مقداردهی اولیه GEE
service_account = "iman.e.bakhshipoor@gmail.com"
credentials = ee.ServiceAccountCredentials(service_account, "IMAN_GEE.json")
ee.Initialize(credentials)
# صفحه اول
def display_page_one():
st.title("Crop&Water Detector")
# بارگذاری تصویر
image = Image.open("ABK.jpg") # مسیر تصویر محلی خود را وارد کنید
# استفاده از Sidebar برای نمایش تصویر در بالای آن
with st.sidebar:
st.image(image, use_container_width=True)
st.markdown('<h2 style="color: green;">شرکت مهندسین مشاور آسمان برج کارون</h2>', unsafe_allow_html=True)
# آپلود فایل ZIP شامل Shapefile
uploaded_file = st.file_uploader("آپلود یک شیپ فایل فشرده ‌شده (.zip)", type=["zip"])
# استفاده از Sidebar برای انتخاب تاریخ و مقیاس
with st.sidebar:
start_date = st.date_input("تاریخ شروع", value=datetime(2025, 1, 1), min_value=datetime(2000, 1, 1),
max_value=datetime.today())
end_date = st.date_input("تاریخ پایان", value=datetime(2025, 2, 15), min_value=datetime(2000, 1, 1),
max_value=datetime.today())
scale = st.number_input("مقیاس (Scale)", min_value=10, max_value=100, value=10, step=10)
if uploaded_file:
try:
gdf = gpd.read_file(BytesIO(uploaded_file.getvalue()))
if gdf.crs is not None and gdf.crs.to_epsg() != 4326:
gdf = gdf.to_crs(epsg=4326)
st.write("CRS Shapefile (converted):", gdf.crs)
st.write(" Shapefile:", gdf.geometry)
geojson = json.loads(gdf.to_json())
features = [ee.Feature(feature) for feature in geojson["features"]]
region = ee.FeatureCollection(features)
start_date_ee = ee.Date.fromYMD(start_date.year, start_date.month, start_date.day)
end_date_ee = ee.Date.fromYMD(end_date.year, end_date.month, end_date.day)
image = ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED") \
.filterBounds(region) \
.filterDate(start_date_ee, end_date_ee).median() \
.clip(region)
if image is None:
st.error("هیچ تصویری از Sentinel-2 برای این منطقه و بازه زمانی یافت نشد.")
else:
ndvi = image.normalizedDifference(["B8", "B4"]).rename("NDVI")
savi = image.expression(
"((B8 - B4) / (B8 + B4 + 0.5)) * (1.5)",
{
'B8': image.select('B8'),
'B4': image.select('B4')
}
).rename("SAVI")
mndwi = image.normalizedDifference(["B3", "B11"]).rename("MNDWI")
gcvi = image.expression("B8 / B3 - 1", {
'B8': image.select('B8'),
'B3': image.select('B3')
}).rename("GCVI")
composite = ndvi.addBands([savi, mndwi, gcvi])
Map = geemap.Map(center=[gdf.geometry.centroid.y.mean(), gdf.geometry.centroid.x.mean()], zoom=8)
Map.add_basemap("OpenStreetMap")
Map.add_basemap("HYBRID")
Map.addLayer(ndvi, {'min': 0, 'max': 1, 'palette': ['white', 'green']}, "Crop Detect", False)
Map.addLayer(mndwi, {'min': -1, 'max': 1, 'palette': ['red', 'blue']}, "Water Body", False)
Map.addLayer(image, {'min': 0, 'max': 3000, 'bands': ["B4", "B3", "B2"]}, "True Color", True)
Map.addLayer(region, {}, " Shapefile")
Map.to_streamlit(height=600)
def download_image(image, filename):
with st.spinner(f"در حال تولید {filename}... ⏳"):
temp_dir = tempfile.gettempdir()
temp_path = os.path.join(temp_dir, filename)
geemap.ee_export_image(image, filename=temp_path, scale=scale,
region=region.geometry().bounds())
with open(temp_path, "rb") as f:
st.download_button(label=f"دانلود {filename}", data=f, file_name=filename,
mime="image/tiff")
st.subheader("دانلود تصاویر")
download_image(ndvi, "Crop Detect.tif")
download_image(mndwi, "Water Body.tif")
except Exception as e:
st.error(f"خطا در پردازش Shapefile یا محاسبه شاخص‌ها: {str(e)}")
# صفحه دوم
def display_page_two():
st.title("Display TIFF")
# بارگذاری فایل‌ها از یک file_uploader
uploaded_files = st.file_uploader("آپلود فایل‌های TIFF", type=["tif"], accept_multiple_files=True)
# دکمه تایید
if st.button("تایید"):
if uploaded_files:
# ایجاد نقشه
m = folium.Map(location=[32.0, 53.0], zoom_start=6)
# پردازش فایل‌های TIFF
for uploaded_file in uploaded_files:
if uploaded_file.name.endswith('.tif'):
# ایجاد فایل موقت برای ذخیره فایل TIFF
with tempfile.NamedTemporaryFile(delete=False, suffix=".tif") as tmp_tiff:
tmp_tiff.write(uploaded_file.read())
tmp_tiff.close()
# باز کردن و نمایش تصویر TIFF با استفاده از rasterio
with rasterio.open(tmp_tiff.name) as src:
tiff_image = src.read(1) # خواندن داده‌ها
bounds = src.bounds # گرفتن محدوده تصویر
# اضافه کردن تصویر TIFF به نقشه
folium.raster_layers.ImageOverlay(
image=tiff_image,
bounds=[[bounds[1], bounds[0]], [bounds[3], bounds[2]]],
opacity=0.7,
name=uploaded_file.name # استفاده از نام فایل به عنوان لایه
).add_to(m)
# افزودن کنترل لایه‌ها
folium.LayerControl().add_to(m)
# نمایش نقشه در Streamlit
m.save("temp_tiff_map.html")
st.components.v1.html(open("temp_tiff_map.html", 'r').read(), height=600)
else:
st.error("لطفا فایل‌های TIFF را آپلود کنید.")
# # تنظیمات نوار کناری برای انتخاب صفحه
# page = st.sidebar.selectbox("انتخاب صفحه", ["Crop&Water Detector", "Display TIFF"])
#
# if page == "Crop&Water Detector":
# display_page_one()
# else:
# display_page_two()
# تنظیمات نوار کناری برای انتخاب صفحه با استفاده از RADIOBUTTON
page = st.sidebar.radio("انتخاب صفحه", ["Crop&Water Detector", "Display TIFF"])
if page == "Crop&Water Detector":
display_page_one()
else:
display_page_two()