Manual de campo y de desarrollo

YieldRadar

Todo lo que hace la aplicación, pantalla por pantalla, más los tres capítulos que faltaban: cómo está protegida, cómo funcionan las licencias y cómo escribir, firmar y cobrar un plugin.

Versión
7.21.19 · 168
Android
7.0 o superior
APK
universal · 4 ABI
Idiomas
ES · EN · PT · AR · DE
El mapa de trabajo
El mapa de trabajo: cintillo GNSS arriba, los tres modos a la izquierda y las herramientas a la derecha.
Las capas del proyecto, con su geometría, su conteo y la guía que dice qué falta.
Las capas del proyecto, con su geometría, su conteo y la guía que dice qué falta.
Un módulo instalado corriendo dentro de la aplicación, con sus propios datos.
Un módulo instalado corriendo dentro de la aplicación, con sus propios datos.
Índice del manual
Capítulo 01

Qué es YieldRadar y qué trae esta versión

YieldRadar es un colector de datos geográficos que trabaja sin cobertura. Los datos viven en un GeoPackage —el formato abierto de la OGC, un solo archivo .gpkg que abre QGIS, ArcGIS y GDAL sin conversión— dentro del teléfono, y salen de él cuando usted decida.

La aplicación cubre el ciclo completo: preparar el trabajo, conectar el receptor, capturar en campo, revisar, calcular y entregar. Funciona con el GPS del teléfono y con receptores GNSS externos de precisión centimétrica.

Novedades de 7.21.19

Atajo por modo nuevo

Cada modo de interfaz nombra su faena y la deja a un toque. El botón de modo del mapa ahora hace dos cosas: cambia de modo, o lanza el atajo si ya está en él.

Replanteo nuevo

Guiado a un punto de proyecto con distancia, azimut y ΔN/ΔE, aviso al entrar en tolerancia y registro de la estaca realmente clavada.

«Agro» ahora es «Campo»

Sólo cambia el nombre visible. Su configuración guardada y la de fábrica de la marca siguen intactas.

Barra inferior pareja

Los cuatro accesos —Mapa, GNSS, AR, Buscar— son ahora iconos del mismo peso, sin la pastilla que envolvía al elegido.

De las versiones inmediatamente anteriores conviene recordar: descarga de áreas y ruteo sin conexión (7.21.17), candado de capa por niveles, trazo y ancho de línea en la simbología, perfil del terreno accesible desde el modelo de elevación, y soporte de capas GEOMETRYCOLLECTION.

Capítulo 02

Instalación y permisos

El entregable es un APK universal: un solo archivo válido para cualquier procesador (arm64, arm32, x86 y x86_64), incluidos los espacios virtuales y clonadores de aplicaciones. Va firmado con los tres esquemas —v1, v2 y v3— porque los clonadores reempaquetan y exigen el v1.

  • Copie el .apk al teléfono y ábralo. Android pedirá permiso para instalar aplicaciones de esta fuente: concédalo.
  • Abra la aplicación. En el primer arranque pedirá los permisos que necesita.
  • Active la licencia (capítulo 3).

Qué permisos pide y para qué

PermisoPara qué¿Se puede negar?
Ubicación precisaPosición GNSS, captura, replanteo, navegaciónNo: sin él la app no mide
Ubicación en segundo planoSeguir grabando con la pantalla apagadaSí, pierde el registro continuo
CámaraFotos y vídeo adjuntos a una entidad, vista ARSí, hasta que la use
MicrófonoNotas de audio y grabación de pantalla con voz
Almacenamiento / archivosLeer e importar proyectos, escribir exportacionesNo para importar y exportar
BluetoothReceptor GNSS externo por Bluetooth o BLESí, si usa el GPS interno
NotificacionesServicio en primer plano de GNSS y de descarga de áreasSí, pero conviene concederlo
Ojo

Un permiso declarado no es un permiso concedido. Si al abrir la cámara no ocurre nada, revise Ajustes de Android → Aplicaciones → YieldRadar → Permisos: Android puede haberlos revocado tras meses sin usar la aplicación.

Dónde viven sus datos

En el almacenamiento público del teléfono, en la carpeta YieldRadar/ (las instalaciones antiguas conservan también AgriCien/). Dentro, una carpeta por proyecto:

YieldRadar/
  proyectos/
    Muestreo/
      Muestreo.gpkg      ← el proyecto entero: capas, entidades, atributos
      multimedia/        ← fotos, audio y vídeo adjuntos
      layers/            ← capas auxiliares importadas
  offline/               ← mapas descargados (.mbtiles) y redes viales (.roads)

Esa ruta no depende del nombre visible de la marca, a propósito: renombrar la aplicación no debe dejar sus proyectos huérfanos.

Capítulo 03

Activar la licencia

Ajustes › Acerca de: estado de la licencia, vencimiento, tipo e identificador
Ajustes › Acerca de: estado de la licencia, vencimiento, tipo e identificador.

Al primer arranque aparece la pantalla de licencia. Escriba el código que recibió y toque Activar. Hace falta conexión sólo en ese momento.

Lo que veQué significaQué hacer
Licencia activadaEl código quedó vinculado a este equipoNada; a trabajar
Otro dispositivoEse código ya se activó en otro teléfonoPida que liberen el equipo en el panel
Licencia vencidaPasó la fecha de expiraciónRenovar
Licencia inexistenteEl código no está en el panelRevise mayúsculas y guiones
Sin conexiónNo se pudo consultar al servidorConéctese una vez; después funciona sin cobertura

Trabajar sin cobertura

Tras la activación, la licencia queda validada localmente y la aplicación abre sin red durante 30 días. Pasado ese plazo pide una reconexión, que se resuelve en segundos con datos o WiFi. Es el equilibrio entre trabajar en una finca sin señal y que una licencia no siga viva indefinidamente en un equipo perdido.

Importante

El identificador de equipo depende de la clave con la que se firmó el APK. Si pasa de una versión de pruebas a una comercial, el mismo teléfono se presenta como un equipo distinto: hay que liberarlo en el panel y activarlo una vez más. No es un fallo, es cómo Android deriva ese identificador.

El detalle técnico —firma del veredicto, caché anti-fraude, panel— está en el capítulo 24.

Capítulo 04

Los tres modos y sus atajos

El hub en modo GIS
El hub en modo GIS: las pestañas cambian de nombre y de contenido con el modo.
Herramientas de GIS
Herramientas de GIS: simbología y servicios OGC, que en modo Campo ni aparecen.

La misma aplicación, vestida para tres oficios. Los tres modos existen siempre y ninguno esconde funciones: cambian la densidad de la pantalla, el vocabulario y —desde 7.21.19— qué faena está a un toque.

ModoPensado paraAtajoRejilla
CampoCuadrillas agrícolas; lenguaje llano, botones grandesEmpezar a trabajar2 columnas
GISTrabajo con capas, atributos y simbologíaRevisar capas3 columnas
TopoTopografía; todo a la vista, botones compactosReplantear4 columnas

Cómo se usa el atajo

Al cambiar de modo, el aviso ofrece además el atajo del modo nuevo.
Al cambiar de modo, el aviso ofrece además el atajo del modo nuevo.
El atajo de Campo: sesión abierta, GPS siguiendo y el ➕ armado.
El atajo de Campo: sesión abierta, GPS siguiendo y el ➕ armado.

Los tres botones de modo están en el mapa, arriba a la izquierda (se repliegan con la doble flecha). El activo va en naranja.

  • Toque un modo distinto → cambia a ese modo, y el aviso que aparece abajo ofrece además su atajo: «Modo de interfaz: GIS · Revisar capas».
  • Toque el modo en el que ya está → lanza el atajo directamente.
En el campo

Es la diferencia entre seis toques y uno. Mantenga pulsado el botón del modo activo si duda: el tooltip dice qué va a hacer.

Qué hace cada atajo

Campo · Empezar a trabajar

Abre la sesión de captura sobre las capas activas, enciende el seguimiento GPS, despliega el panel de captura si estaba plegado y avisa: «Listo: pulse ➕ para tomar el punto en lotes». Un toque para armar, y uno por punto.

Si no hay ninguna capa activa lleva a Proyectos y lo dice. No elige la capa por usted: así es como se acaban los puntos del lote de ayer mezclados con los de hoy.

GIS · Revisar capas

