Geolocalización y mapas en PHP: revisión de bibliotecas y herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Geolocalización y mapas en PHP: revisión de herramientas y bibliotecas

Trabajar con datos geográficos es una de las tareas clave de las aplicaciones web modernas. En PHP, a pesar de la falta de soporte integrado para cartografía, existen numerosas bibliotecas potentes para procesar datos geoespaciales, geocodificación, trabajar con coordenadas e integrarse con servicios cartográficos. En este artículo, revisaremos las herramientas más populares para trabajar con geolocalización y mapas en PHP.



1. Bibliotecas para trabajar con datos geográficos



geoPHP (phayes/geoPHP)

geoPHP es una biblioteca para trabajar con objetos geométricos (puntos, líneas, polígonos) en formatos WKT, WKB, GeoJSON, KML, GPX. Implementa los estándares del Open Geospatial Consortium (OGC).

Características principales:

  • Creación y manipulación de objetos geométricos
  • Conversión entre formatos (WKT ↔ GeoJSON ↔ KML)
  • Cálculo de distancias, áreas, intersecciones
  • Verificación de pertenencia de un punto a un polígono (point-in-polygon)

Ejemplo de código:

use geoPHP\\geoPHP;

// Crear un punto$point = geoPHP::load('POINT(30.5234 50.4501)', 'wkt');echo $point->out('json'); // {"type":"Point","coordinates":[30.5234,50.4501]}

// Crear un polígono y verificar si el punto está dentro$polygon = geoPHP::load('POLYGON((30 50, 31 50, 31 51, 30 51, 30 50))', 'wkt');echo $point->intersects($polygon) ? 'Punto dentro' : 'Punto fuera';

// Calcular la distancia entre dos puntos (en metros)$point2 = geoPHP::load('POINT(30.7 50.5)', 'wkt');$distance = $point->distance($point2);echo "Distancia: " . $distance . " metros";


PHPGeo (mjaschen/phpgeo)

PHPGeo es una biblioteca moderna para trabajar con coordenadas, distancias, rutas y geo-cercas. Soporta diferentes modelos de la Tierra (esfera, elipsoide).

Características:

  • Cálculo de distancias mediante las fórmulas de Vincenty, Haversine, Great Circle
  • Trabajo con coordenadas (latitud/longitud) y direcciones
  • Creación y verificación de geo-cercas (geofencing)
  • Soporte para diferentes unidades de medida (km, millas, millas náuticas)

Ejemplo de código:

use Location\\Coordinate;use Location\\Distance\\Vincenty;use Location\\Formatter\\Coordinate\\DecimalDegrees;

$coord1 = new Coordinate(50.4501, 30.5234); // Kiev$coord2 = new Coordinate(55.7558, 37.6173); // Moscú

$calculator = new Vincenty();$distance = $calculator->getDistance($coord1, $coord2);

echo "Distancia entre Kiev y Moscú: " . round($distance / 1000, 1) . " km";

// Formatear coordenadas$formatter = new DecimalDegrees();echo $coord1->format($formatter); // 50.45010 30.52340

// Crear una geo-cerca simple (círculo con radio de 100 km)$center = new Coordinate(50.0, 30.0);$radius = 100000; // en metros$targetCoord = new Coordinate(50.5, 30.5);$distanceFromCenter = $calculator->getDistance($center, $targetCoord);

if ($distanceFromCenter <= $radius) { echo "Punto dentro de la zona";} else { echo "Punto fuera de la zona";}


2. Integración con servicios cartográficos



Google Maps API mediante Guzzle

Para trabajar con Google Maps API (geocodificación, rutas, lugares) se recomienda usar el cliente HTTP Guzzle. La biblioteca permite enviar solicitudes a la API y procesar las respuestas.

Ejemplo de geocodificación:

require 'vendor/autoload.php';

use GuzzleHttp\\Client;

$apiKey = 'TU_CLAVE_API';$address = 'Kiev, Kreshchatik, 1';

$client = new Client();$response = $client->get('https://maps.googleapis.com/maps/api/geocode/json', [ 'query' => [ 'address' => $address, 'key' => $apiKey, 'language' => 'es' ]]);

$data = json_decode($response->getBody(), true);

