1 | import Point from '@mapbox/point-geometry';
|
2 |
|
3 | import type {PossiblyEvaluatedPropertyValue} from './properties';
|
4 | import type StyleLayer from '../style/style_layer';
|
5 | import type CircleBucket from '../data/bucket/circle_bucket';
|
6 | import type LineBucket from '../data/bucket/line_bucket';
|
7 |
|
8 | export 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 |
|
21 | export function translateDistance(translate: [number, number]) {
|
22 | return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);
|
23 | }
|
24 |
|
25 | export 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 |
|
47 | export 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 | }
|