Todas las capas del proyecto, con entidades, geometría y candado.
Todas las capas del proyecto, con entidades, geometría y candado.
Un toque: la enciende, la encuadra y la deja consultable.
Un toque: la enciende, la encuadra y la deja consultable.

Abre una hoja con todas las capas del proyecto, cada una con su número de entidades, su geometría y su candado. Al tocar una: la enciende en el mapa, la encuadra y la deja como capa de consulta, de modo que el siguiente toque sobre una entidad abre su ficha con Editar y Borrar. Manteniendo pulsada una capa se abre su tabla de atributos.

Topo · Replantear

Pregunta de dónde salen los puntos de proyecto —de una capa, de coordenadas tecleadas o siguiendo con el replanteo en curso— y entra en modo replanteo. Capítulo 13.

Capítulo 05

El hub: cuatro pestañas

Trabajo: proyectos, capas, base de puntos, importar/exportar y unidades
Trabajo: proyectos, capas, base de puntos, importar/exportar y unidades.
Equipo: estado GNSS, receptor externo y correcciones NTRIP
Equipo: estado GNSS, receptor externo y correcciones NTRIP.
Campo: abrir mapa, puntos, líneas, polígonos y AR
Campo: abrir mapa, puntos, líneas, polígonos y AR.
Utilidades: mapa base, mapas sin conexión, medir y módulos
Utilidades: mapa base, mapas sin conexión, medir y módulos.

La pantalla de entrada tiene cuatro pestañas fijas —preparar el trabajo, conectar el instrumento, levantar, calcular— y una rejilla de módulos en cada una. Los nombres de las pestañas cambian según el modo; los destinos, no.

PestañaEn Topo / GISEn CampoQué hay dentro
1ProyectoTrabajoProyectos, Capas, Atributos, Puntos, Exportar, Importar, Unidades y coordenadas
2Instrumento / GPSEquipoGNSS externo, NTRIP, Minicaster, Compartir GNSS, PPK, Estado del equipo
3Levantamiento / DatosCampoAbrir mapa, Puntos, Líneas, Polígonos, AR
4HerramientasUtilidadesMapa base, Servicios, Mapas sin conexión, Simbología, Módulos, Medir

Arriba se ven siempre dos datos: el proyecto activo y el estado GNSS (calidad del fix, satélites usados/visibles, precisión y PDOP).

En modo Campo se ocultan de la rejilla los módulos que ese oficio no usa —minicaster, compartir GNSS, PPK, servicios OGC, simbología, tabla de atributos—. Siguen existiendo: se llega a ellos desde Ajustes y desde el menú lateral.

Barra inferior y menú lateral

Pestaña de trabajo, en modo Campo: dos columnas y botones grandes.
Pestaña de trabajo, en modo Campo: dos columnas y botones grandes.
Pestaña de campo: mapa, puntos, líneas, polígonos y AR.
Pestaña de campo: mapa, puntos, líneas, polígonos y AR.
Pestaña de utilidades: mapa base, sin conexión, módulos y medir.
Pestaña de utilidades: mapa base, sin conexión, módulos y medir.
El menú lateral: inicio, módulos, atajos, ajustes y diagnóstico.
El menú lateral: inicio, módulos, atajos, ajustes y diagnóstico.

La barra inferior flotante lleva cuatro accesos: Mapa, GNSS, AR y Buscar. El menú lateral (icono de hamburguesa) da acceso a Inicio, Módulos, Atajos, Ajustes, Registro de diagnóstico y Salir.

Capítulo 06

El mapa por dentro

El mapa con las herramientas desplegadas: modos arriba, herramientas a la derecha, accesos abajo
El mapa con las herramientas desplegadas: modos arriba, herramientas a la derecha, accesos abajo.

Es la pantalla donde se pasa el día. Todo lo que flota sobre el mapa se puede plegar o mover.

Cintillos, de arriba abajo

CintilloQué muestra
Estado GNSSOrigen (📱 interno / 📡 externo), calidad, satélites, precisión, PDOP, edad de correcciones y su posición en la proyección elegida
RutaManiobra actual, calle, distancia al giro y lo que queda
ReplanteoPunto, avance, distancia, azimut y componentes
CapturaCapa y número de nodos tomados

Botones

  • Barra de modos (izquierda): Topo · GIS · Campo, con su atajo.
  • Barra de herramientas (derecha, arrastrable y plegable): superficie de elevación, acercar, alejar, norte, mi posición, captura de pantalla, hablar, capas y medir.
  • Botón de captura ➕: se arrastra donde quiera y se queda ahí.
  • Panel de captura: guardar, deshacer nodo, nueva parte, cancelar, automático, coordenadas y proyección de punto.

Gestos

El mapa al arrancar, con el cintillo GNSS, la barra de modos y la pregunta de continuidad.
El mapa al arrancar, con el cintillo GNSS, la barra de modos y la pregunta de continuidad.
  • Un toque sobre una entidad de la capa de consulta abre su ficha.
  • Mantener pulsado en cualquier punto abre el diálogo de navegación: guiado AR, Waze o Google Maps, y ruta sin conexión.
  • Dos dedos: girar el mapa (si la rotación está activada en Ajustes).
Capítulo 07

Proyectos

Cada proyecto es un GeoPackage; el activo manda sobre lo que se captura
Cada proyecto es un GeoPackage; el activo manda sobre lo que se captura.

Un proyecto es una carpeta con un GeoPackage dentro. Todo lo que capture vive ahí.

  • Hub → Proyecto → Proyectos y toque +.
  • Escriba el nombre. El diálogo muestra la proyección vigente y deja cambiarla ahí mismo; si no entra, se queda con la de siempre.
  • Toque el proyecto para abrirlo. La aplicación lo recordará entre arranques.

Desde la lista se puede además renombrar, duplicar, borrar y compartir el .gpkg entero. El primer arranque siembra un proyecto de ejemplo, GeoDataCollector, con capas de los tres tipos para trastear sin miedo.

En el campo

Al abrir la aplicación con un trabajo en curso, pregunta «¿Continúa con el mismo proyecto?» y dice cuál y con qué capa. Se pregunta una vez por lanzamiento: entrar y salir del mapa cincuenta veces al día no debe costar un diálogo cada vez.

Capítulo 08

Capas y candados

Capas del proyecto con su geometría y su conteo
Capas del proyecto con su geometría y su conteo. Arriba, la guía dice qué falta.

Una capa es una tabla de entidades de un tipo de geometría. Hub → Proyecto → Capas.

Crear y activar

Las capas del proyecto. Arriba, la guía dice qué falta: añadir campos propios.
Las capas del proyecto. Arriba, la guía dice qué falta: añadir campos propios.

Al crear una capa elige tipo: punto, línea, polígono o colección (una capa que admite las tres formas a la vez, como las que traen los geopaquetes de catastro).

Activar una capa es decir «aquí es donde van los puntos que tome». Hay una ranura por tipo de geometría más una de colección, así que puede tener a la vez la capa de puntos, la de líneas y la de polígonos recibiendo datos. En la lista, la capa en edición va en naranja y negrita; las simplemente visibles, en el color de acento.

Visibilidad y orden

El ojo enciende y apaga la capa en el mapa; las flechas la suben o bajan en el orden de dibujado; la lupa encuadra el mapa en ella.

El candado: tres niveles

Editar capa → Permisos de edición

NivelCrearEditar y borrarPara qué
AbiertaLo normal
Solo agregarNoProteger el trabajo de ayer mientras se sigue levantando
BloqueadaNoNoCapa de consulta: catastro, cartografía de referencia

El candado se impone en el motor de datos, no en cada pantalla: cubre el mapa, la lista de entidades, la importación de archivos y los plugins. Las pantallas además quitan de antemano lo que no se puede: el menú de una entidad bloqueada no ofrece Editar ni Borrar.

Ojo

El candado es por dispositivo y no viaja dentro del .gpkg. Protege del error de dedo en campo —borrar el lote de ayer mientras se toma el de hoy—, no de quien quiera saltárselo.

Otras acciones de capa

Menú de la capa
Menú de la capa: campos, entidades, encuadre, orden de dibujo y copia vacía.
Más abajo
Más abajo: importar, exportar, limpiar y eliminar la capa.
  • Vaciar: borra las entidades y deja la estructura.
  • Copiar vacía: clona la capa con sus campos, sin datos. Es la vía rápida para la campaña del mes siguiente.
  • Reconstruir índice: si el dibujado se vuelve lento tras miles de entidades.
  • Importar entidades de otro archivo a esta capa.
  • Exportar: GeoJSON, Shapefile (zip), GML, CSV, KML y GPX.
