Google Maps Direction API Android Studio - добавление дополнительной путевой точки между маршрутами

Я работаю над своим проектом, пытаясь добавить путевую точку между маршрутом, который я создал от моего местоположения до пункта назначения, коротко (от точки A до точки B). Я не могу это сделать, потому что в метод calculateDirections() добавлен и вычислен только один маркер. Как работает программа: местоположение добавляется на карту, первая точка добавляется, когда пользователь ищет местоположение в режиме автозаполнения, и она сразу же вычисляется, показывая пользователю маршрут. Как только это будет сделано, пользователь сможет щелкнуть в любом месте карты, чтобы добавить дополнительный маркер. Проблема: после добавления дополнительного маркера программа просто перенаправляет все на новую точку, оставляя исходную точку. Что я могу сделать, чтобы исправить эту проблему, вот основной код для метода автозаполнения, расчета маршрута и вычисления всплывающих строк:

    mSearchText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            
            Intent intent = new 
            Autocomplete.IntentBuilder(AutocompleteActivityMode.OVERLAY,     
            fields)
                    .build(MapsActivity.this);
            startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
            hideSoftKeyboard();
            return false;
        }
    });
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable     
Intent data) {
    if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Place place = Autocomplete.getPlaceFromIntent(data);
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            String searchString = place.getName();
            Geocoder geocoder = new Geocoder(MapsActivity.this,     
            Locale.getDefault());
            List<Address> list;

            try {
                list = geocoder.getFromLocationName(searchString, 1);
                if (list.size()> 0){

                    Address address = list.get(0);
                    LatLng latLng = new         
                    LatLng(address.getLatitude(),address.getLongitude());
                    
                    
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,15));
                    MarkerOptions marker = new         
            MarkerOptions().position(latLng);
                    calculateDirections(marker);
                    //add on map click listener and add an additional marker
                    mMap.setOnMapClickListener(new     
                    GoogleMap.OnMapClickListener() {
                        public void onMapClick(LatLng latLng) {
                            List<LatLng> list = new ArrayList<>();
                            list.add(latLng);
                            // Add some markers to the map, and add a data                 
                            object to each marker
                           MarkerOptions marker2 = new         
                           MarkerOptions().position(latLng);
                           calculateDirections(marker2);

                        }
                    });

                }
            } catch (IOException e) {
                Log.e(TAG, "geoLocate: IOException: " + e.getMessage());
                e.printStackTrace();
            }
        } else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
            Status status = Autocomplete.getStatusFromIntent(data);
            Log.i(TAG, status.getStatusMessage());
        } else if (resultCode == RESULT_CANCELED) {
            // The user canceled the operation.
        }
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}
private void calculateDirections(MarkerOptions marker){
    Log.d(TAG, "calculateDirections: calculating directions.");
    ArrayList<MarkerOptions> markers = new ArrayList<>(2);
    markers.add(marker);
    for (int i = 0; i < markers.size(); i++) {
        dest1 = markers.get(0);
        com.google.maps.model.LatLng destination = new 
        com.google.maps.model.LatLng(
                dest1.getPosition().latitude,
                dest1.getPosition().longitude
        );
        if (markers.size() > 1){
            dest2 = markers.get(1);
            DirectionsApiRequest directions = new 
            DirectionsApiRequest(mGeoApiContext);
            directions.alternatives(true);
            directions.origin(
                    new com.google.maps.model.LatLng(
                            userPosition.getPosition().latitude,
                            userPosition.getPosition().longitude
                    )
            );
            directions.optimizeWaypoints(true);
            directions.waypoints(
                    new com.google.maps.model.LatLng(
                            dest2.getPosition().latitude,
                            dest2.getPosition().longitude
                    )
            );
            Log.d(TAG, "calculateDirections: destination: " + 
            destination.toString());
            directions.destination(destination).setCallback(new 
            PendingResult.Callback<DirectionsResult>() {
                @Override
                public void onResult(DirectionsResult result) {
                    Log.d(TAG, "calculateDirections: routes: " + 
                    result.routes[0].toString());
                    Log.d(TAG, "calculateDirections: duration: " + 
                    result.routes[0].legs[0].duration);
                    Log.d(TAG, "calculateDirections: distance: " + 
                    result.routes[0].legs[0].distance);
                    Log.d(TAG, "calculateDirections: geocodedWayPoints: " 
                    + result.geocodedWaypoints[0].toString());
                    addPolylinesToMap(result);

                }

                @Override
                public void onFailure(Throwable e) {
                    Log.e(TAG, "calculateDirections: Failed to get 
                directions: " + e.getMessage());
                }
            });
        }
        else {
            DirectionsApiRequest directions = new 
            DirectionsApiRequest(mGeoApiContext);
            directions.alternatives(true);
            directions.origin(
                    new com.google.maps.model.LatLng(
                            userPosition.getPosition().latitude,
                            userPosition.getPosition().longitude
                    )
            );
            Log.d(TAG, "calculateDirections: destination: " + 
            destination.toString());
            directions.destination(destination).setCallback(new 
            PendingResult.Callback<DirectionsResult>() {
                @Override
                public void onResult(DirectionsResult result) {
                    Log.d(TAG, "calculateDirections: routes: " + 
                result.routes[0].toString());
                    Log.d(TAG, "calculateDirections: duration: " + 
                result.routes[0].legs[0].duration);
                    Log.d(TAG, "calculateDirections: distance: " + 
                result.routes[0].legs[0].distance);
                    Log.d(TAG, "calculateDirections: geocodedWayPoints: " 
                + result.geocodedWaypoints[0].toString());
                    addPolylinesToMap(result);

                }

                @Override
                public void onFailure(Throwable e) {
                    Log.e(TAG, "calculateDirections: Failed to get 
                directions: " + e.getMessage());
                }
            });
        }
    }
}

private void addPolylinesToMap(final DirectionsResult result){
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            Log.d(TAG, "run: result routes: " + result.routes.length);

            //check if there are any polylines selected and remove the old 
            one before the new
            //one is selected
            if(mPolylinesData.size() > 0){
                for (PolylineData polylineData: mPolylinesData){
                    polylineData.getPolyline().remove();
                }
                mPolylinesData.clear();
                mPolylinesData = new ArrayList<>();
            }
            double duration = 999999;
            for(DirectionsRoute route: result.routes){
                Log.d(TAG, "run: leg: " + route.legs[0].toString());
                // Get all the lines on checklist by calling decoder path
                List<com.google.maps.model.LatLng> decodedPath = 
            PolylineEncoding.decode(route.overviewPolyline.getEncodedPath());
                // Adding new array list by adding all the lines
                List<LatLng> newDecodedPath = new ArrayList<>();

                // This loops through all the LatLng coordinates of ONE 
                polyline.
                for(com.google.maps.model.LatLng latLng: decodedPath){
                    newDecodedPath.add(new LatLng(
                            latLng.lat,
                            latLng.lng
                    ));
                }
                Polyline polyline = mMap.addPolyline(new 
                PolylineOptions().addAll(newDecodedPath));
                
            polyline.setColor(ContextCompat.getColor(getApplicationContext(), 
            R.color.darkGrey));
                polyline.setClickable(true);
                mPolylinesData.add(new PolylineData(polyline, 
                route.legs[0]));

                // Measure time in seconds of all trip durations and 
                select the shortest duration
                double tempDuration = route.legs[0].duration.inSeconds;
                if(tempDuration < duration){
                    duration = tempDuration;
                    onPolylineClick(polyline);
                }

            }
        }
    });
}

0 ответов

Другие вопросы по тегам