import { fromUrl } from 'geotiff'; // 假设你用的是这个包 import { transform } from 'ol/proj'; import { fromLonLat } from 'ol/proj'; import ImageLayer from 'ol/layer/Image'; import Static from 'ol/source/ImageStatic'; import gcoord from 'gcoord'; export class GeoTiffLoader { imageExtent: number[] = []; imageLayer: ImageLayer | null = null; tiffUrl: string; constructor(tiffUrl: string) { this.tiffUrl = tiffUrl; } async init() { const tiff = await fromUrl(this.tiffUrl); const image = await tiff.getImage(); const width = image.getWidth(); const height = image.getHeight(); const bbox = image.getBoundingBox(); // [minX, minY, maxX, maxY] console.log('bbox', bbox); const rasters = (await image.readRasters({ interleave: true })) as Uint8Array; // 创建 Canvas const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d')!; const imageData = ctx.createImageData(width, height); // 设置 RGBA 数据 imageData.data.set(rasters); ctx.putImageData(imageData, 0, 0); // 转成 Data URL const imageUrl = canvas.toDataURL(); // 坐标转换 const minLonLat = transform([bbox[0], bbox[1]], 'EPSG:32648', 'EPSG:4326'); const maxLonLat = transform([bbox[2], bbox[3]], 'EPSG:32648', 'EPSG:4326'); // 转为 GCJ02 坐标系 // 这里断言为[number, number, number],补0做三维坐标 const gcjMin = gcoord.transform([minLonLat[0], minLonLat[1], 0], gcoord.WGS84, gcoord.GCJ02); const gcjMax = gcoord.transform([maxLonLat[0], maxLonLat[1], 0], gcoord.WGS84, gcoord.GCJ02); // 再转为 EPSG:3857 const minXY = fromLonLat(gcjMin); const maxXY = fromLonLat(gcjMax); this.imageExtent = [...minXY, ...maxXY]; this.imageLayer = new ImageLayer({ source: new Static({ url: imageUrl, imageExtent: this.imageExtent, projection: 'EPSG:3857' }) }); console.log('imageExtent', this.imageExtent); } }