Capítulo 09

Atributos y entidades

Los campos propios de una capa de catastro, con su tipo.
Los campos propios de una capa de catastro, con su tipo.

Campos

Los campos de una capa, con el tipo de cada uno
Los campos de una capa, con el tipo de cada uno.
Añadir un campo: nombre, tipo y longitud máxima si es texto
Añadir un campo: nombre, tipo y longitud máxima si es texto.

Capas → Atributos. Cada capa nace con seis campos de plantilla —nombre, descripción, fecha de inicio, observaciones, creado y modificado— y las capas de punto suman trece de trazabilidad GNSS. Encima de eso se añaden los suyos: texto, número entero, número decimal, fecha, sí/no, lista de opciones y archivo adjunto (BLOB).

Nota

Los campos de plantilla no cuentan como campos propios: la guía le seguirá recordando que añada los suyos hasta que lo haga.

La tabla de entidades

Las entidades de la capa, cada una con su FID y su geometría.
Las entidades de la capa, cada una con su FID y su geometría.

Capas → Entidades abre la tabla completa: filtrar, ordenar, buscar, editar celda a celda, ver adjuntos, borrar y hacer zoom a una entidad. Es también el sitio donde se corrige a la vuelta lo que se anotó deprisa en campo.

El bloque de atributos

Lo que se puede hacer con una entidad
Lo que se puede hacer con una entidad: ver, editar, mover de capa, navegar o exportar.
Propiedades
Propiedades: nodos, coordenadas geográficas y las mismas en CRTM05.

Al guardar una entidad se abre el formulario con sus campos. Recuerda el último valor escrito por capa (si lo activa en Ajustes) y avisa de nombres duplicados. Los campos GNSS se rellenan solos con la calidad del momento de la captura, no del momento en que usted termina de escribir.

Capítulo 10

Capturar datos

La barra de captura armada
La barra de captura armada: punto por GNSS, automático, o por coordenadas conocidas.

Cinco vías, todas sobre la capa activa.

VíaCómoCuándo
Punto GNSSBotón ➕Lo habitual: toma la posición actual
Punto promediadoPanel → promediarVértices y mojones: promedia N épocas y reporta σ
Toque en el mapaTocar donde va el nodoDigitalizar sobre ortofoto
CoordenadasPanel → coordenadasPunto de una libreta, en WGS84 o CRTM05
AutomáticoPanel → autoRecorridos: un nodo cada X metros o cada X segundos

Líneas y polígonos

Cada toque o cada ➕ añade un nodo. Nueva parte empieza otro trazado dentro de la misma entidad (una finca con dos lotes separados). Deshacer quita el último nodo. Guardar cierra la geometría y abre el formulario.

Proyección de punto

Distancia y azimut desde el último punto capturado, desde su posición o desde el centro del mapa. Para el vértice al que no se puede llegar con el jalón.

Puertas de calidad

Bajo techo, la puerta de satélites frena el registro y explica por qué.
Bajo techo, la puerta de satélites frena el registro y explica por qué.

Antes de escribir nada, la aplicación comprueba:

  • Que la posición venga de satélites. Si hay satélites a la vista y ninguno en el cálculo, lo que entrega el teléfono es un relleno de red con precisión de cientos de metros: se rechaza con «No viene de satélites: N a la vista, 0 en el cálculo. Punto no registrado». Esta puerta no se puede desactivar.
  • RTK fijo, si lo exige en Ajustes (sólo con receptor externo).
  • Precisión mínima en metros, si la configuró.
Capítulo 11

GNSS y RTK

Panel GNSS: coordenadas, altitud, precisión, DOP y satélites en uso
Panel GNSS: coordenadas, altitud, precisión, DOP y satélites en uso.
Detalle por constelación y la fuente real de la posición
Detalle por constelación y la fuente real de la posición.

Hub → Instrumento. Cada mosaico abre su sección del panel GNSS.

Origen de la posición

La aplicación usa el chip del teléfono por defecto y un receptor externo cuando lo configura. El chip queda de reserva caliente: si el receptor externo calla más de ocho segundos —batería, Bluetooth, fuera de alcance—, la posición vuelve al interno en vez de quedarse ciega, y regresa al externo en cuanto vuelve.

Receptor externo

Panel GNSS: coordenadas, altitud, precisión, DOP y satélites en uso.
Panel GNSS: coordenadas, altitud, precisión, DOP y satélites en uso.
VíaNotas
Bluetooth clásicoEmpareje primero en Android; luego elija el equipo en la lista
Bluetooth LEReceptores modernos de bajo consumo
WiFi (TCP)Host y puerto del receptor; puerto RTCM aparte para las correcciones
USB serieFTDI, Prolific, CP210x, CH340 y CDC-ACM; se elige la velocidad
Ojo

Con el teléfono conectado a la WiFi del receptor no hay salida a internet por esa red. La aplicación lo tiene en cuenta y busca conexión por cualquier red disponible, así que los datos móviles siguen sirviendo para NTRIP y para el catálogo de plugins.

NTRIP

Correcciones NTRIP, minicaster para compartir y grabación PPK, en la misma pantalla
Correcciones NTRIP, minicaster para compartir y grabación PPK, en la misma pantalla.
Alta de un caster: host, puerto, credenciales, versión del protocolo y TLS
Alta de un caster: host, puerto, credenciales, versión del protocolo y TLS.

Proveedores y credenciales, descarga del sourcetable, elección de mountpoint y estado de la conexión. Con redes virtuales (VRS/NEAR), la aplicación envía su posición al caster automáticamente. La edad de las correcciones sale en el cintillo del mapa: si crece, el RTK se está degradando.

Minicaster y compartir

Minicaster convierte el equipo en base: retransmite las correcciones de su receptor a otros equipos de la cuadrilla. Compartir GNSS publica la posición para que otra aplicación del mismo teléfono la consuma.

PPK

Registro crudo de observaciones para postproceso. Se graba durante el levantamiento y se descarga después.

Estado del equipo

Constelaciones, relación señal/ruido por satélite, DOP, tipo de solución y edad de correcciones. Es la pantalla a la que hay que mirar antes de dudar de un dato.

Capítulo 12

Precisión, alturas y coordenadas

Levantamiento: altura de antena, promediado, precisión mínima y modelo de geoide
Levantamiento: altura de antena, promediado, precisión mínima y modelo de geoide.

Altura de antena

La cota que se guarda es la del terreno, no la de la antena. Escriba la altura del bastón en Ajustes → Levantamiento.

No lo reste dos veces

Si su receptor tiene compensación de inclinación (IMU) y entrega ya la posición de la punta del bastón, active «el receptor referencia la punta». Con esa opción la corrección vertical es cero: restar además la altura del bastón la descontaría dos veces, y con el bastón inclinado ni siquiera sería la corrección correcta.

Promediado

Actívelo para que cada punto sea la media de N épocas o de T segundos, lo que ocurra primero. El diálogo muestra el avance, la media en coordenadas proyectadas y las desviaciones σ horizontal y vertical. Con el filtro de RTK fijo activo sólo cuentan las épocas fijas.

Geoide y cota ortométrica

Con un modelo de geoide instalado (EGM2008), la aplicación convierte la altura elipsoidal en ortométrica: H = h − N. Sin modelo, marca el valor como elipsoidal en vez de fingir.

Sistema de coordenadas

Proyección de visualización, unidades y definición proj4 propia
Proyección de visualización, unidades y definición proj4 propia.

Hub → Proyecto → Unidades y coordenadas. Elija el EPSG —CRTM05 (8908) es el predeterminado en Costa Rica— o pegue una cadena proj4 propia. Ahí mismo se fijan las unidades de longitud (m, km, ft) y de área (m², ha, ac, km²), que mandan en todo lo que muestra la aplicación.

En el primer arranque, la aplicación pregunta si conoce la proyección que utiliza. Si dice que no, fija el UTM WGS 84 de su zona y se lo comunica.

Capítulo 13

Replanteo nuevo

