Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan Tangram ES untuk Android dengan Amazon Location Service
Tangram ES
Gaya Tangram yang dibuat untuk bekerja dengan skema Tilezen sebagian
-
Bubble Wrap
- Gaya pencarian jalan berfitur lengkap dengan ikon bermanfaat untuk tempat menarik. -
Cinnabar
— Tampilan klasik dan pilihan untuk aplikasi pemetaan umum. -
Isi Ulang
— Gaya peta minimalis yang dirancang untuk hamparan visualisasi data, terinspirasi oleh gaya Toner mani oleh Stamen Design. -
Tron
— Eksplorasi transformasi skala dalam bahasa visual. TRON -
Walkabout
— Gaya yang berfokus pada luar ruangan yang sempurna untuk hiking atau keluar dan berkeliling.
Panduan ini menjelaskan cara mengintegrasikan Tangram ES untuk Android dengan Lokasi Amazon menggunakan gaya Tangram yang disebut Cinnabar. Sampel ini tersedia sebagai bagian dari repositori sampel Amazon Location Service di. GitHub
Sementara gaya Tangram lainnya paling baik disertai dengan ubin raster, yang menyandikan informasi medan, fitur ini belum didukung oleh Amazon Location.
penting
Gaya Tangram dalam tutorial berikut hanya kompatibel dengan sumber daya peta Lokasi Amazon yang dikonfigurasi dengan VectorHereContrast
gaya.
Membangun aplikasi: Inisialisasi
Untuk menginisialisasi aplikasi Anda:
-
Buat project Android Studio baru dari template Empty Activity.
-
Pastikan bahwa Kotlin dipilih untuk bahasa proyek.
-
Pilih Minimal SDK API 16: Android 4.1 (Jelly Bean) atau yang lebih baru.
-
Buka Struktur Proyek untuk memilih File, Struktur Proyek... , dan pilih bagian Dependensi.
-
Dengan <All Modules>dipilih, pilih tombol + untuk menambahkan Ketergantungan Perpustakaan baru.
-
Tambahkan AWSAndroid SDK versi 2.19.1 atau yang lebih baru. Misalnya:
com.amazonaws:aws-android-sdk-core:2.19.1
-
Tambahkan Tangram versi 0.13.0 atau yang lebih baru. Sebagai contoh:
com.mapzen.tangram:tangram:0.13.0
.catatan
Mencari Tangram:
com.mapzen.tangram:tangram:0.13.0
akan menghasilkan pesan bahwa itu “tidak ditemukan”, tetapi memilih OK akan memungkinkannya untuk ditambahkan.
Membangun aplikasi: Konfigurasi
Untuk mengonfigurasi aplikasi Anda dengan sumber daya dan AWS Wilayah Anda:
-
Buat
app/src/main/res/values/configuration.xml
. -
Masukkan nama dan pengidentifikasi sumber daya Anda, dan juga AWS Wilayah tempat mereka dibuat:
<?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>
Membangun aplikasi: Tata letak aktivitas
Suntingapp/src/main/res/layout/activity_main.xml
:
-
Tambahkan
MapView
, yang membuat peta. Ini juga akan mengatur titik pusat awal peta. -
Tambahkan a
TextView
, yang menampilkan atribusi.
Ini juga akan mengatur titik pusat awal peta.
catatan
Anda harus memberikan tanda kata atau atribusi teks untuk setiap penyedia data yang Anda gunakan, baik pada aplikasi atau dokumentasi Anda. String atribusi disertakan dalam respons deskriptor gaya di bawahsources.esri.attribution
,sources.here.attribution
, dan kunci. source.grabmaptiles.attribution
Karena Tangram tidak meminta sumber daya ini, dan hanya kompatibel dengan peta dariHERE, gunakan “© 2020HERE”. Saat menggunakan sumber daya Lokasi Amazon dengan penyedia data, pastikan untuk membaca syarat dan ketentuan layanan
<?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>
Membangun aplikasi: Minta transformasi
Buat kelas bernama SigV4Interceptor
untuk mencegat AWS
permintaan dan menandatanganinya menggunakan Signature Version 4. Ini akan didaftarkan pada HTTP klien yang digunakan untuk mengambil sumber daya peta saat Aktivitas Utama dibuat.
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() } } }
Membangun aplikasi: Kegiatan utama
Aktivitas Utama bertanggung jawab untuk menginisialisasi tampilan yang akan ditampilkan kepada pengguna. Ini melibatkan:
-
Membuat Instantiasi Amazon Cognito.
CredentialsProvider
-
Mendaftarkan pencegat Signature Version 4.
-
Mengkonfigurasi peta dengan mengarahkannya ke gaya peta, mengganti ubinURLs, dan menampilkan atribusi yang sesuai.
MainActivity
juga bertanggung jawab untuk meneruskan peristiwa siklus hidup ke tampilan peta.
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() } }
Menjalankan aplikasi ini menampilkan peta layar penuh dengan gaya yang Anda pilih. Sampel ini tersedia sebagai bagian dari repositori sampel Amazon Location Service di. GitHub