Servicio Centralizado de Geolocalización Gubernamental
Sistema de información geográfica (GIS) construido con Laravel 12, PostgreSQL/PostGIS y Docker, diseñado para gestionar datos de geolocalización a nivel gubernamental.
- Características
- Stack Tecnológico
- Requisitos Previos
- Instalación
- Configuración
- Uso
- Estructura del Proyecto
- API
- Desarrollo
- Licencia
- 🗺️ Gestión de Datos Geoespaciales: Soporte completo para geometrías PostGIS (puntos, líneas, polígonos)
- 🔐 Autenticación Robusta: Laravel Jetstream con Livewire, autenticación de dos factores
- 🚀 API RESTful: Laravel Sanctum para autenticación de API y tokens personales
- 🐳 Infraestructura Dockerizada: Entorno de desarrollo completamente containerizado
- 📊 Base de Datos Espacial: PostgreSQL 16 con PostGIS 3.4
- 🛠️ Herramientas GIS: Integración con clickbar/laravel-magellan para manejo de geometrías
- Framework: Laravel 12.48.1 (PHP 8.5)
- Base de Datos: PostgreSQL 16.4
- Extensión GIS: PostGIS 3.4 (GEOS, PROJ, STATS)
- Autenticación: Laravel Jetstream 5.4.0 + Sanctum 4.2.4
- GIS Library: clickbar/laravel-magellan 2.0.1
- Stack: Livewire 3.7.6
- Build Tool: Vite 7.3.1
- CSS Framework: Tailwind CSS (incluido con Jetstream)
- Containerización: Docker + Docker Compose
- Servidor Web: Laravel Sail (Nginx + PHP-FPM)
- Imagen Base:
postgis/postgis:16-3.4-alpine
Antes de comenzar, asegúrate de tener instalado:
- Docker Desktop (Windows/Mac) o Docker Engine (Linux)
- Git (para clonar el repositorio)
- Composer (opcional, para desarrollo local sin Docker)
docker --version
# Docker version 28.4.0 o superior
docker compose version
# Docker Compose version v2.x.x o superiorgit clone <repository-url> GeoOaxacaHub
cd GeoOaxacaHubCopia el archivo de ejemplo y ajusta las configuraciones:
cp .env.example .envEdita .env y actualiza las siguientes variables:
APP_NAME=GeoOaxacaHub
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=geooaxacahub
DB_USERNAME=sail
DB_PASSWORD=passwordEn Windows, ejecuta desde PowerShell:
Start-Process "C:\Program Files\Docker\Docker\Docker Desktop.exe"O inicia Docker Desktop manualmente desde el menú de inicio.
docker compose up -dEste comando:
- Descarga las imágenes necesarias (primera vez)
- Crea los contenedores para Laravel y PostgreSQL/PostGIS
- Inicia los servicios en segundo plano
Si clonaste el repositorio sin vendor/:
docker compose exec laravel.test composer install
docker compose exec laravel.test npm installdocker compose exec laravel.test php artisan key:generatedocker compose exec laravel.test php artisan migrateEsto creará todas las tablas necesarias y habilitará la extensión PostGIS.
Ejecuta el seeder para crear el usuario administrador predeterminado:
docker compose exec laravel.test php artisan db:seed --class=AdminUserSeederCredenciales de acceso:
- Email:
geoadmin@gmail.com - Password:
Geo#Admin
⚠️ Importante: Cambia estas credenciales en producción por seguridad.
docker compose exec laravel.test npm run buildPara desarrollo con hot-reload:
docker compose exec laravel.test npm run devUna vez que los contenedores estén corriendo:
- Aplicación Web: http://localhost
- Base de Datos:
localhost:5432- Usuario:
sail - Contraseña:
password - Base de datos:
geooaxacahub(o según.env)
- Usuario:
El proyecto incluye un usuario administrador predeterminado creado mediante seeder:
Credenciales:
- Email:
geoadmin@gmail.com - Password:
Geo#Admin
Para acceder:
- Navega a http://localhost/login
- Ingresa las credenciales anteriores
- Accederás al dashboard de administración
💡 Tip: Puedes crear usuarios adicionales desde la interfaz de registro o mediante Tinker:
docker compose exec laravel.test php artisan tinker$user = App\Models\User::create([
'name' => 'Nuevo Usuario',
'email' => 'usuario@ejemplo.com',
'password' => bcrypt('password'),
'email_verified_at' => now(),
]);Conecta a la base de datos y verifica la extensión:
docker compose exec pgsql psql -U sail -d geooaxacahub -c "SELECT PostGIS_Version();"Salida esperada:
postgis_version
---------------------------------------
3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
Ejecuta comandos de Laravel dentro del contenedor:
# Sintaxis general
docker compose exec laravel.test php artisan [comando]
# Ejemplos
docker compose exec laravel.test php artisan route:list
docker compose exec laravel.test php artisan db:show
docker compose exec laravel.test php artisan make:model Location -m# Conectar a PostgreSQL
docker compose exec pgsql psql -U sail -d geooaxacahub
# Listar tablas
\dt
# Ver extensiones instaladas
\dx
# Salir
\q# Ver logs de Laravel
docker compose exec laravel.test php artisan pail
# Ver logs de Docker
docker compose logs -f laravel.test
docker compose logs -f pgsqlGeoOaxacaHub/
├── app/
│ ├── Http/
│ │ └── Controllers/ # Controladores de la aplicación
│ ├── Models/ # Modelos Eloquent (con soporte PostGIS)
│ └── ...
├── database/
│ ├── migrations/ # Migraciones (incluye PostGIS)
│ │ └── 2026_01_23_230427_enable_postgis_extension.php
│ └── seeders/
├── resources/
│ ├── views/ # Vistas Blade/Livewire
│ └── js/ # Assets JavaScript
├── routes/
│ ├── web.php # Rutas web
│ └── api.php # Rutas API (Sanctum)
├── compose.yaml # Configuración Docker (PostGIS)
├── .env # Variables de entorno
└── README.md
GeoOaxacaHub usa Laravel Sanctum para autenticación de API.
docker compose exec laravel.test php artisan tinker$user = App\Models\User::find(1);
$token = $user->createToken('api-token')->plainTextToken;
echo $token;curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost/api/user| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/user |
Obtener usuario autenticado |
| POST | /api/locations |
Crear nueva ubicación (ejemplo) |
| GET | /api/locations |
Listar ubicaciones |
Ejemplo de modelo con columna geométrica:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Clickbar\Magellan\Database\Eloquent\HasPostgisColumns;
class Location extends Model
{
use HasPostgisColumns;
protected $fillable = ['name', 'coordinates'];
protected array $postgisColumns = [
'coordinates' => [
'type' => 'geometry',
'srid' => 4326, // WGS 84
],
];
}Schema::create('locations', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->geometry('coordinates', 'POINT', 4326);
$table->timestamps();
});use Clickbar\Magellan\Data\Geometries\Point;
// Crear ubicación
$location = Location::create([
'name' => 'Palacio de Gobierno',
'coordinates' => new Point(17.0654, -96.7236, 4326),
]);
// Consultar por proximidad (ejemplo)
$nearby = Location::query()
->whereRaw('ST_DWithin(coordinates, ST_MakePoint(?, ?), ?)',
[-96.7236, 17.0654, 1000])
->get();# Detener contenedores (mantiene datos)
docker compose stop
# Detener y eliminar contenedores (mantiene volúmenes)
docker compose down
# Eliminar todo (incluyendo volúmenes de base de datos)
docker compose down -vdocker compose exec laravel.test php artisan testEste proyecto está licenciado bajo la MIT License.
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Para reportar problemas o solicitar características, por favor abre un issue.
Desarrollado con ❤️ para el Gobierno de Oaxaca