[Kotlin] GoogleMaps Api , Realm アプリ#1 作成　

Kotlin ＋　Google Maps Api + Realm でアプリを作成してみましたので、メモしておきます。
![maptracer-maint2 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/0a3ae2e1-833e-57e8-ec9a-f008bd82e23a.png)


# Google Maps APIとは？

Google社が提供している高機能で世界中の地図データを扱っているGoogleマップを
以下のようなサービスを利用できるものです。
・マップ
　カスタマイズしたマップやストリートビューの画像を取り入れて
　リアルな世界をユーザーに提示するサービス
・ルート
　広範なデータとリアルタイムの交通状況に基づき、
　特定の場所から目的地への最適なルートをユーザーに提供するサービス

# 動作環境
Kotlin (1.3)
Android Studio (3.4.1)
Realm for kotlin (6.0.2)
Google Maps API

※　参考資料
[Realm ドキュメント](https://realm.io/docs/java/6.0.2/)
[Google Maps API](https://developers.google.com/maps/?hl=ja)

# Google Maps API手順

##①　Google Map プロジェクト作成　
File ->New -> Project -> Google Map Activity
##②　Google Maps API　を作成
・google_maps_api.xml のリンクを利用
・作成されたキー（AI＊＊＊）を設定すること。
<img width="500" alt="google-map-api.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/41b1a71d-d489-9044-5224-ec7282d3e18f.png">
※作成されたGoogle Maps API
<img width="500" alt="google-map-api-key.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/07ae6ee3-69c8-beeb-9851-7496741c05eb.png">

##③　初期化

```MapsActivity.kt
    private lateinit var googleMap: GoogleMap
    private lateinit var fusedLocationProviderClient : FusedLocationProviderClient
    private lateinit var locationRequest: LocationRequest
    private lateinit var locationCallback: LocationCallback
    val realm = Realm.getDefaultInstance()
```
##④　許可

```AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
```

```MapsActivity.kt
fun checkMapPermission(): Boolean {
       return ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED)
}
```
##⑤　ポシション取得方法を要求

```MapsActivity.kt
locationRequest = LocationRequest().apply {
            interval = 10000                                   // 最遅の更新間隔(但し正確ではない。)
            fastestInterval = 5000                             // 最短の更新間隔
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY  // 精度重視
}
```
##⑥　コールバック

```MapsActivity.kt
locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                // 更新直後の位置が格納されているはず
                locationResult?.lastLocation?.run {
                  Log.d("mapLocation", "latitude:$latitude ,longitude: $longitude ")
                }
           }
```
##⑦　地図への描画
・線の描画

```MapsActivity.kt
private val polylineOptions = PolylineOptions().width(5f).color(Color.RED)
val latLng = LatLng(latitude, longitude)
polylineOptions.add(latLng)
googleMap.addPolyline(polylineOptions)
```
・円描画

```MapsActivity.kt
googleMap.addCircle(
            CircleOptions()
                .center(location)        // 円の中心位置
                .radius(radius)          // 半径 (メートル単位)
                .strokeColor(Color.BLUE) // 線の色
                .strokeWidth(2f)         // 線の太さ
                .fillColor(0x400080ff)   // 円の塗りつぶし色
        )
```
# Realm手順

##①　Realm 追加

```build.gradle(プロジェクト用)
classpath "io.realm:realm-gradle-plugin:6.0.2"
```

```build.gradle(module用)
apply plugin: 'realm-android'
```
下記のエラーが出る場合、「`apply plugin: 'kotlin-kapt'`」を追加すること。
＊エラー：Configuration with name 'kapt' not found.

##②　Realm  モデル

```LocationModel.kt
open class LocationModel(
    @PrimaryKey var mapId : Long = 0,
    var latitude: Double = 0.0,
    var longtitude: Double = 0.0,
    var date: Long = 0,
    var title: String = ""
): RealmObject()
```
##③　Realm  へ保存

```MapsActivity.kt
realm.beginTransaction()
val model = realm.createObject<LocationModel>(getNextId())
model.latitude = latLng.latitude
model.longtitude = latLng.longitude
model.date = calendar.timeInMillis
realm.commitTransaction()
```

# プロジェクト
[GitHub](https://github.com/mario7/MapTracer/tree/master/MapTracer)

#Index
 [kotlin,GoogleMaps Apiアプリ#2 テスト](https://qiita.com/mario7/items/08e3ee64a82948317d3e)　>>