@gisatcz/deckgl-geolib 2.5.0-dev.5 → 2.5.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.
@@ -1,21 +1,28 @@
1
1
  import { GeoTIFF, GeoTIFFImage } from 'geotiff';
2
2
  import GeoImage from './GeoImage';
3
- import { GeoImageOptions, TileResult, TypedArray } from './types';
3
+ import { GeoImageOptions, TileResult } from './types';
4
4
  export type Bounds = [minX: number, minY: number, maxX: number, maxY: number];
5
5
  declare class CogTiles {
6
- cog: GeoTIFF;
6
+ cog?: GeoTIFF;
7
7
  cogZoomLookup: number[];
8
8
  cogResolutionLookup: number[];
9
+ cogMeshMaxErrorLookup: number[];
9
10
  cogOrigin: number[];
10
11
  zoomRange: number[];
11
12
  tileSize: number;
12
13
  bounds: [number, number, number, number];
13
14
  geo: GeoImage;
14
15
  options: GeoImageOptions;
16
+ private tileResultCache;
17
+ private readonly tileResultCacheMaxSize;
18
+ private getTileResultCacheKey;
19
+ /** Clears the TileResult cache. Call when the COG URL or meshMaxError changes. */
20
+ clearTileResultCache(): void;
15
21
  private rasterCache;
16
- private readonly maxCacheSize;
17
- private getCachedRaster;
18
- private setCachedRaster;
22
+ private readonly rasterCacheMaxSize;
23
+ private reliefMaskCache;
24
+ private readonly reliefMaskCacheMaxSize;
25
+ private getTileCacheKey;
19
26
  private imageCache;
20
27
  private initializePromise?;
21
28
  private lastInitializedUrl?;
@@ -27,6 +34,26 @@ declare class CogTiles {
27
34
  getZoomLevelFromResolution(tileSize: number, resolution: number): number;
28
35
  getBoundsAsLatLon(): [number, number, number, number];
29
36
  getLatLon(input: number[]): [number, number];
37
+ /**
38
+ * Calculates the error multiplier based on zoom level and COG zoom range.
39
+ * - z >= maxZ: multiplier = 0.5 (fine meshes at high zoom, maximum precision)
40
+ * - z <= minZ: multiplier = 3.0 (coarse meshes at low zoom, maximum performance)
41
+ * - Otherwise: linear interpolation between 3.0 and 0.5
42
+ */
43
+ private getErrorMultiplierForZoom;
44
+ /**
45
+ * Calculates dynamic meshMaxError for a given zoom level and resolution.
46
+ * Formula: resolution * errorMultiplier, where multiplier scales from 3.0 (low zoom) to 0.5 (high zoom).
47
+ * Results are clamped to 0.5–100 meters to prevent pathological tessellation:
48
+ * - Min 0.5m ensures simplification always happens (no rounding to 0 with sub-meter pixels)
49
+ * - Max 100m prevents excessive simplification at low zoom with low-resolution COGs
50
+ */
51
+ private calculateDynamicMeshMaxError;
52
+ /**
53
+ * Gets the auto meshMaxError for a given overview index.
54
+ * Returns undefined if auto lookup has not been computed.
55
+ */
56
+ getMeshMaxErrorForImageIndex(imageIndex: number): number | undefined;
30
57
  /**
31
58
  * Builds lookup tables for zoom levels and estimated resolutions from a Cloud Optimized GeoTIFF (COG) object.
32
59
  *
@@ -43,6 +70,13 @@ declare class CogTiles {
43
70
  * - The second array (`resolutionLookup`) maps each image index to its estimated resolution (m/pixel).
44
71
  */
45
72
  buildCogZoomResolutionLookup(cog: GeoTIFF): Promise<number[][]>;
73
+ /**
74
+ * Computes dynamic meshMaxError values for each overview based on COG resolution and zoom level.
75
+ * Called only for terrain COGs after buildCogZoomResolutionLookup() completes.
76
+ * Each overview's meshMaxError is calculated as: resolution * zoom-based multiplier, rounded to nearest integer.
77
+ * Multiplier ranges from 3.0 at minZ (coarse meshes) to 0.5 at maxZ (fine meshes).
78
+ */
79
+ private computeMeshMaxErrorLookup;
46
80
  /**
47
81
  * Determines the appropriate image index from the Cloud Optimized GeoTIFF (COG)
48
82
  * that best matches a given zoom level.
@@ -55,13 +89,13 @@ declare class CogTiles {
55
89
  * @returns {number} The index of the image in the COG that best matches the specified zoom level.
56
90
  */
57
91
  getImageIndexForZoomLevel(zoom: number): number;
58
- getTileFromImage(tileX: number, tileY: number, zoom: number, fetchSize?: number, signal?: AbortSignal): Promise<TypedArray[]>;
92
+ getTileFromImage(tileX: number, tileY: number, zoom: number, fetchSize?: number, signal?: AbortSignal): Promise<(Uint8Array<ArrayBuffer> | Float32Array<ArrayBuffer> | Int8Array<ArrayBuffer> | Int16Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Float64Array<ArrayBuffer>)[] | import("geotiff").TypedArrayWithDimensions[]>;
59
93
  /**
60
94
  * Creates a blank tile buffer filled with the "No Data" value.
61
95
  * @param size The width/height of the square tile (e.g., 256 or 257)
62
96
  */
63
97
  createEmptyTile(size?: number): Float32Array<ArrayBuffer>;
64
- getTile(x: number, y: number, z: number, bounds?: Bounds, meshMaxError?: number, signal?: AbortSignal): Promise<TileResult | null>;
98
+ getTile(x: number, y: number, z: number, bounds?: Bounds, meshMaxError?: number, signal?: AbortSignal, skipTexture?: boolean): Promise<TileResult | null>;
65
99
  /**
66
100
  * Determines the data type (e.g., "Int32", "Float64") of a GeoTIFF image
67
101
  * by reading its TIFF tags.
@@ -1,11 +1,3 @@
1
- /**
2
- * KernelGenerator — 3×3 neighborhood kernel calculations on elevation rasters.
3
- *
4
- * Input contract: a Float32Array of 258×258 elevation values (row-major).
5
- * Edge pixels (row/col 0 and 257) are used only as kernel neighbors and do
6
- * not appear in the output.
7
- * Output: Float32Array of 256×256 computed values.
8
- */
9
1
  export declare class KernelGenerator {
10
2
  /**
11
3
  * Compute terrain gradients (dzdx, dzdy) using Horn's method.
@@ -0,0 +1,2 @@
1
+ export declare function toF32(n: number): number;
2
+ export declare function isF32NoData(val: number, noData?: number | null): boolean;
@@ -53,6 +53,8 @@ export type GeoImageOptions = {
53
53
  useDataForOpacity?: boolean;
54
54
  useSingleColor?: boolean;
55
55
  blurredTexture?: boolean;
56
+ /** When true, skip generating a texture bitmap for this tile (mesh-only path). */
57
+ skipTexture?: boolean;
56
58
  clipLow?: number | null;
57
59
  clipHigh?: number | null;
58
60
  color?: ChromaColorInput;
@@ -76,6 +78,8 @@ export type GeoImageOptions = {
76
78
  useSwissRelief?: boolean;
77
79
  swissSlopeWeight?: number;
78
80
  useReliefGlaze?: boolean;
81
+ /** Strategy for detecting all-noData tiles. Options: 'full' | 'border+center' */
82
+ noDataCheck?: 'full' | 'border+center';
79
83
  disableLighting?: boolean;
80
84
  };
81
85
  export declare const DefaultGeoImageOptions: GeoImageOptions;
@@ -103,3 +107,12 @@ export interface TileResult {
103
107
  /** Optional: grayscale or color bitmap for Swiss relief or other overlays */
104
108
  bitmap?: Uint8ClampedArray | ImageBitmap;
105
109
  }
110
+ /**
111
+ * Stores full TileResult including texture because:
112
+ * - Kernel computations (slope/hillshade/swiss relief → rawDerived) are expensive and cached
113
+ * - Texture generation from rawDerived is cheap (colorization only)
114
+ * - But caching texture avoids ImageBitmap regeneration overhead
115
+ * - For BitmapLayer: texture IS the primary output (must cache)
116
+ * Cache is cleared on URL/meshMaxError changes.
117
+ */
118
+ export type CachedTileResult = TileResult;
@@ -17,7 +17,7 @@ export declare const urlType: {
17
17
  export type ClampToTerrainOptions = {
18
18
  terrainDrawMode?: string;
19
19
  };
20
- type MeshAndTexture = TileResult;
20
+ type MeshAndTexture = TileResult | null;
21
21
  /** Props added by the CogBitmapLayer */
22
22
  type _CogBitmapLayerProps = {
23
23
  /** Image url that encodes raster data. * */
@@ -56,12 +56,12 @@ export default class CogBitmapLayer<ExtraPropsT extends object = object> extends
56
56
  initializeState(context: any): Promise<void>;
57
57
  init(): Promise<void>;
58
58
  updateState({ props, oldProps }: UpdateParameters<this>): void;
59
- getTiledBitmapData(tile: TileLoadProps): Promise<TileResult>;
60
- renderSubLayers(props: TileLayerProps<TileResult> & {
59
+ getTiledBitmapData(tile: TileLoadProps): Promise<TileResult | null>;
60
+ renderSubLayers(props: TileLayerProps<TileResult | null> & {
61
61
  id: string;
62
- data: TileResult;
63
- tile: Tile2DHeader<TileResult>;
62
+ data: TileResult | null;
63
+ tile: Tile2DHeader<TileResult | null>;
64
64
  }): BitmapLayer<{}> | null;
65
- renderLayers(): TileLayer<TileResult, {}> | null;
65
+ renderLayers(): TileLayer<TileResult | null, {}> | null;
66
66
  }
67
67
  export {};
@@ -29,7 +29,7 @@ type TerrainLoadProps = {
29
29
  };
30
30
  type MeshAndTexture = [TileResult | null, TextureSource | null];
31
31
  /** All properties supported by CogTerrainLayer */
32
- export type CogTerrainLayerProps = _CogTerrainLayerProps & TileLayerProps<MeshAndTexture> & CompositeLayerProps;
32
+ export type CogTerrainLayerProps = _CogTerrainLayerProps & TileLayerProps<MeshAndTexture | null> & CompositeLayerProps;
33
33
  /** Props added by the CogTerrainLayer */
34
34
  type _CogTerrainLayerProps = {
35
35
  /** Image url that encodes height data. * */
@@ -37,8 +37,8 @@ type _CogTerrainLayerProps = {
37
37
  isTiled?: boolean;
38
38
  /** Image url to use as texture. * */
39
39
  texture?: URLTemplate;
40
- /** Martini error tolerance in meters, smaller number -> more detailed mesh. * */
41
- meshMaxError?: number;
40
+ /** Martini error tolerance in meters, smaller number -> more detailed mesh. Set to 'auto' for dynamic per-zoom quantization. * */
41
+ meshMaxError?: number | 'auto';
42
42
  /** Bounding box of the terrain image, [minX, minY, maxX, maxY] in world coordinates. * */
43
43
  bounds?: Bounds | null;
44
44
  /** Color to use if texture is unavailable. * */
@@ -67,7 +67,7 @@ type _CogTerrainLayerProps = {
67
67
  workerUrl?: string;
68
68
  };
69
69
  /** Render mesh surfaces from height map images. */
70
- export default class CogTerrainLayer<ExtraPropsT extends object = object> extends CompositeLayer<ExtraPropsT & Required<_CogTerrainLayerProps & Required<TileLayerProps<MeshAndTexture>>>> {
70
+ export default class CogTerrainLayer<ExtraPropsT extends object = object> extends CompositeLayer<ExtraPropsT & Required<_CogTerrainLayerProps & Required<TileLayerProps<MeshAndTexture | null>>>> {
71
71
  static defaultProps: DefaultProps<_CogTerrainLayerProps>;
72
72
  static layerName: string;
73
73
  terrainUrl: string;
@@ -84,13 +84,13 @@ export default class CogTerrainLayer<ExtraPropsT extends object = object> extend
84
84
  init(): Promise<void>;
85
85
  updateState({ props, oldProps }: UpdateParameters<this>): void;
86
86
  loadTerrain({ elevationData, bounds, elevationDecoder, meshMaxError, signal, }: TerrainLoadProps): Promise<MeshAttributes> | null;
87
- getTiledTerrainData(tile: TileLoadProps): Promise<MeshAndTexture>;
88
- renderSubLayers(props: TileLayerProps<MeshAndTexture> & {
87
+ getTiledTerrainData(tile: TileLoadProps): Promise<MeshAndTexture | null>;
88
+ renderSubLayers(props: TileLayerProps<MeshAndTexture | null> & {
89
89
  id: string;
90
- data: MeshAndTexture;
91
- tile: Tile2DHeader<MeshAndTexture>;
90
+ data: MeshAndTexture | null;
91
+ tile: Tile2DHeader<MeshAndTexture | null>;
92
92
  }): SimpleMeshLayer<any, {}> | null;
93
- onViewportLoad(tiles?: Tile2DHeader<MeshAndTexture>[]): void;
93
+ onViewportLoad(tiles?: Tile2DHeader<MeshAndTexture | null>[]): void;
94
94
  renderLayers(): Layer | null | LayersList;
95
95
  }
96
96
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gisatcz/deckgl-geolib",
3
- "version": "2.5.0-dev.5",
3
+ "version": "2.5.0",
4
4
  "description": "Deck.gl extension for rendering Cloud-Optimized GeoTIFF (COG) data",
5
5
  "keywords": [
6
6
  "deck.gl",