Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisation de Tangram ES pour iOS avec Amazon Location Service
Tangram ES
Les styles Tangram conçus pour fonctionner avec le schéma Tilezen
-
Bubble Wrap
— Un style d'orientation complet avec des icônes utiles pour les points d'intérêt -
Cinnabar
— Un look classique et incontournable pour les applications cartographiques générales -
Refill
— Un style de carte minimaliste conçu pour les superpositions de visualisation de données, inspiré du style Toner emblématique de Stamen Design -
Tron
— Une exploration des transformations d'échelle dans le langage visuel de TRON -
Walkabout
— Un style axé sur le plein air, parfait pour la randonnée ou les sorties
Ce guide explique comment intégrer Tangram ES pour iOS à Amazon Location en utilisant le style Tangram appelé Cinnabar. Cet exemple est disponible dans le référentiel d'exemples Amazon Location Service sur GitHub
Bien que les autres styles Tangram soient mieux accompagnés de tuiles matricielles, qui encodent les informations du terrain, cette fonctionnalité n'est pas encore prise en charge par Amazon Location.
Important
Les styles Tangram présentés dans le didacticiel suivant sont uniquement compatibles avec les ressources cartographiques Amazon Location configurées avec ce VectorHereContrast
style.
Création de l'application : initialisation
Pour initialiser l'application, procédez comme suit :
-
Créez un nouveau projet Xcode à partir du modèle d'application.
-
Sélectionnez SwiftUI pour son interface.
-
Sélectionnez l'application SwiftUI pour son cycle de vie.
-
Sélectionnez Swift pour sa langue.
Création de l'application : ajout de dépendances
Pour ajouter des dépendances, vous pouvez utiliser un gestionnaire de dépendances tel que CocoaPods
-
Dans votre terminal, installez CocoaPods :
sudo gem install cocoapods
-
Accédez au répertoire du projet de votre application et initialisez le Podfile avec le gestionnaire de CocoaPods packages :
pod init
-
Ouvrez le Podfile pour ajouter
AWSCore
et enTangram-es
tant que dépendances :platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' pod 'Tangram-es' end
-
Téléchargez et installez les dépendances :
pod install --repo-update
-
Ouvrez l'espace de travail Xcode qui CocoaPods a créé :
xed .
Création de l'application : Configuration
Ajoutez les clés et valeurs suivantes à Info.plist pour configurer l'application et désactiver la télémétrie :
Clé | Valeur |
---|---|
AWSRegion | us-east-1 |
IdentityPoolId | us-east- 1:54 f2ba88-9390-498d-aaa5-0d97fb7ca3bd |
MapName | ExampleMap |
URL de la scène | https://www.nextzen.org/carto/cinnabar-style/9/cinnabar-style.zip |
Création de l'application : ContentView mise en page
Pour afficher la carte, modifiez ContentView.swift
:
-
Ajoutez un
MapView
qui affiche la carte. -
Ajoutez un
TextField
qui affiche l'attribution.
Cela définit également le point central initial de la carte.
Note
Vous devez indiquer l'attribution d'un mot ou d'un texte pour chaque fournisseur de données que vous utilisez, que ce soit sur votre application ou dans votre documentation. Les chaînes d'attribution sont incluses dans la réponse du descripteur de style sous les source.grabmaptiles.attribution
touches sources.esri.attribution
sources.here.attribution
, et. Lorsque vous utilisez les ressources Amazon Location avec des fournisseurs de données, assurez-vous de lire les conditions générales du service
import SwiftUI import TangramMap struct ContentView: View { var body: some View { MapView() .cameraPosition(TGCameraPosition( center: CLLocationCoordinate2DMake(49.2819, -123.1187), zoom: 10, bearing: 0, pitch: 0)) .edgesIgnoringSafeArea(.all) .overlay( Text("© 2020 HERE") .disabled(true) .font(.system(size: 12, weight: .light, design: .default)) .foregroundColor(.black) .background(Color.init(Color.RGBColorSpace.sRGB, white: 0.5, opacity: 0.5)) .cornerRadius(1), alignment: .bottomTrailing) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Création de l'application : transformation des demandes
Créez un nouveau fichier Swift nommé AWSSignatureV4URLHandler.swift
contenant la définition de classe suivante pour intercepter les AWS demandes et les signer à l'aide de Signature Version 4. Cela sera enregistré en tant que gestionnaire d'URL dans le MapView
Tangram.
import AWSCore import TangramMap class AWSSignatureV4URLHandler: TGDefaultURLHandler { private let region: AWSRegionType private let identityPoolId: String private let credentialsProvider: AWSCredentialsProvider init(region: AWSRegionType, identityPoolId: String) { self.region = region self.identityPoolId = identityPoolId self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: region, identityPoolId: identityPoolId) super.init() } override func downloadRequestAsync(_ url: URL, completionHandler: @escaping TGDownloadCompletionHandler) -> UInt { if url.host?.contains("amazonaws.com") != true { // not an AWS URL return super.downloadRequestAsync(url, completionHandler: completionHandler) } // URL-encode spaces, etc. let keyPath = String(url.path.dropFirst()) guard let keyPathSafe = keyPath.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { print("Invalid characters in path '\(keyPath)'; unsafe to sign") return super.downloadRequestAsync(url, completionHandler: completionHandler) } // sign the URL let endpoint = AWSEndpoint(region: region, serviceName: "geo", url: url) let requestHeaders: [String: String] = ["host": endpoint!.hostName] let task = AWSSignatureV4Signer .generateQueryStringForSignatureV4( withCredentialProvider: credentialsProvider, httpMethod: .GET, expireDuration: 60, endpoint: endpoint!, keyPath: keyPathSafe, requestHeaders: requestHeaders, requestParameters: .none, signBody: true) task.waitUntilFinished() if let error = task.error as NSError? { print("Error occurred: \(error)") } if let result = task.result { // have Tangram fetch the signed URL return super.downloadRequestAsync(result as URL, completionHandler: completionHandler) } // fall back to an unsigned URL return super.downloadRequestAsync(url, completionHandler: completionHandler) } }
Création de l'application : vue cartographique
La vue cartographique est chargée d'initialiser une instance du sous-jacent AWSSignatureV4Delegate
et de le configurerMGLMapView
, qui récupère les ressources et affiche la carte. Il gère également la propagation des chaînes d'attribution depuis la source du descripteur de style vers le. ContentView
Créez un nouveau fichier Swift nommé MapView.swift
contenant la struct
définition suivante :
import AWSCore import TangramMap import SwiftUI struct MapView: UIViewRepresentable { private let mapView: TGMapView init() { let regionName = Bundle.main.object(forInfoDictionaryKey: "AWSRegion") as! String let identityPoolId = Bundle.main.object(forInfoDictionaryKey: "IdentityPoolId") as! String let mapName = Bundle.main.object(forInfoDictionaryKey: "MapName") as! String let sceneURL = URL(string: Bundle.main.object(forInfoDictionaryKey: "SceneURL") as! String)! let region = (regionName as NSString).aws_regionTypeValue() // rewrite tile URLs to point at AWS resources let sceneUpdates = [ TGSceneUpdate(path: "sources.mapzen.url", value: "https://maps.geo.\(regionName).amazonaws.com/maps/v0/maps/\(mapName)/tiles/{z}/{x}/{y}")] // instantiate a TGURLHandler that will sign AWS requests let urlHandler = AWSSignatureV4URLHandler(region: region, identityPoolId: identityPoolId) // instantiate the map view and attach the URL handler mapView = TGMapView(frame: .zero, urlHandler: urlHandler) // load the map style and apply scene updates (properties modified at runtime) mapView.loadScene(from: sceneURL, with: sceneUpdates) } func cameraPosition(_ cameraPosition: TGCameraPosition) -> MapView { mapView.cameraPosition = cameraPosition return self } // MARK: - UIViewRepresentable protocol func makeUIView(context: Context) -> TGMapView { return mapView } func updateUIView(_ uiView: TGMapView, context: Context) { } }
L'exécution de cette application affiche une carte en plein écran dans le style de votre choix. Cet exemple est disponible dans le référentiel d'exemples Amazon Location Service sur GitHub