diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 0980b51..1edf00e 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -235,11 +235,13 @@ export class COGLayer< const inverseReproject = (x: number, y: number) => converter.inverse<[number, number]>([x, y], false); - const geographicBounds = getGeographicBounds(image, converter); - this.props.onGeoTIFFLoad?.(geotiff, { - projection: sourceProjection, - geographicBounds, - }); + if (this.props.onGeoTIFFLoad) { + const geographicBounds = getGeographicBounds(image, converter); + this.props.onGeoTIFFLoad(geotiff, { + projection: sourceProjection, + geographicBounds, + }); + } this.setState({ metadata, diff --git a/packages/deck.gl-geotiff/src/geotiff-layer.ts b/packages/deck.gl-geotiff/src/geotiff-layer.ts index e1c47aa..25e27e3 100644 --- a/packages/deck.gl-geotiff/src/geotiff-layer.ts +++ b/packages/deck.gl-geotiff/src/geotiff-layer.ts @@ -4,9 +4,15 @@ import { RasterLayer } from "@developmentseed/deck.gl-raster"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; import type { BaseClient, GeoTIFF, Pool } from "geotiff"; import { extractGeotiffReprojectors } from "./geotiff-reprojection.js"; -import { defaultPool, fetchGeoTIFF, loadRgbImage } from "./geotiff.js"; +import { + defaultPool, + fetchGeoTIFF, + getGeographicBounds, + loadRgbImage, +} from "./geotiff.js"; import type { GeoKeysParser, ProjectionInfo } from "./proj.js"; import { epsgIoGeoKeyParser } from "./proj.js"; +import proj4 from "proj4"; const DEFAULT_MAX_ERROR = 0.125; @@ -65,7 +71,22 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { * @param {GeoTIFF} geotiff * @param {ProjectionInfo} projection */ - onGeoTIFFLoad?: (geotiff: GeoTIFF, projection: ProjectionInfo) => void; + onGeoTIFFLoad?: ( + geotiff: GeoTIFF, + options: { + projection: ProjectionInfo; + /** + * Bounds of the image in geographic coordinates (WGS84) [minLon, minLat, + * maxLon, maxLat] + */ + geographicBounds: { + west: number; + south: number; + east: number; + north: number; + }; + }, + ) => void; } const defaultProps = { @@ -122,11 +143,19 @@ export class GeoTIFFLayer extends CompositeLayer { ); } - this.props.onGeoTIFFLoad?.(geotiff, sourceProjection); + const converter = proj4(sourceProjection.def, "EPSG:4326"); + + if (this.props.onGeoTIFFLoad) { + const geographicBounds = getGeographicBounds(image, converter); + this.props.onGeoTIFFLoad(geotiff, { + projection: sourceProjection, + geographicBounds, + }); + } const reprojectionFns = await extractGeotiffReprojectors( geotiff, - this.props.geoKeysParser!, + sourceProjection.def, ); const { texture, height, width } = await loadRgbImage(image, { pool: this.props.pool || defaultPool(), diff --git a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts index 66c8192..2a9c308 100644 --- a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts +++ b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts @@ -9,7 +9,6 @@ import { import proj4 from "proj4"; import type { PROJJSONDefinition } from "proj4/dist/lib/core"; import type Projection from "proj4/dist/lib/Proj"; -import type { GeoKeysParser } from "./proj"; export const OGC_84: PROJJSONDefinition = { $schema: "https://proj.org/schemas/v0.7/projjson.schema.json", @@ -90,7 +89,7 @@ export const OGC_84: PROJJSONDefinition = { // TODO: return a RasterReprojector instance, given the IFD and tile of interest? export async function extractGeotiffReprojectors( tiff: GeoTIFF, - geoKeysParser: GeoKeysParser, + sourceProjection: string | PROJJSONDefinition, outputCrs: string | PROJJSONDefinition | Projection = OGC_84, ): Promise { const image = await tiff.getImage(); @@ -99,13 +98,7 @@ export async function extractGeotiffReprojectors( // Only the top-level IFD has geo keys, so we'll derive overviews from this const baseGeotransform = extractGeotransform(image); - const sourceProjection = await geoKeysParser(image.getGeoKeys()); - if (sourceProjection === null) { - throw new Error( - "Could not determine source projection from GeoTIFF geo keys", - ); - } - const converter = proj4(sourceProjection.def, outputCrs); + const converter = proj4(sourceProjection, outputCrs); const { forwardTransform, inverseTransform } = fromGeoTransform(baseGeotransform);