UNPKG

2.42 kBPlain TextView Raw
1import Point from '@mapbox/point-geometry';
2
3import type {PossiblyEvaluatedPropertyValue} from './properties';
4import type StyleLayer from '../style/style_layer';
5import type CircleBucket from '../data/bucket/circle_bucket';
6import type LineBucket from '../data/bucket/line_bucket';
7
8export function getMaximumPaintValue(
9 property: string,
10 layer: StyleLayer,
11 bucket: CircleBucket<any> | LineBucket
12): number {
13 const value = ((layer.paint as any).get(property) as PossiblyEvaluatedPropertyValue<any>).value;
14 if (value.kind === 'constant') {
15 return value.value;
16 } else {
17 return bucket.programConfigurations.get(layer.id).getMaxValue(property);
18 }
19}
20
21export function translateDistance(translate: [number, number]) {
22 return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);
23}
24
25export function translate(queryGeometry: Array<Point>,
26 translate: [number, number],
27 translateAnchor: 'viewport' | 'map',
28 bearing: number,
29 pixelsToTileUnits: number) {
30 if (!translate[0] && !translate[1]) {
31 return queryGeometry;
32 }
33 const pt = Point.convert(translate)._mult(pixelsToTileUnits);
34
35 if (translateAnchor === 'viewport') {
36 pt._rotate(-bearing);
37 }
38
39 const translated = [];
40 for (let i = 0; i < queryGeometry.length; i++) {
41 const point = queryGeometry[i];
42 translated.push(point.sub(pt));
43 }
44 return translated;
45}
46
47export function offsetLine(rings: Array<Array<Point>>, offset: number) {
48 const newRings: Array<Array<Point>> = [];
49 for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
50 const ring = rings[ringIndex];
51 const newRing: Array<Point> = [];
52 for (let index = 0; index < ring.length; index++) {
53 const a = ring[index - 1];
54 const b = ring[index];
55 const c = ring[index + 1];
56 const aToB = index === 0 ? new Point(0, 0) : b.sub(a)._unit()._perp();
57 const bToC = index === ring.length - 1 ? new Point(0, 0) : c.sub(b)._unit()._perp();
58 const extrude = aToB._add(bToC)._unit();
59
60 const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;
61 if (cosHalfAngle !== 0) {
62 extrude._mult(1 / cosHalfAngle);
63 }
64
65 newRing.push(extrude._mult(offset)._add(b));
66 }
67 newRings.push(newRing);
68 }
69 return newRings;
70}