-
Ve más allá con MapKit
Descubre las últimas actualizaciones de MapKit y MapKit JS. Presentaremos un nuevo tipo de indicaciones (en bicicleta) y te mostraremos cómo activar las imágenes de la función Echa un Vistazo en 3D en la web. Descubre cómo la nueva Geocoding API admite la conversión entre coordenadas y direcciones, y cómo usar la Address Representations API para obtener la dirección más adecuada para una región. Posteriormente, concluiremos con una nueva forma de hacer referencia a los lugares que garantiza que la app funcione a la perfección con App Intents.
Capítulos
- 0:00 - Introducción
- 0:45 - Encontrar lugares
- 9:34 - Mostrar lugares
- 14:14 - Moverse
Recursos
Videos relacionados
WWDC24
WWDC23
WWDC22
-
Buscar este video…
-
-
4:49 - Putting Marker on the Map with a coordinate
// Putting Marker on the Map with a coordinate let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) var body: some View { Map { Marker( "Anna Livia Fountain", coordinate: annaLiviaCoordinates ) } } -
5:07 - Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation
// Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation import GeoToolbox import MapKit let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain" ) let request = MKMapItemRequest(placeDescriptor: annaLiviaDescriptor) do { annaLiviaMapItem = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") } -
5:56 - Creating and resolving a PlaceDescriptor with address PlaceRepresentation
// Creating and resolving a PlaceDescriptor with address PlaceRepresentation import GeoToolbox import MapKit let address = "121-122 James's St, Dublin 8" let descriptor = PlaceDescriptor( representations: [.address(address)], commonName: "Obelisk Fountain" ) let request = MKMapItemRequest(placeDescriptor: descriptor) do { obeliskFountain = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") } -
6:45 - Creating a PlaceDescriptor with identifiers
// Creating a PlaceDescriptor with identifiers import GeoToolbox let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let identifiers = ["com.apple.MapKit" : "ICBB5FD7684CE949"] let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain", supportingRepresentations: [.serviceIdentifiers(identifiers)] ) -
7:28 - Fetching a MapItem from a PlaceDescriptor
// Fetching a MapItem from a PlaceDescriptor let request = MKMapItemRequest(placeDescriptor: descriptor) let mapitem = try await request.mapItem -
7:43 - Getting a PlaceDescriptor from a MapItem
// Getting a PlaceDescriptor from a MapItem let descriptor = PlaceDescriptor(mapItem: mapitem) -
8:10 - Place Card
// Place Card var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) .mapItemDetailSelectionAccessory(.callout) } } } -
10:45 - Reverse geocode with MapKit
// Reverse geocode with MapKit import MapKit let millCreekCoordinates = CLLocation(latitude: 39.042617, longitude: -94.587526) if let request = MKReverseGeocodingRequest(location: millCreekCoordinates) { do { let mapItems = try await request.mapItems millCreekMapItem = mapItems.first } catch { print("Error reverse geocoding location: \(error)") } } -
13:50 - Forward geocoding with MapKit
// Forward geocoding with MapKit var body: some View { Map { if let mapItem { Marker(item: mapItem) } } .task { let request = MKGeocodingRequest( addressString: "1 Ferry Building, San Francisco" ) do { mapItem = try await request?.mapItems.first } catch { print("Error geocoding location: \(error)") } } } -
14:38 - Allowing Map Selection
// Allowing Map Selection @State var selectedItem: MKMapItem? var body: some View { Map(selection: $selectedItem) { UserAnnotation() ForEach(fountains, id: \.self) { item in Marker(item: item) } } .onChange(of: selectedItem) { // Compute Route } } -
15:00 - Fetch a route
// Fetch a route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") } -
16:06 - Fetch a cycling route
// Fetch a cycling route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem request.transportType = .cycling let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") } -
16:25 - Display a route on the Map
// Display a route on the Map Map { if let mapRoute { UserAnnotation() MapPolyline(mapRoute) .stroke(Color.blue, lineWidth: 5) } } -
16:40 - Cycling directions in MapKit JS
// Cycling directions in MapKit JS let directions = new mapkit.Directions(); directions.route ({ origin: safariPlayground, destination: cherryHillFountain, transportType: mapkit.Directions.Transport.Cycling }, (error, { routes: [{ polyline }] }) => { polyline.style.lineWidth = 5; map.showItems([ new mapkit.PlaceAnnotation(place), new mapkit.PlaceAnnotation( place2, { selected: true } ), polyline ]); }); -
17:26 - Look Around
// Look Around var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) } } .overlay(alignment: .bottomLeading) { if (lookAroundScene != nil) { LookAroundPreview(scene: $lookAroundScene) .frame(width: 230, height: 140) .cornerRadius(10) .padding(8) } } } -
18:10 - Look Around View in MapKit JS
// Look Around View in MapKit JS const placeLookup = new mapkit.PlaceLookup(); const place = await new Promise( resolve => placeLookup.getPlace( "IBE1F65094A7A13B1", (error, result) => resolve(result) ) ); // Create an interactive look around view. const lookAround = new mapkit.LookAround( document.getElementById("container"), place, options ); -
18:35 - Look Around Options
// Look Around Options for MapKit JS const options = { // Enters a full window experience // immediately on load openDialog: true, // Provides a button to enter and // exit full window. showsDialogControl: true, // Provides a button to destroy // the look around view. showsCloseControl: true, }; -
19:10 - Handle MapKit JS Look Around events
// Handle MapKit JS Look Around events lookAround.addEventListener( "close", event => { app.closeView(); event.preventDefault(); } ); lookAround.addEventListener( "load", event => app.fadeInView() ); lookAround.addEventListener( "error", event => app.fadeOutView() ); lookAround.addEventListener( "readystatechange", event => console.log(lookAround.readyState) ); -
20:01 - MapKit JS Look Around Preview
// MapKit JS Look Around Preview const lookAround = new mapkit.LookAroundPreview( document.getElementById("container"), place );
-
-
- 0:00 - Introducción
Las personas pueden navegar y explorar ubicaciones globales, incluidos lugares de interés, cafés, tiendas y senderos para caminatas con Apple Maps. Las plataformas MapKit y MapKit JS te permiten integrar estas funciones de mapeo en sus apps y sitios web. Las actualizaciones recientes incluyen 'PlaceDescriptor' para buscar y referenciar lugares, geocodificación mejorada para mostrar información del lugar y API de direcciones y Look Around para brindar asistencia de navegación.
- 0:45 - Encontrar lugares
La nueva estructura GeoToolbox incluye el tipo 'PlaceDescriptor'. Utiliza 'PlaceDescriptor' para representar lugares con información estructurada, por ejemplo, un nombre común, una dirección, una coordenada o la ubicación de un dispositivo. Esto es útil cuando no tienes un ID de lugar de MapKit único para una ubicación, como cuando trabajas con datos de API o CRM externos, o cuando pasas referencias de lugar a un código que no usa MapKit. 'PlaceDescriptor' permite que MapKit u otros proveedores de servicios de mapas encuentren datos valiosos sobre el lugar especificado. La matriz de representaciones dentro de 'PlaceDescriptor' está ordenada en orden de precedencia decreciente, con la información más precisa primero, lo que ayuda a garantizar la identificación de la ubicación más precisa. Crea un 'PlaceDescriptor' al utilizar varios métodos, por ejemplo, especificar coordenadas, una dirección o un identificador de servicio. Un identificador de servicio es un diccionario que asigna un identificador de paquete a un identificador de lugar único para un servicio de mapeo específico. Esto permite flexibilidad e interoperabilidad entre diferentes servicios de mapeo. Cuando se utiliza un 'PlaceDescriptor' para crear un 'MKMapItemRequest', MapKit prioriza el uso del identificador MapKit de los identificadores de servicio, si está disponible. En caso contrario, recurre a otras representaciones, como coordenadas o dirección, para obtener el lugar. Los 'PlaceDescriptors' te permiten agregar fácilmente lugares a los mapas, mostrar tarjetas de lugares con información completa y crear enlaces universales a Apple Maps y brindar una experiencia de usuario perfecta en diferentes dispositivos y plataformas.
- 9:34 - Mostrar lugares
En iOS 18, el proceso de geocodificación está integrado en MapKit, reemplazando las clases obsoletas de CoreLocation 'CLGeocoder' y 'CLPlacemark'. La geocodificación implica dos procesos principales: hacia adelante y hacia atrás. La geocodificación directa convierte una dirección en coordenadas, mientras que la geocodificación inversa hace lo contrario, toma coordenadas y proporciona una dirección. La nueva API MapKit te permite realizar solicitudes de geocodificación inversa utilizando 'MKReverseGeocodingRequest', la cual devuelve una matriz de elementos de mapa que generalmente contienen solo una entrada para la ubicación específica. Utiliza 'MKAddress' y 'MKAddressRepresentations' para mostrar la información de la dirección. 'MKAddress' proporciona cadenas de direcciones simples, completas y cortas, mientras que 'MKAddressRepresentations' ofrece más flexibilidad, lo que te permite personalizar la visualización de la dirección en función de factores como la configuración regional y las necesidades específicas de tu app, lo que permite una presentación más concisa y fácil de usar de los datos de ubicación.
- 14:14 - Moverse
MapKit proporciona una API de direcciones que permite a las personas encontrar rutas entre ubicaciones al utilizar distintos modos de transporte, incluidos caminar, conducir y ahora andar en bicicleta. La API ofrece información detallada de la ruta, como estimaciones de tiempo y distancia, instrucciones paso a paso y la geometría de la ruta para dibujar en un mapa. Puedes crear solicitudes de direcciones, establecer el origen y el destino, y calcular rutas. La respuesta incluye ubicaciones de origen y destino coincidentes, una o más rutas y avisos relevantes como cierres de carreteras. MapKit también se ha ampliado para incluir soporte para indicaciones en bicicleta en watchOS y MapKit JS, lo que permite a las personas planificar rutas en bicicleta en sus relojes y sitios web. Además, la función Maps Look Around, que ofrece imágenes de 360 grados a nivel de calle, se ha incorporado a las apps MapKit en iOS 16 y ahora está disponible en MapKit JS, lo que te permite mejorar tus apps con vistas de calles interactivas.