@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/geotiff/types.ts"],"names":[],"mappings":"AAAA,oBAAY,0BAA0B;IACpC,WAAW,IAAI;IACf,WAAW,IAAI;IACf,GAAG,IAAI;IACP,OAAO,IAAI;IACX,gBAAgB,IAAI;IACpB,IAAI,IAAI;IACR,KAAK,IAAI;IACT,MAAM,IAAI;IACV,MAAM,IAAI;CACX;AAED,oBAAY,oBAAoB;IAC9B,MAAM,IAAI;IACV,MAAM,IAAI;CACX;AAED,+BAA+B;AAC/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB,EAAE,0BAA0B,CAAC;IACtD,qBAAqB;IACrB,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,YAAY,EAAE,WAAW,CAAC;IAC1B,sBAAsB;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export var PhotometricInterpretationT;
2
+ (function (PhotometricInterpretationT) {
3
+ PhotometricInterpretationT[PhotometricInterpretationT["WhiteIsZero"] = 0] = "WhiteIsZero";
4
+ PhotometricInterpretationT[PhotometricInterpretationT["BlackIsZero"] = 1] = "BlackIsZero";
5
+ PhotometricInterpretationT[PhotometricInterpretationT["RGB"] = 2] = "RGB";
6
+ PhotometricInterpretationT[PhotometricInterpretationT["Palette"] = 3] = "Palette";
7
+ PhotometricInterpretationT[PhotometricInterpretationT["TransparencyMask"] = 4] = "TransparencyMask";
8
+ PhotometricInterpretationT[PhotometricInterpretationT["CMYK"] = 5] = "CMYK";
9
+ PhotometricInterpretationT[PhotometricInterpretationT["YCbCr"] = 6] = "YCbCr";
10
+ PhotometricInterpretationT[PhotometricInterpretationT["CIELab"] = 8] = "CIELab";
11
+ PhotometricInterpretationT[PhotometricInterpretationT["ICCLab"] = 9] = "ICCLab";
12
+ })(PhotometricInterpretationT || (PhotometricInterpretationT = {}));
13
+ export var PlanarConfigurationT;
14
+ (function (PlanarConfigurationT) {
15
+ PlanarConfigurationT[PlanarConfigurationT["Chunky"] = 1] = "Chunky";
16
+ PlanarConfigurationT[PlanarConfigurationT["Planar"] = 2] = "Planar";
17
+ })(PlanarConfigurationT || (PlanarConfigurationT = {}));
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/geotiff/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,0BAUX;AAVD,WAAY,0BAA0B;IACpC,yFAAe,CAAA;IACf,yFAAe,CAAA;IACf,yEAAO,CAAA;IACP,iFAAW,CAAA;IACX,mGAAoB,CAAA;IACpB,2EAAQ,CAAA;IACR,6EAAS,CAAA;IACT,+EAAU,CAAA;IACV,+EAAU,CAAA;AACZ,CAAC,EAVW,0BAA0B,KAA1B,0BAA0B,QAUrC;AAED,MAAM,CAAN,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,mEAAU,CAAA;IACV,mEAAU,CAAA;AACZ,CAAC,EAHW,oBAAoB,KAApB,oBAAoB,QAG/B"}
@@ -2,9 +2,29 @@ import type { CompositeLayerProps, UpdateParameters } from "@deck.gl/core";
2
2
  import { CompositeLayer } from "@deck.gl/core";
3
3
  import { RasterLayer } from "@developmentseed/deck.gl-raster";
4
4
  import type { ReprojectionFns } from "@developmentseed/raster-reproject";
5
- import type { GeoTIFF, Pool } from "geotiff";
5
+ import type { BaseClient, GeoTIFF, Pool } from "geotiff";
6
+ import type { GeoKeysParser, ProjectionInfo } from "./proj.js";
7
+ import { epsgIoGeoKeyParser } from "./proj.js";
6
8
  export interface GeoTIFFLayerProps extends CompositeLayerProps {
7
- geotiff: GeoTIFF;
9
+ /**
10
+ * GeoTIFF input.
11
+ *
12
+ * - URL string pointing to a GeoTIFF
13
+ * - ArrayBuffer containing the GeoTIFF data
14
+ * - Blob containing the GeoTIFF data
15
+ * - An instance of GeoTIFF.js's GeoTIFF class
16
+ * - An instance of GeoTIFF.js's BaseClient for custom fetching
17
+ */
18
+ geotiff: GeoTIFF | string | ArrayBuffer | Blob | BaseClient;
19
+ /**
20
+ * A function callback for parsing GeoTIFF geo keys to a Proj4 compatible
21
+ * definition.
22
+ *
23
+ * By default, uses epsg.io to resolve EPSG codes found in the GeoTIFF.
24
+ * Alternatively, you may want to use `geotiff-geokeys-to-proj4`, which is
25
+ * more extensive but adds 1.5MB to your bundle size.
26
+ */
27
+ geoKeysParser?: GeoKeysParser;
8
28
  /**
9
29
  * GeoTIFF.js Pool for decoding image chunks.
10
30
  *
@@ -28,6 +48,25 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps {
28
48
  * @default 0.5
29
49
  */
30
50
  debugOpacity?: number;
51
+ /**
52
+ * Called when the GeoTIFF metadata has been loaded and parsed.
53
+ *
54
+ * @param {GeoTIFF} geotiff
55
+ * @param {ProjectionInfo} projection
56
+ */
57
+ onGeoTIFFLoad?: (geotiff: GeoTIFF, options: {
58
+ projection: ProjectionInfo;
59
+ /**
60
+ * Bounds of the image in geographic coordinates (WGS84) [minLon, minLat,
61
+ * maxLon, maxLat]
62
+ */
63
+ geographicBounds: {
64
+ west: number;
65
+ south: number;
66
+ east: number;
67
+ north: number;
68
+ };
69
+ }) => void;
31
70
  }
