--- title: "Flujo Espacial y Filtrado Topológico Riguroso" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Flujo Espacial y Filtrado Topológico Riguroso} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 8, fig.height = 5.5, fig.align = "center", out.width = "100%", dpi = 300, fig.retina = 2 ) ``` ## Arquitectura Espacial de peruocc Uno de los principales retos al consultar APIs globales de biodiversidad mediante límites geográficos es la inconsistencia topológica y los falsos positivos en los bordes perimetrales. `peruocc` implementa un flujo espacial en 5 fases: ```text ┌──────────────────────────────┐ │ Unidad Administrativa │ │ (Distrito o Provincia) │ └──────────────┬───────────────┘ │ ┌──────────────▼──────────────┐ │ Geometría Oficial geoperu │ │ + Validación / Caché RDS │ └──────────────┬───────────────┘ │ ┌────────────────┴────────────────┐ │ │ ┌──────────▼──────────┐ ┌──────────▼──────────┐ │ Consulta a GBIF │ │ Consulta iNaturalist│ │ (WKT / Taxonomía) │ │ (Bounding Box) │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ └────────────────┬────────────────┘ │ ┌──────────────▼──────────────┐ │ Filtrado Espacial en R │ │ (sf::st_intersects exacto) │ └──────────────┬───────────────┘ │ ┌──────────────▼──────────────┐ │ Objeto Consolidado Final │ └─────────────────────────────┘ ``` --- ## 1. Extracción de Geometrías y Caché en Memoria Para optimizar las consultas y evitar descargas repetitivas desde la infraestructura de datos espaciales, `peruocc` descarga los límites departamentales una sola vez y los almacena en memoria RAM durante la sesión: ```{r} library(peruocc) # Obtener la geometría oficial de un distrito distrito_sf <- obtener_poligono_distrito( distrito = "Machupicchu", departamento = "Cusco", provincia = "Urubamba" ) distrito_sf ``` ### Disolución Provincial Al solicitar una provincia, el paquete recupera todos los distritos constituyentes y realiza una unión espacial (`sf::st_union`): ```{r} # Obtener polígono provincial unificado provincia_sf <- obtener_poligono_provincia( provincia = "Tambopata", departamento = "Madre de Dios" ) provincia_sf ``` --- ## 2. Orientación Geométrica Antihoraria (CCW) Las especificaciones OGC y la API de GBIF exigen que los anillos exteriores de los polígonos sigan una orientación antihoraria (*Counter-Clockwise - CCW*) y los anillos interiores (huecos) sigan orientación horaria. `peruocc` valida y corrige automáticamente la orientación mediante el cálculo del área con signo (Fórmula de Shoelace): $$\text{Área} = \frac{1}{2} \sum_{i=1}^{n-1} (x_i y_{i+1} - x_{i+1} y_i)$$ --- ## 3. Simplificación Métrica Adaptativa para APIs La API de GBIF impone restricciones estrictas en la longitud de las cadenas WKT (Well-Known Text). Para polígonos administrativos con bordes complejos, `peruocc`: 1. Proyecta temporalmente a la zona UTM correspondiente según la longitud geográfica (Zona 17S, 18S o 19S en el Perú). 2. Aplica simplificación topológica en metros (`sf::st_simplify(dTolerance = ...)`). 3. Transforma de vuelta a WGS84 (EPSG:4326) para generar el WKT de consulta. --- ## 4. Filtrado Espacial Exacto en Memoria Dado que iNaturalist solo admite filtrado por caja delimitadora (*Bounding Box*) y GBIF puede recibir un WKT simplificado, los registros crudos obtenidos pueden contener puntos fuera del perímetro oficial. `peruocc` resuelve esto convirtiendo todos los registros recuperados a geometrías de punto y ejecutando una intersección topológica estricta con el polígono detallado original: ```r # sf::st_intersects(puntos_sf, poligono_original_sf) ``` Garantizando que el 100% de las ocurrencias retenidas se encuentren verdaderamente dentro de la unidad territorial elegida. --- ## 5. Estrategias de Particionamiento Espacial para Grandes Unidades El territorio peruano presenta provincias y distritos de enorme extensión territorial (particularmente en la cuenca amazónica, como *Maynas*, *Tambopata* o *La Convención*). Consultar estas áreas extensas en una única llamada puede provocar tiempos de espera agotados o truncamiento de registros por los límites máximos de las APIs. `peruocc` ofrece el argumento `estrategia_espacial` en `buscar_especies_peru()` y `buscar_especies_poligono()`: ```r buscar_especies_peru( nombre = "Tambopata", nivel = "provincia", departamento = "Madre de Dios", estrategia_espacial = "auto", # "auto", "segmentada" o "directa" max_area_ha = 1000, # Área objetivo por tesela max_lotes = 16L # Límite de macro-bloques de seguridad ) ``` ### Modos de Operación: 1. **`"auto"` (Predeterminado)**: - En **provincias**, descarga distrito por distrito y consolida al final, garantizando que si un distrito falla, los demás queden guardados en checkpoints `.rds`. - En **distritos o polígonos extensos** (superiores a 50,000 ha), divide la geometría automáticamente en macro-bloques de teselación espacial para realizar consultas en paralelo seguro. 2. **`"segmentada"`**: - Fuerza la división del polígono en una cuadrícula adaptativa basada en `max_area_ha`. Ideal para grandes áreas de estudio o estudios de alta densidad de registros. 3. **`"directa"`**: - Envía el polígono completo en una sola llamada sin teselar. Recomendado únicamente para distritos urbanos pequeños o geometrías de reducida extensión. ### Checkpoints y Resiliencia en Lotes Cada lote procesado escribe un checkpoint intermedio en el directorio de caché (`peruocc_data_dir()`). Si la conexión a internet se interrumpe durante una descarga extensa, volver a ejecutar la misma función **reanudará la extracción desde el último lote completado**, sin repetir consultas previas ni duplicar registros. --- ## Siguientes Pasos Para consultar delimitaciones fuera del marco administrativo oficial (como Áreas Naturales Protegidas, buffers o shapefiles propios), consulta la viñeta especializada: * **[Búsqueda de Ocurrencias con Polígonos Personalizados](busqueda_poligono_usuario.html)**