logo

Overview

logo

究極のカーナビゲーション体験をお届けします!

パイオニアのクラウドナビゲーションSDKは、長年にわたる経験と専門知識に基づき、最高品質のルート探索を実現しています。 道を知り尽くしたパートナーのような案内が、あなたを的確に目的地へと導きます。

さらに、カスタマイズ性に優れた地図描画機能により、自由な表現が可能です。

クラウドナビゲーションSDKを活用して、あなたのカーナビゲーションアプリを革新的なものへと進化させましょう。

パイオニア株式会社 © Pioneer Corporation. All Rights Reserved.


クラウドナビゲーションSDKの特徴

助手席のパートナーのような道案内

  • 地図を見なくても音声だけで目的地にたどり着けるように「いつ」「どこで」「どうする」を分かりやすく、的確なタイミングで伝えます。

視認性の高い地図・UI部品

  • 運転中に確認しやすい地図の色使いや道路描画で、安全運転をサポートします。

ドライバー目線の安全で快適なルート探索

  • パイオニアの長年の経験に裏付けされた最適なルートを提供します。

高精度な自車位置補正/マッチング

  • GPSの情報だけで位置を決めるのではなく、走行状況や地図の形状も判断材料に加えて、正確に現在位置を推定します。
  • GPSが届かないトンネル内であっても、走行状況や道路状況などから現在位置を推定し、位置の更新とガイダンスを行います。

多彩な地点検索

  • 日本全国の地点検索はもちろん、案内中のルート周辺に限定した検索も可能です。

渋滞知らずの快適ドライブ

  • リアルタイムに渋滞情報を解析し、渋滞を回避するルートを提案・案内します。

オンライン

  • 地図データや地点検索データベースは、サーバーの更新に伴い自動的にバージョンアップされます。
  • SDKの各機能はネットワーク通信が必須のため、オフライン環境ではご利用になれません。

プローブデータの自動収集

  • 簡単な初期設定のみでプローブデータ(ナビゲーション情報や、モバイル端末からのセンサー、位置情報など)を収集できます。
  • 収集したプローブデータをもとに、移動の利便性向上やサービスの最適化を進め、ナビの精度向上はもちろん、新たな価値の創出にも役立てています。

このガイドの使用方法

このガイドは各章が独立しており、任意の順序で読むことができます。

  • サンプルアプリの動作確認や、SDKの組み込み方法については、「Get started」を参照してください。
  • 機能ごとの解説は、「UseCases」を参照してください。
  • 詳細なAPI仕様は、「API Reference」を参照してください。
  • 専門用語や固有名詞の解説は、「Glossary」を参照してください。
  • トラブルシューティングは、「Troubleshooting」を参照してください。

Get started

本ガイドの開発環境は、Android Studio Koala Feature Drop および Gradle8.7 を対象としています。
ソースコードは、本章ではKotlin、各機能の説明ではJavaで記述しています。

Note:

Android Studioの推奨バージョンについては、リリースノートを参照してください。
アプリの実行時は、エミュレーターではなく実機での動作確認を推奨します。

  • サンプルアプリ

    • SDKのサンプルアプリについて解説します。
  • 組み込みガイド

    • SDKの組み込みと、地図を表示してルートを探索・デモ走行を開始するまでを解説します。

ExampleApp

ExampleAppは、Android向けSDKの機能デモアプリです。
「UseCases」毎に項目が分かれており、本ガイドで解説した機能がそのまま動作するコードとして実装されています。

実行方法

  1. プロジェクトの準備

    Android_ExampleApplication.zip を解凍すると、ExampleApp のプロジェクトのフォルダが作成されます。
    解凍後のフォルダ

  2. SDKライブラリの準備

    android_aars.zip を解凍してください。この中に含まれる3つのAARライブラリが、SDKの利用に必要です。

    解凍後のフォルダ

  3. ライブラリの配置

    1で作成されたフォルダの Android-Sample/sampleapp/libs ディレクトリに、2で解凍した弊社が提供するライブラリを配置してください。 正しく配置できると、以下のようになります。

    Frameworkフォルダ

  4. プロジェクトの起動

    ライブラリが正しく配置できていれば、以下のような画面になります。

    起動直後の画面

  5. 初期化パラメータの設定

    Android-Sample/sampleapp/src/main/java/com/pioneer/android/sampleapp/Setting.java を開き、以下の認証キーを適切な値に置き換えてください。

     public class Setting {
         private static String apiKey = "YOUR_API_KEY"; // API KEY
         private static String trafficProviderKey = "YOUR_TRAFFIC_PROVIDER_KEY";// 交通情報プロバイダ認証キー
         private static String trafficProviderUserID = "YOUR_TRAFFIC_PROVIDER_USER_ID"; // 交通情報プロバイダユーザーID
    

    認証キーなどの情報が間違っていると、SDKの初期化に失敗し、地図の表示が行われません。

  6. アプリの実行

    Targetが sampleapp であることを確認し実行します。 起動直後のRun

    アプリ起動後、以下のような初期画面が表示されれば成功です。

    起動直後の画面

コードについて

Examples/All Examples以下に「UseCases」毎のサンプルが用意されています。

本ガイドと併せてご確認ください。

対応項目

Integration

この章では、SDKの新規プロジェクトへの組み込み方法と、地図表示およびルート探索の基本的な手順について解説します。
本章で紹介するコードは、ルート探索およびデモ走行に必要な最小限の内容となっています。
詳細な機能については、「UseCases」をご参照ください。

SDKの責務について

SDKは以下の機能を提供・管理します。

  • 自車位置更新処理
  • 地図描画、地図のジェスチャー検知、地図への線描画、地図へのアイコン描画処理
  • 地点検索処理とその結果の提供
  • ルート探索処理とその結果の提供
  • システム標準TTSを用いた音声によるルート誘導
  • 渋滞情報の取得処理とその結果の提供
  • プローブデータの収集

SDKが提供するGUI部品は、以下の2点のみです。

これ以外のGUI部品は、アプリ側で自由に構築できます。

Setup New Project

新しいプロジェクトを作成

  1. Android Studio を起動し、
    FileNewNew Project を選択します。
  2. テンプレートの選択
    Empty Views Activity を選択し、Next をクリックします。
  3. プロジェクトの設定
    以下の設定を行い、Finish をクリックします。
設定項目設定値
Name任意のプロジェクト名
Package name任意のパッケージ名
Save location任意の保存先
LanguageKotlin
Minimum SDKAPI Level 28 以上
Build Configuration LanguageGroovy DSL または Kotlin DSL
(以降の手順は Groovy DSL を使用)

SDKの配置

android_aars.zip を解凍し、以下のAARライブラリを取得します。

ライブラリ群

取得したライブラリをアプリの app/libs ディレクトリに配置します。
app/libs ディレクトリが存在しない場合は、新規作成してください。

ライブラリの配置場所

app/libs に配置するライブラリ:

  • MapSdk-release.aar
  • pioneernavisdk-release.aar
  • probedatasdk-release.aar

app/build.gradleの設定

SDKの導入に必要な 依存関係、APIレベル、View Binding の設定 を追加します。

依存関係の設定

dependencies ブロックに以下の内容を追加してください。

dependencies {
    ...
    implementation files("libs/pioneernavisdk-release.aar")
    implementation files("libs/MapSdk-release.aar")
    implementation files("libs/probedatasdk-release.aar")
    implementation 'com.google.android.gms:play-services-location:21.0.1'
    implementation 'com.google.protobuf:protobuf-javalite:3.21.1'
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'com.google.code.gson:gson:2.9.0'
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
    def room_version = "2.5.0"
    implementation "androidx.room:room-runtime:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
}
Note:

各パッケージのバージョンはリリースノートに従って設定してください。

APIレベルの設定

コンパイルとターゲットのAPIレベルを35に設定します。

android {
    ...
    compileSdk 35
    defaultConfig {
        targetSdk 35
    }
}

View Binding の有効化

viewBinding ビルドオプションを true に設定します。

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

AndroidManifestによる権限設定

必要に応じて、以下の権限を設定してください。

権限名説明必須/任意
ACCESS_FINE_LOCATIONアプリが 正確な位置情報 にアクセスするために必要な権限です。必須
ACCESS_COARSE_LOCATIONアプリが おおよその位置情報 にアクセスするために必要な権限です。任意
ACTIVITY_RECOGNITIONユーザーの 身体活動(歩行、走行、運転など)を認識 するための権限です。
Android 10(API 29)以降 での権限となります。
プローブデータ収集で ACTIVITY_LOG_INFO を取得する場合は 必須 です。
任意(API 29 以上)
com.google.android.gms.permission.ACTIVITY_RECOGNITIONユーザーの 身体活動(歩行、走行、運転など)を認識 するための権限です。
Google Play開発者サービス(Activity Recognition API) を使用する場合はこちらの権限設定となります。
Android 9(API 28)以前 をターゲットにしている場合は、この権限を記載すると 自動的に android.permission.ACTIVITY_RECOGNITION が付与されます
プローブデータ収集で ACTIVITY_LOG_INFO を取得する場合は 必須 です。
任意(API 28 以下)
Note:

位置情報の権限の設定方法の詳細は、Google Developersのこちらを、アクティビティの権限の設定方法詳細はこちらをご確認ください。

AndroidManifest.xmluses-permission を追加して権限を設定します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- 位置情報の取得 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    <!-- アクティビティ認識 -->
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

    ...
</manifest>

以上でプロジェクトの設定は完了です。
続いて、SDKの初期化と地図表示を説明します。

Initialize and DisplayMap

地図描画用レイアウトの準備

プロジェクト生成時に用意された activity_main.xml を編集し、地図描画用のエリアを確保します。
具体的には、FrameLayout を追加し、リソース ID を map に設定してください。
なお、不要な TextView(Hello world!) は削除してください。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

初期化の流れ

地図を表示するために、以下の手順で初期化を行います。

  1. Activityの初期化
  2. SDKの初期化
  3. 地図の初期化

1. Activityの初期化

コンポーネントのインポート

必要なコンポーネントを MainActivity.kt に import します。

import android.content.Context
import android.provider.Settings;
import android.provider.Settings.Secure.ANDROID_ID
import com.pioneer.android.mpa.ApiKeyInfo
import com.pioneer.android.mpa.CalcRouteListener
import com.pioneer.android.mpa.Common
import com.pioneer.android.mpa.DemoRunSetting
import com.pioneer.android.mpa.GeoCoordinate
import com.pioneer.android.mpa.Map
import com.pioneer.android.mpa.MapSetting
import com.pioneer.android.mpa.Navi
import com.pioneer.android.mpa.NaviInitInfo
import com.pioneer.android.mpa.NaviInitListener
import com.pioneer.android.mpa.OnMapEventListener
import com.pioneer.android.mpa.RouteOptions
import com.pioneer.android.mpa.RoutePlan
import com.pioneer.android.mpa.SupportMapFragment
import com.pioneer.android.mpa.GuidePointResult
import com.pioneer.android.mpa.ProbeDataSettingInfo
import com.pioneer.android.mpa.ProbeDataSettingInfo.DataType
import com.pioneer.android.mpa.RunInfoListener
import com.pioneer.android.mpa.ServerSettingInfo
import com.pioneer.android.mpa.SetupInfo
import com.pioneer.android.mpa.StartGuidanceListener
import com.pioneer.android.mpa.UserSettingResultListener

ViewBindingの設定

MainActivity クラスのメンバに ActivityMainBinding を追加します。

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    ...

onCreate 内でbindingを設定します。
元々記述されている setContentView 以下の処理は削除してください。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
Note:

ActivityMainBinding を使用するには、以下のようにパッケージをimportしてください。

例:

import com.example.myfirstnavigation.databinding.ActivityMainBinding

※アプリのパッケージ名に合わせて修正してください。

2. SDKの初期化

SDK初期化手順の詳細は、「Initialize」 を参照してください。
ここでは、地図表示に必要な最小限のコードを説明します。

onCreate 内で、initializeNaviinitializeMap を呼び出します。

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        initializeNavi(applicationContext)
        initializeMap()
    }

MainActivityinitializeNavi 関数を追加し、初期化処理を実装します。

    private fun initializeNavi(context: Context) {
        val initInfo = NaviInitInfo(context)
        val apiKeyInfo = ApiKeyInfo();
        apiKeyInfo.setApiKey(API_KEY); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderKey(PROVIDER_KEY); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderUserID(USER_ID); // 具体的なID(文字列)については営業窓口までお問い合わせください。
        initInfo.setServerSettingInfo(ServerSettingInfo(apiKeyInfo));

        // UserID(このIDを元にクラウドの設定やルート保存が行われるためユニークなIDを推奨)
        val userID = "MyAppName" + Settings.Secure.getString(context.contentResolver, ANDROID_ID)
        initInfo.setUserID(userID);

        Navi.getInstance().initialize(initInfo) { errorCode, naviInitResult ->
            if (errorCode == NaviInitListener.ErrorCode.NONE) {
                Navi.getInstance().mobileAppLifecycle = lifecycle
            }
        }
    }
Note:

NaviInitInfo.userID は、アプリ内でユニークな値を設定してください。 弊社クラウド内でこの userID を元に状態管理が行われるため、単純な test 等のIDにしてしまうと、他のユーザーと重複し、正常動作しない可能性があります。

3. 地図の初期化

地図操作用の map オブジェクトを MainActivity に追加します。

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var map: Map
    ...

地図の描画領域はSupportFragmentを使用し、既存のFragmentと置き換えることでSDKが自動的に地図更新できるようになります。
ここでは先述のFrameLayoutをgetSupportFragmentManager を利用して置き換えてみます。

MainActivityinitializeMappostOnInitializeMap の2つの関数を追加します。

    // 地図の初期化
    private fun initializeMap() {
        val mapSetting = MapSetting()
        mapSetting.setMapStyle(Map.MapStyle.DEFAULT)

        // Create fragment
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.map, SupportMapFragment.newInstance(), "supportMapFragment")
        transaction.commitNow()
        val supportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?

        supportMapFragment?.initialize(mapSetting, object : OnMapEventListener {
            override fun onInitializationCompleted(errorCode: OnMapEventListener.ErrorCode) {
                postOnInitializeMap(errorCode, supportMapFragment)
            }

            override fun onMapModeChanged(mapMode: Map.MapMode) {}
        })
    }

    // 地図初期化完了後の処理
    private fun postOnInitializeMap(errorCode: OnMapEventListener.ErrorCode, supportMapFragment: SupportMapFragment) {
        if (errorCode != OnMapEventListener.ErrorCode.NONE) {
            return
        }

        map = supportMapFragment.map!!
        Navi.getInstance().attach(map)
    }

アプリを実行すると、東京都庁を中心に地図が表示されます。
現在位置と違う地図を出している状態ですが、この時点では正常です。

地図のみ描画

Note:

Androidのシステムが地図表示用のActivityを再作成すると地図が再初期化されるため、再作成されないようにすることを推奨します。
例えば、AndroidManifest.xmlで対象のActivityにandroid:configChange属性を設定することで、端末回転時の再生成を防げます。

    <activity 
        android:name="com.example.myfirstnavigation.MyActivity"
+       android:configChanges="screenSize|orientation"
        ...

端末回転以外の値についてはこちらをご確認ください。

自車位置を特定する

アプリ実行中に権限を変更したい場合、Google Developersのこちらの記事を参考にしてください。

ここでは手動で権限を変更する方法を採用します。
アプリを終了し、アプリの設定から位置情報権限を許可してください。

SDK初期化完了後に Navi.startPositioning() を呼び出すと、デバイスの位置が地図に反映されます。

    private fun initializeNavi(context: Context) {
        val initInfo = NaviInitInfo(context)
        ...

        Navi.getInstance().initialize(initInfo) { errorCode, naviInitResult ->
            if (errorCode == NaviInitListener.ErrorCode.NONE) {
                Navi.getInstance().mobileAppLifecycle = lifecycle
+               Navi.getInstance().startPositioning()
            }
        }
    }

起動後に地図を自車位置中心に移動する

自車位置を中心に地図を描画し続けるには、Map.setMapMode() による描画指定が必要です。

postOnInitializeMap 内で、以下のように設定してください。

    private fun postOnInitializeMap(errorCode: ErrorCode, supportMapFragment: SupportMapFragment) {
        if (errorCode != ErrorCode.NONE) {
            return
        }

        map = supportMapFragment.map
        Navi.getInstance().attach(map)
+       map.mapMode = Map.MapMode.NORTH_UP // 北を画面上部にします
    }

これで起動完了とともに自車位置を中心に地図が描画されるようになります。

自車位置中心

地図の制御方法の詳細は「Camera Control」を参照してください。

Note:

もし地図が東京都庁付近のままであれば、アプリの位置情報権限が付与されていない可能性があります。

以上でSDKの初期化と地図表示は完了です。
続いて、ルート探索と誘導開始を説明します。

New Route and Guide

ルートを探索して案内を開始する

ルート探索の詳細は「Route」を参照してください。
ここでは、地図を長押しした地点へのルートを探索し、案内を開始する最小限の手順を説明します。

(1) 地図の長押しを検知する

地図の長押しを検知するために、Map.addOnMapLongClickListener でリスナを登録します。

    private fun postOnInitializeMap(errorCode: ErrorCode, supportMapFragment: SupportMapFragment) {
        if (errorCode != ErrorCode.NONE) {
            return
        }

        map = supportMapFragment.map!!
        Navi.getInstance().attach(map)
        map.mapMode = Map.MapMode.NORTH_UP // 北を画面上部にします
+       map.addOnMapLongClickListener {point ->
+           false
+       }
    }

(2) ルート探索とナビゲーションの開始

長押しされた地点へルート探索を行うため、startNavigation() 関数を追加します。

    private fun startNavigation(goal: GeoCoordinate) {
        val routePlan = RoutePlan()
        routePlan.endPoint = goal
        routePlan.routeOptions = RouteOptions()
        Navi.getInstance().calculateRoute(routePlan) { errorCode, calcRouteResult ->
            if (errorCode == CalcRouteListener.ErrorCode.NONE) {
                // startGuidanceを呼び出すことでルートが確定し、案内が始まります。
                Navi.getInstance().startGuidance { startGuidanceErrorCode: StartGuidanceListener.ErrorCode, guidePointResult: GuidePointResult? ->
                    if (startGuidanceErrorCode == StartGuidanceListener.ErrorCode.NONE) {
                        // 案内開始後の処理(オプション)
                    }
                }
            }
        }
    }

長押しされた地点に対して startNavigation() を呼び出します。

        map.addOnMapLongClickListener {point ->
+           startNavigation(point)
            false
        }

(3) 誘導音声の有効化

誘導音声の出力を有効化するため、NaviInitListener.onInitCompleted() 内で Navi.startVoiceEngine() を呼び出します。

    private fun initializeNavi(context: Context) {
        /** 省略 **/

        Navi.getInstance().initialize(initInfo) { errorCode, naviInitResult ->
            if (errorCode == NaviInitListener.ErrorCode.NONE) {
                Navi.getInstance().mobileAppLifecycle = lifecycle
                Navi.getInstance().startPositioning()
+               Navi.getInstance().startVoiceEngine { }
            }
        }
    }

これで地図を長押しした地点へのルート案内が可能になります。

ルート探索

デモ走行で誘導音声を確認する

SDKは、机上で動作確認するための手段として、デモ走行(擬似走行)機能を提供しています。

(1) デモ走行の開始

startDemoRun() 関数を追加し、デモ走行を実行します。

    private fun startDemoRun() {
        val demoRunSetting = DemoRunSetting()
        demoRunSetting.demoType = Common.DemoType.AUTO
        demoRunSetting.isAutoRepeat = true
        Navi.getInstance().startDemoRun(demoRunSetting)
    }

(2) 案内開始時にデモ走行を開始

StartGuidanceListener.onCompleted() 内で startDemoRun() を呼び出します。

    private fun startNavigation(goal: GeoCoordinate) {
        val routePlan = RoutePlan()
        routePlan.endPoint = goal
        routePlan.routeOptions = RouteOptions()
        Navi.getInstance().calculateRoute(routePlan) { errorCode, calcRouteResult ->
            if (errorCode == CalcRouteListener.ErrorCode.NONE) {
                // startGuidanceを呼び出すことでルートが確定し、案内が始まります。
                Navi.getInstance().startGuidance { startGuidanceErrorCode: StartGuidanceListener.ErrorCode, guidePointResult: GuidePointResult? ->
                    if (startGuidanceErrorCode == StartGuidanceListener.ErrorCode.NONE) {
+                       startDemoRun()
+                       // 地図を自車位置中心に戻します
+                       map.mapMode = Map.MapMode.NORTH_UP
+                       // 自車位置周辺地図がわかりやすい拡大率に戻します
+                       map.setZoomLevel(15.0)
                    }
                }
            }
        }
    }

デモ走行機能の詳細は「Demo Run」を参照してください。

位置情報更新イベントの受信

SDKからの通知を受け取るために、走行情報更新イベントリスナー(RunInfoListener)を設定します。

    // 走行情報更新イベントリスナーを追加
    Navi.getInstance().addRunInfoListener(object : RunInfoListener {
        override fun onUpdate() {
        }
    })

onUpdate() の通知のタイミングで、Navi.getInstance().runInfo で最新の走行情報を取得することができます。

    // 走行情報更新イベントリスナーを追加
    Navi.getInstance().addRunInfoListener(object : RunInfoListener {
        override fun onUpdate() {
+            val runInfo = Navi.getInstance().runInfo

+            println("現在の速度: ${runInfo.ownCarInfo.velocity} km")
+            println("次の誘導地点まで: ${runInfo.nextGuidePoint.distance} m")
+            println("目的地まで: ${runInfo.destinationInfo.distance} m あと ${runInfo.destinationInfo.time / 60} 分")
        }
    })

ユーザー設定

ユーザー設定については、「User Setting」 を参照してください。
また、ナビモードをレーンバイレーン案内 に設定すると、パイオニア独自の走行車線を案内するモードになります。

        val setupInfo = SetupInfo()
        setupInfo.naviMode = Common.NaviMode.LANE_BY_LANE

        Navi.getInstance().setSetupInfo(
            setupInfo
        ) { errorCode ->
            if (errorCode == UserSettingResultListener.ErrorCode.NONE) {
                // 設定成功
            } else {
                // 設定失敗
            }
        }

なお、この設定は「SDKの初期化」 で設定したユーザーID毎に保存されます。

以上でSDKを利用したアプリを構築するための基礎知識についての解説は完了です。
本章で解説した機能の詳細や他の機能に関しては、「User Cases」 をご確認ください。

プローブデータの収集設定を行う場合は、プローブデータの収集 をご確認ください。

Collect ProbeData

プローブデータの収集を行う

プローブデータの収集設定は Navi.initialize() のタイミングで行います。 まず、以下のように ProbeDataSettingInfo を作成し NaviInitInfo.setProbeDataSettingInfo() で指定します。

    // Naviの初期化
    private fun initializeNavi(context: Context) {
        val initInfo = NaviInitInfo(context)
        val apiKeyInfo = ApiKeyInfo();
        apiKeyInfo.setApiKey(API_KEY); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderKey(PROVIDER_KEY); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderUserID(USER_ID); // 具体的なID(文字列)については営業窓口までお問い合わせください。
        initInfo.setServerSettingInfo(ServerSettingInfo(apiKeyInfo));

        // UserID(このIDを元にクラウドの設定やルート保存が行われるためユニークなIDを推奨)
        val userID = "MyAppName" + Settings.Secure.getString(context.contentResolver, ANDROID_ID)
        initInfo.setUserID(userID);

        // プローブデータの設定
+       var probeDataSettingInfo = ProbeDataSettingInfo()
+       initInfo.setProbeDataSettingInfo(probeDataSettingInfo)

        Navi.getInstance().initialize(initInfo) { errorCode, naviInitResult ->
            if (errorCode == NaviInitListener.ErrorCode.NONE) {
                Navi.getInstance().mobileAppLifecycle = lifecycle
                Navi.getInstance().startPositioning()
                Navi.getInstance().startVoiceEngine { }
            }
        }
    }

次に、ProbeDataSettingInfocollectDataTypeList で収集するデータを設定します。

ここでは NAVI_INFOROUTE_ACTION_LOG を収集します。

    // Naviの初期化
    private fun initializeNavi(context: Context) {
        val initInfo = NaviInitInfo(context)

        /** 省略 **/

        // プローブデータの設定
        var probeDataSettingInfo = ProbeDataSettingInfo()
+       probeDataSettingInfo.collectDataTypeList = listOf(DataType.NAVI_INFO, DataType.ROUTE_ACTION_LOG)
        initInfo.probeDataSettingInfo = probeDataSettingInfo

        /** 省略 **/
    }

以上で収集設定は完了です。

収集を開始するために、Navi.initialize() の初期化完了後に Navi.getInstance().startCollectProbeData() を呼び出してください。
このメソッドを呼び出すと、自動的にプローブデータの収集が開始されます。

実際の運用時は、ユーザーに対して情報収集の旨を通知した上で実施してください。

    // Naviの初期化
    private fun initializeNavi(context: Context) {
        val initInfo = NaviInitInfo(context)

        /** 省略 **/

        // プローブデータの設定
        var probeDataSettingInfo = ProbeDataSettingInfo()
        probeDataSettingInfo.collectDataTypeList = listOf(DataType.NAVI_INFO, DataType.ROUTE_ACTION_LOG)
        initInfo.probeDataSettingInfo = probeDataSettingInfo

        Navi.getInstance().initialize(initInfo) { errorCode, naviInitResult ->
            if (errorCode == NaviInitListener.ErrorCode.NONE) {
                Navi.getInstance().mobileAppLifecycle = lifecycle
                Navi.getInstance().startPositioning()
                Navi.getInstance().startVoiceEngine { }
+               Navi.getInstance().startCollectProbeData()
            }
        }
    }

以上でプローブデータの収集設定は完了です。

プローブデータの収集についての詳細は、ProbeDataをご確認ください。

用語集


案内地点 (Guide point)

案内地点とは、ルート通りに進行するために案内が必要な道路上の地点のことです。

詳細はルートと案内地点、通過交差点の関係をご覧ください。

通過交差点 (Pass point)

通過交差点とは、交差点・分岐・踏切などの何らかの案内可能な特徴を持った道路上の地点のことです。

レーンバイレーン案内 (Lane by lane guide)

レーンバイレーン案内とは、車線単位での案内情報を提供し、運転者がどの車線を走行すべきか、または車線変更が必要なタイミングを判断できるようサポートする誘導方式です。

並走道路

並走道路とは、異なる路線の道路が極めて近い距離で敷設され、同一方向に走行している道路のことです。

例えば次のような道路です:

  • 高速高架道路と、その下の一般道
  • 高速道路と、そのすぐ脇にある一般道

ルートアドバイザー (Route advisor)

ルートアドバイザーとは、ルート案内中に運転者へ最適な代替経路を提案し、より良いルートを提供する機能のことです。

VICS

VICS(ビックス)とは、渋滞や交通規制などの道路交通情報を、 FM多重放送やビーコンを使ってリアルタイムにカーナビに届けるシステムのことです。

SDKはオンデマンドVICSによりVICS情報を取得します。

VICS情報

VICS情報とは、VICSから得られる以下のデータのことです。

  • 事象・規制情報
  • 渋滞旅行時間リンク情報 (どの道路がどのくらい通過に時間がかかるのか)
  • サービスエリア(SA)・パーキングエリア(PA)情報
  • 駐車場情報

オンデマンドVICS

オンデマンドVICSとは、オンデマンドVICS専用サーバーに接続し、VICS情報を取得する機能のことです。
取得できる情報はビーコン情報と同じ種類の情報です。

プローブ渋滞情報 (Probe traffic information)

プローブ渋滞情報とは、パイオニアが独自に収集した車両走行データをもとに算出された渋滞情報のことです。

ジオコーディング (Geocoding)

ジオコーディングとは、住所や地名を緯度・経度の値に変換する処理のことです。

逆ジオコーディング (Reverse Geocoding)

逆ジオコーディングとは、緯度・経度の値を住所やPOIなどの地図情報に変換する処理のことです。

POI (Point of Interest)

POIとは、Point of Interestの略称のことです。
直訳すると興味のある地点ですが、カーナビにおいては店舗や施設を意味します。

ルートプロフィール (Route profile)

ルートプロフィールとは、出発地から目的地まで経路上にある道路名、区間距離、有料道を使用する場合の料金など、ルートに関する詳細情報を確認するための機能のことです。

ヘディングアップ (Heading up)

ヘディングアップとは、地図画面上で常に進行方向が上になるように地図を表示することです。

ノースアップ (North up)

ノースアップとは、地図画面上で常に北が上になるように地図を表示することです。

デモ走行 (Demo running)

デモ走行とは、実際に道路を走行する事なく、設定したルート上を自車が出発地から目的地まで擬似的に走行させる機能のことです。

ログ走行 (Log running)

ログ走行とは、保存したログ走行ファイルから走行を再現する機能のことです。

マップマッチング (Map matching)

マップマッチングとは、現在走行中の道路を特定するプロセスのことです。

予測進路 (Predicted route)

予測進路とは、案内中ルートがないときに自車がどの道路を進むのか予測した進路のことです。

推定速度 (Estimated velocity)

推定速度とは、特にトンネル内などGPS信号が不安定な環境下で、マッチングずれを軽減するために推定した自車の進路・速度のことです。

オンロード (OnRoad)

オンロードとは、自車が道路上を走行している状態のことです。

オフロード (OffRoad)

オフロードとは、自車が道路上を走行していない状態のことです。
駐車場内や、地図データにない道路を走行している場合にこの状態になります。

オンルート (OnRoute)

オンルートとは、自車が案内中ルートに沿って走行している状態のことです。

オフルート (OffRoute)

オフルートとは、自車が案内中ルートから逸れて走行している状態のことです。
この時、オンロードの場合はオートリルートにより経路の再探索が行われます。

UseCases

この章ではSDKの各機能の詳細をそれぞれ説明します。

Setup

詳細は各機能のガイドを参照して下さい。

Initialize

SDK使用時はナビ機能(Navi),地図表示機能(SupportMapFragment)の初期化が必要です。

各機能のInitializeでは認証情報が必要になるため、次のように関数化しておくと便利です。
本章では関数化されている前提で各機能のInitializeタイミングや制約について紹介します。

    private ServerSettingInfo createServerSettingInfo() {
        ApiKeyInfo apiKeyInfo = new ApiKeyInfo();
        apiKeyInfo.setApiKey(Setting.getApiKey()); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderKey(Setting.getTrafficProviderKey()); // 具体的なキー(文字列)については営業窓口までお問い合わせください。
        apiKeyInfo.setTrafficProviderUserID(Setting.getTrafficProviderUserID()); // 具体的なID(文字列)については営業窓口までお問い合わせください。
        return new ServerSettingInfo(apiKeyInfo);
    }

ナビ機能(Navi)

Initializeタイミング

Navi.initialize()を呼ぶタイミング

  • アプリ起動時
  • NaviInitInfoのユーザー切り替え時

initialize(NaviInitInfo, NaviInitListener)による初期化完了(onInitCompleted受信)後にNaviクラスが使用可能になります。
検索機能(SearchJPクラス)についてもこのタイミングで使用可能になります。

Note:

初期化結果のNaviInitResult.getRouteResult()で案内中ルートを取得できた場合、restoreRoute(GetRouteDataListener)により案内中ルートを復元できます。

初期化時設定項目 

初期化時に設定が必要な項目は以下の通りです。

NaviInitInfoの設定内容関数必須/任意
認証情報setServerSettingInfo必須
ユーザーIDsetUserID必須
ユーザー切替え有無setChangeUser任意
走行ログアップロード設定setLogUploadEnabled任意
ルートプロフィール情報取得要否setNeedRouteProfileInfo任意
データ更新イベントリスナーsetDataUpdateListener任意
認証状態の変化通知イベントリスナーsetAuthenticationStatusChangedListener任意
走行軌跡の収集モードsetDriveTrackingCollectionMode任意
走行軌跡の収集上限setDriveTrackingCollectionCount任意
ユーザー設定情報setSetupInfo任意
プローブデータ収集設定setProbeDataSettingInfo任意
Note:UserIDに関して

userID にはアプリ内でユニークな値を設定してください。 弊社クラウド内でこの userID を元に状態管理が行われるため、単純な test 等のIDにしてしまうと他のユーザーと重複してしまい正常に動作しない可能性があります。

