osmgl 0.31.31 → 0.31.32

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.
@@ -1,197 +0,0 @@
1
- import Pbf from 'pbf';
2
- import { aT as SpeedLimit } from './model-mshqbG69.js';
3
-
4
- /**
5
- * Разбор Mapbox Vector Tile (spec 2.1) — наш тайлсервер отдаёт именно его
6
- * (схема OpenMapTiles v3: building / transportation / water / landuse / poi …).
7
- *
8
- * Читаем «лениво»: сначала только оглавление слоёв, геометрию каждой фичи
9
- * распаковываем по требованию. На тайл с 20 тыс. фич это разница между
10
- * 40 мс и 3 мс, когда генератору нужен один слой из пятнадцати.
11
- */
12
- declare const enum GeomType {
13
- Unknown = 0,
14
- Point = 1,
15
- LineString = 2,
16
- Polygon = 3
17
- }
18
- type PropValue = string | number | boolean | null;
19
- /** Кольцо/линия: плоский массив [x0,y0,x1,y1,...] в координатах тайла [0..extent]. */
20
- type Ring = number[];
21
- declare class VectorTileFeature {
22
- private pbf;
23
- readonly keys: string[];
24
- readonly values: PropValue[];
25
- readonly extent: number;
26
- id?: number;
27
- type: GeomType;
28
- properties: Record<string, PropValue>;
29
- /** Позиция блока геометрии в буфере; -1 — геометрии нет. Пишется читателем полей. */
30
- geomOffset: number;
31
- constructor(pbf: Pbf, keys: string[], values: PropValue[], extent: number);
32
- static read(pbf: Pbf, end: number, keys: string[], values: PropValue[], extent: number): VectorTileFeature;
33
- /** Кольца/линии фичи. Для полигонов внешние и внутренние идут вперемешку — см. splitPolygons. */
34
- loadGeometry(): Ring[];
35
- /** BBox фичи в координатах тайла — дешёвый отсев до триангуляции. */
36
- bbox(): [number, number, number, number];
37
- }
38
- declare class VectorTileLayer {
39
- private pbf;
40
- version: number;
41
- name: string;
42
- extent: number;
43
- readonly featureOffsets: number[];
44
- readonly keys: string[];
45
- readonly values: PropValue[];
46
- constructor(pbf: Pbf);
47
- static read(pbf: Pbf, end: number): VectorTileLayer;
48
- get length(): number;
49
- feature(i: number): VectorTileFeature;
50
- /** Итератор по всем фичам слоя. */
51
- features(): Generator<VectorTileFeature>;
52
- }
53
- declare class VectorTile {
54
- readonly layers: Record<string, VectorTileLayer>;
55
- constructor(buffer: ArrayBuffer | Uint8Array);
56
- }
57
- /**
58
- * Разбивает кольца полигона на группы «внешнее + его дырки».
59
- * Ориентация по знаку площади: в MVT внешние кольца по часовой (положительная
60
- * площадь в системе с Y вниз), дырки — против.
61
- */
62
- declare function splitPolygons(rings: Ring[]): {
63
- outer: Ring;
64
- holes: Ring[];
65
- }[];
66
-
67
- /**
68
- * ОГРАНИЧЕНИЕ СКОРОСТИ ПО ИНДЕКСУ ТАЙЛА — источник правды для портов (`SpeedLimits.kt`, `SpeedLimitIndex.swift`)
69
- * и натива (`native/src/navigram/speed_limit.cpp`, откуда логика и пришла, 17.10.2026).
70
- *
71
- * Зачем. Навигатор спрашивал знак раз в 0.9 с запросом по НАРИСОВАННОМУ: `project` + до четырёх
72
- * `queryRenderedFeatures` (дорога точкой с допуском 3, 7, 12 px и застройка в 12 px) в потоке карты перед кадром.
73
- * Перебор слоёв стиля и всех треугольников домов тайла под машиной — 18 мс на Redmi Note 11, провал кадра «раз в
74
- * 0.9 с» (PLAN N6). Здесь сырой тайл основы ОДИН раз разбирается в индекс по слоям тайла: отрезки `transportation`
75
- * сеткой 32² и признаки застройки (`landuse` городских классов — многоугольниками, `building`/`housenumber`/`poi` —
76
- * битовой сеткой присутствия 256²). Ответ по готовому индексу — микросекунды. Где собирать индекс (воркер, пул,
77
- * очередь) — решает платформа: сборка чистая, на входе байты, на выходе неизменяемый индекс.
78
- *
79
- * ★ Отличие от запроса по нарисованному — осознанное: дорога — БЛИЖАЙШАЯ проезжая в пределах 12 px (а не верхняя
80
- * по порядку отрисовки среди попавших в 3/7/12 px), застройка — дом/номер дома/POI в радиусе 12 px или городской
81
- * `landuse` под точкой. Запрос по нарисованному домов и подписей рядом с осью дороги почти не находил (заливка
82
- * ловится попаданием центра, символы не ловятся вовсе), и «в городе ли» решал фактически один `landuse`.
83
- * Сверка со старым ответом — `scripts/speed-index-vs-query.mjs`, цифры — в `native/PLAN.md`.
84
- *
85
- * Решение по найденному — та же чистая часть `speedLimitFromFeatures`: дорога одной фичей `transportation`,
86
- * застройка — одной фичей `building` (её слой и есть признак, свойства не читаются).
87
- */
88
-
89
- /** Допуск поиска дороги, CSS-пиксели на зуме камеры. */
90
- declare const SPEED_ROAD_TOLERANCE = 12;
91
- /** Сетка дорог: 32² клеток на тайл с буфером — у z14 клетка ≈ 90 м, дорог в клетке единицы–десятки. */
92
- declare const SPEED_ROAD_GRID = 32;
93
- /** Сетка присутствия домов/номеров/POI: 256² бит (8 КБ) — у z14 клетка ≈ 11 м, как допуск 12 px на зуме ведения. */
94
- declare const SPEED_PRESENCE_GRID = 256;
95
- declare const SPEED_NAME_TOLERANCE = 16;
96
- /** Название улицы: местное, русское (если есть) и номер дороги (`M41`). */
97
- interface RoadName {
98
- name: string;
99
- nameRu: string | null;
100
- ref: string | null;
101
- }
102
- /** Городской `landuse`: кольца подряд (`ends[i]` — конец кольца i в `points`, пары x, y) и рамка для отсева. */
103
- interface UrbanPolygon {
104
- points: Float32Array;
105
- ends: number[];
106
- minX: number;
107
- minY: number;
108
- maxX: number;
109
- maxY: number;
110
- }
111
- /**
112
- * Индекс одного сырого тайла: дороги и застройка. Неизменяемый после сборки — его можно отдавать между потоками.
113
- * Координаты — единицы тайла (`extent`). Сетки накрывают тайл с буфером в четверть тайла с каждой стороны:
114
- * фичи соседей лежат за краем.
115
- */
116
- declare class SpeedLimitIndex {
117
- extent: number;
118
- /** Свойства дорог (только `ROAD_KEYS`), в порядке фич тайла. */
119
- readonly roads: Record<string, PropValue>[];
120
- /** Отрезки: `ax, ay, bx, by` подряд (float32, как у натива); `segmentRoad[i]` — номер дороги отрезка i. */
121
- segments: Float32Array<ArrayBuffer>;
122
- segmentRoad: Uint32Array<ArrayBuffer>;
123
- /** Сетка дорог `SPEED_ROAD_GRID`², в клетке — номера отрезков (CSR: начало клетки в `roadCellStart`). */
124
- roadCellStart: Uint32Array<ArrayBuffer>;
125
- roadCellItems: Uint32Array<ArrayBuffer>;
126
- /** Городские `landuse` — многоугольники (их в тайле единицы–десятки), отсев рамкой. */
127
- readonly urban: UrbanPolygon[];
128
- /** Присутствие домов, номеров и POI — битовая сетка `SPEED_PRESENCE_GRID`² (слова по 32 бита). */
129
- readonly presence: Uint32Array<ArrayBuffer>;
130
- /** Названия улиц (`transportation_name`, только `NAME_KEYS`) — отрезки и сетка, как у дорог. */
131
- readonly names: Record<string, PropValue>[];
132
- nameSegments: Float32Array<ArrayBuffer>;
133
- nameSegmentRoad: Uint32Array<ArrayBuffer>;
134
- nameCellStart: Uint32Array<ArrayBuffer>;
135
- nameCellItems: Uint32Array<ArrayBuffer>;
136
- get segmentCount(): number;
137
- /** Собрать из сырого MVT; битый тайл — пустой индекс (не исключение: знак не повод ронять поток). */
138
- static build(raw: Uint8Array): SpeedLimitIndex;
139
- /** Клетка сетки `n`² по координате тайла; за краем сетки — к краю. */
140
- cellOf(v: number, n: number): number;
141
- private buildRoads;
142
- /** Сетка `SPEED_ROAD_GRID`² по отрезкам (CSR): клетки → номера отрезков; сначала счёт, потом раскладка. */
143
- private grid;
144
- /** Линии `transportation_name` с именем или номером; тропы — мимо (по ним не ездят). */
145
- private buildNames;
146
- private mark;
147
- private buildPresence;
148
- private buildLanduse;
149
- /** Номер ближайшей проезжей дороги в радиусе `radius` от точки; нет — −1. Равные расстояния — первая дорога тайла. */
150
- roadIndexNear(x: number, y: number, radius: number): number;
151
- /** Номер ближайшего названия улицы (`names`) в радиусе `radius`; нет — −1. Правила — как у `roadIndexNear`. */
152
- nameIndexNear(x: number, y: number, radius: number): number;
153
- /** Свойства ближайшего названия (`name`, `name:ru`, `ref`) в радиусе `radius`; нет — null. */
154
- nameNear(x: number, y: number, radius: number): Record<string, PropValue> | null;
155
- private nearest;
156
- /** Свойства ближайшей проезжей дороги в радиусе `radius`; нет — null. */
157
- roadNear(x: number, y: number, radius: number): Record<string, PropValue> | null;
158
- /** Застройка: дом/номер дома/POI в радиусе `radius` (по клеткам сетки) или городской `landuse` под точкой. */
159
- urbanNear(x: number, y: number, radius: number): boolean;
160
- /** Сколько бит присутствия поднято (сверка портов). */
161
- presenceCount(): number;
162
- }
163
- /** Допуск `px` CSS-пикселей на зуме камеры `zoom` → единицы тайла зума `tileZ` (наклон не учитывается: под машиной он мал). */
164
- declare function speedTileRadius(px: number, zoom: number, tileZ: number, extent: number): number;
165
- /**
166
- * Решение в точке тайла `x`, `y` (единицы тайла): ближайшая дорога в `roadRadius` → `speedLimitFromFeatures`, застройка
167
- * в `aroundRadius`. Дороги рядом нет — null (вызывающий держит прежний знак).
168
- */
169
- declare function speedLimitFromIndex(index: SpeedLimitIndex, x: number, y: number, roadRadius: number, aroundRadius: number, exact?: boolean): SpeedLimit | null;
170
- /**
171
- * Название улицы в точке тайла (`fx`, `fy` — доля точки в тайле из `pickSpeedTile`), допуск — `SPEED_NAME_TOLERANCE`
172
- * пикселей на зуме камеры `zoom`. Рядом названия нет — null (у безымянного проезда показывать нечего).
173
- */
174
- declare function roadNameAtTile(index: SpeedLimitIndex, tileZ: number, fx: number, fy: number, zoom: number): RoadName | null;
175
- /** Номер тайла, как его видит выбор тайла основы. */
176
- interface SpeedTileId {
177
- z: number;
178
- x: number;
179
- y: number;
180
- wrap?: number;
181
- }
182
- /**
183
- * Тайл основы под точкой: самый подробный из `tiles`, у которого есть сырые данные (`hasRaw`); при равном зуме —
184
- * первый в списке. Ответ — номер в списке и доля точки внутри тайла; нет — null.
185
- */
186
- declare function pickSpeedTile(tiles: SpeedTileId[], lng: number, lat: number, hasRaw: (i: number) => boolean): {
187
- index: number;
188
- fx: number;
189
- fy: number;
190
- } | null;
191
- /**
192
- * Знак в точке карты по готовому индексу тайла (`fx`, `fy` — доля точки в тайле из `pickSpeedTile`), допуски —
193
- * `SPEED_ROAD_TOLERANCE`/`SPEED_AROUND_TOLERANCE` пикселей на зуме камеры `zoom`.
194
- */
195
- declare function speedLimitAtTile(index: SpeedLimitIndex, tileZ: number, fx: number, fy: number, zoom: number, exact?: boolean): SpeedLimit | null;
196
-
197
- export { GeomType as G, type PropValue as P, type RoadName as R, type SpeedTileId as S, VectorTile as V, VectorTileFeature as a, VectorTileLayer as b, SpeedLimitIndex as c, SPEED_NAME_TOLERANCE as d, SPEED_PRESENCE_GRID as e, SPEED_ROAD_GRID as f, SPEED_ROAD_TOLERANCE as g, speedLimitAtTile as h, speedLimitFromIndex as i, speedTileRadius as j, type Ring as k, pickSpeedTile as p, roadNameAtTile as r, splitPolygons as s };