位置情報

ARナビゲーション-Android

ARナビゲーション:

Mapbox Vision AR forは、Mapbox Vision SDKの一番上にある高レベルのフレームワークである。 Vision ARはナビゲーションルートを管理し、コアライブラリに変換し、デバイスの組み込みカメラからのライブビデオストリームの一番上にあるARナビゲーションルートをレンダリングする。

mapbox AR_NAVI

路線

Android:

ルートを生成して、道路のルートラインを投影し始める。 Mapbox Navigation SDKを使用して、Mapbox Directions APIへの新しいリクエストを作成するか、又はカスタムナビゲーションエンジンを使用する。 Android向けMapbox Navigation SDKを使用したい場合は、Navigation SDK ドキュメントの指示に従って、依存関係で追加する必要がある。

以下の例では、AndroidのNavigationRoute.BuilderクラスのAndroiMapbox Navigation SDKを使用して、Mapbox Directions APIへの新しいリクエストを作成する。リスポンスは地図上にルート表示、又はナビゲーションシーケンス開始に使用できるNavigationRouteオブジェクトになる。ナビゲーションSDKでルート生成の詳細については、ルート生成の案内書を参考してください。

VisionArManagerのsetRouteメソッドでVision ARビューで生成されたルートを使用できる。


1.	VisionArManager.setRoute(new Route(  
2.	getRoutePoints(route),  
3.	(float) routeProgress.durationRemaining(),  
4.	"Source street name",  
5.	"Target street name"  
6.	));  

デフォルトでは、ルートを表示するのに青い実線が使用されているが、カスタマイズが可能である。 VisionArView.setLaneVisualParamsを使用して、色、幅、光の座標、光の色、環境光の色などを変更する。

Android実装の例

下記の例には、2つの追加の依存関係が必要である。 これらの依存関係をgradleファイルに追加する。

