Proyecto Final – Especialidad de Programación
Desarrollo de una Geoapp móvil basada en Web
1. Objetivo del proyecto
El objetivo del proyecto es diseñar e implementar una aplicación web geoespacial (Geoapp) capaz de visualizar información geográfica en un mapa interactivo y permitir la generación de contenido georreferenciado por parte de los usuarios.
La aplicación deberá desarrollarse como web-app utilizando tecnologías web y posteriormente empaquetarse como aplicación móvil Android mediante Apache Cordova.
La temática de la aplicación es libre. Algunos ejemplos posibles:
-
reporte de incidencias urbanas
-
inventario colaborativo de elementos (árboles, fuentes, arte urbano, etc.)
-
registro de rutas o puntos de interés
-
observaciones ambientales o científicas
-
turismo colaborativo
El proyecto debe simular un caso real de desarrollo de una geoapp, integrando conocimientos de:
-
programación web
-
desarrollo de aplicaciones geoespaciales
-
gestión de datos geográficos
-
desarrollo de aplicaciones móviles híbridas
2. Alcance del proyecto
La aplicación deberá permitir:
- visualizar datos geográficos en un mapa interactivo
- consultar información asociada a los elementos
- crear nuevos puntos georreferenciados desde el dispositivo móvil
- almacenar la información generada por los usuarios
- ejecutarse como aplicación móvil Android
3. Requerimientos funcionales
La aplicación deberá implementar como mínimo las siguientes funcionalidades.
3.1 Visualización cartográfica
La aplicación debe:
- Mostrar un mapa interactivo.
- Permitir al usuario realizar:
- Zoom in
- Zoom out
- Desplazamiento (pan)
- Permitir cambiar el mapa base (basemap).
3.2 Visualización de datos geográficos
La aplicación deberá:
- Cargar capas geográficas en formato GeoJSON.
- Visualizar dichas capas sobre el mapa.
- Permitir interactuar con los elementos del mapa.
- Mostrar información asociada mediante popups o paneles informativos.
3.3 Búsqueda y filtrado
La aplicación deberá permitir:
- Buscar direcciones o lugares mediante una barra de búsqueda.
- Filtrar elementos del mapa mediante controles interactivos (botones, categorías, etc.).
3.4 Geolocalización del usuario
La aplicación deberá:
- Activar la localización del dispositivo mediante GPS.
- Mostrar la posición actual del usuario en el mapa.
3.5 Generación de información por los usuarios
La aplicación deberá permitir al usuario crear nuevos registros geográficos.
Para ello deberá:
- Obtener la posición del dispositivo.
- Crear un nuevo punto georreferenciado.
- Completar un formulario con información asociada.
El formulario deberá incluir al menos:
- Título o nombre.
- Descripción textual.
- Categoría o tipo.
- Fecha o información adicional.
- Una fotografía tomada con la cámara del dispositivo.
3.6 Envío de datos al servidor
La aplicación deberá:
- Enviar la información generada por el usuario a un servidor.
- Almacenar los datos en una base de datos.
3.7 Visualización de los datos generados
Los registros creados por los usuarios deberán poder visualizarse:
- En el mapa.
- En formato lista.
Cada registro deberá mostrar:
- Sus atributos.
- La fotografía asociada.
4. Requerimientos no funcionales
4.1 Plataforma
La aplicación deberá ejecutarse en dispositivos Android.
El resultado final deberá generarse como una aplicación instalable (APK).
4.2 Tecnologías
La aplicación deberá desarrollarse como web-app utilizando tecnologías web abiertas, incluyendo como mínimo:
- HTML
- CSS
- JavaScript
Para el desarrollo del backend o servicios del servidor, los estudiantes podrán utilizar cualquiera de las siguientes tecnologías:
- PHP
- Node.js
- Python
También podrán utilizar frameworks asociados a estas tecnologías (por ejemplo Express, Flask, Django, etc.).
4.3 Framework móvil
La aplicación deberá empaquetarse como aplicación móvil utilizando:
- Apache Cordova
Cordova permitirá convertir la aplicación web en una aplicación móvil nativa generando un archivo:
- APK instalable en dispositivos Android
4.4 Datos geográficos
La aplicación deberá trabajar con datos geoespaciales en formato estándar.
Los datos podrán provenir de:
- Archivos GeoJSON almacenados localmente en el dispositivo, o
- Servicios o APIs web que proporcionen datos geográficos dinámicamente
Por ejemplo:
- Capas estáticas cargadas desde archivos GeoJSON incluidos en la aplicación
- Capas dinámicas obtenidas mediante llamadas a una API que consulte una base de datos
Un caso típico será la capa de puntos generados por los usuarios, que podrá cargarse mediante una API que recupere los datos almacenados en el servidor.
4.5 Base de datos
La información generada por los usuarios deberá almacenarse en una base de datos en el servidor.
Los estudiantes podrán utilizar el sistema de base de datos que consideren más adecuado, por ejemplo:
- MySQL / MariaDB
- PostgreSQL / PostGIS
- SQLite
- Otros sistemas equivalentes
En caso de trabajar con datos geográficos avanzados, se recomienda el uso de PostgreSQL con PostGIS.
4.6 Funcionamiento
La aplicación deberá:
- Ejecutarse directamente en el dispositivo móvil
- Poder instalarse sin necesidad de software adicional
- Utilizar conexiones a servicios web únicamente cuando sea necesario para obtener o enviar información
5. Arquitectura mínima recomendada
Aunque la implementación técnica es libre, se recomienda estructurar el proyecto siguiendo una arquitectura cliente-servidor, separando claramente la interfaz de usuario, la lógica de aplicación y el acceso a los datos.
Una arquitectura típica del proyecto podría organizarse de la siguiente manera:
flowchart TD
%% Nodos con iconos y estilo
A["📱 Aplicación móvil<br>(Cordova)"]:::mobile
B["💻 Frontend web<br>(HTML, CSS, JS)<br>Mapa interactivo + UI"]:::frontend
C["🖥️ API / Backend<br>(PHP, Node.js o Python)"]:::backend
D["🗄️ Base de datos<br>(MySQL, PostgreSQL/PostGIS u otra)"]:::database
%% Conexiones
A --> B
B --> C
C --> D
%% Estilos personalizados
classDef mobile fill:#f9c74f,stroke:#f9844a,stroke-width:2px,color:#000;
classDef frontend fill:#90be6d,stroke:#43aa8b,stroke-width:2px,color:#000;
classDef backend fill:#f8961e,stroke:#f3722c,stroke-width:2px,color:#000;
classDef database fill:#94c2ec,stroke:#4d5061,stroke-width:2px,color:#fff;
5.1 Aplicación móvil
La aplicación móvil se generará utilizando Apache Cordova, que permitirá empaquetar la aplicación web como una aplicación Android instalable.
La app deberá:
- Acceder a funcionalidades del dispositivo (GPS, cámara)
- Mostrar la interfaz de la aplicación
- Comunicarse con el servidor para enviar y obtener información
5.2 Frontend de la aplicación
El frontend será la interfaz principal con el usuario y deberá desarrollarse utilizando tecnologías web.
Entre sus responsabilidades estarán:
- Visualización del mapa interactivo
- Gestión de la interacción del usuario
- Captura de la posición GPS
- Captura de fotografías mediante la cámara
- Envío de información al servidor
- Carga y visualización de capas geográficas
Se recomienda utilizar librerías de mapas web, por ejemplo:
- Leaflet
- MapLibre GL JS
- OpenLayers
5.3 Backend / API
El backend será responsable de gestionar la comunicación entre la aplicación y la base de datos.
Entre sus funciones estarán:
- Recibir las incidencias enviadas por los usuarios
- Almacenar la información en la base de datos
- Servir datos geográficos a la aplicación
- Proporcionar endpoints para consulta de datos
El backend podrá desarrollarse utilizando:
- PHP
- Node.js
- Python
Se recomienda implementar una API REST para facilitar la comunicación entre la aplicación y el servidor.
5.4 Base de datos
La base de datos almacenará:
- Los registros creados por los usuarios
- La información asociada (atributos)
- Las referencias a las imágenes capturadas
Dependiendo del sistema elegido, también podrá almacenar geometrías geográficas.
Opciones habituales:
- MySQL / MariaDB
- PostgreSQL
- PostgreSQL + PostGIS
5.5 Flujo básico de funcionamiento
Un flujo típico de uso de la aplicación podría ser el siguiente:
- El usuario abre la aplicación móvil.
- La aplicación muestra el mapa con las capas disponibles.
- El usuario activa su localización mediante GPS.
- El usuario crea una nueva incidencia o registro.
- La aplicación obtiene:
- La posición GPS
- Los datos del formulario
- Una fotografía tomada con la cámara
- La aplicación envía la información al backend mediante una API.
- El servidor almacena los datos en la base de datos.
- La aplicación consulta la API para cargar y mostrar las incidencias en el mapa.
6. Generación de una capa de análisis espacial mediante Python y QGIS
La aplicación deberá incluir una capa temática derivada de un análisis espacial, generada mediante un script desarrollado en Python utilizando las capacidades de análisis geoespacial de QGIS.
El objetivo de esta capa es representar la densidad de elementos puntuales mediante una cuadrícula regular con simbología coroplética.
6.1 Datos de entrada
El script deberá leer una capa de puntos georreferenciados que represente elementos del territorio (por ejemplo, árboles, farolas, sensores, etc.).
El formato de entrada podrá ser cualquier formato geoespacial compatible con QGIS, por ejemplo:
- Shapefile
- GeoPackage
- GeoJSON
- Otros formatos soportados por QGIS
6.2 Generación de la cuadrícula
A partir de la capa de puntos, el script deberá:
- Generar una cuadrícula regular (grid) que cubra el área de estudio
- Cada celda de la cuadrícula será un polígono
- El tamaño de celda será definido por los estudiantes (por ejemplo 100 m, 250 m, 500 m, etc.)
6.3 Cálculo del número de elementos
Para cada celda de la cuadrícula, el script deberá calcular:
- El número de puntos contenidos dentro de cada celda
Este valor deberá almacenarse como atributo de cada polígono de la cuadrícula.
Ejemplo:
count = número de elementos dentro de la celda
6.4 Clasificación de valores
Los valores obtenidos deberán clasificarse en clases estadísticas para permitir su representación cartográfica.
Se podrá utilizar cualquier método de clasificación, por ejemplo:
- Intervalos iguales
- Cuantiles (cuartiles, quintiles, etc.)
- Natural breaks (Jenks)
- Clasificación personalizada
6.5 Asignación de colores
Cada celda deberá tener asociado un color que represente su clase de valor.
- El color deberá almacenarse como atributo en el archivo de salida
- Los colores deberán seguir una paleta coherente para mapas coropléticos, por
ejemplo:
- Gradiente claro → oscuro
- Escala secuencial
6.6 Archivo de salida
El resultado del proceso deberá ser un archivo GeoJSON que contenga:
- La geometría de la cuadrícula
- El número de elementos por celda
- La clase asignada
- El color asociado
Ejemplo de atributos:
count : 12
class : 3
color : "#fdae61"
Este archivo GeoJSON será posteriormente cargado en la aplicación web para visualizar el mapa coroplético.
6.7 Uso de Python y QGIS
El script deberá desarrollarse en Python utilizando el entorno de QGIS.
Los estudiantes podrán utilizar:
- La API de Python de QGIS (PyQGIS)
- Las herramientas de análisis espacial del Processing Toolbox
Esto permite utilizar directamente funciones de análisis espacial como:
- Generación de cuadrículas
- Conteo de puntos en polígonos
- Intersecciones espaciales
- Cálculo de estadísticas espaciales
7. Arquitectura técnica del sistema
La aplicación deberá seguir una arquitectura cliente–servidor, donde la aplicación móvil actúa como cliente que consume servicios proporcionados por un backend.
El siguiente diagrama muestra la arquitectura general del sistema:
flowchart TD
%% Nodos con iconos y estilo
A["📱 DISPOSITIVO MÓVIL<br>Aplicación Cordova (APK Android)<br>• HTML / CSS / JS<br>• Leaflet / MapLibre<br>• Acceso a GPS<br>• Acceso a cámara"]:::mobile
B["🖥️ BACKEND<br>API REST<br>Node.js / Python / PHP<br>• recibir incidencias<br>• almacenar registros<br>• servir datos geográficos<br>• servir imágenes"]:::backend
C["🗄️ BASE DE DATOS<br>PostgreSQL / MySQL / otra<br>• incidencias<br>• usuarios (opcional)<br>• categorías (opcional)"]:::database
%% Conexiones
A -->|HTTP / API REST| B
B -->|consultas| C
%% Estilos personalizados
classDef mobile fill:#f9c74f,stroke:#f9844a,stroke-width:2px,color:#000,font-size:12px;
classDef backend fill:#f8961e,stroke:#f3722c,stroke-width:2px,color:#000,font-size:12px;
classDef database fill:#94c2ec,stroke:#4d5061,stroke-width:2px,color:#fff,font-size:12px;
8. Modelo mínimo de datos recomendado
Para almacenar las incidencias generadas por los usuarios se recomienda definir
al menos una tabla principal de incidencias.
Cada incidencia representará un punto georreferenciado creado por el usuario.
8.1 Tabla: incidencias
| Campo | Tipo | Descripción |
|---|---|---|
| id | integer | identificador único |
| titulo | text | título de la incidencia |
| descripcion | text | descripción |
| categoria | text | tipo de incidencia |
| latitud | float | coordenada latitude |
| longitud | float | coordenada longitude |
| foto | text | ruta o nombre del archivo de imagen |
| fecha | datetime | fecha de creación |
8.2 Alternativa con base de datos espacial (PostGIS)
Si se utiliza PostgreSQL + PostGIS, en lugar de almacenar latitud y longitud por separado se puede usar un campo geométrico.
| Campo | Tipo |
|---|---|
| id | serial |
| titulo | text |
| descripcion | text |
| categoria | text |
| geom | geometry(Point,4326) |
| foto | text |
| fecha | timestamp |
8.3 Relación con la aplicación
El flujo de datos será el siguiente:
- El usuario crea una incidencia en la aplicación móvil.
- La app obtiene:
- Posición GPS
- Texto del formulario
- Fotografía
- La app envía la información a la API del servidor.
- La API guarda los datos en la base de datos.
- La aplicación consulta la API para obtener las incidencias y mostrarlas en el mapa.