As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Utilizar o Tangram ES para iOS com o Amazon Location Service
O Tangram ES
Os estilos do Tangram criados para funcionar com o esquema Tilezen
-
Bubble Wrap
: um estilo de orientação completo com ícones úteis para pontos de interesse -
Cinnabar
: um visual clássico e ideal para aplicações gerais de mapeamento -
Refill
: um estilo de mapa minimalista projetado para sobreposições de visualização de dados, inspirado no estilo seminal de Toner da Stamen Design -
Tron
— Uma exploração das transformações de escala na linguagem visual de TRON -
Walkabout
: um estilo voltado para atividades ao ar livre que é perfeito para caminhar ou passear
Este guia descreve como integrar o Tangram ES para iOS com o Amazon Location usando o estilo Tangram chamado Cinnabar. Essa amostra está disponível como parte do repositório de amostras do Amazon Location Service em GitHub
Embora outros estilos do Tangram sejam melhor acompanhados por blocos raster, que codificam informações sobre o terreno, esse atributo ainda não é suportado pelo Amazon Location.
Importante
Os estilos do Tangram no tutorial a seguir são compatíveis somente com os recursos de mapa do Amazon Location configurados com o estilo VectorHereContrast
.
Construir o aplicativo: inicialização
Como inicializar o aplicativo:
-
Crie um novo projeto Xcode a partir do modelo Aplicativo.
-
Selecione SwiftUI para sua interface.
-
Selecione o aplicativo SwiftUI para seu Ciclo de vida.
-
Selecione Swift como seu idioma.
Construir o aplicativo: adicionar dependências
Para adicionar dependências, você pode usar um gerenciador de dependências, como: CocoaPods
-
No seu terminal, instale CocoaPods:
sudo gem install cocoapods
-
Navegue até o diretório do projeto do seu aplicativo e inicialize o Podfile com o gerenciador de CocoaPods pacotes:
pod init
-
Abra o Podfile para adicionar
AWSCore
eTangram-es
como dependências:platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' pod 'Tangram-es' end
-
Baixe e instale dependências:
pod install --repo-update
-
Abra a área de trabalho do Xcode que CocoaPods criou:
xed .
Construir o aplicativo: configuração
Adicione as seguintes chaves e valores ao Info.plist para configurar o aplicativo e desativar a telemetria:
Chave | Valor |
---|---|
AWSRegion | us-east-1 |
IdentityPoolId | us-east-1:54f2ba88-9390-498d-aaa5-0d97fb7ca3bd |
MapName | ExampleMap |
Cena URL | https://www.nextzen. org/carto/cinnabar-style/9/cinnabar-style.zip |
Construindo o aplicativo: ContentView layout
Para renderizar o mapa, edite ContentView.swift
:
-
Adicione um
MapView
que renderiza o mapa. -
Adicione um
TextField
que exiba a atribuição.
Isso também define o ponto central inicial do mapa.
nota
Você deve fornecer uma marca nominativa ou atribuição de texto para cada provedor de dados que você usa, seja em seu aplicativo ou em sua documentação. As strings de atribuição estão incluídas na resposta do descritor de estilo sob as teclas sources.esri.attribution
, sources.here.attribution
e source.grabmaptiles.attribution
. Ao usar os recursos do Amazon Location com provedores de dados, lembre-se de ler os termos e condições do serviço
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() } }
Construir o aplicativo: solicitar transformação
Crie um novo arquivo Swift chamado AWSSignatureV4URLHandler.swift
contendo a seguinte definição de classe para interceptar AWS solicitações e assiná-las usando o Signature Version 4. Ele será registrado como URL manipulador dentro do 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) } }
Construir o aplicativo: visualização do mapa
A visualização do mapa é responsável por inicializar uma instância de AWSSignatureV4Delegate
e configurar o MGLMapView
subjacente, que busca recursos e renderiza o mapa. Ele também lida com a propagação de cadeias de atribuição da fonte do descritor de estilo de volta para o ContentView
.
Crie um novo arquivo Swift chamado MapView.swift
contendo a seguinte definição de struct
:
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) { } }
A execução deste aplicativo exibe um mapa em tela cheia no estilo de sua escolha. Essa amostra está disponível como parte do repositório de amostras do Amazon Location Service em GitHub