簡體   English   中英

這里 Android SDK - 導航通過“No_THROUGH_TRAFFIC”和“DIR_NO_TRUCKS”街道

[英]Here Android SDK - Navigate through "No_THROUGH_TRAFFIC" and "DIR_NO_TRUCKS" streets

一個簡短而簡單的問題,希望有人能夠回答:

TRUCK運輸模式下,如何使用 Here Android SDK Premium 通過具有DIR_NO_CARSNO_THROUGH_TRAFFICDIR_NO_TRUCKS屬性的道路元素導航? 就像我是一輛特殊的車,我可以在這些道路上行駛。

我的代碼如下所示:

public class Scratch extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AndroidXMapFragment mapFragment = (AndroidXMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment);
        boolean success = com.here.android.mpa.common.MapSettings.setIsolatedDiskCacheRootPath(
                getApplicationContext().getExternalFilesDir(null) + File.separator + ".here-maps",
                "MainActivity");
        System.out.println(success);

        mapFragment.init(new OnEngineInitListener() {
            @Override
            public void onEngineInitializationCompleted(
                    OnEngineInitListener.Error error) {
                if (error == OnEngineInitListener.Error.NONE) {
                    // now the map is ready to be used
                    Map map = mapFragment.getMap();
                    for (String sheme : map.getMapSchemes()) {

                        Log.d("Custom", sheme);
                    }
                    map.setMapScheme("pedestrian.day");
                    map.setMapDisplayLanguage(Locale.GERMANY);

                    //Show current position marker
                    PositioningManager.getInstance().start(PositioningManager.LocationMethod.GPS_NETWORK);
                    mapFragment.getPositionIndicator().setVisible(true);

                    //Routing
                    GeoCoordinate start = new GeoCoordinate(50.992189, 10.999966);
                    GeoCoordinate target = new GeoCoordinate(51.001224, 10.990920);

                    //Start - End marker for routing
                    MapLabeledMarker markerStart = new MapLabeledMarker(start)
                            .setLabelText(map.getMapDisplayLanguage(), "Start")
                            .setIcon(IconCategory.ALL);
                    markerStart.setZIndex(12);
                    map.addMapObject(markerStart);

                    MapLabeledMarker markerTarget = new MapLabeledMarker(target)
                            .setLabelText(map.getMapDisplayLanguage(), "End")
                            .setIcon(IconCategory.ALL);
                    markerTarget.setZIndex(12);
                    map.addMapObject(markerTarget);

                    CoreRouter router = new CoreRouter();

                    router.setDynamicPenalty(NewPenaltyForStreetArea(
                            router.getDynamicPenalty(),
                            new GeoCoordinate(51.001137, 10.989901),
                            new GeoCoordinate(50.992582, 10.999338),
                            map.getMapDisplayLanguage(),
                            "Im Geströdig",
                            DrivingDirection.DIR_BOTH,
                            70
                    ));

                    RouteOptions routeOptions = new RouteOptions();
                    routeOptions.setTransportMode(RouteOptions.TransportMode.TRUCK);
                    routeOptions.setRouteType(RouteOptions.Type.FASTEST);
                    routeOptions.setCarpoolAllowed(false);
                    routeOptions.setCarShuttleTrainsAllowed(false);
                    routeOptions.setDirtRoadsAllowed(true);
                    routeOptions.setTruckLength(6.590f);
                    routeOptions.setTruckWidth(2.150f);
                    routeOptions.setTruckHeight(2.150f);
                    routeOptions.setTruckTrailersCount(0);
                    routeOptions.setTruckDifficultTurnsAllowed(true);
                    routeOptions.setRouteCount(2);

                    RoutePlan routePlan = new RoutePlan();
                    routePlan.setRouteOptions(routeOptions);
                    routePlan.addWaypoint(new RouteWaypoint(start));
                    routePlan.addWaypoint(new RouteWaypoint(target));

                    class RouteListener implements CoreRouter.Listener {

                        // Method defined in Listener
                        public void onProgress(int percentage) {
                            // Display a message indicating calculation progress
                            Log.d("Custom", percentage + "");
                        }

                        // Method defined in Listener
                        @Override
                        public void onCalculateRouteFinished(List<RouteResult> routeResult, RoutingError error) {
                            // If the route was calculated successfully
                            if (error == RoutingError.NONE) {
                                // Render the route on the map
                                Log.d("Custom", routeResult.size() + " Routes calculated");

                                for (RouteResult result : routeResult) {
                                    MapRoute mapRoute = new MapRoute(result.getRoute());
                                    mapRoute.setColor(Color.argb(100, 201, 42, 42));
                                    mapRoute.setZIndex(10);

                                    if (routeResult.indexOf(result) == 0) {
                                        //Best route
                                        mapRoute.setColor(Color.argb(255, 201, 42, 42));
                                        mapRoute.setZIndex(11);
                                    }
                                    map.addMapObject(mapRoute);
                                }
                            }
                            else {
                                // Display a message indicating route calculation failure
                            }
                        }
                    }

                    router.calculateRoute(routePlan, new RouteListener());
                } else {
                    System.out.println("ERROR: Cannot initialize AndroidXMapFragment");
                    System.out.println(error);
                }
            }
        });
    }

    private DynamicPenalty NewPenaltyForStreetArea(DynamicPenalty dynamicPenalty, GeoCoordinate cord1, GeoCoordinate cord2, String marcCode, String streetName, DrivingDirection drivingDirection, int speed){
        List<GeoCoordinate> penaltyArea = new ArrayList<>();
        penaltyArea.add(cord1);
        penaltyArea.add(cord2);

        List<RoadElement> roadElements = RoadElement.getRoadElements(GeoBoundingBox.getBoundingBoxContainingGeoCoordinates(penaltyArea), marcCode);
        for (int i = 0; i < roadElements.size(); i++) {
            //Log.d("Custom", roadElements.get(i).getRoadName());

            if (!roadElements.get(i).getRoadName().equals(streetName)){
                roadElements.remove(i);
                i--;
            }
            else
                Log.d("Custom", roadElements.get(i).getAttributes().toString());
        }

        Log.d("Custom", "Set penalty for " + roadElements.size() + " road elements - " + streetName);

        for (RoadElement road : roadElements) {
            dynamicPenalty.addRoadPenalty(road, drivingDirection, speed);
        }

        return dynamicPenalty;
    }
}