1.	implementation "com.mapbox.mapboxsdk:mapbox-android-navigation:0.22.0"  
2.	implementation "com.mapbox.mapboxsdk:mapbox-android-core:0.2.1"  
3.	package com.mapbox.vision.examples;  
4.	  
5.	import android.annotation.SuppressLint;  
6.	import android.location.Location;  
7.	import android.os.Bundle;  
8.	import android.support.v7.app.AppCompatActivity;  
9.	import android.widget.Toast;  
10.	import com.mapbox.android.core.location.LocationEngine;  
11.	import com.mapbox.android.core.location.LocationEngineListener;  
12.	import com.mapbox.android.core.location.LocationEnginePriority;  
13.	import com.mapbox.android.core.location.LocationEngineProvider;  
14.	import com.mapbox.api.directions.v5.models.*;  
15.	import com.mapbox.geojson.Point;  
16.	import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigation;  
17.	import com.mapbox.services.android.navigation.v5.navigation.MapboxNavigationOptions;  
18.	import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;  
19.	import com.mapbox.services.android.navigation.v5.offroute.OffRouteListener;  
20.	import com.mapbox.services.android.navigation.v5.route.RouteFetcher;  
21.	import com.mapbox.services.android.navigation.v5.route.RouteListener;  
22.	import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener;  
23.	import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;  
24.	import com.mapbox.vision.VisionManager;  
25.	import com.mapbox.vision.ar.VisionArManager;  
26.	import com.mapbox.vision.ar.core.models.Route;  
27.	import com.mapbox.vision.ar.core.models.RoutePoint;  
28.	import com.mapbox.vision.ar.view.gl.VisionArView;  
29.	import com.mapbox.vision.mobile.core.interfaces.VisionEventsListener;  
30.	import com.mapbox.vision.mobile.core.models.AuthorizationStatus;  
31.	import com.mapbox.vision.mobile.core.models.Camera;  
32.	import com.mapbox.vision.mobile.core.models.Country;  
33.	import com.mapbox.vision.mobile.core.models.FrameSegmentation;  
34.	import com.mapbox.vision.mobile.core.models.classification.FrameSignClassifications;  
35.	import com.mapbox.vision.mobile.core.models.detection.FrameDetections;  
36.	import com.mapbox.vision.mobile.core.models.position.GeoCoordinate;  
37.	import com.mapbox.vision.mobile.core.models.position.VehicleState;  
38.	import com.mapbox.vision.mobile.core.models.road.RoadDescription;  
39.	import com.mapbox.vision.mobile.core.models.world.WorldDescription;  
40.	import com.mapbox.vision.performance.ModelPerformance.On;  
41.	import com.mapbox.vision.performance.ModelPerformanceConfig.Merged;  
42.	import com.mapbox.vision.performance.ModelPerformanceMode;  
43.	import com.mapbox.vision.performance.ModelPerformanceRate;  
44.	import org.jetbrains.annotations.NotNull;  
45.	import retrofit2.Call;  
46.	import retrofit2.Callback;  
47.	import retrofit2.Response;  
48.	  
49.	import java.util.ArrayList;  
50.	import java.util.List;  
51.	  
52.	/** 
53.	 * Example shows how Vision and VisionAR SDKs are used to draw AR lane over the video stream from camera. 
54.	 * Also, Mapbox navigation services are used to build route and  navigation session. 
55.	 */  
56.	public class ArActivity extends AppCompatActivity implements LocationEngineListener, RouteListener, ProgressChangeListener, OffRouteListener {  
57.	  
58.	    // Handles navigation.  
59.	    private MapboxNavigation mapboxNavigation;  
60.	    // Fetches route from points.  
61.	    private RouteFetcher routeFetcher;  
62.	    private RouteProgress lastRouteProgress;  
63.	    private DirectionsRoute directionsRoute;  
64.	    private LocationEngine arLocationEngine;  
65.	  
66.	    // This dummy points will be used to build route. For real world test this needs to be changed to real values for  
67.	    // source and target locations.  
68.	    private final Point ROUTE_ORIGIN = Point.fromLngLat(35.681461, 139.766357);  
69.	    private final Point ROUTE_DESTINATION = Point.fromLngLat(35.686468, 139.716307);  
70.	  
71.	    @Override  
72.	    protected void onCreate(Bundle savedInstanceState) {  
73.	        super.onCreate(savedInstanceState);  
74.	        this.setContentView(R.layout.activity_ar_navigation);  
75.	  
76.	        // Initialize navigation with your Mapbox access token.  
77.	        mapboxNavigation = new MapboxNavigation(  
78.	                this,  
79.	                getString(R.string.mapbox_access_token),  
80.	                MapboxNavigationOptions.builder().enableOffRouteDetection(true).build()  
81.	        );  
82.	  
83.	        // Initialize route fetcher with your Mapbox access token.  
84.	        routeFetcher = new RouteFetcher(this, getString(R.string.mapbox_access_token));  
85.	        routeFetcher.addRouteListener(this);  
86.	  
87.	        LocationEngineProvider provider = new LocationEngineProvider(this);  
88.	        arLocationEngine = provider.obtainBestLocationEngineAvailable();  
89.	        arLocationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);  
90.	        arLocationEngine.setInterval(0);  
91.	        arLocationEngine.setFastestInterval(1000);  
92.	    }  
93.	  
94.	    @Override  
95.	    protected void onResume() {  
96.	        super.onResume();  
97.	        arLocationEngine.activate();  
98.	        arLocationEngine.addLocationEngineListener(this);  
99.	  
100.	        initDirectionsRoute();  
101.	  
102.	        // Route need to be reestablished if off route happens.  
103.	        mapboxNavigation.addOffRouteListener(this);  
104.	        mapboxNavigation.addProgressChangeListener(this);  
105.	  
106.	        // Create and start VisionManager.  
107.	        VisionManager.create();  
108.	        VisionManager.setModelPerformanceConfig(new Merged(new On(ModelPerformanceMode.FIXED, ModelPerformanceRate.LOW)));  
109.	        VisionManager.start(  
110.	                new VisionEventsListener() {  
111.	  
112.	                    @Override  
113.	                    public void onAuthorizationStatusUpdated(@NotNull AuthorizationStatus authorizationStatus) {}  
114.	  
115.	                    @Override  
116.	                    public void onFrameSegmentationUpdated(@NotNull FrameSegmentation frameSegmentation) {}  
117.	  
118.	                    @Override  
119.	                    public void onFrameDetectionsUpdated(@NotNull FrameDetections frameDetections) {}  
120.	  
121.	                    @Override  
122.	                    public void onFrameSignClassificationsUpdated(@NotNull FrameSignClassifications frameSignClassifications) {}  
123.	  
124.	                    @Override  
125.	                    public void onRoadDescriptionUpdated(@NotNull RoadDescription roadDescription) {}  
126.	  
127.	                    @Override  
128.	                    public void onWorldDescriptionUpdated(@NotNull WorldDescription worldDescription) {}  
129.	  
130.	                    @Override  
131.	                    public void onVehicleStateUpdated(@NotNull VehicleState vehicleState) {}  
132.	  
133.	                    @Override  
134.	                    public void onCameraUpdated(@NotNull Camera camera) {}  
135.	  
136.	                    @Override  
137.	                    public void onCountryUpdated(@NotNull Country country) {}  
138.	  
139.	                    @Override  
140.	                    public void onUpdateCompleted() {}  
141.	                }  
142.	        );  
143.	  
144.	        VisionArView visionArView = findViewById(R.id.mapbox_ar_view);  
145.	        VisionManager.setVideoSourceListener(visionArView);  
146.	  
147.	        // Create VisionArManager.  
148.	        VisionArManager.create(VisionManager.INSTANCE, visionArView);  
149.	    }  
150.	  
151.	    private void initDirectionsRoute() {  
152.	        // Get route from predefined points.  
153.	        NavigationRoute.builder(this)  
154.	                .accessToken(getString(R.string.mapbox_access_token))  
155.	                .origin(ROUTE_ORIGIN)  
156.	                .destination(ROUTE_DESTINATION)  
157.	                .build()  
158.	                .getRoute(new Callback() {  
159.	                    @Override  
160.	                    public void onResponse(Call call, Response response) {  
161.	                        if (response.body() == null || response.body().routes().isEmpty()) {  
162.	                            return;  
163.	                        }  
164.	  
165.	                        // Start navigation session with retrieved route.  
166.	                        DirectionsRoute route = response.body().routes().get(0);  
167.	                        mapboxNavigation.startNavigation(route);  
168.	  
169.	                        // Set route progress.  
170.	                        VisionArManager.setRoute(new Route(  
171.	                                getRoutePoints(route),  
172.	                                directionsRoute.duration().floatValue(),  
173.	                                "",  
174.	                                ""  
175.	                        ));  
176.	                    }  
177.	  
178.	                    @Override  
179.	                    public void onFailure(Call call, Throwable t) {}  
180.	                });  
181.	    }  
182.	  
183.	    @Override  
184.	    protected void onPause() {  
185.	        super.onPause();  
186.	        VisionArManager.destroy();  
187.	        VisionManager.stop();  
188.	        VisionManager.destroy();  
189.	  
190.	        arLocationEngine.removeLocationUpdates();  
191.	        arLocationEngine.removeLocationEngineListener((LocationEngineListener) this);  
192.	        arLocationEngine.deactivate();  
193.	  
194.	        mapboxNavigation.removeProgressChangeListener(this);  
195.	        mapboxNavigation.removeOffRouteListener(this);  
196.	        mapboxNavigation.stopNavigation();  
197.	    }  
198.	  
199.	    @Override  
200.	    public void onLocationChanged(Location location) {}  
201.	  
202.	    @Override  
203.	    @SuppressLint({"MissingPermission"})  
204.	    public void onConnected() {  
205.	        arLocationEngine.requestLocationUpdates();  
206.	    }  
207.	  
208.	    @Override  
209.	    public void onErrorReceived(Throwable throwable) {  
210.	        if (throwable != null) {  
211.	            throwable.printStackTrace();  
212.	        }  
213.	  
214.	        mapboxNavigation.stopNavigation();  
215.	        Toast.makeText(this, "Can not calculate the route requested", Toast.LENGTH_SHORT).show();  
216.	    }  
217.	  
218.	    @Override  
219.	    public void onResponseReceived(@NotNull DirectionsResponse response, RouteProgress routeProgress) {  
220.	        mapboxNavigation.stopNavigation();  
221.	        if (response.routes().isEmpty()) {  
222.	            Toast.makeText(this, "Can not calculate the route requested", Toast.LENGTH_SHORT).show();  
223.	        } else {  
224.	            DirectionsRoute route = response.routes().get(0);  
225.	  
226.	            mapboxNavigation.startNavigation(route);  
227.	  
228.	            // Set route progress.  
229.	            VisionArManager.setRoute(new Route(  
230.	                    getRoutePoints(route),  
231.	                    (float) routeProgress.durationRemaining(),  
232.	                    "",  
233.	                    ""  
234.	            ));  
235.	        }  
236.	    }  
237.	  
238.	    @Override  
239.	    public void onProgressChange(Location location, RouteProgress routeProgress) {  
240.	        lastRouteProgress = routeProgress;  
241.	    }  
242.	  
243.	    @Override  
244.	    public void userOffRoute(Location location) {  
245.	        routeFetcher.findRouteFromRouteProgress(location, lastRouteProgress);  
246.	    }  
247.	  
248.	    private RoutePoint[] getRoutePoints(@NotNull DirectionsRoute route) {  
249.	        ArrayList routePoints = new ArrayList<>();  
250.	  
251.	        List legs = route.legs();  
252.	        if (legs != null) {  
253.	            for (RouteLeg leg : legs) {  
254.	  
255.	                List steps = leg.steps();  
256.	                if (steps != null) {  
257.	                    for (LegStep step : steps) {  
258.	                        RoutePoint point = new RoutePoint((new GeoCoordinate(  
259.	                                step.maneuver().location().latitude(),  
260.	                                step.maneuver().location().longitude()  
261.	                        )));  
262.	  
263.	                        routePoints.add(point);  
264.	  
265.	                        List intersections = step.intersections();  
266.	                        if (intersections != null) {  
267.	                            for (StepIntersection intersection : intersections) {  
268.	                                point = new RoutePoint((new GeoCoordinate(  
269.	                                        step.maneuver().location().latitude(),  
270.	                                        step.maneuver().location().longitude()  
271.	                                )));  
272.	  
273.	                                routePoints.add(point);  
274.	                            }  
275.	                        }  
276.	                    }  
277.	                }  
278.	            }  
279.	        }  
280.	  
281.	        return routePoints.toArray(new RoutePoint[0]);  
282.	    }  
283.	}   

Related post

  1. レイヤの処理-iOS

  2. MAPBOX NAVIGATION SDK Ver10がパブリックプレ…

  3. clustermap

    [Mapboxリファレンス]大量のデータをクラスターで表現する

  4. MapBox Studioの概要-Web

  5. データ視覚化

  6. 安全警告-Android

PAGE TOP