Limpieza y consolidación de tabla de Fincas del Estado Minae del Área de Conservación Central del Sistema Nacional de Áreas de Conservación¶
Proyecto final curso Python para ciencia de datos. ITCR, 2024
Estudiante: Adrián Varela Arquín
Descripción del proyecto y justificación¶
El Sistema Nacional de Áreas de Conservación (Sinac) de Costa Rica es una dependencia del Ministerio de Ambiente y Energía (Minae), creada mediante el artículo 22 de la Ley de la Biodiversidad Nº 7788, de 1998. Es el ente rector en materia forestal, vida silvestre, áreas protegidas y la protección y conservación del uso de cuencas hidrográficas y sistemas hídricos, incluyendo, además, la protección del Patrimonio Natural del Estado y la consolidación de las áreas silvestres protegidas.
El Sinac se encuentra dividido territorialmente en 11 áreas de conservación, entre las que se encuentra el Área de Conservación Central (ACC) que abarca la Gran Área Metropolitana del país y que se extiende desde las estribaciones de la Cordillera de Talamanca (Villa Mills, Cerro de la Muerte) hasta San Ramón de Alajuela.
El ACC, al igual que las demás áreas de conservación, posee un inventario de fincas a nombre del Estado (terrenos del Estado Minae), producto de la adquisición por compra en áreas protegidas, donaciones, traspasos e inscripción de baldíos. Sin embargo, esta información se encuentra fragmentada y desorganizada, debido a limitaciones como falta de un prodecimiento específico actualizado para la sistematización de tenencia de la tierra, falta de coordinación entre diferentes departamentos para la integración y homologación de información.
En ese orden de ideas, cada finca del Estado se ha manejado con expediente físico, muchos de los cuales se han perdido, se encuentran incompletos o desactualizados, y en algunos casos, son inexistentes y no coinciden con la capa geográfica con la que se cuenta actualmente. Otra limitación es la falta de digitalización de los expedientes y la creación de los de las fincas faltantes, esto producto de la falta de información centralizada y sistemáticamente homologada.
Existen varias tablas con registros de las fincas del Estado, algunas divididas por las áreas silvestres protegidas que administra el ACC, por esta razón es una necesidad apremiante por parte de la institución para consolidar una base de datos única con la que se pueda integrar toda la información y proceder a actualizar su estado y realizar las indagaciones pertinentes, ya que muchas de ellas no poseen plano, no han generado folio real, se encuentran inscritas a nombre de privados siendo compradas por el Estado, entre otras.
Por esta razón, este proyecto pretende sistematizar una base consolidada para el inventario de las fincas del Estado del ACC, como punto de partida para un diagnóstico y generación del catastro forestal. Esta consolidación se realizará gracias al potencial que posee Python para el procesamiento de datos y la fusión de información, aplicando algunas librerías valiosas, entre ellas las de inteligencia artificial.
Antecedentes¶
El Área de Conservación Central (ACC) es una de las 11 regiones en que está organizado el Sistema Nacional de Áreas de Conservación , para atender las competencias en materia de: Áreas silvestres protegidas, gestión forestal, vida silvestre, protección de sistemas hídricos y cuencas hidrográficas. (SINAC, s.f.)
El ACC Abarca 32 áreas silvestres protegidas en diferentes categorías de manejo y presenta diversidad de ecosistemas.
El Sinac fue creado mediante el artículo 22 de la Ley de la Biodiversidad Nº 7788, de 1998, heredando competencias de entidades como el Sistema de Parques Nacionales y la Dirección General Forestal. De estas dependencias se heredó el resguardo del patrimonio natural del estado (otrora Patrimonio natural forestal) y de la adquisición de terrenos para consolidación de este en áreas protegidas.
Con el desarrollo de las Tecnologías de la Información y Comunicación (TIC) y la evolución de los Sistemas de Información Geográfica, se ha mejorado en las organziaciónes las formas de gestionar y almacenar información de forma sistemática y accesible, en ese sentido, Cantos Sánchez, Inga Campoverde, Macías Hernández y Martínez Carriel (2022) señalan que los SIG vienen a jugar un rol disruptivo en el impulso de la productividad y eficiencia de muchos procesos existentes. siendo "una herramienta computacional para apoyar las decisiones, la cual permite la integración, almacenamientoy transformación de grandesbases de datos extraídas del contexto".
Con el desarrollo de Python como uno de los principales lenguajes de programación por su versatilidad e interoperabilidad, existen varios trabajos en los que se consolida información catastral y tablas de tenencia de la tierra para diferentes fines, una de ellas es el trabajo de Mwaura y Mutonga (2022) que presenta el desarrollo de un sistema de información catastral utilizando tecnologías de código abierto y Python para la gestión de tierras en Kenia. Se implementaron herramientas de Python para unir y analizar datos espaciales y no espaciales, mejorando la precisión y eficiencia en la administración de la tenencia de la tierra.
Otro estudio interesante es el de Tekalign y Abera (2020) en el que desarrolló un sistema de información catastral para Tepi, Etiopía, integrando datos espaciales y no espaciales mediante GIS y Python. Se utilizaron técnicas de unión de datos para combinar información de encuestas terrestres y registros municipales, facilitando consultas en el sistema.
A nivel latinoamericano destaca el estudio de Salinas Peña y Jaramillo Blandón (2022) en la automatización de la actualización de información catastral del área metropolitana de centro occidente, en Colombia, referente al cambio de propietario de los predios de la zona de estudio.
Por último, haciendo indagación de las diferentes bibliotecas que posee Python, es necesario destacar la biblioteca de Fapidfuzz, la cual se utiliza para la coincidencia difusa de cadenas, lo que es muy útil para unir tablas cuando las entradas no coinciden exactamente pero son similares; por ejemplo en tablas en las que no exista mucho orden o coincidencia en los campos, tal como las que se abordan en este proyecto.
Respecto al quehacer de Python con Rapidfuzz, se menciona el trabajo de Ye, Wang, Zhao, Ke, Wang y Liu (2021) que hace una especie de metaanálisis de códigos de Python.
Problema y objetivo¶
El problema que aborda este proyecto consiste en el que el Área de Conservación Central, en sus instancias de tenencia de la tierra, existe información fragmentada de las fincas y terrenos que el Estado posee a su nombre. La información está desactualizada y dispersa en muchas tablas, las cuales no coindicen con la capa shapefile que se generó producto de una consultoría licitada en 2020 a nivel nacional, con lo cual el diagnóstico y regularización territorial se torna dificultosa.
Se plantea como objetivo de este proyecto lo siguiente:
Consolidar una tabla unificada de las fincas y terrenos del Estado (Minae) del Área de Conservación Central, que contemple los registros existentes en diferentes tablas de registro y en la capa vectorial georreferenciada de fincas del Estado en formato Shapefile, mediante la programación en Python, que funga como insumo para el diagnóstico y regularización territorial del territorio administrado por dicha área de conservación.
Datos a utilizar¶
Para este proyecto se utlizaron las siguientes fuentes de datos, todas del Área de Conservación Central (ACC) del SINAC:
Tabla 1: Listado de fincas de Estado dadas por el encargado de TI del ACC de 2020, modificada y actualizada por Varela, 2023.
Tabla 2: Inconsistencias identificadas en fincas y terrenos del Estado del ACC, confeccionada por Varela, 2024.
Tabla 3: Fincas del Estado elaborada por Montero, 2019.
Tabla 4: Fincas del Estado por área silvestre protegida brindada por Ballestero, s.f.
fincas_estado_minae: archivo shapefile en proyección CRTM05 de las fincas del Estado Minae del ACC, elaborada por la consultoría de 2020 a SINAC, modificada y actualizada por Varela, 2024.
Paso 0: Previsualización general de los datos¶
Vamos a realizar una previsualización muy general de los datos de los 5 archivos que vamos a consolidar, haciendo un análisis exploratorio inicial, por ejemplo:
-Cantidad de registros: Brinda el número de filas en cada archivo. -Columnas: Muestra las columnas presentes en cada archivo. -Tipos de datos: Proporciona el tipo de datos de cada columna (e.g., int64, float64, object). -Valores nulos: Cuenta los valores nulos en cada columna. Registros duplicados: Cuenta las filas duplicadas en cada archivo.
La tabla 4 posee la información dividida en hojas, lo cual es una limitante a la hora de consolidar las tablas, por esta razón es recomendable unir todas las tablas en una única hoja de cálculo, pasos que se ejecutarán a continuación (paso 1 y 2)
import pandas as pd
import geopandas as gpd
# Ruta de los archivos en Google Drive
ruta_base = '/content/'
# Cargar archivos Excel
archivos_excel = ['tabla_01.xlsx', 'tabla_02.xlsx', 'tabla_03.xlsx', 'tabla_04.xlsx']
dataframes = [pd.read_excel(ruta_base + archivo) for archivo in archivos_excel]
# Cargar archivo shapefile
shapefile_path = ruta_base + 'fincas_estado_minae.shp'
gdf = gpd.read_file(shapefile_path)
# Análisis exploratorio de cada dataframe
for i, df in enumerate(dataframes):
print(f"\nAnálisis del archivo {archivos_excel[i]}")
print(f"Cantidad de registros: {len(df)}")
print(f"Cantidad de columnas: {len(df.columns)}")
print(f"Columnas: {df.columns.tolist()}")
print(f"Tipos de datos:\n{df.dtypes}")
print(f"Cantidad de valores nulos por columna:\n{df.isnull().sum()}")
print(f"Cantidad de registros duplicados: {df.duplicated().sum()}")
# Análisis exploratorio del shapefile
print("\nAnálisis del archivo fincas_estado_minae.shp")
print(f"Cantidad de registros: {len(gdf)}")
print(f"Cantidad de columnas: {len(gdf.columns)}")
print(f"Columnas: {gdf.columns.tolist()}")
print(f"Tipos de datos:\n{gdf.dtypes}")
print(f"Cantidad de valores nulos por columna:\n{gdf.isnull().sum()}")
print(f"Cantidad de registros duplicados: {gdf.duplicated().sum()}")
Análisis del archivo tabla_01.xlsx Cantidad de registros: 885 Cantidad de columnas: 17 Columnas: ['Intervención', 'Nombre_Area', 'Subregion', 'Cod_Finca', 'Finca', 'Num_Plano', 'Patrimono', 'ID', 'SHAPE', 'RNPdigital', 'Unnamed: 10', 'Unnamed: 11', 'Unnamed: 12', 'FincaPNE', 'Unnamed: 14', 'Unnamed: 15', 'Unnamed: 16'] Tipos de datos: Intervención object Nombre_Area object Subregion object Cod_Finca float64 Finca object Num_Plano object Patrimono object ID object SHAPE object RNPdigital object Unnamed: 10 object Unnamed: 11 object Unnamed: 12 object FincaPNE object Unnamed: 14 object Unnamed: 15 object Unnamed: 16 object dtype: object Cantidad de valores nulos por columna: Intervención 841 Nombre_Area 4 Subregion 0 Cod_Finca 49 Finca 114 Num_Plano 9 Patrimono 145 ID 48 SHAPE 878 RNPdigital 880 Unnamed: 10 879 Unnamed: 11 877 Unnamed: 12 879 FincaPNE 22 Unnamed: 14 20 Unnamed: 15 244 Unnamed: 16 884 dtype: int64 Cantidad de registros duplicados: 0 Análisis del archivo tabla_02.xlsx Cantidad de registros: 25 Cantidad de columnas: 9 Columnas: ['Finca', 'Area m2', 'Plano', 'Lugar', 'ASP', 'Patrimonio', 'Inconsistencia', 'Expediente', 'Archivos'] Tipos de datos: Finca object Area m2 float64 Plano object Lugar object ASP object Patrimonio object Inconsistencia object Expediente object Archivos object dtype: object Cantidad de valores nulos por columna: Finca 1 Area m2 3 Plano 1 Lugar 1 ASP 1 Patrimonio 2 Inconsistencia 1 Expediente 1 Archivos 2 dtype: int64 Cantidad de registros duplicados: 0 Análisis del archivo tabla_03.xlsx Cantidad de registros: 120 Cantidad de columnas: 20 Columnas: ['Nomb_Actual', 'Nombre Area', 'Patrimono', 'Finca', 'N.Plano:', 'Nombre', 'Cédula', 'Código Finca', 'Cod_Actual', 'Area dentro de ASP:', 'Actualización', 'No. de Avalúo', 'Fecha compra', 'Pagada', 'Fuente de pago', 'Número:', 'Cod_Anterior', 'Mostrar', 'Catego', 'Observaciones'] Tipos de datos: Nomb_Actual object Nombre Area object Patrimono object Finca object N.Plano: object Nombre object Cédula object Código Finca float64 Cod_Actual float64 Area dentro de ASP: float64 Actualización object No. de Avalúo object Fecha compra object Pagada float64 Fuente de pago object Número: float64 Cod_Anterior float64 Mostrar float64 Catego float64 Observaciones object dtype: object Cantidad de valores nulos por columna: Nomb_Actual 0 Nombre Area 0 Patrimono 0 Finca 102 N.Plano: 4 Nombre 2 Cédula 30 Código Finca 2 Cod_Actual 2 Area dentro de ASP: 2 Actualización 29 No. de Avalúo 76 Fecha compra 43 Pagada 5 Fuente de pago 6 Número: 11 Cod_Anterior 4 Mostrar 2 Catego 2 Observaciones 13 dtype: int64 Cantidad de registros duplicados: 0 Análisis del archivo tabla_04.xlsx Cantidad de registros: 598 Cantidad de columnas: 13 Columnas: ['No. ', 'Expediente', 'Numero Escritura Publica', 'Fecha Escritura', 'Finca', 'No Plano Catastrado', 'AREA HECTAREAS', 'No. Placa Patrimonio', 'Año Compra', 'Fecha inscripción', 'VALOR ACTUALIZADO', 'ASP', 'OBSERVACIONES Y RECOMENDACIONES'] Tipos de datos: No. object Expediente object Numero Escritura Publica object Fecha Escritura object Finca object No Plano Catastrado object AREA HECTAREAS object No. Placa Patrimonio object Año Compra float64 Fecha inscripción datetime64[ns] VALOR ACTUALIZADO object ASP object OBSERVACIONES Y RECOMENDACIONES object dtype: object Cantidad de valores nulos por columna: No. 1 Expediente 2 Numero Escritura Publica 472 Fecha Escritura 435 Finca 2 No Plano Catastrado 19 AREA HECTAREAS 3 No. Placa Patrimonio 20 Año Compra 20 Fecha inscripción 20 VALOR ACTUALIZADO 593 ASP 2 OBSERVACIONES Y RECOMENDACIONES 564 dtype: int64 Cantidad de registros duplicados: 0 Análisis del archivo fincas_estado_minae.shp Cantidad de registros: 398 Cantidad de columnas: 21 Columnas: ['fid', 'ID', 'DISTRITO', 'CANTON', 'PROVINCIA', 'CATEGORIA', 'NOMBRE_ASP', 'AC', 'PLANO', 'TIPO_ADQ', 'DON_VEN', 'AREA_M2', 'PROPIET', 'N_FINCA', 'PATRIMONIO', 'ANO_INSCR', 'IDENTIFIC', 'VALOR', 'EXPEDIENTE', 'Observac', 'geometry'] Tipos de datos: fid float64 ID object DISTRITO object CANTON object PROVINCIA object CATEGORIA object NOMBRE_ASP object AC object PLANO object TIPO_ADQ object DON_VEN object AREA_M2 object PROPIET object N_FINCA object PATRIMONIO object ANO_INSCR object IDENTIFIC object VALOR object EXPEDIENTE object Observac object geometry geometry dtype: object Cantidad de valores nulos por columna: fid 0 ID 118 DISTRITO 69 CANTON 67 PROVINCIA 65 CATEGORIA 50 NOMBRE_ASP 52 AC 28 PLANO 1 TIPO_ADQ 89 DON_VEN 114 AREA_M2 86 PROPIET 66 N_FINCA 18 PATRIMONIO 88 ANO_INSCR 73 IDENTIFIC 118 VALOR 115 EXPEDIENTE 85 Observac 361 geometry 0 dtype: int64 Cantidad de registros duplicados: 0
Paso 1: Instalar las bibliotecas necesarias¶
Vamos a instalar cuatro librerías importantes que nos ayudarán en la consolidación de la primera tabla del archivo excel que tiene cuadros en diferentes pestañas
pip install pandas openpyxl fuzzywuzzy python-Levenshtein
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.0.3) Requirement already satisfied: openpyxl in /usr/local/lib/python3.10/dist-packages (3.1.2) Requirement already satisfied: fuzzywuzzy in /usr/local/lib/python3.10/dist-packages (0.18.0) Requirement already satisfied: python-Levenshtein in /usr/local/lib/python3.10/dist-packages (0.25.1) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2023.4) Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.1) Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.25.2) Requirement already satisfied: et-xmlfile in /usr/local/lib/python3.10/dist-packages (from openpyxl) (1.1.0) Requirement already satisfied: Levenshtein==0.25.1 in /usr/local/lib/python3.10/dist-packages (from python-Levenshtein) (0.25.1) Requirement already satisfied: rapidfuzz<4.0.0,>=3.8.0 in /usr/local/lib/python3.10/dist-packages (from Levenshtein==0.25.1->python-Levenshtein) (3.9.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
Paso 2: realizar la consolidación de la "tabla 4"¶
Vamos a consolidar la tabla que viene segregada en hojas de cálculo, es decir son varias tablas en un solo excel
import pandas as pd
from fuzzywuzzy import process, fuzz
import openpyxl
def read_excel_file(file_path):
"""Lee un archivo de Excel y devuelve un diccionario de dataframes para cada hoja."""
xls = pd.ExcelFile(file_path)
sheets = {}
for sheet_name in xls.sheet_names:
sheets[sheet_name] = pd.read_excel(file_path, sheet_name=sheet_name)
return sheets
def unify_tables(sheets, match_field='Finca'):
"""Unifica tablas de diferentes hojas usando 'match_field' como clave principal."""
unified_df = pd.DataFrame()
# Hojas de filtro que contienen el match_field (que sería finca)
sheets_with_match_field = {name: df for name, df in sheets.items() if match_field in df.columns}
# Asegurarse de que haya al menos una hoja con el match_field
if not sheets_with_match_field:
raise ValueError(f"Ninguna hoja contiene el campo de coincidencia.'{match_field}'")
# Extraer la hoja inicial para empezar el proceso de unión
first_sheet_name, first_df = sheets_with_match_field.popitem()
unified_df = first_df.copy()
# Unir, de forma iterada, cada hoja en el dataframe a unificar
for sheet_name, df in sheets_with_match_field.items():
common_columns = [col for col in df.columns if col in unified_df.columns and col != match_field]
suffix = f'_{sheet_name}'
# Renombrar las columnas para evitar choque o sobreposiciones
for column in df.columns:
if column != match_field and column in unified_df.columns:
df.rename(columns={column: column + suffix}, inplace=True)
# Fusionar el match_field
unified_df = pd.merge(unified_df, df, on=match_field, how='outer')
# Manejar la fusión de columnas comunes
for column in common_columns:
combined_column = column + suffix
if combined_column in unified_df.columns:
unified_df[column] = unified_df[column].combine_first(unified_df[combined_column])
unified_df.drop(columns=[combined_column], inplace=True)
return unified_df
def save_to_excel(df, output_path):
"""Salva el dataframe unificado en un archivo de excel"""
df.to_excel(output_path, index=False)
def main():
file_path = "/content/tabla_04.xlsx" # Dirección del archivo de excel en el Colab
output_path = "/content/unified_table.xlsx" # Dirección o ruta del archivo creado
try:
# Lee el archivo de excel
sheets = read_excel_file(file_path)
# Unificar las tablas
unified_df = unify_tables(sheets)
# Guardar la tabla unificada en un archivo de excel
save_to_excel(unified_df, output_path)
print(f"Tabla unificada guardada como {output_path}")
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Correr la función principal o main function
if __name__ == "__main__":
main()
Tabla unificada guardada como /content/unified_table.xlsx
Paso 3: Unir tablas de excel de las fincas del Estado de diferentes fuentes en una¶
Nota importante: Los algoritmos de IA pueden ser muy vastos en su análisis y demorar significativamente en tiempo por el exhaustivo procedimiento que lleva; al menos eso interpreto, pues en un primer prototipo de código llevaba más de 30 minutos procesando, por ello se tuvo que refinar para que hiciera solo iteraciones necesarias
Vamos a unir la tabla 4 unificada con las tablas 01, 02 y 03. En el paso siguiente se unirá la tabla consolidada con el archivo shapefile, esto por razones de procesamiento, pues el consolidar todos los archivos de una sola vez equivale a un tremendo esfuerzo y tiempo de procesamiento, pudiendo hacer inviable dicha consolidación ¡Divide y vencerás!
import pandas as pd
from rapidfuzz import process as rapidfuzz_process
from multiprocessing import Pool
# Obtener dataframes de los archivos
def read_excel_file(file_path):
"""Lee un archivo de excel y regresa un dataframe."""
return pd.read_excel(file_path)
def unify_tables(file_paths, match_field='Finca'):
"""Unifica múltiples archivos de excel en un único dataframe usando 'match_field'."""
unified_df = pd.DataFrame()
for file_path in file_paths:
df = read_excel_file(file_path)
if unified_df.empty:
unified_df = df
else:
common_columns = [col for col in df.columns if col in unified_df.columns and col != match_field]
suffix = f'_{file_path.split("/")[-1].split(".")[0]}'
for column in df.columns:
if column != match_field and column in unified_df.columns:
df.rename(columns={column: column + suffix}, inplace=True)
unified_df = pd.merge(unified_df, df, on=match_field, how='outer')
for column in common_columns:
combined_column = column + suffix
if combined_column in unified_df.columns:
unified_df[column] = unified_df[column].combine_first(unified_df[combined_column])
unified_df.drop(columns=[combined_column], inplace=True)
return unified_df
# Se implementa las funciones de encontrar valores similares usando IA
def find_similar_value(value, choices):
""" Encuentra el valor más similar de las opciones especificadas."""
if pd.notna(value):
similar_value = rapidfuzz_process.extractOne(str(value), choices)
return similar_value[0] if similar_value else None
return None
def consolidate_with_ai(df, match_field='Finca'):
"""Consolida campos en un dataframe usando técnicas de IA para coincidencias por similaridad."""
consolidated_df = df.copy()
for column in df.columns:
if column != match_field:
# Se asegura de que todos los valores son string para coincidencia difusa
df[match_field] = df[match_field].astype(str)
df[column] = df[column].astype(str)
unique_choices = df[column].dropna().unique().tolist()
with Pool() as pool:
similar_values = pool.starmap(find_similar_value, [(value, unique_choices) for value in df[match_field]])
consolidated_df[column] = pd.Series(similar_values, index=df.index).combine_first(df[column])
return consolidated_df
# Guardar archivo en un fichero de excel
def save_to_excel(df, output_path):
"""Guarda el dataframe en un archivo de excel."""
df.to_excel(output_path, index=False)
def main():
excel_files = ["/content/tabla_01.xlsx", "/content/tabla_02.xlsx", "/content/tabla_03.xlsx", "/content/unified_table.xlsx"]
output_excel_path = "/content/unified_table2.xlsx"
try:
# Unificar los archivos de excel
unified_df = unify_tables(excel_files)
# Consolidar campos utilizando técnicas de IA
consolidated_df = consolidate_with_ai(unified_df)
# Guardar el dataframe consolidado en un nuevo archivo de excel
save_to_excel(consolidated_df, output_excel_path)
print(f"Tabla consolidada guardada en {output_excel_path}")
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Correr la función principal o main function
if __name__ == "__main__":
main()
Tabla consolidada guardada en /content/unified_table2.xlsx
Paso 4: limpiar valores nan y vacíos guardando cambios¶
Se descargó el archivo consolidado y se evidenció que hay muchísimas columnas vacías o con nan, la cual se debe depurar, previo a la fusión con las otras tablas. Vamos a realizar ese proceso
import pandas as pd
# Vamos a limpiar filas con valores nulos o NaN según las columnas medulares de estos archivos, que son Finca y número de plano, estas son vitales en información catastral
def clean_table(df):
"""Limpia el dataframe consolidado removiendo filas con valores NaN en columnas especificadas."""
columns_to_check = ['Finca', 'Plano', 'Num_Plano']
cleaned_df = df.dropna(subset=columns_to_check, how='all')
return cleaned_df
def save_cleaned_table(df, output_path):
"""Guarda el dataframe creado en un archivo de excel."""
df.to_excel(output_path, index=False)
def main():
input_excel_path = "/content/unified_table2.xlsx"
output_cleaned_excel_path = "/content/cleaned_table.xlsx"
try:
# Lee el archivo consolidado de excel
consolidated_df = pd.read_excel(input_excel_path)
# Limpia el dataframe consolidado
cleaned_df = clean_table(consolidated_df)
# Guarda el dataframe limpiado en un nuevo archivo de excel
save_cleaned_table(cleaned_df, output_cleaned_excel_path)
print(f"Tabla limpiada guardada en {output_cleaned_excel_path}")
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Corre la función principal
if __name__ == "__main__":
main()
Tabla limpiada guardada en /content/cleaned_table.xlsx
Paso 5: Cruzar la tabla unificada limpia con la capa de fincas del Estado Minae¶
Ahora sí, con todas las tablas de excel unificadas en solo archivo limpio (cleaned_table.xlsx) se cruza con la tabla del archivo shape de fincas del estado, creando una nueva tabla con el campo que indica si el registro existe en el shapefile o no y grafica resultados.
import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
def read_excel_file(file_path):
"""Lee el archivo de excel y retorna un dataframe."""
return pd.read_excel(file_path)
def match_shapefile(excel_df, shapefile_path, excel_field='Finca', shapefile_field='N_FINCA'):
"""Coincide campos entre el dataframe de excel y el shapefile."""
# Lee el shapefile
gdf = gpd.read_file(shapefile_path)
# Convierte la columna 'Finca' a String para consistencia de los datos
excel_df[excel_field] = excel_df[excel_field].astype(str)
# Realiza una unión restante entre el dataframe de excel y el shapefile según los campos 'Finca' y 'N_FINCA'
merged_df = pd.merge(excel_df, gdf[[shapefile_field, 'geometry']], left_on=excel_field, right_on=shapefile_field, how='left')
# Crea una nueva columna indicando si 'Finca' fue encontrada en el shapefile (1) o no (0)
merged_df['Fincas en shape'] = merged_df['geometry'].apply(lambda x: 1 if x is not None else 0)
return merged_df
def plot_results(found_count, not_found_count):
"""Plotea los resultados."""
labels = ['En shape', 'No shape']
counts = [found_count, not_found_count]
plt.bar(labels, counts, color=['blue', 'red'])
plt.xlabel('Status')
plt.ylabel('Count')
plt.title('Fincas mapeadas en la capa shape')
plt.show()
def main():
# Paths
excel_file_path = "/content/cleaned_table.xlsx"
shapefile_path = "/content/fincas_estado_minae.shp"
output_excel_path = "/content/matched_table.xlsx"
try:
# Lee el archivo de excel
excel_df = read_excel_file(excel_file_path)
# Empata campos con el shapefile
matched_df = match_shapefile(excel_df, shapefile_path)
# Raliza el Count de fincas encontradas and not encontradas en el shapefile
found_count = matched_df['Fincas en shape'].sum()
not_found_count = len(matched_df) - found_count
# Imprime resultados
print(f"Fincas en shape: {found_count}")
print(f"Fincas no shape: {not_found_count}")
# Plotea resultados
plot_results(found_count, not_found_count)
# Guarda el dataframe coincidente en Excel
matched_df.to_excel(output_excel_path, index=False)
print(f"Tabla empatada guardada en {output_excel_path}")
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Corre la función principal o main function
if __name__ == "__main__":
main()
Fincas en shape: 215 Fincas no shape: 657
Tabla empatada guardada en /content/matched_table.xlsx
Paso 6: Realizar análisis exploratorio de la tabla final consolidada¶
Se hace un análisis exploratorio de la tabla consolidada final para diagnosticar algunas inconsistencias que existan en los datos
import pandas as pd
def read_excel_file(file_path):
"""Lee un archivo de excel y retorna un dataframe."""
return pd.read_excel(file_path)
def analyze_data(df):
"""Realiza análisis exploratorios de datos e identifica las principales inconsistencias."""
# 1. Verificar valores faltantes
missing_values = df.isnull().sum()
# 2. Verificar valores duplicados
duplicate_rows = df[df.duplicated()]
# 3. Verificar valores atípicos (solo para columnas numéricas)
numeric_columns = df.select_dtypes(include=['number'])
quantiles = numeric_columns.quantile([0.25, 0.75])
lower_quantile = quantiles.loc[0.25]
upper_quantile = quantiles.loc[0.75]
iqr = upper_quantile - lower_quantile
outliers = ((numeric_columns < (lower_quantile - 1.5 * iqr)) | (numeric_columns > (upper_quantile + 1.5 * iqr))).sum()
return missing_values, duplicate_rows, outliers
def print_results(missing_values, duplicate_rows, outliers):
"""Imprime los resultados del análisis."""
print("1. Valores faltantes:")
if missing_values.empty:
print("No se encontraron valores faltantes.")
else:
print(missing_values)
print("\n2. Filas duplicadas:")
if duplicate_rows.empty:
print("No se encontraron filas duplicadas.")
else:
print("Filas duplicadas encontradas.")
print(duplicate_rows)
print("\n3. Valores atípicos:")
if outliers.empty:
print("No se encontraron valores atípicos.")
else:
print("Valores atípicos enfcontrados.")
print(outliers)
def main():
# Ruta del archivo
excel_file_path = "/content/matched_table.xlsx"
try:
# Lee archivo de excel
df = read_excel_file(excel_file_path)
# Analiza los datos
missing_values, duplicate_rows, outliers = analyze_data(df)
# Imprime resultados
print_results(missing_values, duplicate_rows, outliers)
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Corre la función principal
if __name__ == "__main__":
main()
1. Valores faltantes: Intervención 851 Nombre_Area 0 Subregion 0 Cod_Finca 0 Finca 0 ... AREA EN HECTAREAS 2 AREA HECTAREAS.1 2 N_FINCA 657 geometry 657 Fincas en shape 0 Length: 74, dtype: int64 2. Filas duplicadas: Filas duplicadas encontradas. Intervención Nombre_Area Subregion Cod_Finca Finca \ 9 NaN Fuera de ASP Cartago 2400 2-267824-000 13 NaN Fuera de ASP Cartago 0 4-137044-000 26 NaN Fuera de ASP Cartago 0 2-166331-000 27 NaN Fuera de ASP Cartago 0 2-166331-000 29 NaN Fuera de ASP Cartago 0 3-251387-000 31 NaN Fuera de ASP Cartago 510 3-74651-000 64 NaN Fuera de ASP Cartago 0 4-109999-000 212 NaN Fuera de ASP Cartago 0 4-104482-000 224 NaN Fuera de ASP Cartago 1161 4-111161-000 685 NaN Fuera de ASP Cartago 300 2-367203-000 686 NaN Fuera de ASP Cartago 300 2-367203-000 696 NaN Fuera de ASP Cartago 2454 2-454056-000 739 NaN Fuera de ASP Cartago 688 3-57688-000 750 NaN Fuera de ASP Cartago 300 3-80543-000 Num_Plano Patrimono ID SHAPE RNPdigital ... \ 9 2-628904-2000 2620678 M0001 Zona catastrada al día activo zc ... 13 4-1086244-2006 8304 M0440 Zona catastrada al día activo zc ... 26 2-0633234-2000 8310 M0001 Zona catastrada al día activo zc ... 27 2-0633234-2000 8310 M0001 Zona catastrada al día activo zc ... 29 3-0650841-2000 2455387 M0001 Zona catastrada al día activo zc ... 31 3-0674854-2000 9002 M0001 Zona catastrada al día activo zc ... 64 2-0629149-2000 9002 M0001 Zona catastrada al día activo zc ... 212 4-1086244-2006 8290 M0442 Zona catastrada al día activo zc ... 224 H-619216-2000 9002 M0001 Zona catastrada al día activo zc ... 685 2-628904-2000 8300 M0300 Zona catastrada al día activo zc ... 686 2-628904-2000 8300 M0300 Zona catastrada al día activo zc ... 696 2-940196-2004 2455405 M0560 Zona catastrada al día activo zc ... 739 3-0674854-2000 8576 M0001 Zona catastrada al día activo zc ... 750 3-0674854-2000 8305 M0543 Zona catastrada al día activo zc ... valoracion inmueble AREA m2 Valor Inmueble \ 9 3551638.5 3000.0 88522646.05 13 3551638.5 3000.0 89826670.43 26 3551638.5 3000.0 89826670.43 27 3551638.5 3000.0 89826670.43 29 3551638.5 3000.0 89826670.43 31 3551638.5 3000.0 88522646.05 64 3551638.5 3000.0 89826670.43 212 3551638.5 3000.0 89826670.43 224 3551638.5 3000.0 88522646.05 685 3551638.5 3000.0 89826670.43 686 3551638.5 3000.0 89826670.43 696 3551638.5 3000.0 88522646.05 739 3551638.5 3000.0 89826670.43 750 3551638.5 3000.0 89826670.43 EXPEDIENTE CODIGO DIGITAL BASE ACC AREA EN METROS CUADRADOS \ 9 PT-ACOPAC-011-2013 110000.00 13 PT-ACOPAC-011-2013 110000.00 26 PT-ACOPAC-011-2013 110000.00 27 PT-ACOPAC-011-2013 110000.00 29 PT-ACOPAC-011-2013 325276.00 31 PT-ACOPAC-011-2013 637429.65 64 PT-ACOPAC-011-2013 110000.00 212 PT-ACOPAC-011-2013 40649.46 224 PT-ACOPAC-011-2013 110000.00 685 PT-ACOPAC-011-2013 300000.00 686 PT-ACOPAC-011-2013 300000.00 696 PT-ACOPAC-011-2013 6.00 739 PT-ACOPAC-011-2013 325276.00 750 PT-ACOPAC-011-2013 300000.00 AREA EN HECTAREAS AREA HECTAREAS.1 N_FINCA \ 9 191.374250 199.346240 2-267824-000 13 191.374250 199.346240 NaN 26 15.110385 360.261083 NaN 27 15.110385 360.261083 NaN 29 15.110385 360.261083 3-251387-000 31 191.374250 360.261083 3-74651-000 64 191.374250 199.346240 4-109999-000 212 191.374250 199.346240 4-104482-000 224 15.110385 360.261083 4-111161-000 685 191.374250 360.261083 2-367203-000 686 191.374250 360.261083 2-367203-000 696 15.110385 360.261083 NaN 739 191.374250 360.261083 NaN 750 15.110385 360.261083 NaN geometry Fincas en shape 9 POLYGON ((466085.57459999993 1113979.803999999... 1 13 NaN 0 26 NaN 0 27 NaN 0 29 POLYGON ((514192.57070982637 1100676.099812537... 1 31 MULTIPOLYGON (((524404.0849825031 1081997.5460... 1 64 POLYGON ((495375.92765905854 1116780.171069154... 1 212 POLYGON ((495042.69100717176 1141794.323806502... 1 224 POLYGON ((494437.53784963104 1144703.498158826... 1 685 POLYGON ((472749.0014170971 1125124.224297592,... 1 686 POLYGON ((472741.3703424892 1125127.3879036047... 1 696 NaN 0 739 NaN 0 750 NaN 0 [14 rows x 74 columns] 3. Valores atípicos: Valores atípicos enfcontrados. Cod_Finca 125 Area m2 162 Código Finca 197 Cod_Actual 0 Area dentro de ASP: 2 Pagada 5 Número: 0 Cod_Anterior 182 Mostrar 0 Catego 5 N° 0 AREA METROS CUADRADOS 0 VALORACION INMUEBLE ¢ 0 No. 0 Año Compra 172 Área M2 5 Año Compra O DONACION 0 AREA M2 110 valoracion inmueble 0 AREA m2 184 Valor Inmueble 211 AREA EN METROS CUADRADOS 88 AREA EN HECTAREAS 0 AREA HECTAREAS.1 0 Fincas en shape 215 dtype: int64
Paso 7. Eliminar valores faltantes y filas duplicadas¶
Posterior al análisis exploratorio de la tabla consolidada y obtenidos algunos resultados se realiza un proceso de limpieza para eliminar valores faltantes y filas duplicadas. Crea una tabla final que se llame cleaned_matched_table.xlsx
import pandas as pd
def read_excel_file(file_path):
"""Lee archivo en excel y retorna un dataframe."""
return pd.read_excel(file_path)
def analyze_data(df):
"""Realiza análisis exploratorios de datos e identifica las principales inconsistencias."""
# 1. Verificar valores faltantes
missing_values = df.isnull().sum()
# 2. Verificar valores duplicados
duplicate_rows = df[df.duplicated()]
# 3. Verificar valores atípicos (solo para columnas numéricas)
numeric_columns = df.select_dtypes(include=['number'])
quantiles = numeric_columns.quantile([0.25, 0.75])
lower_quantile = quantiles.loc[0.25]
upper_quantile = quantiles.loc[0.75]
iqr = upper_quantile - lower_quantile
outliers = ((numeric_columns < (lower_quantile - 1.5 * iqr)) | (numeric_columns > (upper_quantile + 1.5 * iqr))).sum()
return missing_values, duplicate_rows, outliers
def clean_data(df):
"""Limpia el dataframe eliminando valores faltantes y filas duplicadas."""
# Eliminar filas con valores faltantes en las columnas especificadas
df_cleaned = df.dropna(subset=['Finca', 'Plano', 'Num_Plano'])
# Eliminar filas duplicadas basadas en las columnas especificadas
df_cleaned = df_cleaned.drop_duplicates(subset=['Finca', 'Plano', 'Num_Plano'])
return df_cleaned
def save_to_excel(df, file_path):
"""Guardar el dataframe en un archivo de excel."""
df.to_excel(file_path, index=False)
print(f"Datos guardados en {file_path}")
def print_results(missing_values, duplicate_rows, outliers):
"""Imprime el análisis de resultados."""
print("1. Valores faltantes:")
if missing_values.empty:
print("No hay valores faltantes")
else:
print(missing_values)
print("\n2. Filas duplicadas:")
if duplicate_rows.empty:
print("No se enconrtaron filas duplicadas.")
else:
print("Filas duplicadas encontradas.")
print(duplicate_rows)
print("\n3. Valores atípicos:")
if outliers.empty:
print("No se encontraron valores atípicos.")
else:
print("Valores atípicos encontrados.")
print(outliers)
def main():
# Ruta de los archivos
excel_file_path = "/content/matched_table.xlsx"
output_excel_path = "/content/tabla_fincas_estado_final.xlsx"
try:
# Lee el archivo de excel
df = read_excel_file(excel_file_path)
# Analiza los datos
missing_values, duplicate_rows, outliers = analyze_data(df)
# Imprime resultados
print_results(missing_values, duplicate_rows, outliers)
# Limpia los datos
df_cleaned = clean_data(df)
# Guarda los datos en un archivo o fichero de excel
save_to_excel(df_cleaned, output_excel_path)
except Exception as e:
print(f"Ha ocurrido un error: {e}")
# Corre la función principal
if __name__ == "__main__":
main()
1. Valores faltantes: Intervención 851 Nombre_Area 0 Subregion 0 Cod_Finca 0 Finca 0 ... AREA EN HECTAREAS 2 AREA HECTAREAS.1 2 N_FINCA 657 geometry 657 Fincas en shape 0 Length: 74, dtype: int64 2. Filas duplicadas: Filas duplicadas encontradas. Intervención Nombre_Area Subregion Cod_Finca Finca \ 9 NaN Fuera de ASP Cartago 2400 2-267824-000 13 NaN Fuera de ASP Cartago 0 4-137044-000 26 NaN Fuera de ASP Cartago 0 2-166331-000 27 NaN Fuera de ASP Cartago 0 2-166331-000 29 NaN Fuera de ASP Cartago 0 3-251387-000 31 NaN Fuera de ASP Cartago 510 3-74651-000 64 NaN Fuera de ASP Cartago 0 4-109999-000 212 NaN Fuera de ASP Cartago 0 4-104482-000 224 NaN Fuera de ASP Cartago 1161 4-111161-000 685 NaN Fuera de ASP Cartago 300 2-367203-000 686 NaN Fuera de ASP Cartago 300 2-367203-000 696 NaN Fuera de ASP Cartago 2454 2-454056-000 739 NaN Fuera de ASP Cartago 688 3-57688-000 750 NaN Fuera de ASP Cartago 300 3-80543-000 Num_Plano Patrimono ID SHAPE RNPdigital ... \ 9 2-628904-2000 2620678 M0001 Zona catastrada al día activo zc ... 13 4-1086244-2006 8304 M0440 Zona catastrada al día activo zc ... 26 2-0633234-2000 8310 M0001 Zona catastrada al día activo zc ... 27 2-0633234-2000 8310 M0001 Zona catastrada al día activo zc ... 29 3-0650841-2000 2455387 M0001 Zona catastrada al día activo zc ... 31 3-0674854-2000 9002 M0001 Zona catastrada al día activo zc ... 64 2-0629149-2000 9002 M0001 Zona catastrada al día activo zc ... 212 4-1086244-2006 8290 M0442 Zona catastrada al día activo zc ... 224 H-619216-2000 9002 M0001 Zona catastrada al día activo zc ... 685 2-628904-2000 8300 M0300 Zona catastrada al día activo zc ... 686 2-628904-2000 8300 M0300 Zona catastrada al día activo zc ... 696 2-940196-2004 2455405 M0560 Zona catastrada al día activo zc ... 739 3-0674854-2000 8576 M0001 Zona catastrada al día activo zc ... 750 3-0674854-2000 8305 M0543 Zona catastrada al día activo zc ... valoracion inmueble AREA m2 Valor Inmueble \ 9 3551638.5 3000.0 88522646.05 13 3551638.5 3000.0 89826670.43 26 3551638.5 3000.0 89826670.43 27 3551638.5 3000.0 89826670.43 29 3551638.5 3000.0 89826670.43 31 3551638.5 3000.0 88522646.05 64 3551638.5 3000.0 89826670.43 212 3551638.5 3000.0 89826670.43 224 3551638.5 3000.0 88522646.05 685 3551638.5 3000.0 89826670.43 686 3551638.5 3000.0 89826670.43 696 3551638.5 3000.0 88522646.05 739 3551638.5 3000.0 89826670.43 750 3551638.5 3000.0 89826670.43 EXPEDIENTE CODIGO DIGITAL BASE ACC AREA EN METROS CUADRADOS \ 9 PT-ACOPAC-011-2013 110000.00 13 PT-ACOPAC-011-2013 110000.00 26 PT-ACOPAC-011-2013 110000.00 27 PT-ACOPAC-011-2013 110000.00 29 PT-ACOPAC-011-2013 325276.00 31 PT-ACOPAC-011-2013 637429.65 64 PT-ACOPAC-011-2013 110000.00 212 PT-ACOPAC-011-2013 40649.46 224 PT-ACOPAC-011-2013 110000.00 685 PT-ACOPAC-011-2013 300000.00 686 PT-ACOPAC-011-2013 300000.00 696 PT-ACOPAC-011-2013 6.00 739 PT-ACOPAC-011-2013 325276.00 750 PT-ACOPAC-011-2013 300000.00 AREA EN HECTAREAS AREA HECTAREAS.1 N_FINCA \ 9 191.374250 199.346240 2-267824-000 13 191.374250 199.346240 NaN 26 15.110385 360.261083 NaN 27 15.110385 360.261083 NaN 29 15.110385 360.261083 3-251387-000 31 191.374250 360.261083 3-74651-000 64 191.374250 199.346240 4-109999-000 212 191.374250 199.346240 4-104482-000 224 15.110385 360.261083 4-111161-000 685 191.374250 360.261083 2-367203-000 686 191.374250 360.261083 2-367203-000 696 15.110385 360.261083 NaN 739 191.374250 360.261083 NaN 750 15.110385 360.261083 NaN geometry Fincas en shape 9 POLYGON ((466085.57459999993 1113979.803999999... 1 13 NaN 0 26 NaN 0 27 NaN 0 29 POLYGON ((514192.57070982637 1100676.099812537... 1 31 MULTIPOLYGON (((524404.0849825031 1081997.5460... 1 64 POLYGON ((495375.92765905854 1116780.171069154... 1 212 POLYGON ((495042.69100717176 1141794.323806502... 1 224 POLYGON ((494437.53784963104 1144703.498158826... 1 685 POLYGON ((472749.0014170971 1125124.224297592,... 1 686 POLYGON ((472741.3703424892 1125127.3879036047... 1 696 NaN 0 739 NaN 0 750 NaN 0 [14 rows x 74 columns] 3. Valores atípicos: Valores atípicos encontrados. Cod_Finca 125 Area m2 162 Código Finca 197 Cod_Actual 0 Area dentro de ASP: 2 Pagada 5 Número: 0 Cod_Anterior 182 Mostrar 0 Catego 5 N° 0 AREA METROS CUADRADOS 0 VALORACION INMUEBLE ¢ 0 No. 0 Año Compra 172 Área M2 5 Año Compra O DONACION 0 AREA M2 110 valoracion inmueble 0 AREA m2 184 Valor Inmueble 211 AREA EN METROS CUADRADOS 88 AREA EN HECTAREAS 0 AREA HECTAREAS.1 0 Fincas en shape 215 dtype: int64 Datos guardados en /content/tabla_fincas_estado_final.xlsx
Resultados¶
Se encontraron muchas discrepancias en los datos cruzados, entre ellas gran parte de registros nulos (NaN) eso se debe a la falta de depuración previa de las tablas de excel; aunque sí se eliminaron encabezados y otra información para facilitar la lectura el procesamiento. Esto es una limitante de los datos, que no fueron completados de manera ordenada.
Por lo anterior, se realizaron dos limpiezas y se utilizaron técnicas de inteligencia artificial para tratar de empatar ciertos registros y campos.
En general, se determinó que un 28% de las fincas y terrenos del Estado Minae se encuentran mapeadas, es decir, que están georreferenciadas en la capa. Esto es un valor sumamente bajo, pero que tiene una explicación contextual, según la realidad de estos terrenos, que se va a describir a continuación.
Cuando se habla de fincas, se refiere a terrenos que poseen un folio real asignado ante el Registro Nacional, es decir, están debidamente inscritas. Sin embargo, gran parte de terrenos del Estado no poseen finca inscrita, ya sea porque nunca se les generó por trámite inconcluso, o por alguna otra inconsistencia; en su lugar hay terrenos comprados que solo son planos, muchos de ellos cancelados e inaccesibles de verificara, otros fueron terrenos con un croquis sin validación catastral; otros, no se realizó el traspaso correspondiente y continuan a nombre de particulares, aún cuando se cuenta con escritura pública.
La mayor parte de los terrenos se ubican dentro del parque nacional Braulio Carrillo (área protegida insignea del ACC), de los cuales se inscribieron montones de fincas sin plano asociado (Lotes de Río Claro).
Es por esta razón que existe una pequeña parte de terrenos mapeados. Aunado a esto, se han generado nuevas incorporaciones como traspasos o inscripción de baldíos que no han sido registrados en las tablas de fincas, pero sí se han actualizado en la capa shapefile de fincas del Estado.
Existen muchos campos que deben ser revisados, y depurados, por ejemplo, observaciones o estado actual, pero esto sería solo con la revisión manual según el estado del expediente.
Conclusiones y recomendaciones¶
Según el proceso realizado con este proyecto, se obtuvo un insumo aceptable con el que se puede partir para el diagnóstico y regularización del catastro forestal en el Área de Conservación Central, sin embargo, se requiere, no solo del recurso humano para la revisión de cada caso, sino de mayor músculo a nivel de procesamiento con tecnologías digitales y SIG, realizando esfuerzos por implementar un código más intituitivo que permita ayudar al recurso humano analista, una mejor revisión y toma de decisiones.
Es necesario implementar un procedimiento claro y concreto para homologar los registros que el ACC maneja a nivel de sus centros operativos (áreas silvestres protegidas, oficinas subregionales y sede regional) para que la información sea limpia, consistente y uniforme, generando buenas prácticas a nivel de registro y ciberseguridad. Si bien es cierto, la migración a sistemas digitales es un punto débil del SINAC y falta trabajar en este proceso de forma más robusta, seria y consensuada.
Python ha demostrado ser una herramienta poderosa en la limpieza de datos y la consolidación de información, por lo que se debería fortalecer las capacidades del funcionariado del ACC del Sinac, para que este tipo de iniciativas se puedan realizar, facilitando una automatización de tareas, siendo más eficientes en el quehacer cotidiano, sin embargo esto requiere esfuerzos conjuntos. Hay una enorme falta de capacitación en materia de TIC y SIG.
Por último se destaca el esfuerzo que se realizó para mejorar la gestiónd de la tenencia de la tierra y de la información y regularización territorial del ACC, departamento en el que he fungido desde hace varios años, y del cual por limitantes de tiempo, personal, recursos tecnológicos y otros, no se ha podido avanzar significativamente, sin embargo, ya se tiene un archivo georreferenciado con el cual se han tomado decisiones en pro de la conservación del Patrimonio Natural del Estado. Este esfuerzo, aunque pequeño, da esperanzas para ir mejorando, gracias a cursos como Python para ciencia de datos.
Referencias bibliográficas¶
Cantos Sánchez, E. A., Inga Campoverde, J. A. , Macías Hernández, D. J., y Martínez Carriel, T. F. (2022). Los sistemas de información geográfica aplicados a la agricultura de precisión. Revista Científica Arbitrada Multidisciplinaria PENTACIENCIAS, 4(3), 62-72. Recuperado de http://editorialalema.org/index.php/pentaciencias/article/view/131
Mwaura, G. N., y Mutonga, J. K. (2022). Application of Open Source Technology to Building Cadastral Information System for Land Management in Kenya. International Journal of Geomatics and Geosciences, 13(2), 95-105. Recuperado de http://erepository.uonbi.ac.ke/bitstream/handle/11295/20395/Mwangi_Development%20of%20integrated%20land%20information%20management%20system%20in%20Kenya.pdf?isAllowed=y&sequence=3
Salinas Peña, M. D., y Jaramillo Blandón, J. S. (2022). Diseño del flujo de trabajo para operar la mutación catastral de primera respecto al modelo de datos LADM COL con enfoque multipropósito para AMCO. Recuperado de https://ridum.umanizales.edu.co/handle/20.500.12746/6626
Tekalign, A., y Abera, D. (2020). Development of Cadastral Information System Using Geographical Information System (GIS) and Python: A Case Study in Tepi Town. Journal of Geographic Information System, 12(4), 456-468. Recuperado de https://www.researchgate.net/publication/334671272_Development_of_Cadastral_Information_System_Using_Geographical_Information_System_GIS_A_Case_of_Tepi_Town
Ye, A., Wang, L., Zhao, L., Ke, J., Wang, W., & Liu, Q. (2021). Rapidfuzz: Accelerating fuzzing via generative adversarial networks. Neurocomputing, 460, 195-204. Recuperado de https://www.sciencedirect.com/science/article/pii/S0925231221010122