Llevar al terreno un punto que existe en el proyecto: ir hasta él, clavar la estaca y dejar registrado dónde quedó realmente.

  • Póngase en modo Topo y toque su botón otra vez (o use Replantear del aviso al cambiar de modo).
  • Elija de dónde salen los puntos: Puntos de una capa del proyecto, o Coordenadas tecleadas en WGS84 o CRTM05.
  • Camine siguiendo la flecha y los números. Al entrar en tolerancia, el equipo pita y la diana se pone verde.
  • Clave la estaca y toque Guardar: se registra su posición medida con la desviación respecto al proyecto, y pasa al punto siguiente.

Lo que dice el cintillo

El atajo de Topo pregunta de dónde salen los puntos.
El atajo de Topo pregunta de dónde salen los puntos.
Coordenadas tecleadas, en WGS84 o en CRTM05.
Coordenadas tecleadas, en WGS84 o en CRTM05.
Guiado vivo: flecha, distancia, azimut y componentes.
Guiado vivo: flecha, distancia, azimut y componentes.
P-14 · 3/37 · 12 ✓ · 3,42 m · 47°
2,33 m al norte · 2,50 m al este · cortar 0,18 m
DatoQué es
P-14Nombre del punto de proyecto
3/37 · 12 ✓Va por el tercero de treinta y siete; doce ya clavados
3,42 mDistancia horizontal. Bajo 1 m pasa a centímetros, bajo 1 cm a milímetros
47°Azimut geográfico al punto, el que se teclea en una estación total
2,33 m al norteComponentes que hay que caminar. En palabras, no en signos
cortar 0,18 mDiferencia de cota, si el punto de proyecto trae cota

Detalles que importan en el terreno

  • La flecha gira respecto a su rumbo sólo si el rumbo vale algo. Parado, el rumbo del GNSS da vueltas enteras, así que por debajo de 0,5 m/s la flecha apunta al azimut geográfico: no ayuda a girar, pero no miente.
  • El pitido suena al entrar en tolerancia, no mientras se está dentro. Un pitido por época con el jalón apoyado acaba con el sonido apagado y el punto siguiente sin aviso.
  • La tolerancia se fija una vez (10 cm por defecto) desde el mismo diálogo del atajo, y sólo mira la planta: un centímetro en planta con medio metro de desnivel es una estaca bien puesta.
  • ◀ ▶ recorren la lista y dan la vuelta al llegar al final: en campo se salta el punto que tiene un carro encima y se vuelve a él al terminar.
  • La lista no ofrece el registro interno de capturas ni las capas vacías: un replanteo se hace contra puntos de proyecto.

Qué se guarda

La posición medida, no la coordenada de proyecto — es lo que distingue un replanteo de un dibujo. En la descripción queda la desviación: Replanteo de P-14 · N 2,33 m · E 2,50 m · dist 3,42 m, y los campos GNSS de la capa recogen la calidad del momento.

Hace falta una capa de puntos activa donde escribir. Si la capa está bajo candado, se dice como tal; y si la posición no viene de satélites, no se registra nada.

Precisión del cálculo

Las componentes se resuelven sobre el plano tangente al elipsoide WGS 84 con el radio real de cada dirección —el del meridiano para el norte, el de la primera vertical para el este—, y la distancia es exactamente la hipotenusa de las dos: lo que dice el cintillo se puede comprobar con una calculadora. Por encima de 10 km la aplicación deja de hablar de replanteo y dice que se acerque.

Capítulo 14

Medir y calcular

El botón de medición del mapa abre un trazado temporal que no toca sus datos: toque para poner nodos y lea distancias parciales, distancia total, área y ángulos interiores. Cerrando el trazado se obtiene el área del recinto.

El cintillo de medición es además la puerta a los cálculos de movimiento de tierras y al perfil del terreno (capítulo 15).

Extensión de cálculos topográficos

Como módulo aparte se distribuye la calculadora de campo: inversa y directa, factores de cuadrícula a terreno, intersecciones, resección con aviso de círculo peligroso, poligonal con ajuste, división de líneas y áreas, curvas horizontales y verticales, nivelación, volúmenes y conversión de coordenadas. Toma puntos del proyecto o del GNSS y devuelve los resultados a una capa del GeoPackage. No declara permiso de red: los cálculos no salen del equipo.

Capítulo 15

Modelo de elevación y movimiento de tierras

Modelo IDW sobre 531 puntos de la bitácora, de 128 a 1149 m, con curvas cada 100 m.
Modelo IDW sobre 531 puntos de la bitácora, de 128 a 1149 m, con curvas cada 100 m.

El botón de superficie del mapa levanta un modelo del terreno con los puntos que ya tiene levantados: interpolación IDW o triangulación TIN, con rampa hipsométrica de colores.

De qué puntos se construye

De las capas con cota y del registro de captura. Puede excluir puntos por precisión —descartar todo lo que pase de X metros— para que un fix malo no deforme la superficie.

Corte y relleno

Con una superficie y un recinto medido: la aplicación calcula volumen de corte, de relleno, su diferencia, y el nivel de plataforma que los equilibra. Con la capacidad de la vagoneta configurada, traduce el volumen a viajes. El resultado se comparte como texto o imagen.

Perfil del terreno

Modelo de elevación → Perfil del terreno → Trazar un perfil. La aplicación da el paso que falte: sin modelo lo enciende, sin trazado entra en Medir y pide los puntos, y con todo listo calcula. IDW o TIN se eligen en el mismo diálogo.

Auto-survey

Con la superficie encendida, la aplicación puede ir añadiendo puntos al modelo mientras camina, respetando la precisión mínima y una distancia mínima entre muestras.

Capítulo 16

Multimedia y evidencias

QuéDóndeCómo se guarda
Fotos y vídeoFormulario de la entidadEn multimedia/ del proyecto, referenciados desde la entidad
Notas de audioFormulario de la entidadGrabadas dentro de la aplicación
ArchivosCampo de tipo adjuntoCualquier documento; también dentro del .gpkg como BLOB
Captura de pantallaBotón del mapaSólo el mapa o la pantalla completa
Grabación de pantallaBotón del mapaPara soporte: reproduce el problema y lo manda

Al exportar el proyecto puede incluirse el paquete multimedia completo, de modo que quien lo reciba vea las fotos junto a las entidades.

Capítulo 17

Mapa base y servicios OGC

El panel de capas activas: las del proyecto arriba, el mapa base abajo
El panel de capas activas: las del proyecto arriba, el mapa base abajo.

Mapa base

Los mapas de fondo disponibles, incluido «ninguno» para trabajar sobre sus propias capas.
Los mapas de fondo disponibles, incluido «ninguno» para trabajar sobre sus propias capas.

Hub → Herramientas → Mapa base: callejero, satélite, satélite con rótulos o ninguno (fondo limpio para trabajar sólo con sus capas).

Servicios

Servicios OGC ya cargados
Servicios OGC ya cargados: catastro, ortofoto y topografía del IGN y el SNIT, WMS y WMTS.

Hub → Herramientas → Servicios añade capas remotas:

  • WMS y WMTS: cartografía oficial, ortofotos institucionales.
  • XYZ: cualquier teselado estándar.
  • WFS: entidades vectoriales consultables.

Se guarda nodo, tipo, capas y cobertura. Desde la hoja de capas activas del mapa se elige cuál responde a los toques, y se ocultan las que estorben.

Capítulo 18

Trabajar sin conexión

Tres pestañas: teselas MBTiles, redes viales para rutear e imágenes georreferenciadas
Tres pestañas: teselas MBTiles, redes viales para rutear e imágenes georreferenciadas.

Lo que se lleva al campo se baja antes, con cobertura.

  • Hub → Herramientas → Mapas sin conexión → + → Descargar área desde el mapa
  • Encuadre el área en el mapa y ajuste el recuadro. La pantalla se abre donde usted está: primero en el fix GNSS, y si no lo hay, en el último centro del mapa.
  • Elija el rango de zoom. La aplicación estima cuántas teselas y cuántos megas son antes de empezar.
  • Descargue. Es un servicio en primer plano: bajar un cantón son minutos y apagar la pantalla no lo aborta.

El resultado son dos archivos hermanos en la carpeta offline:

  • <área>.mbtiles — las teselas de la capa base activa.
  • <área>.roads — la red vial de la zona, para rutear sin cobertura.
Si falla la red vial

Los servidores públicos de datos viales se saturan. Si las teselas se bajaron y la red vial no, la aplicación lo dice y conserva lo descargado: 22 MB de ortofoto siguen sirviendo aunque no haya ruteo.

