|
import streamlit as st |
|
import warnings |
|
warnings.filterwarnings('ignore') |
|
import pandas as pd |
|
import geopandas as gpd |
|
from difflib import get_close_matches |
|
import tempfile |
|
import datetime |
|
|
|
|
|
|
|
from io import BytesIO |
|
|
|
st.set_page_config(page_title="Terradot CREA project", page_icon=":terradot:", layout='wide') |
|
|
|
|
|
def convert_to_gdf(uploaded_file): |
|
|
|
file_buffer = BytesIO(uploaded_file.read()) |
|
|
|
|
|
if uploaded_file.name.endswith('.shp'): |
|
gdf = gpd.read_file(file_buffer) |
|
elif uploaded_file.name.endswith(('.geojson', '.json')): |
|
gdf = gpd.read_file(file_buffer, driver='GeoJSON') |
|
else: |
|
raise ValueError("Unsupported file format") |
|
|
|
return gdf |
|
|
|
|
|
|
|
st.sidebar.image('logo.jpg', width=300) |
|
st.sidebar.markdown("""<a href="https://terradot.earth/" target="_blank">Terradot</a>""", unsafe_allow_html=True) |
|
|
|
st.sidebar.title('Proyecto Crea') |
|
st.sidebar.write('Solo uso interno') |
|
|
|
st.sidebar.header('Upload Files') |
|
uploaded_file = st.sidebar.file_uploader('Upload your shapefile', type=['shp', 'geojson', 'json'], disabled = True) |
|
uploaded_file2 = st.sidebar.file_uploader('Upload your csv file', type=['csv'], disabled = True) |
|
|
|
|
|
if uploaded_file is not None: |
|
lotes_gdf = convert_to_gdf(uploaded_file) |
|
st.write(lotes_gdf) |
|
|
|
if uploaded_file2 is not None: |
|
|
|
obs_df_2023 = pd.read_csv(uploaded_file2) |
|
|
|
|
|
|
|
test = True |
|
|
|
if 'key' not in st.session_state: |
|
st.session_state['key'] = None |
|
|
|
if 'lote_gdf' not in st.session_state: |
|
gdf = gpd.read_file('data/lotes espacio crea_empresa.shp', encoding='utf-8') |
|
gdf['campo_obs'] = None |
|
gdf['lote_obs'] = None |
|
st.session_state['lote_gdf'] = gdf |
|
|
|
if 'show_field' not in st.session_state: |
|
st.session_state['show_field'] = None |
|
|
|
if 'selected_company' not in st.session_state: |
|
st.session_state['selected_company'] = None |
|
|
|
if 'selected_farm' not in st.session_state: |
|
st.session_state['selected_farm'] = None |
|
|
|
if 'estado_farm' not in st.session_state: |
|
st.session_state['estado_farm'] = [] |
|
|
|
if 'estado_field' not in st.session_state: |
|
st.session_state['estado_field'] = [] |
|
|
|
if 'field_similar_dict_df' not in st.session_state: |
|
st.session_state['field_similar_dict_df'] = None |
|
|
|
def show_text(): |
|
def inner_func(): |
|
st.write('recuerde guardar') |
|
return inner_func |
|
|
|
if test: |
|
|
|
gdf = st.session_state['lote_gdf'] |
|
|
|
obs_df = pd.read_csv('data/obs_df_2023_12_1.csv') |
|
obs_df.fillna('-', inplace=True) |
|
obs_df.Campo = obs_df.Campo.astype('str') |
|
|
|
|
|
|
|
col1, col2,col3 = st.columns(3) |
|
|
|
with col1: |
|
st.header('EMPRESA') |
|
|
|
comp_list = gdf.empresa.unique().tolist() |
|
selected_company = st.selectbox(f'Seleccione empresa', comp_list, index= 0) |
|
st.session_state['selected_company'] = selected_company |
|
|
|
|
|
with col2: |
|
st.header('CAMPO') |
|
selected_company = st.session_state['selected_company'] |
|
obs_df_comp = obs_df[obs_df['EMPRESA'] == selected_company] |
|
|
|
farm_obs_names = obs_df_comp.Campo.unique().tolist() |
|
farm_obs_names.insert(0, 'no match') |
|
|
|
farm_gdf = gdf[gdf['empresa'] == selected_company] |
|
farm_gdf_names = farm_gdf.campo.unique().tolist() |
|
|
|
|
|
similar_dict = {} |
|
for item in farm_gdf_names: |
|
|
|
farm_obs_norm = [str(c).lower() for c in farm_obs_names] |
|
farm_obs_norm = [c.replace('.', ' ') for c in farm_obs_norm] |
|
|
|
|
|
similar_items = get_close_matches(item, farm_obs_norm, 3, 0.72) |
|
|
|
|
|
similar_items_idx = [farm_obs_norm.index(i) for i in similar_items] |
|
|
|
|
|
similar_items = [farm_obs_names[i] for i in similar_items_idx] |
|
|
|
|
|
if similar_items: |
|
similar_dict[item] = similar_items[0] |
|
else: |
|
|
|
similar_dict[item] = "no match" |
|
|
|
similar_dict_df = pd.DataFrame.from_dict(similar_dict, orient='index').reset_index() |
|
similar_dict_df.columns = ['gdf','obs'] |
|
|
|
with st.form(key='farm_name'): |
|
sel_farm_name = {} |
|
for i, farm in enumerate(farm_gdf_names): |
|
cll_val = farm_gdf[farm_gdf['campo'] == farm]['campo_obs'].unique()[0] |
|
if cll_val == None: |
|
index=farm_obs_names.index(similar_dict_df[similar_dict_df['gdf'] == farm]['obs'].values[0]) |
|
else: |
|
index=farm_obs_names.index(cll_val) |
|
|
|
selected_value = st.selectbox(f'{farm}:', \ |
|
farm_obs_names, index=index) |
|
|
|
sel_farm_name[farm] = selected_value |
|
|
|
submitted = st.form_submit_button(label='Guardar') |
|
if selected_company not in st.session_state['estado_farm']: |
|
st.write('sin guardar') |
|
st.session_state['show_field'] = False |
|
else: |
|
st.write('guardado') |
|
if submitted: |
|
st.session_state['estado_farm'].append(selected_company) |
|
st.write('guardado') |
|
for key, value in sel_farm_name.items(): |
|
similar_dict_df.loc[similar_dict_df['gdf'] == key, 'obs'] = value |
|
|
|
gdf.loc[(gdf['campo'] == key) & (gdf['empresa']), 'campo_obs'] = value |
|
|
|
st.session_state['lote_gdf'] = gdf |
|
st.session_state['show_field'] = True |
|
|
|
|
|
|
|
with col3: |
|
if st.session_state['show_field']: |
|
|
|
st.header('LOTE') |
|
gdf = st.session_state['lote_gdf'] |
|
selected_company = st.session_state['selected_company'] |
|
farm_gdf = gdf[gdf['empresa'] == selected_company] |
|
|
|
farm_list = gdf[gdf['empresa'] == selected_company]['campo'].unique().tolist() |
|
selected_farm = st.selectbox(f'Seleccione campo', farm_list, index=0) |
|
selected_obs_farm = gdf[(gdf['empresa'] == selected_company)&(gdf['campo'] == selected_farm)]['campo_obs'].unique()[0] |
|
|
|
field_gdf_names = gdf[(gdf['empresa'] == selected_company)&(gdf['campo'] == selected_farm)]['lote'].unique().tolist() |
|
field_obs_names = obs_df[(obs_df['EMPRESA'] == selected_company)&(obs_df['Campo'] == selected_obs_farm)]['Lote'].unique().tolist() |
|
field_obs_names.insert(0, 'no match') |
|
|
|
if selected_farm not in st.session_state['estado_field']: |
|
st.write('sin guardar') |
|
else: |
|
st.write('guardado') |
|
|
|
similar_dict = {} |
|
for item in field_gdf_names: |
|
|
|
field_obs_norm = [str(c).lower() for c in field_obs_names] |
|
field_obs_norm = [c.replace('.', ' ') for c in field_obs_norm] |
|
|
|
|
|
similar_items = get_close_matches(item.lower(), field_obs_norm, 3, 0.50) |
|
|
|
|
|
similar_items_idx = [field_obs_norm.index(i) for i in similar_items] |
|
|
|
|
|
similar_items = [field_obs_names[i] for i in similar_items_idx] |
|
|
|
|
|
if similar_items: |
|
similar_dict[item] = similar_items[0] |
|
else: |
|
|
|
similar_dict[item] = "no match" |
|
|
|
field_similar_dict_df = pd.DataFrame.from_dict(similar_dict, orient='index').reset_index() |
|
field_similar_dict_df.columns = ['gdf','obs'] |
|
|
|
|
|
with st.form(key='field_name'): |
|
cll_val = farm_gdf[farm_gdf['campo'] == selected_farm]['campo_obs'].unique()[0] |
|
|
|
if cll_val == None: |
|
index=farm_obs_names.index(similar_dict_df[similar_dict_df['gdf'] == farm]['obs'].values[0]) |
|
else: |
|
index=farm_obs_names.index(cll_val) |
|
|
|
sel_field_name = {} |
|
for i, field in enumerate(field_gdf_names): |
|
|
|
|
|
selected_field = st.multiselect(f'{field}:', \ |
|
field_obs_names, default=field_similar_dict_df[field_similar_dict_df['gdf'] == field]['obs'].values) |
|
|
|
sel_field_name[field] = selected_field |
|
|
|
submitted = st.form_submit_button(label='Guardar') |
|
|
|
if submitted: |
|
st.session_state['estado_field'].append(selected_farm) |
|
st.write('guardado') |
|
for key, value in sel_field_name.items(): |
|
|
|
field_similar_dict_df.loc[field_similar_dict_df['gdf'] == key, 'obs'] = [value] |
|
gdf.loc[(gdf['empresa'] == selected_company) & (gdf['campo'] == selected_farm) & (gdf['lote'] == key), 'lote_obs'] = str(value) |
|
|
|
|
|
st.session_state['lote_gdf'] = gdf |
|
|
|
st.session_state['show_field'] = True |
|
|
|
|
|
|
|
|
|
|
|
today = datetime.date.today() |
|
now = datetime.datetime.now() |
|
hour = now.hour |
|
minute = now.minute |
|
|
|
st.sidebar.download_button( |
|
label="Download GeoJSON", |
|
data=gdf.to_json().encode('utf-8'), |
|
file_name=f'TODO_{today}_{hour}_{minute}.geojson', |
|
|
|
mime = 'application/json', |
|
) |
|
|
|
|