Naviの設定内容関数必須/任意
デバイスの位置情報に基づく
現在位置の更新開始
startPositioning(PositioningSetting)必須
ライフサイクル設定setMobileAppLifecycle(Lifecycle)必須
音声案内エンジンの初期化startVoiceEngine(VoiceEngineInitListener)任意
誘導情報更新
イベントリスナー追加
addGuidePointDataChangedListener
(GuidePointDataChangedListener)
任意
走行情報更新
イベントリスナー追加
addRunInfoListener(RunInfoListener)任意
音声案内
イベントリスナー追加
addGuideEventListener(GuideEventListener)任意
別道路切換完了
イベントリスナー追加
addSwitchAnotherRoadResultListener
(SwitchAnotherRoadResultListener)
任意
案内地点通過通知
イベントリスナー追加
addPassedGuidePointEventListener
(GuidePointPassedListener)
任意
立寄地到着
イベントリスナー追加
addWayPointArrivedListener
(WayPointArrivedListener)
任意
目的地到着
イベントリスナー追加
addDestinationArrivedListener
(DestinationArrivedListener)
任意
オートリルート
イベントリスナー追加
addAutoRerouteListener
(AutoRerouteListener)
任意
ルートアドバイザー
イベントリスナー追加
addRouteAdvisorListener
(RouteAdvisorListener)
任意
ハイウェイモード状態変更
イベントリスナー追加
addHighwayModeChangedListener
(HighwayModeChangedListener)
任意
案内中ルートの復元restoreRoute任意
NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());
initInfo.setServerSettingInfo(createServerSettingInfo());

// UserID(このIDを元にクラウドの設定やルート保存が行われるためユニークなIDを推奨)
String userID = "MyAppName" + Settings.Secure.getString(getApplicationContext().getContentResolver(), ANDROID_ID);
initInfo.setUserID(userID);

Navi.getInstance().initialize(initInfo, new NaviInitListener() {
    @Override
    public void onInitCompleted(ErrorCode errorCode, NaviInitResult naviInitResult) {
        if (errorCode == ErrorCode.NONE) {

            // 現在のデバイスの位置情報に基づく現在位置の更新を開始(Positioning機能をONに)する
            Navi.getInstance().startPositioning(new PositioningSetting())

            // ライフサイクル設定
            Navi.getInstance().setMobileAppLifecycle(getLifecycle());

            // 音声案内エンジン初期化
            Navi.getInstance().startVoiceEngine(new VoiceEngineInitListener() {
                @Override
                public void onInitCompleted(ErrorCode errorCode) {}
            });

            // 誘導情報(GuidePointList, PathPointList)更新イベントリスナーを追加
            Navi.getInstance().addGuidePointDataChangedListener(new GuidePointDataChangedListener() {
                @Override
                public void onChanged(Navi.GuidePointCreateStatus status) {
                }   
            });

            // 走行情報更新イベントリスナーを追加
            Navi.getInstance().addRunInfoListener(new RunInfoListener() {
                @Override
                public void onUpdate() {}
            });
            // 音声案内イベントリスナーを追加
            Navi.getInstance().addGuideEventListener(new GuideEventListener() {
                @Override
                public void onGuide(@NonNull Guidance guidance) {}
            });

            // 案内中ルートがある場合、ルート復元
            if (naviInitResult.getRouteResult() != null) {
                Navi.getInstance().restoreRoute(new GetRouteDataListener() {
                    @Override
                    public void onCompleted(@NonNull ErrorCode errorCode, @Nullable GetRouteDataResult getRouteDataResult) {
                    }
                });
            }
        } else {
            // Naviの初期化失敗 
            // エラー内容によりリトライやネットワークの接続状況確認メッセージ表示,サポートセンターに連絡など
        }
    }
});


地図表示機能(SupportMapFragment)

Initializeタイミング

SupportMapFragment.initialize()を呼ぶタイミング

  • アプリ起動時

initialize(MapSetting, OnMapEventListener)での初期化完了(onInitializationCompleted受信)後にgetMap()してMapクラスが使用可能になります。

初期化時設定項目 

初期化時に設定が必要な項目は以下の通りです。

MapSettingの設定内容関数必須/任意
認証情報setServerSettingInfo必須
地図スタイル設定setMapStyle任意
昼夜モード設定setDayNightMode任意

Mapの設定内容関数必須/任意
Naviオブジェクトに
MapオブジェクトをAttach
Navi.attach(Map)必須
長押しイベントリスナー追加addOnMapLongClickListener
(OnMapLongClickListener)
任意
短押しイベントリスナー追加addOnMapClickListener
(OnMapClickListener)
任意
地図上の移動イベントリスナー追加addOnMapMoveListener
(OnMapMoveListener)
任意
地図スケールイベントリスナー追加addOnMapScaleListener
(OnMapScaleListener)
任意
地図スケール変更
イベントリスナー追加
addOnMapScaleChangeListener
(OnMapScaleChangeListener)
任意
地図回転(方位)変更
イベントリスナー追加
addOnMapRotateChangeListener
(OnMapRotateChangeListener)
任意
地図チルト角(傾き)変更
イベントリスナー追加
addOnMapTiltChangeListener
(OnMapTiltChangeListener)
任意
ユーザーに追加されたアイコン
短押し通知リスナー追加
addOnIconClickListener
(OnIconClickListener)
任意
ルートの短押しイベントリスナー追加addOnRouteClickListener
(OnRouteClickListener)
任意
MapSetting mapSetting = new MapSetting();
mapSetting.setServerSettingInfo(createServerSettingInfo());
mapSetting.setMapStyle(Map.MapStyle.DEFAULT);

// MapFragment初期化
SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
supportMapFragment.initialize(mapSetting, new OnMapEventListener() {
    @Override
    public void onInitializationCompleted(ErrorCode errorCode) {

        if (errorCode == ErrorCode.NONE) {
            // getMap()してMapが使用可能
            Map map = supportMapFragment.getMap();

            // Naviのアタッチ
            Navi.getInstance().attach(map);

            // 長押しイベントリスナー追加
            map.addOnMapLongClickListener(new OnMapLongClickListener() {
                @Override
                public boolean onMapLongClick(GeoCoordinate point) {}
            });

            // 短押しイベントリスナー追加
            map.addOnMapClickListener(new OnMapClickListener() {
                @Override
                public boolean onMapClick(GeoCoordinate point) {}
            });

            // 地図スケール変更イベントリスナー追加
            map.addOnMapScaleChangeListener(new OnMapScaleChangeListener() {
                @Override
                public void onScaleChanged() {}
            });
        }
    }
});

User Setting

ナビの設定やルート探索条件のようなユーザーごとの設定値を切り替えるための方法を紹介します。

基本設定内容

SetupInfoでルート探索/案内時の設定をすることが可能です。

設定項目内容
ナビモードナビモードを[Lane by Laneモード/通常モード]で設定します。
車両料金区分有料道路料金の計算で使用する車両料金区分を[普通車/軽自動車/中型車/大型車/特大車]で設定します。
ETC接続ETC接続を[未接続/ETC/ETC2.0]で設定します。
ルート探索及び所要時間計算への渋滞考慮有無

ルート探索及び所要時間計算への渋滞考慮有無を[考慮する/考慮しない]で設定します。

RouteOptionsにも渋滞考慮有無の設定がありますが、後から設定した方を考慮してルート探索されます。

ルート探索における交通情報の規制考慮有無

ルート探索における交通情報の規制考慮有無を[考慮する/考慮しない]で設定します。

RouteOptionsにも規制考慮有無の設定がありますが、後から設定した方を考慮してルート探索されます。

ルート探索における時間規制考慮有無

ルート探索における時間規制考慮有無を[考慮する/考慮しない]で設定します。

RouteOptionsにも時間規制考慮有無の設定がありますが、後から設定した方を考慮してルート探索されます。

基本設定のサンプルコードは以下の通りです。

    SetupInfo setupInfo = new SetupInfo();
    setupInfo.setNaviMode(Common.NaviMode.NORMAL);
    setupInfo.setRatesClass(Common.RatesClass.STANDARD_SIZED_CAR);
    setupInfo.setEtcConnection(Common.ETCConnection.ETC);
    setupInfo.setCareJamToETA(Common.CareJamToETA.CONSIDER);
    setupInfo.setCareRegulation(Common.CareRegulation.CONSIDER);
    setupInfo.setCareTimeRegulation(Common.CareTimeRegulation.CONSIDER);
    
    Navi.getInstance().setSetupInfo(setupInfo, new UserSettingResultListener() {
        @Override
        public void onCompleted(ErrorCode errorCode) {
            if (errorCode == ErrorCode.NONE) {
                // 設定成功
            }
            else {
               // 設定失敗
            }
        }
    });

Navi Setting

ナビ機能の有効・無効などの設定を切り替えるための方法を紹介します。
User Settingとは異なり、ここで設定した値は保存されません。
アプリケーション側で設定値を保存し、起動時に再設定するなどの対応をしてください。

設定一覧

設定項目対応関数デフォルト
走行ログ保存setLogSaveEnabledfalse(保存しない)
走行ログアップロードsetLogUploadEnabledtrue(アップロードする)
一時停止案内setStopSignGuidanceEnabledtrue(注意案内する)
踏切案内setRailCrossGuidanceEnabledtrue(注意案内する)
オービス案内setOrbisGuidanceEnabledtrue(注意案内する)
合流案内setJoinGuidanceEnabledtrue(注意案内する)
右左折レーン案内setExpertLaneGuidanceEnabledtrue(注意案内する)
オフルート到着判定setCheckOffRouteEnabledtrue(到着判定する)
オートリルートsetAutoRerouteEnabledtrue(リルートする)
ルートプロフィール情報取得要否setNeedRouteProfileInfofalse(取得しない)
通信設定setNetworkEnabledtrue(通信する)

例えば注意案内系を全て無効にしたい場合は以下のように設定します

Navi.getInstance().setStopSignGuidanceEnabled(false);
Navi.getInstance().setRailCrossGuidanceEnabled(false);
Navi.getInstance().setOrbisGuidanceEnabled(false);
Navi.getInstance().setJoinGuidanceEnabled(false);
Navi.getInstance().setExpertLaneGuidanceEnabled(false);

各設定が及ぼす影響

走行ログ保存

Log runを参照してください。

走行ログアップロード

およそ5分に1回のペースで弊社のサーバーにログ走行データをアップロードします。
弊社ではマップマッチングの不具合の解析等でこのデータを使用します。

一時停止案内 / 踏切案内 / オービス案内 / 合流案内 / 右左折専用レーン案内

Caution Guideを参照してください。

オフルート到着判定

Locationの到着判定の章を参照してください。

オートリルート

Locationのオートリルートの章を参照してください。

ルートプロフィール情報取得要否

出発地から行き先までの間に通る道路名や区間距離、有料道を使用する場合の料金等の情報を要求します。
情報はRouteResult.getRouteProfileInfoList()から取得できます。
RouteProfileInfoの詳細はAPI Referenceをご覧ください。

通信設定

クラウドとの通信を行います。

Map

地図は視点の変更、デザインを変更、地図上の独自のアイコンを追加、等を行うことにより表示を変更することが可能です。また、地図や地図上の描画物に対してタップやジェスチャーによる操作を行うことができます。この章ではそれらの変更や操作について紹介します。

  • 地図表示の変更

    • 地図モードや、カメラを使った地図表示の変更方法の紹介です。
  • アイコンの管理

    • 地図上にアイコンを表示し管理する方法の紹介です。
  • ジェスチャーの管理

    • 地図や地図上の描画物に対して行うタップやジェスチャーを管理する方法の紹介です。
  • 地図デザインの変更

    • 地図上の各種デザインを変更する方法の紹介です。
  • 走行軌跡

    • 地図上に表示する走行軌跡についての紹介です。
  • 航続可能領域

    • 航続可能な領域を地図上に表示する方法の紹介です。
  • 目的地目安線

    • 目的地がどの向きにあるのかを表示する方法の紹介です。
  • オートフリーズーム

    • 案内地点までの道沿い距離で自動で地図スケールを変更するオートフリーズームの紹介です。

詳細は各機能のガイドを参照して下さい。

Camera Control

この章では地図の表示変更の方法を紹介します。

マップモード

マップモードは自車位置情報と地図の連動方法に関するモードで以下の3種類があります。

位置情報と地図の連動マップモード動作
連動するHEADING_UP地図の中心座標と回転角が両方とも位置情報と連動
連動するNORTH_UP地図の中心座標のみ位置情報と連動。回転角は北固定
連動しないSCROLL地図の中心座標は連動しない

Map.setMapModeにより上記のマップモードを変更することができます。

地図の表示変更

一般的な3DCGと同様にカメラの位置やその要素を変更することで地図の表示を変更することができます。変更可能な要素は以下の通りです。

要素変更関数
中心座標Map.setCenterCoordinate()
回転角Map.setOrientation()
ズームレベルMap.setZoomLevel()
Map.zoomIn/Out()
Map.zoomTo()
傾きMap.setTilt()
パディングMap.setPadding()

中心座標

設定することで地図の表示の中心座標を変更することができます。

回転角

設定することで地図を回転させることができます。

orientation

ズームレベル

設定することで地図の縮尺を変更することができます。

zoom

Map.setZoomLevel()ではズームレベル指定してズームすることができます。

Map.zoomIn/Out()では呼び出し毎にズームレベル0.5単位で拡大、縮小することができます。ズームの単位を変更することも可能です。

Map.zoomTo()ではズームレベルではなく表示領域を指定します。

傾き

設定することで地図の傾きを変更することができます。

tilt

パディング

設定することで地図の上下左右のパディング領域を変更することができます。

setOrientation(), setCenterCoordinate()等の地図の表示を変更する関数はパディング領域を除いた領域に適用されます。 例えば地図画面の上部に別のUI部品を表示した際にその分、上部にパディングを設定することでユーザーから見た地図の中心を適切に保つことが可能です。

padding

CameraOptionsによる表示変更

CameraOptionsオブジェクトに各種設定を行い、Map.moveToPoint()に渡すことで複数のカメラ要素を同時に設定し、地図の表示を変更する事ができます。

CameraOptions cameraOptions = new CameraOptions();
GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);

cameraOptions.setCenter(position);
cameraOptions.setLevel(13.5);

map.moveToPoint(cameraOptions);

地図の表示変更通知

地図の表示変更をリスナーにより検知することができます。変更内容と対応するリスナーは以下の通りです。

変更内容リスナーリスナー追加関数
回転角変化OnMapRotateChangeListeneraddOnMapRotateChangeListener
傾き変化OnMapTiltChangeListeneraddOnMapTiltChangeListener
縮尺変化OnMapScaleChangeListeneraddOnMapScaleChangeListener

Icon Control

この章ではアイコンを地図上に表示し、制御するための方法を紹介します。

アイコンの表示方法

Map.addUserIcon()を呼び出すことで、アプリは任意のアイコンを地図上に表示することができます。

icon

例えばユーザーが地図の特定の場所を長押した際にその場所にアイコンを表示したい場合は以下のようになります。

  1. addOnMapLongClickListenerOnMapLongClickListenerを登録します。
  2. OnMapLongClickListenerで長押しした場所の緯度経度を取得しMapIconオブジェクトを生成します。
  3. 生成したMapIconオブジェクトをMap.addUserIcon()に渡します。
map.addOnMapLongClickListener(new OnMapLongClickListener() {
    @Override
    public boolean onMapLongClick(GeoCoordinate point) {
        MapIcon icon = new MapIcon();
        icon.setImageResource(R.drawable.icon); // アプリで用意するアイコン用画像のリソース
        icon.setID("icon_id");
        icon.setPosition(point);
        map.addUserIcon(icon);

        return false;
    }
});

アイコンのアンカーについて

アンカー(Anchor)とは、アイコンを地図上の特定の座標に正確に配置するための基準点のことです。

アンカーは、アイコンのどの部分を地図上の座標に合わせるかを決定します。 例えば、ピン型のアイコンを地図上に配置する場合、通常はピンの先端を座標に合わせます。 この場合、ピンの先端がアンカーポイントになります。

ピンの先端に限らずSDKでは、アイコンの中央、四隅、四辺の中央など合計9ヶ所のいずれかにアンカーを設定できます。これにより、用途に応じた柔軟なアイコン配置が可能になります。

アイコンの制御方法

Map.addUserIcon()含め、アイコンに関する主な制御関数は以下の通りです。

制御内容関数
アイコン追加Map.addUserIcon()
アイコン削除Map.deleteUserIcon()
Map.deleteAllUserIcon()
アイコン更新Map.updateUserIcon()
アイコン取得Map.getUserIcon()
Map.getAllUserIcon()

交差点拡大図に対してアイコン制御する場合は、以下の制御関数を使用します。
交差点拡大図については、「交差点拡大図」を参照してください。

制御内容関数
アイコン追加Map.addIntersectionUserIcon()
アイコン削除Map.deleteIntersectionUserIcon()
Map.deleteAllIntersectionUserIcon()
アイコン更新Map.updateIntersectionUserIcon()
アイコン取得Map.getIntersectionUserIcon()
Map.getAllIntersectionUserIcon()
Note:

アイコンの制御は追加時のMapIconオブジェクトのIDがキーとなるため、作成したアイコンのIDはアプリ内で保存する必要があります。

アイコンクリックイベント

アイコンに対するクリックは以下のOnIconClickListenerで検出することができます。

// アイコンクリック通知リスナー追加
map.addOnIconClickListener(new OnIconClickListener() {
    @Override
    public void onIconClick(IconKind kind, MapIcon icon) {
        // クリック時の処理を書く
    }
}

アイコン表示の更新

表示中のアイコンに対して、設定したMapIconの情報を更新することで、画像や表示位置などを更新することができます。 例えば、アイコンをタップして画像を更新する場合のサンプルコードは以下の通りです。

map.addOnIconClickListener(new OnIconClickListener() {
    @Override
    public void onIconClick(IconKind kind, MapIcon icon) {
        icon.setImageResource(R.drawable.large_icon);
        map.updateUserIcon(icon);
    }
}

アイコンの地図回転追随

アイコンは指定がなければ地図の回転角度によらず常に一定方向を向きますが、地図の回転角度に合わせてアイコンを自動回転させることもできます。

回転追随なし
地図回転追随なし

MapIcon icon = new MapIcon();
icon.setImageResource(R.drawable.MyFlag); // アプリで用意するアイコン用画像のリソース
icon.setIconAnchor(MapIcon.Icon_Anchor.ICON_ANCHOR_CENTER); // アイコンに合わせて設定してください
icon.setID("my flag");
icon.setPosition(point);
icon.setFollowMapRotation(false);
map.addUserIcon(icon);

回転追随あり
地図回転追随あり

MapIcon icon = new MapIcon();
icon.setImageResource(R.drawable.MyFlag); // アプリで用意するアイコン用画像のリソース
icon.setIconAnchor(MapIcon.Icon_Anchor.ICON_ANCHOR_CENTER);
icon.setID("my follow map rotation flag");
icon.setPosition(point);
icon.setFollowMapRotation(true);
map.addUserIcon(icon);

Note:

地図回転に追随させる場合、アンカーをアイコンの中心に置けるようにしてください。
地図回転追随時はアンカーの設定によらずアイコン中心を軸に回転しますので、そのようになっていないアイコンを使用したときに意図した位置からズレて表示されてしまいます。

プリセットアイコン

地図上のアイコンにはユーザーが表示するアイコン以外にも予めSDKで用意(プリセット)されているアイコンがあり、Map.changePresetIcon()によりそれらのアイコンの画像を変更することができます。

start icon

立ち寄り地のアイコンを変更する際のサンプルコードは以下の通りです。

MapIcon wayPointIcon = new MapIcon();
wayPointIcon.setImageResource(R.drawable.myWayPointIcon); // 変更する画像のリソース
map.changePresetIcon(Map.IconKind.ROUTE_STOPOVER1, wayPointIcon);

変更可能なプリセットアイコンの一覧はMap.IconKindに定義されています。

Note:

ユーザーが追加するアイコンと異なりプリセットアイコンは追加、削除することができません。アイコン画像の変更のみ可能です。

Tap & Gesture Control

この章では地図に対するユーザーの操作を検出する方法を紹介します。

タップ操作

地図のタップを検知する事ができます。検知可能な操作と対応するリスナーは以下の通りです。

操作リスナーリスナー追加関数
地図の単押しOnMapClickListenerMap.addOnMapClickListener
地図の長押しOnMapLongClickListenerMap.addOnMapLongClickListener

地図の操作検知

地図の操作検知のサンプルコードは以下の通りです。

map.addOnMapClickListener(new OnMapClickListener() {
    @Override
    public boolean onMapClick(GeoCoordinate point) {
        // pointにクリックした場所の緯度経度が格納されています
        return false;
    }
});

ジェスチャー

SDKでは地図に対するいくつかの複雑な動作(ジェスチャー)をサポートしています。サポートされている地図に対するユーザーのジェスチャーの種類は以下の通りです。

SCROLL_GESTURE

1本指でドラッグ・フリックし地図をスクロールします。

scroll

ROTATE_GESTURE

2本指を回転し地図を回転します。

rotate

TILT_GESTURE

2本指を前後にスライドし地図の傾きを変えます。

tile

QUICK_ZOOM_GESTURE

1本指でダブルタップしたままドラッグすることで地図を拡大、縮小します。

quick_zoom

DOUBLE_TAP_GESTURE, TWO_FINGER_TAP_GESTURE

1本指のダブルタップで地図を拡大し、2本指のダブルタッチで地図を縮小します。

double_tap

two_tap

PINCH_GESTURE

2本指でピンチ操作し地図を拡大、縮小します。

zoom

Map.setMapGesture()で各ジェスチャの設定の有効・無効を変更することが可能です。(デフォルト全て有効)

Map.setAllGesturesEnabled()で全てのジェスチャの有効・無効を一括で変更することもできます。

ジェスチャーの検出

リスナーを設定することで地図に対するユーザーのジェスチャーを検出することができます。ジェスチャーとそのリスナーの対応は以下の通りです。

ジェスチャーリスナーリスナー追加関数
SCROLL_GESTUREOnMapMoveListenerMap.addOnMapMoveListener
ROTATE_GESTUREOnMapRotateListenerMap.addOnMapRotateListener
TILT_GESTURE--
QUICK_ZOOM_GESTUREOnMapScaleListenerMap.addOnMapScaleListener
DOUBLE_TAP_GESTUREOnMapScaleListenerMap.addOnMapScaleListener
TWO_FINGER_TAP_GESTUREOnMapScaleListenerMap.addOnMapScaleListener
PINCH_GESTUREOnMapScaleListenerMap.addOnMapScaleListener
Note:

QUICK_ZOOM_GESTURE, DOUBLE_TAP_GESTURE, TWO_FINGER_TAP_GESTURE, ZOOM_GESTUREは全てOnMapScaleListenerで通知されます。

各リスナーではジャスチャーの開始、ジェスチャー中、終了がそれぞれ通知されます。例えばOnMapMoveListenerでそれぞれの通知を受け取るためのサンプルコードは以下の通りです。

map.addOnMapMoveListener(new OnMapMoveListener() {
    @Override
    public void onMoveBegin() {
        // 移動の開始
    }

    @Override
    public void onMove() {
        // 移動中
    }

    @Override
    public void onMoveEnd() {
        // 移動の終了
    }
});

Customize Map Design

この章では地図のデザインをカスタマイズする方法について紹介します。

カスタマイズ可能なデザイン

地図のデザインはカスタマイズが可能です。カスタマイズ可能なデザインは以下の通りです。

  • 昼夜モード
  • 住宅地図モード
  • 地図のスタイル
  • 自車マークのデザイン
  • ルート線のデザイン

昼夜モード

各地図スタイルやルート線のデザインは昼用と夜用のデザインをもっており、 Map.setDayNightMode()を実行することで昼夜モードを変更することができます。

夜モードに切り替えるコードは以下の通りになります。これにより地図スタイルやルート線のデザインが夜用のデザインになります。

map.setDayNightMode(Map.DayNightMode.NIGHT);

スタイル変更

Map.changeStyle()を実行することで地図デザインを変更することができます。

以下の2つのスタイルから選択できます。

スタイル名表示特徴
DEFAULT細街路の色を抑えるなど、検索結果や重畳する情報が見やすい地図スタイル
NAVIGATION走行中に必要な道路の情報を強調した、ナビゲーション案内中に適した地図スタイル

地図スタイルを誘導地図に切り替えるコードは以下の通りです。

map.changeStyle(Map.MapStyle.NAVIGATION);

地図レイヤーに関して

地図スタイルは以下のようなレイヤー構成になっており、ルート線や渋滞線のレイヤーは『道路ネットワーク』の上に挿入されます。

self

地図レイヤーの表示設定

レイヤーの一部はMap.changeLayerVisible()を実行することで表示・非表示を切り替えられます。

例えば、交差点名称と高速道路インターチェンジ、ジャンクションラベルを非表示にするサンプルコードは以下の通りです。

java.util.Map<Map.MapLayer, Boolean> layers = new HashMap<>();
layers.put(Map.MapLayer.HIGHWAY_IC_LABEL, false);
layers.put(Map.MapLayer.HIGHWAY_JCT_LABEL, false);
layers.put(Map.MapLayer.CROSSING_LABEL, false);
map.changeLayerVisible(layers);

未設定
未設定

非表示設定後
非表示設定後

Note:

ルート線の描画レイヤーを変更したい等の地図カスタマイズに関してはお問い合わせください。

住宅地図モード

地図上に建物名称や居住者名、番地などが詳しく表示されますが、これらのラベルは地図の回転に追従せず常に北を上にした情報になります。
住宅地図モード中はどのスタイルでも25mスケール以下で自動で住宅地図が表示され、住宅地図モードを終了するまで継続します。

住宅地図モードを開始するコードは以下の通りです。

Map.beginHousingMapDisplay(new Map.ShowHousingMapCompleteListener() {
    @Override
    public void onComplete(ErrorCode errorCode) {
    }
});

住宅地図モードを終了するコードは以下の通りです。

//  住宅地図の表示を解除
map.endHousingMapDisplay();
住宅地図モードの開始について:

Navi.initialize()にて住宅地図の契約情報を確認しています。
このため、住宅地図モードを開始するのは必ずNavi.initialize()完了以降、もしくはAuthenticationStatusChangedListener.onChange()にて契約情報の通知を受信以降に行なってください。

自車マークのデザイン変更

CarMarkerDesignを生成しMap.changeCarMarkerDesign()に渡すことで自車マークのデザインを変更することができます。

self

CarMarkerDesign carMarkerDesign = new CarMarkerDesign();
carMarkerDesign.setImage(AppCompatResources.getDrawable(getApplicationContext(), R.drawable.my_car_mark)); // 自車マークのリソース

map.changeCarMarkerDesign(carMarkerDesign);

ルート線のデザイン変更

地図上に描画されるルート線のデザインを変更することができます。

ルート種類毎のデザイン変更に使用する関数は以下の通りです。

ルート種別関数
案内中(Navi.startGuidance()後)ルートchangeGuidanceRouteDesign()
案内開始前(Navi.startGuidance()前)の複数ルート探索結果のルートchangeCalculateRouteDesign()
新ルート(ルートアドバイザー、ルート比較)changeNewRouteDesign()
旧ルート(ルートアドバイザー、ルート比較)changeOldRouteDesign()

デザイン例
案内中ルートと新ルートのデザイン例

一般道、有料道それぞれで別のデザインを設定することができます。

設定可能なデザイン

ルート線のデザインは

  • ルート本体用
  • ルート内側の縁取り用
  • ルート外側の縁取り用

に分かれており、それぞれ色、太さを設定することが可能です。
色については昼用と夜用を設定することが可能ですが、太さについては昼夜共通です。

太さは地図スケールごとに設定できます。 地図は広域になるに従って描画される道路が細くなりますので、狭域は太く、広域は細く設定すると自然なルート線表現となります。

route

SDKでは指定された色、太さの線を 外側縁取り用 > 内側縁取り用 > 本体用 の順番で描画する実装になっているため、内側の縁取り用の線を本体用の線より太くする必要があり、また外側の縁取り用の線を内側の縁取り用の線より太くする必要があります。

route_design

Note:

内側縁取り用が外側縁取り用より太い場合、外側縁取り用のルート線は隠れて見えなくなります。
同様に、本体用が縁取り用より太い場合、縁取り用のルート線は隠れて見えなくなります。

例えば有料道の案内中ルートの色、太さを変更するサンプルコードは以下の通りです。

RouteDesign tollDesign = new RouteDesign();
List<RouteWidth> routeWidthList = new ArrayList<>();
routeWidthList.add(new RouteWidth(9, 20, 22, new ScaleRange(ScaleLevel.SCALE_10m, ScaleLevel.SCALE_100m)));
routeWidthList.add(new RouteWidth(8, 16, 20, new ScaleRange(ScaleLevel.SCALE_200m, ScaleLevel.SCALE_500m)));
routeWidthList.add(new RouteWidth(6, 14, 18, new ScaleRange(ScaleLevel.SCALE_1km, ScaleLevel.SCALE_2km)));
routeWidthList.add(new RouteWidth(5, 12, 14, new ScaleRange(ScaleLevel.SCALE_5km, ScaleLevel.SCALE_500km)));
tollDesign.setWidth(routeWidthList);
tollDesign.setDayColor(new RouteColor(Color.valueOf(Color.RED), Color.valueOf(Color.GREEN), Color.valueOf(Color.BLUE))); // 昼色
tollDesign.setNightColor(new RouteColor(Color.valueOf(Color.LTGRAY), Color.valueOf(Color.DKGRAY), Color.valueOf(Color.GRAY))); // 夜色

map.changeGuidanceRouteDesign(tollRoadKind, tollDesign);

太さだけ初期値に戻したい場合のサンプルコードは以下の通りです。

RouteDesign tollDesign = new RouteDesign();
List<RouteWidth> routeWidthList = new ArrayList<>();
routeWidthList.add(new RouteWidth(8, 18, 20, new ScaleRange(ScaleLevel.SCALE_10m, ScaleLevel.SCALE_100m)));
routeWidthList.add(new RouteWidth(6, 14, 18, new ScaleRange(ScaleLevel.SCALE_200m, ScaleLevel.SCALE_500m)));
routeWidthList.add(new RouteWidth(5, 12, 16, new ScaleRange(ScaleLevel.SCALE_1km, ScaleLevel.SCALE_2km)));
routeWidthList.add(new RouteWidth(4, 9, 11, new ScaleRange(ScaleLevel.SCALE_5km, ScaleLevel.SCALE_500km)));
tollDesign.setWidth(routeWidthList);

map.changeGuidanceRouteDesign(tollRoadKind, tollDesign);
Note:

以下のルート線については、選択ルートと非選択ルートそれぞれに対してデザイン設定が必要です。

  • 案内開始前の複数ルート探索結果のルート
  • 新ルート(ルートアドバイザー、ルート比較)
  • 旧ルート(ルートアドバイザー、ルート比較)

交差点拡大図のルート線のデザイン

Map.changeIntersectionMapRouteDesign()により交差点拡大図のルート線のデザインを変更することができます。

交差点拡大図では図内の通過したルートは通過済みルート色で描画されます。

通過済みルート

ルート線のデザインに加えてこの通過済みルート線のデザインも変更可能です。
例えば一般道の交差点拡大図ルートの色、太さを変更するサンプルコードは以下の通りです。

IntersectionMapRouteDesign freeDesign = new IntersectionMapRouteDesign();

freeDesign.setWidth(new RouteWidth(10, 15, 20, null));
freeDesign.setDayColor(new RouteColor(Color.valueOf(Color.RED), Color.valueOf(Color.GREEN), Color.valueOf(Color.BLUE)));
freeDesign.setNightColor(new RouteColor(Color.valueOf(Color.LTGRAY), Color.valueOf(Color.DKGRAY), Color.valueOf(Color.GRAY)));
freeDesign.setPassedDayColor(new RouteColor(Color.valueOf(Color.CYAN), Color.valueOf(Color.MAGENTA), Color.valueOf(Color.YELLOW)));
freeDesign.setPassedNightColor(new RouteColor(Color.valueOf(Color.BLACK), Color.valueOf(Color.WHITE), Color.valueOf(Color.TRANSPARENT)));

map.changeIntersectionMapRouteDesign(Common.TollRoadKind.FREE, freeDesign);

設定可能なデザイン一覧

ルート種別毎の変更可能なデザインは以下の通りです。

ルート種別変更可能なデザイン
案内中ルート太さ、昼色、夜色
案内開始前の複数ルート探索結果のルート太さ、昼色、夜色
(選択ルート/非選択ルート それぞれ設定)
新ルート(ルートアドバイザー、ルート比較)太さ、昼色、夜色
(選択ルート/非選択ルート それぞれ設定)
旧ルート(ルートアドバイザー、ルート比較)太さ、昼色、夜色
(選択ルート/非選択ルート それぞれ設定)
交差点拡大図のルート太さ、昼色、夜色、通過済み昼色、通過済み夜色

Drive Tracking

この章では走行軌跡の表示や操作について紹介します。

走行軌跡の仕様

走行軌跡

走行軌跡は直線距離で約50mごとに端末内部に暗号化され記録されます。
(必ず50mではなく速度やGPS更新のタイミングによっては70mなどになる可能性もあります。)

デフォルトでは5000個、最大は20000個まで収集できます。
使用しているスマートフォンの処理能力によってはパフォーマンスが低下する可能性があるため、表示する端末の処理能力にあった設定をしてください。

走行軌跡のファイルはIDで管理されます。
同じ端末で異なるユーザーがログインする場合は、IDを変更することでユーザー毎に異なる走行軌跡を表示することができます。 IDは途中で変更することはできません。

Note:

1端末1ユーザーが確約されているアプリケーションであればIDは設定する必要はありません。1端末で複数ユーザーがログインする可能性があり、走行軌跡を共有したくない場合はIDにはUserIDを設定するなどしてください。

収集モードと最大値の設定

NaviInitInfoで指定し、NaviのInitializeにて初期化します。
Initializeに関しては4.1.1. Initializeを参照ください

設定項目関数デフォルト
走行軌跡の収集モードsetDriveTrackingCollectionMode()収集しない
最大個数setDriveTrackingCollectionCount()5000
グループIDsetDriveTrackingUserId"default"

走行軌跡の表示

走行軌跡を表示したいMapに対してsetDriveTrackingVisible()で設定できます。

走行軌跡のデザイン変更

走行軌跡を表示したいMapに対してchangeDriveTrackingDesign()で変更できます。

走行軌跡の消去

Navi.eraseDriveTracking()を行うことで全ての走行軌跡が全て消去されます。

Cruising Area

この章ではCruising Areaの表示方法、制御方法について紹介します。

Cruising Areaとは

電力/燃料の消費量を推定し、推定した電力燃料消費率で到達可能なエリアを表示する機能です。

Cruising Area設定方法

大まかに以下の流れで設定します。

  1. EnergyInfoの各パラメータを設定します。
  2. EnergyInfo.ExtendCruisingAreaで表示したい燃料または電力消費率を設定します。
  3. CruisingAreaRequestEnergyInfoを設定し、Navi.getCruisingArea()を呼び出します。

日産リーフの後続可能領域を作成するサンプルは以下の通りです。

EnergyInfo energyInfo = new EnergyInfo();
energyInfo.setModel("ZAA-ZE1");
energyInfo.setEnergyType(EnergyInfo.EnergyType.ELECTRIC);

EnergyInfo.TypeElectric typeElectric = new EnergyInfo.TypeElectric();
typeElectric.setBattery(40F); // バッテリ容量[kWh]
energyInfo.setTypeElectric(typeElectric);

energyInfo.setEnergyInfoExtension(EnergyInfo.EnergyInfoExtension.CRUISINGAREA);
EnergyInfo.ExtendCruisingArea extendCruisingArea = new EnergyInfo.ExtendCruisingArea();
extendCruisingArea.setCruisingAreaRateList(new ArrayList<>(Arrays.asList(100, 50)));  // 電力消費率100%, 50%で到達可能な領域
energyInfo.setExtendCruisingArea(extendCruisingArea);

CruisingAreaRequest request = new CruisingAreaRequest();
request.setEnergyInfo(energyInfo);

Navi.getInstance().getCruisingArea(request, new CruisingAreaListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CruisingAreaResult result) {

		if (errorCode == ErrorCode.NONE) {
			// 地図全体が画面に収まるように拡大率を調整
			List<GeoCoordinate> pathPointList = new ArrayList<>();
			pathPointList.add(result.getRange().getLeftBottom());
			pathPointList.add(result.getRange().getRightTop());
			GeoBoundingBox geoBoundingBox = GeoBoundingBox.getBoundingBoxContainingGeoCoordinates(pathPointList);
			map.zoomTo(geoBoundingBox, 0, false);
		}
		else {
			// 失敗
		}
	}
});

Cruising Area

Note:

cruisingAreaRateに指定された値ごとに透過率が設定された領域が描画されます。
そのため、近くの領域は濃く、遠くの領域は薄くなります。

注意:
  • 時間規制は考慮されません。
  • フェリー航路は考慮されません。
  • 住宅地図では利用できません。

Cruising Areaの条件調整

CruisingAreaRequest.Optionsによって、

  • 探索基準
  • 有料道路利用有無
  • スマートIC利用有無

を切り替えられます。

距離優先
距離優先

CruisingAreaRequest request = new CruisingAreaRequest();
CruisingAreaRequest.Options options = new CruisingAreaRequest.Options();
options.setPriority(CruisingAreaRequest.Options.Priority.DISTANCE);
request.setOptions(options);

幹線優先
幹線優先

CruisingAreaRequest request = new CruisingAreaRequest();
CruisingAreaRequest.Options options = new CruisingAreaRequest.Options();
options.setPriority(CruisingAreaRequest.Options.Priority.MAIN_ROAD);
request.setOptions(options);

推奨・有料道なし
推奨・有料道なし・スマートICなし

CruisingAreaRequest request = new CruisingAreaRequest();
CruisingAreaRequest.Options options = new CruisingAreaRequest.Options();
options.setPriority(CruisingAreaRequest.Options.Priority.RECOMMENDED);
options.setUseToll(false);
options.setUseSmartIC(false);
request.setOptions(options);

Cruising Areaのデザイン変更

CruisingAreaDesignを設定して表示方法をカスタマイズできます。

CruisingAreaDesign.Contour contour = new CruisingAreaDesign.Contour();
contour.setDayFillColor(0x33FF0000); // 塗りつぶし昼色
contour.setNightFillColor(0x66FF0000); // 塗りつぶし夜色
contour.setDayOutLineColor(0xFFFF0000); // 縁取り線昼色
contour.setNightOutLineColor(0xFF000000); // 縁取り線夜色
contour.setOutLineWidth(5f); // 縁取り線太さ
contour.setOutLine(true); // 縁取り線有り

List<CruisingAreaDesign.Contour> contourList = new ArrayList<>();
contourList.add(contour);

CruisingAreaDesign design = new CruisingAreaDesign();
design.setContourList(contourList);
Navi.getInstance().changeCruisingAreaDesign(design);

Cruising Area Design

Cruising Areaの表示制御について

Cruising Areaの表示

表示、非表示を切り替えるにはMap.setCruisingAreaVisible()をtrue(表示する)、またはfalse(非表示にする)で呼び出してください。

Cruising Areaの消去

Cruising Areaを削除したい場合、Navi.eraseCruisingArea()を呼び出してください。

Direction Line

この章では目的地目安線の表示や設定について紹介します。

目的地目安線とは

どの方向に目的地があるかを地図に表示する機能です。

画面内に目的地がある場合
画面内に目的地がある場合

画面外に目的地がある場合
画面外に目的地がある場合

目的地目安線の設定方法

MapsetDisplayDirectionLine()関数を操作して表示、非表示を切り替えます。

map.setDisplayDirectionLine(true);

デザイン変更方法

DirectionLineDesignを設定して色・幅をカスタマイズできます。

Color dayColor = Color.valueOf(Color.parseColor("#F8ED3A"));
Color nightColor = Color.valueOf(Color.parseColor("#F8ED3A"));
int width = 12;
DirectionLineDesign design = new DirectionLineDesign(dayColor, nightColor, width);
map.changeDirectionLineDesign(design);

デザイン変更

Auto Free Zoom

この章ではオートフリーズームの表示や設定について紹介します。

オートフリーズームとは

ルート案内中に、案内地点に近づくと、自車位置と案内地点の両方が画面に収まる地図スケールに自動的に調整する機能です。
地図スケールは、自車位置から案内地点までの距離に応じて、徐々にズームインを行い、以下のように変化します。

自車位置から案内地点までの道沿い距離地図スケール
1000m500m
500m200m
200m100m
100m以下50m

auto_free_zoom

Note:

オートフリーズームによる地図スケールの変更は中間スケールを使用してシームレスに変更される。

オートフリーズームはマップモードがHEADING_UPもしくはNORTH_UPのみ行う。

オートフリーズーム中に、地図をスクロールした場合は、現在の地図スケールを維持してスクロールを行う。

再びマップモードをHEADING_UPもしくはNORTH_UPに変更した際に
現在の自車位置から次の案内地点までの距離により、オートフリーズームを行う。

オートフリーズーム中に、地図スケールを変更した場合は、オートフリーズームを一時停止する。
案内地点を通過後、再度オートフリーズームを行う。

オートフリーズームの設定方法

MapsetAutoFreeZoomEnabled()trueに設定すると有効、falseに設定すると無効になります。

オートフリーズームを有効にするサンプルコードは以下の通りです。

map.setAutoFreeZoomEnabled(true);

オートフリーズームの状態通知

MapaddOnAutoFreeZoomStateChangeListener()にてリスナーを追加すると
OnAutoFreeZoomStateChange()にてオートフリーズームの状態通知を受けることが出来ます。
リスナーの解除はMapremoveOnAutoFreeZoomStateChangeListener()にて可能です。

リスナーの追加・解除のサンプルコードは以下の通りです。

// オートフリーズーム状態変更リスナーを実装
OnAutoFreeZoomStateChangeListener listener = new OnAutoFreeZoomStateChangeListener() {
    @Override
    public void OnAutoFreeZoomStateChange(Map.AutoFreeZoomState state) {
        // オートフリーズームの状態通知
    }
};

// オートフリーズーム状態変更リスナーを追加
map.addOnAutoFreeZoomStateChangeListener(listener);

// オートフリーズーム状態変更リスナーを解除
map.removeOnAutoFreeZoomStateChangeListener(listener)

OnAutoFreeZoomStateChange()通知されるAutoFreeZoomStateは以下となります。

状態説明
STOPオートフリーズーム停止
RUNNINGオートフリーズーム動作中
INTERRUPTオートフリーズームを一時停止し
現在のズームレベルをキープ
WAITINGオートフリーズーム待機中

Search

目的地検索機能について

目的地検索機能ではルート探索において目的地を地図上から探すことなく、名称やジャンルを入力から目的地を探し、設定するための機能を提供します。以下の機能に大別されます。

詳細は各機能のガイドを参照して下さい。

Free Word Search

この章では目的地を設定するためにフリーワードにより施設を検索(フリーワード検索)するための方法を紹介します。

おおまかな処理の流れ

フリーワード検索の処理の流れは以下の通りです。

  1. SearchJP.FreewordSearchRequestのインスタンスを生成します。
    • 検索したいワードを設定します。
    • 検索したい場所の緯度経度、半径(指定しない場合は全国が対象)を設定します。
  2. 設定済みのSearchJP.FreewordSearchRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 検索が完了すると、Listenerにて検索結果が通知されます。これで検索完了です。
SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("都庁");

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
	}
});
検索ワード例期待できる検索結果
パイオニアパイオニアに関連のある施設を検索します。
350-0822郵便番号に応じた住所を検索します。ハイフン記号がない7桁の数字も郵便番号とみなします。
03-6634-8777該当の電話番号を持つ施設を検索します。ハイフン記号がない10桁の数字も電話番号とみなします。

高度な検索

ソート順を指定する

SearchJP.FreewordSearchRequest.SortTypeで検索結果のソート順を指定することができます。 指定可能なソート順は以下の通りです。

  • RECOMMENDED(おすすめ順)
  • DISTANCE(距離順)
注意:

DISTANCE(距離順)を指定する場合、SearchAroundRequest.radiusによる検索半径指定が必要です。

複数ワード検索

フリーワード検索では複数のワードを空白で区切ることでAND検索を行うことができます。

検索ワード例期待できる検索結果
ラーメン 塩ラーメンと塩に関連する施設(塩ラーメンの店舗)を検索します。
カレー インドカレーとインドに関連する施設(インドカレーの店舗)を検索します。
注意:

郵便番号、または電話番号を検索する際は別のキーワードをANDで含めることはできません。
例えば 350-0822 コンビニ と検索しても検索失敗となってしまいます。

ジャンルキー、エリアキーとの組み合わせ

ジャンルキー

SearchJP.FreewordSearchRequestでワードに加えてジャンルキーを設定する事でワードとジャンルのAND検索を行う事ができます。
ジャンルキーはジャンルキーリストを参照するか、Genre Searchにて取得したジャンルキーを使用してください。

エリアキー

SearchJP.FreewordSearchRequestでさらにエリアキーを指定することでワード、ジャンル、エリアのAND検索を行う事ができます。
エリアキーはエリアキーリストを参照するか、Address Searchにて取得したエリアキーを使用してください。

ジャンルキーとエリアキーを指定したAND検索は以下のようにします。

SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("日産");

// カーディーラー
List<Integer> genreKeyList = new ArrayList<>();
genreKeyList.add(209);
request.setGenreKeyList(genreKeyList);

// 神奈川県
List<String> areakeyList = new ArrayList<>();
areakeyList.add("14");
request.setAreaKeyList(areakeyList);

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
	}
});

駐車場満空情報を取得する

検索結果に駐車場が含まれる場合、その駐車場の混雑(満空)情報を取得することができます。

  1. SearchJP.FreewordSearchRequest.Extensions のインスタンスを生成します。
  2. 設定済みのSearchJP.FreewordSearchRequest.Extensionsオブジェクトの、setParkingAvailabilityFlagを引数trueで呼び出します。
  3. 生成したインスタンスをSearchJP.FreewordSearchRequestsetExtentions()でリクエストに設定します
SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("パイオニア");
request.setPosition(map.getCenterCoordinate());

SearchJP.FreewordSearchRequest.Extensions extensions = new SearchJP.FreewordSearchRequest.Extensions();
extensions.setParkingAvailabilityFlag(true);
request.setExtensions(extensions);

設定したリクエストを引数に、SearchJP.search()を呼び出すことで駐車場の混雑情報を取得することができます。取得可能な混雑情報は以下の通りです。

ParkingStatus意味
UNKNOWN不明
EMPTY空車
CONGESTION混雑
FULL満車

駐車場満空情報の出展元の表示

満空情報を提供している以下の出展元の情報をアプリ内で表示する必要があります。
表示の詳細についてはLegal Guidelineを参照して下さい。

検索結果から駐車場混雑情報と出展元を取得するためには以下のようにします。

private List<String> createParkingList(SearchJP.SearchResult searchResult) {
	List<String> parkingList = new ArrayList<>();
	for (SearchJP.Place result : searchResult.getPlaceList()) {
		if (result.getGenreMList().stream().anyMatch(g -> g.getGenreKey() == 202)) {
			String brand = "";
			if (!result.getGenreSSList().isEmpty()) {
				switch (result.getGenreSSList().get(0).getGenreKey()) {
					case 90801: brand = "タイムズ"; break;
					case 90802: brand = "三井のリパーク"; break;
					case 90803: brand = "名鉄協商パーキング"; break;
					default: break;
				}
			}

			String parkingStatus = "不明";
			if (result.getParkingStatus() != null) {
				switch (result.getParkingStatus()) {
					case EMPTY: parkingStatus = "空車"; break;
					case CONGESTION: parkingStatus = "混雑"; break;
					case FULL: parkingStatus = "満車"; break;
				}
			}

			parkingList.add(String.format("名称:%s, 駐車場混雑情報:%s, 出典:%s",result.getName(), brand, parkingStatus));
		}
	}

	return parkingList;
}

ExampleAppでは画像を使ったサンプルになっているのでそちらもご確認ください。

駐車場入口

検索した施設には駐車場の入口情報が設定されている場合があります。この駐車場の入口情報をルート探索時にすることで適切な駐車場入口に案内するルートを探索することができます。

検索結果の駐車場入口情報をルート探索時に使用するためには以下のようにします

RoutePlan routePlan = new RoutePlan();
SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		if (errorCode == SearchJP.ErrorCode.NONE) {
			SearchJP.Place place = searchResult.getPlaceList().get(0);
			RouteEndPoint routeEndPoint = new RouteEndPoint();
			routeEndPoint.setPoint(place.getPosition());
			routeEndPoint.setParkingEntranceList(place.getParkingEntranceList()); // 駐車場リストを取得
			routePlan.setRouteEndPoint(routeEndPoint);
			// ルート探索処理はここでは割愛
		}
	}
}

詳しくはNew Routeを参照して下さい。

Genre Search

この章では目的地を設定するために特定のジャンルに該当する施設を検索(ジャンル検索)するための方法を紹介します。

ジャンル

ジャンル階層

ジャンル検索ではユーザーがジャンル階層リストからジャンルを階層的に選択することを想定しています。

ジャンル検索イメージ図

そのためジャンル情報は階層(レベル)化されており、上位のジャンルほど広範なジャンルになります。例えばコンビニエンスストアのジャンル階層は以下の通りです。

買物(レベル1)> コンビニエンスストア(レベル2)> セブンイレブン(レベル3)

ジャンルのレベルは1〜4までとなっており、数字が大きくなるほど詳細なジャンルになります。

ジャンル階層情報取得方法

SearchJP.getGenreList()の引数に取得したジャンル階層を設定し呼び出して下さい。処理が完了すると、Listenerにて階層情報取得結果が通知されます。

SearchJP.GetGenreListRequest request = new GetGenreListRequest();
request.setLevel(1);

SearchJP.getInstance().getGenreList(request, new SearchJP.GenreListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, List<SearchJP.Genre> genres) {
        // genresにジャンル情報が格納されています
    }
});
Note:

設定した階層とその上位の階層全てのジャンル情報が取得できるため、全てのジャンル階層情報を取得する場合はジャンルレベルに4を設定して下さい。

ジャンル名とジャンルキー

ジャンルにはジャンル名(文字列)とジャンルキー(整数値)がそれぞれ定義されています。例えばコンビニエンスストアの場合は以下の通りです。

  • ジャンル名:コンビニエンスストア
  • ジャンルキー:404

ジャンル検索を行う際にはこのジャンルキーを指定して検索を行うことになります。

おおまかな処理の流れ

ジャンル検索の流れは以下の通りです。

  1. SearchJP.FreewordSearchRequestのインスタンスを生成します。
    • 検索したいジャンルのジャンルキーを設定します。
    • 検索したい場所の緯度経度、半径(指定しない場合は全国が対象)を設定します。
  2. 設定済みのSearchJP.FreewordSearchRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 検索が完了すると、Listenerにて検索結果が通知されます。これで検索完了です。
SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

List<Integer> genrekeyList = new ArrayList<>();
genrekeyList.add(404);
request.setGenreKeyList(genrekeyList);

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
	}
});

Address Search

この章では目的地を設定するために住所から位置を検索(住所検索)するための方法を紹介します。

住所

住所階層

住所検索ではユーザーが住所階層リストから住所を階層的に選択することを想定しています。

住所検索イメージ図

そのため住所情報は階層(レベル)化されており、上位の住所ほど広範なエリアになります。住所階層と対応エリアは以下の通りです。

レベルエリア
0地方
1都道府県
2市区郡町村
3町大字
4字丁目
5地番戸番
6枝番

例えばレベル0(地方)では 「北海道・東北」「関東」「甲信越・北陸」「東海」「近畿」「中国」「四国」「九州・沖縄」の住所情報が取得できます。

住所コード

住所にはレベル毎に対応する住所コードが付与されています。

レベル住所コード
0住所コードなし
1地方の住所コード(例:'-02')
2都道府県の住所コード(例:'09')
3市区郡町村の住所コード(例:'09#202')
4町大字の住所コード(例:'09#202#00920002')
5地番戸番の住所コード(例:'09#202#00920002#000')
6枝番の住所コード(例:'09#202#00920002#000#103')
Note:

レベル0の場合は住所コードはありません。
レベル1の場合は先頭に'-'が付いた文字列です。
レベル2以上の場合は各階層の住所コードを'#'で繋げた文字列です。

おおまかな処理の流れ

  1. まず最上位階層(地方)の住所情報を取得します。
    • 取得した住所情報をアプリのUI上でユーザーに提示します。
  2. 選択された地方の住所情報に含まれる住所コードを元にさらに下位(都道府県以下)の住所階層情報を取得します。
    • 住所情報にはその住所の位置を表す緯度経度情報が含まれます。その場所を目的地としたい場合はそこで住所検索を終了します。
  3. 下位の住所階層情報が無くなるまで2.を繰り返します。

住所階層(最上位)情報取得方法

住所階層(最上位)情報の取得方法は以下の通りです。

  1. SearchJP.GetLocationListByAddressRequestのインスタンスを生成します。
    • 特に設定は不要です。デフォルトで最上位階層(レベル0)の階層情報を取得します
  2. SearchJP.GetLocationListByAddressRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 処理が完了すると、Listenerにて住所階層情報の取得結果が通知されます。
SearchJP.GetLocationListByAddressRequest request = new SearchJP.GetLocationListByAddressRequest();

SearchJP.getInstance().search(request, new SearchJP.AddressListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, List<SearchJP.Address> addresses) {
        // addressesに住所階層情報が格納されています
    }
});

住所階層情報取得方法

住所階層情報の取得方法は以下の通りです。

  1. SearchJP.GetLocationListByAddressRequest のインスタンスを生成します。
    • 検索したい住所の親階層で取得した住所情報の住所コードを設定します。
      • 例えば「北海道・東北」地方の都道府県レベルの住所階層情報を取得した場合、住所コードは'-01'(レベル0で取得した「北海道・東北」地方の住所コード)を設定します。
      • 住所階層を指定する必要はありません。住所コードから階層が自動的に判別されます。
  2. SearchJP.GetLocationListByAddressRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 処理が完了すると、Listenerにて住所階層情報の取得結果が通知されます。
SearchJP.GetLocationListByAddressRequest request = new SearchJP.GetLocationListByAddressRequest();
request.setParentAddressCode("-01");

SearchJP.getInstance().search(request, new SearchJP.AddressListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, List<SearchJP.Address> addresses) {
        // addressesに住所階層情報が格納されています
    }
});

Reverse Geocoding

この章では目的地を設定するために位置から住所、施設を検索(逆ジオコーディング)するための方法を紹介します。

逆ジオコーディングについて

逆ジオコーディングでは指定した位置から最も近い住所、施設を検索することができます。

ユーザーがタップした地図上の位置が本来ユーザーが設定したい目的地(住所、施設)から少し外れている場合でも、逆ジオコーディングで近くの住所、施設をユーザーに提示、選択してもらうことにより適切なルートを探索することができるようになります。

逆ジオコーディングイメージ図

おおまかな処理の流れ

逆ジオコーディングの流れは以下の通りです。

  1. SearchJP.ReverseGeocodingRequestのインスタンスを生成します。
    • 検索したい場所の緯度経度を設定します。
  2. 設定済みのSearchJP.ReverseGeocodingRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 検索が完了すると、Listenerにて検索結果が通知されます。これで検索完了です。
    • 設定した緯度経度から直線距離で一番近い住所地点を取得することができます。
    • また、設定した緯度経度から半径100m以内の施設を取得することができます。
GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);

SearchJP.ReverseGeocodingRequest request = new SearchJP.ReverseGeocodingRequest(position);

SearchJP.getInstance().search(request, new SearchJP.ReverseGeocodingListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.ReverseGeocodingResult reverseGeocodingResult) {
        // addressesに検索結果が格納されています
    }
});

Route Vicinity Search

この章ではルート周辺の施設を検索(ルート周辺検索)するための方法を紹介します。

ルート周辺検索について

ルート沿い検索イメージ図

ルート周辺検索では指定したルート周辺の施設を検索することができます。ルートの左右200mの範囲に含まれる施設が検索対象になり、道路に面した施設だけを検索するのではない点にご注意下さい。

おおまかな処理の流れ

新しくルートを探索する方法についてはNew Routeを参照して下さい。

  1. SearchJP.RouteVicinitySearchRequestのインスタンスを生成します。
    • 検索したい場所の緯度経度を設定します。
    • 周辺を検索したいルートの形状情報を設定します。
      • 形状情報はRouteResult.getPathPointList()で取得可能です。
    • 検索したいワード、もしくはジャンルのジャンルキーを設定します。
      • ジャンルキーの取得方法についてはGenre Searchを参照して下さい。
      • ワード、ジャンルキーの両方を設定した場合はAND検索になります。
  2. 設定済みのSearchJP.RouteVicinitySearchRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 検索が完了すると、Listenerにて検索結果が通知されます。これで検索完了です。
SearchJP.RouteVicinitySearchRequest request = new SearchJP.RouteVicinitySearchRequest();

request.setKeyword("都庁");

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

request.setRoutePathPointList(pathPointList); // ルート探索時の形状情報

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
    }
});

Charging Station Search

この章では充電施設を検索するための方法を紹介します。

充電施設検索方法

SDKは充電施設を検索する手段を3通り用意しています。

方式Type特徴
周辺検索AROUND自車位置を中心に検索します。
ルート沿い検索ROUTE_VICINITYルート沿いにある施設に限定して検索します。
ポリゴン内検索POLYGONCruising Areaの範囲内にある施設に限定して検索します。

おおまかな処理の流れ

  1. SearchJP.ChargingStationSearchRequestのインスタンスを生成し、rangeTypeに検索方法を指定します。
  2. 検索方法に沿ったパラメータを設定します。
  3. パラメータ設定済みのオブジェクトを引数にSearchJP.search()を呼び出し、検索を実行します。
  4. 検索が完了すると、SearchJP.SearchResultListenerにて検索結果が通知されます。これで検索完了です。

周辺検索

周辺検索では、指定座標を中心とした半径radiusメートル内にある充電施設を検索します。

SearchJP.ChargingStationSearchRequest request = new SearchJP.ChargingStationSearchRequest();
request.setPosition(Navi.getInstance().getRunInfo().getOwnCarInfo().getGeoCoordinate());

request.setRangeType(SearchJP.ChargingStationSearchRequest.RangeType.AROUND);
SearchJP.ChargingStationSearchRequest.Around around = new SearchJP.ChargingStationSearchRequest.Around();
around.setRadius(1000); // 検索半径[m]
request.setAround(around);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		if (errorCode == SearchJP.ErrorCode.NONE) {
			// 見つかった全ての地点にアイコンを貼り付ける
			for (SearchJP.Place place : searchResult.getPlaceList()) {
				MapIcon icon = new MapIcon();
				icon.setImageResource(R.drawable.pin);
				icon.setIconAnchor(MapIcon.Icon_Anchor.ICON_ANCHOR_BOTTOM);
				icon.setID("Search Result");
				icon.setPosition(place.getPosition());
				m_map.addUserIcon(icon);
			}
		}
	}
});

周辺検索

ルート沿い検索

ルート沿い検索では、案内中ルートや案内候補ルートの周辺pathWidthメートル以内の施設に限定して検索します。

SearchJP.ChargingStationSearchRequest request = new SearchJP.ChargingStationSearchRequest();
request.setPosition(Navi.getInstance().getRunInfo().getOwnCarInfo().getGeoCoordinate());

// RouteVicinity
request.setRangeType(SearchJP.ChargingStationSearchRequest.RangeType.ROUTE_VICINITY);
SearchJP.ChargingStationSearchRequest.RouteVicinity routeVicinity = new SearchJP.ChargingStationSearchRequest.RouteVicinity();

RouteResult routeResult = Navi.getInstance().getRouteResult();
routeVicinity.setPathPointList(Common.convertRouteResultToPathPointList(routeResult)); // RouteResultから検索用のルート形状点リストを作成
routeVicinity.setPathWidth(200); // ルートに対して左右それぞれ200メートルまで検索範囲とする
request.setRouteVicinity(routeVicinity);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		if (errorCode == SearchJP.ErrorCode.NONE) {
			for (SearchJP.Place place : searchResult.getPlaceList()) {
				MapIcon icon = new MapIcon();
				icon.setImageResource(R.drawable.pin);
				icon.setIconAnchor(MapIcon.Icon_Anchor.ICON_ANCHOR_BOTTOM);
				icon.setID("Search Result");
				icon.setPosition(place.getPosition());
				m_map.addUserIcon(icon);
			}
		}
	}
});

ルート周辺検索

ポリゴン内検索

ポリゴン内検索では、Cruising Areaの範囲内にある施設に限定して検索します。

SearchJP.ChargingStationSearchRequest request = new SearchJP.ChargingStationSearchRequest();
request.setPosition(Navi.getInstance().getRunInfo().getOwnCarInfo().getGeoCoordinate());

request.setRangeType(SearchJP.ChargingStationSearchRequest.RangeType.POLYGON);
SearchJP.ChargingStationSearchRequest.Polygon polygon = new SearchJP.ChargingStationSearchRequest.Polygon();
polygon.setOuterRing(Navi.getInstance().getCruisingAreaResult().getOuterRingList().get(0));
request.setPolygon(polygon);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		if (errorCode == SearchJP.ErrorCode.NONE) {
			for (SearchJP.Place place : searchResult.getPlaceList()) {
				MapIcon icon = new MapIcon();
				icon.setImageResource(R.drawable.pin);
				icon.setIconAnchor(MapIcon.Icon_Anchor.ICON_ANCHOR_BOTTOM);
				icon.setID("Search Result");
				icon.setPosition(place.getPosition());
				m_map.addUserIcon(icon);
			}
		}
	}
});

ポリゴン内検索

高度な検索設定

SearchJP.ChargingStationSearchRequest.Extensions.ChargingSpotFilterを設定することで検索条件を変更できます。

method用途
setTollRoadType(TollRoadType tollRoadType)充電施設にアクセス可能な道路を指定
setPower(Integer power)出力電力の下限値[kWh]
setChargingTypeList(List<ChargingType> chargingTypeList)充電方法
setConnectorTypeList(List<ConnectorType> connectorTypeList)コネクタ種別
setMembershipList(List<Membership> membershipList)会員情報
setFreeSpotFlag(Boolean freeSpotFlag)無料利用可否
setAllHoursFlag(Boolean allHoursFlag)終日利用可否
setBusinessHoursList(List<String> businessHoursList)営業時間[YYYYMMDDTHHMM]
Note:

複数methodが設定された場合はAND検索となります。

例えば急速充電が可能で終日営業している施設に限定して検索したい場合のサンプルは以下の通りです。

SearchJP.ChargingStationSearchRequest.Extensions extensions = new SearchJP.ChargingStationSearchRequest.Extensions();
SearchJP.ChargingStationSearchRequest.Extensions.ChargingSpotFilter filter = new SearchJP.ChargingStationSearchRequest.Extensions.ChargingSpotFilter();
filter.setChargingTypeList(Arrays.asList(SearchJP.ChargingType.RAPID));
filter.setAllHoursFlag(true);
extensions.setChargingSpotFilter(filter);

Search History

この章では検索履歴を追加、取得、削除するための方法を紹介します。

検索履歴

SDKでは各種検索を行った結果を検索履歴として登録する事ができます。登録可能な主な項目は以下の通りです。

  • 名前
  • 住所
  • 登録日時

その他の項目に関してはSearchJP.SearchHistoryを参照して下さい。

注意:

検索結果を全て登録すべきではありません。例えば検索結果をルート探索の目的地として使用した場合など、登録が必要な場合のみ登録するようにして下さい。

検索履歴の追加

検索履歴の追加にはSearchJP.addSearchHistoryを使用します。処理の流れは以下の通りです。

  1. SearchJP.AddSearchHistoryRequestのインスタンスを生成します。
    • 登録したい履歴を設定します。
    • IDは必ず登録する必要があります。削除時にIDをキーに履歴を削除します。
  2. 設定済みのSearchJP.AddSearchHistoryRequestオブジェクトを引数に、SearchJP.addSearchHistory()を呼び出します。
  3. 追加が完了すると、Listenerにて追加結果が通知されます。これで追加完了です。

サンプルコードは以下の通りです。