Otros archivos sin conexión

También se importan mapas propios: .mbtiles ya hechos y ortofotos georreferenciadas en GeoTIFF. Se encienden, se apagan y se encuadran desde la misma pantalla.

Capítulo 19

Navegación y rutas

La búsqueda por ciudad, dirección o lugar, desde la barra inferior
La búsqueda por ciudad, dirección o lugar, desde la barra inferior.

Mantenga pulsado un punto del mapa —o busque un lugar por nombre— y aparecen las tres vías, cada una con su estado real debajo:

VíaQué haceNecesita
Guiado ARCampo a través, con brújula, distancia y avisos sonoros de rumboNada
Waze / Google MapsPor carretera, en la aplicación que ya usaInternet y la app instalada
Ruta sin conexiónPor calles reales, con maniobras habladas en el cintilloUn área descargada con su red vial

Ninguna se oculta cuando no sirve: si falta el área descargada, la opción lleva a descargarla. Al llegar por carretera, el guiado AR toma el relevo para el último tramo a pie.

Herramientas AR

Las herramientas AR usan la cámara
Las herramientas AR usan la cámara: brújula y nivel/clinómetro.
El clinómetro, para pendientes y alturas sin sacar el nivel de la caja.
El clinómetro, para pendientes y alturas sin sacar el nivel de la caja.

La vista de realidad aumentada añade sobre la cámara: brújula con rumbo objetivo, distancia acumulada, nivel de burbuja, clinómetro, cruz de suelo, linterna, captura y compartir posición. Los avisos sonoros permiten caminar mirando el terreno en vez de la pantalla.

Capítulo 20

Simbología

Simbología
Simbología: se elige la capa y se le da estilo.

Hub → Herramientas → Simbología, con un proyecto abierto.

Tipos de simbología

Símbolo único, categorizado o graduado; más el trazo, la etiqueta y la importación de QML/SLD.
Símbolo único, categorizado o graduado; más el trazo, la etiqueta y la importación de QML/SLD.
  • Único: un color y un trazo para toda la capa.
  • Categorizado: un color por valor de un campo (por variedad, por estado).
  • Graduado: rampa por rango numérico (por rendimiento, por profundidad).

Línea y borde

Ancho en píxeles y trazado
Ancho en píxeles y trazado: continuo, discontinuo, punteado, raya y punto o marcadores.

Ancho de 1 a 20 px y cinco trazados: continuo, discontinuo, punteado, raya-punto y marcadores. La muestra en vivo es una línea quebrada a propósito: en una recta, discontinuo y punteado no se distinguen. El patrón se escala con el ancho, no en píxeles fijos.

Etiquetas

La etiqueta se arma uniendo campos con «+».
La etiqueta se arma uniendo campos con «+».

Se elige el campo que rotula cada entidad, si se evitan solapes y desde qué número empieza la numeración automática.

Capítulo 21

Exportar e importar

Formatos de salida, entrada de GeoJSON y la zona de peligro, separada del resto
Formatos de salida, entrada de GeoJSON y la zona de peligro, separada del resto.

Formatos

FormatoExportaImportaNota
GeoPackageEl proyecto entero, tal cual
GeoJSONRFC 7946
ShapefileSí (zip)Con su .prj; se reproyecta al leer
KML / KMZGoogle Earth
GPXWaypoints y trazas
CSVTabla con coordenadas
GMLOGC GML 3.2.1
GeoTIFFOrtofotos y ráster georreferenciado

Destinos

Además de guardar en el teléfono y compartir por cualquier aplicación:

  • PostgreSQL / PostGIS — escribe directo a la base corporativa.
  • FTP y SFTP — servidores propios.
  • Amazon S3 — con cifrado del lado del cliente: lo que sube ya va cifrado y el proveedor no puede leerlo.
  • Google Drive y GitHub — repositorios de la organización.

Las credenciales de todos ellos se guardan cifradas (capítulo 23).

Copia de la configuración

Ajustes → Copia de configuración exporta e importa los ajustes del equipo —unidades, proyección, receptores, proveedores NTRIP, destinos— para clonar la configuración en el resto de la cuadrilla sin repetirla equipo por equipo. Las contraseñas no viajan en claro.

Capítulo 22

Ajustes: referencia completa

El árbol completo de ajustes
El árbol completo de ajustes.
Apariencia: tema, tamaño de texto, modo de interfaz y modo para daltonismo
Apariencia: tema, tamaño de texto, modo de interfaz y modo para daltonismo.
Conexiones remotas: PostGIS y FTP/SFTP para volcar el trabajo al servidor
Conexiones remotas: PostGIS y FTP/SFTP para volcar el trabajo al servidor.
PantallaQué contiene
GeneralIdioma (ES · EN · PT · AR · DE) y copia de configuración
AparienciaModo de interfaz, tema claro/oscuro/sistema, paleta para daltonismo, tamaño de letra
MapaRotación, zoom automático por velocidad, guardar al volver, centrar siempre en el GPS, botón de medir, etiquetas de distancia, botones de zoom, mantener pantalla encendida
Unidades y coordenadasEPSG, proj4 propio, unidad de longitud y de área, capacidad de vagoneta
LevantamientoExportar info GPS, cota ortométrica, modelo de geoide, altura de antena, duración del promedio, precisión mínima, aviso de nombre duplicado, reutilizar el último nombre
OtrosNavegación (Waze, radio de llegada), seguimiento (grabar traza, exigir RTK fijo, automático por distancia y por tiempo, punta referenciada, altura, promediado, épocas y segundos) y exportación (nombre de equipo, prefijos de punto, línea y polígono)
Conexiones remotasPostGIS, FTP/SFTP, S3, Google Drive, repositorios de GitHub, con botones de prueba
GNSS externoBluetooth, BLE, TCP/WiFi, USB y sus parámetros
NTRIPProveedores, credenciales y mountpoints
PluginsModo desarrollador (permite ejecutar módulos sin firmar)
Acerca deVersión, estado de licencia, patente, desarrollador, documentación y contacto

Las secciones de GNSS externo y NTRIP no aparecen en el índice de Ajustes: se abren desde el panel del instrumento, junto a las acciones con las que se usan.

Capítulo 23

Seguridad de YieldRadar

Qué protege la aplicación, con qué, y —tan importante como lo anterior— qué no protege.

Credenciales cifradas

Las contraseñas de PostGIS, FTP/SFTP, S3, NTRIP y los tokens de repositorios no se guardan en claro. Se cifran con AES-256-GCM usando una clave que vive en el Android Keystore —en el elemento seguro del equipo cuando el hardware lo soporta— y que no es extraíble ni con acceso al almacenamiento de la aplicación.

Tráfico de red

El tráfico en claro está prohibido salvo donde el protocolo no deja alternativa (un caster NTRIP en HTTP simple, un servidor FTP de la propia organización). Cada excepción está declarada en la política de red del paquete, no abierta en general.

Cifrado del lado del cliente

Al exportar a S3, los archivos se cifran antes de salir del teléfono, con una clave por proyecto. El proveedor de almacenamiento guarda un bloque opaco: aunque el bucket quedara expuesto, el contenido no es legible.

Informe de seguridad auditable

La aplicación puede generar un informe de su propia postura de seguridad: dónde vive la clave maestra, si el paquete es depurable, qué extensiones hay instaladas y con qué permisos, y qué controles cumple o incumple. Está pensado para que el responsable de seguridad de un cliente lo revise sin creer en promesas.

Verificar el APK que tiene instalado

La huella del certificado de firma es pública y se entrega con el producto. Comparándola con la del paquete instalado se comprueba que nadie lo reempaquetó por el camino. La huella de YieldRadar empieza por A5:46:32:45:39:99.

Lo que no protege

  • Un equipo con root. Quien ejecuta código dentro del proceso de la aplicación puede leer lo que la aplicación lee.
  • El candado de capa es contra el error de dedo, no contra un adversario.
  • Los tokens de repositorio incrustados en el APK —el buzón compartido de datos de la marca— viajan dentro del paquete: son compartidos por todos los usuarios de la marca y la propia aplicación los señala como tales. No ponga ahí nada privado.
  • Un APK depurable permitiría adjuntar un depurador al proceso. Por eso lo que se entrega es la variante de publicación, no la de depuración.
Capítulo 24

Licencias por dentro