if ($data['status'] == 'OK') { $location = $data['results'][0]['geometry']['location']; echo "Latitud: " . $location['lat'] . ", Longitud: " . $location['lng'];} else { echo "Error en la geocodificación";}


OpenStreetMap y Leaflet

Para trabajar con OpenStreetMap (OSM) en el lado del servidor, se puede usar la biblioteca Nominatim para geocodificación inversa y directa. En el lado del cliente, Leaflet.js es la opción más popular para mostrar mapas interactivos.

Ejemplo de geocodificación con Nominatim:

use GuzzleHttp\\Client;

$client = new Client();$response = $client->get('https://nominatim.openstreetmap.org/search', [ 'query' => [ 'q' => 'Kiev, Ucrania', 'format' => 'json', 'limit' => 1 ], 'headers' => [ 'User-Agent' => 'MiAplicacion/1.0' ]]);

$data = json_decode($response->getBody(), true);

if (!empty($data)) { echo "Latitud: " . $data[0]['lat'] . ", Longitud: " . $data[0]['lon'];}


3. Almacenamiento y consulta de datos geoespaciales



MySQL con extensiones espaciales

MySQL soporta tipos de datos espaciales (POINT, LINESTRING, POLYGON) e índices espaciales desde la versión 5.7. Esto permite almacenar coordenadas y realizar consultas geoespaciales eficientes.

Ejemplo de creación de tabla y consulta:

-- Crear tabla con columna espacialCREATE TABLE lugares (    id INT AUTO_INCREMENT PRIMARY KEY,    nombre VARCHAR(100),    coordenadas POINT NOT NULL,    SPATIAL INDEX idx_coordenadas (coordenadas));

-- Insertar datosINSERT INTO lugares (nombre, coordenadas) VALUES('Kiev', POINT(50.4501, 30.5234)),('Moscú', POINT(55.7558, 37.6173));

-- Encontrar lugares dentro de un radio (en grados)SELECT nombre, ST_Distance_Sphere(coordenadas, POINT(50.0, 30.0)) AS distancia_kmFROM lugaresWHERE ST_Distance_Sphere(coordenadas, POINT(50.0, 30.0)) < 500000; -- 500 km


PostgreSQL con PostGIS

PostGIS es la extensión espacial más potente para PostgreSQL. Proporciona funciones geoespaciales avanzadas, soporte para sistemas de coordenadas (SRID) y operaciones complejas.

Ejemplo de consulta:

-- Encontrar lugares dentro de un radio (en metros)SELECT nombre, ST_Distance(coordenadas::geography, ST_SetSRID(ST_MakePoint(30.0, 50.0), 4326)::geography) AS distanciaFROM lugaresWHERE ST_DWithin(coordenadas::geography, ST_SetSRID(ST_MakePoint(30.0, 50.0), 4326)::geography, 100000);


4. Visualización de mapas en el lado del cliente



Leaflet.js

Leaflet.js es una biblioteca JavaScript ligera para mapas interactivos. Se integra fácilmente con PHP, que puede generar datos GeoJSON para su visualización.

Ejemplo de integración:

<!DOCTYPE html><html><head>    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script></head><body>    <div id="map" style="height: 400px;"></div>    <script>        var map = L.map('map').setView([50.4501, 30.5234], 10);        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {            attribution: '&copy; OpenStreetMap contributors'        }).addTo(map);

// Datos desde PHP (ejemplo) var geojsonData = ; L.geoJSON(geojsonData).addTo(map); </script></body></html>


Conclusión

PHP ofrece un ecosistema rico para trabajar con geolocalización y mapas. Desde bibliotecas para cálculos geoespaciales (geoPHP, PHPGeo) hasta integración con servicios populares (Google Maps, OpenStreetMap) y bases de datos espaciales (MySQL, PostGIS). La elección de herramientas depende de las necesidades del proyecto: para cálculos simples bastará con PHPGeo, mientras que para sistemas complejos de información geográfica se recomienda PostGIS.

No olvides que la visualización de mapas generalmente se realiza en el lado del cliente usando JavaScript (Leaflet, OpenLayers), mientras que PHP se encarga del procesamiento de datos y la lógica del servidor.

Recommendations