SearchJP.AddSearchHistoryRequest request = new SearchJP.AddSearchHistoryRequest();
List<SearchJP.SearchHistory> historyList = new ArrayList<>();

SearchJP.SearchHistory history = new SearchJP.SearchHistory();
history.setHistoryId("1"); // 必須
history.setName("パイオニア川越");
history.setYomi("パイオニアカワゴエ");
history.setAddress("埼玉県川越市山田25-1");
history.setType(SearchJP.SearchHistory.Type.POI);
history.setTimestamp("2023-02-01T13:59:59Z");
historyList.add(history);

request.setSearchHistoryList(historyList);

SearchJP.getInstance().addSearchHistory(request, new SearchJP.AddSearchHistoryListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode) {
    }
});
注意:

一度に追加可能な履歴は6件が上限です。

注意:

IDにはユニークな値を設定する必要があります。例えばフリーワード検索やジャンル検索の結果を履歴に追加する場合はPlace.getPoiId()でユニークなIDを取得できるためこのIDを設定する事が推奨されます。

また住所検索の結果を履歴に追加したい場合は住所コードをユニークなIDとして利用する事が可能です。

検索履歴の取得

検索履歴の取得にはSearchJP.getSearchHistoryを使用します。処理の流れは以下の通りです。

  1. SearchJP.GetSearchHistoryRequestのインスタンスを生成します。
  2. 設定済みのSearchJP.GetSearchHistoryRequestオブジェクトを引数に、SearchJP.getSearchHistory()を呼び出します。
  3. 取得が完了すると、Listenerにて取得結果が通知されます。これで取得完了です。

サンプルコードは以下の通りです。

SearchJP.GetSearchHistoryRequest request = new SearchJP.GetSearchHistoryRequest();

SearchJP.getInstance().getSearchHistory(request, new SearchJP.GetSearchHistoryListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.GetSearchHistoryResult result) {
        // resultに検索履歴が格納されている
    }
});
Note:

サンプルコードでは全ての検索履歴を取得します。特定の範囲の検索履歴を取得したい場合はSearchJP.GetSearchHistoryRequestsetPos, setNumで取得開始位置、個数を指定して下さい。

検索履歴の削除

特定の検索履歴の削除

特定の検索履歴を削除したい場合、削除したい履歴のIDを指定しSearchJP.deleteSearchHistoryを呼び出します。処理の流れは以下の通りです。

  1. SearchJP.DeleteSearchHistoryRequestのインスタンスを生成します。
    • 削除したい履歴をのIDリストを設定します。
  2. 設定済みのSearchJP.DeleteSearchHistoryRequestオブジェクトを引数に、SearchJP.deleteSearchHistoryを呼び出します。
  3. 削除が完了すると、Listenerにて削除結果が通知されます。これで削除完了です。

サンプルコードは以下の通りです。

SearchJP.DeleteSearchHistoryRequest request = new SearchJP.DeleteSearchHistoryRequest();
List<String> removeHistoryIdList = new ArrayList<>();
removeHistoryIdList.add("1");

request.setHistoryIdList(removeHistoryIdList);

SearchJP.getInstance().deleteSearchHistory(request, new SearchJP.DeleteSearchHistoryListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode) {
    }
});

検索履歴の全削除

全ての検索履歴を削除したい場合はSearchJP.deleteAllSearchHistoryを呼び出します。サンプルコードは以下の通りです。

SearchJP.getInstance().deleteAllSearchHistory(new SearchJP.DeleteSearchHistoryListener() {
    @Override
    public void onCompleted(SearchJP.ErrorCode errorCode) {
    }
});

Route

ルートを探索したりルートを編集する機能は下の機能に大別されます。

詳細は各機能のガイドを参照してください。

New Route

この章では新しくルートを探索するための方法を紹介します。

ルート探索のおおまかな処理の流れ

新しいルートを探索する処理の流れは以下の通りです。

  1. RoutePlan のインスタンスを生成します。
    • 目的地を設定します。
    • 探索して欲しいルートの条件の数だけRouteOptionsインスタンスを生成し、RoutePlanオブジェクトに設定します。
  2. 設定済みのRoutePlanオブジェクトを引数に、Navi.calculateRoute()を呼び出します。
  3. 探索が完了すると、Listenerにて処理結果が通知されます。これで探索完了です。
  4. 探索したルートで案内を開始したい場合、Navi.startGuidance()を呼び出します。

SDKデフォルトのルートを探索する

RoutePlanRouteOptionsは初期値を持っており、set関数にて設定されない限りは初期値が用いられます。

最低限設定が必要な項目は、

  • RoutePlanの目的地 (setEndPoint)
  • 複数ルート同時に探索する場合に限りRouteOptionsのRouteID (setRouteID)

の2つです。

以下に例を示します。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

Note:

ルート探索完了しても探索結果が得られるだけで案内は開始されません。 Navi.startGuidance()を呼び出すことで案内を開始できます。

上記のサンプルコードは下記のサンプルコードと等価です。

RoutePlan routePlan = new RoutePlan();
routePlan.setStartPointCurrent();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761));
routePlan.setVehicleInfo(null);
routePlan.setEnergyInfo(null);
routePlan.setWayPoints(null);
routePlan.setRouteWayPoints(null);
routePlan.setDesignationTimeUsage(RoutePlan.DesignationTimeUsage.None);

RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setAddAlternative(false);
options.setSearchCriteria(RouteOptions.SearchCriteria.RECOMMENDED);
options.setUseToll(true);
options.setUseFerry(true);
options.setUseSmartIC(true);
options.setCareJam(true);
options.setCareRegulation(true);
options.setCareTimeRegulation(true);
options.setCareUnpavedRoad(false);

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

ルート探索が成功すると、自動的に地図にルート線が反映されます。

ルート探索結果

Fig.1 - 探索結果

ルートを削除する場合、 Navi.eraseRoute()を呼び出してください。

Navi.getInstance().eraseRoute(null);

ルート探索結果を確認する

ルート探索結果はRouteResultに格納されます。

代表的なデータは以下のものがあります。

  • RouteResult.getLength() : 総走行距離[m]

  • RouteResult.getRequireTime() : 所要時間[sec]

  • RouteResult.getToll() : 料金[円]

  • RouteResult.getEntranceICName() : 高速道路入口の施設名称

  • RouteResult.getExitICName() : 高速道路出口の施設名称

  • RouteResult.getRouteProfileInfoList() : ルートプロフィール情報
    ルート中の特徴的な地点のリストです。
    通行する道路名や通過する高速道路インターチェンジ名、サービスエリア名、サービスエリア内施設情報などを確認できます。
    例えば、食事処を提供するサービスエリアとパーキングエリアの一覧を抽出するサンプルコードは以下の通りです。

    if (!calcRouteResult.getRouteResults().isEmpty()) {
        List routeProfileInfos = calcRouteResult.getRouteResults().get(0).getRouteProfileInfoList();
        List sapaWithRestaurant = routeProfileInfos.stream().filter( prof -> {
                if (prof.getFacilityName().isEmpty()) return false;
                if (prof.getKind() != RouteResult.RouteProfileInfo.Kind.FACILITY) return false;
                return prof.getFacilityServiceList().stream().anyMatch(facility -> facility.getKind() == HighwayInfo.FacilityInfo.Service.Kind.RESTAURANT);
            })
            .map(RouteResult.RouteProfileInfo::getFacilityName)
            .collect(Collectors.toList());
        for (String name : sapaWithRestaurant) {
            Log.println(Log.INFO, "app", name);
        }
    }
    
  • RouteResult.getUnavoidableInfo() : 回避不能な道路規制
    RouteOptionsで指定した条件通りのルートを探索できなかった場合にtrueになります。
    例えば自車位置が有料道路上に存在する場合にRouteOptions.setUseToll(false)で探索しても、必ず有料道路を使ってしまうのでUnavoidableInfo.isToll()trueになります。

    • RouteResult.UnavoidableInfo.isToll() : 有料道路を回避するルートを探索できなかった
    • RouteResult.UnavoidableInfo.isFerry() : フェリー航路を回避するルートを探索できなかった
    • RouteResult.UnavoidableInfo.isTrafficRegulation() : 通行止めを回避するルートを探索できなかった

    これらのフラグがtrueの場合はユーザーに探索条件通りのルートが見つけられなかった旨を通知するなどの対策を行ってください。

ルートの特徴を変更する

RouteOptions.SearchCriteriaを設定することで、探索するルートの特徴を変更できます。

RouteOptions.SearchCriteria特徴使用上の注意
RECOMMENDED主に時間を考慮した標準的なルート。
TIME時間を最優先で考慮し、早く目的地に到着することができるルート。
DISTANCE主に距離を考慮して、なるべく距離が短くなるルート。
MAIN_ROAD主に道幅と時間を考慮し、広い道(高速道、国道など)を優先的に使用するルート。
TOLL時間と有料道料金のバランス(コストパフォーマンス)を考慮したルート。
ECO主に推定消費燃料(推定消費電力)を考慮し、なるべく推定消費燃料(推定消費電力)の少ないルート。

立ち寄り地点は最大5つまでに制限されます。

燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。

COST1時間と有料道料金と推定燃費(推定電費)から算出するガソリン代(電気代)のバランス(コストパフォーマンス)を考慮したルート。

立ち寄り地点は最大5つまでに制限されます。

燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。

COST2コスト1と同様に、コスト1に比べて時間のコストを下げてコストパフォーマンスを考慮したルート。

立ち寄り地点は最大5つまでに制限されます。

燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。

パイオニア川越工場を目的地に、距離を優先したルート探索を行うサンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setSearchCriteria(RouteOptions.SearchCriteria.DISTANCE);

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

パイオニア川越工場を目的地に、時間を優先したルート探索を行うサンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setSearchCriteria(RouteOptions.SearchCriteria.TIME);

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

距離優先
Fig.2 - 距離優先

時間優先
Fig.3 - 時間優先

渋滞や規制を考慮するルートを探索する

RouteOptionssetCareJam()setCareRegulation()setCareTimeRegulation()を設定することで trueなら考慮、falseなら未考慮のルートを探索できます。

注意:

渋滞情報考慮は渋滞情報契約未定結の場合、プローブ情報のみを考慮した結果となります。

車両に合ったルートを探索する

車両情報を設定することで車両情報を考慮したルート探索を行うことが可能です。

車種、車高、車重、車幅をVehicleInfoで設定します。

例えば車高を200cmに設定した場合、180cmの車高制限がある道を避けてルート探索を行います。

サンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

VehicleInfo vehicleInfo = new VehicleInfo();
vehicleInfo.setVehicleType(VehicleInfo.VehicleType.ORDINARY_PASSENGER); // 普通乗用車
vehicleInfo.setVehicleHeight(200);
vehicleInfo.setVehicleWidth(175);
vehicleInfo.setVehicleWeight(1645);
routePlan.setVehicleInfo(vehicleInfo);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

燃料/電力情報設定

エコ・コスト優先の探索を実施する場合および推定燃費/電費を算出する場合はEnergyInfoで燃料/電力情報の指定が必要です。

指定必須な燃料/電力情報は燃料種別や指定する情報によって異なり、以下の通りになります。

条件燃料種別必須情報
型式から設定する場合全種燃料種別,型式
型式指定番号から設定する場合全種燃料種別,型式指定番号
型式または型式指定番号から設定しない場合ガソリン(貨物車除く)燃料種別, 車幅, 車高, 車重, 排気量, アイドリングストップのON/OFF
型式または型式指定番号から設定しない場合ガソリン(貨物車の場合)燃料種別, 車幅, 車高, 車重, 現在の積載容量, ドライバーを含めた乗員人数
型式または型式指定番号から設定しない場合ガソリン・電気燃料種別, 車幅, 車高, 車重, 排気量
型式または型式指定番号から設定しない場合電気燃料種別, 車幅, 車高, 車重

以下がトヨタカローラのガソリン車で燃料情報を設定し燃費を取得するまでの例です。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

EnergyInfo energyInfo = new EnergyInfo();
energyInfo.setModel("6AA-ZWE219-AEXSB");	
energyInfo.setEnergyType(EnergyInfo.EnergyType.GASOLINE);
energyInfo.setHeight(144);
energyInfo.setWidth(175);
energyInfo.setWeight(1645);
energyInfo.setDisplacement(1.797F);
energyInfo.setIdlingStop(false);
routePlan.setEnergyInfo(energyInfo);

Navi.getInstance().calculateRoute(routePlan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		if (CalcRouteListener.ErrorCode.NONE == errorCode) {
			// 推定燃費/電力の取得
			if (calcRouteResult.getRouteResults().get(0).getEstimatedEnergyInfo() != null) {
				float energyConsumption = calcRouteResult.getRouteResults().get(0).getEstimatedEnergyInfo().getEnergyConsumption();
			}
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		}
		else {
			// ルート探索失敗
		}
	}
});

高度な目的地設定

駐車場を指定してルートを探索する

大型商業施設など、駐車場入り口座標と施設の中心座標が大きく離れている場合、 施設中心座標を目的地に指定すると駐車場入り口ではない道路を通過するルートになることがあります。

このような低品質なルートになるのを避けるため、駐車場の入り口座標を指定したルート探索が可能です。

例えば、東京スカイツリーを目的地に設定し、駐車場を近隣の民間駐車場に指定したルートを探索するサンプルは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.7100409, 139.810719));

routePlan.getRouteEndPoint().setParkingEntranceList(new ArrayList<ParkingEntrance>() {{
	// Dパーキング 東京スカイツリー前第1
	add(new ParkingEntrance(new ParkingEntrance.Toll(false), new GeoCoordinate(35.709085753910045, 139.80820773937228)));
}});

RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(routePlan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

駐車場指定有
Fig.4 - 駐車場指定あり

駐車場指定無
Fig.5 - 駐車場指定なし

目的地やルートのメタデータを設定する

目的地の検索結果などは検索直後に参照するのは容易ですが、アプリケーション再起動後に参照するには工夫が必要です。

そのための関数としてRouteEndPoint.setInfo() が用意されています。 この関数で設定された文字列はサーバーに保存され、RouteResult.RouteProfileInfo.getInfo()で参照できます。

例えば目的地の住所・電話番号の情報を保存するサンプルコードは以下の通りです。

RouteEndPoint routeEndPoint = routePlan.getRouteEndPoint();
routeEndPoint.setInfo(
	new HashMap<String, String>() {{
		put("address":"東京都文京区本駒込2-28-8");
		put("tel":"03-6634-8777");
	}}
);

立ち寄り地を追加する

目的地以外の地点を経由するルートを引きたい場合は RoutePlan に経由したい地点を追加します。
立ち寄り地は最大200地点まで指定可能です。

緯度経度のみを指定して立ち寄り地を追加する

パイオニア川越工場を目的地に、東京スカイツリーを立ち寄り地に設定したルート探索を行うサンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

List<GeoCoordinate> waypoints = new ArrayList<>();
waypoints.add(new GeoCoordinate(35.7100409, 139.810719)); // 東京スカイツリー
routePlan.setWayPoints(waypoints);

RouteOptions options = new RouteOptions();
options.setRouteID(1);

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

立ち寄り地追加

Fig.6 - 立ち寄り地追加

立ち寄り地の駐車場入口座標を指定する

目的地に追加するのと同様に設定可能です。

List<RouteWayPoint> routeWayPoints = routePlan.getRouteWayPoints();
routeWayPoints.get(0).setAlongside(true);
routeWayPoints.get(0).setParkingEntranceList(new ArrayList<ParkingEntrance>() {{
	// Dパーキング 東京スカイツリー前第1
	add(new ParkingEntrance(new ParkingEntrance.Toll(false), new GeoCoordinate(35.709085753910045, 139.80820773937228)));
}});

駐車場指定有
Fig.7 - 駐車場指定あり

駐車場指定無
Fig.8 - 駐車場指定なし

条件が異なるルートを同時に探索する

最短距離のルートと時間優先のルート、幹線優先のルート、推奨ルートの4本を同時に探索する

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(goal);

List<RouteOptions.SearchCriteria> criteriaList = new ArrayList<RouteOptions.SearchCriteria>() {{
	add(RouteOptions.SearchCriteria.DISTANCE);
	add(RouteOptions.SearchCriteria.TIME);
	add(RouteOptions.SearchCriteria.MAIN_ROAD);
	add(RouteOptions.SearchCriteria.RECOMMENDED);
}};

List<RouteOptions> optionList = new ArrayList<>();
int routeId = 1;
for (RouteOptions.SearchCriteria criteria : criteriaList) {
	RouteOptions options = new RouteOptions();
	options.setSearchCriteria(criteria);
	options.setRouteID(routeId);
	routeId++;
	optionList.add(options);
}
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().selectCalculateRoute(getSelectedRouteResult()); // 複数ルート探索した時はどのルートで案内開始したいのか指定してください
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});
注意:

探索基準ごとに異なるルートになるとは限りません。 例えば、TIMERECOMMENDEDのルートが同じになることもあります。

複数ルート同時探索

Fig.9 - 複数ルート同時探索

有料道路を回避するルートと、有料道路を使うルートを探索する

ある目的地goalに対して、有料道路を経由しないルートと有料道路を経由する可能性があるルートを同時に探索するサンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(goal);

RouteOptions noToll = new RouteOptions();
noToll.setRouteID(1);
noToll.setUseToll(false);

RouteOptions useToll = new RouteOptions();
useToll.setRouteID(2);
useToll.setUseToll(true); // 明示的に設定しなくても初期値はtrueです

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(noToll);
optionList.add(useToll);
routePlan.setMultiRouteOptions(optionList);

Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().selectCalculateRoute(getSelectedRouteResult()); // 複数ルート探索した時はどのルートで案内開始したいのか指定してください
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

注意:

setUseToll(true)に設定していても、有料道路を使わないルートになることがあります。

有料道路使用有無

Fig.10 - 有料道路使用有無

目的地/立ち寄り地が有料道路上か一般道路上かを選択してルート探索する

目的地を緯度経度で指定した場合、その場所から一番近い道路に対してルート探索が行われるため、目的地は一般道路からアクセスすべき場所だが高速道路上にゴールが設定されるなど意図しないルートになることがあります。

そのための関数としてRouteEndPoint.setTollRoadKind() が用意されています。
getNearLink() を使い目的地付近に存在する道路の種別を取得し、目的地の道路種別を指定してルート探索を行うことが可能です。

サンプルコードは以下の通りです。

private void createRouteEndPoint(GeoCoordinate point, RouteEndPointListener listener) {

    // 付近の道路情報取得
    Navi.getInstance().getNearLink(point, null, new GetNearLinkListener() {
        @Override
        public void onCompleted(ErrorCode errorCode, NearLink nearLink) {
            RouteEndPoint routeEndPoint = new RouteEndPoint();
            routeEndPoint.setPoint(point);

            //  有料道路と無料道路の両方がある場合、ユーザーに選択させる
            if (errorCode == ErrorCode.NONE &&
                nearLink.hasToll() && nearLink.hasFree()) {

                new AlertDialog.Builder(NewRoute.this)
                        .setTitle("どちらの道路を選択しますか?")
                        .setPositiveButton("有料道路", (dialogInterface, i) -> {
                            routeEndPoint.setTollRoadKind(Common.TollRoadKind.TOLL);
                            listener.onComplete(routeEndPoint);
                        })
                        .setNegativeButton("無料道路", (dialog, which) -> {
                            routeEndPoint.setTollRoadKind(Common.TollRoadKind.FREE);
                            listener.onComplete(routeEndPoint);
                        })
                        .setOnCancelListener(dialog -> {
                            listener.onComplete(routeEndPoint);
                        })
                        .show();
            }
            else {
                listener.onComplete(routeEndPoint);
            }
        }
    });
}

立ち寄り地の場合も同様に指定することができます。

RouteWayPoint wayPoints = new RouteWayPoint();
wayPoints.setTollRoadKind(Common.TollRoadKind.TOLL);
routePlan.addWayPoint(wayPoints);

推定通過速度表示

推定通過速度表示フラグをtrueで指定することで、推定通過速度表示を伴うルート探索を行うことが可能です。

サンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場

RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

// 推定通過速度表示を行う場合は、trueを指定する
boolean useSpeedCategory = true

Navi.getInstance().calculateRoute(plan, useSpeedCategory, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			Navi.getInstance().startGuidance(new StartGuidanceListener() {
				@Override
				public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
					if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
					}
				}
			});
		} else {
			// ルート探索失敗
		}
	}
});

推定通過速度表示

Fig.11 - 推定通過速度表示

Charging Route

この章では新しくEV向けのルートを探索するための方法を紹介します。

EV向けルートの特徴

  • 現在のバッテリ容量、到着時のバッテリ容量閾値、および充電開始目安から、充電が必要な場合に自動で充電施設を立ち寄り地に設定したルートを探索します。
  • 自動的に追加される充電施設は最大5カ所です。
  • ユーザーが任意に設定できる立ち寄り地は50箇所です。

EV向けルート探索方法

EV向けルートを探索するには車両情報(EnergyInfo)が必要です。 EnergyInfoの基本的な設定方法はこちらを参照してください。

これに加え、EnergyInfo.ExtendChargingAreaの設定が必須です。

例えば、日産リーフの設定例は以下の通りです。

EnergyInfo energyInfo = new EnergyInfo();
energyInfo.setModel("ZAA-ZE1"); // 車両型式
energyInfo.setEnergyUnitPrice(31f); // 電気代単価[円/kWh]

EnergyInfo.TypeElectric electric = new EnergyInfo.TypeElectric();
electric.setBattery(40f);
energyInfo.setTypeElectric(electric);

EnergyInfo.ExtendChargingArea chargingArea = new EnergyInfo.ExtendChargingArea();
chargingArea.setBatteryLevel(100); // 現在のバッテリ容量[%]
chargingArea.setBatteryLevelAtSupply(20); // 充電する目安[%]
chargingArea.setBatteryLevelOnArrival(20); // 目的地到着時に残しておきたいバッテリ容量[%]
energyInfo.setExtendChargingArea(chargingArea);

このように設定したenergyInfoRoutePlan.setEnergyInfo()で設定し、Navi.calculateChargingRoute()にてルート探索します。

RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761));

// 設定したEnergyInfoを適用
routePlan.setEnergyInfo(energyInfo);

Navi.getInstance().calculateChargingRoute(routePlan, (errorCode, calcRouteResult) -> {
	if (errorCode == CalcRouteListener.ErrorCode.NONE) {
		Navi.getInstance().startGuidance(new StartGuidanceListener() {
			@Override
			public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
				if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
				}
			}
		});
	} else {
		// ルート探索失敗
	}
});
Note:

設定されたEnergyInfoで、5回充電しても目的地まで到達できないと予想される場合はRouteResultEndPoint.getUnreachableInfo()trueになります。 立ち寄り地が設定されている場合は立ち寄り地ごとの到達可否がRouteResultWayPoint.getUnreachableInfo()にて取得できます。

Erase Route

Navi.eraseRoute()にて案内中ルートを消去できます。
処理結果はEraseRouteListenerで通知されます。

ルート消去に成功すると、Naviにattachされている全ての地図のルート線が自動的に消去されます。

Navi.getInstance().eraseRoute(new EraseRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode) {
	}
});

Edit Route

この章では案内中のルートを調整して別のルートにする方法を紹介します。

立ち寄り地追加

ルートに新しい立ち寄り地を設定するには、 Navi.editRoute()を使用します。
立ち寄り地は最大200地点まで指定可能です。

calculateRoute()を使ってもルートに立ち寄り地を追加できますが、 editRoute()はこれまで走行してきたルートを考慮した探索結果になる点が異なります。

たとえば、立ち寄り済みの立ち寄り地がある状況でcalculateRoute()による新ルート探索をした場合、 立ち寄り地を再度通るルートを探索します。

一方、editRoute()の場合は立ち寄り済みの地点を通るルートは探索しません。

editRoute()関数はRoutePlanオブジェクトを利用しますので、 calculateRoute()で使用したオブジェクトを再利用できるようにしておくとよいでしょう。

東京駅丸の内口を立ち寄り地点に追加してルート再探索するサンプルコードは以下の通りです。

RoutePlan plan = getCurrentRoutePlan(); // 何らかの手段で再利用するものと仮定します。
plan.addWayPoint(new GeoCoordinate(35.68152901559053, 139.76564067909706)); // 東京駅丸の内口

Navi.getInstance().editRoute(plan, new CalcRouteListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
		if (errorCode == CalcRouteListener.ErrorCode.NONE) {
			// 成功した時の処理を記述してください
		}
	}
});

Compare Route

この章はルート比較について説明します。

ルート比較とは

新ルートを探索した時、案内中ルートと比べて距離や時間、料金がどの程度変わるのか、ルート形状がどう変わるのか、を比較するための機能です。

処理の流れ

  1. 案内中ルートがある状態でCompareRouteRequestインスタンスを生成します。
  2. 別ルートの条件を RouteOption によって調整します。
  3. Navi.compareRoute()を呼び出します。リスナで結果が通知されます。
  4. 処理結果が成功だった場合、新ルートで案内するか、案内中ルートの案内を継続するか選択できます。 新ルートで案内したい場合、Navi.startGuidance()の引数に compareRouteResult.getNewRoute() を指定します。 案内中ルートの案内を継続したい場合、Navi.cancelCompareRouteResult()を呼び出します。
Note:

処理結果表示中、新ルートと案内中ルートの選択/非選択をそれぞれ指定されたデザインで切り替えることができます。 デフォルトのデザインから変更したい場合は、「ルート線のデザイン変更」を参照して 事前にデザイン変更してください。

新ルートを選択したい場合、Navi.selectNewRoute()を呼び出します。
案内中ルートを選択したい場合、Navi.selectOldRoute()を呼び出します。

有料道路を全く使わないルートを探索するサンプルコードは以下の通りです。

CompareRouteRequest request = new CompareRouteRequest();
RouteOptions options = new RouteOptions();
options.setUseToll(false);
request.setRouteOptions(options);

Navi.getInstance().compareRoute(request, (errorCode, compareRouteResult) -> {
	if (errorCode != CompareRouteListener.ErrorCode.NONE) {
		// 処理失敗
		return;
	}

	if (!compareRouteResult.isChangeRoute()) {
		// ルートに変化なし
		return;
	}

	if (newRouteSelected()) {
		// 新しいルートが選択された
		Navi.getInstance().startGuidance(compareRouteResult.getNewRoute(), new StartGuidanceListener() {
			@Override
			public void onCompleted(ErrorCode errorCode, GuidePointResult guidePointResult) {
				if (errorCode == StartGuidanceListener.ErrorCode.NONE) {
					// 成功時の処理が何かあればここに記述
				}
			}
		});
	}
	}
	else {
		// 案内中ルートでの案内を継続する
		Navi.getInstance().cancelCompareRouteResult();
	}
});

Route Advisor

ルートアドバイザーとは、ルート案内中により良いルートを提供する機能のことです。

SDKは以下の条件のいずれかを満たすとき、新ルートを提案します。

  1. より良いルートが見つかった
    • 渋滞を回避して早く目的地に到着するルート
    • 到着時間と有料道路料金のバランスを考慮して一般道を走行するルート
  2. 交通状況の変化によりルート上に通行止めが発生した
    • 事故や工事など

「より良いルート」の提案はドライバーの判断で無視できます。しかし、通行止めによる新ルート提案は無視せず、ルート変更が必須であることを通知し、新ルートに切り替える必要があります。

提案を受ける

SDKから新ルートの提案を受けるにはRouteAdvisorListenerを設定します。

Navi.getInstance().addRouteAdvisorListener(new RouteAdvisorListener() {
	@Override
	public void onNewRouteProvideStarted(RouteAdvisorInfo routeAdvisorInfo) {
		// 新しいルートが提案された時に呼び出されます。
		// 画面に新ルートの特徴やルート全景を表示するとよいでしょう。
	}

	@Override
	public void onDistanceUpdated(RouteAdvisorInfo routeAdvisorInfo) {
		// 新ルートにした時、現在案内中ルートから逸れる地点までの距離が変化した時に呼び出されます。
		// あと何メートル以内に新・旧どちらかのルートを選んで欲しい、という処理を記述できます。
	}

	@Override
	public void onDistanceUpdateStopped() {
		// 新ルートが選ばれずにしばらく走行した時に呼び出されます。
		// これ以降、別のルートが提案されるまでリスナ呼び出しは発生しなくなります。
	}
});

ルート提案

Fig.1 - ルート提案

提案の種類を判別する

RouteAdvisorInfo.getType()で新ルートがどのような経緯で提案されたのか判別できます。

RouteAdvisorInfo.Type意味
CLOSE案内中ルートに生じた通行止めを回避する提案です
TIME_REGULATION案内中ルートに生じた時間規制による通行止めを回避する提案です
OTHER通行止め以外の要因の提案です
UNKNOWN未定義の提案です
注意:

CLOSEまたはTIME_REGULATIONの場合はドライバーに回避不能なルート変更がある旨を伝え、了承を得てから新ルートに切り替えてください。

UNKNOWNの場合は未定義のデータが含まれますので使用しないでください。

新ルートに切り替える

RouteAdvisorListenerで通知されるRouteAdvisorInfoNavi.startGuidance()の引数に指定します。

Navi.getInstance().startGuidance(routeAdvisorInfo.getNewRoute(), (errorCode, guidePointResult) -> {
	if (errorCode == StartGuidanceListener.ErrorCode.NONE) {
		// 新ルート切り替え成功
	}
	else {
		// 新ルート切り替え失敗
	}
});

案内中ルートを継続する

提案された新ルートが不要な場合、Navi.cancelRouteAdvisorRoute()で消去します。

Navi.getInstance().cancelRouteAdvisorRoute();
Note:

Navi.displayRouteAdvisorRoute()でルート探索結果表示中、新ルートと案内中ルートの選択/非選択をそれぞれ指定されたデザインで切り替えることができます。 デフォルトのデザインから変更したい場合は、「ルート線のデザイン変更」を参照して 事前にデザイン変更してください。

新ルートを選択したい場合、Navi.selectNewRoute()を呼び出します。
案内中ルートを選択したい場合、Navi.selectOldRoute()を呼び出します。

探索条件を変更する

提案されるルートの探索条件を変更する場合、RouteOptionsを設定し、Navi.changeRouteAdvisorOptions()の引数に指定します。

案内中ルートの探索条件を取得、有料道路を使用しない設定に変更するサンプルコードは以下の通りです。

// 案内中ルートの探索条件を取得
RouteOptions routeOptions = Navi.getInstance().getRoutePlan().getRouteOptions();
if (routeOptions == null) {
	routeOptions = new RouteOptions();
}

// 有料道路を使用しない設定にする
routeOptions.setUseToll(false);

// ルートアドバイザー探索条件変更
Navi.getInstance().changeRouteAdvisorOptions(routeOptions);

Access Interchange Select

この章では高速道路の入口・出口のインターチェンジを調整する方法を紹介します。

この機能によって以下のようなドライバーの要望に応えられます。

  • 高速道路を使う区間を絞っても所要時間にさほど変化がないので料金を抑えたい。
  • 使用するICの周辺はいつも混雑するので少しずらしたい。

調整可能な範囲は入口・出口、それぞれ前後3つ分です。 前後3つの間にジャンクションが存在している場合、それぞれの路線ごとに最大3つ分まで選択肢に加わります。

例えば、東名高速道路の浜松ICから高速道路に入る経路の場合、前後にジャンクションが存在しませんので基準地点(浜松IC)を含む7地点から選択できます。

入口IC選択

Fig.1 - ジャンクションがない場合

例えば、伊勢湾岸道路のみえ川越ICから高速道路を出る経路の場合、インターチェンジ3つ分の距離内に東名阪自動車道、新名神高速道路、国道475号線(東海環状自動車道)へ繋がるジャンクションが存在しています。 この場合、Fig.2のように各路線の出口を選択できます。

出口IC選択

Fig.2 - ジャンクションがある場合

乗り降りICのデータ構造

路線ごとに施設リストが格納されています。

路線には通し番号が振られていて、施設は固有のIDが振られています。 施設はインターチェンジがジャンクションのどちらかで、ジャンクションの場合はそのジャンクションに接続されている路線の通し番号リストが格納されています。

Fig.3はFig.1を図示したものです。

ジャンクションなし構造

Fig.3 - 浜松IC起点のデータ構造

Fig.4はFig.2を図示したものです。

