@developmentseed/deck.gl-geotiff 0.1.0-beta.6 → 0.2.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.
Files changed (59) hide show
  1. package/dist/cog-layer.d.ts +114 -9
  2. package/dist/cog-layer.d.ts.map +1 -1
  3. package/dist/cog-layer.js +126 -95
  4. package/dist/cog-layer.js.map +1 -1
  5. package/dist/cog-tile-matrix-set.d.ts +22 -1
  6. package/dist/cog-tile-matrix-set.d.ts.map +1 -1
  7. package/dist/cog-tile-matrix-set.js +25 -24
  8. package/dist/cog-tile-matrix-set.js.map +1 -1
  9. package/dist/ellipsoids.d.ts +1 -1
  10. package/dist/ellipsoids.js +1 -1
  11. package/dist/geotiff/geotiff.d.ts +59 -0
  12. package/dist/geotiff/geotiff.d.ts.map +1 -0
  13. package/dist/geotiff/geotiff.js +146 -0
  14. package/dist/geotiff/geotiff.js.map +1 -0
  15. package/dist/geotiff/index.d.ts +1 -0
  16. package/dist/geotiff/index.d.ts.map +1 -0
  17. package/dist/geotiff/index.js +2 -0
  18. package/dist/geotiff/index.js.map +1 -0
  19. package/dist/geotiff/render-pipeline.d.ts +13 -0
  20. package/dist/geotiff/render-pipeline.d.ts.map +1 -0
  21. package/dist/geotiff/render-pipeline.js +149 -0
  22. package/dist/geotiff/render-pipeline.js.map +1 -0
  23. package/dist/geotiff/texture.d.ts +14 -0
  24. package/dist/geotiff/texture.d.ts.map +1 -0
  25. package/dist/geotiff/texture.js +134 -0
  26. package/dist/geotiff/texture.js.map +1 -0
  27. package/dist/geotiff/types.d.ts +34 -0
  28. package/dist/geotiff/types.d.ts.map +1 -0
  29. package/dist/geotiff/types.js +18 -0
  30. package/dist/geotiff/types.js.map +1 -0
  31. package/dist/geotiff-layer.d.ts +42 -3
  32. package/dist/geotiff-layer.d.ts.map +1 -1
  33. package/dist/geotiff-layer.js +21 -7
  34. package/dist/geotiff-layer.js.map +1 -1
  35. package/dist/geotiff-reprojection.d.ts +5 -11
  36. package/dist/geotiff-reprojection.d.ts.map +1 -1
  37. package/dist/geotiff-reprojection.js +8 -37
  38. package/dist/geotiff-reprojection.js.map +1 -1
  39. package/dist/index.d.ts +12 -4
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +8 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/mosaic-layer/mosaic-layer.d.ts +31 -0
  44. package/dist/mosaic-layer/mosaic-layer.d.ts.map +1 -0
  45. package/dist/mosaic-layer/mosaic-layer.js +59 -0
  46. package/dist/mosaic-layer/mosaic-layer.js.map +1 -0
  47. package/dist/mosaic-layer/mosaic-tileset-2d.d.ts +42 -0
  48. package/dist/mosaic-layer/mosaic-tileset-2d.d.ts.map +1 -0
  49. package/dist/mosaic-layer/mosaic-tileset-2d.js +44 -0
  50. package/dist/mosaic-layer/mosaic-tileset-2d.js.map +1 -0
  51. package/dist/proj.d.ts +24 -0
  52. package/dist/proj.d.ts.map +1 -0
  53. package/dist/proj.js +46 -0
  54. package/dist/proj.js.map +1 -0
  55. package/package.json +14 -18
  56. package/dist/geotiff.d.ts +0 -31
  57. package/dist/geotiff.d.ts.map +0 -1
  58. package/dist/geotiff.js +0 -70
  59. package/dist/geotiff.js.map +0 -1
@@ -1,11 +1,59 @@
1
- import type { CompositeLayerProps, UpdateParameters } from "@deck.gl/core";
1
+ import type { CompositeLayerProps, Layer, LayersList, UpdateParameters } from "@deck.gl/core";
2
2
  import { CompositeLayer } from "@deck.gl/core";
3
+ import type { _Tile2DHeader as Tile2DHeader, TileLayerProps, _TileLoadProps as TileLoadProps } from "@deck.gl/geo-layers";
3
4
  import { TileLayer } from "@deck.gl/geo-layers";
4
- import type { TileMatrixSet } from "@developmentseed/deck.gl-raster";
5
+ import type { RasterModule, TileMatrixSet } from "@developmentseed/deck.gl-raster";
5
6
  import type { ReprojectionFns } from "@developmentseed/raster-reproject";