32
71
  /**
33
72
  * GeoTIFFLayer renders a GeoTIFF file from an arbitrary projection.
@@ -39,7 +78,7 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps {
39
78
  export declare class GeoTIFFLayer extends CompositeLayer<GeoTIFFLayerProps> {
40
79
  static layerName: string;
41
80
  static defaultProps: {
42
- maxError: number;
81
+ geoKeysParser: typeof epsgIoGeoKeyParser;
43
82
  };
44
83
  state: {
45
84
  reprojectionFns?: ReprojectionFns;
@@ -1 +1 @@
1
- {"version":3,"file":"geotiff-layer.d.ts","sourceRoot":"","sources":["../src/geotiff-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM7C,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,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;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,cAAc,CAAC,iBAAiB,CAAC;IACjE,OAAgB,SAAS,SAAkB;IAC3C,OAAgB,YAAY;;MAAgB;IAEpC,KAAK,EAAE;QACb,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEO,eAAe,IAAI,IAAI;IAIvB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAe7C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBpC,YAAY;CAsBb"}
1
+ {"version":3,"file":"geotiff-layer.d.ts","sourceRoot":"","sources":["../src/geotiff-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AASzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D;;;;;;;;OAQG;IACH,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,UAAU,CAAC;IAE5D;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B;;;;;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;IAEtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QACP,UAAU,EAAE,cAAc,CAAC;QAC3B;;;WAGG;QACH,gBAAgB,EAAE;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,KACE,IAAI,CAAC;CACX;AAMD;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,cAAc,CAAC,iBAAiB,CAAC;IACjE,OAAgB,SAAS,SAAkB;IAC3C,OAAgB,YAAY;;MAAgB;IAEpC,KAAK,EAAE;QACb,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEO,eAAe,IAAI,IAAI;IAIvB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAe7C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCpC,YAAY;CAsBb"}
@@ -1,10 +1,11 @@
1
1
  import { CompositeLayer } from "@deck.gl/core";
2
2
  import { RasterLayer } from "@developmentseed/deck.gl-raster";
3
+ import proj4 from "proj4";
4
+ import { defaultPool, fetchGeoTIFF, getGeographicBounds, loadRgbImage, } from "./geotiff/geotiff.js";
3
5
  import { extractGeotiffReprojectors } from "./geotiff-reprojection.js";
4
- import { defaultPool, loadRgbImage } from "./geotiff.js";
5
- const DEFAULT_MAX_ERROR = 0.125;
6
+ import { epsgIoGeoKeyParser } from "./proj.js";
6
7
  const defaultProps = {
7
- maxError: DEFAULT_MAX_ERROR,
8
+ geoKeysParser: epsgIoGeoKeyParser,
8
9
  };
9
10
  /**
10
11
  * GeoTIFFLayer renders a GeoTIFF file from an arbitrary projection.
@@ -30,15 +31,28 @@ export class GeoTIFFLayer extends CompositeLayer {
30
31
  }
31
32
  }
32
33
  async _parseGeoTIFF() {
33
- const { geotiff } = this.props;
34
- const reprojectionFns = await extractGeotiffReprojectors(geotiff);
34
+ const geotiff = await fetchGeoTIFF(this.props.geotiff);
35
35
  const image = await geotiff.getImage();
36
- const { imageData, height, width } = await loadRgbImage(image, {
36
+ const geoKeysParser = this.props.geoKeysParser;
37
+ const sourceProjection = await geoKeysParser(image.getGeoKeys());
38
+ if (!sourceProjection) {
39
+ throw new Error("Could not determine source projection from GeoTIFF geo keys");
40
+ }
41
+ const converter = proj4(sourceProjection.def, "EPSG:4326");
42
+ if (this.props.onGeoTIFFLoad) {
43
+ const geographicBounds = getGeographicBounds(image, converter);
44
+ this.props.onGeoTIFFLoad(geotiff, {
45
+ projection: sourceProjection,
46
+ geographicBounds,
47
+ });
48
+ }
49
+ const reprojectionFns = await extractGeotiffReprojectors(geotiff, sourceProjection.def);
50
+ const { texture, height, width } = await loadRgbImage(image, {
37
51
  pool: this.props.pool || defaultPool(),
38
52
  });
39
53
  this.setState({
40
54
  reprojectionFns,
41
- imageData,
55
+ imageData: texture,
42
56
  height,
43
57
  width,
44
58
  });
@@ -1 +1 @@
1
- {"version":3,"file":"geotiff-layer.js","sourceRoot":"","sources":["../src/geotiff-layer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAiChC,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,iBAAiB;CAC5B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,OAAO,YAAa,SAAQ,cAAiC;IACjE,MAAM,CAAU,SAAS,GAAG,cAAc,CAAC;IAC3C,MAAM,CAAU,YAAY,GAAG,YAAY,CAAC;IASnC,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;YAChC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;YAClC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC;QAEvC,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE/B,MAAM,eAAe,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE;YAC7D,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC;YACZ,eAAe;YACf,SAAS;YACT,MAAM;YACN,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAEjE,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAErD,OAAO,IAAI,WAAW,CACpB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,QAAQ;YACZ,KAAK;YACL,MAAM;YACN,eAAe;YACf,QAAQ;YACR,OAAO,EAAE,SAAS;YAClB,KAAK;YACL,YAAY;SACb,CAAC,CACH,CAAC;IACJ,CAAC"}
1
+ {"version":3,"file":"geotiff-layer.js","sourceRoot":"","sources":["../src/geotiff-layer.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,13 @@
1
- import type { GeoTIFF, GeoTIFFImage } from "geotiff";
2
1
  import type { ReprojectionFns } from "@developmentseed/raster-reproject";
2
+ import type { GeoTIFF, GeoTIFFImage } from "geotiff";
3
3
  import type { PROJJSONDefinition } from "proj4/dist/lib/core";
4
4
  import type Projection from "proj4/dist/lib/Proj";
5
- export declare function extractGeotiffReprojectors(tiff: GeoTIFF, outputCrs?: string | PROJJSONDefinition | Projection): Promise<ReprojectionFns>;
5
+ export declare const OGC_84: PROJJSONDefinition;
6
+ export declare function extractGeotiffReprojectors(tiff: GeoTIFF, sourceProjection: string | PROJJSONDefinition, outputCrs?: string | PROJJSONDefinition | Projection): Promise<ReprojectionFns>;
6
7
  export declare function fromGeoTransform(geotransform: [number, number, number, number, number, number]): {
7
- pixelToInputCRS: (x: number, y: number) => [number, number];
8
- inputCRSToPixel: (x: number, y: number) => [number, number];
8
+ forwardTransform: (x: number, y: number) => [number, number];
9
+ inverseTransform: (x: number, y: number) => [number, number];
9
10
  };
10
- /**
11
- * Get the Projection of a GeoTIFF
12
- *
13
- * The first `image` must be passed in, as only the top-level IFD contains geo
14
- * keys.
15
- */
16
- export declare function getGeoTIFFProjection(image: GeoTIFFImage): Promise<PROJJSONDefinition | null>;
17
11
  /**
18
12
  * Extract affine geotransform from a GeoTIFF image.
19
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"geotiff-reprojection.d.ts","sourceRoot":"","sources":["../src/geotiff-reprojection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AA+ElD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,MAAM,GAAG,kBAAkB,GAAG,UAAmB,GAC3D,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC7D;IACD,eAAe,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,eAAe,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7D,CAOA;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAOpC;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,GAClB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAiClD"}
1
+ {"version":3,"file":"geotiff-reprojection.d.ts","sourceRoot":"","sources":["../src/geotiff-reprojection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAKzE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAElD,eAAO,MAAM,MAAM,EAAE,kBAuEpB,CAAC;AAMF,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,OAAO,EACb,gBAAgB,EAAE,MAAM,GAAG,kBAAkB,EAC7C,SAAS,GAAE,MAAM,GAAG,kBAAkB,GAAG,UAAmB,GAC3D,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC7D;IACD,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9D,CAOA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,GAClB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAiClD"}
@@ -1,7 +1,7 @@
1
1
  /* eslint-env browser */