El registro de diagnóstico deja rastro de cada veredicto y de cada módulo instalado
El registro de diagnóstico deja rastro de cada veredicto y de cada módulo instalado.

Para quien administra la flota o integra el panel.

Cómo se valida

  • La aplicación envía el código de licencia y el identificador de equipo al endpoint /api/validar-licencia del panel de YieldRadar.
  • El servidor responde con un veredicto: si es válida, de qué tipo, cuándo expira y —lo importante— una firma ECDSA P-256 sobre esa respuesta.
  • El APK verifica la firma con la clave pública que lleva dentro. Una respuesta sin firma válida se rechaza, venga de donde venga.
  • El veredicto se guarda cifrado para poder abrir sin cobertura durante 30 días.

La presencia de la clave pública en el APK es el interruptor: con clave, se exige respuesta firmada; sin ella, se acepta sin firmar. Eso permitió desplegar el servidor primero y publicar el APK después sin dejar a nadie fuera.

Anti-fraude local

  • Una activación por licencia. El servidor vincula el equipo la primera vez; a partir de ahí, otro teléfono recibe otro_dispositivo.
  • Detección de reloj atrasado. Retrasar la fecha del teléfono no alarga la ventana sin conexión.
  • Reconexión obligatoria a los 30 días.

Operación

SituaciónQué hacer en el panel
El usuario cambió de teléfonoLiberar el equipo; la próxima activación lo vincula
Se pasó de APK de pruebas a comercialLiberar y reactivar una vez por equipo: el identificador cambia con la clave de firma
Teléfono perdidoLiberar; el equipo perdido deja de abrir a los 30 días como mucho
RenovaciónAmpliar la fecha; el equipo lo recoge en la siguiente comprobación
Custodia

La clave privada con la que el panel firma los veredictos y la clave de firma del APK son los dos secretos que no se pueden perder ni filtrar. Si se pierde la clave de firma del APK, esa marca no se puede volver a actualizar jamás: Android sólo acepta actualizar un paquete con la misma clave que lo firmó.

Capítulo 25

Plugins: qué son y cómo se usan

Un módulo instalado aparece en el menú lateral, junto a los del sistema
Un módulo instalado aparece en el menú lateral, junto a los del sistema.
AgriClima Pro corriendo dentro de la aplicación, con datos vivos
AgriClima Pro corriendo dentro de la aplicación, con datos vivos.

Un plugin es una aplicación web —HTML, CSS y JavaScript— que corre dentro de YieldRadar y habla con el proyecto a través de un puente controlado por permisos. Sirve para lo que el núcleo no hace: una calculadora de un gremio, un formulario de una norma, un informe propio de la empresa.

Instalar uno

Dos vías: el repositorio de la marca o un paquete que le enviaron
Dos vías: el repositorio de la marca o un paquete que le enviaron.
El explorador del sistema, para un
El explorador del sistema, para un .mtplug recibido por otro medio.
  • Menú lateral → Módulos → Instalar módulo
  • Elija el archivo .mtplug, o descárguelo del catálogo del repositorio configurado.
  • La aplicación verifica la firma y muestra qué permisos pide. Acepte o cancele.
  • El módulo aparece en Hub → Herramientas → Módulos y en el menú lateral.

Los tres niveles de confianza

Firma verificada, editor identificado, y la lista cerrada de servidores a los que podrá hablar
Firma verificada, editor identificado, y la lista cerrada de servidores a los que podrá hablar.
NivelQué significa¿Se ejecuta?
VerificadoCadena raíz → editor → paquete correcta, y todos los archivos íntegros
Sin firmarEl paquete no trae META/Sólo con el modo desarrollador activado
InválidoHay firma pero no valida, o algún archivo fue alteradoNunca

Permisos que puede pedir un plugin

PermisoLe permite
gnssLeer la posición actual y encender/apagar el GNSS
networkLlamar por HTTP a los dominios que declare, y sólo a esos
storage.readListar proyectos y capas, leer entidades y esquemas
storage.writeCrear capas y campos, insertar y modificar entidades
storage.deleteBorrar entidades
cameraTomar una foto y adjuntarla a una entidad
mapCentrar el mapa
licensePedir la identidad del equipo y un token firmado (para cobrar)
auditGenerar el informe de seguridad del núcleo

Cada método del puente exige el suyo. Sin declararlo en el manifiesto y sin que el usuario lo conceda, la llamada devuelve error. Un plugin del formato antiguo (v1, sin declaración) recibe sólo los permisos de lectura y escritura no destructiva: nunca borrado ni cámara.

Aislamiento entre plugins

Cada plugin corre en su propio origen web, así que su almacenamiento del navegador está separado del de los demás. Para lo sensible hay un almacén cifrado por plugin (secureGet / securePut) cuya clave vive en el Keystore y cuya identidad va atada al plugin: un valor guardado por el plugin A no se puede descifrar presentándolo como del plugin B.

Catálogo por repositorio

Compartir un .mtplug por mensajería no es fiable —WhatsApp y otros renombran o recomprimen los adjuntos que no reconocen—. Por eso los módulos se publican en un repositorio de GitHub con un catalog.json; el usuario elige de una lista y las actualizaciones llegan solas. La seguridad no depende del transporte: la firma cubre el hash de cada archivo, así que un repositorio comprometido no puede colar un plugin alterado, como mucho dejar de servirlo.

Capítulo 26

QuickStart: un plugin interno para su empresa

Objetivo: en una tarde, un módulo que sólo usará su cuadrilla. Ejemplo real: un control de visitas que registra el punto donde está el técnico, con el número de finca y el motivo, en una capa del proyecto abierto.

1 · La estructura mínima

ControlVisitas/
  manifest.json        ← identidad y permisos
  index.html           ← su interfaz
  app.js               ← su lógica
  geodata-sdk.js       ← el SDK (cópielo de plugins_seguros/sdk/)

2 · El manifiesto

manifest.json

{
  "manifest_version": 2,
  "plugin_id": "cr.miempresa.controlvisitas",
  "publisher_id": "miempresa",
  "title": "Control de visitas",
  "version": "1.0.0",
  "entryPoint": "index.html",
  "author": "Mi Empresa S.A.",
  "description": "Registra la visita del tecnico con finca y motivo.",
  "min_app_version": "7.21.15",
  "license_mode": "free",
  "permissions": ["gnss", "storage.read", "storage.write"],
  "network": { "allowedHosts": [] }
}
Pida sólo lo que use

plugin_id + publisher_id son la identidad real del módulo: el nombre de la carpeta y el título no identifican nada. Use un identificador con su dominio invertido para no chocar con nadie. Y no declare network si no llama a ningún servidor: el usuario ve la lista de permisos antes de aceptar, y una lista corta genera confianza.

3 · La interfaz

index.html

