File size: 9,108 Bytes
49ee313 2cdce84 49ee313 2cdce84 440eaa6 2cdce84 5926d3f 2cdce84 49ee313 440eaa6 2cdce84 440eaa6 2cdce84 440eaa6 2cdce84 49ee313 2cdce84 49ee313 d0b5db9 440eaa6 2cdce84 440eaa6 2cdce84 440eaa6 fd93023 440eaa6 2cdce84 a16e24c 2cdce84 |
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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# edit.py
import os
import utils
import streamlit as st
import geopandas as gpd
from streamlit_folium import folium_static
import folium
import time
import pandas as pd
def add_properties(df, col_name, value, field_name):
if col_name not in df.columns:
df[col_name] = None
df.loc[df['name'] == field_name, col_name] = value
return df
def select_field(gdf):
st.markdown("""
<style>
.stSelectbox > div > div {cursor: pointer;}
</style>
""", unsafe_allow_html=True)
names = gdf['name'].tolist()
names.append("Select Field")
field_name = st.selectbox("Select Field", options=names, key="field_name_edit", help="Select the field to edit", index=len(names)-1)
return field_name
def read_crop_type():
crop_type = st.text_input("Field Crop*", help="Enter the crop type", key="field_crop", value='')
return crop_type
def read_irrigation_type():
irrigation_type = st.selectbox("Field Type*", options=["Rainfed", "Irrigated", ""], key="field_type", help="Select the field type", index=2)
return irrigation_type
def read_custom_property():
custom_property_name = st.text_input("Custom Property Name*", help="Enter the custom property name", key="custom_property_name", value='')
custom_property_value = st.text_input("Custom Property Value*", help="Enter the custom property value", key="custom_property_value", value='', disabled=custom_property_name == "" or custom_property_name == "")
return custom_property_name, custom_property_value
def edit_fields(current_user):
# current_user = greeting("Manage your fields")
fields_file_path = f"fields_{current_user}.parquet"
history_file_path = f"history_{current_user}.csv"
# Load or initialize the GeoDataFrame for fields
if os.path.exists(fields_file_path):
gdf = gpd.read_parquet(fields_file_path)
else:
st.info("No fields added yet!")
return
# Load or initialize the DataFrame for field usage history
if os.path.exists(history_file_path):
history_df = pd.read_csv(history_file_path)
else:
history_df = pd.DataFrame(columns=['field_name', 'start_date', 'end_date', 'crop', 'irrigation_method'])
st.info("Hover over the field to show the properties or check the Existing Fields List below")
field_name = select_field(gdf)
if field_name == "Select Field":
fields_map = gdf.explore()
sat_basemap = utils.basemaps['Google Satellite']
sat_basemap.add_to(fields_map)
folium.LayerControl().add_to(fields_map)
folium_static(fields_map, height=300, width=400)
st.info("No Field Selected Yet!")
else:
fields_map = gdf[gdf['name'] == field_name].explore()
sat_basemap = utils.basemaps['Google Satellite']
sat_basemap.add_to(fields_map)
folium.LayerControl().add_to(fields_map)
folium_static(fields_map, height=300, width=400)
st.subheader(f":green[{field_name}]")
# option_menu = st.radio(f"Please add your {field_name} field information, historical data will help train our AI model", options=["View Field Info", "Add Field Information","Add Field Cultivation History", "Delete"], key="option_menu", help="Select the operation to perform")
option_menu = st.radio(f"Please add your {field_name} field information, historical data will help refine our AI model recommendations", options=["View Field Info","Add Field Cultivation History", "Delete"], key="option_menu", help="Select the operation to perform")
if option_menu == "View Field Info":
field = gdf[gdf['name'] == field_name]
st.write(field)
# Deserialize the usage history for display
if len(history_df)>0:
st.write("Previous cultivation History:", history_df)
else:
st.subheader("No cultivation history added for this field.")
elif option_menu == "Add Field Information":
no_input = True
crop_type = read_crop_type()
irrigation_type = read_irrigation_type()
custom_property_name, custom_property_value = read_custom_property()
if crop_type != "" or irrigation_type != "" or custom_property_value != "":
no_input = False
submit = st.button("Submit", key="submitProperties", help="Click to Submit Field Information", type="primary",
use_container_width=True, disabled=no_input)
if submit:
if crop_type != "":
gdf = add_properties(gdf, "crop", crop_type, field_name)
if irrigation_type != "":
gdf = add_properties(gdf, "irrigation", irrigation_type, field_name)
if custom_property_name != "" and custom_property_value != "":
gdf = add_properties(gdf, custom_property_name, custom_property_value, field_name)
gdf.to_parquet(f"fields_{current_user}.parquet")
st.success("Field Information Updated Successfully!")
st.info("Please Select View above to see the updated field information")
elif option_menu == "Add Field Cultivation History":
with st.form(key='history_form', clear_on_submit=True):
start_date = st.date_input("Cultivation Start Date", key=f'start_date')
end_date = st.date_input("Cultivation End Date", key=f'end_date')
crop_planted = st.selectbox("Type of Crop Planted", [' ', 'Wheat', 'Corn', 'Rice',"other"], index=0)
irrigation_method = st.selectbox("Irrigation Method Used", ['Rainfed', 'Irrigated', " "], index=2)
submit_history = st.form_submit_button("Submit Crop Cycle")
if submit_history:
# Check that the start date is before the end date
if start_date < end_date:
# Append new usage entry
new_history = {
'field_name': field_name,
'start_date': str(start_date),
'end_date': str(end_date),
'crop': crop_planted,
'irrigation_method': irrigation_method
}
# Use concat instead of append
history_df = pd.concat([history_df, pd.DataFrame([new_history])], ignore_index=True)
history_df.to_csv(history_file_path, index=False)
st.success("Field usage history updated successfully!, fill the form again to add another cultivation history" )
else:
st.write("check the entered dates")
elif option_menu == "Delete":
option = st.selectbox("What do you want to delete", options=[f'Delete {field_name} Field', 'Delete a historical entry from the field'])
if option == f"Delete {field_name} Field" :
delete = st.button("Delete Entire Field", key="delete_field", help="Click to Delete Field", type="primary", use_container_width=True)
if delete:
if len(gdf) == 1 and (gdf['name'] == field_name).all(): # Check if this is the only field left
os.remove(fields_file_path) # Delete the .parquet file if it's the last field
if os.path.exists(history_file_path):
os.remove(history_file_path)
st.success("All fields deleted. The data file has been removed.")
time.sleep(0.3)
st.rerun()
else:
gdf = gdf[gdf['name'] != field_name]
history_df = history_df[history_df["field_name"] != field_name ]
gdf.to_parquet(fields_file_path)
history_df.to_csv(history_file_path, index=False)
st.success("Field Deleted Successfully!")
time.sleep(0.3)
st.rerun()
elif option == "Delete a historical entry from the field":
# Allow the user to select which historical entry to delete
idx_history_to_delete = st.selectbox("Select a history to delete, select the index of the entry that you want to delete", options=history_df[history_df['field_name'] == field_name].index)
if st.button("Confirm Delete Historical Entry", key="delete_history", help="Click to Delete Entry", type="primary", use_container_width=True):
history_df.drop(labels=0, axis=0, index=None, columns=None, level=None, inplace=True, errors='raise')
history_df.to_csv(history_file_path, index=False)
st.success("Entry Deleted Successfully!")
time.sleep(0.3)
st.rerun()
if __name__ == '__main__':
edit_fields() |