Xamarin.Forms Control de mapa
El control Map
es una vista multiplataforma para mostrar y anotar mapas. Usa el control de mapa nativo para cada plataforma, lo que proporciona una experiencia de mapas rápida y familiar para los usuarios:
La clase Map
define las siguientes propiedades que controlan su apariencia y comportamiento:
IsShowingUser
, de tipobool
, indica si el mapa muestra la ubicación actual del usuario.ItemsSource
, de tipoIEnumerable
, que colección de elementosIEnumerable
que se van a mostrar.ItemTemplate
, de tipoDataTemplate
, que especifica el elementoDataTemplate
se va a aplicar a cada elemento de la colección de elementos mostrados.ItemTemplateSelector
, de tipoDataTemplateSelector
, que especifica el elementoDataTemplateSelector
que se usará para elegir una instancia deDataTemplate
para un elemento en tiempo de ejecución.HasScrollEnabled
, de tipobool
, determina si el mapa puede desplazarse.HasZoomEnabled
, de tipobool
, determina si en el mapa se puede aplicar zoom.MapElements
, de tipoIList<MapElement>
, representa la lista de elementos del mapa, como polígonos y polilíneas.MapType
, de tipoMapType
, indica el estilo de presentación del mapa.MoveToLastRegionOnLayoutChange
, de tipobool
, controla si la región de mapa mostrada se moverá de su región actual a su región establecida previamente cuando se produzca un cambio de diseño.Pins
, de tipoIList<Pin>
, representa la lista de pines o marcas del mapa.TrafficEnabled
, de tipobool
, indica si los datos de tráfico se superponen en el mapa.VisibleRegion
, de tipoMapSpan
, devuelve la región mostrada actualmente del mapa.
Estas propiedades, con la excepción de las propiedades MapElements
, Pins
y VisibleRegion
están respaldadas por los objetos BindableProperty
, lo que significa que estas propiedades pueden ser destinos de los enlaces de datos.
La clase Map
define un evento MapClicked
que se desencadena cuando se pulsa en el mapa. El objeto MapClickedEventArgs
que acompaña al evento que tiene una propiedad de nombre Position
, de tipo Position
. Cuando se desencadena el evento, la propiedad Position
se establece en la ubicación del mapa que se ha pulsado. Para obtener información sobre la estructura Position
, vea Posición y distancia de mapa.
Para más información sobre las propiedades ItemsSource
, ItemTemplate
y ItemTemplateSelector
, consulta Mostrar una colección de pines.
Presentación de un mapa
Un Map
se puede mostrar agregándolo a un diseño o una página:
<ContentPage ...
xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps">
<maps:Map x:Name="map" />
</ContentPage>
Nota:
Se requiere una definición de espacio de nombres xmlns
adicional para hacer referencia al Xamarin.Forms.Controles de mapas. En el ejemplo anterior, se hace referencia al espacio de nombres Xamarin.Forms.Maps
a través de la palabra clave maps
.
El código de C# equivalente es el siguiente:
using Xamarin.Forms;
using Xamarin.Forms.Maps;
namespace WorkingWithMaps
{
public class MapTypesPageCode : ContentPage
{
public MapTypesPageCode()
{
Map map = new Map();
Content = map;
}
}
}
En este ejemplo se llama al constructor predeterminado Map
, que centra el mapa en Roma:
Como alternativa, se puede pasar un argumento MapSpan
a un constructor Map
para establecer el punto central y el nivel de zoom del mapa cuando se carga. Para más información, consulta Presentación de una ubicación específica en un mapa.
Tipos de mapas
La propiedad Map.MapType
se puede establecer en un miembro de enumeración MapType
para definir el estilo de presentación del mapa. La enumeración MapType
define los miembros siguientes:
Street
especifica que se mostrará un mapa de calles.Satellite
especifica que se mostrará un mapa que contiene imágenes de satélite.Hybrid
especifica que se mostrará un mapa que combina datos de calle y satélite.
De forma predeterminada, Map
mostrará un mapa de calles si la propiedad MapType
no está definida. La propiedad MapType
se debe establecer en uno de los miembros de la enumeración MapType
:
<maps:Map MapType="Satellite" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
MapType = MapType.Satellite
};
Las capturas de pantalla siguientes muestran un Map
cuando la propiedad MapType
está establecida en Street
:
Las capturas de pantalla siguientes muestran un Map
cuando la propiedad MapType
está establecida en Satellite
:
Las capturas de pantalla siguientes muestran un Map
cuando la propiedad MapType
está establecida en Hybrid
:
Mostrar una ubicación específica en un mapa
La región de un mapa que se va a mostrar cuando se carga un mapa se puede establecer pasando un argumento MapSpan
al constructor Map
:
<maps:Map>
<x:Arguments>
<maps:MapSpan>
<x:Arguments>
<maps:Position>
<x:Arguments>
<x:Double>36.9628066</x:Double>
<x:Double>-122.0194722</x:Double>
</x:Arguments>
</maps:Position>
<x:Double>0.01</x:Double>
<x:Double>0.01</x:Double>
</x:Arguments>
</maps:MapSpan>
</x:Arguments>
</maps:Map>
El código de C# equivalente es el siguiente:
Position position = new Position(36.9628066, -122.0194722);
MapSpan mapSpan = new MapSpan(position, 0.01, 0.01);
Map map = new Map(mapSpan);
Este ejemplo crea un objeto Map
con el que muestra la región especificada por el objeto MapSpan
. El objeto MapSpan
se centra en la latitud y longitud representada por un objeto Position
y abarca 0,01 grados de latitud y 0,01 grados de longitud. Para obtener información sobre la estructura Position
, vea Posición y distancia de mapa. Para obtener información sobre cómo pasar argumentos en XAML, consulta Paso de argumentos en XAML.
El resultado es que, cuando se muestra el mapa, se centra en una ubicación específica y abarca un número específico de grados de latitud y longitud:
Creación de un objeto MapSpan
Hay varios enfoques para crear objetos MapSpan
. Un enfoque común es proporcionar los argumentos necesarios al constructor MapSpan
. Se trata de una latitud y longitud representadas por un objeto Position
y valores double
que representan los grados de latitud y longitud que abarca MapSpan
. Para obtener información sobre la estructura Position
, vea Posición y distancia de mapa.
Como alternativa, hay tres métodos en la clase MapSpan
que devuelven nuevos objetos MapSpan
:
ClampLatitude
devuelve un objetoMapSpan
con el mismoLongitudeDegrees
que la instancia de clase del método y un radio definido por sus argumentosnorth
ysouth
.FromCenterAndRadius
devuelve un objetoMapSpan
definido por sus argumentosPosition
yDistance
.WithZoom
devuelve un objetoMapSpan
con el mismo centro que la instancia de clase del método, pero con un radio multiplicado por su argumentodouble
.
Para obtener información sobre la estructura Distance
, vea Posición y distancia de mapa.
Una vez creado MapSpan
, se puede acceder a las siguientes propiedades para recuperar datos sobre él:
Center
, que representa elPosition
en el centro geográfico de laMapSpan
.LatitudeDegrees
, que representa los grados de latitud que abarcan elMapSpan
.LongitudeDegrees
, que representa los grados de longitud que abarcan elMapSpan
.Radius
, que representa el radio deMapSpan
.
Mover el mapa
Se puede llamar al método Map.MoveToRegion
para cambiar la posición y el nivel de zoom de un mapa. Este método acepta un argumento MapSpan
que define la región del mapa que se va a mostrar y su nivel de zoom.
En el código siguiente se muestra un ejemplo de cómo mover la región mostrada en un mapa:
MapSpan mapSpan = MapSpan.FromCenterAndRadius(position, Distance.FromKilometers(0.444));
map.MoveToRegion(mapSpan);
Acercamiento/alejamiento del mapa
El nivel de zoom de Map
se puede cambiar sin modificar su ubicación. Esto se puede lograr mediante la interfaz de usuario de mapa o mediante programación llamando al método MoveToRegion
con un argumento MapSpan
que usa la ubicación actual como argumento Position
:
double zoomLevel = 0.5;
double latlongDegrees = 360 / (Math.Pow(2, zoomLevel));
if (map.VisibleRegion != null)
{
map.MoveToRegion(new MapSpan(map.VisibleRegion.Center, latlongDegrees, latlongDegrees));
}
En este ejemplo, se llama al método MoveToRegion
con un argumento MapSpan
que especifica la ubicación actual del mapa, a través de la propiedad Map.VisibleRegion
y el nivel de zoom como grados de latitud y longitud. El resultado general es que se cambia el nivel de zoom del mapa, pero su ubicación no. Un enfoque alternativo para implementar zoom en un mapa es usar el método MapSpan.WithZoom
para controlar el factor de zoom.
Importante
El zoom de un mapa, ya sea a través de la interfaz de usuario del mapa o mediante programación, requiere que la propiedad Map.HasZoomEnabled
sea true
. Para obtener más información sobre esta propiedad, consulta Deshabilitar el zoom.
Personalización del comportamiento del mapa
El comportamiento de Map
se puede personalizar estableciendo algunas de sus propiedades y controlando el evento MapClicked
.
Nota:
Se puede lograr una personalización adicional del comportamiento del mapa mediante la creación de un representador personalizado de mapa. Para obtener más información, vea Personalización de un Mapa de Xamarin.Forms.
Mostrar datos del tráfico
La clase Map
define una propiedad TrafficEnabled
de tipo bool
. De forma predeterminada, esta propiedad es false
, que indica que los datos de tráfico no se superponen en el mapa. Cuando esta propiedad se establece en true
, los datos de tráfico se superponen en el mapa. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
<maps:Map TrafficEnabled="true" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
TrafficEnabled = true
};
Deshabilitar el desplazamiento
La clase Map
define una propiedad HasScrollEnabled
de tipo bool
. De forma predeterminada, esta propiedad es true
, que indica que el mapa puede desplazarse. Cuando esta propiedad se establece en false
, el mapa no se desplazará. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
<maps:Map HasScrollEnabled="false" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
HasScrollEnabled = false
};
Deshabilitar el zoom
La clase Map
define una propiedad HasZoomEnabled
de tipo bool
. De forma predeterminada, esta propiedad es true
, que indica que el zoom se puede realizar en el mapa. Cuando esta propiedad se establece en false
, el mapa no se puede acercar. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
<maps:Map HasZoomEnabled="false" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
HasZoomEnabled = false
};
Obtener la ubicación del usuario
La clase Map
define una propiedad IsShowingUser
de tipo bool
. De forma predeterminada, esta propiedad es false
, que indica que el mapa no muestra la ubicación actual del usuario. Cuando esta propiedad se establece en true
, el mapa muestra la ubicación actual del usuario. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
<maps:Map IsShowingUser="true" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
IsShowingUser = true
};
Importante
En iOS, Android y la Plataforma universal de Windows, el acceso a la ubicación del usuario requiere que se hayan concedido permisos de ubicación a la aplicación. Para obtener más información, consulta Configuración de la plataforma.
Mantenimiento de la región de mapa en el cambio de diseño
La clase Map
define una propiedad MoveToLastRegionOnLayoutChange
de tipo bool
. De forma predeterminada, esta propiedad es true
, que indica que la región de mapa mostrada se moverá de su región actual a su región establecida previamente cuando se produzca un cambio de diseño, como en la rotación del dispositivo. Cuando esta propiedad se establece en false
, la región de mapa mostrada permanecerá centrada cuando se produzca un cambio de diseño. En el ejemplo siguiente se muestra cómo establecer esta propiedad:
<maps:Map MoveToLastRegionOnLayoutChange="false" />
El código de C# equivalente es el siguiente:
Map map = new Map
{
MoveToLastRegionOnLayoutChange = false
};
Clics del mapa
La clase Map
define un evento MapClicked
que se desencadena cuando el usuario pulsa el mapa. El objeto MapClickedEventArgs
que acompaña al evento que tiene una propiedad de nombre Position
, de tipo Position
. Cuando se desencadena el evento, la propiedad Position
se establece en la ubicación del mapa que se ha pulsado. Para obtener información sobre la estructura Position
, vea Posición y distancia de mapa.
En el ejemplo de código siguiente se muestra un controlador de eventos para el evento MapClicked
:
void OnMapClicked(object sender, MapClickedEventArgs e)
{
System.Diagnostics.Debug.WriteLine($"MapClick: {e.Position.Latitude}, {e.Position.Longitude}");
}
En este ejemplo, el controlador de eventos OnMapClicked
genera la latitud y la longitud que representa la ubicación del mapa pulsado. El controlador de eventos se puede registrar con el evento MapClicked
de la siguiente manera:
<maps:Map MapClicked="OnMapClicked" />
El código de C# equivalente es el siguiente:
Map map = new Map();
map.MapClicked += OnMapClicked;