Behind Bagnaia, Mattia Pasini moved into second and the duo both spent the first half of the race on their own, with Miguel Oliveira making an impressive comeback from ninth on the grid and running third as early as lap two.
Pasini maintained the gap at around a second for 10 laps before he started losing further ground, with Oliveira and Schrotter catching up to the Italtrans rider.
Both riders soon passed Pasini, but Bagnaia was out of reach as he led by nearly four seconds.
Bagnaia eventually took his sixth win of the season by 3.1s, extending his points lead to eight, while Oliveira held off a late charge from Schrotter.
Schrotter tried to steal second on the last lap with a desperate lunge at Turn 14, but Oliveira held on.
Pasini also came under pressure from Joan Mir, the duo trading places a couple of times, but the Italian kept fourth.
Lorenzo Baldassarri came from outside the top 10 to finish sixth, followed by Fabio Quartararo and Brad Binder.
Jorge Navarro had a strong first half of the race, climbing as high as fifth, but was soon ordered to drop a place due to track limits and he lost further positions to settle for ninth, ahead of Xavi Vierge.
Romano Fenati was black-flagged for irresponsible behaviour as he reached over to the brake lever of Stefano Manzi’s bike in retaliation for a previous overtaking attempt from Manzi, which resulted in both riders running wide. Manzi later retired with a crash.
Jesko Raffin, who was denied a full-time Moto2 ride in 2018 due to a “lack of consistent good results”, impressed in his return to the series by taking 15th despite having to start from the pitlane due to a mechanical issue.
Alex Marquez was tapped by Augusto Fernandez on the opening lap and fell, eventually only taking 18th.
British duo Danny Kent and Sam Lowes, as well as Tetsuta Nagashima also crashed, while Bagnaia’s VR46 teammate Luca Marini retired with smoke coming out of the rear of his bike.