Skip to content

Commit

Permalink
fix rotation on point label collision box
Browse files Browse the repository at this point in the history
  • Loading branch information
bcamper committed Mar 7, 2019
1 parent e2f0ab9 commit 1a16473
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 17 deletions.
2 changes: 2 additions & 0 deletions src/labels/label.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export default class Label {
this.size = size;
this.layout = layout;
this.position = null;
this.angle = 0;
this.anchor = Array.isArray(this.layout.anchor) ? this.layout.anchor[0] : this.layout.anchor; // initial anchor
this.placed = null;
this.offset = layout.offset;
Expand All @@ -29,6 +30,7 @@ export default class Label {
type: this.type,
obb: this.obb.toJSON(),
position: this.position,
angle: this.angle,
size: this.size,
offset: this.offset,
breach: this.breach,
Expand Down
3 changes: 2 additions & 1 deletion src/labels/label_point.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export default class LabelPoint extends Label {
super(size, layout);
this.type = 'point';
this.position = [position[0], position[1]];
this.angle = layout.angle || 0;
this.parent = this.layout.parent;
this.update();

Expand Down Expand Up @@ -59,7 +60,7 @@ export default class LabelPoint extends Label {
this.obb = new OBB(
this.position[0] + (this.offset[0] * this.unit_scale),
this.position[1] - (this.offset[1] * this.unit_scale),
0,
-this.angle, // angle is negative because tile system y axis is pointing down
width,
height
);
Expand Down
23 changes: 12 additions & 11 deletions src/labels/point_placement.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ const PLACEMENT = LabelPoint.PLACEMENT;
const default_spacing = 80; // spacing of points along line in pixels

export default function placePointsOnLine (line, size, options) {
let labels = [];
let strategy = options.placement;
let min_length = Math.max(size[0], size[1]) * options.placement_min_length_ratio * options.units_per_pixel;
const labels = [];
const layout = Object.create(options);
const strategy = options.placement;
const min_length = Math.max(size[0], size[1]) * options.placement_min_length_ratio * options.units_per_pixel;

if (strategy === PLACEMENT.SPACED) {
let result = getPositionsAndAngles(line, min_length, options);
Expand All @@ -24,8 +25,8 @@ export default function placePointsOnLine (line, size, options) {
let position = positions[i];
let angle = angles[i];
if (options.tile_edges === true || !isCoordOutsideTile(position)) {
let label = new LabelPoint(position, size, options);
label.angle = angle;
layout.angle = angle;
let label = new LabelPoint(position, size, layout);
labels.push(label);
}
}
Expand All @@ -36,15 +37,15 @@ export default function placePointsOnLine (line, size, options) {
p = line[i];
q = line[i + 1];
if (options.tile_edges === true || !isCoordOutsideTile(p)) {
label = new LabelPoint(p, size, options);
label.angle = getAngle(p, q, options.angle);
layout.angle = getAngle(p, q, options.angle);
label = new LabelPoint(p, size, layout);
labels.push(label);
}
}

// add last endpoint
label = new LabelPoint(q, size, options);
label.angle = getAngle(p, q, options.angle);
layout.angle = getAngle(p, q, options.angle);
label = new LabelPoint(q, size, layout);
labels.push(label);
}
else if (strategy === PLACEMENT.MIDPOINT) {
Expand All @@ -57,8 +58,8 @@ export default function placePointsOnLine (line, size, options) {
];
if (options.tile_edges === true || !isCoordOutsideTile(position)) {
if (!min_length || norm(p, q) > min_length) {
let label = new LabelPoint(position, size, options);
label.angle = getAngle(p, q, options.angle);
layout.angle = getAngle(p, q, options.angle);
let label = new LabelPoint(position, size, layout);
labels.push(label);
}
}
Expand Down
8 changes: 3 additions & 5 deletions src/styles/points/points.js
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,6 @@ Object.assign(Points, {
buildStraightLabel (label, style, context) {
let mesh = this.getTileMesh(context.tile, this.meshVariantTypeForDraw(style));
let vertex_template = this.makeVertexTemplate(style, mesh);
let angle = label.angle || style.angle;

let size, texcoords;
if (label.type !== 'point') {
Expand Down Expand Up @@ -739,7 +738,7 @@ Object.assign(Points, {
let geom_count = this.buildQuad(
label.position, // position
size, // size in pixels
angle, // angle in radians
label.angle, // angle in radians
null, // placeholder for multiple angles
null, // placeholder for multiple pre_angles
offset, // offset from center in pixels
Expand All @@ -758,7 +757,6 @@ Object.assign(Points, {

buildCurvedLabel (label, style, context) {
let mesh, vertex_template;
let angle = label.angle;
let geom_count = 0;

// two passes for stroke and fill, where stroke needs to be drawn first (painter's algorithm)
Expand Down Expand Up @@ -790,7 +788,7 @@ Object.assign(Points, {
let seg_count = this.buildQuad(
position, // position
size, // size in pixels
angle, // angle in degrees
label.angle, // angle in degrees
angles, // angles per segment
pre_angles, // pre_angle array (rotation applied before offseting)
offset, // offset from center in pixels
Expand Down Expand Up @@ -832,7 +830,7 @@ Object.assign(Points, {
let seg_count = this.buildQuad(
position, // position
size, // size in pixels
angle, // angle in degrees
label.angle, // angle in degrees
angles, // angles per segment
pre_angles, // pre_angle array (rotation applied before offseting)
offset, // offset from center in pixels
Expand Down

0 comments on commit 1a16473

Please sign in to comment.