Hoy vamos a aprender cómo podemos añadir un visor de mapas en Flutter y además utilizando Open Street Map.

¿Por qué usar Open Street Map? A continuación voy a explicar la diferencia entre OpenStreetMap y Google Maps.
OpenStreetMap (OSM) y Google Maps son dos plataformas de mapas populares, y cada una tiene sus ventajas y desventajas. Aquí te proporcionaré una comparación de las ventajas de usar OpenStreetMap en lugar de Google Maps:
- Licencia abierta y datos abiertos: La ventaja más destacada de OSM es su licencia abierta y de uso gratuito. Los datos de OSM son de acceso libre y gratuito, lo que significa que puedes utilizarlos, modificarlos y compartirlos sin restricciones. En contraste, Google Maps tiene restricciones en el uso de sus datos, y el acceso a la API de Google Maps no es gratis y se termina pagando en función del uso.
- Colaboración comunitaria: OSM es un proyecto colaborativo global donde miles de voluntarios contribuyen a la creación y actualización de mapas. Esto resulta en mapas muy detallados y precisos, especialmente en áreas rurales o menos desarrolladas, donde Google Maps puede ser menos completo.
- Personalización y control: Al usar OSM, tienes un mayor control sobre la presentación de los mapas. Puedes personalizar los mapas para que se adapten a tus necesidades específicas. Con Google Maps, estás limitado a las opciones de personalización proporcionadas por Google.
- No requiere una cuenta de usuario: Para utilizar OSM, generalmente no necesitas una cuenta de usuario, lo que simplifica el proceso de acceso y uso de los mapas. En Google Maps, a menudo es necesario crear una cuenta de Google para acceder a sus servicios.
- Privacidad: OSM no recopila información personal de los usuarios, lo que puede ser una ventaja en términos de privacidad en comparación con Google Maps, que está vinculado a cuentas de Google y puede rastrear la ubicación de los usuarios.
- Disponibilidad offline: Tanto OSM como Google Maps ofrecen la capacidad de usar mapas sin conexión, pero OSM puede ser una opción más flexible para aquellos que desean descargar mapas específicos y regiones sin restricciones.
- Uso en aplicaciones de código abierto: OSM se utiliza comúnmente en aplicaciones de código abierto, lo que facilita la integración de mapas personalizados en proyectos de código abierto o aplicaciones propias.
- Menor dependencia de terceros: Al usar OSM, no dependes de un único proveedor de mapas. En cambio, tienes acceso a una gran cantidad de fuentes y herramientas que utilizan datos de OSM, lo que puede ser beneficioso en términos de resiliencia y flexibilidad.
Una vez hemos visto las diferencias entre OSM y Google Maps, vamos a pasar a la integración.
Para la integración del sistema vamos a usar flutter_map (https://pub.dev/packages/flutter_map)
Utilizamos la versión 6.0.1
Añadimos en nuestro pubspec.yml
flutter_map: 6.0.1
Y además añadimos la librería de latlong2 en este caso la 0.9.0
latlong2: 0.9.0
*Como extra, podemos instalar la librería flutter_map_cancellable_tile_provider (https://github.com/fleaflet/flutter_map_cancellable_tile_provider) en versión 1.0.0. Esta librería evitará llamadas innecesarias a la hora de mostrar los mapas.
flutter_map_cancellable_tile_provider: ^1.0.0
Una vez añadidas todas las librerías realizamos este comando:
flutter pub get
Y se instalan.
Ahora vamos a crear el widget de mapa que podremos utilizar en cualquiera de nuestras pantallas.
Para ello creamos un mapa.dart
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
class MapScreen extends StatelessWidget {
final double latitud;
final double longitud;
MapScreen({Key? key, required this.latitud, required this.longitud})
: super(key: key);
@override
Widget build(BuildContext context) {
if (latitud == 0 && longitud == 0)
return Center(child: Text("No hay ubicación"));
return FlutterMap(
options: MapOptions(
initialCenter: LatLng(latitud, longitud),
initialZoom: 16.0,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
additionalOptions: {
'id': 'mapbox.streets',
},
),
RichAttributionWidget(attributions: [
TextSourceAttribution(
'© OpenStreetMap contributors',
textStyle: TextStyle(color: Colors.black),
),
]),
MarkerLayer(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: LatLng(latitud, longitud), // Coordenadas del marcador
child: GestureDetector(
onTap: () {
print("Marcador pulsado");
},
child: Container(
child: Icon(
Icons.location_on, // Icono del marcador
color: Colors.teal, // Color del marcador
size: 65.0, // Tamaño del marcador
),
),
),
),
],
),
],
);
}
}
Ahora voy a explicar el código.
Hemos creado un Widget que va a recibir latitud y longitud (por defecto se inicializan a 0 y luego se obtienen de dónde queramos, puede ser del propio usuario o de un API).
Hemos añadido un texto de atribución de Open Street Maps. Es importante añadirlo, ya que estamos utilizando este servicio.
Y finalmente he añadido un Marker para mostrar la posición del punto o usuario en el mapa.
Como extra, este Marker se puede pulsar.
Para utilizarlo en nuestras vistas solo tenemos que añadirlo de la siguiente forma:
Padding(
padding: const EdgeInsets.only(bottom: 20),
child: SizedBox(
height: 500,
child: MapScreen(
latitud: latitud,
longitud: longitud,
),
//Map:
),
),
Lo añadimos dentro de una capa y podemos darle una altura fija para que no tenga problemas al pintarse en la pantalla.
Le pasamos latitud y longitud, recuerda que las inicializamos a 0 para que funcione la lógica de mostrar «No hay ubicación»
double latitud = 0; double longitud = 0;
Finalmente, este es el resultado:


Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.