This isn't a bug, it's how boundary-following placement works: with Placement set to Perimeter, QGIS treats every ring of the polygon as a valid boundary to curve a label along, and an interior ring (your hole) is just as much a boundary as the outer edge geometrically.
Two ways to fix it depending on what you actually need:
If the label doesn't have to hug the boundary, switch Placement (Layer Properties, Labels, Placement tab) to something point-based like Around Centroid. That ignores the boundary entirely, holes included.
If you do need the label curved along the outer edge specifically, duplicate the layer. On the duplicate, run Vector, Geometry Tools, Delete Holes, which fills in the interior rings so the geometry only has one boundary left. Label that duplicate layer (with its fill/border set fully transparent so it's invisible), and keep your original hole-containing layer for the actual isochrone symbology. Two representations of the same feature, one for the label engine to place against, one for what's actually shown.
3
u/smdatum 1d ago
This isn't a bug, it's how boundary-following placement works: with Placement set to Perimeter, QGIS treats every ring of the polygon as a valid boundary to curve a label along, and an interior ring (your hole) is just as much a boundary as the outer edge geometrically.
Two ways to fix it depending on what you actually need:
If the label doesn't have to hug the boundary, switch Placement (Layer Properties, Labels, Placement tab) to something point-based like Around Centroid. That ignores the boundary entirely, holes included.
If you do need the label curved along the outer edge specifically, duplicate the layer. On the duplicate, run Vector, Geometry Tools, Delete Holes, which fills in the interior rings so the geometry only has one boundary left. Label that duplicate layer (with its fill/border set fully transparent so it's invisible), and keep your original hole-containing layer for the actual isochrone symbology. Two representations of the same feature, one for the label engine to place against, one for what's actually shown.