6
- import type { GeoTIFF, GeoTIFFImage, Pool } from "geotiff";
7
- export interface COGLayerProps extends CompositeLayerProps {
8
- geotiff: GeoTIFF;
7
+ import type { Device } from "@luma.gl/core";
8
+ import type { BaseClient, GeoTIFF, GeoTIFFImage, Pool } from "geotiff";
9
+ import type { TextureDataT } from "./geotiff/render-pipeline.js";
10
+ import type { GeoKeysParser, ProjectionInfo } from "./proj.js";
11
+ /**
12
+ * Minimum interface that **must** be returned from getTileData.
13
+ */
14
+ export type MinimalDataT = {
15
+ height: number;
16
+ width: number;
17
+ };
18
+ export type DefaultDataT = MinimalDataT & {
19
+ texture: ImageData;
20
+ };
21
+ /** Options passed to `getTileData`. */
22
+ export type GetTileDataOptions = {
23
+ /** The luma.gl Device */
24
+ device: Device;
25
+ /** the subset to read data from in pixels. */
26
+ window?: [number, number, number, number];
27
+ /** An AbortSignal that may be signalled if the request is to be aborted */
28
+ signal?: AbortSignal;
29
+ /** The decoder pool to use. */
30
+ pool: Pool;
31
+ };
32
+ type GetTileDataResult<DataT> = {
33
+ data: DataT;
34
+ forwardTransform: ReprojectionFns["forwardTransform"];
35
+ inverseTransform: ReprojectionFns["inverseTransform"];
36
+ };
37
+ export interface COGLayerProps<DataT extends MinimalDataT = DefaultDataT> extends CompositeLayerProps {
38
+ /**
39
+ * GeoTIFF input.
40
+ *
41
+ * - URL string pointing to a COG
42
+ * - ArrayBuffer containing the COG data
43
+ * - Blob containing the COG data
44
+ * - An instance of GeoTIFF.js's GeoTIFF class
45
+ * - An instance of GeoTIFF.js's BaseClient for custom fetching
46
+ */
47
+ geotiff: GeoTIFF | string | ArrayBuffer | Blob | BaseClient;
48
+ /**
49
+ * A function callback for parsing GeoTIFF geo keys to a Proj4 compatible
50
+ * definition.
51
+ *
52
+ * By default, uses epsg.io to resolve EPSG codes found in the GeoTIFF.
53
+ * Alternatively, you may want to use `geotiff-geokeys-to-proj4`, which is
54
+ * more extensive but adds 1.5MB to your bundle size.
55
+ */
56
+ geoKeysParser?: GeoKeysParser;
9
57
  /**
10
58
  * GeoTIFF.js Pool for decoding image chunks.
11
59
  *
@@ -19,6 +67,26 @@ export interface COGLayerProps extends CompositeLayerProps {
19
67
  * @default 0.125
20
68
  */
21
69
  maxError?: number;
70
+ /**
71
+ * User-defined method to load data for a tile.
72
+ *
73
+ * The default implementation loads an RGBA image using geotiff.js's readRGB
74
+ * method, returning an ImageData object.
75
+ *
76
+ * For more customizability, you can also return a Texture object from
77
+ * luma.gl, along with optional custom shaders for the RasterLayer.
78
+ */
79
+ getTileData?: (image: GeoTIFFImage, options: GetTileDataOptions) => Promise<DataT>;
80
+ /**
81
+ * User-defined method to render data for a tile.
82
+ *
83
+ * This receives the data returned by getTileData and must return a render
84
+ * pipeline.
85
+ *
86
+ * The default implementation returns an object with a `texture` property,
87
+ * assuming that this texture is already renderable.
88
+ */
89
+ renderTile: (data: DataT) => ImageData | RasterModule[];
22
90
  /**
23
91
  * Enable debug visualization showing the triangulation mesh
24
92
  * @default false
@@ -29,25 +97,62 @@ export interface COGLayerProps extends CompositeLayerProps {
29
97
  * @default 0.5
30
98
  */
31
99
  debugOpacity?: number;
100
+ /**
101
+ * Called when the GeoTIFF metadata has been loaded and parsed.
102
+ *
103
+ * @param {GeoTIFF} geotiff
104
+ * @param {ProjectionInfo} projection
105
+ */
106
+ onGeoTIFFLoad?: (geotiff: GeoTIFF, options: {
107
+ projection: ProjectionInfo;
108
+ /**
109
+ * Bounds of the image in geographic coordinates (WGS84) [minLon, minLat,
110
+ * maxLon, maxLat]
111
+ */
112
+ geographicBounds: {
113
+ west: number;
114
+ south: number;
115
+ east: number;
116
+ north: number;
117
+ };
118
+ }) => void;
119
+ /** A user-provided AbortSignal to cancel loading.
120
+ *
121
+ * This can be useful in combination with the MosaicLayer, so that when a
122
+ * mosaic source is out of the viewport, all of its tile requests are
123
+ * automatically aborted.
124
+ */
125
+ signal?: AbortSignal;
32
126
  }
33
127
  /**
34
128
  * COGLayer renders a COG using a tiled approach with reprojection.
35
129
  */
36
- export declare class COGLayer extends CompositeLayer<COGLayerProps> {
130
+ export declare class COGLayer<DataT extends MinimalDataT = DefaultDataT> extends CompositeLayer<COGLayerProps<DataT>> {
37
131
  static layerName: string;
38
- static defaultProps: {
39
- maxError: number;
40
- };
132
+ static defaultProps: Partial<COGLayerProps<DefaultDataT>>;
41
133
  state: {
42
134
  forwardReproject?: ReprojectionFns["forwardReproject"];
43
135
  inverseReproject?: ReprojectionFns["inverseReproject"];
44
136
  metadata?: TileMatrixSet;
45
137
  images?: GeoTIFFImage[];
138
+ defaultGetTileData?: COGLayerProps<TextureDataT>["getTileData"];
139
+ defaultRenderTile?: COGLayerProps<TextureDataT>["renderTile"];
46
140
  };
47
141
  initializeState(): void;
48
142
  updateState(params: UpdateParameters<this>): void;
49
143
  _parseGeoTIFF(): Promise<void>;
144
+ /**
145
+ * Inner callback passed in to the underlying TileLayer's `getTileData`.
146
+ */
147
+ _getTileData(tile: TileLoadProps, images: GeoTIFFImage[], metadata: TileMatrixSet): Promise<GetTileDataResult<DataT>>;
148
+ _renderSubLayers(props: TileLayerProps<GetTileDataResult<DataT>> & {
149
+ id: string;
150
+ data?: GetTileDataResult<DataT>;
151
+ _offset: number;
152
+ tile: Tile2DHeader<GetTileDataResult<DataT>>;
153
+ }, metadata: TileMatrixSet, forwardReproject: ReprojectionFns["forwardReproject"], inverseReproject: ReprojectionFns["inverseReproject"]): Layer | LayersList | null;
50
154
  renderTileLayer(metadata: TileMatrixSet, forwardReproject: ReprojectionFns["forwardReproject"], inverseReproject: ReprojectionFns["inverseReproject"], images: GeoTIFFImage[]): TileLayer;
51
155
  renderLayers(): TileLayer<any, {}> | null;
52
156
  }
157
+ export {};
53
158
  //# sourceMappingURL=cog-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cog-layer.d.ts","sourceRoot":"","sources":["../src/cog-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAEnB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAe3D,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,qBAAa,QAAS,SAAQ,cAAc,CAAC,aAAa,CAAC;IACzD,OAAgB,SAAS,SAAc;IACvC,OAAgB,YAAY;;MAAgB;IAEpC,KAAK,EAAE;QACb,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACvD,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;QACvD,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC;IAEO,eAAe,IAAI,IAAI;IAIvB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAa7C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCpC,eAAe,CACb,QAAQ,EAAE,aAAa,EACvB,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,EACrD,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,EACrD,MAAM,EAAE,YAAY,EAAE,GACrB,SAAS;IA8IZ,YAAY;CAiBb"}
1
+ {"version":3,"file":"cog-layer.d.ts","sourceRoot":"","sources":["../src/cog-layer.ts"],"names":[],"mappings":"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"}
package/dist/cog-layer.js CHANGED
@@ -4,11 +4,14 @@ import { PathLayer } from "@deck.gl/layers";
4
4
  import { RasterLayer, RasterTileset2D } from "@developmentseed/deck.gl-raster";
5
5
  import proj4 from "proj4";
6
6
  import { parseCOGTileMatrixSet } from "./cog-tile-matrix-set.js";
7
- import { fromGeoTransform, getGeoTIFFProjection, } from "./geotiff-reprojection.js";
8
- import { defaultPool, loadRgbImage } from "./geotiff.js";
9
- const DEFAULT_MAX_ERROR = 0.125;
7
+ import { defaultPool, fetchGeoTIFF, getGeographicBounds, } from "./geotiff/geotiff.js";
8
+ import { inferRenderPipeline } from "./geotiff/render-pipeline.js";
9
+ import { fromGeoTransform } from "./geotiff-reprojection.js";
10
+ import { epsgIoGeoKeyParser } from "./proj.js";
10
11
  const defaultProps = {
11
- maxError: DEFAULT_MAX_ERROR,
12
+ geoKeysParser: epsgIoGeoKeyParser,
13
+ debug: false,
14
+ debugOpacity: 0.5,
12
15
  };
13
16
  /**
14
17
  * COGLayer renders a COG using a tiled approach with reprojection.
@@ -28,30 +31,142 @@ export class COGLayer extends CompositeLayer {
28
31
  }
29
32
  }
30
33
  async _parseGeoTIFF() {
31
- const { geotiff } = this.props;
32
- const metadata = await parseCOGTileMatrixSet(geotiff);
34
+ const geotiff = await fetchGeoTIFF(this.props.geotiff);
35
+ const geoKeysParser = this.props.geoKeysParser;
36
+ const metadata = await parseCOGTileMatrixSet(geotiff, geoKeysParser);
33
37
  const image = await geotiff.getImage();
34
38
  const imageCount = await geotiff.getImageCount();
35
39
  const images = [];
36
40
  for (let imageIdx = 0; imageIdx < imageCount; imageIdx++) {
37
41
  images.push(await geotiff.getImage(imageIdx));
38
42
  }
39
- const sourceProjection = await getGeoTIFFProjection(image);
43
+ const sourceProjection = await geoKeysParser(image.getGeoKeys());
40
44
  if (!sourceProjection) {
41
45
  throw new Error("Could not determine source projection from GeoTIFF geo keys");
42
46
  }
43
- const converter = proj4(sourceProjection, "EPSG:4326");
47
+ const converter = proj4(sourceProjection.def, "EPSG:4326");
44
48
  const forwardReproject = (x, y) => converter.forward([x, y], false);
45
49
  const inverseReproject = (x, y) => converter.inverse([x, y], false);
50
+ if (this.props.onGeoTIFFLoad) {
51
+ const geographicBounds = getGeographicBounds(image, converter);
52
+ this.props.onGeoTIFFLoad(geotiff, {
53
+ projection: sourceProjection,
54
+ geographicBounds,
55
+ });
56
+ }
57
+ const { getTileData: defaultGetTileData, renderTile: defaultRenderTile } = inferRenderPipeline(image.fileDirectory, this.context.device);
46
58
  this.setState({
47
59
  metadata,
48
60
  forwardReproject,
49
61
  inverseReproject,
50
62
  images,
63
+ defaultGetTileData,
64
+ defaultRenderTile,
65
+ });
66
+ }
67
+ /**
68
+ * Inner callback passed in to the underlying TileLayer's `getTileData`.
69
+ */
70
+ async _getTileData(tile, images, metadata) {
71
+ const { signal } = tile;
72
+ const { x, y, z } = tile.index;
73
+ // Select overview image
74
+ const geotiffImage = images[images.length - 1 - z];
75
+ const imageHeight = geotiffImage.getHeight();
76
+ const imageWidth = geotiffImage.getWidth();
77
+ const tileMatrix = metadata.tileMatrices[z];
78
+ const { tileWidth, tileHeight } = tileMatrix;
79
+ const tileGeotransform = computeTileGeotransform(x, y, tileMatrix);
80
+ const { forwardTransform, inverseTransform } = fromGeoTransform(tileGeotransform);
81
+ const window = [
82
+ x * tileWidth,
83
+ y * tileHeight,
84
+ Math.min((x + 1) * tileWidth, imageWidth),
85
+ Math.min((y + 1) * tileHeight, imageHeight),
86
+ ];
87
+ const getTileData = this.props.getTileData || this.state.defaultGetTileData;
88
+ // Combine abort signals if both are defined
89
+ const combinedSignal = signal && this.props.signal
90
+ ? AbortSignal.any([signal, this.props.signal])
91
+ : signal || this.props.signal;
92
+ const data = await getTileData(geotiffImage, {
93
+ device: this.context.device,
94
+ window,
95
+ signal: combinedSignal,
96
+ pool: this.props.pool || defaultPool(),
51
97
  });
98
+ return {
99
+ // @ts-expect-error type mismatch when using provided getTileData
100
+ data,
101
+ forwardTransform,
102
+ inverseTransform,
103
+ };
104
+ }
105
+ _renderSubLayers(
106
+ // TODO: it would be nice to have a cleaner type here
107
+ // this is copy-pasted from the upstream tile layer definition for props.
108
+ props, metadata, forwardReproject, inverseReproject) {
109
+ const { maxError, debug, debugOpacity } = this.props;
110
+ const { tile } = props;
111
+ if (!props.data) {
112
+ return null;
113
+ }
114
+ const { data, forwardTransform, inverseTransform } = props.data;
115
+ const layers = [];
116
+ if (data) {
117
+ const { height, width } = data;
118
+ const renderTile = this.props.renderTile || this.state.defaultRenderTile;
119
+ layers.push(new RasterLayer({
120
+ id: `${props.id}-raster`,
121
+ width,
122
+ height,
123
+ renderPipeline: renderTile(data),
124
+ maxError,
125
+ reprojectionFns: {
126
+ forwardTransform,
127
+ inverseTransform,
128
+ forwardReproject,
129
+ inverseReproject,
130
+ },
131
+ debug,
132
+ debugOpacity,
133
+ }));
134
+ }
135
+ if (debug) {
136
+ // Get projected bounds from tile data
137
+ // getTileMetadata returns data that includes projectedBounds
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ const projectedBounds = tile?.projectedBounds;
140
+ if (!projectedBounds || !metadata) {
141
+ return [];
142
+ }
143
+ // Project bounds from image CRS to WGS84
144
+ const { topLeft, topRight, bottomLeft, bottomRight } = projectedBounds;
145
+ const topLeftWgs84 = metadata.projectToWgs84(topLeft);
146
+ const topRightWgs84 = metadata.projectToWgs84(topRight);
147
+ const bottomRightWgs84 = metadata.projectToWgs84(bottomRight);
148
+ const bottomLeftWgs84 = metadata.projectToWgs84(bottomLeft);
149
+ // Create a closed path around the tile bounds
150
+ const path = [
151
+ topLeftWgs84,
152
+ topRightWgs84,
153
+ bottomRightWgs84,
154
+ bottomLeftWgs84,
155
+ topLeftWgs84, // Close the path
156
+ ];
157
+ layers.push(new PathLayer({
158
+ id: `${this.id}-${tile.id}-bounds`,
159
+ data: [path],
160
+ getPath: (d) => d,
161
+ getColor: [255, 0, 0, 255], // Red
162
+ getWidth: 2,
163
+ widthUnits: "pixels",
164
+ pickable: false,
165
+ }));
166
+ }
167
+ return layers;
52
168
  }
53
169
  renderTileLayer(metadata, forwardReproject, inverseReproject, images) {
54
- const { maxError, debug = false, debugOpacity = 0.5 } = this.props;
55
170
  // Create a factory class that wraps COGTileset2D with the metadata
56
171
  class RasterTileset2DFactory extends RasterTileset2D {
57
172
  constructor(opts) {
@@ -61,92 +176,8 @@ export class COGLayer extends CompositeLayer {
61
176
  return new TileLayer({
62
177
  id: `cog-tile-layer-${this.id}`,
63
178
  TilesetClass: RasterTileset2DFactory,
64
- getTileData: async (tile) => {
65
- const { signal } = tile;
66
- const { x, y, z } = tile.index;
67
- // Select overview image
68
- const geotiffImage = images[images.length - 1 - z];
69
- const imageHeight = geotiffImage.getHeight();
70
- const imageWidth = geotiffImage.getWidth();
71
- const tileMatrix = metadata.tileMatrices[z];
72
- const { tileWidth, tileHeight } = tileMatrix;
73
- const tileGeotransform = computeTileGeotransform(x, y, tileMatrix);
74
- const { pixelToInputCRS, inputCRSToPixel } = fromGeoTransform(tileGeotransform);
75
- const window = [
76
- x * tileWidth,
77
- y * tileHeight,
78
- Math.min((x + 1) * tileWidth, imageWidth),
79
- Math.min((y + 1) * tileHeight, imageHeight),
80
- ];
81
- const { imageData, height, width } = await loadRgbImage(geotiffImage, {
82
- window,
83
- signal,
84
- pool: this.props.pool || defaultPool(),
85
- });
86
- return {
87
- image: imageData,
88
- height,
89
- width,
90
- pixelToInputCRS,
91
- inputCRSToPixel,
92
- };
93
- },
94
- renderSubLayers: (props) => {
95
- const { tile, data } = props;
96
- const layers = [];
97
- if (data) {
98
- const { image, height, width, pixelToInputCRS, inputCRSToPixel, } = data;
99
- const rasterLayer = new RasterLayer({
100
- id: `${props.id}-raster`,
101
- width,
102
- height,
103
- texture: image,
104
- maxError,
105
- reprojectionFns: {
106
- pixelToInputCRS,
107
- inputCRSToPixel,
108
- forwardReproject,
109
- inverseReproject,
110
- },
111
- debug,
112
- debugOpacity,
113
- });
114
- layers.push(rasterLayer);
115
- }
116
- if (debug) {
117
- // Get projected bounds from tile data
118
- // getTileMetadata returns data that includes projectedBounds
119
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
- const projectedBounds = tile?.projectedBounds;
121
- if (!projectedBounds || !metadata) {
122
- return [];
123
- }
124
- // Project bounds from image CRS to WGS84
125
- const { topLeft, topRight, bottomLeft, bottomRight } = projectedBounds;
126
- const topLeftWgs84 = metadata.projectToWgs84(topLeft);
127
- const topRightWgs84 = metadata.projectToWgs84(topRight);
128
- const bottomRightWgs84 = metadata.projectToWgs84(bottomRight);
129
- const bottomLeftWgs84 = metadata.projectToWgs84(bottomLeft);
130
- // Create a closed path around the tile bounds
131
- const path = [
132
- topLeftWgs84,
133
- topRightWgs84,
134
- bottomRightWgs84,
135
- bottomLeftWgs84,
136
- topLeftWgs84, // Close the path
137
- ];
138
- layers.push(new PathLayer({
139
- id: `${tile.id}-bounds`,
140
- data: [{ path }],
141
- getPath: (d) => d.path,
142
- getColor: [255, 0, 0, 255], // Red
143
- getWidth: 2,
144
- widthUnits: "pixels",
145
- pickable: false,
146
- }));
147
- }
148
- return layers;
149
- },
179
+ getTileData: async (tile) => this._getTileData(tile, images, metadata),
180
+ renderSubLayers: (props) => this._renderSubLayers(props, metadata, forwardReproject, inverseReproject),
150
181
  });
151
182
  }
152
183
  renderLayers() {
@@ -1 +1 @@
1
- {"version":3,"file":"cog-layer.js","sourceRoot":"","sources":["../src/cog-layer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cog-layer.js","sourceRoot":"","sources":["../src/cog-layer.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAO/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAM5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAI/E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,WAAW,EACX,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA8I/C,MAAM,YAAY,GAA2B;IAC3C,aAAa,EAAE,kBAAkB;IACjC,KAAK,EAAE,KAAK;IACZ,YAAY,EAAE,GAAG;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,QAEX,SAAQ,cAAoC;IAC5C,MAAM,CAAU,SAAS,GAAG,UAAU,CAAC;IACvC,MAAM,CAAU,YAAY,GAAG,YAAY,CAAC;IAWnC,eAAe;QACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAEQ,WAAW,CAAC,MAA8B;QACjD,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAEhD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC;QAEzE,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAc,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAErE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAChD,SAAS,CAAC,OAAO,CAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAChD,SAAS,CAAC,OAAO,CAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE;gBAChC,UAAU,EAAE,gBAAgB;gBAC5B,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,EAAE,GACtE,mBAAmB,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,CAAC,QAAQ,CAAC;YACZ,QAAQ;YACR,gBAAgB;YAChB,gBAAgB;YAChB,MAAM;YACN,kBAAkB;YAClB,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,IAAmB,EACnB,MAAsB,EACtB,QAAuB;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACxB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE/B,wBAAwB;QACxB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;QACpD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QAE3C,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC;QAC7C,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;QAE7C,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAC1C,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAErC,MAAM,MAAM,GAAqC;YAC/C,CAAC,GAAG,SAAS;YACb,CAAC,GAAG,UAAU;YACd,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,UAAU,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,WAAW,CAAC;SAC5C,CAAC;QAEF,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAmB,CAAC;QAE3D,4CAA4C;QAC5C,MAAM,cAAc,GAClB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAElC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC3B,MAAM;YACN,MAAM,EAAE,cAAc;YACtB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,OAAO;YACL,iEAAiE;YACjE,IAAI;YACJ,gBAAgB;YAChB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,gBAAgB;IACd,qDAAqD;IACrD,yEAAyE;IACzE,KAKC,EACD,QAAuB,EACvB,gBAAqD,EACrD,gBAAqD;QAErD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;QAEhE,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAkB,CAAC;YAE1E,MAAM,CAAC,IAAI,CACT,IAAI,WAAW,CAAC;gBACd,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,SAAS;gBACxB,KAAK;gBACL,MAAM;gBACN,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC;gBAChC,QAAQ;gBACR,eAAe,EAAE;oBACf,gBAAgB;oBAChB,gBAAgB;oBAChB,gBAAgB;oBAChB,gBAAgB;iBACjB;gBACD,KAAK;gBACL,YAAY;aACb,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,sCAAsC;YACtC,6DAA6D;YAC7D,8DAA8D;YAC9D,MAAM,eAAe,GAAI,IAAY,EAAE,eAAe,CAAC;YAEvD,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,yCAAyC;YACzC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC;YAEvE,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAE5D,8CAA8C;YAC9C,MAAM,IAAI,GAAG;gBACX,YAAY;gBACZ,aAAa;gBACb,gBAAgB;gBAChB,eAAe;gBACf,YAAY,EAAE,iBAAiB;aAChC,CAAC;YAEF,MAAM,CAAC,IAAI,CACT,IAAI,SAAS,CAAC;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,SAAS;gBAClC,IAAI,EAAE,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM;gBAClC,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,KAAK;aAChB,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,eAAe,CACb,QAAuB,EACvB,gBAAqD,EACrD,gBAAqD,EACrD,MAAsB;QAEtB,mEAAmE;QACnE,MAAM,sBAAuB,SAAQ,eAAe;YAClD,YAAY,IAAoB;gBAC9B,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;SACF;QAED,OAAO,IAAI,SAAS,CAA2B;YAC7C,EAAE,EAAE,kBAAkB,IAAI,CAAC,EAAE,EAAE;YAC/B,YAAY,EAAE,sBAAsB;YACpC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;YACtE,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,IAAI,CAAC,gBAAgB,CACnB,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,CACjB;SACJ,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE5E,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,eAAe;QACf,OAAO,IAAI,CAAC,eAAe,CACzB,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,CACP,CAAC;IACJ,CAAC;;AAGH;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,CAAS,EACT,CAAS,EACT,UAAsB;IAEtB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;IAE7C,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC;IACnC,MAAM,YAAY,GAAG,CAAC,GAAG,UAAU,CAAC;IAEpC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;IAEnD,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;IAE7D,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import type { TileMatrixSet } from "@developmentseed/deck.gl-raster";
2
2
  import type { GeoTIFF } from "geotiff";
3
+ import { type ProjectionDefinition } from "proj4";
4
+ import type { GeoKeysParser, SupportedCrsUnit } from "./proj";
3
5
  /**
4
6
  *
5
7
  * Ported from Vincent's work here:
@@ -7,5 +9,24 @@ import type { GeoTIFF } from "geotiff";
7
9
  *
8
10
  * @return {TileMatrixSet}[return description]
9
11
  */
10
- export declare function parseCOGTileMatrixSet(tiff: GeoTIFF): Promise<TileMatrixSet>;
12
+ export declare function parseCOGTileMatrixSet(tiff: GeoTIFF, geoKeysParser: GeoKeysParser): Promise<TileMatrixSet>;
13
+ /**
14
+ * Coefficient to convert the coordinate reference system (CRS)
15
+ * units into meters (metersPerUnit).
16
+ *
17
+ * From note g in http://docs.opengeospatial.org/is/17-083r2/17-083r2.html#table_2:
18
+ *
19
+ * > If the CRS uses meters as units of measure for the horizontal dimensions,
20
+ * > then metersPerUnit=1; if it has degrees, then metersPerUnit=2pa/360
21
+ * > (a is the Earth maximum radius of the ellipsoid).
22
+ *
23
+ * If `crsUnit` is provided, it takes precedence over the unit defined in the
24
+ * CRS. This exists because sometimes the parsed CRS from
25
+ * `geotiff-geokeys-to-proj4` doesn't have a unit defined.
26
+ */
27
+ declare function metersPerUnit(parsedCrs: ProjectionDefinition, crsUnit?: SupportedCrsUnit): number;
28
+ export declare const __TEST_EXPORTS: {
29
+ metersPerUnit: typeof metersPerUnit;
30
+ };
31
+ export {};
11
32
  //# sourceMappingURL=cog-tile-matrix-set.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cog-tile-matrix-set.d.ts","sourceRoot":"","sources":["../src/cog-tile-matrix-set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;AAarD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,aAAa,CAAC,CA0FxB"}
1
+ {"version":3,"file":"cog-tile-matrix-set.d.ts","sourceRoot":"","sources":["../src/cog-tile-matrix-set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;AACrD,OAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,KAAK,EAAE,aAAa,EAAkB,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAM9E;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,aAAa,CAAC,CAyFxB;AAED;;;;;;;;;;;;;GAaG;AAEH,iBAAS,aAAa,CACpB,SAAS,EAAE,oBAAoB,EAC/B,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAqBR;AA4GD,eAAO,MAAM,cAAc;;CAE1B,CAAC"}
@@ -1,6 +1,6 @@
1
- import { extractGeotransform, getGeoTIFFProjection, } from "./geotiff-reprojection";
2
1
  import proj4 from "proj4";
3
2
  import Ellipsoid from "./ellipsoids.js";
3
+ import { extractGeotransform } from "./geotiff-reprojection";
4
4
  // 0.28 mm per pixel
5
5
  // https://docs.ogc.org/is/17-083r4/17-083r4.html#toc15
6
6
  const SCREEN_PIXEL_SIZE = 0.00028;
@@ -11,7 +11,7 @@ const SCREEN_PIXEL_SIZE = 0.00028;
11
11
  *
12
12
  * @return {TileMatrixSet}[return description]
13
13
  */
14
- export async function parseCOGTileMatrixSet(tiff) {
14
+ export async function parseCOGTileMatrixSet(tiff, geoKeysParser) {
15
15
  const fullResImage = await tiff.getImage();
16
16
  if (!fullResImage.isTiled) {
17
17
  throw new Error("COG TileMatrixSet requires a tiled GeoTIFF");
@@ -20,13 +20,12 @@ export async function parseCOGTileMatrixSet(tiff) {
20
20
  const bbox = fullResImage.getBoundingBox();
21
21
  const fullImageWidth = fullResImage.getWidth();
22
22
  const fullImageHeight = fullResImage.getHeight();
23
- const crs = await getGeoTIFFProjection(fullResImage);
23
+ const crs = await geoKeysParser(fullResImage.getGeoKeys());
24
24
  if (crs === null) {
25
25
  throw new Error("Could not determine coordinate reference system from GeoTIFF geo keys");
26
26
  }
27
- const parsedCrs = parseCrs(crs);
28
- const projectToWgs84 = proj4(crs, "EPSG:4326").forward;
29
- const projectTo3857 = proj4(crs, "EPSG:3857").forward;
27
+ const projectToWgs84 = proj4(crs.def, "EPSG:4326").forward;
28
+ const projectTo3857 = proj4(crs.def, "EPSG:3857").forward;
30
29
  const boundingBox = {
31
30
  lowerLeft: [bbox[0], bbox[1]],
32
31
  upperRight: [bbox[2], bbox[3]],
@@ -43,7 +42,8 @@ export async function parseCOGTileMatrixSet(tiff) {
43
42
  {
44
43
  // Set as highest resolution / finest level
45
44
  id: String(imageCount - 1),
46
- scaleDenominator: (cellSize * metersPerUnit(parsedCrs)) / SCREEN_PIXEL_SIZE,
45
+ scaleDenominator: (cellSize * metersPerUnit(crs.parsed, crs.coordinatesUnits)) /
46
+ SCREEN_PIXEL_SIZE,
47
47
  cellSize,
48
48
  pointOfOrigin: [transform[2], transform[5]],
49
49
  tileWidth: fullResImage.getTileWidth(),
@@ -65,7 +65,7 @@ export async function parseCOGTileMatrixSet(tiff) {
65
65
  fullWidth: fullImageWidth,
66
66
  fullHeight: fullImageHeight,
67
67
  baseTransform: transform,
68
- parsedCrs,
68
+ crs,
69
69
  });
70
70
  tileMatrices.push(tileMatrix);
71
71
  }
@@ -89,30 +89,36 @@ export async function parseCOGTileMatrixSet(tiff) {
89
89
  * > If the CRS uses meters as units of measure for the horizontal dimensions,
90
90
  * > then metersPerUnit=1; if it has degrees, then metersPerUnit=2pa/360
91
91
  * > (a is the Earth maximum radius of the ellipsoid).
92
+ *
93
+ * If `crsUnit` is provided, it takes precedence over the unit defined in the
94
+ * CRS. This exists because sometimes the parsed CRS from
95
+ * `geotiff-geokeys-to-proj4` doesn't have a unit defined.
92
96
  */
93
97
  // https://github.com/developmentseed/morecantile/blob/7c95a11c491303700d6e33e9c1607f2719584dec/morecantile/utils.py#L67-L90
94
- function metersPerUnit(parsedCrs) {
95
- switch (parsedCrs.units) {
98
+ function metersPerUnit(parsedCrs, crsUnit) {
99
+ const unit = (crsUnit || parsedCrs.units)?.toLowerCase();
100
+ switch (unit) {
101
+ case "m":
96
102
  case "metre":
97
103
  case "meter":
98
104
  case "meters":
99
105
  return 1;
100
106
  case "foot":
101
107
  return 0.3048;
102
- case "US survey foot":
108
+ case "us survey foot":
103
109
  return 1200 / 3937;
104
110
  }
105
- if (parsedCrs.units === "degree") {
111
+ if (unit === "degree") {
106
112
  // 2 * π * ellipsoid semi-major-axis / 360
107
113
  const { a } = Ellipsoid[parsedCrs.ellps];
108
114
  return (2 * Math.PI * a) / 360;
109
115
  }
110
- throw new Error(`Unsupported CRS units: ${parsedCrs.units}`);
116
+ throw new Error(`Unsupported CRS units: ${unit}`);
111
117
  }
112
118
  /**
113
119
  * Create tile matrix for COG overview
114
120
  */
115
- function createOverviewTileMatrix({ id, image, fullWidth, baseTransform, parsedCrs, }) {
121
+ function createOverviewTileMatrix({ id, image, fullWidth, baseTransform, crs, }) {
116
122
  const width = image.getWidth();
117
123
  const height = image.getHeight();
118
124
  // For now, just use scaleX
@@ -136,7 +142,8 @@ function createOverviewTileMatrix({ id, image, fullWidth, baseTransform, parsedC
136
142
  const tileHeight = image.getTileHeight();
137
143
  return {
138
144
  id,
139
- scaleDenominator: (cellSize * metersPerUnit(parsedCrs)) / SCREEN_PIXEL_SIZE,
145
+ scaleDenominator: (cellSize * metersPerUnit(crs.parsed, crs.coordinatesUnits)) /
146
+ SCREEN_PIXEL_SIZE,
140
147
  cellSize,
141
148
  pointOfOrigin: [geotransform[2], geotransform[5]],
142
149
  tileWidth,
@@ -146,15 +153,6 @@ function createOverviewTileMatrix({ id, image, fullWidth, baseTransform, parsedC
146
153
  geotransform,
147
154
  };
148
155
  }
149
- function parseCrs(crs) {
150
- // If you pass proj4.defs a projjson, it doesn't parse it; it just returns the
151
- // input.
152
- //
153
- // Instead, you need to assign it to an alias and then retrieve it.
154
- const key = "__deck.gl-geotiff-internal__";
155
- proj4.defs(key, crs);
156
- return proj4.defs(key);
157
- }
158
156
  function computeWgs84BoundingBox(boundingBox, projectToWgs84) {
159
157
  const lowerLeftWgs84 = projectToWgs84(boundingBox.lowerLeft);
160
158
  const lowerRightWgs84 = projectToWgs84([
@@ -176,4 +174,7 @@ function computeWgs84BoundingBox(boundingBox, projectToWgs84) {
176
174
  upperRight: [maxLon, maxLat],
177
175
  };
178
176
  }
177
+ export const __TEST_EXPORTS = {
178
+ metersPerUnit,
179
+ };
179
180
  //# sourceMappingURL=cog-tile-matrix-set.js.map