<!doctype html>
<html lang="es">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Control de visitas</title>
  <style>
    body { font: 16px/1.5 system-ui, sans-serif; margin: 0; padding: 16px; }
    label { display: block; margin: 14px 0 4px; font-weight: 600; }
    input, select, button { width: 100%; padding: 12px; font-size: 16px; }
    button { margin-top: 20px; background: #0B5C48; color: #fff; border: 0; border-radius: 6px; }
    #estado { margin-top: 14px; min-height: 24px; }
  </style>
</head>
<body>
  <h1>Control de visitas</h1>
  <label for="finca">Finca</label>
  <input id="finca" placeholder="F-104">
  <label for="motivo">Motivo</label>
  <select id="motivo">
    <option>Inspeccion</option>
    <option>Muestreo</option>
    <option>Entrega</option>
  </select>
  <button id="guardar">Registrar aqui</button>
  <p id="estado"></p>

  <script src="geodata-sdk.js"></script>
  <script src="app.js"></script>
</body>
</html>

4 · La lógica

app.js

const CAPA = "visitas";
const estado = document.getElementById("estado");
let PROYECTO = null;

// Al abrir: averiguar en que proyecto esta trabajando el usuario y asegurar la capa.
// Ojo: las llamadas de datos del SDK son SINCRONAS, no llevan await.
(function preparar() {
  try {
    const activo = GeoData.data.active();          // permiso: storage.read
    PROYECTO = activo && activo.project;
    if (!PROYECTO) { estado.textContent = "Abra un proyecto primero."; return; }

    if (!GeoData.data.layerExists(PROYECTO, CAPA)) {
      GeoData.data.createLayer(PROYECTO, CAPA, "POINT");        // permiso: storage.write
      GeoData.data.addAttribute(PROYECTO, CAPA, "finca",  "TEXT");
      GeoData.data.addAttribute(PROYECTO, CAPA, "motivo", "TEXT");
      estado.textContent = "Capa «visitas» creada.";
    }
  } catch (e) {
    estado.textContent = "No se pudo preparar la capa: " + e.message;
  }
})();

document.getElementById("guardar").addEventListener("click", () => {
  estado.textContent = "Tomando posicion...";
  try {
    const fix = GeoData.gnss.current();            // permiso: gnss  →  {lat, lon}
    if (!fix || (fix.lat === 0 && fix.lon === 0)) {
      estado.textContent = "Todavia sin posicion: salga a cielo abierto.";
      return;
    }
    GeoData.data.insert(PROYECTO, CAPA, "POINT", [fix.lon, fix.lat], {
      nombre: document.getElementById("finca").value || "sin finca",
      finca:  document.getElementById("finca").value,
      motivo: document.getElementById("motivo").value
    });
    estado.textContent = "Visita registrada.";
  } catch (e) {
    if (e.name === "PermissionError") {
      estado.textContent = "Falta el permiso " + e.permission;
    } else {
      estado.textContent = "Error: " + e.message;
    }
  }
});
Tres detalles que le ahorrarán una tarde

El orden de la coordenada es [lon, lat], no al revés: es el orden de GeoJSON y del GeoPackage, y equivocarlo le deja los puntos en el otro hemisferio. gnss.current() devuelve sólo {lat, lon} —si aún no hay fix devuelve ceros, que es el caso que hay que atrapar; la calidad del fix la vigila la aplicación con sus propias puertas, no el plugin. Y active() es la forma correcta de saber dónde escribir: listProjects() enumera los proyectos del equipo pero no dice cuál está abierto.

5 · Probarlo sin firmar

El modo desarrollador, apagado de fábrica: sin él no entra un módulo sin firmar
El modo desarrollador, apagado de fábrica: sin él no entra un módulo sin firmar.
  • Active Ajustes → Plugins → Modo desarrollador. Con él, la aplicación ejecuta módulos sin firma —y lo advierte en pantalla—.
  • Comprima la carpeta y renómbrela a ControlVisitas.mtplug.
  • Instálelo desde Módulos, ábralo y pruebe.
  • Para depurar, conecte el teléfono y abra chrome://inspect en el ordenador: el WebView del plugin aparece ahí con su consola completa.
Regla práctica

El puente es síncrono y devuelve cadenas JSON; el SDK lo envuelve en promesas y objetos, y convierte los errores de permiso en PermissionError. Escriba siempre contra el SDK: si mañana cambia el nombre del puente, su plugin no se entera.

6 · Repartirlo a la cuadrilla

Para uso interno hay dos vías. La rápida: pasar el .mtplug por USB o por correo (no por mensajería, que renombra los adjuntos). La ordenada: un repositorio de GitHub privado de la empresa con un catalog.json, configurado una vez en cada equipo desde Ajustes → Conexiones remotas → Repositorios de GitHub; a partir de ahí las actualizaciones se instalan desde la lista.

Antes de repartirlo, fírmelo: es el siguiente capítulo, y evita que sus técnicos tengan que dejar el modo desarrollador encendido.

Capítulo 27

Firmar y proteger el código

La cadena de confianza

clave raiz (fabricante)  --firma-->  certificado de editor
clave de editor          --firma-->  META/hashes.json del paquete
META/hashes.json         --cubre-->  SHA-256 de CADA archivo del plugin

Criptografía: ECDSA sobre la curva P-256 con SHA-256. Se eligió P-256 y no Ed25519 porque Android sólo trae Ed25519 nativo desde la versión 13 y la aplicación soporta desde la 7.0; además P-256 es la curva que admite el Keystore, que es lo que se usa para los tokens de licencia.

Qué hay dentro de un paquete firmado

ArchivoContenido
META/hashes.json{"alg":"SHA-256","files":{"index.html":"…", …}}
META/publisher.cert.jsonIdentidad del editor y su clave pública, firmadas por la raíz
META/signature.jsonFirma del editor sobre los bytes crudos de hashes.json

Los bytes que se firman están definidos literalmente, no como JSON canonicalizado, para que reimplementar el verificador en cualquier lenguaje sea inequívoco: el certificado firma la cadena publisher_id \n name \n pubkey \n issued \n expires, y el paquete firma los bytes exactos del archivo hashes.json tal y como quedan en disco.

Firmar, paso a paso

herramienta de referencia: mtsign.py

# Una sola vez, en un equipo controlado: la clave raiz (la guarda el fabricante)
python mtsign.py root-init

# Una vez por editor: el fabricante emite su certificado
python mtsign.py publisher-new --id miempresa --name "Mi Empresa S.A." --years 3

# Cada vez que publique una version del plugin
python mtsign.py pack ControlVisitas --publisher publishers/miempresa \
                     -o ControlVisitas-1.0.0.mtplug

# Comprobar antes de repartir
python mtsign.py verify ControlVisitas-1.0.0.mtplug
Rotación

Para sustituir la raíz: genere una nueva, actualice la constante del binario, reemita los certificados de editor y deje la clave antigua aceptada durante una versión, para no invalidar de golpe lo ya distribuido. Un OEM puede además añadir su propia autoridad dejando claves públicas en los assets de su sabor — como viajan dentro del APK firmado, añadir una raíz exige recompilar la aplicación.

Qué protege la firma… y qué no

Amenaza¿Cubierta?
Alguien modifica un archivo del paqueteSí: el hash no cuadra y no se ejecuta
Alguien sustituye el plugin en el repositorioSí: no puede firmar como su editor
Alguien publica un plugin haciéndose pasar por ustedSí: su publisher_id exige el certificado
El usuario lee su código JavaScriptNo. El paquete está en su teléfono
El usuario parchea su código y lo reempaquetaQuedaría sin firmar: sólo corre con modo desarrollador

Proteger de verdad su propiedad intelectual

La firma garantiza integridad y origen, no confidencialidad. Si su valor está en el algoritmo, aplique estas tres, por orden de eficacia:

  1. Lo que vale, en el servidor. El plugin es la interfaz; el cálculo caro vive en su API. Es la única protección que no se puede revertir en el teléfono.
  2. Minifique y ofusque lo que sí baja (esbuild, terser). Sube el coste de leerlo; no lo impide.
  3. Nunca incruste secretos en el paquete. Ni claves de API, ni contraseñas: lo que va dentro del .mtplug es público de facto. Para lo que deba persistir en el equipo use el almacén cifrado del puente (securePut), no localStorage.
Capítulo 28

Monetizar un plugin

El problema a resolver: su servidor de licencias no puede distinguir una petición hecha por su plugin, dentro de la aplicación de verdad, de un curl que imita la llamada. La attestation lo resuelve.

Cómo funciona

  • Su plugin pide un nonce a su servidor.
  • Llama a GeoData.license.attest(nonce): la aplicación firma ese nonce con una clave privada que vive en el Android Keystore del equipo y que no es extraíble.
  • Su servidor verifica la firma y decide si ese dispositivo tiene licencia.
  • Guarde la respuesta cifrada con GeoData.secure.set para trabajar sin cobertura un tiempo.

puerta de licencia, esquema

// El SDK ya encadena las cuatro fases: nonce → firma → canje → guardado cifrado.
// Su servidor sólo tiene que ofrecer GET /nonce y POST /verify.
const API = "https://licencias.miempresa.com/api/v1/controlvisitas";

async function comprobarLicencia() {
  try {
    const r = await GeoData.license.verify(API, { graceDays: 30 });
    if (r.valid && r.offline) {
      estado.textContent = "Licencia validada sin cobertura, con la copia guardada.";
    }
    return r.valid;
  } catch (e) {
    return false;
  }
}

Si necesita el control fino —porque su protocolo no es ese— las tres piezas están sueltas:

const info  = GeoData.license.info();              // sin permiso: quien soy y en que marca corro
const nonce = await (await fetch(API + "/nonce")).json();

// Requiere el permiso `license` declarado en el manifiesto
const token = GeoData.license.attest(nonce.nonce); // {alg, payload_b64, sig_b64, device_key_b64, key_chain_b64}

const r = await fetch(API + "/verify", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ nonce: nonce.nonce, attestation: token,
                         plugin: info.plugin_id, version: info.version })
});
const veredicto = await r.json();