這就是我得到的

但這是我需要的

所以我想說導航API,我的車可以訪問“Im Geströdig”道路。 道路元素屬性我需要以某種方式改變:

[DIR_NO_CARS, DIRT_ROAD, NO_THROUGH_TRAFFIC, DIR_NO_TRUCKS]

用例的解決方案並非微不足道。 更新道路元素屬性的功能可通過 HERE 自定義路線 API 獲得,您需要在此處上傳具有與您要修改的道路相匹配的形狀的疊加層。 可以更新的屬性也是有限的。 ("VEHICLE_TYPES":"49" 表示道路對汽車、卡車、行人開放)

 GET http://cre.api.here.com/2/overlays/upload.json
  ?map_name=OVERLAYBLOCKROAD
  &overlay_spec=[{"op":"override","shape":[[50.10765,8.68774],[50.10914,8.68771]],"layer":"LINK_ATTRIBUTE_FCN","data":{"VEHICLE_TYPES":"49"}}]
  &storage=readonly
  &app_id={YOUR_APP_ID}
  &app_code={YOUR_APP_CODE}

確保使用與 HERE Premium Mobile SDK 相同的 AppId、Appcode。 現在,此疊加層可用於帶有FTCRRouter 的HERE Premium Mobile SDK(仍為 Beta 功能)

FTCRRouter ftcrRoute = new FTCRRouter();
FTCRRouter.RequestParameters parmaters =new
FTCRRouter.RequestParameters(routePlan,"OVERLAYBLOCKROAD",true);
ftcrRoute.calculateRoute(parmaters, new FTCRRouter.Listener() {
    @Override
    public void onCalculateRouteFinished(List<FTCRRoute> list,
                    FTCRRouter.ErrorResponse errorResponse) {
        if (errorResponse.getErrorCode() == RoutingError.NONE) {
            List<GeoCoordinate> shape = list.get(0).getGeometry();

            MapPolyline polyline = new MapPolyline();
            polyline.setGeoPolyline(new GeoPolygon(shape));
            polyline.setLineWidth(10);
            m_map.addMapObject(polyline);
        }else{
            // Error
        }
   }
});

由於 FTCRRouter 仍處於 Beta 階段,因此存在一些限制,例如不支持動態罰款,而且 FTCRRouter 始終更喜歡采用 HERE 地圖數據中可用的道路,並在必要時使用疊加層中的道路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM