aur-openlayers 19.6.10 → 19.6.12

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.
@@ -422,6 +422,32 @@ export interface PopupHostApi {
422
422
  /** Освободить ресурсы и отписки. */
423
423
  dispose: () => void;
424
424
  }
425
+ /**
426
+ * Опции экспорта текущего вида карты в растр.
427
+ */
428
+ export type MapExportImageOptions = {
429
+ /**
430
+ * Целевой пиксельный размер результата [width, height].
431
+ * Это и есть размер итогового изображения; OL рендерит карту под него.
432
+ */
433
+ size: [width: number, height: number];
434
+ /** Формат вывода. По умолчанию 'image/png'. */
435
+ format?: 'image/png' | 'image/jpeg';
436
+ /** Качество JPEG 0..1 (игнорируется для png). По умолчанию 0.92. */
437
+ quality?: number;
438
+ /**
439
+ * Фон, заливается ПОД слоями. Нужен для jpeg (нет альфы) и прозрачных зазоров.
440
+ * По умолчанию: не заливать (прозрачный для png).
441
+ */
442
+ background?: string;
443
+ /**
444
+ * Какую область рендерить:
445
+ * - 'currentExtent' (по умолчанию): текущий экстент вписывается (`view.fit`)
446
+ * в целевой размер — соотношение сторон адаптируется под бокс;
447
+ * - 'currentResolution': сохраняются текущие resolution и center.
448
+ */
449
+ fit?: 'currentExtent' | 'currentResolution';
450
+ };
425
451
  /**
426
452
  * Минимальный контекст, доступный обработчикам взаимодействий.
427
453
  *
@@ -443,6 +469,19 @@ export type MapContext = {
443
469
  centerOnAllLayers: (opts?: ViewFitOptions) => void;
444
470
  /** Центрирует карту на указанных слоях (скрытые пропускаются). No-op если нет фич. */
445
471
  centerOnLayers: (layerIds: ReadonlyArray<string>, opts?: ViewFitOptions) => void;
472
+ /**
473
+ * Снять текущий вид ЭТОЙ карты в растровое изображение целевого размера.
474
+ * Композит ограничен canvas'ами собственного `map.getViewport()`.
475
+ * Внутри: resize → fit → ожидание rendercomplete → композит → restore.
476
+ * Параллельные вызовы сериализуются.
477
+ * @returns Promise<dataURL>
478
+ * @remarks Ограничения:
479
+ * - Растровые источники должны быть CORS-доступны: tainted-canvas делает
480
+ * `toDataURL` недоступным и выбрасывает `SecurityError`.
481
+ * - В момент снимка карта кратковременно (≥1 кадр) перерисовывается на
482
+ * экране под целевой размер/экстент и восстанавливается — видимый скачок ожидаем.
483
+ */
484
+ exportImage: (options: MapExportImageOptions) => Promise<string>;
446
485
  };
447
486
  /**
448
487
  * Контроллер, который связывается с контекстом карты.
@@ -494,6 +533,23 @@ export type BufferDecoration = {
494
533
  /** Форма торцов. По умолчанию: 'round'. */
495
534
  cap?: 'round' | 'flat';
496
535
  };
536
+ /**
537
+ * Маркеры в концах LineString. Все поля опциональны.
538
+ * Стили — готовые OL Style (как buffer.style); иконку (new Icon({ src }))
539
+ * собирает вызывающая сторона — библиотека остаётся asset-agnostic.
540
+ */
541
+ export type StartFinishDecoration = {
542
+ /** Маркер в первой точке линии (geometry.getFirstCoordinate()). */
543
+ start?: Style | Style[];
544
+ /** Маркер в последней точке линии (geometry.getLastCoordinate()). */
545
+ finish?: Style | Style[];
546
+ /**
547
+ * Одиночный маркер, когда линия вырождена в точку (first == last):
548
+ * рисуется ОДИН раз вместо наложения start + finish.
549
+ * Если не задан — используется `start`, иначе `finish`.
550
+ */
551
+ collapsed?: Style | Style[];
552
+ };
497
553
  /**
498
554
  * Декоративные элементы вдоль LineString-геометрий.
499
555
  */
@@ -502,6 +558,8 @@ export type LineDecorations = {
502
558
  arrows?: ArrowDecoration;
503
559
  /** Буферный полигон (коридор) вокруг линии. */
504
560
  buffer?: BufferDecoration;
561
+ /** Маркеры в концах линии. */
562
+ startFinish?: StartFinishDecoration;
505
563
  };
506
564
  /**
507
565
  * Описание фичи: геометрия, стиль, взаимодействия и popup.
@@ -0,0 +1,28 @@
1
+ import VectorLayer from 'ol/layer/Vector';
2
+ import type OlMap from 'ol/Map';
3
+ import type { StartFinishDecoration, VectorLayerApi } from '../../public/types';
4
+ export type StartFinishDecorationManagerOptions = {
5
+ map: OlMap;
6
+ parentLayer: VectorLayer;
7
+ parentApi: VectorLayerApi<any, any>;
8
+ config: StartFinishDecoration;
9
+ };
10
+ export declare class StartFinishDecorationManager {
11
+ private readonly source;
12
+ private readonly layer;
13
+ private readonly config;
14
+ private readonly map;
15
+ private readonly parentLayer;
16
+ private readonly parentApi;
17
+ private readonly moveEndKey;
18
+ private readonly visibilityKey;
19
+ private readonly unsubCollection;
20
+ private readonly unsubChanges;
21
+ private rafId;
22
+ constructor(options: StartFinishDecorationManagerOptions);
23
+ private scheduleUpdate;
24
+ private rebuild;
25
+ private syncVisibility;
26
+ private syncOpacity;
27
+ dispose(): void;
28
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Опции композита вида карты.
3
+ */
4
+ export type CompositeOptions = {
5
+ /** Фон, заливается ПОД слоями (для jpeg / прозрачных зазоров тайлов). `undefined` и `''` — не заливать. */
6
+ background?: string;
7
+ };
8
+ /**
9
+ * Композитит canvas'ы ОДНОГО viewport карты в офскрин-canvas заданного размера.
10
+ *
11
+ * Берёт только `.ol-layer canvas` внутри переданного `viewport` (а не из всего
12
+ * документа), применяя per-canvas `opacity` родителя и матрицу `style.transform`
13
+ * по образцу официального примера экспорта OpenLayers. Размер результата всегда
14
+ * равен `[width, height]`; high-DPR backing слоёв ужимается в него через матрицу.
15
+ */
16
+ export declare function compositeViewport(viewport: HTMLElement, [width, height]: [number, number], opts?: CompositeOptions): HTMLCanvasElement;
@@ -0,0 +1,15 @@
1
+ import type OlMap from 'ol/Map';
2
+ import type { MapExportImageOptions } from '../../public/types';
3
+ /**
4
+ * Создаёт функцию `exportImage` для конкретной карты.
5
+ *
6
+ * Параллельные вызовы сериализуются (общий мутируемый `map`): каждый следующий
7
+ * экспорт стартует только после завершения предыдущего. Цикл одного экспорта:
8
+ * snapshot → setSize → fit → ожидание `rendercomplete` → композит → restore.
9
+ *
10
+ * Инвариант: подписка `map.once('rendercomplete')` и последующие
11
+ * `setSize`/`fit`/`render` выполняются синхронно (никаких `await` до подписки),
12
+ * иначе следующий экспорт мог бы поймать `rendercomplete` от restore-рендера
13
+ * предыдущего.
14
+ */
15
+ export declare function createExportImage(map: OlMap): (options: MapExportImageOptions) => Promise<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aur-openlayers",
3
- "version": "19.6.10",
3
+ "version": "19.6.12",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",