Здесь Android SDK - перемещаться по улицам "No_THROUGH_TRAFFI C" и "DIR_NO_TRUCKS" - PullRequest
0 голосов
/ 01 марта 2020

Короткий и простой вопрос, на который, как мы надеемся, есть интересующий:

Как я могу перемещаться с помощью Here Android SDK Premium через дорожные элементы, имеющие атрибуты DIR_NO_CARS , NO_THROUGH_TRAFFI C, DIR_NO_TRUCKS в режиме транспорта TRUCK ? Как будто я специальная машина, и я могу ездить по этим дорогам.

Мой код выглядит следующим образом:

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]

1 Ответ

0 голосов
/ 03 марта 2020

Решение варианта использования не тривиально. Функциональность обновления атрибутов Road Element доступна через HERE Custom Route 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}

Убедитесь, что используется тот же AppId, Appcode, что и в HERE Premium Mobile SDK. Теперь это наложение можно использовать в HERE Premium Mobile 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 все еще находится в бета-версии, есть некоторые ограничения, такие как Dynami c Penanlity не поддерживается, а также FTCRRouter всегда предпочитает брать дороги, доступные в данных карты HERE, и при необходимости использует дороги из наложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...