Añadir varios marcadores con ventanas de información en un mapa de Google dinámicamente extrayendo los datos de una BD

Google Maps te proporciona una vía sencilla para marcar una ubicación en el mapa y embeberlo todo en una página web. Un marcador revela una ubicación en el mapa y una infoWindow (o ventana de información) muestra contenido en un popup sobre el mapa. Si añadimos uno de estos infoWindows sobre un marcador ayudarás al usuario a identificar la ubicación de forma más precisa mediante mucha más información.

Puedes embeber un mapa de Google Maps con múltiples marcadores y ventanas de información mediante la API de Javascript de Google Maps v3. En este caso, la latitud y la longitud de las ubicaciones las especificaremos de forma estática en el objeto de Google Maps. Pero si la latitud y la longitud se almacenan en una base de datos, deben asignarse dinámicamente en el propio objeto de Google Maps. En este tutorial, te mostraré cómo agregar múltiples marcadores con ventanas de información en un mapa de Google Maps dinámicamente mediante PHP y MySQL.

Obtener una key para la API

Para este tutorial necesitaremos autenticarnos en la API de Google Maps. En la llamada a la API tendremos que incluir la key como un parámetro para que la API nos reconozca. Por lo que, antes de embeber el mapa en tu página, crea una API key en Google Developer Console.

Una vez tengas tu API key, cópiala porque más tarde la vamos a utilizar.

Crea la tabla de la BD

Para almacenar las ubicaciones necesitaremos crear una tabla en la base de datos. El siguiente SQL crea una tabla llamada locations con ciertos campos básicos (latitude, longitude, location name e info).

CREATE TABLE `locations` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `latitude` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `longitude` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `info` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Configuración de la base de datos

Utilizaremos el fichero dbconfig.php para conectarnos a la base de datos. Para ello tendremos que definir los credenciales de la BD.

<?php
// Database configuration
$dbHost     = "localhost";
$dbUsername = "root";
$dbPassword = "root";
$dbName     = "noprog";

// Create database connection
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);

// Check connection
if ($db->connect_error) {
    die("Connection failed: " . $db->connect_error);
}

Obtener la información de las ubicaciones de la base de datos

Extraeremos la latitud y la longitud de las múltiples ubicaciones de la base de datos utilizando PHP y MySQL.

  • La primera consultará la realizaremos para extraer la información de las ubicaciones (ubicación, latitud y longitud)
  • La segunda consulta para el contenido de las inforWindows.
<?php
// Include the database configuration file
require_once 'dbConfig.php';

// Fetch the marker info from the database
$result = $db->query("SELECT * FROM locations");

// Fetch the info-window data from the database
$result2 = $db->query("SELECT * FROM locations");
?>

Añadir múltiples marcadores con InfoWindows

Carga la API de Google Maps y acuérdate de integrar la key que hemos copiado antes como un parámetro en la llamada.

<script src="https://maps.googleapis.com/maps/api/js?key=TU-KEY"></script>

El siguiente código Javascript añade múltiples marcadores con ventanas de información a un mapa de Google.

  • La función initMap() es una función de Javascript que gestiona la funcionalidad de crear el mapa
  • Inicializamos el objeto de Google Maps para adjuntar el mapa a un elemento HTML
  • Extraemos la latitud y la longitud de la base de datos y geremos el array de posiciones para los múltiples marcadores (markers)
  • Extraemos la información de las ubicaciones y generamos el array del contenido de las ventanas (infoWindowContent)
  • Añadimos múltiples marcadores con ubicaciones dinámicas a Google Maps
  • Añadimos el contenido a las ventanas de información
  • Definimos el nivel de zoom del mapa
  • Llamamos a la función initMap()
<script>
function initMap() {
    var map;
    var bounds = new google.maps.LatLngBounds();
    var mapOptions = {
        mapTypeId: 'roadmap'
    };
                    
    // Display a map on the web page
    map = new google.maps.Map(document.getElementById("mapCanvas"), mapOptions);
    map.setTilt(50);
        
    // Multiple markers location, latitude, and longitude
    var markers = [
        <?php if($result->num_rows > 0){
            while($row = $result->fetch_assoc()){
                echo '["'.$row['name'].'", '.$row['latitude'].', '.$row['longitude'].'],';
            }
        }
        ?>
    ];
                        
    // Info window content
    var infoWindowContent = [
        <?php if($result2->num_rows > 0){
            while($row = $result2->fetch_assoc()){ ?>
                ['<div class="info_content">' +
                '<h3><?php echo $row['name']; ?></h3>' +
                '<p><?php echo $row['info']; ?></p>' + '</div>'],
        <?php }
        }
        ?>
    ];
        
    // Add multiple markers to map
    var infoWindow = new google.maps.InfoWindow(), marker, i;
    
    // Place each marker on the map  
    for( i = 0; i < markers.length; i++ ) {
        var position = new google.maps.LatLng(markers[i][1], markers[i][2]);
        bounds.extend(position);
        marker = new google.maps.Marker({
            position: position,
            map: map,
            title: markers[i][0]
        });
        
        // Add info window to marker    
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
            return function() {
                infoWindow.setContent(infoWindowContent[i][0]);
                infoWindow.open(map, marker);
            }
        })(marker, i));

        // Center the map to fit all markers on the screen
        map.fitBounds(bounds);
    }

    // Set zoom level
    var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
        this.setZoom(14);
        google.maps.event.removeListener(boundsListener);
    });
    
}

// Load initialize function
google.maps.event.addDomListener(window, 'load', initMap);
</script>

Embeber el mapa de Google

Define un elemento HTML para mostrar el mapa de Google con múltiples marcadores y ventanas de información en la página web. Debes especificar el ID del elemento (mapCanvas) en el objeto Google Map.

<div id="mapCanvas"></div>

Código CSS

El siguiente código CSS define el tamaño del contenedor del mapa

#mapCanvas {
    width: 100%;
    height: 650px;
}

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP