【AndroidでSkobblerを使う】ナビゲーションの設定

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回はナビゲーションの設定についてのコードです。
public class MainActivity extends AppCompatActivity {
    private SKMapSurfaceView skMapSurfaceView;
    private SKMapViewHolder mapHolder;
    String mapResourcesDirPath;
    private SKCoordinate startSkCoordinate = new SKCoordinate(139.766084, 35.681382);

    SKNavigationListener skNavigationListener = new SKNavigationListener() {
        @Override
        public void onDestinationReached() {
            Log.d("SKNavigationListener", "onDestinationReached");
        }

        @Override
        public void onSignalNewAdviceWithInstruction(String s) {
            Log.d("SKNavigationListener", "onSignalNewAdviceWithInstruction:" + s);
        }

        @Override
        public void onSignalNewAdviceWithAudioFiles(String[] strings, boolean b) {
            Log.d("SKNavigationListener", "onSignalNewAdviceWithAudioFiles:" + b);
            Log.d("SKNavigationListener","onSignalNewAdviceWithAudioFiles:" + b);
            for (String string : strings) {
                Log.d("SKNavigationListener","onSignalNewAdviceWithAudioFiles:" + string);
            }
        }

        @Override
        public void onSpeedExceededWithAudioFiles(String[] strings, boolean b) {
            Log.d("SKNavigationListener", "onSpeedExceededWithAudioFiles");
            Log.d("SKNavigationListener","onSpeedExceededWithAudioFiles:"  + b);
            for (String string : strings) {
                Log.d("SKNavigationListener","onSpeedExceededWithAudioFiles:"  + string);
            }
        }

        @Override
        public void onSpeedExceededWithInstruction(String s, boolean b) {
            Log.d("SKNavigationListener", "onSpeedExceededWithInstruction" + s + b);
            Log.d("SKNavigationListener", "String:" + s + "boolean:" + b);
        }

        @Override
        public void onUpdateNavigationState(SKNavigationState skNavigationState) {
            Log.d("SKNavigationListener", "onUpdateNavigationState:" + skNavigationState.toString());
        }

        @Override
        public void onReRoutingStarted() {
            Log.d("SKNavigationListener", "onReRoutingStarted");
        }

        @Override
        public void onFreeDriveUpdated(String s, String s1, String s2, SKNavigationState.SKStreetType skStreetType, double v, double v1) {
            Log.d("SKNavigationListener", s + "/" + s1 + "/" + s2 + "/" + skStreetType.toString() + "/" + v + "/" + v1);
        }

        @Override
        public void onViaPointReached(int i) {
            Log.d("SKNavigationListener", "onViaPointReached:" + i);
        }

        @Override
        public void onVisualAdviceChanged(boolean b, boolean b1, SKNavigationState skNavigationState) {
            Log.d("SKNavigationListener", "onVisualAdviceChanged:" + b +"/" +b1 + "/" + skNavigationState.toString());
        }

        @Override
        public void onTunnelEvent(boolean b) {
            Log.d("SKNavigationListener", "onTunnelEvent:" + b);
        }
    };

    SKRouteListener skRouteListener = new SKRouteListener() {
        @Override
        public void onRouteCalculationCompleted(SKRouteInfo skRouteInfo) {
            //経路計算が終わる毎に呼ばれる。
            Log.d("skRouteListener", "onRouteCalculationCompleted:" + skRouteInfo.toString());
        }

        @Override
        public void onRouteCalculationFailed(SKRoutingErrorCode skRoutingErrorCode) {
            //経路計算が終わったときに呼ばれる。
            Log.d("skRouteListener", "onRouteCalculationFailed:" + skRoutingErrorCode.toString());
        }

        @Override
        public void onAllRoutesCompleted() {
            //すべての経路計算が終わったときに呼ばれる。
            Log.d("skRouteListener", "onAllRoutesCompleted");
            //ナビゲーションの設定をする
            SKNavigationSettings navigationSettings = new SKNavigationSettings();
            //自分の位置をCCPアイコンにする
            navigationSettings.setCcpAsCurrentPosition(true);
            //ナビゲーションで使う距離の単位を設定する。
            navigationSettings.setDistanceUnit(SKMaps.SKDistanceUnitType.DISTANCE_UNIT_KILOMETER_METERS);
            //通りの名前を参照するかを設定する
            navigationSettings.setEnableReferenceStreetNames(false);
            //ナビゲーションタイプを設定する。
            //SKNavigationSettings.SKNavigationType.SIMULATION → 開始地点から終了地点までをシミュレーションする。スワイプによる移動は禁止される。
            //SKNavigationSettings.SKNavigationType.REAL → 端末のGPSをもとにナビゲーションする。
            //SKNavigationSettings.SKNavigationType.FILE → GPSが記載されているファイルをもとにナビゲーションする。
            navigationSettings.setNavigationType(SKNavigationSettings.SKNavigationType.SIMULATION);
            // SKNavigationSettings#setNavigationTypeでSKNavigationSettings.SKNavigationType.FILEを設定したときに、使用するファイルのパスを指定する。
            navigationSettings.setFileNavigationPath("");
            //ナビゲーションでの移動方法を設定する。
            //SKNavigationSettings.SKNavigationMode.PEDESTRIAN → 徒歩で移動する
            //SKNavigationSettings.SKNavigationMode.BIKE → バイクで移動する
            //SKNavigationSettings.SKNavigationMode.CAR → 車で移動する
            //SKNavigationSettings.SKNavigationMode.DISABLED → 無効です
            navigationSettings.setNavigationMode(SKNavigationSettings.SKNavigationMode.CAR);
            //自位置に対して画面の水平位置(-0.5~0.5)を変更する。マイナスは左、プラスは右にずらす。
            navigationSettings.setPositionerHorizontalAlignment(-0.1f);
            //自位置に対して画面の垂直位置(-0.5~0.5)を変更する。マイナスは下、プラスは上にずらす。
            navigationSettings.setPositionerVerticalAlignment(-0.1f);
            //GPS位置を表示する
            navigationSettings.setShowRealGPSPositions(true);
            //都市部の法定速度を設定する。超えるとSKNavigationListener.onSpeedExceededWithAudioFiles、SKNavigationListener.onSpeedExceededWithInstructionが呼ばれる。
            navigationSettings.setSpeedWarningThresholdInCity(60);
            //郊外の法定速度を設定する。超えるとSKNavigationListener.onSpeedExceededWithAudioFiles、SKNavigationListener.onSpeedExceededWithInstructionが呼ばれる。
            navigationSettings.setSpeedWarningThresholdOutsideCity(60);
            //通過した経路を消していくかどうかを設定する。
            navigationSettings.setSplitRouteEnabled(true);
            //足跡の設定を行う
            SKTrailType skTrailType = new SKTrailType();
            // 足跡をドットで表示する。
            // 第一引数-true:表示する/false:表示しない
            // 第二引数:
            skTrailType.setPedestrianTrailEnabled(true,1);
            // ドットの間隔を設定する。
            skTrailType.setSize(1);
            // 色を設定する。効果がない
            skTrailType.setColor(new float[]{0.976470588f, 0.003921569f, 0.580392157f, 1f});
            // ドットとして表示するかを設定する。効果がない
            skTrailType.setDotted(true);
            navigationSettings.setTrailType(skTrailType);
            // 指定したズームレベルにカメラを動かす。複数設定しても先頭のズームレベルにしかならない。
            SKZoomLevelConfiguration[] skZoomLevelConfigurations = new SKZoomLevelConfiguration[3];
            skZoomLevelConfigurations[0] = new SKZoomLevelConfiguration(10,12,18);
            skZoomLevelConfigurations[1] = new SKZoomLevelConfiguration(10,12,5);
            skZoomLevelConfigurations[2] = new SKZoomLevelConfiguration(10,12,18);
            navigationSettings.setZoomLevelConfigurations(skZoomLevelConfigurations);
            SKNavigationManager navigationManager = SKNavigationManager.getInstance();
            navigationManager.setMapView(skMapSurfaceView);
            navigationManager.setNavigationListener(skNavigationListener);
            navigationManager.startNavigation(navigationSettings);
        }
        
        @Override
        public void onServerLikeRouteCalculationCompleted(SKRouteJsonAnswer skRouteJsonAnswer) {
            //???
            Log.d("skRouteListener", "onServerLikeRouteCalculationCompleted:" + skRouteJsonAnswer.getJsonAnswer());
        }
        
        @Override
        public void onOnlineRouteComputationHanging(int i) {
            //???
            Log.d("skRouteListener", "onOnlineRouteComputationHanging:" + i);
        }
    };

    SKMapSurfaceListener skMapSurfaceListener = new SKMapSurfaceListener() {
        @Override
        public void onActionPan() {
        }

        @Override
        public void onActionZoom() {
        }

        @Override
        public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) {
            mapHolder = skMapViewHolder;
            skMapSurfaceView = skMapViewHolder.getMapSurfaceView();
            skMapSurfaceView.centerMapOnPosition(startSkCoordinate);
        }

        @Override
        public void onMapRegionChanged(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onMapRegionChangeStarted(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onDoubleTap(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onSingleTap(SKScreenPoint skScreenPoint) {
            SKCoordinate endSKSkCoordinate = skMapSurfaceView.pointToCoordinate(skScreenPoint);
            launchRouteCalculation(startSkCoordinate, endSKSkCoordinate);
        }

        @Override
        public void onRotateMap() {
        }

        @Override
        public void onLongPress(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onInternetConnectionNeeded() {
        }

        @Override
        public void onMapActionDown(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onMapActionUp(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onPOIClusterSelected(SKPOICluster skpoiCluster) {
        }

        @Override
        public void onMapPOISelected(SKMapPOI skMapPOI) {
        }

        @Override
        public void onAnnotationSelected(SKAnnotation skAnnotation) {
        }

        @Override
        public void onCustomPOISelected(SKMapCustomPOI skMapCustomPOI) {
        }

        @Override
        public void onCompassSelected() {
        }

        @Override
        public void onCurrentPositionSelected() {
        }

        @Override
        public void onObjectSelected(int i) {
        }

        @Override
        public void onInternationalisationCalled(int i) {
        }

        @Override
        public void onBoundingBoxImageRendered(int i) {
        }

        @Override
        public void onGLInitializationError(String s) {
        }

        @Override
        public void onScreenshotReady(Bitmap bitmap) {
        }
    };
    
    private void launchRouteCalculation(SKCoordinate startPoint, SKCoordinate destinationPoint) {
        //経路情報のキャッシュをクリアする
        SKRouteManager.getInstance().clearAllRoutesFromCache();
        //経路計算のリスナーを追加する。
        SKRouteManager.getInstance().setRouteListener(skRouteListener);
        //経路計算の設定する。
        SKRouteSettings skRouteSettings = new SKRouteSettings();
        //開始位置を設定する
        skRouteSettings.setStartCoordinate(startPoint);
        //終了位置を設定する
        skRouteSettings.setDestinationCoordinate(destinationPoint);
        //最大計算経路数を設定する
        skRouteSettings.setNoOfRoutes(5);
        //移動手段の設定
        //SKRouteSettings.SKRouteMode.BICYCLE_FASTEST→自転車最短時間
        //SKRouteSettings.SKRouteMode.BICYCLE_QUIETEST→自転車ゆっくり?
        //SKRouteSettings.SKRouteMode.BICYCLE_SHORTEST→自転車最短距離
        //SKRouteSettings.SKRouteMode.BUS_FASTEST→バス最短時間
        //SKRouteSettings.SKRouteMode.CAR_FASTEST→車最短時間
        //SKRouteSettings.SKRouteMode.CAR_SHORTEST→車最短時間
        //SKRouteSettings.SKRouteMode.EFFICIENT→???
        //SKRouteSettings.SKRouteMode.PEDESTRIAN→歩き
        skRouteSettings.setRouteMode(SKRouteSettings.SKRouteMode.PEDESTRIAN);
        //接続モードを設定する
        //SKRouteSettings.SKRouteConnectionMode.HYBRID→オフライン・オンラインの両方
        //SKRouteSettings.SKRouteConnectionMode.OFFLINE→オフライン
        //SKRouteSettings.SKRouteConnectionMode.ONLINE→オンライン
        skRouteSettings.setRouteConnectionMode(SKRouteSettings.SKRouteConnectionMode.HYBRID);
        //有料道路を避けるかどうか。避ける→true/避けない→false
        skRouteSettings.setTollRoadsAvoided(true);
        //高速道路を避けるかどうか。避ける→true/避けない→false
        skRouteSettings.setHighWaysAvoided(true);
        //フェリーを避けるかどうか。避ける→true/避けない→false
        skRouteSettings.setAvoidFerries(true);
        //経路情報だけを取得する。true:情報だけを取得し、地図上にルートを表示しない
        skRouteSettings.setRouteExposed(true);
        //自転車を運ぶのを避けるかどうか。
        skRouteSettings.setBicycleCarryAvoided(false);
        //自転車を降りて歩くのを避けるかどうか。
        skRouteSettings.setBicycleWalkAvoided(false);
        //経路計算を開始する。結果は成功失敗は各コールバックメソッドで返却する
        SKRouteManager.getInstance().calculateRoute(skRouteSettings);
        //わからない
        //skRouteSettings.setUseRoadSlopes();
        //skRouteSettings.setFilterAlternatives();
        //skRouteSettings.setRequestAdvices();
        //skRouteSettings.setExtendedPointsReturned();
        //skRouteSettings.setCountryCodesReturned();
        //skRouteSettings.setUseRoadSlopes();
        //skRouteSettings.setAlternativeRouteModes();
        //skRouteSettings.setDownloadRouteCorridor(true);
        //skRouteSettings.setRouteCorridorWidthInMeters(100);
        //skRouteSettings.setWaitForCorridorDownload(true);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapResourcesDirPath = getFilesDir().getPath() + "/" + "SKMaps/";
        if (!new File(mapResourcesDirPath).exists()) {
            new SKPrepareMapTextureThread(this, mapResourcesDirPath, "SKMaps.zip", new SKPrepareMapTextureListener() {
                @Override
                public void onMapTexturesPrepared(boolean b) {
                    if (b) {
                        initMapSetting();
                    }
                }
            }).start();
        } else {
            initMapSetting();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mapHolder != null) {
            mapHolder.onPause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mapHolder != null) {
            mapHolder.onResume();
        }
    }

    private void initMapSetting() {
        SKMapsInitSettings initMapSettings = new SKMapsInitSettings();
        initMapSettings.setMapResourcesPaths(mapResourcesDirPath,
        new SKMapViewStyle(mapResourcesDirPath + "daystyle/", "daystyle.json"));
        final SKAdvisorSettings advisorSettings = initMapSettings.getAdvisorSettings();
        advisorSettings.setAdvisorConfigPath(mapResourcesDirPath + "Advisor");
        advisorSettings.setResourcePath(mapResourcesDirPath + "Advisor/Languages");
        advisorSettings.setLanguage(SKAdvisorSettings.SKAdvisorLanguage.LANGUAGE_EN);
        advisorSettings.setAdvisorVoice("en");
        initMapSettings.setAdvisorSettings(advisorSettings);
        SKMaps.getInstance().initializeSKMaps(this, initMapSettings);
        SKMapFragment mapFragment = new SKMapFragment();
        mapFragment.setMapSurfaceListener(skMapSurfaceListener);
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.container, mapFragment).commit();
    }
}

Androidゲームプログラミング A to Z

新品価格
¥4,968から
(2017/2/27 22:58時点)


AndroidエンジニアのためのモダンJava

新品価格
¥3,456から
(2017/2/27 23:01時点)


AndroidNDKネイティブプログラミング第2版

中古価格
¥1,893から
(2017/2/28 00:04時点)


Androidアプリ開発逆引きレシピ (PROGRAMMER’S RECiPE)

新品価格
¥3,024から
(2017/2/28 00:06時点)


Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

新品価格
¥3,240から
(2017/2/28 00:11時点)


アプリを作ろう! Android入門 Android Studio版 Android5対応

新品価格
¥2,160から
(2017/2/28 00:31時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)