osmgl 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1552 -1509
- package/dist/osmgl.cjs +145 -74
- package/dist/osmgl.cjs.map +1 -1
- package/dist/osmgl.d.cts +189 -10
- package/dist/osmgl.d.ts +189 -10
- package/dist/osmgl.global.js +146 -75
- package/dist/osmgl.js +145 -74
- package/dist/osmgl.js.map +1 -1
- package/package.json +1 -1
package/dist/osmgl.d.cts
CHANGED
|
@@ -1069,6 +1069,17 @@ interface FillExtrusionLayerSpec extends LayerBase {
|
|
|
1069
1069
|
* контрастом на фасаде, и дом читается сеткой линий, а не объёмом.
|
|
1070
1070
|
*/
|
|
1071
1071
|
seamStrength?: Interpolated<number>;
|
|
1072
|
+
/**
|
|
1073
|
+
* ЛЁД, 0..1. Ноль — обычный матовый дом.
|
|
1074
|
+
*
|
|
1075
|
+
* Настоящий лёд выдают две вещи, и обе видно на 3D-домах Baidu: кромка светится тем сильнее,
|
|
1076
|
+
* чем острее угол взгляда к грани (у стекла и льда так отражается небо), и низ стены светлее
|
|
1077
|
+
* верха — свет уходит в толщу и рассеивается. Ни то, ни другое не задать цветом: это зависит
|
|
1078
|
+
* от камеры и от высоты точки, то есть считается в шейдере.
|
|
1079
|
+
*
|
|
1080
|
+
* Цвет при этом остаётся за темой: ручка только добавляет блик и градиент поверх него.
|
|
1081
|
+
*/
|
|
1082
|
+
ice?: Interpolated<number>;
|
|
1072
1083
|
/**
|
|
1073
1084
|
* Доля светящихся окон, 0..1 — для ночных тем. Какие именно окна горят,
|
|
1074
1085
|
* решает хеш ячейки, поэтому при движении камеры свет не «бегает».
|
|
@@ -1141,10 +1152,15 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1141
1152
|
iconTextGap?: number;
|
|
1142
1153
|
/**
|
|
1143
1154
|
* Где стоит иконка относительно подписи: `top` — над ней по центру (так у
|
|
1144
|
-
* Mapbox Standard и у Яндекса: значок ровно над точкой объекта), `left`
|
|
1145
|
-
* сбоку, плотнее по
|
|
1155
|
+
* Mapbox Standard и у Яндекса: значок ровно над точкой объекта), `left` и
|
|
1156
|
+
* `right` — сбоку, плотнее по вертикали, `behind` — плашка под подписью.
|
|
1157
|
+
*
|
|
1158
|
+
* `auto` — ПЕРЕБОР сторон: подпись справа от значка, занято — слева, занято — под ним. Так
|
|
1159
|
+
* подписей на плотной карте помещается заметно больше: подпись, которой не нашлось места с
|
|
1160
|
+
* одной стороны, находит его с другой вместо того, чтобы пропасть. Работает только с
|
|
1161
|
+
* `iconFrame: 'pin'` — значок при этом остаётся остриём на объекте.
|
|
1146
1162
|
*/
|
|
1147
|
-
iconPlacement?: 'top' | 'left' | 'behind';
|
|
1163
|
+
iconPlacement?: 'top' | 'left' | 'right' | 'behind' | 'auto';
|
|
1148
1164
|
/**
|
|
1149
1165
|
* Как ставится подпись: `point` — горизонтально у точки привязки (по
|
|
1150
1166
|
* умолчанию), `line` — вдоль линии объекта, изгибаясь по ней.
|
|
@@ -1186,8 +1202,13 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1186
1202
|
* Это ОТДЕЛЬНЫЙ значок под иконкой, а не обводка: обводка у нас общая с
|
|
1187
1203
|
* текстом (одна программа), и «жирный контур» вокруг пиктограммы выглядит
|
|
1188
1204
|
* грязно, а кружок — фигура со своей заливкой и своей рамкой.
|
|
1205
|
+
*
|
|
1206
|
+
* `pin` — та же подложка, но с остриём вниз. Отличие не в рисунке, а в ТОЧКЕ ПРИВЯЗКИ: у
|
|
1207
|
+
* кружка на объекте стоит его середина, у булавки — остриё. Поэтому с булавкой подпись можно
|
|
1208
|
+
* увести вбок (`iconPlacement: 'left'`), не теряя, к чему она относится: показывает не значок
|
|
1209
|
+
* целиком, а его кончик. Так устроены POI у Baidu Maps.
|
|
1189
1210
|
*/
|
|
1190
|
-
iconFrame?: 'circle' | 'none';
|
|
1211
|
+
iconFrame?: 'circle' | 'pin' | 'none';
|
|
1191
1212
|
/** Диаметр подложки относительно значка. */
|
|
1192
1213
|
iconFrameScale?: number;
|
|
1193
1214
|
/**
|
|
@@ -1253,8 +1274,16 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1253
1274
|
arrowGap?: Interpolated<number>;
|
|
1254
1275
|
};
|
|
1255
1276
|
paint: {
|
|
1256
|
-
|
|
1257
|
-
|
|
1277
|
+
/**
|
|
1278
|
+
* Цвет подписи; `{ from }` — «как у такого-то слоя» (см. `ColorFrom`).
|
|
1279
|
+
*
|
|
1280
|
+
* Ссылка тут нужна ровно затем же, зачем обводке моста: тем два десятка, и слой, отколотый от
|
|
1281
|
+
* существующего (мелкие населённые пункты от крупных), в каждой из них пришлось бы красить
|
|
1282
|
+
* заново. Своего хекса у такого слоя нет — у него есть «как у родителя», и ссылка это и говорит.
|
|
1283
|
+
* Берётся ОДНОИМЁННОЕ свойство: `haloColor: { from: 'place-label' }` — это обводка того слоя.
|
|
1284
|
+
*/
|
|
1285
|
+
color: Interpolated<string> | ColorFrom;
|
|
1286
|
+
haloColor?: Interpolated<string> | ColorFrom;
|
|
1258
1287
|
/** Толщина обводки в CSS-пикселях. Обводка обязательна поверх пёстрой карты. */
|
|
1259
1288
|
haloWidth?: Interpolated<number>;
|
|
1260
1289
|
/**
|
|
@@ -2358,6 +2387,17 @@ interface Candidate {
|
|
|
2358
2387
|
/** Точка объекта в нормализованном меркаторе — по ней подпись и опознаётся. */
|
|
2359
2388
|
mercX: number;
|
|
2360
2389
|
mercY: number;
|
|
2390
|
+
/**
|
|
2391
|
+
* Ключ подписи, устойчивый между кадрами (см. `keyOf`).
|
|
2392
|
+
*
|
|
2393
|
+
* Считается ОДИН раз при сборе, а не там, где понадобился. Понадобился он трижды — при
|
|
2394
|
+
* сортировке, при раскладке и при запоминании стороны, — а строится из двух `toFixed(9)`.
|
|
2395
|
+
* В сортировке это било особенно больно: компаратор зовётся порядка `n log n` раз, и на полутора
|
|
2396
|
+
* тысячах кандидатов построение ключей занимало 3.8 мс из 9.8 мс кадра.
|
|
2397
|
+
*/
|
|
2398
|
+
key: string;
|
|
2399
|
+
/** Прозрачность от расстояния до камеры: подпись растворяется в дымке вместе с землёй под ней. */
|
|
2400
|
+
depth: number;
|
|
2361
2401
|
/**
|
|
2362
2402
|
* Линия объекта в ЭКРАННЫХ координатах — для подписи вдоль дороги.
|
|
2363
2403
|
*
|
|
@@ -2446,12 +2486,21 @@ declare class SymbolRenderer {
|
|
|
2446
2486
|
/**
|
|
2447
2487
|
* Ключ подписи, устойчивый между кадрами.
|
|
2448
2488
|
*
|
|
2449
|
-
* Экранные координаты не годятся — они меняются от любого движения камеры;
|
|
2450
|
-
*
|
|
2451
|
-
*
|
|
2489
|
+
* Экранные координаты не годятся — они меняются от любого движения камеры; мировые пиксели тоже,
|
|
2490
|
+
* они зависят от зума. Берём слой, текст и меркатор.
|
|
2491
|
+
*
|
|
2492
|
+
* ТОЧНОСТЬ КООРДИНАТЫ ГРУБАЯ НАМЕРЕННО — 1e-6 это метров сорок. Один и тот же объект приезжает в
|
|
2493
|
+
* НЕСКОЛЬКИХ тайлах сразу (у тайлов буфер), и при движении карты рядом живут тайлы соседних
|
|
2494
|
+
* зумов. Координата в тайле целая, а цена деления у z13 и z14 разная — тот же POI получается на
|
|
2495
|
+
* метр в стороне. С точностью до сантиметра это был РАЗНЫЙ ключ: подпись теряла и липкость, и
|
|
2496
|
+
* свой возраст, и проявлялась заново — то самое мигание на ровном месте.
|
|
2497
|
+
*
|
|
2498
|
+
* Разные объекты грубая сетка не путает, потому что в ключе есть текст: совпасть должны и слой, и
|
|
2499
|
+
* название, и место с точностью до сорока метров.
|
|
2452
2500
|
*/
|
|
2453
2501
|
static keyOf(s: {
|
|
2454
2502
|
layerId: string;
|
|
2503
|
+
text: string;
|
|
2455
2504
|
mercX: number;
|
|
2456
2505
|
mercY: number;
|
|
2457
2506
|
}): string;
|
|
@@ -2476,6 +2525,67 @@ declare class SymbolRenderer {
|
|
|
2476
2525
|
private stickyKeys;
|
|
2477
2526
|
/** Время текущего кадра: одно на весь проход, иначе соседние буквы строки проявятся вразнобой. */
|
|
2478
2527
|
private now;
|
|
2528
|
+
/**
|
|
2529
|
+
* ГДЕ УЖЕ СТОИТ ЭТО ЖЕ НАЗВАНИЕ — по одной записи на текст, на кадр.
|
|
2530
|
+
*
|
|
2531
|
+
* Шаг повторения (`symbolSpacing`) работает внутри ОДНОГО объекта: раскладка отступает от своей
|
|
2532
|
+
* прошлой подписи и ищет следующее место. Но улица приезжает из тайлов десятком отдельных
|
|
2533
|
+
* объектов, и каждый считает себя первым — на экране получается три «просп. Рудаки» подряд,
|
|
2534
|
+
* сколько шаг ни увеличивай. У Baidu улица подписана один раз на экран, и добивается этого тот же
|
|
2535
|
+
* шаг, только считанный по НАЗВАНИЮ, а не по объекту.
|
|
2536
|
+
*
|
|
2537
|
+
* Держим плоским списком координат: подписей вдоль линий в кадре десятки, и своя пара чисел на
|
|
2538
|
+
* каждую дешевле объекта.
|
|
2539
|
+
*/
|
|
2540
|
+
private lineAnchors;
|
|
2541
|
+
/** Сторона, на которой подпись стояла в прошлом кадре: её и пробуем первой (см. `preferSide`). */
|
|
2542
|
+
private lastSide;
|
|
2543
|
+
/** То же для подписи вдоль дороги: где она стояла на самой линии (см. `keepAt`). */
|
|
2544
|
+
private lineAt;
|
|
2545
|
+
private lineAtNow;
|
|
2546
|
+
/** Сколько чисел на одно запомненное место: меркатор x и y. */
|
|
2547
|
+
private static readonly LINE_MARK;
|
|
2548
|
+
/** Стороны ЭТОГО кадра — заменяют прошлые, когда раскладка закончена. */
|
|
2549
|
+
private sideNow;
|
|
2550
|
+
/** Дымка этого кадра и камера — по ним считается затухание подписи вдаль. */
|
|
2551
|
+
private fog;
|
|
2552
|
+
private tr;
|
|
2553
|
+
/**
|
|
2554
|
+
* ГДЕ ПОДПИСЬ СТОЯЛА — переведённое в расстояние вдоль СЕГОДНЯШНЕЙ линии.
|
|
2555
|
+
*
|
|
2556
|
+
* Место запоминается точкой на земле, а не расстоянием от начала линии. Расстояние не годится:
|
|
2557
|
+
* при наклоне камера срезает у ломаной начало (точку за собой спроецировать нельзя), и с каждым
|
|
2558
|
+
* сдвигом карты отсчёт ведётся от другой вершины — сетка мест уезжает вдоль улицы, а с ней и
|
|
2559
|
+
* название. Точка на асфальте не зависит ни от камеры, ни от обрезки: её достаточно спроецировать
|
|
2560
|
+
* заново и померить, на каком она расстоянии сейчас.
|
|
2561
|
+
*/
|
|
2562
|
+
private rememberedAt;
|
|
2563
|
+
/**
|
|
2564
|
+
* Запомнить места этого кадра точками на земле.
|
|
2565
|
+
*
|
|
2566
|
+
* ДОПИСЫВАЕМ, А НЕ ЗАМЕНЯЕМ. Улица приезжает несколькими кусками — по куску на тайл, — и каждый
|
|
2567
|
+
* ставит свою подпись. Ключ у них общий, поэтому запись последнего затирала бы места всех
|
|
2568
|
+
* предыдущих: на следующем кадре они оказывались без памяти и выбирали место заново. Это и было
|
|
2569
|
+
* остаточное «ползание» на части улиц.
|
|
2570
|
+
*/
|
|
2571
|
+
private rememberAt;
|
|
2572
|
+
/**
|
|
2573
|
+
* Попадает ли бокс в область раскладки — кадр, расширенный на `LAYOUT_MARGIN`.
|
|
2574
|
+
*
|
|
2575
|
+
* Проверка на ПЕРЕСЕЧЕНИЕ, а не на вложенность: подпись, наполовину уехавшая за край, остаётся
|
|
2576
|
+
* на своём месте и держит место в сетке коллизий — иначе её исчезновение переставляло бы соседей
|
|
2577
|
+
* в середине кадра.
|
|
2578
|
+
*/
|
|
2579
|
+
private withinLayout;
|
|
2580
|
+
/**
|
|
2581
|
+
* Затухание подписи, стоящей В ТОЧКЕ ЭКРАНА.
|
|
2582
|
+
*
|
|
2583
|
+
* Для подписи вдоль дороги другого способа нет: якорь у неё один на всю улицу, а буквы
|
|
2584
|
+
* раскладываются по видимому куску, и от начала к концу строки расстояние до камеры меняется в
|
|
2585
|
+
* разы. Считается по месту раскладки, то есть несколько раз на улицу, — обратная проекция стоит
|
|
2586
|
+
* одного умножения на матрицу.
|
|
2587
|
+
*/
|
|
2588
|
+
private depthFadeAt;
|
|
2479
2589
|
/**
|
|
2480
2590
|
* Когда подпись впервые встала — по этому времени считается её прозрачность.
|
|
2481
2591
|
*
|
|
@@ -2520,6 +2630,19 @@ declare class SymbolRenderer {
|
|
|
2520
2630
|
*/
|
|
2521
2631
|
/** Позиция слоя в стиле — по ней сортируется отрисовка. */
|
|
2522
2632
|
private styleOrder;
|
|
2633
|
+
/** Слои этого кадра — по ним разрешается ссылка «цвет как у такого-то слоя». */
|
|
2634
|
+
private layersById;
|
|
2635
|
+
/**
|
|
2636
|
+
* Цвет с учётом ССЫЛКИ НА ЧУЖОЙ СЛОЙ (`{ from }`, см. `ColorFrom`).
|
|
2637
|
+
*
|
|
2638
|
+
* Тема красит слои по именам, и слой, отколотый от существующего, в каждой из двух десятков тем
|
|
2639
|
+
* пришлось бы красить заново — а он по смыслу и не имеет своего цвета, он «как родитель».
|
|
2640
|
+
* Ссылка разрешается по СОБСТВЕННОМУ стилю кадра, то есть уже с наложенной темой, и ровно на один
|
|
2641
|
+
* уровень: цепочки нам не нужны, а кольцо из них молча съело бы кадр.
|
|
2642
|
+
*
|
|
2643
|
+
* Берётся одноимённое свойство: `haloColor: { from: 'place-label' }` — обводка того слоя.
|
|
2644
|
+
*/
|
|
2645
|
+
private colorOf;
|
|
2523
2646
|
private inStyleOrder;
|
|
2524
2647
|
private draw;
|
|
2525
2648
|
private ensureBuffers;
|
|
@@ -4202,6 +4325,13 @@ declare class LayerRenderer {
|
|
|
4202
4325
|
private drawSeamHighlight;
|
|
4203
4326
|
/** Нарисовать сшитые дома. Каждый лежит в координатах своего тайла-хозяина. */
|
|
4204
4327
|
private drawSeams;
|
|
4328
|
+
/**
|
|
4329
|
+
* Буферы сшитого дома на видеокарте. Заводятся по требованию и переживают кадр.
|
|
4330
|
+
*
|
|
4331
|
+
* Отдельным методом, потому что проходов два и первым идёт КАРТА ТЕНЕЙ: заводись буфер внутри
|
|
4332
|
+
* цветного прохода, тень в первом же кадре рисовалась бы по пустому месту.
|
|
4333
|
+
*/
|
|
4334
|
+
private seamBucket;
|
|
4205
4335
|
/**
|
|
4206
4336
|
* Освободить буферы ТОЛЬКО тех хозяев, чья геометрия пересобрана.
|
|
4207
4337
|
*
|
|
@@ -4227,6 +4357,23 @@ declare class LayerRenderer {
|
|
|
4227
4357
|
* при этом пересобираются, — но и стоит он немного: первый же тайл с этим слоем даёт ответ.
|
|
4228
4358
|
*/
|
|
4229
4359
|
private flattened;
|
|
4360
|
+
/**
|
|
4361
|
+
* СКОЛЬКО ГЕОМЕТРИИ КАДР ОТПРАВЛЯЕТ В ВИДЕОПАМЯТЬ ЗА РАЗ.
|
|
4362
|
+
*
|
|
4363
|
+
* Тайл приезжает из воркера готовыми буферами, но в видеопамять они уезжают ЛЕНИВО — в тот кадр,
|
|
4364
|
+
* когда слой впервые рисуют. А приезжают тайлы пачками: при панораме в кадр разом въезжает
|
|
4365
|
+
* несколько новых, и у каждого десяток слоёв. Замер на панораме в центре Душанбе: кадр, в котором
|
|
4366
|
+
* ушло 8.8 МБ, занял 75 мс, кадры по 3.9 МБ — по 28–30 мс. Это и есть рывки: карта едет ровно, а
|
|
4367
|
+
* раз в полсекунды замирает.
|
|
4368
|
+
*
|
|
4369
|
+
* Полтора мегабайта — примерно дюжина миллисекунд по тому же замеру, и этого хватает на средний
|
|
4370
|
+
* поток при панораме (46 МБ за 70 кадров, то есть 0.67 МБ на кадр). Остаток переносится на
|
|
4371
|
+
* следующий кадр, который тут же и заказывается: на глаз тайл достраивается за пару кадров, а
|
|
4372
|
+
* вместо провала в 75 мс остаётся ровный ход.
|
|
4373
|
+
*/
|
|
4374
|
+
private static readonly UPLOAD_BUDGET;
|
|
4375
|
+
private uploadLeft;
|
|
4376
|
+
private uploadDeferred;
|
|
4230
4377
|
private bucketFor;
|
|
4231
4378
|
destroy(ctx: Context): void;
|
|
4232
4379
|
}
|
|
@@ -4804,6 +4951,36 @@ interface LinePlacementOptions {
|
|
|
4804
4951
|
* 1 — считать прямо в экранных пикселях.
|
|
4805
4952
|
*/
|
|
4806
4953
|
stableScale?: number;
|
|
4954
|
+
/**
|
|
4955
|
+
* Сколько ЭТОТ кусок отстоит от начала всей линии, пиксели.
|
|
4956
|
+
*
|
|
4957
|
+
* Нужно, чтобы места подписей были привязаны к самой дороге, а не к окну экрана. Кусок приходит
|
|
4958
|
+
* обрезанным по кадру, и его начало едет вдоль улицы при каждом сдвиге карты. Раскладка, считающая
|
|
4959
|
+
* от начала куска, поэтому оставляет подпись стоять НА ЭКРАНЕ, а дорога уезжает под ней: на глаз
|
|
4960
|
+
* незаметно, зато подпись по очереди накрывает разные POI, и те мигают.
|
|
4961
|
+
*
|
|
4962
|
+
* Со смещением места считаются по общей для всей линии сетке шага, и подпись едет вместе с картой,
|
|
4963
|
+
* как всё остальное.
|
|
4964
|
+
*/
|
|
4965
|
+
offset?: number;
|
|
4966
|
+
/**
|
|
4967
|
+
* Где подпись стояла в ПРОШЛОМ кадре — расстояния от начала всей линии, пиксели.
|
|
4968
|
+
*
|
|
4969
|
+
* Эти места пробуются первыми. Без них раскладка каждый кадр выбирает заново, и подпись улицы
|
|
4970
|
+
* кочует по дороге вслед за тем, какое место освободилось, — на экране это читается как дёрганье
|
|
4971
|
+
* и мигание. У точечной подписи такого нет: у неё место одно, и оно от кадра не зависит.
|
|
4972
|
+
*/
|
|
4973
|
+
keepAt?: readonly number[];
|
|
4974
|
+
/**
|
|
4975
|
+
* ГОТОВЫЙ СПИСОК МЕСТ — расстояния от начала линии, пиксели.
|
|
4976
|
+
*
|
|
4977
|
+
* Когда он задан, раскладка не ищет место сама: пробует эти и только эти, по порядку. Список
|
|
4978
|
+
* считает вызывающий по САМОЙ дороге, поэтому места не зависят от того, где линию обрезал край
|
|
4979
|
+
* кадра, — а значит подпись стоит на одном и том же куске асфальта и едет вместе с картой.
|
|
4980
|
+
*
|
|
4981
|
+
* Так подпись улицы становится похожа на точечную: у той место одно и от кадра не зависит.
|
|
4982
|
+
*/
|
|
4983
|
+
atList?: readonly number[];
|
|
4807
4984
|
}
|
|
4808
4985
|
/**
|
|
4809
4986
|
* Раскладывает подпись вдоль ломаной — возможно, НЕСКОЛЬКО раз.
|
|
@@ -5551,8 +5728,10 @@ interface PolygonPiece {
|
|
|
5551
5728
|
*
|
|
5552
5729
|
* Возвращает кольца с дырами. `null` — собрать не удалось, и звать надо прежний путь «каждый кусок
|
|
5553
5730
|
* сам по себе»: так бывает, когда дом тянется дальше загруженных тайлов и куска посередине нет.
|
|
5731
|
+
*
|
|
5732
|
+
* `minWidth` — тоньше какой фигуры считать её мусором, в единицах тайла. Ноль отключает проверку.
|
|
5554
5733
|
*/
|
|
5555
|
-
declare function stitchPieces(pieces: PolygonPiece[]): Shape[] | null;
|
|
5734
|
+
declare function stitchPieces(pieces: PolygonPiece[], minWidth?: number): Shape[] | null;
|
|
5556
5735
|
|
|
5557
5736
|
/**
|
|
5558
5737
|
* Цель рендера с одной только глубиной — карта теней.
|
package/dist/osmgl.d.ts
CHANGED
|
@@ -1069,6 +1069,17 @@ interface FillExtrusionLayerSpec extends LayerBase {
|
|
|
1069
1069
|
* контрастом на фасаде, и дом читается сеткой линий, а не объёмом.
|
|
1070
1070
|
*/
|
|
1071
1071
|
seamStrength?: Interpolated<number>;
|
|
1072
|
+
/**
|
|
1073
|
+
* ЛЁД, 0..1. Ноль — обычный матовый дом.
|
|
1074
|
+
*
|
|
1075
|
+
* Настоящий лёд выдают две вещи, и обе видно на 3D-домах Baidu: кромка светится тем сильнее,
|
|
1076
|
+
* чем острее угол взгляда к грани (у стекла и льда так отражается небо), и низ стены светлее
|
|
1077
|
+
* верха — свет уходит в толщу и рассеивается. Ни то, ни другое не задать цветом: это зависит
|
|
1078
|
+
* от камеры и от высоты точки, то есть считается в шейдере.
|
|
1079
|
+
*
|
|
1080
|
+
* Цвет при этом остаётся за темой: ручка только добавляет блик и градиент поверх него.
|
|
1081
|
+
*/
|
|
1082
|
+
ice?: Interpolated<number>;
|
|
1072
1083
|
/**
|
|
1073
1084
|
* Доля светящихся окон, 0..1 — для ночных тем. Какие именно окна горят,
|
|
1074
1085
|
* решает хеш ячейки, поэтому при движении камеры свет не «бегает».
|
|
@@ -1141,10 +1152,15 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1141
1152
|
iconTextGap?: number;
|
|
1142
1153
|
/**
|
|
1143
1154
|
* Где стоит иконка относительно подписи: `top` — над ней по центру (так у
|
|
1144
|
-
* Mapbox Standard и у Яндекса: значок ровно над точкой объекта), `left`
|
|
1145
|
-
* сбоку, плотнее по
|
|
1155
|
+
* Mapbox Standard и у Яндекса: значок ровно над точкой объекта), `left` и
|
|
1156
|
+
* `right` — сбоку, плотнее по вертикали, `behind` — плашка под подписью.
|
|
1157
|
+
*
|
|
1158
|
+
* `auto` — ПЕРЕБОР сторон: подпись справа от значка, занято — слева, занято — под ним. Так
|
|
1159
|
+
* подписей на плотной карте помещается заметно больше: подпись, которой не нашлось места с
|
|
1160
|
+
* одной стороны, находит его с другой вместо того, чтобы пропасть. Работает только с
|
|
1161
|
+
* `iconFrame: 'pin'` — значок при этом остаётся остриём на объекте.
|
|
1146
1162
|
*/
|
|
1147
|
-
iconPlacement?: 'top' | 'left' | 'behind';
|
|
1163
|
+
iconPlacement?: 'top' | 'left' | 'right' | 'behind' | 'auto';
|
|
1148
1164
|
/**
|
|
1149
1165
|
* Как ставится подпись: `point` — горизонтально у точки привязки (по
|
|
1150
1166
|
* умолчанию), `line` — вдоль линии объекта, изгибаясь по ней.
|
|
@@ -1186,8 +1202,13 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1186
1202
|
* Это ОТДЕЛЬНЫЙ значок под иконкой, а не обводка: обводка у нас общая с
|
|
1187
1203
|
* текстом (одна программа), и «жирный контур» вокруг пиктограммы выглядит
|
|
1188
1204
|
* грязно, а кружок — фигура со своей заливкой и своей рамкой.
|
|
1205
|
+
*
|
|
1206
|
+
* `pin` — та же подложка, но с остриём вниз. Отличие не в рисунке, а в ТОЧКЕ ПРИВЯЗКИ: у
|
|
1207
|
+
* кружка на объекте стоит его середина, у булавки — остриё. Поэтому с булавкой подпись можно
|
|
1208
|
+
* увести вбок (`iconPlacement: 'left'`), не теряя, к чему она относится: показывает не значок
|
|
1209
|
+
* целиком, а его кончик. Так устроены POI у Baidu Maps.
|
|
1189
1210
|
*/
|
|
1190
|
-
iconFrame?: 'circle' | 'none';
|
|
1211
|
+
iconFrame?: 'circle' | 'pin' | 'none';
|
|
1191
1212
|
/** Диаметр подложки относительно значка. */
|
|
1192
1213
|
iconFrameScale?: number;
|
|
1193
1214
|
/**
|
|
@@ -1253,8 +1274,16 @@ interface SymbolLayerSpec extends LayerBase {
|
|
|
1253
1274
|
arrowGap?: Interpolated<number>;
|
|
1254
1275
|
};
|
|
1255
1276
|
paint: {
|
|
1256
|
-
|
|
1257
|
-
|
|
1277
|
+
/**
|
|
1278
|
+
* Цвет подписи; `{ from }` — «как у такого-то слоя» (см. `ColorFrom`).
|
|
1279
|
+
*
|
|
1280
|
+
* Ссылка тут нужна ровно затем же, зачем обводке моста: тем два десятка, и слой, отколотый от
|
|
1281
|
+
* существующего (мелкие населённые пункты от крупных), в каждой из них пришлось бы красить
|
|
1282
|
+
* заново. Своего хекса у такого слоя нет — у него есть «как у родителя», и ссылка это и говорит.
|
|
1283
|
+
* Берётся ОДНОИМЁННОЕ свойство: `haloColor: { from: 'place-label' }` — это обводка того слоя.
|
|
1284
|
+
*/
|
|
1285
|
+
color: Interpolated<string> | ColorFrom;
|
|
1286
|
+
haloColor?: Interpolated<string> | ColorFrom;
|
|
1258
1287
|
/** Толщина обводки в CSS-пикселях. Обводка обязательна поверх пёстрой карты. */
|
|
1259
1288
|
haloWidth?: Interpolated<number>;
|
|
1260
1289
|
/**
|
|
@@ -2358,6 +2387,17 @@ interface Candidate {
|
|
|
2358
2387
|
/** Точка объекта в нормализованном меркаторе — по ней подпись и опознаётся. */
|
|
2359
2388
|
mercX: number;
|
|
2360
2389
|
mercY: number;
|
|
2390
|
+
/**
|
|
2391
|
+
* Ключ подписи, устойчивый между кадрами (см. `keyOf`).
|
|
2392
|
+
*
|
|
2393
|
+
* Считается ОДИН раз при сборе, а не там, где понадобился. Понадобился он трижды — при
|
|
2394
|
+
* сортировке, при раскладке и при запоминании стороны, — а строится из двух `toFixed(9)`.
|
|
2395
|
+
* В сортировке это било особенно больно: компаратор зовётся порядка `n log n` раз, и на полутора
|
|
2396
|
+
* тысячах кандидатов построение ключей занимало 3.8 мс из 9.8 мс кадра.
|
|
2397
|
+
*/
|
|
2398
|
+
key: string;
|
|
2399
|
+
/** Прозрачность от расстояния до камеры: подпись растворяется в дымке вместе с землёй под ней. */
|
|
2400
|
+
depth: number;
|
|
2361
2401
|
/**
|
|
2362
2402
|
* Линия объекта в ЭКРАННЫХ координатах — для подписи вдоль дороги.
|
|
2363
2403
|
*
|
|
@@ -2446,12 +2486,21 @@ declare class SymbolRenderer {
|
|
|
2446
2486
|
/**
|
|
2447
2487
|
* Ключ подписи, устойчивый между кадрами.
|
|
2448
2488
|
*
|
|
2449
|
-
* Экранные координаты не годятся — они меняются от любого движения камеры;
|
|
2450
|
-
*
|
|
2451
|
-
*
|
|
2489
|
+
* Экранные координаты не годятся — они меняются от любого движения камеры; мировые пиксели тоже,
|
|
2490
|
+
* они зависят от зума. Берём слой, текст и меркатор.
|
|
2491
|
+
*
|
|
2492
|
+
* ТОЧНОСТЬ КООРДИНАТЫ ГРУБАЯ НАМЕРЕННО — 1e-6 это метров сорок. Один и тот же объект приезжает в
|
|
2493
|
+
* НЕСКОЛЬКИХ тайлах сразу (у тайлов буфер), и при движении карты рядом живут тайлы соседних
|
|
2494
|
+
* зумов. Координата в тайле целая, а цена деления у z13 и z14 разная — тот же POI получается на
|
|
2495
|
+
* метр в стороне. С точностью до сантиметра это был РАЗНЫЙ ключ: подпись теряла и липкость, и
|
|
2496
|
+
* свой возраст, и проявлялась заново — то самое мигание на ровном месте.
|
|
2497
|
+
*
|
|
2498
|
+
* Разные объекты грубая сетка не путает, потому что в ключе есть текст: совпасть должны и слой, и
|
|
2499
|
+
* название, и место с точностью до сорока метров.
|
|
2452
2500
|
*/
|
|
2453
2501
|
static keyOf(s: {
|
|
2454
2502
|
layerId: string;
|
|
2503
|
+
text: string;
|
|
2455
2504
|
mercX: number;
|
|
2456
2505
|
mercY: number;
|
|
2457
2506
|
}): string;
|
|
@@ -2476,6 +2525,67 @@ declare class SymbolRenderer {
|
|
|
2476
2525
|
private stickyKeys;
|
|
2477
2526
|
/** Время текущего кадра: одно на весь проход, иначе соседние буквы строки проявятся вразнобой. */
|
|
2478
2527
|
private now;
|
|
2528
|
+
/**
|
|
2529
|
+
* ГДЕ УЖЕ СТОИТ ЭТО ЖЕ НАЗВАНИЕ — по одной записи на текст, на кадр.
|
|
2530
|
+
*
|
|
2531
|
+
* Шаг повторения (`symbolSpacing`) работает внутри ОДНОГО объекта: раскладка отступает от своей
|
|
2532
|
+
* прошлой подписи и ищет следующее место. Но улица приезжает из тайлов десятком отдельных
|
|
2533
|
+
* объектов, и каждый считает себя первым — на экране получается три «просп. Рудаки» подряд,
|
|
2534
|
+
* сколько шаг ни увеличивай. У Baidu улица подписана один раз на экран, и добивается этого тот же
|
|
2535
|
+
* шаг, только считанный по НАЗВАНИЮ, а не по объекту.
|
|
2536
|
+
*
|
|
2537
|
+
* Держим плоским списком координат: подписей вдоль линий в кадре десятки, и своя пара чисел на
|
|
2538
|
+
* каждую дешевле объекта.
|
|
2539
|
+
*/
|
|
2540
|
+
private lineAnchors;
|
|
2541
|
+
/** Сторона, на которой подпись стояла в прошлом кадре: её и пробуем первой (см. `preferSide`). */
|
|
2542
|
+
private lastSide;
|
|
2543
|
+
/** То же для подписи вдоль дороги: где она стояла на самой линии (см. `keepAt`). */
|
|
2544
|
+
private lineAt;
|
|
2545
|
+
private lineAtNow;
|
|
2546
|
+
/** Сколько чисел на одно запомненное место: меркатор x и y. */
|
|
2547
|
+
private static readonly LINE_MARK;
|
|
2548
|
+
/** Стороны ЭТОГО кадра — заменяют прошлые, когда раскладка закончена. */
|
|
2549
|
+
private sideNow;
|
|
2550
|
+
/** Дымка этого кадра и камера — по ним считается затухание подписи вдаль. */
|
|
2551
|
+
private fog;
|
|
2552
|
+
private tr;
|
|
2553
|
+
/**
|
|
2554
|
+
* ГДЕ ПОДПИСЬ СТОЯЛА — переведённое в расстояние вдоль СЕГОДНЯШНЕЙ линии.
|
|
2555
|
+
*
|
|
2556
|
+
* Место запоминается точкой на земле, а не расстоянием от начала линии. Расстояние не годится:
|
|
2557
|
+
* при наклоне камера срезает у ломаной начало (точку за собой спроецировать нельзя), и с каждым
|
|
2558
|
+
* сдвигом карты отсчёт ведётся от другой вершины — сетка мест уезжает вдоль улицы, а с ней и
|
|
2559
|
+
* название. Точка на асфальте не зависит ни от камеры, ни от обрезки: её достаточно спроецировать
|
|
2560
|
+
* заново и померить, на каком она расстоянии сейчас.
|
|
2561
|
+
*/
|
|
2562
|
+
private rememberedAt;
|
|
2563
|
+
/**
|
|
2564
|
+
* Запомнить места этого кадра точками на земле.
|
|
2565
|
+
*
|
|
2566
|
+
* ДОПИСЫВАЕМ, А НЕ ЗАМЕНЯЕМ. Улица приезжает несколькими кусками — по куску на тайл, — и каждый
|
|
2567
|
+
* ставит свою подпись. Ключ у них общий, поэтому запись последнего затирала бы места всех
|
|
2568
|
+
* предыдущих: на следующем кадре они оказывались без памяти и выбирали место заново. Это и было
|
|
2569
|
+
* остаточное «ползание» на части улиц.
|
|
2570
|
+
*/
|
|
2571
|
+
private rememberAt;
|
|
2572
|
+
/**
|
|
2573
|
+
* Попадает ли бокс в область раскладки — кадр, расширенный на `LAYOUT_MARGIN`.
|
|
2574
|
+
*
|
|
2575
|
+
* Проверка на ПЕРЕСЕЧЕНИЕ, а не на вложенность: подпись, наполовину уехавшая за край, остаётся
|
|
2576
|
+
* на своём месте и держит место в сетке коллизий — иначе её исчезновение переставляло бы соседей
|
|
2577
|
+
* в середине кадра.
|
|
2578
|
+
*/
|
|
2579
|
+
private withinLayout;
|
|
2580
|
+
/**
|
|
2581
|
+
* Затухание подписи, стоящей В ТОЧКЕ ЭКРАНА.
|
|
2582
|
+
*
|
|
2583
|
+
* Для подписи вдоль дороги другого способа нет: якорь у неё один на всю улицу, а буквы
|
|
2584
|
+
* раскладываются по видимому куску, и от начала к концу строки расстояние до камеры меняется в
|
|
2585
|
+
* разы. Считается по месту раскладки, то есть несколько раз на улицу, — обратная проекция стоит
|
|
2586
|
+
* одного умножения на матрицу.
|
|
2587
|
+
*/
|
|
2588
|
+
private depthFadeAt;
|
|
2479
2589
|
/**
|
|
2480
2590
|
* Когда подпись впервые встала — по этому времени считается её прозрачность.
|
|
2481
2591
|
*
|
|
@@ -2520,6 +2630,19 @@ declare class SymbolRenderer {
|
|
|
2520
2630
|
*/
|
|
2521
2631
|
/** Позиция слоя в стиле — по ней сортируется отрисовка. */
|
|
2522
2632
|
private styleOrder;
|
|
2633
|
+
/** Слои этого кадра — по ним разрешается ссылка «цвет как у такого-то слоя». */
|
|
2634
|
+
private layersById;
|
|
2635
|
+
/**
|
|
2636
|
+
* Цвет с учётом ССЫЛКИ НА ЧУЖОЙ СЛОЙ (`{ from }`, см. `ColorFrom`).
|
|
2637
|
+
*
|
|
2638
|
+
* Тема красит слои по именам, и слой, отколотый от существующего, в каждой из двух десятков тем
|
|
2639
|
+
* пришлось бы красить заново — а он по смыслу и не имеет своего цвета, он «как родитель».
|
|
2640
|
+
* Ссылка разрешается по СОБСТВЕННОМУ стилю кадра, то есть уже с наложенной темой, и ровно на один
|
|
2641
|
+
* уровень: цепочки нам не нужны, а кольцо из них молча съело бы кадр.
|
|
2642
|
+
*
|
|
2643
|
+
* Берётся одноимённое свойство: `haloColor: { from: 'place-label' }` — обводка того слоя.
|
|
2644
|
+
*/
|
|
2645
|
+
private colorOf;
|
|
2523
2646
|
private inStyleOrder;
|
|
2524
2647
|
private draw;
|
|
2525
2648
|
private ensureBuffers;
|
|
@@ -4202,6 +4325,13 @@ declare class LayerRenderer {
|
|
|
4202
4325
|
private drawSeamHighlight;
|
|
4203
4326
|
/** Нарисовать сшитые дома. Каждый лежит в координатах своего тайла-хозяина. */
|
|
4204
4327
|
private drawSeams;
|
|
4328
|
+
/**
|
|
4329
|
+
* Буферы сшитого дома на видеокарте. Заводятся по требованию и переживают кадр.
|
|
4330
|
+
*
|
|
4331
|
+
* Отдельным методом, потому что проходов два и первым идёт КАРТА ТЕНЕЙ: заводись буфер внутри
|
|
4332
|
+
* цветного прохода, тень в первом же кадре рисовалась бы по пустому месту.
|
|
4333
|
+
*/
|
|
4334
|
+
private seamBucket;
|
|
4205
4335
|
/**
|
|
4206
4336
|
* Освободить буферы ТОЛЬКО тех хозяев, чья геометрия пересобрана.
|
|
4207
4337
|
*
|
|
@@ -4227,6 +4357,23 @@ declare class LayerRenderer {
|
|
|
4227
4357
|
* при этом пересобираются, — но и стоит он немного: первый же тайл с этим слоем даёт ответ.
|
|
4228
4358
|
*/
|
|
4229
4359
|
private flattened;
|
|
4360
|
+
/**
|
|
4361
|
+
* СКОЛЬКО ГЕОМЕТРИИ КАДР ОТПРАВЛЯЕТ В ВИДЕОПАМЯТЬ ЗА РАЗ.
|
|
4362
|
+
*
|
|
4363
|
+
* Тайл приезжает из воркера готовыми буферами, но в видеопамять они уезжают ЛЕНИВО — в тот кадр,
|
|
4364
|
+
* когда слой впервые рисуют. А приезжают тайлы пачками: при панораме в кадр разом въезжает
|
|
4365
|
+
* несколько новых, и у каждого десяток слоёв. Замер на панораме в центре Душанбе: кадр, в котором
|
|
4366
|
+
* ушло 8.8 МБ, занял 75 мс, кадры по 3.9 МБ — по 28–30 мс. Это и есть рывки: карта едет ровно, а
|
|
4367
|
+
* раз в полсекунды замирает.
|
|
4368
|
+
*
|
|
4369
|
+
* Полтора мегабайта — примерно дюжина миллисекунд по тому же замеру, и этого хватает на средний
|
|
4370
|
+
* поток при панораме (46 МБ за 70 кадров, то есть 0.67 МБ на кадр). Остаток переносится на
|
|
4371
|
+
* следующий кадр, который тут же и заказывается: на глаз тайл достраивается за пару кадров, а
|
|
4372
|
+
* вместо провала в 75 мс остаётся ровный ход.
|
|
4373
|
+
*/
|
|
4374
|
+
private static readonly UPLOAD_BUDGET;
|
|
4375
|
+
private uploadLeft;
|
|
4376
|
+
private uploadDeferred;
|
|
4230
4377
|
private bucketFor;
|
|
4231
4378
|
destroy(ctx: Context): void;
|
|
4232
4379
|
}
|
|
@@ -4804,6 +4951,36 @@ interface LinePlacementOptions {
|
|
|
4804
4951
|
* 1 — считать прямо в экранных пикселях.
|
|
4805
4952
|
*/
|
|
4806
4953
|
stableScale?: number;
|
|
4954
|
+
/**
|
|
4955
|
+
* Сколько ЭТОТ кусок отстоит от начала всей линии, пиксели.
|
|
4956
|
+
*
|
|
4957
|
+
* Нужно, чтобы места подписей были привязаны к самой дороге, а не к окну экрана. Кусок приходит
|
|
4958
|
+
* обрезанным по кадру, и его начало едет вдоль улицы при каждом сдвиге карты. Раскладка, считающая
|
|
4959
|
+
* от начала куска, поэтому оставляет подпись стоять НА ЭКРАНЕ, а дорога уезжает под ней: на глаз
|
|
4960
|
+
* незаметно, зато подпись по очереди накрывает разные POI, и те мигают.
|
|
4961
|
+
*
|
|
4962
|
+
* Со смещением места считаются по общей для всей линии сетке шага, и подпись едет вместе с картой,
|
|
4963
|
+
* как всё остальное.
|
|
4964
|
+
*/
|
|
4965
|
+
offset?: number;
|
|
4966
|
+
/**
|
|
4967
|
+
* Где подпись стояла в ПРОШЛОМ кадре — расстояния от начала всей линии, пиксели.
|
|
4968
|
+
*
|
|
4969
|
+
* Эти места пробуются первыми. Без них раскладка каждый кадр выбирает заново, и подпись улицы
|
|
4970
|
+
* кочует по дороге вслед за тем, какое место освободилось, — на экране это читается как дёрганье
|
|
4971
|
+
* и мигание. У точечной подписи такого нет: у неё место одно, и оно от кадра не зависит.
|
|
4972
|
+
*/
|
|
4973
|
+
keepAt?: readonly number[];
|
|
4974
|
+
/**
|
|
4975
|
+
* ГОТОВЫЙ СПИСОК МЕСТ — расстояния от начала линии, пиксели.
|
|
4976
|
+
*
|
|
4977
|
+
* Когда он задан, раскладка не ищет место сама: пробует эти и только эти, по порядку. Список
|
|
4978
|
+
* считает вызывающий по САМОЙ дороге, поэтому места не зависят от того, где линию обрезал край
|
|
4979
|
+
* кадра, — а значит подпись стоит на одном и том же куске асфальта и едет вместе с картой.
|
|
4980
|
+
*
|
|
4981
|
+
* Так подпись улицы становится похожа на точечную: у той место одно и от кадра не зависит.
|
|
4982
|
+
*/
|
|
4983
|
+
atList?: readonly number[];
|
|
4807
4984
|
}
|
|
4808
4985
|
/**
|
|
4809
4986
|
* Раскладывает подпись вдоль ломаной — возможно, НЕСКОЛЬКО раз.
|
|
@@ -5551,8 +5728,10 @@ interface PolygonPiece {
|
|
|
5551
5728
|
*
|
|
5552
5729
|
* Возвращает кольца с дырами. `null` — собрать не удалось, и звать надо прежний путь «каждый кусок
|
|
5553
5730
|
* сам по себе»: так бывает, когда дом тянется дальше загруженных тайлов и куска посередине нет.
|
|
5731
|
+
*
|
|
5732
|
+
* `minWidth` — тоньше какой фигуры считать её мусором, в единицах тайла. Ноль отключает проверку.
|
|
5554
5733
|
*/
|
|
5555
|
-
declare function stitchPieces(pieces: PolygonPiece[]): Shape[] | null;
|
|
5734
|
+
declare function stitchPieces(pieces: PolygonPiece[], minWidth?: number): Shape[] | null;
|
|
5556
5735
|
|
|
5557
5736
|
/**
|
|
5558
5737
|
* Цель рендера с одной только глубиной — карта теней.
|