if (veredicto.valid) {
  GeoData.secure.set("licencia", JSON.stringify({
    hasta: veredicto.claims && veredicto.claims.expira, guardado: Date.now()
  }));
}
return veredicto.valid;
El nonce lo emite su servidor, siempre

Sin un nonce fresco por cada comprobación, un token capturado una vez sirve para siempre y la attestation deja de probar nada. license.attest() es síncrona y lanza PermissionError si no declaró license en el manifiesto; license.verify() sí devuelve una promesa, porque habla con la red.

Qué recibe usted del dispositivo

DatoQué es
device_aliasAlias derivado por HMAC, distinto para cada par editor+plugin
Firma del nonceHecha con clave de hardware no extraíble
plugin_id, publisher_id, versiónQué se está ejecutando
Marca y versión de la appPara exigir un mínimo

Usted puede atar una licencia a un dispositivo, pero no obtiene el identificador real del equipo ni puede correlacionar al mismo usuario entre plugins de editores distintos. Es deliberado: la privacidad del usuario final no es negociable a cambio de su modelo de negocio.

La regla de oro

Lo que se paga debe estar en el servidor, no en el plugin. El archivo de la puerta de licencia se ejecuta en el teléfono del cliente y es legible: alguien con conocimientos puede parchear la comprobación. Reparta su producto como lo hace AgriClima: el pronóstico básico funciona sin licencia, y lo que de verdad se cobra —el pronóstico estacional calibrado— lo calcula el servidor y sólo se sirve con un token válido. Parchear el JavaScript no da acceso a eso.

Lista de comprobación antes de vender

PuntoPor qué
"license_mode": "licensed" en el manifiestoLa aplicación lo presenta como módulo de pago
Permiso license declaradoSin él, requestAttestation devuelve error
allowedHosts con su APISin declararla, la llamada de red se bloquea
Nonce de un solo uso y con caducidadUn token capturado no debe valer dos veces
Periodo de gracia sin coberturaEl campo no siempre tiene señal; 30 días es lo razonable
Qué pasa al vencerDegradar a la versión gratuita, nunca perder los datos del usuario
Paquete firmadoSus clientes no deberían necesitar el modo desarrollador
Versionado y catálogoPublicar correcciones sin volver a repartir archivos a mano
Apéndice A

API del puente

Los 33 métodos del puente nativo y el permiso que exige cada uno. Esta tabla es la del puente crudo; lo que usted escribe es el SDK, que los agrupa por familias con nombres más cortos: GeoData.data.*, GeoData.gnss.*, GeoData.map.*, GeoData.license.* y GeoData.secure.*.

Casi ninguna devuelve una promesa

El puente es síncrono: devuelve una cadena JSON en el acto y el SDK la convierte en objeto. Poner await delante no rompe nada, pero delata que se copió sin entender. Las únicas asíncronas de verdad son las que salen a la red o abren una pantalla: httpGet, httpPost, httpRequest, data.attachPhoto y license.verify. Cuando el usuario deniega un permiso la llamada lanza PermissionError con el permiso que falta en e.permission: no devuelve un JSON raro que nadie comprueba.

MétodoPermisoDevuelve
getAppName()Nombre de la marca
getLocation()gnss{lat, lon}, ceros si aún no hay fix
getGnssLocation()gnssAlias del anterior
setGnss(bool)gnssEnciende o apaga el GNSS
getGnssPointFields()Los campos de trazabilidad disponibles
httpGet(url)networkCuerpo de la respuesta
httpRequest(m,url,h,b)networkRespuesta completa
listProjects()storage.readProyectos del equipo (no dice cuál está abierto)
listLayers(p)storage.readCapas con tipo y conteo
getActiveLayers()storage.readLas capas en edición
readFeatures(p,c,n)storage.readEntidades con sus atributos
getLayerSchema(p,c)storage.readCampos y tipos
geoPackageExists(p)storage.readBooleano
layerExists(p,c)storage.readBooleano
listAttributeTypes()Tipos de campo admitidos
createGeoPackage(n)storage.writeCrea un proyecto
createLayer(p,c,tipo)storage.writeCrea una capa
addAttribute(...)storage.writeAñade un campo
insertFeature(...)storage.writeInserta una entidad
updateFeatureAttributes(...)storage.writeModifica atributos
updateFeatureGeometry(...)storage.writeModifica la geometría
deleteFeature(p,c,fid)storage.deleteBorra una entidad
takePhotoAndAttach(...)cameraFoto adjunta a la entidad
centerMapAt(lat,lon,z)mapCentra el mapa
getSecurityAudit()auditInforme de seguridad
getIdentity()licenseAlias del equipo para este plugin
requestAttestation(nonce)licenseToken firmado por el equipo
getTrust()Nivel de confianza del propio plugin
getPluginInfo()Identidad, versión, marca y versión de la app
securePut(n,v)Guarda cifrado y aislado
secureGet(n)Lee del almacén cifrado
secureRemove(n)Borra del almacén cifrado
closePlugin()Cierra el módulo

Todas las operaciones de escritura respetan el candado de capa: sobre una capa bloqueada devuelven error, igual que le ocurriría al usuario desde la interfaz.

Apéndice B

Si algo va mal

Menú › Registro (diagnóstico): lo primero que hay que mirar, y se copia de un toque
Menú › Registro (diagnóstico): lo primero que hay que mirar, y se copia de un toque.
SíntomaCausa probableSolución
«No viene de satélites»El teléfono entrega posición de red, sin satélites en el cálculoSalga a cielo abierto y espere el fix. Es una protección, no un fallo
Precisión de ±200 m bajo techoLo mismo: no hay señal de satélite dentro de un edificioNormal; en campo baja a metros o centímetros
El receptor externo no apareceSin emparejar en Android, o permiso de Bluetooth denegadoEmparéjelo en Android y revise permisos
El RTK no fijaCorrecciones viejas o mountpoint equivocadoMire la edad de correcciones en el cintillo; reconecte el NTRIP
La ruta sin conexión no apareceNo hay red vial descargadaLa propia opción lleva a descargar el área
«Sin vías» al descargarEl servidor de datos viales estaba saturadoReintente; las teselas ya descargadas se conservan
La simbología no cambia nadaLa pantalla se abrió sin proyectoÁbrala desde el hub con un proyecto activo
Una capa se abre vacíaGeometría no reconocida en versiones antiguasActualice: desde 7.21.17 se leen las colecciones
El módulo dice «sin firmar»Paquete sin META/Fírmelo, o active el modo desarrollador para probar
El módulo no se ejecuta («inválido»)Un archivo cambió después de firmarVuelva a empaquetar y firmar
«Otro dispositivo» al activarLa licencia está vinculada a otro equipoLibérela en el panel
Pide activar tras meses funcionandoSe cumplieron los 30 días sin conexiónConéctese un momento

Para cualquier cosa que no esté aquí: Menú lateral → Registro de diagnóstico guarda lo que hizo la aplicación por dentro y se comparte desde ahí mismo. Con la grabación de pantalla adjunta, un problema de campo se diagnostica sin viajar.

Apéndice C

Glosario

TérminoQué es
GeoPackage (.gpkg)Formato abierto de la OGC: un archivo SQLite con capas, geometrías y atributos
FixPosición calculada por el receptor, con su calidad asociada
RTK fijo / flotanteSolución centimétrica con ambigüedades resueltas (fijo) o no (flotante)
NTRIPProtocolo para recibir correcciones de una red de estaciones por internet
MountpointEl flujo concreto de correcciones dentro de un caster NTRIP
PDOPEfecto de la geometría de los satélites en la precisión: cuanto más bajo, mejor
PPKPostproceso: se graba en crudo y se corrige después en gabinete
EPSGCódigo de un sistema de coordenadas. CRTM05 es el 8908
Cota ortométricaAltura sobre el geoide (el «nivel del mar»), no sobre el elipsoide
ΔN / ΔEMetros que faltan hacia el norte y hacia el este para llegar al punto
ToleranciaDistancia a la que un punto replanteado se da por clavado
MBTilesUn archivo con teselas de mapa dentro, para usar sin conexión
AttestationToken firmado por el equipo que prueba a un servidor que habla con una instalación genuina
.mtplugPaquete de un módulo: sus archivos web más la carpeta META/ de firma