有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Here Android SDK在“无车无车”和“无车无车”街道上导航

这是一个简短的问题,希望有人能回答:

我如何使用Android SDK Premium在道路元素中导航,这些元素具有卡车运输模式下的属性直行车直行车直行车?就像我是一辆特殊的车,我可以在这些道路上行驶

我的代码如下所示:

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.安卓.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;
    }
}

And this is what I get

But this is what I need

所以我想说的是导航API,我的车可以进入“Im gesterödig”道路。 我需要以某种方式更改道路元素属性:

[DIR_NO_CARS, DIRT_ROAD, NO_THROUGH_TRAFFIC, DIR_NO_TRUCKS]

共 (1) 个答案

  1. # 1 楼答案

    用例的解决方案并非微不足道。更新道路元素属性的功能可通过HERE Custom Route API获得,在这里,您需要上传一个与要修改的道路匹配的形状覆盖。可更新的属性也有限。(“车辆类型”:“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。 现在,这个覆盖可以用在这里的高级移动SDK与FTCRRouter(仍然测试功能)

    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仍处于测试阶段,因此存在一些限制,例如不支持动态惩罚,而且FTCRRouter始终倾向于选择此处地图数据中可用的道路,并在必要时使用覆盖中的道路