Verwenden von Tangram ES für Android mit Amazon Location Service - Amazon Location Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden von Tangram ES für Android mit Amazon Location Service

Tangram ES ist eine C++-Bibliothek zum Rendern von 2D- und 3D-Zuweisungen aus Vektordaten mit OpenGL ES. Es ist das native Gegenstück zu Tangram .

Tangram-Stile, die für die Arbeit mit dem Tilezen-Schema entwickelt wurden, sind weitgehend mit Amazon Location kompatibel, wenn Karten von HERE verwendet werden. Dazu zählen:

  • Blasen-Wrap – Ein voll funktionsfähiger Stil mit hilfreichen Symbolen für wichtige Punkte.

  • Cinnabar – Ein klassischer Look und Go-To für allgemeine Mapping-Anwendungen.

  • Auffüllen – Ein microSD-Kartenstil, der für Datenvisualisierungs-Überlagerungen entwickelt wurde und vom halben Toner-Stil von Stamen Design passt.

  • Boln – Eine Erkundung von Skalierungstransformationen in der visuellen Sprache von TRON.

  • Walkthrough – Ein auf den Fuß gelegter Stil, der sich perfekt für Walk oder Fortfahren eignet.

In diesem Handbuch wird beschrieben, wie Sie Tangram ES für Android mit Amazon Location integrieren, indem Sie den Tangram-Stil namens Cinnabar verwenden. Dieses Beispiel ist als Teil des Amazon Location Service-Beispiel-Repositorys auf verfügbarGitHub.

Obwohl andere Tangram-Stile am besten von Rasterkacheln begleitet werden, die Telefonieinformationen codieren, wird diese Funktion von Amazon Location noch nicht unterstützt.

Wichtig

Die Tangram-Stile im folgenden Tutorial sind nur mit Amazon Location Map-Ressourcen kompatibel, die mit dem -VectorHereContrastStil konfiguriert sind.

Erstellen der Anwendung: Initialisierung

So initialisieren Sie Ihre Anwendung:

  1. Erstellen Sie ein neues Android Studio-Projekt aus der Vorlage Leere Aktivität.

  2. Stellen Sie sicher, dass Kotlin für die Projektsprache ausgewählt ist.

  3. Wählen Sie ein Mindest-SDK von API 16 aus: Android 4.1 (Jelly Bean) oder höher.

  4. Öffnen Sie Projektstruktur, um Datei , Projektstruktur... auszuwählen, und wählen Sie den Abschnitt Abhängigkeiten aus.

  5. Wenn <Alle Module> ausgewählt ist, wählen Sie die Schaltfläche +, um eine neue Bibliotheksabhängigkeit hinzuzufügen.

  6. Fügen Sie AWS Android SDK Version 2.19.1 oder höher hinzu. Beispiel: com.amazonaws:aws-android-sdk-core:2.19.1

  7. Fügen Sie die Tangram-Version 0.13.0 oder höher hinzu. Zum Beispiel: com.mapzen.tangram:tangram:0.13.0.

    Anmerkung

    Suche nach Tangram : com.mapzen.tangram:tangram:0.13.0 generiert eine Meldung, dass sie „nicht gefunden“ ist, aber wenn Sie OK auswählen, kann sie hinzugefügt werden.

Erstellen der Anwendung: Konfiguration

So konfigurieren Sie Ihre Anwendung mit Ihren Ressourcen und Ihrer AWS Region:

  1. Geben Sie einen Namen für den Benutzer ein und klicken Sie dann auf app/src/main/res/values/configuration.xml.

  2. Geben Sie die Namen und Kennungen Ihrer Ressourcen sowie die AWS Region ein, in der sie erstellt wurden:

<?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>

Erstellen der Anwendung: Aktivitätslayout

Bearbeiten von app/src/main/res/layout/activity_main.xml:

  • Fügen Sie ein hinzuMapView, das die Zuordnung wiedergibt. Dadurch wird auch der anfängliche Mittelpunkt der Karte festgelegt.

  • Fügen Sie ein hinzuTextView, das die Zuordnung anzeigt.

Dadurch wird auch der anfängliche Mittelpunkt der Karte festgelegt.

Anmerkung

Sie müssen für jeden Datenanbieter, den Sie verwenden, entweder in Ihrer Anwendung oder in Ihrer Dokumentation ein Wortzeichen oder eine Textzuweisung angeben. Attributionszeichenfolgen sind in der Style-Deskriptor-Antwort unter den source.grabmaptiles.attribution Schlüsseln sources.esri.attributionsources.here.attribution, und enthalten.

Da Tangram diese Ressourcen nicht anfordert und nur mit Karten von HERE kompatibel ist, verwenden Sie „here 2020“. Wenn Sie Amazon-Location-Ressourcen mit Datenanbietern verwenden, lesen Sie unbedingt die Servicebedingungen.

<?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>

Erstellen der Anwendung: Anforderungstransformation

Erstellen Sie eine Klasse mit dem Namen SigV4Interceptor, um AWS Anfragen abzufangen und sie mit Signature Version 4 zu signieren. Dies wird bei dem HTTP-Client registriert, der zum Abrufen von Kartenressourcen verwendet wird, wenn die Hauptaktivität erstellt wird.

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() } } }

Erstellen der Anwendung: Hauptaktivität

Die Hauptaktivität ist für die Initialisierung der Ansichten verantwortlich, die Benutzern angezeigt werden. Dazu gehören:

  • Instanziieren eines Amazon Cognito-CredentialsProvider.

  • Registrieren des Signature Version 4-Interceptors.

  • Konfigurieren der Karte, indem sie auf einen Kartenstil verweist, Kachel-URLs überschreibt und die entsprechende Zuordnung anzeigt.

MainActivity ist auch für die Weiterleitung von Lebenszyklusereignissen an die Kartenansicht verantwortlich.

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() } }

Wenn Sie diese Anwendung ausführen, wird eine Vollbildkarte im Stil Ihrer Wahl angezeigt. Dieses Beispiel ist als Teil des Amazon Location Service-Beispiel-Repositorys auf verfügbarGitHub.