Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo di Tangram ES per Android con Amazon Location Service
Tangram ES
Gli stili Tangram creati per funzionare con lo schema Tilezen
-
Bubble Wrap
: uno stile di orientamento completo con icone utili per i punti di interesse. -
Cinnabar
: un look classico e ideale per le applicazioni di mappatura generali. -
Refill
: uno stile di mappa minimalista progettato per sovrapposizioni di visualizzazione dei dati, ispirato allo stile fondamentale Toner di Stamen Design. -
Tron
— Un'esplorazione delle trasformazioni di scala nel linguaggio visivo di. TRON -
Walkabout
: uno stile incentrato sulle attività all'aperto, perfetto per fare escursioni o uscire.
Questa guida descrive come integrare Tangram ES per Android con Amazon Location utilizzando lo stile Tangram chiamato Cinnabar. Questo esempio è disponibile come parte dell'archivio di esempi di Amazon Location Service su GitHub
Sebbene altri stili Tangram siano meglio accompagnati da riquadri raster, che codificano le informazioni sul terreno, questa funzionalità non è ancora supportata da Amazon Location.
Importante
Gli stili Tangram illustrati nel seguente tutorial sono compatibili solo con le risorse della mappa di Amazon Location configurate con lo VectorHereContrast
stile.
Creazione dell'applicazione: inizializzazione
Per inizializzare l'applicazione:
-
Crea un nuovo progetto Android Studio dal modello Empty Activity.
-
Assicurati che Kotlin sia selezionato per la lingua del progetto.
-
Seleziona un minimo SDK di API 16: Android 4.1 (Jelly Bean) o versione successiva.
-
Apri la struttura del progetto per selezionare File, Struttura del progetto... e scegli la sezione Dipendenze.
-
Con <All Modules>selezionato, scegliete il pulsante + per aggiungere una nuova dipendenza dalla libreria.
-
Aggiungi la SDK versione AWSAndroid 2.19.1 o successiva. Ad esempio:
com.amazonaws:aws-android-sdk-core:2.19.1
-
Aggiungi Tangram versione 0.13.0 o successiva. Ad esempio:
com.mapzen.tangram:tangram:0.13.0
.Nota
Cercando Tangram:
com.mapzen.tangram:tangram:0.13.0
genererà un messaggio che indica che «non è stato trovato», ma scegliendo OK ne consentirà l'aggiunta.
Creazione dell'applicazione: configurazione
Per configurare l'applicazione con le tue risorse e la tua AWS regione:
-
Creare il
app/src/main/res/values/configuration.xml
. -
Inserisci i nomi e gli identificatori delle tue risorse e anche la AWS regione in cui sono state create:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="identityPoolId">
us-east-1:54f2ba88-9390-498d-aaa5-0d97fb7ca3bd
</string> <string name="mapName">TangramExampleMap
</string> <string name="awsRegion">us-east-1
</string> <string name="sceneUrl">https://www.nextzen.org/carto/cinnabar-style/9/cinnabar-style.zip</string> <string name="attribution">© 2020 HERE</string> </resources>
Creazione dell'applicazione: Layout delle attività
Modificaapp/src/main/res/layout/activity_main.xml
:
-
Aggiungi un
MapView
, che rende la mappa. Questo imposterà anche il punto centrale iniziale della mappa. -
Aggiungi un
TextView
, che mostra l'attribuzione.
Questo imposterà anche il punto centrale iniziale della mappa.
Nota
È necessario fornire un marchio denominativo o un'attribuzione di testo per ogni fornitore di dati che si utilizza, nell'applicazione o nella documentazione. Le stringhe di attribuzione sono incluse nella risposta del descrittore di stile sotto i tastisources.esri.attribution
, sources.here.attribution
e. source.grabmaptiles.attribution
Poiché Tangram non richiede queste risorse ed è compatibile solo con le mappe diHERE, usa «© 2020». HERE Quando utilizzi le risorse di Amazon Location con fornitori di dati, assicurati di leggere i termini e le condizioni del servizio
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.mapzen.tangram.MapView android:id="@+id/map" android:layout_height="match_parent" android:layout_width="match_parent" /> <TextView android:id="@+id/attributionView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#80808080" android:padding="5sp" android:textColor="@android:color/black" android:textSize="10sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" tools:ignore="SmallSp" /> </androidx.constraintlayout.widget.ConstraintLayout>
Creazione dell'applicazione: richiedi la trasformazione
Crea una classe denominata SigV4Interceptor
per intercettare AWS
le richieste e firmarle utilizzando Signature Version 4. Questo verrà registrato con il HTTP client utilizzato per recuperare le risorse della mappa quando viene creata l'attività principale.
package aws.location.demo.okhttp import com.amazonaws.DefaultRequest import com.amazonaws.auth.AWS4Signer import com.amazonaws.auth.AWSCredentialsProvider import com.amazonaws.http.HttpMethodName import com.amazonaws.util.IOUtils import okhttp3.HttpUrl import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response import okio.Buffer import java.io.ByteArrayInputStream import java.net.URI class SigV4Interceptor( private val credentialsProvider: AWSCredentialsProvider, private val serviceName: String ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() if (originalRequest.url().host().contains("amazonaws.com")) { val signer = if (originalRequest.url().encodedPath().contains("@")) { // the presence of "@" indicates that it doesn't need to be double URL-encoded AWS4Signer(false) } else { AWS4Signer() } val awsRequest = toAWSRequest(originalRequest, serviceName) signer.setServiceName(serviceName) signer.sign(awsRequest, credentialsProvider.credentials) return chain.proceed(toSignedOkHttpRequest(awsRequest, originalRequest)) } return chain.proceed(originalRequest) } companion object { fun toAWSRequest(request: Request, serviceName: String): DefaultRequest<Any> { // clone the request (AWS-style) so that it can be populated with credentials val dr = DefaultRequest<Any>(serviceName) // copy request info dr.httpMethod = HttpMethodName.valueOf(request.method()) with(request.url()) { dr.resourcePath = uri().path dr.endpoint = URI.create("${scheme()}://${host()}") // copy parameters for (p in queryParameterNames()) { if (p != "") { dr.addParameter(p, queryParameter(p)) } } } // copy headers for (h in request.headers().names()) { dr.addHeader(h, request.header(h)) } // copy the request body val bodyBytes = request.body()?.let { body -> val buffer = Buffer() body.writeTo(buffer) IOUtils.toByteArray(buffer.inputStream()) } dr.content = ByteArrayInputStream(bodyBytes ?: ByteArray(0)) return dr } fun toSignedOkHttpRequest( awsRequest: DefaultRequest<Any>, originalRequest: Request ): Request { // copy signed request back into an OkHttp Request val builder = Request.Builder() // copy headers from the signed request for ((k, v) in awsRequest.headers) { builder.addHeader(k, v) } // start building an HttpUrl val urlBuilder = HttpUrl.Builder() .host(awsRequest.endpoint.host) .scheme(awsRequest.endpoint.scheme) .encodedPath(awsRequest.resourcePath) // copy parameters from the signed request for ((k, v) in awsRequest.parameters) { urlBuilder.addQueryParameter(k, v) } return builder.url(urlBuilder.build()) .method(originalRequest.method(), originalRequest.body()) .build() } } }
Creazione dell'applicazione: attività principale
L'attività principale è responsabile dell'inizializzazione delle visualizzazioni che verranno mostrate agli utenti. Ciò comporta:
-
Creazione di un'istanza di Amazon Cognito.
CredentialsProvider
-
Registrazione dell'interceptor Signature Version 4.
-
Configurazione della mappa puntandola su uno stile di mappa, sovrascrivendo il riquadro e visualizzando l'attribuzione appropriata. URLs
MainActivity
è anche responsabile dell'inoltro degli eventi del ciclo di vita alla visualizzazione della mappa.
package aws.location.demo.tangram import android.os.Bundle import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import aws.location.demo.okhttp.SigV4Interceptor import com.amazonaws.auth.CognitoCachingCredentialsProvider import com.amazonaws.regions.Regions import com.mapzen.tangram.* import com.mapzen.tangram.networking.DefaultHttpHandler import com.mapzen.tangram.networking.HttpHandler private const val SERVICE_NAME = "geo" class MainActivity : AppCompatActivity(), MapView.MapReadyCallback { private var mapView: MapView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mapView = findViewById(R.id.map) mapView?.getMapAsync(this, getHttpHandler()) findViewById<TextView>(R.id.attributionView).text = getString(R.string.attribution) } override fun onMapReady(mapController: MapController?) { val sceneUpdates = arrayListOf( SceneUpdate( "sources.mapzen.url", "https://maps.geo.${getString(R.string.awsRegion)}.amazonaws.com/maps/v0/maps/${ getString( R.string.mapName ) }/tiles/{z}/{x}/{y}" ) ) mapController?.let { map -> map.updateCameraPosition( CameraUpdateFactory.newLngLatZoom( LngLat(-123.1187, 49.2819), 12F ) ) map.loadSceneFileAsync( getString(R.string.sceneUrl), sceneUpdates ) } } private fun getHttpHandler(): HttpHandler { val builder = DefaultHttpHandler.getClientBuilder() val credentialsProvider = CognitoCachingCredentialsProvider( applicationContext, getString(R.string.identityPoolId), Regions.US_EAST_1 ) return DefaultHttpHandler( builder.addInterceptor( SigV4Interceptor( credentialsProvider, SERVICE_NAME ) ) ) } override fun onResume() { super.onResume() mapView?.onResume() } override fun onPause() { super.onPause() mapView?.onPause() } override fun onLowMemory() { super.onLowMemory() mapView?.onLowMemory() } override fun onDestroy() { super.onDestroy() mapView?.onDestroy() } }
L'esecuzione di questa applicazione consente di visualizzare una mappa a schermo intero nello stile desiderato. Questo esempio è disponibile come parte dell'archivio di esempi di Amazon Location Service su GitHub