みえ川越を起点としたリストには以下4つの路線が存在し、路線それぞれに施設リストが格納されています。

  1. 伊勢湾岸自動車道
  2. 東名阪自動車道
  3. 新名神高速道路
  4. 国道475号線(東海環状自動車道)

ジャンクションあり構造

Fig.4 - みえ川越IC起点のデータ構造

乗り降りIC指定処理の概要

  1. Navi.getAccessibleIC()にて施設情報を取得します。結果がAccessICGetListenerで通知されます。
  2. 画面に結果を表示して、ドライバーに施設を選択してもらいます。
  3. AccessICRerouteRequestオブジェクトを生成し、選択した施設のIDを設定します。
  4. Navi.reroute()にて、ルート再探索を実施します。結果がAccessICRerouteListenerで通知されます。ErrorCodeNONEであれば成功です。
{
	// 施設情報を取得します
	Navi.getInstance().getAccessibleIC(new AccessICGetListener() {
		@Override
		public void onCompleted(ErrorCode errorCode, AccessICGetResult accessICGetResult) {
			if (errorCode == AccessICGetListener.ErrorCode.NONE) {
			// 成功時の処理
			}
		}
	});
}

// ~~ 中略 ~~

{
	// 選択された施設からルート再探索要求用オブジェクトを構築し、ルート再探索を実施します。
	// 入口施設のIDは entranceFacilityId、 出口施設IDは exitFacilityId に格納されていると仮定します。
	AccessICRerouteRequest.ICSpecification entrance = new AccessICRerouteRequest.ICSpecification();
	entrance.setId(entranceFacilityId);
	entrance.setKind(AccessICRerouteRequest.ICSpecification.Kind.SET);

	AccessICRerouteRequest.ICSpecification exit = new AccessICRerouteRequest.ICSpecification();
	exit.setId(exitFacilityId);
	exit.setKind(AccessICRerouteRequest.ICSpecification.Kind.SET);

	AccessICRerouteRequest request = new AccessICRerouteRequest();
	request.setEntrance(entrance);
	request.setExit(exit);

	AccessICRerouteListener accessICRerouteListener = new AccessICGetListener() {
		@Override
		public void onCompleted(ErrorCode errorCode, AccessICGetResult accessICGetResult) {
			if (errorCode == AccessICGetListener.ErrorCode.NONE) {
			// 成功時の処理
			}
		}
	};

	// 案内開始前ルートがある場合、reroute()の引数にそのルートを指定する必要があります。
	if (Navi.getInstance().hasRouteCandidates()) {
		Navi.getInstance().reroute(Navi.getInstance().getSelectRouteResult(), request, accessICRerouteListener);
	}
	else {
		Navi.getInstance().reroute(request, accessICRerouteListener);
	}
}

Note:

入口、出口どちらかだけ変更することもできます。 例えば入口だけ変更したい場合はAccessICRerouteRequestオブジェクトのsetEntrance()だけを呼び出してください。

乗り降りIC指定解除の概要

AccessICRerouteRequestによって設定したインターチェンジを元に戻すことができます。

AccessICRerouteRequest.ICSpecificationオブジェクトを生成し、Kind.RELEASEを設定してください。 なお、施設IDは設定不要です。

AccessICRerouteRequest.ICSpecification entrance = new AccessICRerouteRequest.ICSpecification();
entrance.setKind(AccessICRerouteRequest.ICSpecification.Kind.RELEASE);

AccessICRerouteRequest request = new AccessICRerouteRequest();
request.setEntrance(entrance);

3つ先より遠いインターチェンジを探したい

起点となったインターチェンジではないインターチェンジに変更し、再度Navi.getAccessibleIC()を呼び出すと変更したインターチェンジを起点とした施設リストが生成されます。

この手順を繰り返すことで任意のインターチェンジから出入りできるようになります。

Restore Route

この章ではルートを復元するための方法を紹介します。

Navi.restoreRoute()にてルートを復元できます。
処理結果はGetRouteDataListenerで通知されます。

現在のユーザーIDにより実行された案内中ルートのルート情報取得に成功すると
Naviにattachされている全ての地図にルート情報の表示を行います。

Navi.getInstance().restoreRoute(new GetRouteDataListener() {
	@Override
	public void onCompleted(@NonNull ErrorCode restoreRouteErrorCode, @Nullable GetRouteDataResult getRouteDataResult) {
	}
});
Note:

目的地到着済みの場合は、ルート情報の表示を行いません。

Navigation

この章では音声や画面でドライバーを目的地に誘導する方法を紹介します。

誘導には以下の機能があります。

詳細は各機能のガイドを参照して下さい。

音声誘導

音声誘導とはドライバーに「いつ」「どのように行動するか」を音声で伝え目的地に導く機能です。
この章では音声誘導をドライバーに提供する方法を紹介します。

音声誘導は案内中ルートがある時だけ提供されます。
ルート探索・案内開始方法は「New Route」を参照してください。

案内方法

SDKが提供する案内方法は2種類あり、 Settingのナビモード設定によって変化します。

NaviMode特徴発話例
NORMAL距離を案内地点特定方法の主体とした案内です。
ナビ画面の残距離表示と地図を合わせて確認することで案内地点を特定します。
  • 3キロ先、左方向です。
  • およそ700メートル先、右方向です。
LANE_BY_LANE信号機や一時停止標識などの目印を案内地点特定方法の主体とした案内です。
画面に頼らず、信号機や道路案内標識などの運転中に視界に入る目印などを使い案内地点を特定します。
  • 二つ先の信号を右です
  • この踏切を超えて30メートル先、左です
  • まもなくENEOSを目印に左です
  • 10分程度、道なりです

誘導音声の取得方法

GuideEventListenerで誘導音声を取得するサンプルコードは以下の通りです。

Navi.getInstance().addGuideEventListener(new GuideEventListener() {
    @Override
    public void onGuide(@NonNull Guidance guidance) {
        switch (guidance.getKind()) {
			case PASSED:
			case FIRST_TIME:
			case SECOND_TIME:
			case THIRD_TIME:
			case JUST:
			case VOICE_NAVI:
				// 誘導音声のイベント受信処理
				break;
            default:
                break;
        }
    }
}
Note:

guidacePhraseはSDKにより自動的に音声再生されますが、音声が不要な場合はNavi.startVoiceEngineを呼び出さないか、Navi.stopVoiceEngineにより音声再生エンジンを停止して下さい。

NaviModeNORMALの場合、案内地点間の誘導回数は最大5回で、 GuideEventKindでどのタイミングにおける誘導なのかを通知します。

GuideEventKind意味
PASSED案内地点通過直後の案内。
FIRST_TIMEPASSEDの次の案内。
一般道では案内地点まで約700メートルの距離感。
高速道路では約2キロメートルの距離感。
SECOND_TIMEFIRST_TIMEの次の案内。
案内地点まで約300メートルの距離感。
高速道路では約1キロメートルの距離感。
THIRD_TIMESECOND_TIMEの次の案内。
案内地点まで約150メートルの距離感。
高速道路では約500メートルの距離感。
JUST曲がる直前の案内。
Note:

案内地点間の距離が短い場合、案内地点を通過した直後でも距離に応じたGuideEventKindを通知します。 例えば次の案内地点まで200メートルなら、PASSEDではなくTHIRD_TIMEを通知します。

NaviModeLANE_BY_LANEの場合は一律Common.GuideEventKind.VOICE_NAVIで通知します。

目的地・立ち寄り地到着案内

目的地や立ち寄り地に到着したとき、GuideEventListener.onGuide()による音声案内以外に、 DestinationArrivedListener.onArrived()またはWayPointArrivedListener.onArrived()を通知します。

これらの通知を受けるにはNavi.addDestinationArrivedListener()Navi.addWayPointArrivedListener()でリスナを設定してください。

//立寄地到着イベントリスナーを追加
Navi.getInstance().addWayPointArrivedListener(new WayPointArrivedListener() {
	@Override
	public void onArrived() {
	}
});

//目的地到着イベントリスナーを追加
Navi.getInstance().addDestinationArrivedListener(new DestinationArrivedListener() {
	@Override
	public void onArrived() {
	}
});

誘導画面

案内地点を画面で示すことで「どこで行動するか」をわかりやすく伝えられます。

この章では画面表示を主体とした誘導を提供する方法を紹介します。

画面表示の種類

下表に示す3種類が利用できます。

Type概要画像提供方式
交差点拡大図案内地点を地図の中心に置き、ルート線を矢印にして図示したものです。
拡大図
SDKがSupportMapFragment
に直接描画
案内イラスト案内地点形状と、どの車線をどう通過するか図示したものです。
案内イラスト
Bitmap
方面案内図方面看板に進行方向を図示したものです。
案内標識
Bitmap
ETCレーンイラストETCレーンを図示したものです。
ETCレーンイラスト
Bitmap

事前準備

交差点拡大図および案内イラストを利用する場合、案内地点の交差点情報をNavi.getIntersectionData()で事前に取得しておいてください。

// 交差点情報取得
Navi.getInstance().getIntersectionData(guidePointID, true, new GetIntersectionDataListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, GetIntersectionDataListener.Data data) {
		// 取得成功
		if (errorCode == ErrorCode.NONE && Navi.getInstance().getRouteNumber() == data.getRouteNumber()) {
			eraseGuidePointID = data.getEraseGuidePointID(); // Viewを非表示にするタイミングの判定に使用します。
			intersectionDataList = data.getIntersectionDataList(); // 後で使うので保持してください
		}
	}
});
Note:

案内地点間の距離が300メートル以内の場合、画面を残したまま連続で案内可能にするためIntersectionDataListには直近の案内地点とその次の地点が含まれます。

事後処理

RunInfoが示す次の案内地点のIDがeraseGuidePointIDよりも大きくなった時、表示していた交差点拡大図や案内イラストを非表示にします。

案内地点が短距離の間に連続する場合、getEraseGuidePointID()を呼び出した時点でのRunInfoの次の案内地点IDより2以上進んだ値になり得ます。 非表示・表示を繰り返すことによる画面ちらつきを防ぐため、getEraseGuidePointID()を非表示のトリガにすることを推奨します。

final int nextGuidePointId = Navi.getInstance().getRunInfo().getNextGuidePoint().getGuidePoint().getGuidePointID();
if (nextGuidePointId >= eraseGuidePointID) {
	// 非表示処理を実行してください
}

交差点拡大図

交差点拡大図はMap上の指定された枠に表示します。
表示枠の指定はMap.setIntersectionFrame()を使用します。

交差点拡大図を出すにはMap.showIntersection()を使用します。
この関数の引数にIntersectionMapSettingが必要ですが、動的に設定を変えなくてもよいなら次のように関数化しておくと便利です。

private IntersectionMapSetting createMyIntersectionMapSetting(FrameLayout frameLayout) {
	IntersectionMapSetting intersectionMapSetting = new IntersectionMapSetting();
	intersectionMapSetting.setZoomLevel(16.0);
	final float mapWidth = frameLayout.getWidth();
	final float mapHeight = frameLayout.getHeight();
	final float left = mapWidth * 0.2f;
	final float top = mapHeight * 0.2f;
	final float right = mapWidth * 0.8f;
	final float bottom = mapHeight * 0.8f;
	intersectionMapSetting.setArrowRange(new RectF(left, top, right , bottom));
	
	return intersectionMapSetting;
}

交差点拡大図を表示するサンプルコードは以下の通りです。

// 交差点拡大図のレイアウトパラメータを指定
map.setIntersectionFrame(frameLayout);

// 交差点拡大図を表示
IntersectionMapSetting intersectionMapSetting = createMyIntersectionMapSetting(frameLayout);
map.showIntersection(intersectionData, intersectionMapSetting, new IntersectionViewListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, int eraseGuidePointID) {
		// eraseGuidePointID は Navi.getIntersectionData() で取得したものと同じ値になります
	}
});

交差点拡大図の非表示はMap.hideIntersection()を使用します。

案内イラスト

案内イラストはBitMap制御によって表示します。

Navi.getIntersectionData()で取得したデータに交差点の案内イラストが存在していれば、Bitmapで参照できます。
取得したBitMapはImageViewなどで表示してください。

// 該当地点(guidePointId)のイラストを探す。
IntersectionData.IllustData illustData = null;
for (IntersectionData intersectionData : intersectionData) {
	if (intersectionData.getGuidePointID() == guidePointId) {
		illustData = intersectionData.getIllustData();
		break;
	}
}

if (illustData == null || illustData.getIllust() == null) {
	return;
}

Bitmap illustBmp = illustData.getIllust();

ImageView imageView = (ImageView)findViewById(ResoureIdOfIllust); // Resource IDはアプリ固有の値をご利用ください
imageView.setImageBitmap(illustData.getIllust());

方面案内図

方面案内図はBitMap制御によって表示します。

案内地点のGuidePoint.DistrictSignに方面案内図が存在していれば、GuidePoint.DistrictSign.getIllust()でBitmapを取得できます。
取得したBitMapはImageViewなどで表示してください。

GuidePoint.DistrictSign districtSign = Navi.getInstance().getRunInfo().getNextGuidePoint().getGuidePoint().getDistrictSign();
if (districtSign != null) {
	districtSign.getIllust(new GuidePoint.DistrictSign.IllustListener() {
		@Override
		public void onCompleted(ErrorCode errorCode, Bitmap illust) {
			if (errorCode == ErrorCode.NONE) {
				ImageView imageView = (ImageView)findViewById(ResoureIdOfDistrictSignIllust); // Resource IDはアプリ固有の値をご利用ください
				imageView.setImageBitmap(illust);
			}
		}
	});
}

ETCレーンイラスト

ETCレーンイラストはBitMap制御によって表示します。

通過交差点のPassPoint.ETCLaneIllustInfoにETCレーンイラストが存在していれば、PassPoint.ETCLaneIllustInfo.getIllust()でBitmapを取得できます。
取得したBitMapはImageViewなどで表示してください。

PassPoint.ETCLaneIllustInfo etcLaneIllustInfo = Navi.getInstance().getRunInfo().getNextPassPoint().getPassPoint().getETCLaneIllustInfo();
if (etcLaneIllustInfo != null) {
	etcLaneIllustInfo.getIllust(new PassPoint.ETCLaneIllustInfo.IllustListener() {
		@Override
		public void onCompleted(ErrorCode errorCode, Bitmap illust) {
			if (errorCode == ErrorCode.NONE) {
				ImageView imageView = (ImageView)findViewById(ResourceIdOfETCLaneIllust); // Resource IDはアプリ固有の値をご利用ください
				imageView.setImageBitmap(illust);
			}
		}
	});
}

その他の表示

画面表示に利用可能な要素を紹介します。

注意:

SDKはこれ以降に紹介する要素の表示用の画面部品を提供しません。
SDKを利用するアプリケーションでViewや画像を用意してください。

残距離

案内地点までの残距離を取得するにはRunInfo.GuidePointInfo.getDistance()を利用します。
RunInfoから取得してください。

float distanceUntilGuidePoint = Navi.getInstance().getRunInfo().getNextGuidePoint().getDistance();

案内方向

案内地点をどちらに曲がるのかを取得するにはGuidePoint.getDirection()を利用します。
RunInfoから取得してください。

GuidePoint.GuideDirection direction = Navi.getInstance().getRunInfo().getNextGuidePoint().getGuidePoint().getDirection();

交差点名

案内地点の交差点名称を取得するにはGuidePoint.getCrossName()を利用します。
RunInfoから取得してください。

String crossName = Navi.getInstance().getRunInfo().getNextGuidePoint().getGuidePoint().getCrossName();

信号機有無

案内地点に信号機が設置されているかどうかを取得するにはPassPoint.isTrafficLight()を利用します。
RunInfoから取得してください。

// 次の案内地点に対応する PassPoint を参照します
final boolean hasTrafficLightOnGuidePoint = Navi.getInstance().getRunInfo().getNextGuidePoint().getPassPoint().isTrafficLight();

車線

車線情報はGuidePoint.LaneInfoで定義されており、 案内地点や通過交差点の車線情報を取得するにはそれぞれ、

  • GuidePoint.getLane()
  • PassPoint.getLane()

を利用します。

LaneInfoは1本の車線を表現するデータ構造で、これをListで保持することで複数車線を表現します。
Listの先頭要素は左端の車線です。Indexが一つ増えるごとに1つ右の車線を示します。

LaneInfoが持つデータ概要を下表に示します。

要素解説
IncrementLane増加車線かどうか
LaneKind誘導種別
NO_GUIDE 非誘導(走行するとルートから逸れる)
GUIDE 誘導(走行可能だが次の案内地点の接続が悪い)
RECOMMENDATION 推奨
LaneArrow車線矢印。
その車線の進行方向を示す。

これらのデータを組み合わせることで、Fig.1のように車線を表現します。

参考車線画像

Fig.1 - 参考車線画像

注意:

有料道路上でLaneArrowについて

有料道路では地図データに車線矢印の情報が存在しないため、分岐の方向から推測した結果が格納されます。そのため実際の道路ペイントと比較して異なる可能性があります。
実際の道路ペイントと車線画像の一致性を求める場合、有料道路のLaneArrowを扱わないことを推奨します。

PassPoint及びGuidePointが有料道路上かどうかはisChargeInLink()にて判断が可能です。

地図上に直近の通過交差点の信号機や一時停止標識、踏切のアイコンを表示する

地図画面に信号機、一時停止標識、踏切のアイコンを拡大表示したい場合、まずRunInfo.PassPointInfoが示すPassPointの

  • PassPoint.isTrafficLight()
  • PassPoint.isStopSign()
  • PassPoint.isRailCross()

によってその地点に存在する地物を特定します。

PassPointを通過するごとに直近のPassPointのアイコンを更新するサンプルコードは以下の通りです。

// currentPassPointID, mapは広域変数と仮定します。

PassPoint pp = Navi.getInstance().getRunInfo().getNextPassPoint().getPassPoint();
if (pp.getPassPointID() == currentPassPointID) {
	return;
}

if (pp.getPassPointID() > currentPassPointID) {
	int iconRID = R.drawable.empty;
	if (pp.isTrafficLight()) {
		iconRID = R.drawable.traffic_light;
	}
	else if (pp.isStopSign()) {
		iconRID = R.drawable.stop_sign;
	}
	else if (pp.isRailCross()) {
		iconRID = R.drawable.rail_cross;
	}

	// 通過した地点のアイコンを消去
	map.deleteUserIcon("PassPoint");

	MapIcon icon = new MapIcon();
	icon.setImageResource(iconRID);
	icon.setID("PassPoint");
	icon.setPosition(pp.getGeoCoordinate());
	map.addUserIcon(icon);
}

Highway Mode

ハイウェイモードはFig.1のように高速道路の施設までの所要時間や施設が持つサービス一覧を提供する機能です。

ハイウェイモードサンプル

Fig.1 - ハイウェイモード画面例

この章ではハイウェイモードのデータを取り扱う方法を紹介します。

ハイウェイモード データ型の概要

ハイウェイモード データ型はHighwayInfoで表現されます。

このclassは大類すると以下2つのデータを持っています。

  • 出口までのルート上の施設情報(HighwayInfo.FacilityInfo)のリスト
  • 出口の情報(HighwayInfo.ExitInfo)

FacilityInfoはその施設がインターチェンジなのか、休憩施設なのか、ジャンクションなのか、といった施設種別や 現在地からの所要時間、施設名称が格納されます。
また、その施設に至るまでにある交通状況のアイコンも格納されます。(例: speed decrease_lane 故障車)
休憩施設の場合、その施設が提供するサービス(店舗情報、お手洗い、ハイウェイ情報ターミナルなど)が格納されます。 (例: starbucks eneos mac seveneleven)

ExitInfoFacilityInfoから交通規制アイコン、渋滞状況、駐車場混雑状況を削除したデータ型です。

Note:

HighwayInfoで提供するアイコンはResourceIDによる提供となります。
ImageViewなどのResourceIDを指定して描画できるViewでご利用ください。

ハイウェイモード データ取得方法

使用可能になるタイミングや更新タイミングはHighwayModeChangedListenerにて通知されますので、Navi.addHighwayModeChangedListener()でリスナを設定してください。

Navi.getInstance().addHighwayModeChangedListener(new HighwayModeChangedListener() {
	@Override
	public void onModeChanged(boolean isHighwayMode) {
		if (isHighwayMode) {
			// trueならハイウェイモードのデータが利用可能です。
		}
		else {
			// falseならハイウェイモードのデータが利用不能になります。
		}
	}

	@Override
	public void onUpdate() {
		// onUpdate()はデータ内容が更新されたことだけしか通知されませんので、これをトリガにNaviから取得します。
		HighwayInfo highwayInfo = Navi.getInstance().getHighwayInfo();
		if (highwayInfo != null) {
			// FacilityInfoは距離が近い順に格納されています
			for (HighwayInfo.FacilityInfo  facilityInfo : highwayInfo.getFacilities()) {
				// 施設までの距離
				if (facilityInfo.getDistance() > 0) {
				}

				// 施設までの所要時間
				if (facilityInfo.getTime() > 0) {
				}

				// 施設名と施設種別
				for (HighwayInfo.FacilityInfo.Info info : facilityInfo.getInfos()) {
				}

				// 施設までの混雑状況
				switch (facilityInfo.getJam()) {
				case JAM:
					break;
				case RUSH:
					break;
				case SMOOTH:
					break;
				default:
					break;
				}

				// サービスのアイコン
				for (HighwayInfo.FacilityInfo.Service service : facilityInfo.getServices())) {
				}

				// インシデントのアイコン
				for (HighwayInfo.FacilityInfo.Incident incident : facilityInfo.getIncidentList()) {
				}
			}

			// 出口情報
			HighwayInfo.ExitInfo exitInfo = highwayInfo.getExitInfo();
			if (exitInfo != null) {
				// 施設までの距離
				if (exitInfo.getDistance() > 0) {
				}

				// 施設までの所要時間
				if (exitInfo.getTime() > 0) {
				}

				// 施設名と施設種別
				for (HighwayInfo.FacilityInfo.Info info : exitInfo.getInfos()) {
				}
			}
		}
	}
});
Note:

高速道路上に目的地が設定されている場合、出口情報は取得できません。(nullになります。)

Note:

FacilityInfoは施設への分岐開始地点までの距離が格納され、 その施設を通過し終わるまでは距離が0以下の値になり、FacilityInfo Listに残ります。
このような状態の施設の残距離を表示する場合は特別に "施設付近" のような表現を使うとよいでしょう。

Location

この章では自車位置がルート上のどこにいるのか把握する方法と、ルート逸脱からの復帰手段を紹介します。

ルートと案内地点、通過交差点の関係

GuidePointPassPointはルート全体を網羅するよう生成され、それぞれリスト管理されています。

Fig.1はルート全体とGuidePointPassPointがどう対応付くのか示したイメージです。
このルートはコンビニを立ち寄り地に設定していて、途中で踏切を通過します。

GuidePoint/PassPoint概要

Fig.1 - ルート全体と案内地点・通過交差点のイメージ

Fig.1に示したルートには案内地点が4つあります。

  • GuidePoint:1 -- ルート開始地点から最初の突き当たり
    ここで右折の案内が必要ですので案内地点になっています。
  • GuidePoint:2 -- コンビニに設定された立ち寄り地
    立ち寄り地は接近・到着したことの案内が必要ですので案内地点になっています。
  • GuidePoint:3 -- 踏切を超えた先の信号機がある十字路
    ここで左折の案内が必要ですので案内地点になっています。
  • GuidePoint:4 -- 目的地
    目的地は接近・到着したことの案内が必要ですので案内地点になっています。

Fig.1に示したルートには通過交差点が8つあります。

  • PassPoint:1 -- ルート開始地点から最初の突き当たり (GuidePoint:1)
    案内地点は必ずPassPointが生成されます。
    信号機があるPassPointはisTrafficLight()trueを返します。
  • PassPoint:2 -- 信号機のある丁字路
    案内が不要な地点にもPassPointは生成されます。
  • PassPoint:3 -- コンビニに設定された立ち寄り地 (GuidePoint:2)
    立ち寄り地は必ずPassPointが生成されます。
  • PassPoint:4 -- 踏切まえの信号機がある十字路
  • PassPoint:5 -- 踏切
    踏切があるPassPointはisRailCross()trueを返します。
  • PassPoint:6 -- 踏切後の信号機がない十字路
    信号機がない交差点もPassPointになり得ます。
  • PassPoint:7 -- 踏切後の信号機がある十字路 (GuidePoint:3)
  • PassPoint:8 -- 目的地 (GuidePoint:4)
    目的地は必ずPassPointが生成されます。

なお、
Navi.getGuidePointList()で案内地点リストを、
Navi.getPassPointList()で通過交差点リストをそれぞれ取得できます。

自車位置情報(RunInfo)の概要

RunInfoは以下の情報で構成されます。

  • 直近のGuidePointまでの距離や時間といった案内地点情報:GuidePointInfo
  • 直近のPassPointまでの距離や時間といった通過交差点情報:PassPointInfo
  • 自車走行速度や自車方位、走行中道路の名称や速度制限といった自車位置情報: OwnCarInfo
  • 目的地までの距離や時間といった目的地情報:DestinationInfo

OwnCarInfoDestinationInfoの詳細はAPI Referenceをご覧ください。

GuidePointGuidePointInfoの違いについて

GuidePoint, PassPointは直前の地点からの情報を提供します。これらは自車位置によらず内容は変化しません。

GuidePoint,PassPoint

Fig.2 - GuidePoint, PassPointが示すデータ

一方、GuidePointInfo, PassPointInfoは自車位置に基づいた次の地点までの情報を提供します。

GuidePointInfo,PassPointInfo

Fig.3 - GuidePointInfo, PassPointInfoが示すデータ

案内中ルートがない時のRunInfo

案内中ルートがない時にもRunInfoは提供され続けますが、有効なデータは次の2種類のみになります。

  • OwnCarInfo
  • PassPointInfo

案内中ルートがない場合のPassPointInfoは、予測進路上の通過交差点情報を提供します。
予測進路上の地点情報かどうかは、PassPointInfo.isPredicted()で判断できます。

予測進路上の通過交差点リストはNavi.getDetailPassPointList()で取得できます。

Navi.getPassPointList()は案内中ルートがある時だけ取得でき、目的地までのすべての地点が含まれます。
Navi.getDetailPassPointList()は案内中ルートの有無に関わらず取得でき、自車位置から一定距離以内の地点のみ含まれます。

どちらの関数もPassPointのListを返却しますが、Navi.getPassPointList()で得られるオブジェクトには以下のデータが含まれていません。
booleanを返却する関数は全てfalseを、オブジェクトを返却する関数は全てnullを返却します。

  • オービス情報(getOrbisGuidanceInfo(), isOrbis())
  • 合流案内音声情報(getJoinGuidanceInfo())
  • 踏切案内音声情報(getRailCrossGuidanceInfo())
  • レーン案内音声情報(getLaneGuidanceInfo())
  • 方面案内音声情報(getDistrictSignGuidanceInfo())
  • ワークロード情報(getWorkLoadInfo())
  • 橋かどうか(isBridgeEntrance(), isBridgeExit(), isBridgeInLink(), isBridgeOutLink())
  • 冠水注意地点かどうか(isFloodingZoneEntrance(), isFloodingZoneExit(), isFloodingZoneInLink(), isFloodingZoneOutLink())
  • 未舗装路かどうか(isUnpavedRoadEntrance(), isUnpavedRoadExit(), isUnpavedRoadInLink(), isUnpavedRoadOutLink())
  • 急カーブ情報(getCurveInfo())
  • 事故多発地点かどうか(isAccidentProneEntrance(), isAccidentProneExit(), isAccidentProneInLink(), isAccidentProneOutLink(), isAccidentProneSpot())

特に注意すべき点として、オービスがあるかどうか(isOrbis())はNavi.getPassPointList()で得られるオブジェクトでは必ずfalseになります。

トンネルでの挙動について

SDKはトンネル内走行中は、推定速度を使用して走行状態を維持します。
この走行状態はトンネル内で自車位置を更新できない状態を防ぐための機能です。

この機能により、トンネル内でも次のことが可能になります。

  • 音声誘導を提供可能
  • 地図上の自車位置アイコンを更新可能

ただし、この状態では正確に自車位置を更新することができません。

SDKが推定速度による走行状態になっているかどうかは、OwnCarInfo.isUsingEstimatedVelocity()で確認できます。

boolean isUsingEstimatedVelocity = Navi.getInstance().getRunInfo().getOwnCarInfo().isUsingEstimatedVelocity();

到着予想時間について

目的地・立寄り地までの到着予想時間は、目的地情報:DestinationInfoより所要時間(sec)を取得して
出発時刻もしくは現在時刻に、取得した所要時間を足し合わせれば、おおよその到着時刻が確認可能です。

// 自車位置情報取得
RunInfo runInfo = Navi.getInstance().getRunInfo();

// 目的地までの所要時間を取得
int destinationArrivalTime = runInfo.getDestinationInfo().getTime();

// 直近の立寄り地までの所要時間を取得
int nearestWayPointArrivalTime = runInfo.getWayPointInfo(runInfo.getOwnCarInfo().getRouteSectionNo()).getTime();

オートリルート

SDKがルートを逸れる道路を走行したことを検知すると、自動的にその道路から目的地までのルートを再探索します。 この再探索機能をオートリルートといいます。

再探索開始と完了の検知方法

AutoRerouteListenerにて再探索開始と完了をそれぞれ通知します。
この通知を受けたい場合、Navi.addAutoRerouteListener()でリスナを登録してください。

Navi.getInstance().addAutoRerouteListener(new AutoRerouteListener() {
	@Override
	public void onStarted() {
		// 再探索開始時の処理
	}

	@Override
	public void onFailed(ErrorCode errorCode) {
		// 再探索失敗時の処理
	}

	@Override
	public void onCompleted(ErrorCode errorCode, AutoRerouteResult autoRerouteResult) {
		// 再探索成功時の処理
	}
});

並走道路の判断間違い

SDKは並走道路を走行中、稀に逆の道路を走行中と判断する事があります。
この時、SDKは独力でこの間違いを検出できません。 そのためSDKは走行している道路を切り替える機能Navi.switchAnotherRoad()を提供しています。

道路切り替え処理のサンプルは以下の通りです。

Navi.getInstance().switchAnotherRoad();

実行結果はSwitchAnotherRoadResultListenerで通知されます。 リスナ登録処理のサンプルは以下の通りです。

// リスナ登録
Navi.getInstance().addSwitchAnotherRoadResultListener(new SwitchAnotherRoadResultListener() {
	@Override
	public void onCompleted(ResultCode resultCode) {
		switch (resultCode) {
			case SUCCESS_IC_ENTRANCE: // IC入口への別道路切換を実施して成功した
				break;
			case SUCCESS_IC_EXIT: // IC出口への別道路切換を実施して成功した
				break;
			case SUCCESS_NORMAL: // 一般道への別道路切換を実施して成功した
				break;
			case SUCCESS_TOLL: // 高速・有料道への別道路切換を実施して成功した
				break;
			case FAIL_NORMAL: // 一般道への別道路切換に失敗
				break;
			case FAIL_TOLL: // 高速・有料道への別道路切換に失敗
				break;
			case INVALID:
			case FAIL_UNKNOWN:
			default:
				// 別道路切換に失敗
				break;
		}
	}
});

到着判定

SDKは以下の場合、目的地(立ち寄り地)に到着したと判断しそれ以降は誘導情報の更新を行いません。

  • オンルートの場合
    目的地のGuidePointまで残り50m以下となった場合  

オンルートの場合の到着

Fig.4 - オンルートでの到着判定

  • オフルートの場合
    目的地の緯度経度まで直線距離で50m以内の場合、もしくは目的地のGuidePointの緯度経度まで直線距離で50mの場合

    オフルートの場合の到着

    Fig.5 - オフルートでの到着判定

    この場合destinationInfo.getDistance()はオフルートになった地点(Fig.5の波線開始位置)を最後に距離更新が止まります。

目的地に到着した場合はDestinationArrivedListener.onArrived()、立ち寄り地に到着した場合はWayPointArrivedListener.onArrived()が通知されます。

ナビゲーション以外の案内

目的地へのルートが設定されている場合、目的地へ到着するための案内(ナビゲーション) が行われますが、この章ではその他の案内について解説します。

  • 渋滞情報案内

    • 道路や駐車場の渋滞や通行規制に関しての案内です。
  • 注意案内

    • ドライバーに運転中の注意を促すための案内です。

詳細は各機能のガイドを参照して下さい。

Traffic Guide

渋滞情報案内機能

渋滞情報案内機能では道路や駐車場の渋滞に関する情報を提供します。以下の機能に大別されます。

詳細は各機能のガイドを参照して下さい。

渋滞情報の更新

地図上に表示する機能(渋滞・規制線表示、通行規制アイコン表示、駐車場混雑状況アイコン表示)は機能をONに設定後、定期的に自動更新されます。

渋滞・通行規制案内情報はアプリの任意のタイミングで最新の情報を取得することができます。

渋滞情報のソース

渋滞情報のソースには以下の2種類があります。

  • VICS
    • VICSセンター提供の渋滞情報です。通行規制や駐車場混雑状況はVICS提供の渋滞情報でのみ取得可能です。
  • プローブ情報

Traffic Guidance

この章では渋滞・通行規制案内情報を取得するための方法を紹介します。

取得可能な情報

ルート上の渋滞・通行規制案内情報、または自車位置周辺の通行規制案内情報を取得することができます。

渋滞案内情報

渋滞案内情報ではルート上の渋滞に関する以下のような情報を取得することができます。

  • 渋滞の最後尾(渋滞が始まる地点)
  • 渋滞の長さ
  • 渋滞の通過までにかかる時間
  • 音声案内フレーズ
    • 渋滞に関する音声案内情報
    • 例)「およそ500メートル先、400メートルの渋滞が発生しています。通過に5分ほどかかります。」

通行規制案内情報

通行規制案内情報ではルート上の交通規制に関する情報を取得することができます。またルートが無い場合には自車位置周辺の交通規制に関する情報を同様に取得することが可能です。

  • 規制の発生地点
  • 規制の情報
    • 例:"車線規制"
  • 規制の原因
    • 例:"追突事故"
  • 音声案内フレーズ
    • 規制に関する音声案内情報
    • 例)「10キロ以上先、追突事故のため、車線規制です。」

渋滞・通行規制案内情報取得方法

Navi.getTrafficGuideData()を呼び出して下さい。処理が完了すると、Listenerにて渋滞・通行規制案内情報取得結果が通知されます。

状況に応じて取得可能な情報は変わります。

  • 案内中のルートがある場合
    ルート上の自車位置から先(一般道なら30km、高速道なら50kmまで)の渋滞・通行規制案内情報が取得できます。

  • 案内中のルートがない場合
    自車位置周辺20kmの範囲の通行規制情報のみ取得できます。

Draw Jam Line

この章では渋滞・規制線を地図上に表示するための方法を紹介します。

渋滞・規制線

渋滞・規制線には以下の種類があります。

種類意味
順調線該当道路区間が順調に流れている
混雑線該当道路区間が混雑している
渋滞線該当道路区間が渋滞している
規制線該当道路区間に通行規制がかかっている
通行止め該当道路区間が通行止め

渋滞・規制線の表示方法

Map.setValidationTrafficLine()にtrueを渡すことで地図上に渋滞線の表示を行うことができます。

また、渋滞線の種類ごとに表示、非表示関数が用意されています。

種類関数
順調線Map.setDisplayTrafficSmoothLine()
混雑線、渋滞線Map.setDisplayTrafficJamLine()
規制線、通行止めMap.setDisplayTrafficRegulationLine()

個別に表示、非表示を切り替えたい場合に使用して下さい。

渋滞線の矢印表示

渋滞線の矢印部分はMap.setDisplayTrafficLineArrow()で表示有無を切り替えることができます。

矢印あり
矢印あり

矢印なし
矢印なし

渋滞情報更新時刻の取得

Map.addTrafficTimestampListener()でリスナーを追加することで地図上の渋滞情報(渋滞・規制線、通行規制アイコン駐車場混雑状況アイコンいずれか)が更新された時刻を取得することができます。

リスナーを追加せずアプリの任意のタイミングで更新時刻を取得した場合はMap.getTrafficTimestamp()を使用して下さい。

Navi.getTrafficTimestamp()はルート探索時に使う渋滞情報の更新時刻のため、地図上の渋滞情報の更新時刻とは異なります。

Display Incident Spot

この章では通行規制アイコンを地図上に表示するための方法を紹介します。

通行規制アイコンの表示方法

Map.setValidationTrafficIncident()にtrueを渡すことで地図上に通行規制アイコンの表示を行うことができます。

通行規制アイコン

規制の種別に応じたアイコンが自動的に表示されるため、アプリで特別な制御をする必要はありません。

詳細な規制情報の取得

通行規制アイコンが表示されている場所の詳細な規制情報(規制の内容、原因等)を取得することができます。

詳細な規制情報取得の流れは以下の通りです。

  1. アイコンクリック通知リスナーで通行規制アイコンのクリックを検知します。
  2. アイコンのIDを取得します。
  3. 取得したIDを引数にMap.getTrafficIncidentInfo()を呼び出します。
map.addOnIconClickListener(new OnIconClickListener() {
    @Override
    public void onIconClick(IconKind kind, MapIcon icon) {
        if (kind == IconKind.INCIDENT) {
            TrafficIncidentInfo info = map.getTrafficIncidentInfo(icon.getID());
            // infoに規制情報が格納されています
        }
    }
});

全てのアイコンの詳細な規制情報を取得する場合はMap.getTrafficIncidentInfoAll()を呼び出して下さい。

Display Parking Status

この章では駐車場混雑状況アイコンを地図上に表示するための方法を紹介します。

駐車場混雑状況アイコンの表示方法

Map.setValidationTrafficParking()にtrueを渡すことで地図上に駐車場混雑状況アイコンの表示を行うことができます。

駐車場混雑状況アイコン

駐車場の混雑状況に応じたアイコンが自動的に表示されるため、アプリで特別な制御をする必要はありません。

詳細な駐車場情報の取得

駐車場混雑状況アイコンが表示されている駐車場の詳細な情報(混雑状況、収容台数等)を取得することができます。

詳細な駐車場情報取得の流れは以下の通りです。

  1. アイコンクリック通知リスナーで駐車場混雑状況アイコンのクリックを検知します。
  2. アイコンのIDを取得します。
  3. 取得したIDを引数にMap.getTrafficParkingInfo()を呼び出します。
map.addOnIconClickListener(new OnIconClickListener() {
    @Override
    public void onIconClick(IconKind kind, MapIcon icon) {
        if (kind == IconKind.PARKING) {
            TrafficParkingInfo info = map.getTrafficParkingInfo(icon.getID());
            // infoに駐車場情報が格納されています
        }
    }
});

全てのアイコンの詳細な駐車場情報を取得する場合はMap.getTrafficParkingInfoAll()を呼び出して下さい。

Caution Guide

この章では注意案内情報を取得するための方法を紹介します。

注意案内

目的地へのルートが設定されている場合、目的地へ到着するための案内が行われますが、それ以外にもドライバーに運転中の注意を促すための案内(注意案内)が行われる場合があります。

注意案内情報は目的地への案内情報と同じくGuideEventListenerを通じてアプリに通知されます。 一時停止案内以外は音声案内用の案内フレーズ情報も一緒に通知され、Navi.startVoiceEngine()により音声案内エンジンの初期化が完了している場合はフレーズが効果音と共に音声再生されます。

Note:

目的地へ到着するための案内情報はルートが設定されている場合のみ通知されますが、注意案内はルートが設定されていない場合でも通知される場合があります。

踏切案内

走行中の道路の前方に踏切がある場合、アプリに踏切に関する案内情報が通知されます。

例)「この先踏切です。ご注意下さい」

合流案内

走行中の道路の前方に合流がある場合、アプリに合流に関する案内情報が通知されます。

例)「この先、左からの合流があります。ご注意下さい」

右左折専用レーン案内

走行中の道路の前方に右折、または左折用の専用レーンがある場合、アプリにレーンに関する案内情報が通知されます。

例)「およそ300m先、左折専用レーンがあります。ご注意ください。」

一時停止案内

走行中の道路の前方に一時停止がある場合、アプリに一時停止に関する案内情報が通知されます。

他の注意案内と異なり案内フレーズ情報はありませんが、Navi.startVoiceEngine()により音声案内エンジンの初期化が完了している場合は専用の通知音が再生されます。他の注意案内のような効果音の再生は行われません。

オービス案内

走行中の道路の前方にオービスがある場合、アプリにオービスに関する案内情報が通知されます。

例)「この先、速度取り締まり機が設置されています。」

案内情報の取得方法

GuideEventListenerで注意案内情報を取得するサンプルコードは以下の通りです。

Navi.getInstance().addGuideEventListener(new GuideEventListener() {
    @Override
    public void onGuide(@NonNull Guidance guidance) {
        switch (guidance.getKind()) {
            case RAIL_CROSS:
            case STOP_SIGN:
            case JOIN_NONE:
            case JOIN_FROM_RIGHT:
            case JOIN_FROM_LEFT:
            case EXPERT_LANE:
            case ORBIS:
                // 注意案内のイベント受信処理
                break;
            default:
                break;
        }
    }
}

GuideEventKindで注意案内に該当する通知かどうかを判別することができます。

guidacePhraseはSDKにより自動的に音声再生されますが、音声が不要な場合はNavi.startVoiceEngineを呼び出さないか、Navi.stopVoiceEngineにより音声再生エンジンを停止して下さい。

注意案内の有効、無効切り替え方法

以下の関数で注意案内の有効、無効を個別に切り替えることができます。

案内種別関数
踏切案内Navi.setRailCrossGuidanceEnabled()
合流案内Navi.setJoinGuidanceEnabled()
右左折専用レーン案内Navi.setExpertLaneGuidanceEnabled()
一時停止案内Navi.setStopSignGuidanceEnabled()
オービス案内Navi.setOrbisGuidanceEnabled()

Map Version

この章はSDKで使用する地図データのバージョンとその更新方法を紹介します。

詳細は各機能のガイドを参照して下さい。

地図データの種類について

地図データはルートの探索・案内など、ナビゲーション動作に必要なデータと表示用のデータに分かれています。 表示用のデータはアプリで特別な更新処理を行う必要はなく自動的に更新されますが、ナビゲーション用データに関してはアプリ側で更新処理を行う必要があります。

以降「地図データ」は表示用データではなくナビゲーション用のデータのことを指します。

Get Map Version

この章は地図データのバージョン情報を取得する方法を紹介します

地図データバージョン情報の取得方法

サーバ上の地図データは定期的に最新のデータに更新され、それぞれ個別のバージョン情報が付与されています。

サーバ上の地図データのバージョンはVersion.getMapVersion()で取得することができます。VersionNavi.getVersion()で取得することが可能です。

Navi.getInstance().getVersion(new GetVersionListener() {
    @Override
    public void onCompleted(ErrorCode errorCode, Version version) {
        if (errorCode == GetVersionListener.ErrorCode.NONE) {
            // version.getMapVersion()で地図データバージョン情報の取得が可能
            String mapVersion = version.getMapVersion();
        }
    }
}

versionからはSDKのバージョン情報等も取得することができます。

Data Update

この章では使用する地図データを更新するための方法を紹介します。

最新地図データ利用可能通知

サーバ上の地図データは定期的に最新のデータに更新されますが、古いデータも1つだけ保持されており、最新とその1つ前のデータが利用可能です。

使用中の地図データより新しいバージョンの地図データを検出した場合、DataUpdateListenerを通じてアプリに通知されますが、検出されたデータバージョンのパターンによりそれぞれ以下の関数を通じて通知されます。

  • dataUpdated()

    • 使用中の地図データバージョンが最新ではないが、サーバ上に地図データが存在し動作が可能な場合に通知
    • 例)
      • SDKが使用中のバージョン:"1"
      • 最新のバージョン:"2"
      • サーバ上で保持されている地図バージョン:"1", "2"
        • SDKが使用中のバージョン"1"が保持されているため動作可能
  • dataDeleted()

    • 使用中の地図データバージョンが最新でなく、サーバ上に地図データが存在せず動作が不可能な場合に通知
    • 例)
      • SDKが使用中のバージョン:"1"
      • 最新のバージョン:"3"
      • サーバ上で保持されている地図バージョン:"2", "3"
        • SDKが使用中のバージョン"1"が保持されていないため動作不可能

通知を受信するためのサンプルコードは以下の通りです。

NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());

initInfo.setDataUpdateListener(new DataUpdateListener() {
    @Override
    public void dataUpdated(boolean hasRoute, NaviInitInfo.DataHandlingProcess dataHandlingProcess) {
    }

    @Override
    public void dataDeleted(boolean hasRoute, NaviInitInfo.DataHandlingProcess dataHandlingProcess) {
    }
}

使用地図データ更新処理

SDKではサーバ上のどの地図データを使用するかという情報を保持しています。DataUpdateListenerは最新の地図データの検出を通知するのみで、使用する地図データそのものは更新されません。地図データの更新はアプリの再起動後のSDK初期化処理中に行われます。

アプリ動作中の更新処理

dataUpdate()受信時

地図データ更新はアプリの再起動後のSDK初期化処理中に行われるため、アプリ動作中に最新地図データ利用可能通知を受信し、使用中の地図データを更新する場合はアプリの再起動が必要です。 ただしDataUpdateListener.dataUpdated()通知ではサーバ上に現在使用中の地図データが保持されているため、再起動せずそのまま動作を継続することも可能です。

フロー

dataDeleted()受信時

DataUpdateListener.dataDeleted()通知ではサーバ上に現在使用中の地図データが存在しないため、そのまま動作を継続することができません。再起動を行い、使用中の地図データの更新を行う必要があります。

フロー

SDK初期化中の更新処理

アプリ起動中のSDK初期化処理時に、SDKでは現在使用中の地図データより新しい地図データがサーバ上で利用可能かどうかのチェックを行なっており、利用可能な場合は使用する地図データを最新のものに更新します。

また前回動作中にルートが引かれておりそのルートの案内中だった場合、そのルートは古い地図データ用のルートであるため削除され、自動的に最新の地図データ用のルートが再探索され地図上に反映されます。

注意:

DataUpdateListener.dataUpdated()/dataDeleted()通知を受信して再起動を行っていない場合でも新しい地図データがサーバ上で利用可能であることが検出された場合も同ように更新処理が行われます。

SDK初期化中の地図データ更新処理中にもDataUpdateListener.dataUpdated(), DataUpdateListener.dataDeleted()通知は行われます。SDK初期化中の通知とアプリ動作中の通知は通知時のdataHandlingProcessで以下のように判別可能です。

  • SDK初期化中の場合
    • DataHandlingProcess.UPDATE_WITH_ROUTE
  • アプリ動作中の場合
    • DataHandlingProcess.STAY
注意:

再起動を繰り返してしまうため、SDK初期化中のDataUpdateListener.dataUpdated(), DataUpdateListener.dataDeleted()通知ではアプリの再起動は行わないで下さい。

NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());

initInfo.setDataUpdateListener(new DataUpdateListener() {
    @Override
    public void dataUpdated(boolean hasRoute, NaviInitInfo.DataHandlingProcess dataHandlingProcess) {
        if (dataHandlingProcess == NaviInitInfo.DataHandlingProcess.STAY) {
            // アプリ動作中の場合。データ更新する場合はアプリの再起動が必要
        }
        else if (dataHandlingProcess == NaviInitInfo.DataHandlingProcess.UPDATE_WITH_ROUTE) {
            // SDK初期化中の場合。再起動してはいけない
        }
        else {
            // エラー処理
        }
    }

    @Override
    public void dataDeleted(boolean hasRoute, NaviInitInfo.DataHandlingProcess dataHandlingProcess) {
        if (dataHandlingProcess == NaviInitInfo.DataHandlingProcess.STAY) {
            // アプリ動作中の場合。アプリの再起動が必要
        }
        else if (dataHandlingProcess == NaviInitInfo.DataHandlingProcess.UPDATE_WITH_ROUTE) {
            // SDK初期化中の場合。再起動してはいけない
        }
        else {
            // エラー処理
        }
    }
}

使用地図データ更新完了通知

地図データの更新はアプリの再起動後のSDK初期化処理中に行われ、更新完了時にDataUpdateListener.dataUpdateCompleted()によって通知されます。

NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());

initInfo.setDataUpdateListener(new DataUpdateListener() {
    @Override
    public void dataUpdateCompleted(DataUpdateCompleteListener.ErrorCode dataUpdateErrorCode, CalcRouteListener.ErrorCode routeErrorCode, CalcRouteResult calcRouteResult) {
        // ルートが再探索された場合はcalcRouteResultに結果が格納される
    }
}

この通知を受け取ることでアプリはナビゲーション用の地図データの更新をユーザーに知らせることができます。

ProbeData

この章はプローブデータの収集について紹介します。

詳細は各機能のガイドを参照して下さい。

プローブデータのみ利用する場合の注意点

プローブデータのみ利用する場合、以下の機能が利用できます。

  • 車両情報の設定/取得
  • プローブデータ収集の開始/停止
  • 位置情報更新の開始/終了

上記以外の機能である、

  • 地図描画
  • 目的地検索
  • ルート探索
  • 誘導案内

は利用できません。

Note:

Mapにおいて、すべてのIFの使用を避けてください。

Note:

Naviにおいて、以下のIF以外は機能しないため、使用を避けてください。

  • Navi.initializeinitialize(NaviInitInfo initInfo,NaviInitListener initListener)
  • Navi.stop()
  • Navi.getVersion(GetVersionListener listener)
  • Navi.changeProbeDataVehicleInfo(probeDataVehicleInfo: ProbeDataVehicleInfo?)
  • Navi.getProbeDataVehicleInfo()
  • Navi.startCollectProbeData()
  • Navi.stopCollectProbeData()
  • Navi.addProbeDataUploadEventListener(ProbeDataUploadEventListener listener)
  • Navi.removeProbeDataUploadEventListener(ProbeDataUploadEventListener listener)
  • Navi.startPositioning()
  • Navi.startPositioning(PositioningSetting positioningSetting)
  • Navi.stopPositioning()

Collect Setting

この章ではプローブデータの収集設定方法を紹介します。

収集できるプローブデータの種類

DataTypeに設定できる定義と収集頻度は以下になります。

種別説明
NAVI_INFOナビゲーション情報
位置更新毎に記録される
ROUTE_ACTION_LOGルートに関する情報
ルートの新規探索、リルート、ルート削除等。ルート情報に変化があった場合に記録される
VEHICLE_INFO車両情報
車両情報に変化があった場合に記録される
HW_SENSOR_INFOセンサ(加速度・ジャイロ)情報
GNSS_INFOGNSS位置情報・受信状況
LOCATION_INFO補正後の位置情報(GPS/GNSS、WiFi基地局情報、携帯電話網基地局情報を組合せた統合位置情報集合)
ACTIVITY_LOG_INFOユーザーの移動体系が変わった際の情報
前回の値(移動種別、変化した緯度経度)と今回の値の2つが記録される

収集を行う

プローブデータの収集はNavi.initialize()のタイミングでNaviInitInfo.setProbeDataSettingInfo()を設定します。

設定が必要な項目は以下の通りです。

ProbeDataSettingInfo設定内容関数名必須/任意
収集するデータ種別setCollectDataTypeList必須
データのサーバーへのアップロード間隔setUploadInterval10秒から600秒の間で任意
車両情報setProbeDataVehicleInfo任意

NAVI_INFOROUTE_ACTION_LOGを収集するサンプルコードは以下の通りです。

NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());

// 認証情報等の設定は割愛

// プローブデータの収集設定を行う
ProbeDataSettingInfo probeDataSettingInfo = new ProbeDataSettingInfo();
probeDataSettingInfo.setCollectDataTypeList(Arrays.asList(
        ProbeDataSettingInfo.DataType.NAVI_INFO, 
        ProbeDataSettingInfo.DataType.ROUTE_ACTION_LOG));
initInfo.setProbeDataSettingInfo(probeDataSettingInfo);

// 初期化開始
Navi.getInstance().initialize(initInfo, (errorCode, naviInitResult) -> {
    if (errorCode == NaviInitListener.ErrorCode.NONE) {
        // データの収集と自動アップロードの開始
        Navi.getInstance().startCollectProbeData();
    }
});

収集を停止する

プローブデータの収集を停止するにはNavi.stopCollectProbeData()を呼び出します。

// プローブデータ収集を停止する
Navi.Navi.getInstance().stopCollectProbeData()

ACTIVITY_LOG_INFOを収集する場合

ACTIVITY_LOG_INFOの収集は、ユーザーの移動体系の変更を検知するためにActivity Recognition Transition APIを使用します。

そのため以下のアクティビティ権限が必要となります。

  • android.permission.ACTIVITY_RECOGNITION
  • com.google.android.gms.permission.ACTIVITY_RECOGNITION

AndroidManifest.xmlに上記権限を追加し、ユーザーに使用権限リクエストを行うようにしてください。

アクティビティ権限が許可されない場合でも、基本的な機能(ナビゲーション機能等)は影響なく動作します。

ユーザーが使用権限リクエストを拒否した場合、ACTIVITY_LOG_INFOの収集は無効化されます。

収集したプローブデータを受ける

SDKから収集したプローブデータを受けるには
Navi.addProbeDataUploadEventListener()にてProbeDataUploadEventListenerを追加します。
追加したProbeDataUploadEventListenerNavi.removeProbeDataUploadEventListener()で削除が可能です。

// リスナーを定義する
ProbeDataUploadEventListener listener = new ProbeDataUploadEventListener() {
    @Override
    public void onUploadedNavigationLog(List<ProbeDataNavigationLog> probeDataNavigationLogList) {
        // ナビゲーションログが通知される
    }

    @Override
    public void onUploadedRouteActionLog(List<ProbeDataRouteActionLog> probeDataRouteActionLogList) {
        // ルートアクションログが通知される
    }

    @Override
    public void onUploadedSystemStatusLog(List<ProbeDataGnssLocation> probeDataGnssLocationList,
                                          List<ProbeDataFusedLocation> probeDataFusedLocationList,
                                          List<ProbeDataMotion> probeDataMotionList,
                                          ProbeDataVehicleInfo probeDataVehicleInfo,
                                          List<ProbeDataActivityLog> probeDataActivityLogList) {
        // システムステータスログが通知される
    }
};

// リスナーを追加する
Navi.getInstance().addProbeDataUploadEventListener(listener);

// リスナーを削除する
Navi.getInstance().removeProbeDataUploadEventListener(listener);
Note:

ProbeDataUploadEventListenerの各関数はプローブデータのアップロードに成功した場合のみ通知されます。

Vehicle Setting

この章ではプローブデータで使用する車両情報(ProbeDataVehicleInfo)の設定を紹介します。

車両情報

ProbeDataSettingInfoに設定できる情報は以下となります。

関数名説明補足
setEngineType使用するエンジンの種類不明:UNKNOWN
ガソリン車:GASOLINE
ディーゼル車:DIESEL
LPG車:LPG
ハイブリッド車 (HV):HV
プラグインハイブリッド車 (PHEV):PHEV
電気自動車 (EV):EV
燃料電池車 (FCEV):FCEV
setEngineModel車検証に記載される原動機の型式例:"DAA-ABC00A"
setClassificationNumber車検証に記載される類別区分番号例:"0001"
setHasIdlingStopアイドリングストップ機能の有無true: あり
false: なし
- EVの場合は falseに固定
setEngineDisplacementエンジンの排気量(単位:cc)有効範囲: 0..300000
- 0: 無効値
- EVの場合は 0に固定
setWeight車両重量(単位:kg)有効範囲: 100..20000
- -1: 無効値
setWidth車幅(単位:cm)有効範囲: 20..300
- -1: 無効値
setHeight車高(単位:cm)有効範囲: 20..400
- -1: 無効値
setMaxLoadCapacity最大積載量(単位:kg)有効範囲: 0..100000
- -1: 無効値
setActualLoadCapacity実際の積載量(単位:kg)有効範囲: 0..100000
- -1: 無効値
setVehicleId車両を識別するUUID形式のID(36文字)例"00000000-0000-0000-0000-000000000000"
setEvBatteryCapacityEVの最大バッテリー容量(単位:kWh)engineTypeがEV以外では null
setFuelCapacity内燃機関車の燃料タンク容量(単位:L)engineTypeがEVの場合は null
setWltcWLTC値(燃費や電費の指標)ガソリン車など:km/L
- EV:Wh/km
Note:

プローブデータは車両に紐付くデータとして収集します。

複数の車両がある場合でもvehicleIdには重複しないUUIDを設定してください。

車両情報を設定してプローブデータの収集を行うサンプルコードは以下の通りです。

NaviInitInfo initInfo = new NaviInitInfo(getApplicationContext());

// 認証情報等の設定は割愛

// プローブデータの収集設定を行う
ProbeDataSettingInfo probeDataSettingInfo = new ProbeDataSettingInfo();
probeDataSettingInfo.setCollectDataTypeList(Arrays.asList(ProbeDataSettingInfo.DataType.VEHICLE_INFO));

// 車両の設定を行う
ProbeDataVehicleInfo probeDataVehicleInfo = new ProbeDataVehicleInfo();
probeDataVehicleInfo.setEngineType(ProbeDataVehicleInfo.EngineType.EV);
probeDataVehicleInfo.setEngineModel("ZAA-ZE1");
probeDataVehicleInfo.setClassificationNumber("0001");
probeDataVehicleInfo.setHasIdlingStop(false);
probeDataVehicleInfo.setEngineDisplacement(0);
probeDataVehicleInfo.setWeight(1680);
probeDataVehicleInfo.setWidth(179);
probeDataVehicleInfo.setHeight(155);
probeDataVehicleInfo.setMaxLoadCapacity(0);
probeDataVehicleInfo.setActualLoadCapacity(0);
probeDataVehicleInfo.setVehicleId("00000000-0000-0000-0000-000000000000");
probeDataVehicleInfo.setEvBatteryCapacity(40.0);
probeDataVehicleInfo.setWltc(155.0);
probeDataSettingInfo.setProbeDataVehicleInfo(probeDataVehicleInfo);

initInfo.setProbeDataSettingInfo(probeDataSettingInfo);

// 初期化開始
Navi.getInstance().initialize(initInfo, (errorCode, naviInitResult) -> {
    if (errorCode == NaviInitListener.ErrorCode.NONE) {
        // データの収集と自動アップロードの開始
        Navi.getInstance().startCollectProbeData();
    }
});

車両の変更

車両が変わった時はNavi.changeProbeDataVehicleInfo()で設定を変更してください。

Note:

Navi.changeProbeDataVehicleInfo()が呼ばれると、それまでに収集していたプローブデータがアップロードされます。

Upload Data

この章ではプローブデータにてアップロードするデータを紹介します。

ナビゲーションログ

ナビゲーションに関するアップロードデータは以下となります。

 ナビゲーションに関するデータ

データ名説明補足
map_matching_latitudeマップマッチング緯度単位:世界測地系[degree]
有効範囲:-90..90
map_matching_longitudeマップマッチング経度単位:世界測地系[degree]
有効範囲:-180..180
map_matching_speedマップマッチングに基づく速度単位:[m/s]
map_matching_directionマップマッチングに基づく方位単位:[degree]
有効範囲:0..360
0が北、時計回り 無効値:-1
on_road動体が道路上にマップマッチングされているかを示すフラグtrue:オンロード
false:オフロード
on_highway動体が高速道路走行中かを示すフラグtrue:高速道路走行中
false:高速道路ではない
inside_tunnel動体がトンネル内を走行中かを示すフラグtrue:トンネル内
false:トンネル外
link_idリンクの識別子-1:無効値
link_kindリンク種別-1:無効値
0:Roundaboutリンク
1:本線(上下線非分離)リンク
2:本線(上下線分離)リンク
3:連結路(本線間の渡り線)リンク
4:交差点内リンク
5:連結路(ランプ)リンク
6:本線と同一路線の側道
7:SA等測線リンク
road_kind道路種別-1:無効値
0:高速
1:都市高速
2:国道
3:主要地方道
4:県道
5:一般道路(幹線)
6:一般道路(その他)
7:導入路
8:細街路1
9:細街路2
10:フェリー航路
set_routeルート設定中かを示すフラグtrue:設定中
false:未設定
map_data_version地図データのバージョン
is_forward道路順方向に走行しているかを示すフラグtrue:リンク格納方向と同じ向きに向かって走っている
guide_point_index案内地点のインデックス
passing_point_index通過地点のインデックス-1:無効値
road_name道路名称
road_name_tts道路名称発話用文字列TTSエンジンに渡す文字列。
default: ""(空文字)
ssmlを含む場合もある。
distance_to_guide_point現在位置から案内地点までの道のり距離単位:[m]
distance_to_destination現在位置から目的地までの道のり距離単位:[m]
distance_to_traffic_light現在位置から信号機までの道のり距離単位:[m]
distance_to_toll_gate現在位置から料金所までの道のり距離単位:[m]
distance_to_merge_point現在位置から合流地点までの道なり距離単位:[m]
distance_to_forward_node現在位置から前方ノードまでの道なり距離単位:[m]
link_lengthリンクの長さ単位:[m]
-1:無効値
tile_id動体の現在位置のタイル識別子-1:無効値
x_normalization_coordinate_for_start_nodeリンク始点ノードに対するのタイル内正規化X座標概ね0~1の間に入るが、マイナスとなったり1以上の値が入ることがある
y_normalization_coordinate_for_start_nodeリンク始点ノードに対するのタイル内正規化Y座標概ね0~1の間に入るが、マイナスとなったり1以上の値が入ることがある
x_normalization_coordinate_for_end_nodeリンク終点ノードに対するのタイル内正規化X座標概ね0~1の間に入るが、マイナスとなったり1以上の値が入ることがある
y_normalization_coordinate_for_end_nodeリンク終点ノードに対するのタイル内正規化Y座標概ね0~1の間に入るが、マイナスとなったり1以上の値が入ることがある
mileage_of_trip端末起動時からの積算移動距離単位:[m]
0:default
mileage_under_guidanceルート設定時の積算走行距離単位:[m]
0:default
ルートなしの場合常に0
mileage_delta前回レコードからの走行距離差分単位:[m]
0:default
estimated_time_of_arrival目的地到着予想時刻単位:UNIXTIME(UTC)
elapsed_timeルートを引いてからの経過時間単位:[s]
distance_to_passing_point通過地点までの道のり距離単位:[m]
route_noルートを引いた累積回数
in_vehicle車両乗車中かを示すフラグtrue:乗車中
false:乗車中でない
false:default
demo_runデモ走行モードかを示すフラグtrue:デモ走行
false:通常走行
log_runログ走行モードかを示すフラグtrue:ログ走行
false:通常走行
data_acquired_timestamp端末におけるデータ取得時刻単位:UNIXTIME(UTC)
data_acquired_monotonictime端末におけるデータ取得時のモノトニックタイム単位:[msec]

ルートアクションログ

ルートアクションログに関するアップロードデータは以下となります。

route_action_log

 ルートに関する状態変化のログデータ

データ名説明補足
action_timeルートに関する操作および状態変化の発生時刻形式:"YYYY-MM-DDTHH24:MI:SSZ"
action_typeルートに関する操作および状態の種別-1:無効値
0:不明
1:出発(案内開始)
2:出発(案内再開)
3:到着
4:新規探索
5:再探索
6:オートリルートまたはルートアドバイザーによるリルート
7:ルート削除
action_point_info
操作および状態変化に関する地点情報集合



├─ point_kind



地点種別-1:無効値
0:目的地
1:立寄り地
2:ルート始点
(緯度経度のみ;action_type = 4 or 5 or 6 の場合の新規探索またはリルートした地点)
3:ルート削除地点

├─ point_number

地点番号出発地点を0とする。
action_type = 3 or 7 の場合は 0
-1:無効値

├─ point_name

地点名

├─ point_name_tts

地点ヨミ

├─ point_latitude

地点緯度単位:世界測地系[degree]
有効範囲:-90..90

└─ point_longitude
地点経度単位:世界測地系[degree]
有効範囲:-180..180
estimated_toll推測される高速料金単位:[円]
0:default
demo_runデモ走行モードかを示すフラグtrue:デモ走行
false:通常走行
log_runログ走行モードかを示すフラグtrue:ログ走行
false:通常走行
arrival_time目的地到着予想時刻単位:UNIXTIME(UTC)
distance_to_destination現在位置から目的地までの道のり距離単位:[m]
elapsed_timeルートを引いてからの経過時間単位:[s]
data_acquired_timestamp端末におけるデータ取得時刻単位:UNIXTIME(UTC)
data_acquired_monotonictime端末におけるデータ取得時のモノトニックタイム単位:[msec]

