-
Allez plus loin avec MapKit
Découvrez les dernières mises à jour de MapKit et MapKit JS. Nous présenterons un nouveau type d'itinéraire – à vélo – et vous montrerons comment activer l'imagerie 3D Look Around sur le Web. Apprenez comment la nouvelle API Geocoding prend en charge la conversion entre les coordonnées et les adresses, et comment utiliser l'API Address Representations pour obtenir l'adresse la plus appropriée pour une région. Nous conclurons avec une nouvelle façon de référencer les lieux, qui garantit une intégration fluide de votre app avec App Intents.
Chapitres
- 0:00 - Introduction
- 0:45 - Trouver des lieux
- 9:34 - Afficher des lieux
- 14:14 - Se déplacer
Ressources
Vidéos connexes
WWDC24
WWDC23
WWDC22
-
Rechercher dans cette vidéo…
-
-
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 - Introduction
Apple Plans permet de naviguer et d’explorer des lieux dans le monde entier, y compris des points de repère, des cafés, des magasins et des sentiers de randonnée. Les plateformes MapKit et MapKit JS vous permettent d’intégrer ces fonctionnalités de cartographie dans vos apps et sites web. Parmi les mises à jour récentes, citons « PlaceDescriptor » pour la recherche et le référencement de lieux, le géocodage amélioré pour l’affichage d’infos sur les lieux, ainsi que les API Directions et Look Around pour l’aide à la navigation.
- 0:45 - Trouver des lieux
Le nouveau framework, GeoToolbox, inclut le type « PlaceDescriptor ». Utilisez « PlaceDescriptor » pour représenter des lieux à l’aide d’infos structurées, telles qu’un nom commun, une adresse, des coordonnées ou l’emplacement d’un appareil. Cela est utile lorsque vous ne disposez pas d’un ID MapKit unique pour un lieu, par exemple lorsque vous utilisez des données provenant d’API ou de CRM externes, ou lorsque vous transmettez des références de lieux à un code qui n’utilise pas MapKit. « PlaceDescriptor » permet à MapKit ou à d’autres fournisseurs de services de cartographie de trouver des données riches sur le lieu spécifié. Le tableau de représentations dans « PlaceDescriptor » est ordonné par ordre de priorité décroissante, avec les infos les plus précises en premier, ce qui permet d’assurer l’identification la plus précise possible du lieu. Créez un « PlaceDescriptor » à l’aide de différentes méthodes, par exemple en spécifiant des coordonnées, une adresse ou un ID de service. Un ID de service est un dictionnaire qui associe un ID de lot à un ID de lieu unique pour un service de cartographie spécifique. Cela permet une flexibilité et une interopérabilité entre différents services de cartographie. Lorsque vous utilisez un « PlaceDescriptor » pour créer un « MKMapItemRequest », MapKit utilise en priorité l’ID MapKit s’il est disponible parmi les ID de service. Sinon, il se rabat sur d’autres représentations comme les coordonnées ou l’adresse pour récupérer le lieu. Les « PlaceDescriptors » vous permettent d’ajouter facilement des lieux à des cartes, d’afficher des fiches de lieu avec des infos détaillées et de créer des liens universels vers Apple Plans, offrant ainsi une expérience utilisateur fluide sur différents appareils et plateformes.
- 9:34 - Afficher des lieux
Dans iOS 18, le processus de géocodage est intégré à MapKit, remplaçant ainsi les classes CoreLocation obsolètes « CLGeocoder » et « CLPlacemark ». Le géocodage implique deux processus principaux : direct et inversé. Le géocodage direct convertit une adresse en coordonnées, tandis que le géocodage inversé fait le contraire, en prenant des coordonnées et en fournissant une adresse. La nouvelle API MapKit vous permet d’effectuer des demandes de géocodage inversé à l’aide de « MKReverseGeocodingRequest », qui renvoie un tableau d’éléments cartographiques, contenant généralement une seule entrée pour le lieu spécifique. Utilisez « MKAddress » et « MKAddressRepresentations » pour afficher les infos d’adresse. « MKAddress » fournit de simples chaînes d’adresses complètes et courtes, tandis que « MKAddressRepresentations » offre plus de flexibilité, vous permettant de personnaliser l’affichage de l’adresse en fonction de facteurs tels que la langue et les besoins spécifiques de l’app, pour une présentation plus concise et conviviale des données de localisation.
- 14:14 - Se déplacer
MapKit fournit une API d’itinéraires qui permet de trouver des itinéraires entre des lieux en utilisant divers modes de transport, notamment la marche, la voiture et maintenant le vélo. L’API fournit des infos détaillées sur les itinéraires, telles que des estimations de temps et de distance, des instructions détaillées et la géométrie de l’itinéraire pour dessiner sur une carte. Vous pouvez créer des demandes d’itinéraire, définir la source et la destination et calculer des itinéraires. La réponse comprend des lieux source et de destination correspondants, un ou plusieurs itinéraires et des avis pertinents tels que les fermetures de routes. MapKit s’est également enrichi de la prise en charge des itinéraires pour cyclistes sur watchOS et MapKit JS, ce qui permet aux utilisateurs de planifier des itinéraires cyclistes sur leurs montres et leurs sites web. Par ailleurs, la fonctionnalité Look Around de Plan, qui fournit des vues à 360 degrés au niveau des rues, a été intégrée dans les apps MapKit dans iOS 16 et est désormais disponible dans MapKit JS, ce qui vous permet d’améliorer vos apps avec des vues de rue interactives.