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)

In [9]:
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

In [10]:
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

In [11]:
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!

In [12]:
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

In [13]:
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.

In [14]:
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
No description has been provided for this image
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

In [15]:
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

In [17]:
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¶


  1. 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.

  2. 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.

  3. 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.

  4. 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