システムステータスログ

gnss_location

 GNSS情報

データ名説明補足
gnss_latitudeGNSS緯度単位:世界測地系[degree]
有効範囲:-90..90
gnss_longitudeGNSS経度単位:世界測地系[degree]
有効範囲:-180..180
gnss_bearingGNSS方位単位:[degree]
0が北、時計回り
gnss_altitudeGNSS高度単位:[m]
total_satellite_count捕捉衛星数
used_satellite_count測位使用衛星数
satellite_signal_level衛星信号強度単位:[dBHz]
gnss_availabilityGNSS有効フラグtrue:GNSS有効
false:GNSS無効
data_acquired_timestamp端末におけるデータ取得時刻単位:UNIXTIME(UTC)
data_acquired_monotonictime端末におけるデータ取得時のモノトニックタイム単位:[msec]

fused_location

 GPS/GNSS、WiFi基地局情報、携帯電話網基地局情報を組合せた統合位置情報

データ名説明補足
fused_location_latitude統合位置緯度単位:世界測地系[degree]
有効範囲:-90..90
fused_location_longitude統合位置経度単位:世界測地系[degree]
有効範囲:-180..180
fused_location_bearing統合位置方位単位:[degree]
0が北、時計回り
-1:無効値
fused_location_altitude統合位置高度単位:[m]
fused_location_speed統合位置速度単位:[m/s]
data_acquired_timestamp端末におけるデータ取得時刻単位:UNIXTIME(UTC)
data_acquired_monotonictime端末におけるデータ取得時のモノトニックタイム単位:[msec]

motion

 運動データ

データ名説明補足
accelaration_x_axisX方向加速度単位:[m/s^2]
0:default
accelaration_y_axisY方向加速度単位:[m/s^2]
0:default
accelaration_z_axisZ方向加速度単位:[m/s^2]
0:default
rotational_speed_x_axisX方向回転速度単位:[rad/s]
0:default
rotational_speed_y_axisY方向回転速度単位:[rad/s]
0:default
rotational_speed_z_axisZ方向回転速度単位:[rad/s]
0:default
data_acquired_timestamp端末におけるデータ取得時刻単位:UNIXTIME(UTC)
data_acquired_monotonictime端末におけるデータ取得時のモノトニックタイム単位:[msec]

vehicle_info

 車両等の動体の情報

データ名説明補足
engine_type使用する燃料や構造によるエンジン種別[列挙型]-1:無効値
0:「選択しない」/「不明」
1:ガソリン車(POCで有効)
2:ディーゼル車
3:LPG車
4:HV
5:PHEV
6:EV(POCで有効)
7:FCEV
engine_model車検証における原動機の型式
classification_number車検証における類別区分番号
has_idling_stopアイドリングストップ有無true:あり
false:なし
false:default
EVの場合はDon't Care
engine_displacementエンジンの排気量単位:[cc]
有効範囲:0..300000
0:無効値
EVの場合はDon't Care
weight車両重量単位:[kg]
有効範囲:100..20000
-1:無効値
width車幅単位:[cm]
有効範囲:20..300
-1:無効値
height車高単位:[cm]
有効範囲:20..400
-1:無効値
max_load_capacity最大積載量単位:[kg]
有効範囲:<=100000
-1:無効値
actual_load_capacity実積載量単位:[kg]
有効範囲:<=100000
-1:無効値
vehicle_id動体の識別子UUID形式、36文字
COCCHi/MOTTO GOでは車両IDに該当
ev_battery_capacityEVにおける最大電池容量単位:[kWh]
fuel_capacity内燃エンジン車両における燃料タンク容量単位:[L]
wltcWLTC値単位:ガソリン車など[km/L] EV[Wh/km]

activity_log

 ユーザ活動状況の変化ログ

データ名説明補足
previous_activity_acquired_time端末における前回のデータ取得時刻単位:UNIXTIME(UTC)
previous_activity_acquired_monotonictime端末における前回のデータ取得時のモノトニックタイム単位:[msec]
初回の場合は0固定
previous_activity_type前回のアクティビティ種別 値はOSごとに定義初回の場合は0固定
time_of_location_at_previous_activity_acquisition前回のデータ取得時における最新の位置情報取得時刻単位:UNIXTIME(UTC)
monotonictime_of_location_at_previous_activity_acquisition前回のアクティビティの取得時点での最新の緯度経度の取得時のモノトニックタイム単位:[msec]
初回の場合は0固定
latitude_at_previous_activity_acquisition前回のデータ取得時における最新の緯度単位:世界測地系[degree]
初回の場合は0固定
longitude_at_previous_activity_acquisition前回のデータ取得時における最新の経度単位:世界測地系[degree]
初回の場合は0固定
current_activity_acquired_time端末における今回のデータ取得時刻単位:UNIXTIME(UTC)
current_activity_acquired_monotonictime端末における今回のデータ取得時のモノトニックタイム単位:[msec]
current_activity_type今回のアクティビティの種別
time_of_location_at_current_activity_acquisition今回のデータ取得時における最新の位置情報取得時刻単位:UNIXTIME(UTC)
monotonictime_of_location_at_current_activity_acquisition今回のデータ取得時における最新の位置情報取得モノトニックタイム単位:[msec]
latitude_at_current_activity_acquisition今回のデータ取得時における最新の緯度単位:世界測地系[degree]
有効範囲:-90..90
初期値:0
longitude_at_current_activity_acquisition今回のデータ取得時における最新の経度単位:世界測地系[degree]
有効範囲:-180..180
初期値:0

Android Auto

この章ではAndroid Autoを使用するための方法を紹介します。

はじめに

Android Autoのナビゲーションアプリを構築するには、Google's documentation for building a navigation appをよく理解しておく必要があります。 独自の CarAppService、独自の minCarApiLevel を宣言し、独自の xml/automotive_app_desc を作成し、独自の自動車アプリ テーマを作成する必要があります。

AndroidManifestと権限設定

AndroidManifest.xmluses-permissionタグとapplicationタグに以下設定を追加します。

    <!-- Get access to the surface -->
    <uses-permission android:name="androidx.car.app.ACCESS_SURFACE"/>
    <!-- You must include this in order to use the NavigationTemplate -->
    <uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES" />
    <!-- Optional. You must include this in order to use the MapWithContentTemplate -->
    <uses-permission android:name="androidx.car.app.MAP_TEMPLATES" />

    <application
        <!-- snip -->
        >

        <!-- You must add xml/automotive_app_desc -->
        <meta-data
            android:name="com.google.android.gms.car.application"
            android:resource="@xml/automotive_app_desc" />

        <!-- Optional. Create a theme for your app -->
        <meta-data
            android:name="androidx.car.app.theme"
            android:resource= "@style/CarAppTheme" />

        <!-- You choose your minCarApiLevel -->
        <meta-data
            android:name="androidx.car.app.minCarApiLevel"
            android:value="1" />

        <!-- Link to your implementation of CarAppService -->
        <service
            android:name=".YourCarAppService"
            android:exported="true"
            tools:ignore="ExportedService">

            <intent-filter>
                <action android:name="androidx.car.app.CarAppService" />
                <category android:name="androidx.car.app.category.NAVIGATION" />
                <!-- Optional. If your app supports rendering on cluster displays, you must add an androidx.car.app.category.FEATURE_CLUSTER -->
                <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/>
            </intent-filter>
        </service>
    </application>

app/build.gradleの設定

dependenciesに以下の内容を追加してください。

dependencies {
    ...

    // version can change
+   implementation 'androidx.car.app:app:1.4.0'
+   implementation "androidx.car.app:app-projected:1.4.0"
}

AndroidAutoの起動処理

Android Autoの起動検出からinitializeまでについて説明します。

Android Autoは専用のCarAppServiceクラスを起点に動作するため、まずはこのクラスを用意します。

    public class YourCarAppService extends CarAppService {

        @NonNull
        @Override
        public HostValidator createHostValidator() {
            return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
        }

        @NonNull
        @Override
        public Session onCreateSession() {
            return new YourSession();
        }
    }

次にSessionを用意します。Sessionクラスでは画面を扱うScreenクラスを生成して返却する必要があります。

    public class YourSession extends Session {

        @NonNull
        @Override
        public Screen onCreateScreen(@NonNull Intent intent) {
            return new YourScreen(getCarContext());
        }
    }

最後にScreenを用意します。CarContextLifecycleを渡してCarMapを生成し、CarMap.initialize()で初期化を行います。
初期化時に設定が必要な項目は、スマートフォン用地図の初期化時設定項目と同じです。
initializeでの初期化完了(onInitializationCompleted受信)後にgetMap()してMapクラスが使用可能になります。

    public class YourScreen extends Screen {

        private CarMap carMap;
        private Map map;

        protected YourScreen(@NonNull CarContext carContext) {
            super(carContext);

            // CarMap生成
            carMap = new CarMap(carContext, getLifecycle());

            MapSetting mapSetting = new MapSetting();
            mapSetting.setServerSettingInfo(createServerSettingInfo());

            // CarMap初期化
            carMap.initialize(mapSetting, new OnMapEventListener() {
                @Override
                public void onInitializationCompleted(ErrorCode errorCode) {
                    if (errorCode == ErrorCode.NONE) {
                        map = carMap.getMap();
                        Navi.getInstance().attach(map);

                        ...
                    }
                }
            });

            ...
        }

        @Override
        public Template onGetTemplate() {
            ...
        }
    }
Note:

Android AutoではMapクラスの一部API(Gesture関連等)は使用できません。
詳細については、API Referenceをご確認ください。

AndroidAuto画面

Fig.1 - AndroidAuto画面

Android Auto画面の監視

CarMap.addOnCarMapObserver()CarMapObserverを追加することで、SurfaceCallbackの画面表示に関する通知を受け取ることができます。 また、追加したCarMapObserverCarMap.removeOnCarMapObserver()で削除が可能です。

検出する関数動作
onAttached()Surfaceが読み込まれたときに呼び出されます。
onDetached()Surfaceがこのオブザーバーから切り離されたときに呼び出されます。
onVisibleAreaChanged()Surfaceの可視領域を更新するときに呼び出されます。
たとえば、アクションボタンが表示されたり消えたりしたときにトリガーされます。
onStableAreaChanged()Surfaceの安定領域を更新するときに呼び出されます。
この領域は一定のままですが、ビューが表示されたり表示されなくなったりすると表示領域が変化します。

これは例えば以下のような用途で使用できます。

  • onVisibleAreaChanged()が呼び出された時、自車位置のpadding値や各種デザインのオフセット値を更新する。
Note:

SDK内部でAppManager.setSurfaceCallbackを使用しており、これは単一のサーフェスコールバックがあることを前提としています。 そのため、アプリ側でsetSurfaceCallback を使用しないでください。

Android Auto地図の操作

CarMap.setGestureHandler()CarMapGestureHandlerを設定することで、SurfaceCallbackの地図操作(ジェスチャー)に関する通知を受け取ることができます。 また、CarMapGestureHandlerをnullに設定することで、地図操作を無効化できます。
操作に対応する関数と動作は以下の通りです。

操作呼び出される関数動作
タップonClick()地図クリック
スクロールonScroll()地図移動
フリックonFling()地図移動
ダブルタップonScale()ズームイン
ピンチインonScale()ズームアウト
ピンチアウトonScale()ズームイン
クイックズーム
gesture_controlのクイックズームに
操作方法詳細があります
onScale()ズームイン/アウト
Note:

Android端末のジェスチャー動作はMapGestureOptionsでジェスチャー種別を検出していますが、AndroidAutoでは検出方法が異なるため、MapGestureOptionsにある回転動作やチルト動作は出来ません。

ウィジェット

画面上の任意の位置に任意の画像を配置可能です。これをウィジェット(Widget)と呼びます。
アプリで好きなウィジェットを表示する場合はBitmapWidgetでアイコンや位置の設定をしてCarMap.addWidget()で配置が可能です。
また、追加したウィジェットはCarMap.updateWidget()で更新、CarMap.removeWidget()で削除が可能です。

// 任意のウィジェット追加
BitmapWidget bitmapWidget = new BitmapWidget(BitmapFactory.decodeResource(carMap.getCarContext().getResources(), R.drawable.widget));
WidgetPosition bitmapPosition = new WidgetPosition(mapWidth, mapHeight);
bitmapPosition.setHorizontalAlignment(WidgetPosition.Horizontal.LEFT);
bitmapPosition.setVerticalAlignment(WidgetPosition.Vertical.BOTTOM);
bitmapWidget.setPosition(bitmapPosition); // WidgetPositionで位置指定
carMap.addWidget(bitmapWidget);

// 任意のウィジェットの画像と位置を更新
bitmapWidget.updateBitmap(bitmap_change)
bitmapWidget.setPosition(new PointF(100, 100)); // Screen座標で位置指定
carMap.updateWidget(bitmapWidget);

// 任意のウィジェット削除
carMap.removeWidget(bitmapWidget);

終了処理

Android Auto切断時、Naviにattachされたmapをdetach(Navi.detach(map))し、CarMapの終了処理CarMap.terminate()を実行し正常に終了させてください。

Testing

この章ではアプリのテストを行う際に役に立つ機能を紹介します。

  • デモ走行

    • デモ走行によるテスト方法の紹介です。
  • ログ走行

    • デモ走行ではテストが難しい機能をログ走行でテストする方法の紹介です。

詳細は各機能のガイドを参照して下さい。

Demo run

デモ走行は、実際に道路を走行する事なく、設定したルート上を自車が出発地から目的地まで擬似的に走行させる機能です。

音声画面による誘導機能が正しく動作していることを確認するためにはルート探索を行い、実際にその道路を車で走行する必要がありますが、デモ走行では実際に道路を走行することなく誘導機能の確認を行うことができます。

デモ走行の開始・終了

DemoRunSettingのオブジェクトを作成しデモ走行の設定を行い、 Navi.startDemoRun()を呼び出すことでデモ走行を開始することができます。

デモ走行による自車位置の更新周期、デモ走行終了時の繰り返し設定等も設定することが可能です。

// 予めルートを引いておく

// デモ走行設定
DemoRunSetting demoRunSetting = new DemoRunSetting();
demoRunSetting.setDemoType(Common.DemoType.AUTO);
demoRunSetting.setAutoRepeat(true); // デモ走行終了時の繰り返し設定

// デモ走行開始
Navi.getInstance().startDemoRun(demoRunSetting);

デモ走行を終了するにはNavi.stopDemoRun()を呼び出します。

// デモ走行終了
Navi.getInstance().stopDemoRun(new StopDemoRunListener() {
    @Override
    public void onCompleted(ErrorCode errorCode) {
    }
});
Note:

ルートを編集したり、新規のルートを作成した場合はデモ走行は自動的に停止します。

デモ走行の速度変更

DemoRunSettingでデモ走行種別をCommon.DemoType.MANUALに設定した場合、デモ走行時の自車速度を設定することが可能です。 また、その後Navi.setDemoSpeed()を呼び出すことでデモ走行時の自車速度を変更することが可能です。

// 予めルートを引いておく

// デモ走行設定
DemoRunSetting demoRunSetting = new DemoRunSetting();
demoRunSetting.setDemoType(Common.DemoType.MANUAL);
demoRunSetting.setSpeed(Common.DemoSpeed.DEMO_SPEED_26);

// デモ走行開始
Navi.getInstance().startDemoRun(demoRunSetting);

// デモ走行速度変更(65km/h)
Navi.getInstance().setDemoSpeed(Common.DemoSpeed.DEMO_SPEED_65);
Note:

DemoRunSettingでデモ走行種別がCommon.DemoType.AUTO(デフォルト)に設定されていた場合、デモ走行時の自車速度は一般的な車の走行時(右左折時の減速等)のように自動的に変更されます。

Log run

ログ走行は実際の走行時の走行データをログ走行ファイルとして保存し、保存したログ走行ファイルから走行を再現する機能です。

ログ走行の用途

ログ走行ファイルによる走行の再現は様々なケースで役立ちます。

テスト走行時の不具合の再現

テスト走行時のログ走行ファイルを保存しておくことで走行時に発生した不具合を後日改めて再現、解析することができます。

オートリルートの確認

デモ走行ではルート通りに走行してしまうためリルートが行われません。ログ走行によりルートを外れることでリルート動作を確認することができます。

踏切案内、一時停止案内、合流案内、右左折専用レーン案内、オービス案内

ルートがない場合にも行われる案内のため、デモ走行では確認ができない場合がありますが、ログ走行により対象道路を走行することで確認することができます。

並走道路の切り替え確認

デモ走行ではルート通りに走行してしまうため並走道路の切り替えを行うことができません。並走道路がある道路をログ走行することで確認することができます。

トンネルモードの確認

デモ走行ではトンネル内でもルート通り走行してしまうためトンネルモードの確認ができません。ログ走行によりトンネルモードの動作を確認することができます。

ルートアドバイザー

デモ走行ではルートを変更することがないためルートアドバイザーによる新ルート情報は提供されません。ログ走行によりルートアドバイザーの動作を確認することができます。

ログ走行ファイルの作成方法

Navi.setLogSaveEnabledにtrueを渡すことで以後の走行データがログ走行ファイルに保存されます。これから走る道路の走行ログを作成したい場合は出発前に走行ログの保存を開始して下さい。

ログ走行ファイルは端末のアプリ固有ストレージ領域に保存され、保存場所は以下の通りです。

/storage/emulated/0/Android/data/アプリのパッケージ名/files

ログ走行ファイルはNavi.setLogSaveEnabledをtrueにした時点の時刻を含んだファイル名で作成されるため、falseからtrueに変更する度に別のファイルが新たに作成されます。

ログ走行の開始・終了

保存されたログ走行ファイルをNavi.startLogRunで読み込むことでログ走行を行うことができます。 Navi.stopLogRunでログ走行を停止します。

Navi.startLogRunの引数でログ走行ファイルのパスを渡すため、ファイルを置く場所は任意です。

ログ走行ファイルのサンプル

各種動作確認用のログ走行ファイルのサンプルです。

・踏切案内
・一時停止案内
・合流案内
・右左折専用レーン案内
・オービス案内
・トンネルモードの確認

ルートアドバイザーの動作確認

SDKでは5分間隔でルートアドバイザーでの推奨ルート有無の確認を行なっており、また一定の走行条件を満たす必要があるため、ルートアドバイザーによる推奨ルートの提案はそれほど頻度高く発生するものではありません。

このようにルートアドバイザーの動作を確認するためには時間が掛かってしまうため、SDKでは以下のようなルートアドバイザーのテスト用機能を提供しています。

  • 推奨ルート有無の確認周期(デフォルト5分)の変更
  • 推奨ルートの探索条件設定

これらの機能を利用して効率的にルートアドバイザーの動作を確認することが可能です。

ルートアドバイザー動作確認手順

大まかなルートアドバイザー動作の確認手順は以下の通りとなります。

  1. 有料道を含むルートを探索し案内を開始します。
  2. Navi.command()で推奨ルート有無の確認周期と推奨ルートの探索条件設定を変更します。
    • 確認周期を短くすることで推奨ルートが提案されやすくなります。
    • 探索条件を一般道のみとすることで推奨ルートが提案されやすくなります。
  3. ログ走行を開始します
注意:

Navi.command()はSDKのデバッグ用関数のためリリースアプリでは呼び出さないようにして下さい。

サンプルコードは以下の通りです。

RoutePlan routePlan = new RoutePlan();
routePlan.setStartPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
routePlan.setEndPoint(new GeoCoordinate(35.748514, 139.615793)); // 練馬IC出口付近

RouteOptions options = new RouteOptions();
options.setRouteID(1);

List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);

// ルート探索
Navi.getInstance().calculateRoute(routePlan, new CalcRouteListener() {
    @Override
    public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {

        if (errorCode == CalcRouteListener.ErrorCode.NONE) {
            Navi.getInstance().startGuidance(new StartGuidanceListener() {
                @Override
                public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
                    if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
                        // 推奨ルート有無の確認周期を5分から1分に変更
                        Integer[] args1 = new Integer[]{60};
                        if (!Navi.getInstance().command("setRouteAdvisorInterval", args1)) {
                            // 実行失敗
                        }
                        // 推奨ルートの探索条件設定(有料道を使わないルートを推奨)
                        Boolean[] args2 = new Boolean[]{false};
                        if (!Navi.getInstance().command("setRouteAdvisorUseToll", args2)) {
                            // 実行失敗
                        }

                        String path = getApplicationContext().getExternalFilesDir(null).getAbsolutePath() + "/RouteAdvisorTest.json"; // 走行ログファイルを置いたパス
                        if (Navi.getInstance().startLogRun(path)) {
                            // ログ走行開始成功
                        }
                        else {
                            // ログ走行開始失敗
                        }
                    }
                }
            });
        } else {
            // ルート探索失敗
        }
    }
});

API Reference

こちらをクリックすると新しいタブで開きます。

Requirements

本SDKの要件としては次になります。

  • OS9以上(APIレベル28以上)
  • OpenGL ES3をサポートするデバイス
Note:
動作上の推奨スペックなどは、アプリの実装や利用目的などにより必要とするスペックが異なるためSDKとしては特に定めておりません。
Note:
本SDKはクラウドナビゲーションを実現するSDKです。クラウドとの通信が必須になります。
例えば、SDKの初期化処理時に地図のデータやナビゲーションのためのデータを数MB単位で取得します。このため、実用的に利用するため数Mbps程度の通信速度がある状況での利用を推奨します。

Troubleshooting

オートリルートが繰り返されて終わらないのですが、回避方法はありますか?

SDKはオートリルートに失敗すると、成功するまでルート再探索を繰り返します。 この時、失敗要因が時間規制(曜日・季節)の為探索不可(ErrorCode.AUTO_REROUTE_TIME_REGULATION) の場合、 ユーザー設定情報のルート探索における時間規制考慮有無を「考慮しない」に変更することでオートリルートを完了させられます。

ただしルート探索時点で通行不能な道を通るため、道路交通法違反にならないようドライバーに注意を促す必要があります。

Navi.getInstance().addAutoRerouteListener(new AutoRerouteListener() {
	@Override
	public void onStarted() {
		// 再探索開始時の処理
	}

	@Override
	public void onFailed(ErrorCode errorCode) {
		if (errorCode == AutoRerouteListener.ErrorCode.AUTO_REROUTE_TIME_REGULATION) {
			SetupInfo setupInfo = new SetupInfo();
			setupInfo.setCareTimeRegulation(Common.CareTimeRegulation.NOT_CONSIDER);
			Navi.getInstance().setSetupInfo(setupInfo, new UserSettingResultListener() {
				@Override
				public void onCompleted(ErrorCode errorCode) {
				}
			});
		}
	}

	@Override
	public void onCompleted(ErrorCode errorCode, AutoRerouteResult autoRerouteResult) {
		// 再探索成功時の処理
	}
});

方面看板は、ルートを設定しなくても表示できますか?

表示可能です。

「方面案内図」を参考にしてください。
この記事ではGuidePointDirectSignを用いていますが、 この代わりにPassPointに置き換えていただければ案内中ルートなしに方面案内図を表示できます。

ETCレーンを誘導する音声案内はしますか?

音声案内はありません。 画像については、「ETCレーンイラスト」を参考にしてください。

オフラインでも動作しますか?

オフライン時は基本的にナビ機能(検索機能含む)は動作しなくなります。
誘導中の場合は即時に誘導が停止することはありません。ルート上であれば一定の範囲(おおよそ1.6km)の間は誘導は継続します。 地図に関しては地図キャッシュが存在する範囲で表示が可能です。

地図キャッシュについて教えてください

一度表示した範囲を500MBまでデバイス内にキャッシュします。
500MBを超えた場合、古いデータから破棄します。
データの有効期間は最大30日となります。

遠隔のユーザーが使用中に発生したバグの原因を突き止めたい

Naviの初期化時に走行ログアップロード設定を有効にして初期化するか、Naviの設定で走行ログアップロードを有効にすると、パイオニアのサーバーにSDKのログが記録されます。
これらの設定はデフォルトでtrue(アップロードする)になっています。

SDKに起因する不具合の場合、お問い合わせの際に以下の情報をご提供いただければ、迅速に原因解析が可能です。

  • UserID
  • 不具合の発生日時
  • 不具合内容
  • 現象を記録した動画やスクリーンショットなど

また、SDKがアップロードしてるログの内容は

  • スマートフォンの種類
  • デバイスの位置情報(緯度経度)
  • マップマッチングの結果
  • SDKの実行ログ

となっており、5〜10分ごとに256KBの通信量(通常の使用ではほとんど気にならない程度)を使用します。

アップロードを無効にすると、不具合発生後に詳細なログを取得するために別途ご協力が必要となり、解析に数日かかる可能性があります。

法規ガイドライン

地図データ利用にあたっての注意点

地図データの帰属を明示するため、以下をアプリケーションのライセンス表示画面、またはそれ同等の場所に表示してください。

1.地図データ及び配信データについての著作権表示

Copyright : ©ZENRIN.Co, Ltd.

2.国土地理院の許諾番号

Map License number :
- 測量法に基づく国土地理院長承認(使用)R 5JHs 167-B3号
- 測量法に基づく国土地理院長承認(使用) R 5JHs 171-B3号

バージョン情報は初期化後にNavi.getVersion()を使って取得できます。

Navi.getInstance().getVersion(new GetVersionListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, Version version) {
		if (errorCode == GetVersionListener.ErrorCode.NONE) {
			String copyright = "Copyright : " + version.getMapCopyright();
			String licenseNumber = "Map License Number : " + version.getMapLicensenumberList().toString();

			// 何らかの方法でcopyrightとlicenseNumberを表示してください。
		}
	}
});
Note:

著作者と国土地理院の許諾番号は変更される可能性があります。
プログラム中に固定の値を書かず、必ずSDKのIFを使って取得してください。

渋滞情報取扱時の注意点

渋滞情報を提供する際は警察庁が提示している 交通情報の提供に関する指針 を満たしてください。
特に、第3章3項を満たす必要があります。

3 渋滞情報																	
(1)情報の内容																	
	事業者は、渋滞情報を作成するときは、利用者がその内容を的確に把握することができるようにするため、原則として、情報の内容に次に掲げる事項を盛り込むこと。																
	 ア 日時、曜日等															
	 イ 路線及び方向															
	 ウ 始点及び長さ															
	 エ 交通の混雑の有無及び程度															
	 オ その他必要な事項															

渋滞情報取得日時はNavi.getTrafficTimestamp()で取得できます。

Navi.getInstance().getTrafficTimestamp(new GetTrafficTimestampListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, TrafficTimestamp timestampInfo) {
		if (errorCode == ErrorCode.NONE) {
			String vicsTimestampHHMM = timestampInfo.getTimestampPrimary();
			String probeInfoTimestampHHMM = timestampInfo.getTimestampSecondary();
		}
		else {
			// 取得失敗
		}
	}
});

渋滞情報の詳細はNavi.getTrafficGuideData()で取得できます。

Navi.getInstance().getTrafficGuideData(new GetTrafficGuideDataListener() {
	@Override
	public void onCompleted(ErrorCode errorCode, TrafficGuideData trafficGuideData) {
		for (TrafficGuideData.GuideData guideData : trafficGuideData.getGuideData()) {
			TrafficGuideData.GuideData.VICS vicsData = guideData.getVics();
			switch (vicsData.getKind()) {
				case JAM: {
					float jamLength = vicsData.getLength();
					float jamPointDistance = vicsData.getDistance();
					int passTime = vicsData.getPassTime();
					String guidance = vicsData.getPhrase();
					break;
				}
				case REG: {
					float incidentPointDistance = vicsData.getDistance();
					String guidance = vicsData.getPhrase();
					break;
				}
				case UNKNOWN:
				default:
					break;
			}
		}

	}
});

参考に表示例を示します。

COCCHi渋滞情報表示例

弊社アプリケーション(COCCHi)での表示例

ルート探索結果取り扱い時の注意点

ルート探索結果を提示する際は警察庁が提示している 交通情報の提供に関する指針 を満たしてください。
特に、第3章4項を満たす必要があります。

4 旅行時間情報																	
(1)情報の内容																	
	事業者は、旅行時間情報を作成するときは、利用者がその内容を的確に把握することができるようにするため、原則として、情報の内容に次に掲げる事項を盛り込むこと。																
	 ア 日時、曜日等															
	 イ 路線及び方向															
	 ウ 始点及び終点															
	 エ 終点までに複数の経路がある場合には、経由する地点又は路線															
	 オ 終点に到達するまでに要する時間又は到達する時刻															
	 カ その他必要な事項	

参考に表示例を示します。

COCCHiルート探索結果表示例

弊社アプリケーション(COCCHi)での表示例

検索結果における駐車場満空情報利用にあたっての注意点

駐車場満空情報を利用する場合、満空情報を提供している以下の出展元の情報をアプリ内で表示してください。

genreKeygenreNamegenreYomi
90801タイムズタイムズ
90802リパークリパーク
90803名鉄協商メイテツキョウショウ

出展元のジャンル情報

駐車場満空で表示するブランド情報(出展元情報)は画像ではなく、文字列でも構いません。
文字列の場合は場合はgenreNameを使用してください。
画像を表示する場合は画像が見えにくくなるような加工はしないでください。

参考に表示例を示します。

COCCHiルート検索結果

弊社アプリケーション(COCCHi)での表示例

License

クラウドナビゲーションSDKには以下のサードパーティのライブラリが組み込まれています。

License

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2017-2023 Arnaud GIULIANI

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

Room

Source: https://github.com/androidx-releases/Room

License

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

Apache Commons Collections

Source: https://github.com/apache/commons-collections

License

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

OkHttp

Source: https://github.com/square/okhttp

License

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

picojson

Source: https://github.com/kazuho/picojson

License

Copyright 2009-2010 Cybozu Labs, Inc.
Copyright 2011-2014 Kazuho Oku
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

protobuf

Source: https://github.com/protocolbuffers/protobuf

License

Copyright 2008 Google Inc.  All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
    * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Code generated by the Protocol Buffer compiler is owned by the owner
of the input file used when generating it.  This code is not
standalone and requires a support library to be linked with it.  This
support library is itself covered by the above license.

boost

Source: https://www.boost.org/

License

         Copyright Joe Coder 2004 - 2006.
