MapKit + SwiftUI (Parte 2 de 8)
1Explorando MapKit en SwiftUI
2Cómo referenciar lugares con Place ID
3Seleccionar marcadores y anotaciones de MapKit en SwiftUI
4Overlays con MapKit y SwiftUI
5Cómo interactuar con MapFeature en SwiftUI
6Cómo configurar controles de un mapa con MapKit y SwiftUI
7Explorando lugares con LookAroundPreview
8Mostrar datos de un lugar con Place Card
Cómo referenciar lugares con Place ID
Misael Cuevas
30 octubre, 20245min de lectura
Place ID es un identificador único que se utiliza para referenciar lugares como parques, tiendas, museos, entre otros.
La ventaja de Place ID frente a otras opciones para indicar la ubicación de un lugar, como direcciones o coordenadas, es que este no cambia aunque el lugar lo haga. Por ejemplo, tu restaurante favorito puede cambiar de dirección o coordenadas en cualquier momento, pero su Place ID seguirá siendo el mismo. Esto es posible porque Apple, a través de Place ID, realiza un seguimiento de los datos del lugar, asegurando que siempre tengas la información más actualizada, como coordenadas o dirección.
Un Place ID solo deja de ser válido cuando el lugar deja de existir, por ejemplo, si tu restaurante favorito ha cerrado. Al igual que las coordenadas y las direcciones, los Place IDs se pueden compartir entre aplicaciones, y estas harán referencia al mismo lugar.
El Place ID se representa en la propiedad identifier
de la clase MKMapItem
:
var identifier: MKMapItem.Identifier? { get }
Cómo buscar un Place ID
Existen tres formas para buscar un Place ID, estas son: Place ID Lookup, MKLocalSearch y Apple Server Maps API.
Place ID Lookup
La forma más fácil de encontrar el identificador de un lugar es a través de Place ID Lookup, una web proporcionada por Apple para buscar identificadores de lugares. Ejemplo:
MKLocalSearch
MKLocalSearch
es una clase que se utiliza para buscar lugares o direcciones en un mapa.
import MapKit// 1let request = MKLocalSearch.Request()request.naturalLanguageQuery = "Kento Nanami"// 2let search = MKLocalSearch(request: request)// 3let response = try await search.start()// 4response.mapItems.forEach {let identifier = $0.identifier?.rawValue}
- Se define una solicitud de búsqueda con el término "Kento Nanami".
- Se crea una instancia de
MKLocalSearch
basada en la solicitud especificada. - Se inicia la búsqueda de forma asíncrona. Si la búsqueda es exitosa, se obtiene una respuesta de tipo
MKLocalSearch.Response
, que contiene los resultados. - Para cada lugar encontrado, se obtiene el nombre y el identificador del lugar.
Ejemplo: Kento Nanami Memorial: IE2F67531C4B55D01
.
Apple Server Maps API
Usando Apple Server Maps API, puedes obtener el Place ID de un lugar a través de búsquedas específicas, autocompletadas o geocodificadas. Para más información, consulta la documentación de Apple.
Cómo usar un Place ID en un mapa
Busca un lugar usando Place ID Lookup y copia el Place ID. Luego, para mostrar ese lugar en un mapa de SwiftUI usando el identificador, utiliza la siguiente vista de ejemplo:
import SwiftUI// 1import MapKitstruct SimpleMapView: View {// 2@State private var mapItem: MKMapItem?var body: some View {// 3Map {// 4if let mapItem {Marker(item: mapItem)}}.task { // 5}}}
- Se importa el framework MapKit para trabajar con mapas.
- Se define la propiedad opcional
mapItem
de tipoMKMapItem
para representar un lugar en el mapa. Se añade el property wrapper@State
amapItem
para actualizar el contenido de la vista cuando cambie su valor. - Se define un mapa en el cuerpo de la vista.
- Se muestra un marcador en la ubicación representada por
mapItem
en el mapa, simapItem
no es nulo. - Se añade el modificador
task
para realizar una tarea asíncrona antes de que la vista se muestre al usuario. De momento, este bloque está vacío, pero se agregará código más adelante.
Para mostrar el lugar en el mapa utilizando solo el identificador, debes usar la clase MKMapItemRequest
. Con esta clase, podrás obtener la información más reciente de un lugar. Añade el siguiente código dentro del modificador task
:
// 1guard let identifier = MKMapItem.Identifier(rawValue: "PLACE_ID") else {return}// 2let request = MKMapItemRequest(mapItemIdentifier: identifier)// 3mapItem = try? await request.mapItem
- Se intenta crear un identificador de tipo
MKMapItem.Identifier
a partir del Place ID. Si no es válido, se retorna sin ejecutar las siguientes líneas de código. Recuerda reemplazar "PLACE_ID" por el Place ID que buscaste previamente. - Si se obtiene un identificador válido, se procede a crear una solicitud de tipo
MKMapItemRequest
para obtener unMKMapItem
asociado al identificador. - Se realiza una solicitud asíncrona para obtener el
MKMapItem
y se asigna a la propiedadmapItem
si la solicitud es exitosa.
Place IDs alternativos
Un lugar puede tener más de un Place ID asignado, lo que significa que múltiples Place IDs pueden referirse a un mismo lugar. Los Place IDs alternativos están representados en la propiedad alternateIdentifiers
de la clase MKMapItem
:
var alternateIdentifiers: Set<MKMapItem.Identifier> { get }
El valor de la propiedad identifier
de MKMapItem
puede cambiar con el tiempo. Si necesitas almacenar esta propiedad, se recomienda hacer lo mismo con alternateIdentifiers
para poder determinar cuando varios Place IDs hacen referencia a un mismo lugar.
Compatibilidad
- iOS 18.0+
- iPadOS 18.0+
- Mac Catalyst 18.0+
- macOS 15.0+
- tvOS 18.0+
- visionOS 2.0+
MapKit + SwiftUI (Parte 2 de 8)
1Explorando MapKit en SwiftUI
2Cómo referenciar lugares con Place ID
3Seleccionar marcadores y anotaciones de MapKit en SwiftUI
4Overlays con MapKit y SwiftUI
5Cómo interactuar con MapFeature en SwiftUI
6Cómo configurar controles de un mapa con MapKit y SwiftUI
7Explorando lugares con LookAroundPreview
8Mostrar datos de un lugar con Place Card