2
- import { applyAffine, invertGeoTransform, } from "@developmentseed/raster-reproject";
2
+ import { applyAffine, invertGeoTransform, } from "@developmentseed/raster-reproject/affine";
3
3
  import proj4 from "proj4";
4
- const OGC_84 = {
4
+ export const OGC_84 = {
5
5
  $schema: "https://proj.org/schemas/v0.7/projjson.schema.json",
6
6
  type: "GeographicCRS",
7
7
  name: "WGS 84 (CRS84)",
@@ -77,20 +77,16 @@ const OGC_84 = {
77
77
  // https://github.com/developmentseed/lonboard/blob/35a1f3d691604ad9e083bf10a4bfde4158171486/src/cog-tileset/claude-tileset-2d-improved.ts#L141
78
78
  //
79
79
  // TODO: return a RasterReprojector instance, given the IFD and tile of interest?
80
- export async function extractGeotiffReprojectors(tiff, outputCrs = OGC_84) {
80
+ export async function extractGeotiffReprojectors(tiff, sourceProjection, outputCrs = OGC_84) {
81
81
  const image = await tiff.getImage();
82
82
  // Extract geotransform from full-resolution image
83
83
  // Only the top-level IFD has geo keys, so we'll derive overviews from this
84
84
  const baseGeotransform = extractGeotransform(image);
85
- const sourceProjection = await getGeoTIFFProjection(image);
86
- if (sourceProjection === null) {
87
- throw new Error("Could not determine source projection from GeoTIFF geo keys");
88
- }
89
85
  const converter = proj4(sourceProjection, outputCrs);
90
- const { pixelToInputCRS, inputCRSToPixel } = fromGeoTransform(baseGeotransform);
86
+ const { forwardTransform, inverseTransform } = fromGeoTransform(baseGeotransform);
91
87
  return {
92
- pixelToInputCRS,
93
- inputCRSToPixel,
88
+ forwardTransform,
89
+ inverseTransform,
94
90
  forwardReproject: (x, y) => converter.forward([x, y], false),
95
91
  inverseReproject: (x, y) => converter.inverse([x, y], false),
96
92
  };
@@ -98,35 +94,10 @@ export async function extractGeotiffReprojectors(tiff, outputCrs = OGC_84) {
98
94
  export function fromGeoTransform(geotransform) {
99
95
  const inverseGeotransform = invertGeoTransform(geotransform);
100
96
  return {
101
- pixelToInputCRS: (x, y) => applyAffine(x, y, geotransform),
102
- inputCRSToPixel: (x, y) => applyAffine(x, y, inverseGeotransform),
97
+ forwardTransform: (x, y) => applyAffine(x, y, geotransform),
98
+ inverseTransform: (x, y) => applyAffine(x, y, inverseGeotransform),
103
99
  };
104
100
  }
105
- /**
106
- * Get the Projection of a GeoTIFF
107
- *
108
- * The first `image` must be passed in, as only the top-level IFD contains geo
109
- * keys.
110
- */
111
- export async function getGeoTIFFProjection(image) {
112
- const geoKeys = image.getGeoKeys();
113
- const projectionCode = geoKeys.ProjectedCSTypeGeoKey || geoKeys.GeographicTypeGeoKey || null;
114
- const sourceProjection = await getProjjson(projectionCode);
115
- return sourceProjection;
116
- }
117
- /** Query epsg.io for the PROJJSON corresponding to the given EPSG code. */
118
- async function getProjjson(projectionCode) {
119
- if (projectionCode === null) {
120
- return null;
121
- }
122
- const url = `https://epsg.io/${projectionCode}.json`;
123
- const response = await fetch(url);
124
- if (!response.ok) {
125
- throw new Error(`Failed to fetch projection data from ${url}`);
126
- }
127
- const data = await response.json();
128
- return data;
129
- }
130
101
  /**
131
102
  * Extract affine geotransform from a GeoTIFF image.
132
103
  *
@@ -1 +1 @@
1
- {"version":3,"file":"geotiff-reprojection.js","sourceRoot":"","sources":["../src/geotiff-reprojection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geotiff-reprojection.js","sourceRoot":"","sources":["../src/geotiff-reprojection.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,16 @@
1
- export { COGLayer } from "./cog-layer.js";
2
1
  export type { COGLayerProps } from "./cog-layer.js";
2
+ export { COGLayer } from "./cog-layer.js";
3
3
  export { parseCOGTileMatrixSet } from "./cog-tile-matrix-set.js";
4
- export { GeoTIFFLayer } from "./geotiff-layer.js";
4
+ export { loadRgbImage, parseColormap } from "./geotiff/geotiff.js";
5
+ export * as texture from "./geotiff/texture.js";
5
6
  export type { GeoTIFFLayerProps } from "./geotiff-layer.js";
6
- export { extractGeotiffReprojectors, fromGeoTransform, getGeoTIFFProjection, } from "./geotiff-reprojection.js";
7
- export { loadRgbImage } from "./geotiff.js";
7
+ export { GeoTIFFLayer } from "./geotiff-layer.js";
8
+ export { extractGeotiffReprojectors, fromGeoTransform, } from "./geotiff-reprojection.js";
9
+ export type { MosaicLayerProps } from "./mosaic-layer/mosaic-layer.js";
10
+ export { MosaicLayer } from "./mosaic-layer/mosaic-layer.js";
11
+ export { type MosaicSource, MosaicTileset2D, } from "./mosaic-layer/mosaic-tileset-2d";
12
+ export * as proj from "./proj.js";
13
+ export declare const __TEST_EXPORTS: {
14
+ metersPerUnit: (parsedCrs: import("proj4").ProjectionDefinition, crsUnit?: import("./proj.js").SupportedCrsUnit) => number;
15
+ };
8
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,KAAK,YAAY,EACjB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,eAAO,MAAM,cAAc;;CAAqC,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,12 @@
1
1
  export { COGLayer } from "./cog-layer.js";
2
2
  export { parseCOGTileMatrixSet } from "./cog-tile-matrix-set.js";
3
+ export { loadRgbImage, parseColormap } from "./geotiff/geotiff.js";
4
+ export * as texture from "./geotiff/texture.js";
3
5
  export { GeoTIFFLayer } from "./geotiff-layer.js";
4
- export { extractGeotiffReprojectors, fromGeoTransform, getGeoTIFFProjection, } from "./geotiff-reprojection.js";
5
- export { loadRgbImage } from "./geotiff.js";
6
+ export { extractGeotiffReprojectors, fromGeoTransform, } from "./geotiff-reprojection.js";
7
+ export { MosaicLayer } from "./mosaic-layer/mosaic-layer.js";
8
+ export { MosaicTileset2D, } from "./mosaic-layer/mosaic-tileset-2d";
9
+ export * as proj from "./proj.js";
10
+ import { __TEST_EXPORTS as cogTileMatrixSetTestExports } from "./cog-tile-matrix-set.js";
11
+ export const __TEST_EXPORTS = { ...cogTileMatrixSetTestExports };
6
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAEL,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,cAAc,IAAI,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEzF,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { CompositeLayerProps, Layer, LayersList } from "@deck.gl/core";
2
+ import { CompositeLayer } from "@deck.gl/core";
3
+ import type { TileLayerProps } from "@deck.gl/geo-layers";
4
+ import { TileLayer } from "@deck.gl/geo-layers";
5
+ import type { MosaicSource } from "./mosaic-tileset-2d";
6
+ export type MosaicLayerProps<MosaicT extends MosaicSource = MosaicSource, DataT = any> = CompositeLayerProps & Pick<TileLayerProps, "extent" | "minZoom" | "maxZoom" | "maxCacheByteSize" | "maxCacheSize" | "maxRequests"> & {
7
+ /** List of mosaic sources to render */
8
+ sources: MosaicT[];
9
+ /** Fetch data for this source. */
10
+ getSource?: (source: MosaicT, opts: {
11
+ signal?: AbortSignal;
12
+ }) => Promise<DataT>;
13
+ /** Render a source */
14
+ renderSource: (source: MosaicT, opts: {
15
+ data?: DataT;
16
+ signal?: AbortSignal;
17
+ }) => Layer | LayersList | null;
18
+ };
19
+ /**
20
+ * A deck.gl layer for rendering a mosaic of raster sources.
21
+ *
22
+ * The `renderSource` prop is called whenever a source is present in the current
23
+ * viewport.
24
+ */
25
+ export declare class MosaicLayer<MosaicT extends MosaicSource = MosaicSource, DataT = any> extends CompositeLayer<MosaicLayerProps<MosaicT, DataT>> {
26
+ static layerName: string;
27
+ static defaultProps: Partial<MosaicLayerProps<MosaicSource, any>>;
28
+ renderTileLayer(mosaicSources: MosaicT[], renderSource: MosaicLayerProps<MosaicT, DataT>["renderSource"]): TileLayer;
29
+ renderLayers(): Layer | null | LayersList;
30
+ }
31
+ //# sourceMappingURL=mosaic-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mosaic-layer.d.ts","sourceRoot":"","sources":["../../src/mosaic-layer/mosaic-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,MAAM,gBAAgB,CAC1B,OAAO,SAAS,YAAY,GAAG,YAAY,EAC3C,KAAK,GAAG,GAAG,IACT,mBAAmB,GACrB,IAAI,CACF,cAAc,EACZ,QAAQ,GACR,SAAS,GACT,SAAS,GACT,kBAAkB,GAClB,cAAc,GACd,aAAa,CAChB,GAAG;IACF,uCAAuC;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC;IAEnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,CACV,MAAM,EAAE,OAAO,EACf,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAC3B,OAAO,CAAC,KAAK,CAAC,CAAC;IAEpB,sBAAsB;IACtB,YAAY,EAAE,CACZ,MAAM,EAAE,OAAO,EACf,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,KAAK,CAAC;QACb,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,KACE,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;CAChC,CAAC;AAIJ;;;;;GAKG;AACH,qBAAa,WAAW,CACtB,OAAO,SAAS,YAAY,GAAG,YAAY,EAC3C,KAAK,GAAG,GAAG,CACX,SAAQ,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,OAAgB,SAAS,SAAiB;IAC1C,OAAgB,YAAY,+CAAgB;IAE5C,eAAe,CACb,aAAa,EAAE,OAAO,EAAE,EACxB,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,cAAc,CAAC,GAC7D,SAAS;IAsDH,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CASnD"}
@@ -0,0 +1,59 @@
1
+ import { CompositeLayer } from "@deck.gl/core";
2
+ import { TileLayer } from "@deck.gl/geo-layers";
3
+ import { MosaicTileset2D } from "./mosaic-tileset-2d";
4
+ const defaultProps = {};
5
+ /**
6
+ * A deck.gl layer for rendering a mosaic of raster sources.
7
+ *
8
+ * The `renderSource` prop is called whenever a source is present in the current
9
+ * viewport.
10
+ */
11
+ export class MosaicLayer extends CompositeLayer {
12
+ static layerName = "MosaicLayer";
13
+ static defaultProps = defaultProps;
14
+ renderTileLayer(mosaicSources, renderSource) {
15
+ const { id, minZoom, maxZoom, extent, maxCacheByteSize, maxCacheSize, maxRequests, } = this.props;
16
+ class MosaicTileset2DFactory extends MosaicTileset2D {
17
+ constructor(opts) {
18
+ super(mosaicSources, opts);
19
+ }
20
+ }
21
+ return new TileLayer({
22
+ id: `mosaic-layer-${id}`,
23
+ TilesetClass: MosaicTileset2DFactory,
24
+ minZoom,
25
+ maxZoom,
26
+ extent,
27
+ ...(maxCacheByteSize !== undefined && { maxCacheByteSize }),
28
+ maxCacheSize,
29
+ maxRequests,
30
+ getTileData: async (data) => {
31
+ // We hard-cast this because TilesetClass is not generic.
32
+ // TilesetClass returns MosaicT in `index`, but the known type is only
33
+ // `TileIndex`, which only defines x,y,z
34
+ const index = data.index;
35
+ const { signal } = data;
36
+ const userData = this.props.getSource &&
37
+ (await this.props.getSource(index, { signal }));
38
+ return {
39
+ source: index,
40
+ data: userData,
41
+ signal,
42
+ };
43
+ },
44
+ renderSubLayers: (props) => {
45
+ const { data } = props;
46
+ const { source, signal, data: userData } = data;
47
+ return renderSource(source, { data: userData, signal });
48
+ },
49
+ });
50
+ }
51
+ renderLayers() {
52
+ const { sources, renderSource } = this.props;
53
+ if (!sources || sources.length === 0) {
54
+ return null;
55
+ }
56
+ return this.renderTileLayer(sources, renderSource);
57
+ }
58
+ }
59
+ //# sourceMappingURL=mosaic-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mosaic-layer.js","sourceRoot":"","sources":["../../src/mosaic-layer/mosaic-layer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAkCtD,MAAM,YAAY,GAA8B,EAAE,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,OAAO,WAGX,SAAQ,cAAgD;IACxD,MAAM,CAAU,SAAS,GAAG,aAAa,CAAC;IAC1C,MAAM,CAAU,YAAY,GAAG,YAAY,CAAC;IAE5C,eAAe,CACb,aAAwB,EACxB,YAA8D;QAE9D,MAAM,EACJ,EAAE,EACF,OAAO,EACP,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACZ,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,MAAM,sBAAuB,SAAQ,eAAwB;YAC3D,YAAY,IAAS;gBACnB,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;SACF;QAED,OAAO,IAAI,SAAS,CAIjB;YACD,EAAE,EAAE,gBAAgB,EAAE,EAAE;YACxB,YAAY,EAAE,sBAAsB;YACpC,OAAO;YACP,OAAO;YACP,MAAM;YACN,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;YAC3D,YAAY;YACZ,WAAW;YACX,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC1B,yDAAyD;gBACzD,sEAAsE;gBACtE,wCAAwC;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAgB,CAAC;gBACpC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;gBACxB,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,CAAC,SAAS;oBACpB,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBAElD,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,IAAI,EAAE,QAAQ;oBACd,MAAM;iBACP,CAAC;YACJ,CAAC;YACD,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;gBACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;gBAChD,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEQ,YAAY;QACnB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { Viewport } from "@deck.gl/core";
2
+ import type { _Tileset2DProps as Tileset2DProps } from "@deck.gl/geo-layers";
3
+ import { _Tileset2D as Tileset2D } from "@deck.gl/geo-layers";
4
+ /** Tile index.
5
+ *
6
+ * Note this is essentially just to type-check deck.gl, since getTileIndices
7
+ * must return a `TileIndex[]`.
8
+ */
9
+ export type TileIndex = {
10
+ x: number;
11
+ y: number;
12
+ z: number;
13
+ };
14
+ /**
15
+ * Minimal required interface of a mosaic item.
16
+ */
17
+ export type MosaicSource = {
18
+ x?: number;
19
+ y?: number;
20
+ z?: number;
21
+ /**
22
+ * Geographic bounds (WGS84) of the source in [minX, minY, maxX, maxY] format
23
+ */
24
+ bbox: [number, number, number, number];
25
+ };
26
+ /**
27
+ * A deck.gl Tileset2D for navigating an arbitrary collection of bounding boxes.
28
+ *
29
+ * This is intended to be used for a collection of image mosaics, where we want
30
+ * to render all images currently visible in the viewport.
31
+ */
32
+ export declare class MosaicTileset2D<MosaicT extends MosaicSource> extends Tileset2D {
33
+ private sources;
34
+ private index;
35
+ constructor(sources: MosaicT[], opts: Tileset2DProps);
36
+ getTileIndices({ viewport, maxZoom, minZoom, }: {
37
+ viewport: Viewport;
38
+ maxZoom?: number;
39
+ minZoom?: number;
40
+ }): (TileIndex & MosaicT)[];
41
+ }
42
+ //# sourceMappingURL=mosaic-tileset-2d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mosaic-tileset-2d.d.ts","sourceRoot":"","sources":["../../src/mosaic-layer/mosaic-tileset-2d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG9D;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,eAAe,CAAC,OAAO,SAAS,YAAY,CAAE,SAAQ,SAAS;IAC1E,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,KAAK,CAAW;gBAEZ,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc;IAwB3C,cAAc,CAAC,EACtB,QAAQ,EACR,OAAO,EACP,OAAO,GACR,EAAE;QACD,QAAQ,EAAE,QAAQ,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE;CAY5B"}
@@ -0,0 +1,44 @@
1
+ import { _Tileset2D as Tileset2D } from "@deck.gl/geo-layers";
2
+ import Flatbush from "flatbush";
3
+ /**
4
+ * A deck.gl Tileset2D for navigating an arbitrary collection of bounding boxes.
5
+ *
6
+ * This is intended to be used for a collection of image mosaics, where we want
7
+ * to render all images currently visible in the viewport.
8
+ */
9
+ export class MosaicTileset2D extends Tileset2D {
10
+ sources;
11
+ index;
12
+ constructor(sources, opts) {
13
+ super(opts);
14
+ // Add x,y,z to each source for TileIndex compatibility
15
+ // This is mostly just a hack to satisfy deck.gl typing requirements for
16
+ // getTileIndices
17
+ this.sources = sources.map((source, i) => ({
18
+ x: source.x === undefined ? i : source.x,
19
+ y: source.y === undefined ? 0 : source.y,
20
+ z: source.z === undefined ? 0 : source.z,
21
+ ...source,
22
+ }));
23
+ // Build spatial index of mosaic sources
24
+ const index = new Flatbush(sources.length);
25
+ for (const source of sources) {
26
+ const [minX, minY, maxX, maxY] = source.bbox;
27
+ index.add(minX, minY, maxX, maxY);
28
+ }
29
+ index.finish();
30
+ this.index = index;
31
+ }
32
+ getTileIndices({ viewport, maxZoom, minZoom, }) {
33
+ if (viewport.zoom < (minZoom ?? -Infinity)) {
34
+ return [];
35
+ }
36
+ if (viewport.zoom > (maxZoom ?? Infinity)) {
37
+ return [];
38
+ }
39
+ const bounds = viewport.getBounds();
40
+ const indices = this.index.search(...bounds);
41
+ return indices.map((sourceIndex) => this.sources[sourceIndex]);
42
+ }
43
+ }
44
+ //# sourceMappingURL=mosaic-tileset-2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mosaic-tileset-2d.js","sourceRoot":"","sources":["../../src/mosaic-layer/mosaic-tileset-2d.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,QAAQ,MAAM,UAAU,CAAC;AAsBhC;;;;;GAKG;AACH,MAAM,OAAO,eAA8C,SAAQ,SAAS;IAClE,OAAO,CAA0B;IACjC,KAAK,CAAW;IAExB,YAAY,OAAkB,EAAE,IAAoB;QAClD,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,uDAAuD;QACvD,wEAAwE;QACxE,iBAAiB;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxC,GAAG,MAAM;SACV,CAAC,CAAC,CAAC;QAEJ,wCAAwC;QACxC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YAC7C,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEQ,cAAc,CAAC,EACtB,QAAQ,EACR,OAAO,EACP,OAAO,GAKR;QACC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC,CAAC;IAClE,CAAC;CACF"}
package/dist/proj.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import type { ProjectionDefinition } from "proj4";
2
+ import type { PROJJSONDefinition } from "proj4/dist/lib/core";
3
+ export type SupportedCrsUnit = "m" | "metre" | "meter" | "meters" | "foot" | "US survey foot" | "degree";
4
+ export interface ProjectionInfo {
5
+ /** Proj4-compatible projection definition (PROJJSON or proj4 string) */
6
+ def: string | PROJJSONDefinition;
7
+ /** A parsed projection definition */
8
+ parsed: ProjectionDefinition;
9
+ /** Units of the coordinate system */
10
+ coordinatesUnits: SupportedCrsUnit;
11
+ }
12
+ export type GeoKeysParser = (geoKeys: Record<string, any>) => Promise<ProjectionInfo | null>;
13
+ /**
14
+ * Get the Projection of a GeoTIFF
15
+ *
16
+ * The first `image` must be passed in, as only the top-level IFD contains geo
17
+ * keys.
18
+ */
19
+ export declare function epsgIoGeoKeyParser(geoKeys: Record<string, any>): Promise<ProjectionInfo | null>;
20
+ /**
21
+ * Parse a proj4-accepted input into a ProjectionDefinition
22
+ */
23
+ export declare function parseCrs(crs: string | PROJJSONDefinition): ProjectionDefinition;
24
+ //# sourceMappingURL=proj.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proj.d.ts","sourceRoot":"","sources":["../src/proj.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GACxB,GAAG,GACH,OAAO,GACP,OAAO,GACP,QAAQ,GACR,MAAM,GACN,gBAAgB,GAChB,QAAQ,CAAC;AAEb,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACjC,qCAAqC;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,qCAAqC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACzB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAEpC;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgBhC;AAiBD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAC/B,oBAAoB,CAStB"}
package/dist/proj.js ADDED
@@ -0,0 +1,46 @@
1
+ import proj4 from "proj4";
2
+ /**
3
+ * Get the Projection of a GeoTIFF
4
+ *
5
+ * The first `image` must be passed in, as only the top-level IFD contains geo
6
+ * keys.
7
+ */
8
+ export async function epsgIoGeoKeyParser(geoKeys) {
9
+ const projectionCode = geoKeys.ProjectedCSTypeGeoKey || geoKeys.GeographicTypeGeoKey || null;
10
+ const sourceProjection = await getProjjson(projectionCode);
11
+ if (!sourceProjection) {
12
+ return null;
13
+ }
14
+ const parsed = parseCrs(sourceProjection);
15
+ return {
16
+ def: sourceProjection,
17
+ parsed,
18
+ coordinatesUnits: parsed.units,
19
+ };
20
+ }
21
+ /** Query epsg.io for the PROJJSON corresponding to the given EPSG code. */
22
+ async function getProjjson(projectionCode) {
23
+ if (projectionCode === null) {
24
+ return null;
25
+ }
26
+ const url = `https://epsg.io/${projectionCode}.json`;
27
+ const response = await fetch(url);
28
+ if (!response.ok) {
29
+ throw new Error(`Failed to fetch projection data from ${url}`);
30
+ }
31
+ const data = await response.json();
32
+ return data;
33
+ }
34
+ /**
35
+ * Parse a proj4-accepted input into a ProjectionDefinition
36
+ */
37
+ export function parseCrs(crs) {
38
+ // If you pass proj4.defs a projjson, it doesn't parse it; it just returns the
39
+ // input.
40
+ //
41
+ // Instead, you need to assign it to an alias and then retrieve it.
42
+ const key = "__deck.gl-geotiff-internal__";
43
+ proj4.defs(key, crs);
44
+ return proj4.defs(key);
45
+ }
46
+ //# sourceMappingURL=proj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proj.js","sourceRoot":"","sources":["../src/proj.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAyB1B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA4B;IAE5B,MAAM,cAAc,GAClB,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC;IAExE,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;IAE3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO;QACL,GAAG,EAAE,gBAAgB;QACrB,MAAM;QACN,gBAAgB,EAAE,MAAM,CAAC,KAAyB;KACnD,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,WAAW,CAAC,cAA6B;IACtD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,mBAAmB,cAAc,OAAO,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAgC;IAEhC,8EAA8E;IAC9E,SAAS;IACT,EAAE;IACF,mEAAmE;IAEnE,MAAM,GAAG,GAAG,8BAA8B,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}