Distributed under the Boost Software License, Version 1.0.
   (See accompanying file LICENSE_1_0.txt or copy at
         http://www.boost.org/LICENSE_1_0.txt)"

The content of http://www.boost.org/LICENSE_1_0.txt is as following.
----------------------------------------------------
Boost Software License - Version 1.0 - August 17th, 2003

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:

The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
----------------------------------------------------

freetype

Source: https://github.com/freetype/freetype

License

FREETYPE LICENSES
-----------------

The FreeType  2 font  engine is  copyrighted work  and cannot  be used
legally without  a software  license.  In order  to make  this project
usable to  a vast majority of  developers, we distribute it  under two
mutually exclusive open-source licenses.

This means that *you* must choose  *one* of the two licenses described
below, then obey all its terms and conditions when using FreeType 2 in
any of your projects or products.

  - The FreeType License,  found in the file  `docs/FTL.TXT`, which is
    similar to the  original BSD license *with*  an advertising clause
    that forces  you to explicitly  cite the FreeType project  in your
    product's  documentation.  All  details are  in the  license file.
    This license is suited to products which don't use the GNU General
    Public License.

    Note that  this license  is compatible to  the GNU  General Public
    License version 3, but not version 2.

  - The   GNU   General   Public   License   version   2,   found   in
    `docs/GPLv2.TXT`  (any  later  version  can  be  used  also),  for
    programs  which  already  use  the  GPL.  Note  that  the  FTL  is
    incompatible with GPLv2 due to its advertisement clause.

The contributed  BDF and PCF  drivers come  with a license  similar to
that  of the  X Window  System.   It is  compatible to  the above  two
licenses (see files `src/bdf/README`  and `src/pcf/README`).  The same
holds   for   the   source    code   files   `src/base/fthash.c`   and
`include/freetype/internal/fthash.h`; they were part of the BDF driver
in earlier FreeType versions.

The gzip  module uses the  zlib license (see  `src/gzip/zlib.h`) which
too is compatible to the above two licenses.

The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code
taken almost  verbatim from the  HarfBuzz file `hb-ft.cc`,  which uses
the 'Old MIT' license, compatible to the above two licenses.

The  MD5 checksum  support  (only used  for  debugging in  development
builds) is in the public domain.


--- end of LICENSE.TXT ---

HarfBuzz

Source: https://github.com/harfbuzz/harfbuzz

License

HarfBuzz is licensed under the so-called "Old MIT" license.  Details follow.
For parts of HarfBuzz that are licensed under different licenses see individual
files names COPYING in subdirectories where applicable.

Copyright © 2010-2022  Google, Inc.
Copyright © 2015-2020  Ebrahim Byagowi
Copyright © 2019,2020  Facebook, Inc.
Copyright © 2012,2015  Mozilla Foundation
Copyright © 2011  Codethink Limited
Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
Copyright © 2009  Keith Stribley
Copyright © 2011  Martin Hosken and SIL International
Copyright © 2007  Chris Wilson
Copyright © 2005,2006,2020,2021,2022,2023  Behdad Esfahbod
Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023  Red Hat, Inc.
Copyright © 1998-2005  David Turner and Werner Lemberg
Copyright © 2016  Igalia S.L.
Copyright © 2022  Matthias Clasen
Copyright © 2018,2021  Khaled Hosny
Copyright © 2018,2019,2020  Adobe, Inc
Copyright © 2013-2015  Alexei Podtelezhnikov

For full copyright notices consult the individual files in the package.


Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that the
above copyright notice and the following two paragraphs appear in
all copies of this software.

IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

icu

Source: https://github.com/unicode-org/icu

License

UNICODE LICENSE V3

COPYRIGHT AND PERMISSION NOTICE

Copyright © 2016-2024 Unicode, Inc.

NOTICE TO USER: Carefully read the following legal agreement. BY
DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.

Permission is hereby granted, free of charge, to any person obtaining a
copy of data files and any associated documentation (the "Data Files") or
software and any associated documentation (the "Software") to deal in the
Data Files or Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, and/or sell
copies of the Data Files or Software, and to permit persons to whom the
Data Files or Software are furnished to do so, provided that either (a)
this copyright and permission notice appear with all copies of the Data
Files or Software, or (b) this copyright and permission notice appear in
associated Documentation.

THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS.

IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
FILES OR SOFTWARE.

Except as contained in this notice, the name of a copyright holder shall
not be used in advertising or otherwise to promote the sale, use or other
dealings in these Data Files or Software without prior written
authorization of the copyright holder.

SPDX-License-Identifier: Unicode-3.0

----------------------------------------------------------------------

Third-Party Software Licenses

This section contains third-party software notices and/or additional
terms for licensed third-party software components included within ICU
libraries.

----------------------------------------------------------------------

ICU License - ICU 1.8.1 to ICU 57.1

COPYRIGHT AND PERMISSION NOTICE

Copyright (c) 1995-2016 International Business Machines Corporation and others
All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons
to whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Except as contained in this notice, the name of a copyright holder
shall not be used in advertising or otherwise to promote the sale, use
or other dealings in this Software without prior written authorization
of the copyright holder.

All trademarks and registered trademarks mentioned herein are the
property of their respective owners.

----------------------------------------------------------------------

Chinese/Japanese Word Break Dictionary Data (cjdict.txt)

 #     The Google Chrome software developed by Google is licensed under
 # the BSD license. Other software included in this distribution is
 # provided under other licenses, as set forth below.
 #
 #  The BSD License
 #  http://opensource.org/licenses/bsd-license.php
 #  Copyright (C) 2006-2008, Google Inc.
 #
 #  All rights reserved.
 #
 #  Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
 #
 #  Redistributions of source code must retain the above copyright notice,
 # this list of conditions and the following disclaimer.
 #  Redistributions in binary form must reproduce the above
 # copyright notice, this list of conditions and the following
 # disclaimer in the documentation and/or other materials provided with
 # the distribution.
 #  Neither the name of  Google Inc. nor the names of its
 # contributors may be used to endorse or promote products derived from
 # this software without specific prior written permission.
 #
 #
 #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 #
 #  The word list in cjdict.txt are generated by combining three word lists
 # listed below with further processing for compound word breaking. The
 # frequency is generated with an iterative training against Google web
 # corpora.
 #
 #  * Libtabe (Chinese)
 #    - https://sourceforge.net/project/?group_id=1519
 #    - Its license terms and conditions are shown below.
 #
 #  * IPADIC (Japanese)
 #    - http://chasen.aist-nara.ac.jp/chasen/distribution.html
 #    - Its license terms and conditions are shown below.
 #
 #  ---------COPYING.libtabe ---- BEGIN--------------------
 #
 #  /*
 #   * Copyright (c) 1999 TaBE Project.
 #   * Copyright (c) 1999 Pai-Hsiang Hsiao.
 #   * All rights reserved.
 #   *
 #   * Redistribution and use in source and binary forms, with or without
 #   * modification, are permitted provided that the following conditions
 #   * are met:
 #   *
 #   * . Redistributions of source code must retain the above copyright
 #   *   notice, this list of conditions and the following disclaimer.
 #   * . Redistributions in binary form must reproduce the above copyright
 #   *   notice, this list of conditions and the following disclaimer in
 #   *   the documentation and/or other materials provided with the
 #   *   distribution.
 #   * . Neither the name of the TaBE Project nor the names of its
 #   *   contributors may be used to endorse or promote products derived
 #   *   from this software without specific prior written permission.
 #   *
 #   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 #   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 #   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 #   * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 #   * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 #   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 #   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 #   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 #   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 #   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 #   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 #   * OF THE POSSIBILITY OF SUCH DAMAGE.
 #   */
 #
 #  /*
 #   * Copyright (c) 1999 Computer Systems and Communication Lab,
 #   *                    Institute of Information Science, Academia
 #       *                    Sinica. All rights reserved.
 #   *
 #   * Redistribution and use in source and binary forms, with or without
 #   * modification, are permitted provided that the following conditions
 #   * are met:
 #   *
 #   * . Redistributions of source code must retain the above copyright
 #   *   notice, this list of conditions and the following disclaimer.
 #   * . Redistributions in binary form must reproduce the above copyright
 #   *   notice, this list of conditions and the following disclaimer in
 #   *   the documentation and/or other materials provided with the
 #   *   distribution.
 #   * . Neither the name of the Computer Systems and Communication Lab
 #   *   nor the names of its contributors may be used to endorse or
 #   *   promote products derived from this software without specific
 #   *   prior written permission.
 #   *
 #   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 #   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 #   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 #   * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 #   * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 #   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 #   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 #   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 #   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 #   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 #   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 #   * OF THE POSSIBILITY OF SUCH DAMAGE.
 #   */
 #
 #  Copyright 1996 Chih-Hao Tsai @ Beckman Institute,
 #      University of Illinois
 #  c-tsai4@uiuc.edu  http://casper.beckman.uiuc.edu/~c-tsai4
 #
 #  ---------------COPYING.libtabe-----END--------------------------------
 #
 #
 #  ---------------COPYING.ipadic-----BEGIN-------------------------------
 #
 #  Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
 #  and Technology.  All Rights Reserved.
 #
 #  Use, reproduction, and distribution of this software is permitted.
 #  Any copy of this software, whether in its original form or modified,
 #  must include both the above copyright notice and the following
 #  paragraphs.
 #
 #  Nara Institute of Science and Technology (NAIST),
 #  the copyright holders, disclaims all warranties with regard to this
 #  software, including all implied warranties of merchantability and
 #  fitness, in no event shall NAIST be liable for
 #  any special, indirect or consequential damages or any damages
 #  whatsoever resulting from loss of use, data or profits, whether in an
 #  action of contract, negligence or other tortuous action, arising out
 #  of or in connection with the use or performance of this software.
 #
 #  A large portion of the dictionary entries
 #  originate from ICOT Free Software.  The following conditions for ICOT
 #  Free Software applies to the current dictionary as well.
 #
 #  Each User may also freely distribute the Program, whether in its
 #  original form or modified, to any third party or parties, PROVIDED
 #  that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
 #  on, or be attached to, the Program, which is distributed substantially
 #  in the same form as set out herein and that such intended
 #  distribution, if actually made, will neither violate or otherwise
 #  contravene any of the laws and regulations of the countries having
 #  jurisdiction over the User or the intended distribution itself.
 #
 #  NO WARRANTY
 #
 #  The program was produced on an experimental basis in the course of the
 #  research and development conducted during the project and is provided
 #  to users as so produced on an experimental basis.  Accordingly, the
 #  program is provided without any warranty whatsoever, whether express,
 #  implied, statutory or otherwise.  The term "warranty" used herein
 #  includes, but is not limited to, any warranty of the quality,
 #  performance, merchantability and fitness for a particular purpose of
 #  the program and the nonexistence of any infringement or violation of
 #  any right of any third party.
 #
 #  Each user of the program will agree and understand, and be deemed to
 #  have agreed and understood, that there is no warranty whatsoever for
 #  the program and, accordingly, the entire risk arising from or
 #  otherwise connected with the program is assumed by the user.
 #
 #  Therefore, neither ICOT, the copyright holder, or any other
 #  organization that participated in or was otherwise related to the
 #  development of the program and their respective officials, directors,
 #  officers and other employees shall be held liable for any and all
 #  damages, including, without limitation, general, special, incidental
 #  and consequential damages, arising out of or otherwise in connection
 #  with the use or inability to use the program or any product, material
 #  or result produced or otherwise obtained by using the program,
 #  regardless of whether they have been advised of, or otherwise had
 #  knowledge of, the possibility of such damages at any time during the
 #  project or thereafter.  Each user will be deemed to have agreed to the
 #  foregoing by his or her commencement of use of the program.  The term
 #  "use" as used herein includes, but is not limited to, the use,
 #  modification, copying and distribution of the program and the
 #  production of secondary products from the program.
 #
 #  In the case where the program, whether in its original form or
 #  modified, was distributed or delivered to or received by a user from
 #  any person, organization or entity other than ICOT, unless it makes or
 #  grants independently of ICOT any specific warranty to the user in
 #  writing, such person, organization or entity, will also be exempted
 #  from and not be held liable to the user for any such damages as noted
 #  above as far as the program is concerned.
 #
 #  ---------------COPYING.ipadic-----END----------------------------------

----------------------------------------------------------------------

Lao Word Break Dictionary Data (laodict.txt)

 # Copyright (C) 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html
 # Copyright (c) 2015 International Business Machines Corporation
 # and others. All Rights Reserved.
 #
 # Project: https://github.com/rober42539/lao-dictionary
 # Dictionary: https://github.com/rober42539/lao-dictionary/laodict.txt
 # License: https://github.com/rober42539/lao-dictionary/LICENSE.txt
 #          (copied below)
 #
 #	This file is derived from the above dictionary version of Nov 22, 2020
 #  ----------------------------------------------------------------------
 #  Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
 #  All rights reserved.
 #
 #  Redistribution and use in source and binary forms, with or without
 #  modification, are permitted provided that the following conditions are met:
 #
 #  Redistributions of source code must retain the above copyright notice, this
 #  list of conditions and the following disclaimer. Redistributions in binary
 #  form must reproduce the above copyright notice, this list of conditions and
 #  the following disclaimer in the documentation and/or other materials
 #  provided with the distribution.
 #
 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 # OF THE POSSIBILITY OF SUCH DAMAGE.
 #  --------------------------------------------------------------------------

----------------------------------------------------------------------

Burmese Word Break Dictionary Data (burmesedict.txt)

 #  Copyright (c) 2014 International Business Machines Corporation
 #  and others. All Rights Reserved.
 #
 #  This list is part of a project hosted at:
 #    github.com/kanyawtech/myanmar-karen-word-lists
 #
 #  --------------------------------------------------------------------------
 #  Copyright (c) 2013, LeRoy Benjamin Sharon
 #  All rights reserved.
 #
 #  Redistribution and use in source and binary forms, with or without
 #  modification, are permitted provided that the following conditions
 #  are met: Redistributions of source code must retain the above
 #  copyright notice, this list of conditions and the following
 #  disclaimer.  Redistributions in binary form must reproduce the
 #  above copyright notice, this list of conditions and the following
 #  disclaimer in the documentation and/or other materials provided
 #  with the distribution.
 #
 #    Neither the name Myanmar Karen Word Lists, nor the names of its
 #    contributors may be used to endorse or promote products derived
 #    from this software without specific prior written permission.
 #
 #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 #  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 #  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 #  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
 #  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 #  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 #  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 #  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 #  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 #  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 #  THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 #  SUCH DAMAGE.
 #  --------------------------------------------------------------------------

----------------------------------------------------------------------

Time Zone Database

  ICU uses the public domain data and code derived from Time Zone
Database for its time zone support. The ownership of the TZ database
is explained in BCP 175: Procedure for Maintaining the Time Zone
Database section 7.

 # 7.  Database Ownership
 #
 #    The TZ database itself is not an IETF Contribution or an IETF
 #    document.  Rather it is a pre-existing and regularly updated work
 #    that is in the public domain, and is intended to remain in the
 #    public domain.  Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do
 #    not apply to the TZ Database or contributions that individuals make
 #    to it.  Should any claims be made and substantiated against the TZ
 #    Database, the organization that is providing the IANA
 #    Considerations defined in this RFC, under the memorandum of
 #    understanding with the IETF, currently ICANN, may act in accordance
 #    with all competent court orders.  No ownership claims will be made
 #    by ICANN or the IETF Trust on the database or the code.  Any person
 #    making a contribution to the database or code waives all rights to
 #    future claims in that contribution or in the TZ Database.

----------------------------------------------------------------------

Google double-conversion

Copyright 2006-2011, the V8 project authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of Google Inc. nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

----------------------------------------------------------------------

JSON parsing library (nlohmann/json)

File: vendor/json/upstream/single_include/nlohmann/json.hpp (only for ICU4C)

MIT License

Copyright (c) 2013-2022 Niels Lohmann

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

----------------------------------------------------------------------

File: aclocal.m4 (only for ICU4C)
Section: pkg.m4 - Macros to locate and utilise pkg-config.


Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.

As a special exception to the GNU General Public License, if you
distribute this file as part of a program that contains a
configuration script generated by Autoconf, you may include it under
the same distribution terms that you use for the rest of that
program.


(The condition for the exception is fulfilled because
ICU4C includes a configuration script generated by Autoconf,
namely the `configure` script.)

----------------------------------------------------------------------

File: config.guess (only for ICU4C)


This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, see <https://www.gnu.org/licenses/>.

As a special exception to the GNU General Public License, if you
distribute this file as part of a program that contains a
configuration script generated by Autoconf, you may include it under
the same distribution terms that you use for the rest of that
program.  This Exception is an additional permission under section 7
of the GNU General Public License, version 3 ("GPLv3").


(The condition for the exception is fulfilled because
ICU4C includes a configuration script generated by Autoconf,
namely the `configure` script.)

----------------------------------------------------------------------

File: install-sh (only for ICU4C)


Copyright 1991 by the Massachusetts Institute of Technology

Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of M.I.T. not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission.  M.I.T. makes no representations about the
suitability of this software for any purpose.  It is provided "as is"
without express or implied warranty.

curl

Source: https://github.com/curl/curl

License

COPYRIGHT AND PERMISSION NOTICE

Copyright (c) 1996 - 2024, Daniel Stenberg, <daniel@haxx.se>, and many
contributors, see the THANKS file.

All rights reserved.

Permission to use, copy, modify, and distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright
notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of a copyright holder shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization of the copyright holder.

minizip

Source: http://www.winimage.com/zLibDll/minizip.html

License

MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson

Introduction
---------------------
MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html )

When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0.
All possible work was done for compatibility.


Background
---------------------
When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 
support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ )

That was used as a starting point. And after that ZIP64 support was added to zip.c
some refactoring and code cleanup was also done.


Changed from MiniZip 1.0 to MiniZip 1.1
---------------------------------------
* Added ZIP64 support for unzip ( by Even Rouault )
* Added ZIP64 support for zip ( by Mathias Svensson )
* Reverted some changed that Even Rouault did.
* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users.
* Added unzip patch for BZIP Compression method (patch create by Daniel Borca)
* Added BZIP Compress method for zip
* Did some refactoring and code cleanup


Credits

 Gilles Vollant    - Original MiniZip author
 Even Rouault      - ZIP64 unzip Support
 Daniel Borca      - BZip Compression method support in unzip
 Mathias Svensson  - ZIP64 zip support
 Mathias Svensson  - BZip Compression method support in zip

 Resources

 ZipLayout   http://result42.com/projects/ZipFileLayout
             Command line tool for Windows that shows the layout and information of the headers in a zip archive.
             Used when debugging and validating the creation of zip files using MiniZip64


 ZIP App Note  http://www.pkware.com/documents/casestudies/APPNOTE.TXT
               Zip File specification


Notes.
 * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined.

License
----------------------------------------------------------
   Condition of use and distribution are the same than zlib :

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

----------------------------------------------------------

openssl

Source: https://www.openssl.org/

License

  LICENSE ISSUES
  ==============

  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
  the OpenSSL License and the original SSLeay license apply to the toolkit.
  See below for the actual license texts. Actually both licenses are BSD-style
  Open Source licenses. In case of any license issues related to OpenSSL
  please contact openssl-core@openssl.org.

  OpenSSL License
  ---------------

====================================================================
   Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer. 

   2. Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in
      the documentation and/or other materials provided with the
      distribution.

   3. All advertising materials mentioning features or use of this
      software must display the following acknowledgment:
      "This product includes software developed by the OpenSSL Project
      for use in the OpenSSL Toolkit. (http://www.openssl.org/)"

   4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      endorse or promote products derived from this software without
      prior written permission. For written permission, please contact
      openssl-core@openssl.org.

   5. Products derived from this software may not be called "OpenSSL"
      nor may "OpenSSL" appear in their names without prior written
      permission of the OpenSSL Project.

   6. Redistributions of any form whatsoever must retain the following
      acknowledgment:
      "This product includes software developed by the OpenSSL Project
      for use in the OpenSSL Toolkit (http://www.openssl.org/)"

   THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
   ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   OF THE POSSIBILITY OF SUCH DAMAGE.
   ====================================================================

   This product includes cryptographic software written by Eric Young
   (eay@cryptsoft.com).  This product includes software written by Tim
   Hudson (tjh@cryptsoft.com).

 Original SSLeay License
 -----------------------

Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
   All rights reserved.

   This package is an SSL implementation written
   by Eric Young (eay@cryptsoft.com).
   The implementation was written so as to conform with Netscapes SSL.
   
   This library is free for commercial and non-commercial use as long as
   the following conditions are aheared to.  The following conditions
   apply to all code found in this distribution, be it the RC4, RSA,
   lhash, DES, etc., code; not just the SSL code.  The SSL documentation
   included with this distribution is covered by the same copyright terms
   except that the holder is Tim Hudson (tjh@cryptsoft.com).
   
   Copyright remains Eric Young's, and as such any Copyright notices in
   the code are not to be removed.
   If this package is used in a product, Eric Young should be given attribution
   as the author of the parts of the library used.
   This can be in the form of a textual message at program startup or
   in documentation (online or textual) provided with the package.
   
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:
   1. Redistributions of source code must retain the copyright
      notice, this list of conditions and the following disclaimer.
   2. Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
   3. All advertising materials mentioning features or use of this software
      must display the following acknowledgement:
      "This product includes cryptographic software written by
       Eric Young (eay@cryptsoft.com)"
      The word 'cryptographic' can be left out if the rouines from the library
      being used are not cryptographic related :-).
   4. If you include any Windows specific code (or a derivative thereof) from 
      the apps directory (application code) you must include an acknowledgement:
      "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
   
   THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   SUCH DAMAGE.
   
   The licence and distribution terms for any publically available version or
   derivative of this code cannot be changed.  i.e. this code cannot simply be
   copied and put under another distribution licence
   [including the GNU Public Licence.]

png

Source: https://github.com/pnggroup/libpng

License

COPYRIGHT NOTICE, DISCLAIMER, and LICENSE
=========================================

PNG Reference Library License version 2
---------------------------------------

 * Copyright (c) 1995-2024 The PNG Reference Library Authors.
 * Copyright (c) 2018-2024 Cosmin Truta.
 * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
 * Copyright (c) 1996-1997 Andreas Dilger.
 * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.

The software is supplied "as is", without warranty of any kind,
express or implied, including, without limitation, the warranties
of merchantability, fitness for a particular purpose, title, and
non-infringement.  In no event shall the Copyright owners, or
anyone distributing the software, be liable for any damages or
other liability, whether in contract, tort or otherwise, arising
from, out of, or in connection with the software, or the use or
other dealings in the software, even if advised of the possibility
of such damage.

Permission is hereby granted to use, copy, modify, and distribute
this software, or portions hereof, for any purpose, without fee,
subject to the following restrictions:

 1. The origin of this software must not be misrepresented; you
    must not claim that you wrote the original software.  If you
    use this software in a product, an acknowledgment in the product
    documentation would be appreciated, but is not required.

 2. Altered source versions must be plainly marked as such, and must
    not be misrepresented as being the original software.

 3. This Copyright notice may not be removed or altered from any
    source or altered source distribution.


PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35)
-----------------------------------------------------------------------

libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are
Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
derived from libpng-1.0.6, and are distributed according to the same
disclaimer and license as libpng-1.0.6 with the following individuals
added to the list of Contributing Authors:

    Simon-Pierre Cadieux
    Eric S. Raymond
    Mans Rullgard
    Cosmin Truta
    Gilles Vollant
    James Yu
    Mandar Sahastrabuddhe
    Google Inc.
    Vadim Barkov

and with the following additions to the disclaimer:

    There is no warranty against interference with your enjoyment of
    the library or against infringement.  There is no warranty that our
    efforts or the library will fulfill any of your particular purposes
    or needs.  This library is provided with all faults, and the entire
    risk of satisfactory quality, performance, accuracy, and effort is
    with the user.

Some files in the "contrib" directory and some configure-generated
files that are distributed with libpng have other copyright owners, and
are released under other open source licenses.

libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
libpng-0.96, and are distributed according to the same disclaimer and
license as libpng-0.96, with the following individuals added to the
list of Contributing Authors:

    Tom Lane
    Glenn Randers-Pehrson
    Willem van Schaik

libpng versions 0.89, June 1996, through 0.96, May 1997, are
Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
and are distributed according to the same disclaimer and license as
libpng-0.88, with the following individuals added to the list of
Contributing Authors:

    John Bowler
    Kevin Bracey
    Sam Bushell
    Magnus Holmgren
    Greg Roelofs
    Tom Tanner

Some files in the "scripts" directory have other copyright owners,
but are released under this license.

libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.

For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:

    Andreas Dilger
    Dave Martindale
    Guy Eric Schalnat
    Paul Schmidt
    Tim Wegner

The PNG Reference Library is supplied "AS IS".  The Contributing
Authors and Group 42, Inc. disclaim all warranties, expressed or
implied, including, without limitation, the warranties of
merchantability and of fitness for any purpose.  The Contributing
Authors and Group 42, Inc. assume no liability for direct, indirect,
incidental, special, exemplary, or consequential damages, which may
result from the use of the PNG Reference Library, even if advised of
the possibility of such damage.

Permission is hereby granted to use, copy, modify, and distribute this
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:

 1. The origin of this source code must not be misrepresented.

 2. Altered versions must be plainly marked as such and must not
    be misrepresented as being the original source.

 3. This Copyright notice may not be removed or altered from any
    source or altered source distribution.

The Contributing Authors and Group 42, Inc. specifically permit,
without fee, and encourage the use of this source code as a component
to supporting the PNG file format in commercial products.  If you use
this source code in a product, acknowledgment is not required but would
be appreciated.

skia

Source: https://github.com/google/skia

License

Copyright (c) 2011 Google Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

  * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

  * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

  * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

spatialite

Source: https://www.gaia-gis.it/fossil/libspatialite/index

License

The contents of this file are subject to the Mozilla Public License
Version 1.1 (the ""License""); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/

Software distributed under the License is distributed on an ""AS IS""
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is the SpatiaLite library.

The Initial Developer of the Original Code is Alessandro Furieri.
Portions created by the Initial Developer are Copyright (C) 2008
the Initial Developer. All Rights Reserved.

Contributor(s): 
Klaus Foerster <klaus.foerster@svg.cc> [AsSvg()]
Luigi Costalli <luigi.costalli@gmail.com> [Dijkstra's shortest path algorithm]

The Vanuatu Team - University of Toronto [WKT parser]
Supervisor: Greg Wilson <gvwilson@cs.toronto.ca>
[you can find the complete team composition in gg_wkt.c]


Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the ""GPL""), or
the GNU Lesser General Public License Version 2.1 or later (the ""LGPL""),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.

tinyxpath

Source: https://tinyxpath.sourceforge.net/ License

TinyXPath is covered by the zlib license :
   www.sourceforge.net/projects/tinyxpath
   Copyright (c) 2002-2006 Yves Berquin (yvesb@users.sourceforge.net)

   This software is provided 'as-is', without any express or implied
   warranty. In no event will the authors be held liable for any
   damages arising from the use of this software.

   Permission is granted to anyone to use this software for any
   purpose, including commercial applications, and to alter it and
   redistribute it freely, subject to the following restrictions:

   1. The origin of this software must not be misrepresented; you must
   not claim that you wrote the original software. If you use this
   software in a product, an acknowledgment in the product documentation
   would be appreciated but is not required.

   2. Altered source versions must be plainly marked as such, and
   must not be misrepresented as being the original software.

   3. This notice may not be removed or altered from any source
   distribution.

ZeroMQ

Source: https://zeromq.org/

License

Mozilla Public License Version 2.0
==================================

1. Definitions
--------------

1.1. "Contributor"
    means each individual or legal entity that creates, contributes to
    the creation of, or owns Covered Software.

1.2. "Contributor Version"
    means the combination of the Contributions of others (if any) used
    by a Contributor and that particular Contributor's Contribution.

1.3. "Contribution"
    means Covered Software of a particular Contributor.

1.4. "Covered Software"
    means Source Code Form to which the initial Contributor has attached
    the notice in Exhibit A, the Executable Form of such Source Code
    Form, and Modifications of such Source Code Form, in each case
    including portions thereof.

1.5. "Incompatible With Secondary Licenses"
    means

    (a) that the initial Contributor has attached the notice described
        in Exhibit B to the Covered Software; or

    (b) that the Covered Software was made available under the terms of
        version 1.1 or earlier of the License, but not also under the
        terms of a Secondary License.

1.6. "Executable Form"
    means any form of the work other than Source Code Form.

1.7. "Larger Work"
    means a work that combines Covered Software with other material, in
    a separate file or files, that is not Covered Software.

1.8. "License"
    means this document.

1.9. "Licensable"
    means having the right to grant, to the maximum extent possible,
    whether at the time of the initial grant or subsequently, any and
    all of the rights conveyed by this License.

1.10. "Modifications"
    means any of the following:

    (a) any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered
        Software; or

    (b) any new file in Source Code Form that contains any Covered
        Software.

1.11. "Patent Claims" of a Contributor
    means any patent claim(s), including without limitation, method,
    process, and apparatus claims, in any patent Licensable by such
    Contributor that would be infringed, but for the grant of the
    License, by the making, using, selling, offering for sale, having
    made, import, or transfer of either its Contributions or its
    Contributor Version.

1.12. "Secondary License"
    means either the GNU General Public License, Version 2.0, the GNU
    Lesser General Public License, Version 2.1, the GNU Affero General
    Public License, Version 3.0, or any later versions of those
    licenses.

1.13. "Source Code Form"
    means the form of the work preferred for making modifications.

1.14. "You" (or "Your")
    means an individual or a legal entity exercising rights under this
    License. For legal entities, "You" includes any entity that
    controls, is controlled by, or is under common control with You. For
    purposes of this definition, "control" means (a) the power, direct
    or indirect, to cause the direction or management of such entity,
    whether by contract or otherwise, or (b) ownership of more than
    fifty percent (50%) of the outstanding shares or beneficial
    ownership of such entity.

2. License Grants and Conditions
--------------------------------

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or
    as part of a Larger Work; and

(b) under Patent Claims of such Contributor to make, use, sell, offer
    for sale, have made, import, and otherwise transfer either its
    Contributions or its Contributor Version.

2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.

2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

(a) for any code that a Contributor has removed from Covered Software;
    or

(b) for infringements caused by: (i) Your and any other third party's
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

(c) under Patent Claims infringed by Covered Software in the absence of
    its Contributions.

This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).

2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation

Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.

2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.

3. Responsibilities
-------------------

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.

3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:

(a) such Covered Software must also be made available in Source Code
    Form, as described in Section 3.1, and You must inform recipients of
    the Executable Form how they can obtain a copy of such Source Code
    Form by reasonable means in a timely manner, at a charge no more
    than the cost of distribution to the recipient; and

(b) You may distribute such Executable Form under the terms of this
    License, or sublicense it under different terms, provided that the
    license for the Executable Form does not attempt to limit or alter
    the recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).

3.4. Notices

You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.

4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------

If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.

5. Termination
--------------

5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.

************************************************************************
*                                                                      *
*  6. Disclaimer of Warranty                                           *
*  -------------------------                                           *
*                                                                      *
*  Covered Software is provided under this License on an "as is"       *
*  basis, without warranty of any kind, either expressed, implied, or  *
*  statutory, including, without limitation, warranties that the       *
*  Covered Software is free of defects, merchantable, fit for a        *
*  particular purpose or non-infringing. The entire risk as to the     *
*  quality and performance of the Covered Software is with You.        *
*  Should any Covered Software prove defective in any respect, You     *
*  (not any Contributor) assume the cost of any necessary servicing,   *
*  repair, or correction. This disclaimer of warranty constitutes an   *
*  essential part of this License. No use of any Covered Software is   *
*  authorized under this License except under this disclaimer.         *
*                                                                      *
************************************************************************

************************************************************************
*                                                                      *
*  7. Limitation of Liability                                          *
*  --------------------------                                          *
*                                                                      *
*  Under no circumstances and under no legal theory, whether tort      *
*  (including negligence), contract, or otherwise, shall any           *
*  Contributor, or anyone who distributes Covered Software as          *
*  permitted above, be liable to You for any direct, indirect,         *
*  special, incidental, or consequential damages of any character      *
*  including, without limitation, damages for lost profits, loss of    *
*  goodwill, work stoppage, computer failure or malfunction, or any    *
*  and all other commercial damages or losses, even if such party      *
*  shall have been informed of the possibility of such damages. This   *
*  limitation of liability shall not apply to liability for death or   *
*  personal injury resulting from such party's negligence to the       *
*  extent applicable law prohibits such limitation. Some               *
*  jurisdictions do not allow the exclusion or limitation of           *
*  incidental or consequential damages, so this exclusion and          *
*  limitation may not apply to You.                                    *
*                                                                      *
************************************************************************

8. Litigation
-------------

Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.

9. Miscellaneous
----------------

This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.

10. Versions of the License
---------------------------

10.1. New Versions

Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.

10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.

10.3. Modified Versions

If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses

If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice
-------------------------------------------

  This Source Code Form is subject to the terms of the Mozilla Public
  License, v. 2.0. If a copy of the MPL was not distributed with this
  file, You can obtain one at http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------

  This Source Code Form is "Incompatible With Secondary Licenses", as
  defined by the Mozilla Public License, v. 2.0.

pugixml

Source: https://pugixml.org/

License

Copyright (c) 2006-2023 Arseny Kapoulkine

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

This means that you can freely use pugixml in your applications, both open-source and proprietary. If you use pugixml in a product, it is sufficient to add an acknowledgment like this to the product distribution:

This software is based on pugixml library (http://pugixml.org). pugixml is Copyright (C) 2006-2018 Arseny Kapoulkine.

rapidjson

Source: https://rapidjson.org/

License

Tencent is pleased to support the open source community by making RapidJSON available.
 
Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
 
Licensed under the MIT License (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at
 
http://opensource.org/licenses/MIT
 
Unless required by applicable law or agreed to in writing, software distributed 
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
CONDITIONS OF ANY KIND, either express or implied. See the License for the 
specific language governing permissions and limitations under the License.

imgui

Source: https://github.com/ocornut/imgui

License

The MIT License (MIT)

Copyright (c) 2014-2024 Omar Cornut

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.