private void handleLongTapOnRoutesOrTracks(final Route item, final boolean forceShowElevationChart) {
        // elevation charts for individual route and/or routes/tracks
        if (elevationChartUtils == null) {
            elevationChartUtils = new ElevationChart(this, nonClickableItemsLayer);
        }
        if (forceShowElevationChart && lastElevationChartRoute != null) {
            elevationChartUtils.removeElevationChart();
            lastElevationChartRoute = null;
        }
        if (lastElevationChartRoute != null && StringUtils.equals(item.getName(), lastElevationChartRoute)) {
            elevationChartUtils.removeElevationChart();
        } else {
            elevationChartUtils.showElevationChart(item, routeTrackUtils);
            lastElevationChartRoute = item.getName();
            if (RouteTrackUtils.isIndividualRoute(item)) {
                viewModel.individualRoute.observe(this, individualRoute -> {
                    if (lastElevationChartRoute != null && lastElevationChartRoute.isEmpty()) { // still individual route being shown?
                        elevationChartUtils.showElevationChart(individualRoute, routeTrackUtils);
                    }
                });
            } else {
                viewModel.trackUpdater.observe(this, event -> {
                    if (viewModel.getTracks().getRoute(event.peek()) instanceof Route) {
                        final Route route = (Route) viewModel.getTracks().getRoute(event.peek());
                        if (route != null && StringUtils.equals(lastElevationChartRoute, route.getName())) {
                            elevationChartUtils.showElevationChart(route, routeTrackUtils);
                        }
                    }
                });
            }
        }
    }
to be called by map fragments' observers for zoom level change
main/src/main/java/cgeo/geocaching/unifiedmap/UnifiedMapActivity.java