[core][tile mode] Fix assertion at line-center placement handling

The `symbolIntersectsTileEdges` algorithm should not be applied to the symbols with `line-center` placement
This commit is contained in:
Mikhail Pozdnyakov
2020-03-10 12:12:33 +02:00
parent deb1161366
commit cc5e86b186

View File

@@ -174,11 +174,12 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::set<ui
optional<CollisionBoundaries> tileBorders;
optional<CollisionBoundaries> avoidEdges;
if (mapMode == MapMode::Tile) tileBorders = collisionIndex.projectTileBoundaries(posMatrix);
if (tileBorders && (layout.get<style::SymbolAvoidEdges>() ||
layout.get<style::SymbolPlacement>() == style::SymbolPlacementType::Line)) {
avoidEdges = tileBorders;
if (mapMode == MapMode::Tile) {
tileBorders = collisionIndex.projectTileBoundaries(posMatrix);
if (layout.get<style::SymbolAvoidEdges>() ||
layout.get<style::SymbolPlacement>() == style::SymbolPlacementType::Line) {
avoidEdges = tileBorders;
}
}
const bool textAllowOverlap = layout.get<style::TextAllowOverlap>();
@@ -559,7 +560,8 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::set<ui
for (auto it = sortedSymbols.rbegin(); it != sortedSymbols.rend(); ++it) {
placeSymbol(*it);
}
} else if (mapMode == MapMode::Tile && !avoidEdges) {
} else if (mapMode == MapMode::Tile && !avoidEdges &&
layout.get<style::SymbolPlacement>() == style::SymbolPlacementType::Point) {
// In this case we first try to place symbols, which intersects the tile borders, so that
// those symbols will remain even if each tile is handled independently.
SymbolInstanceReferences symbolInstances = bucket.getSymbols(params.sortKeyRange);