@things-factory/weather 9.0.24 → 9.0.34

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.
@@ -28,7 +28,7 @@ const windData: Promise<{ data: ArrayBuffer; width: number; height: number }> =
28
28
 
29
29
  const context = canvas.getContext('2d')!
30
30
  context.drawImage(image, 0, 0)
31
- const data = context.getImageData(0, 0, width, height).data
31
+ const data = context.getImageData(0, 0, width, height).data.buffer
32
32
  resolve({ data, width, height })
33
33
  }
34
34
  image.onerror = () => {
@@ -27,7 +27,7 @@ const windData: Promise<{ data: ArrayBuffer; width: number; height: number }> =
27
27
 
28
28
  const context = canvas.getContext('2d')!
29
29
  context.drawImage(image, 0, 0)
30
- const data = context.getImageData(0, 0, width, height).data
30
+ const data = context.getImageData(0, 0, width, height).data.buffer
31
31
  resolve({ data, width, height })
32
32
  }
33
33
  image.onerror = () => {
@@ -21,7 +21,7 @@ const windData = new Promise((resolve, reject) => {
21
21
  canvas.height = height;
22
22
  const context = canvas.getContext('2d');
23
23
  context.drawImage(image, 0, 0);
24
- const data = context.getImageData(0, 0, width, height).data;
24
+ const data = context.getImageData(0, 0, width, height).data.buffer;
25
25
  resolve({ data, width, height });
26
26
  };
27
27
  image.onerror = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"wind-data-tile-layer.js","sourceRoot":"","sources":["../../client/ol-components/wind-data-tile-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import { get as getProjection, transform } from 'ol/proj.js'\nimport DataTileSource from 'ol/source/DataTile.js'\nimport { createXYZ, wrapX } from 'ol/tilegrid.js'\nimport Layer from 'ol/layer/Layer.js'\nimport BaseLayer from 'ol/layer/Base.js'\nimport Map from 'ol/Map.js'\nimport { WeatherLayerType } from '@hyperviz/weather' // BaseWeatherLayer 인터페이스 호환을 위해 타입 임포트\n\n/**\n * 바람 데이터를 표시하기 위한 타일 기반 레이어\n * PNG 이미지 데이터를 DataTileSource로 변환하여 효율적인 렌더링 제공\n *\n * @class WindDataTileLayer\n */\n\n// --- 데이터 로딩 및 변환 로직 ---\n\n/** 바람 데이터 이미지 로딩 Promise */\nconst windData: Promise<{ data: ArrayBuffer; width: number; height: number }> = new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n // 이미지 데이터를 캔버스로 변환하여 픽셀 데이터 접근\n const canvas = document.createElement('canvas')\n const width = image.width\n const height = image.height\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')!\n context.drawImage(image, 0, 0)\n const data = context.getImageData(0, 0, width, height).data\n resolve({ data, width, height })\n }\n image.onerror = () => {\n reject(new Error('바람 데이터 이미지 로드 실패'))\n }\n image.src = '/assets/images/wind.png' // 데이터 소스 경로\n})\n\n/**\n * 바이리니어 보간법을 사용하여 픽셀 값 계산\n */\nfunction bilinearInterpolation(\n xAlong: number,\n yAlong: number,\n v11: number,\n v21: number,\n v12: number,\n v22: number\n): number {\n const q11 = (1 - xAlong) * (1 - yAlong) * v11\n const q21 = xAlong * (1 - yAlong) * v21\n const q12 = (1 - xAlong) * yAlong * v12\n const q22 = xAlong * yAlong * v22\n return q11 + q21 + q12 + q22\n}\n\n/**\n * 픽셀 배열에 대한 보간법 적용\n */\nfunction interpolatePixels(\n xAlong: number,\n yAlong: number,\n p11: number[],\n p21: number[],\n p12: number[],\n p22: number[]\n): number[] {\n return p11.map((_, i) => bilinearInterpolation(xAlong, yAlong, p11[i], p21[i], p12[i], p22[i]))\n}\n\n// 타일 그리드 및 투영 설정\nconst dataTileGrid = createXYZ()\nconst dataTileSize = 256\n\nconst inputImageProjection = getProjection('EPSG:4326')!\nconst dataTileProjection = getProjection('EPSG:3857')!\n\nconst inputBands = 4 // RGBA\nconst dataBands = 3 // u, v, magnitude\n\n// 바람 속도 범위 (원본 이미지 값 기준)\nconst minU = -21.32\nconst maxU = 26.8\nconst deltaU = maxU - minU\nconst minV = -21.57\nconst maxV = 21.42\nconst deltaV = maxV - minV\n\n// 바람 속도에 따른 색상 매핑 (속도, [R, G, B, A])\nconst windColorMap: Array<[number, [number, number, number, number]]> = [\n [0, [0, 50, 170, 100]], // 약한 바람 (파란색)\n [5, [0, 100, 220, 150]], // 중약한 바람\n [10, [0, 150, 200, 180]], // 중간 바람 (청록색)\n [15, [0, 200, 150, 200]], // 중강한 바람 (녹색)\n [20, [150, 250, 0, 220]], // 강한 바람 (노란색)\n [25, [200, 150, 0, 230]], // 매우 강한 바람 (주황색)\n [30, [250, 50, 0, 250]] // 극심한 바람 (빨간색)\n]\n\n// --- 레이어 클래스 구현 ---\n\nexport class WindDataTileLayer {\n private source: DataTileSource\n private layer: Layer | null = null // 실제 OpenLayers 레이어\n private map: Map | null = null\n private useEnhancedColors: boolean = true // 향상된 색상 매핑 사용 여부\n private __disposed: boolean = false // 레이어가 폐기되었는지 여부를 추적하기 위한 플래그\n\n /**\n * 바람 데이터 타일 레이어 생성\n * @param options 옵션 객체\n */\n constructor(options: { useEnhancedColors?: boolean } = {}) {\n // 향상된 색상 매핑 옵션 설정\n if (options.useEnhancedColors !== undefined) {\n this.useEnhancedColors = options.useEnhancedColors\n }\n\n // DataTileSource 생성\n this.source = new DataTileSource({\n // transition must be 0 for DataTileSource, see https://github.com/openlayers/openlayers/issues/16119\n transition: 0,\n wrapX: true,\n loader: this._tileLoader.bind(this)\n })\n }\n\n /**\n * 타일 데이터 로딩 함수\n * @private\n */\n private async _tileLoader(z: number, x: number, y: number): Promise<Float32Array> {\n // 타일 경계 체크: 요청된 타일이 유효한 범위를 벗어나면 빈 데이터 반환\n // z=0일 때 x와 y는 모두 0이어야 함\n // z=1일 때 x와 y는 0 또는 1\n // z=2일 때 x와 y는 0, 1, 2, 3 중 하나\n // 즉, z에 대해 x와 y는 0부터 2^z-1 사이의 값이어야 함\n const maxTileCoord = Math.pow(2, z) - 1\n if (x < 0 || y < 0 || x > maxTileCoord || y > maxTileCoord) {\n console.warn(`🚨 타일 범위 초과: z=${z}, x=${x}, y=${y}, 최대값=${maxTileCoord}`)\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n\n try {\n // 폐기된 레이어의 경우 빈 데이터 반환\n if (this.__disposed) {\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n\n const { data: inputData, width: inputWidth, height: inputHeight } = await windData\n\n // wrapX를 통해 날짜변경선 처리\n const tileCoord = wrapX(dataTileGrid, [z, x, y], dataTileProjection)\n const extent = dataTileGrid.getTileCoordExtent(tileCoord)\n const resolution = dataTileGrid.getResolution(z)\n\n // 타일 데이터 배열 (Float32Array 사용)\n const data = new Float32Array(dataTileSize * dataTileSize * dataBands)\n\n for (let row = 0; row < dataTileSize; ++row) {\n let offset = row * dataTileSize * dataBands\n const mapY = extent[3] - row * resolution\n\n for (let col = 0; col < dataTileSize; ++col) {\n const mapX = extent[0] + col * resolution\n\n try {\n // 현재 픽셀의 좌표를 EPSG:4326으로 변환\n const [lon, lat] = transform([mapX, mapY], dataTileProjection, inputImageProjection)\n\n // 유효한 좌표 범위 확인 (-180 ~ 180, -90 ~ 90)\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) {\n // 범위를 벗어나는 좌표는 기본값으로 처리\n data[offset] = 0 // u (동서 방향 바람)\n data[offset + 1] = 0 // v (남북 방향 바람)\n data[offset + 2] = 0 // magnitude (바람 세기)\n offset += dataBands\n continue\n }\n\n // 원본 이미지에서의 상대적 위치 계산\n const x = (inputWidth * (lon + 180)) / 360\n let x1 = Math.floor(x)\n let x2 = Math.ceil(x)\n const xAlong = x - x1\n\n // 경도 랩핑 처리 (날짜변경선)\n if (x1 < 0) {\n x1 += inputWidth\n }\n if (x2 >= inputWidth) {\n x2 -= inputWidth\n }\n\n const y = (inputHeight * (90 - lat)) / 180\n let y1 = Math.floor(y)\n let y2 = Math.ceil(y)\n const yAlong = y - y1\n\n // 위도 범위 제한\n if (y1 < 0) {\n y1 = 0\n }\n if (y2 >= inputHeight) {\n y2 = inputHeight - 1\n }\n\n const corners = [\n [x1, y1],\n [x2, y1],\n [x1, y2],\n [x2, y2]\n ]\n\n // 주변 4개 픽셀의 u, v 값 읽기\n const pixels = corners.map(([cx, cy]) => {\n // 유효한 인덱스 확인\n if (cx < 0 || cx >= inputWidth || cy < 0 || cy >= inputHeight) {\n return [0, 0] // 잘못된 좌표는 기본값 사용\n }\n\n const inputOffset = (cy * inputWidth + cx) * inputBands\n // 원본 PNG 데이터에서 u, v 값 추출 (R 채널=u, G 채널=v)\n return [inputData[inputOffset], inputData[inputOffset + 1]]\n })\n\n // u, v 값 보간\n const interpolated = interpolatePixels(xAlong, yAlong, ...(pixels as [any, any, any, any]))\n\n // 실제 u, v 값으로 변환\n const u = minU + (deltaU * interpolated[0]) / 255\n const v = minV + (deltaV * interpolated[1]) / 255\n\n // 바람 속도 계산 (옵션)\n const speed = Math.sqrt(u * u + v * v)\n\n // 타일 데이터에 저장\n data[offset] = u\n data[offset + 1] = v\n data[offset + 2] = speed // 속도 값 저장 (셰이더에서 활용 가능)\n } catch (pixelError) {\n // 개별 픽셀 처리 중 오류 발생 시 해당 픽셀만 기본값으로 처리\n data[offset] = 0 // u\n data[offset + 1] = 0 // v\n data[offset + 2] = 0 // magnitude\n }\n\n offset += dataBands\n }\n }\n\n return data // Float32Array 반환\n } catch (error) {\n // 타일 로드 실패 로그\n console.warn(`🚨 타일 없음: z=${z}, x=${x}, y=${y}`, error)\n\n // 오류 발생 시 빈 타일 데이터 반환\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n }\n\n /**\n * 레이어 타입 반환 (호환성용)\n */\n getType(): WeatherLayerType {\n return 'wind'\n }\n\n /**\n * 향상된 색상 매핑 사용 여부 설정\n */\n setUseEnhancedColors(use: boolean): void {\n this.useEnhancedColors = use\n this.updateLayer() // 변경사항 적용을 위해 레이어 업데이트\n }\n\n /**\n * OpenLayers 레이어 객체 생성 또는 반환\n */\n createLayer(): BaseLayer {\n if (this.__disposed) {\n console.warn('폐기된 레이어에서 createLayer가 호출되었습니다')\n return new Layer({}) // 빈 레이어 반환\n }\n\n if (!this.layer) {\n // 렌더링 파이프라인과의 충돌을 최소화하기 위해 간단한 설정으로 레이어 생성\n this.layer = new Layer({\n source: this.source,\n properties: {\n useEnhancedColors: this.useEnhancedColors,\n // 렌더링 시 이 속성을 확인하도록 구현\n __windLayerDisposed: false\n }\n })\n }\n return this.layer\n }\n\n /**\n * 요청 중인 데이터 로드 중단 및 소스 무효화\n * @private\n */\n private _clearSourceData(): void {\n if (!this.source) return\n\n try {\n // 소스에서 로드된 타일 데이터 초기화\n if (typeof this.source.clear === 'function') {\n this.source.clear() // 타일 캐시 정리\n }\n\n // 더 이상 데이터를 제공하지 않도록 소스 무효화\n // 소스의 내부 속성에 접근 (타입 어설션 사용)\n const sourceAny = this.source as any\n if (sourceAny.loader) {\n // 로더 함수를 빈 데이터를 반환하는 함수로 재정의\n sourceAny.loader = (_z: number, _x: number, _y: number) => {\n // 빈 데이터 반환\n return Promise.resolve(new Float32Array(dataTileSize * dataTileSize * dataBands))\n }\n }\n } catch (e) {\n console.warn('소스 정리 중 오류:', e)\n }\n }\n\n /**\n * 레이어를 맵에 추가\n */\n addToMap(map: Map): void {\n if (this.__disposed) {\n console.warn('폐기된 레이어는 맵에 추가할 수 없습니다')\n return\n }\n\n if (!this.map) {\n this.map = map\n }\n\n if (!this.layer) {\n this.createLayer()\n }\n\n if (this.layer && this.map) {\n this.map.addLayer(this.layer)\n }\n }\n\n /**\n * 레이어를 맵에서 제거\n */\n removeFromMap(): void {\n if (!this.layer || !this.map || this.__disposed) {\n return // 이미 제거되었거나 맵에 추가되지 않은 경우\n }\n\n try {\n // OpenLayers 렌더링 문제 방지를 위한 사전 처리\n this.__disposed = true // 먼저 플래그 설정\n\n // 1. 레이어가 렌더링 파이프라인에서 무시되도록 설정\n this.layer.setVisible(false) // 시각적 숨김\n this.layer.set('__windLayerDisposed', true) // 내부 플래그 설정\n this.layer.changed() // 렌더링 파이프라인에 변경 알림\n\n // 2. 요청 중인 모든 데이터 로드 중단\n this._clearSourceData()\n\n // 3. 연결된 맵과 소스에서 레이어 분리\n try {\n if (this.map && this.layer) {\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n }\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n }\n\n // 4. 레이어 참조 정리\n this.map = null\n } catch (e) {\n console.error('레이어 제거 중 오류:', e)\n\n // 오류 발생 시에도 맵에서 레이어 제거 시도\n try {\n if (this.map && this.layer) {\n this.map.removeLayer(this.layer)\n }\n } catch (e2) {\n // 무시\n }\n this.map = null\n }\n }\n\n /**\n * 레이어 관련 리소스 해제\n */\n dispose(): void {\n if (this.__disposed) {\n return // 이미 폐기된 경우\n }\n\n this.__disposed = true // 폐기 플래그 설정\n\n // 맵에서 제거 (아직 제거되지 않은 경우)\n if (this.map && this.layer) {\n try {\n // 렌더링 에러 방지를 위해 먼저 레이어 숨김 및 상태 설정\n this.layer.setVisible(false)\n this.layer.set('__windLayerDisposed', true)\n this.layer.changed()\n\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n } finally {\n this.map = null // 맵 참조 해제\n }\n }\n\n // 나머지 리소스 정리\n try {\n // 레이어 정리\n if (this.layer) {\n try {\n // 레이어에서 소스 분리\n if (typeof this.layer.setSource === 'function') {\n this.layer.setSource(null)\n }\n\n // 레이어 객체 정리\n if (typeof this.layer.dispose === 'function') {\n this.layer.dispose()\n }\n } catch (e) {\n console.warn('레이어 정리 중 오류:', e)\n }\n this.layer = null\n }\n\n // 소스 정리\n if (this.source) {\n try {\n // 소스 정리\n if (typeof this.source.dispose === 'function') {\n this.source.dispose()\n }\n } catch (e) {\n console.warn('소스 정리 중 오류:', e)\n }\n this.source = null as any\n }\n } catch (e) {\n console.error('리소스 정리 중 오류:', e)\n }\n }\n\n /**\n * 레이어 업데이트 요청 (데이터 변경 시)\n */\n updateLayer(): void {\n if (this.source) {\n this.source.changed() // 타일 다시 로드 트리거\n }\n\n // 속성 업데이트 (향상된 색상 매핑 옵션)\n if (this.layer) {\n this.layer.set('useEnhancedColors', this.useEnhancedColors)\n }\n }\n\n /**\n * 데이터 설정 메서드 (호환성용, 실제 데이터는 PNG 이미지에 고정됨)\n */\n setWeatherData(data: any): void {\n // 이 구현에서는 외부 데이터를 직접 설정하지 않음\n // 필요하다면 updateLayer 호출 또는 다른 로직 구현 가능\n console.warn('setWeatherData called on WindDataTileLayer, but data is static.')\n this.updateLayer() // 데이터가 변경된 것처럼 타일 갱신 시도\n }\n}\n"]}
1
+ {"version":3,"file":"wind-data-tile-layer.js","sourceRoot":"","sources":["../../client/ol-components/wind-data-tile-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import { get as getProjection, transform } from 'ol/proj.js'\nimport DataTileSource from 'ol/source/DataTile.js'\nimport { createXYZ, wrapX } from 'ol/tilegrid.js'\nimport Layer from 'ol/layer/Layer.js'\nimport BaseLayer from 'ol/layer/Base.js'\nimport Map from 'ol/Map.js'\nimport { WeatherLayerType } from '@hyperviz/weather' // BaseWeatherLayer 인터페이스 호환을 위해 타입 임포트\n\n/**\n * 바람 데이터를 표시하기 위한 타일 기반 레이어\n * PNG 이미지 데이터를 DataTileSource로 변환하여 효율적인 렌더링 제공\n *\n * @class WindDataTileLayer\n */\n\n// --- 데이터 로딩 및 변환 로직 ---\n\n/** 바람 데이터 이미지 로딩 Promise */\nconst windData: Promise<{ data: ArrayBuffer; width: number; height: number }> = new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n // 이미지 데이터를 캔버스로 변환하여 픽셀 데이터 접근\n const canvas = document.createElement('canvas')\n const width = image.width\n const height = image.height\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')!\n context.drawImage(image, 0, 0)\n const data = context.getImageData(0, 0, width, height).data.buffer\n resolve({ data, width, height })\n }\n image.onerror = () => {\n reject(new Error('바람 데이터 이미지 로드 실패'))\n }\n image.src = '/assets/images/wind.png' // 데이터 소스 경로\n})\n\n/**\n * 바이리니어 보간법을 사용하여 픽셀 값 계산\n */\nfunction bilinearInterpolation(\n xAlong: number,\n yAlong: number,\n v11: number,\n v21: number,\n v12: number,\n v22: number\n): number {\n const q11 = (1 - xAlong) * (1 - yAlong) * v11\n const q21 = xAlong * (1 - yAlong) * v21\n const q12 = (1 - xAlong) * yAlong * v12\n const q22 = xAlong * yAlong * v22\n return q11 + q21 + q12 + q22\n}\n\n/**\n * 픽셀 배열에 대한 보간법 적용\n */\nfunction interpolatePixels(\n xAlong: number,\n yAlong: number,\n p11: number[],\n p21: number[],\n p12: number[],\n p22: number[]\n): number[] {\n return p11.map((_, i) => bilinearInterpolation(xAlong, yAlong, p11[i], p21[i], p12[i], p22[i]))\n}\n\n// 타일 그리드 및 투영 설정\nconst dataTileGrid = createXYZ()\nconst dataTileSize = 256\n\nconst inputImageProjection = getProjection('EPSG:4326')!\nconst dataTileProjection = getProjection('EPSG:3857')!\n\nconst inputBands = 4 // RGBA\nconst dataBands = 3 // u, v, magnitude\n\n// 바람 속도 범위 (원본 이미지 값 기준)\nconst minU = -21.32\nconst maxU = 26.8\nconst deltaU = maxU - minU\nconst minV = -21.57\nconst maxV = 21.42\nconst deltaV = maxV - minV\n\n// 바람 속도에 따른 색상 매핑 (속도, [R, G, B, A])\nconst windColorMap: Array<[number, [number, number, number, number]]> = [\n [0, [0, 50, 170, 100]], // 약한 바람 (파란색)\n [5, [0, 100, 220, 150]], // 중약한 바람\n [10, [0, 150, 200, 180]], // 중간 바람 (청록색)\n [15, [0, 200, 150, 200]], // 중강한 바람 (녹색)\n [20, [150, 250, 0, 220]], // 강한 바람 (노란색)\n [25, [200, 150, 0, 230]], // 매우 강한 바람 (주황색)\n [30, [250, 50, 0, 250]] // 극심한 바람 (빨간색)\n]\n\n// --- 레이어 클래스 구현 ---\n\nexport class WindDataTileLayer {\n private source: DataTileSource\n private layer: Layer | null = null // 실제 OpenLayers 레이어\n private map: Map | null = null\n private useEnhancedColors: boolean = true // 향상된 색상 매핑 사용 여부\n private __disposed: boolean = false // 레이어가 폐기되었는지 여부를 추적하기 위한 플래그\n\n /**\n * 바람 데이터 타일 레이어 생성\n * @param options 옵션 객체\n */\n constructor(options: { useEnhancedColors?: boolean } = {}) {\n // 향상된 색상 매핑 옵션 설정\n if (options.useEnhancedColors !== undefined) {\n this.useEnhancedColors = options.useEnhancedColors\n }\n\n // DataTileSource 생성\n this.source = new DataTileSource({\n // transition must be 0 for DataTileSource, see https://github.com/openlayers/openlayers/issues/16119\n transition: 0,\n wrapX: true,\n loader: this._tileLoader.bind(this)\n })\n }\n\n /**\n * 타일 데이터 로딩 함수\n * @private\n */\n private async _tileLoader(z: number, x: number, y: number): Promise<Float32Array> {\n // 타일 경계 체크: 요청된 타일이 유효한 범위를 벗어나면 빈 데이터 반환\n // z=0일 때 x와 y는 모두 0이어야 함\n // z=1일 때 x와 y는 0 또는 1\n // z=2일 때 x와 y는 0, 1, 2, 3 중 하나\n // 즉, z에 대해 x와 y는 0부터 2^z-1 사이의 값이어야 함\n const maxTileCoord = Math.pow(2, z) - 1\n if (x < 0 || y < 0 || x > maxTileCoord || y > maxTileCoord) {\n console.warn(`🚨 타일 범위 초과: z=${z}, x=${x}, y=${y}, 최대값=${maxTileCoord}`)\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n\n try {\n // 폐기된 레이어의 경우 빈 데이터 반환\n if (this.__disposed) {\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n\n const { data: inputData, width: inputWidth, height: inputHeight } = await windData\n\n // wrapX를 통해 날짜변경선 처리\n const tileCoord = wrapX(dataTileGrid, [z, x, y], dataTileProjection)\n const extent = dataTileGrid.getTileCoordExtent(tileCoord)\n const resolution = dataTileGrid.getResolution(z)\n\n // 타일 데이터 배열 (Float32Array 사용)\n const data = new Float32Array(dataTileSize * dataTileSize * dataBands)\n\n for (let row = 0; row < dataTileSize; ++row) {\n let offset = row * dataTileSize * dataBands\n const mapY = extent[3] - row * resolution\n\n for (let col = 0; col < dataTileSize; ++col) {\n const mapX = extent[0] + col * resolution\n\n try {\n // 현재 픽셀의 좌표를 EPSG:4326으로 변환\n const [lon, lat] = transform([mapX, mapY], dataTileProjection, inputImageProjection)\n\n // 유효한 좌표 범위 확인 (-180 ~ 180, -90 ~ 90)\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) {\n // 범위를 벗어나는 좌표는 기본값으로 처리\n data[offset] = 0 // u (동서 방향 바람)\n data[offset + 1] = 0 // v (남북 방향 바람)\n data[offset + 2] = 0 // magnitude (바람 세기)\n offset += dataBands\n continue\n }\n\n // 원본 이미지에서의 상대적 위치 계산\n const x = (inputWidth * (lon + 180)) / 360\n let x1 = Math.floor(x)\n let x2 = Math.ceil(x)\n const xAlong = x - x1\n\n // 경도 랩핑 처리 (날짜변경선)\n if (x1 < 0) {\n x1 += inputWidth\n }\n if (x2 >= inputWidth) {\n x2 -= inputWidth\n }\n\n const y = (inputHeight * (90 - lat)) / 180\n let y1 = Math.floor(y)\n let y2 = Math.ceil(y)\n const yAlong = y - y1\n\n // 위도 범위 제한\n if (y1 < 0) {\n y1 = 0\n }\n if (y2 >= inputHeight) {\n y2 = inputHeight - 1\n }\n\n const corners = [\n [x1, y1],\n [x2, y1],\n [x1, y2],\n [x2, y2]\n ]\n\n // 주변 4개 픽셀의 u, v 값 읽기\n const pixels = corners.map(([cx, cy]) => {\n // 유효한 인덱스 확인\n if (cx < 0 || cx >= inputWidth || cy < 0 || cy >= inputHeight) {\n return [0, 0] // 잘못된 좌표는 기본값 사용\n }\n\n const inputOffset = (cy * inputWidth + cx) * inputBands\n // 원본 PNG 데이터에서 u, v 값 추출 (R 채널=u, G 채널=v)\n return [inputData[inputOffset], inputData[inputOffset + 1]]\n })\n\n // u, v 값 보간\n const interpolated = interpolatePixels(xAlong, yAlong, ...(pixels as [any, any, any, any]))\n\n // 실제 u, v 값으로 변환\n const u = minU + (deltaU * interpolated[0]) / 255\n const v = minV + (deltaV * interpolated[1]) / 255\n\n // 바람 속도 계산 (옵션)\n const speed = Math.sqrt(u * u + v * v)\n\n // 타일 데이터에 저장\n data[offset] = u\n data[offset + 1] = v\n data[offset + 2] = speed // 속도 값 저장 (셰이더에서 활용 가능)\n } catch (pixelError) {\n // 개별 픽셀 처리 중 오류 발생 시 해당 픽셀만 기본값으로 처리\n data[offset] = 0 // u\n data[offset + 1] = 0 // v\n data[offset + 2] = 0 // magnitude\n }\n\n offset += dataBands\n }\n }\n\n return data // Float32Array 반환\n } catch (error) {\n // 타일 로드 실패 로그\n console.warn(`🚨 타일 없음: z=${z}, x=${x}, y=${y}`, error)\n\n // 오류 발생 시 빈 타일 데이터 반환\n return new Float32Array(dataTileSize * dataTileSize * dataBands)\n }\n }\n\n /**\n * 레이어 타입 반환 (호환성용)\n */\n getType(): WeatherLayerType {\n return 'wind'\n }\n\n /**\n * 향상된 색상 매핑 사용 여부 설정\n */\n setUseEnhancedColors(use: boolean): void {\n this.useEnhancedColors = use\n this.updateLayer() // 변경사항 적용을 위해 레이어 업데이트\n }\n\n /**\n * OpenLayers 레이어 객체 생성 또는 반환\n */\n createLayer(): BaseLayer {\n if (this.__disposed) {\n console.warn('폐기된 레이어에서 createLayer가 호출되었습니다')\n return new Layer({}) // 빈 레이어 반환\n }\n\n if (!this.layer) {\n // 렌더링 파이프라인과의 충돌을 최소화하기 위해 간단한 설정으로 레이어 생성\n this.layer = new Layer({\n source: this.source,\n properties: {\n useEnhancedColors: this.useEnhancedColors,\n // 렌더링 시 이 속성을 확인하도록 구현\n __windLayerDisposed: false\n }\n })\n }\n return this.layer\n }\n\n /**\n * 요청 중인 데이터 로드 중단 및 소스 무효화\n * @private\n */\n private _clearSourceData(): void {\n if (!this.source) return\n\n try {\n // 소스에서 로드된 타일 데이터 초기화\n if (typeof this.source.clear === 'function') {\n this.source.clear() // 타일 캐시 정리\n }\n\n // 더 이상 데이터를 제공하지 않도록 소스 무효화\n // 소스의 내부 속성에 접근 (타입 어설션 사용)\n const sourceAny = this.source as any\n if (sourceAny.loader) {\n // 로더 함수를 빈 데이터를 반환하는 함수로 재정의\n sourceAny.loader = (_z: number, _x: number, _y: number) => {\n // 빈 데이터 반환\n return Promise.resolve(new Float32Array(dataTileSize * dataTileSize * dataBands))\n }\n }\n } catch (e) {\n console.warn('소스 정리 중 오류:', e)\n }\n }\n\n /**\n * 레이어를 맵에 추가\n */\n addToMap(map: Map): void {\n if (this.__disposed) {\n console.warn('폐기된 레이어는 맵에 추가할 수 없습니다')\n return\n }\n\n if (!this.map) {\n this.map = map\n }\n\n if (!this.layer) {\n this.createLayer()\n }\n\n if (this.layer && this.map) {\n this.map.addLayer(this.layer)\n }\n }\n\n /**\n * 레이어를 맵에서 제거\n */\n removeFromMap(): void {\n if (!this.layer || !this.map || this.__disposed) {\n return // 이미 제거되었거나 맵에 추가되지 않은 경우\n }\n\n try {\n // OpenLayers 렌더링 문제 방지를 위한 사전 처리\n this.__disposed = true // 먼저 플래그 설정\n\n // 1. 레이어가 렌더링 파이프라인에서 무시되도록 설정\n this.layer.setVisible(false) // 시각적 숨김\n this.layer.set('__windLayerDisposed', true) // 내부 플래그 설정\n this.layer.changed() // 렌더링 파이프라인에 변경 알림\n\n // 2. 요청 중인 모든 데이터 로드 중단\n this._clearSourceData()\n\n // 3. 연결된 맵과 소스에서 레이어 분리\n try {\n if (this.map && this.layer) {\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n }\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n }\n\n // 4. 레이어 참조 정리\n this.map = null\n } catch (e) {\n console.error('레이어 제거 중 오류:', e)\n\n // 오류 발생 시에도 맵에서 레이어 제거 시도\n try {\n if (this.map && this.layer) {\n this.map.removeLayer(this.layer)\n }\n } catch (e2) {\n // 무시\n }\n this.map = null\n }\n }\n\n /**\n * 레이어 관련 리소스 해제\n */\n dispose(): void {\n if (this.__disposed) {\n return // 이미 폐기된 경우\n }\n\n this.__disposed = true // 폐기 플래그 설정\n\n // 맵에서 제거 (아직 제거되지 않은 경우)\n if (this.map && this.layer) {\n try {\n // 렌더링 에러 방지를 위해 먼저 레이어 숨김 및 상태 설정\n this.layer.setVisible(false)\n this.layer.set('__windLayerDisposed', true)\n this.layer.changed()\n\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n } finally {\n this.map = null // 맵 참조 해제\n }\n }\n\n // 나머지 리소스 정리\n try {\n // 레이어 정리\n if (this.layer) {\n try {\n // 레이어에서 소스 분리\n if (typeof this.layer.setSource === 'function') {\n this.layer.setSource(null)\n }\n\n // 레이어 객체 정리\n if (typeof this.layer.dispose === 'function') {\n this.layer.dispose()\n }\n } catch (e) {\n console.warn('레이어 정리 중 오류:', e)\n }\n this.layer = null\n }\n\n // 소스 정리\n if (this.source) {\n try {\n // 소스 정리\n if (typeof this.source.dispose === 'function') {\n this.source.dispose()\n }\n } catch (e) {\n console.warn('소스 정리 중 오류:', e)\n }\n this.source = null as any\n }\n } catch (e) {\n console.error('리소스 정리 중 오류:', e)\n }\n }\n\n /**\n * 레이어 업데이트 요청 (데이터 변경 시)\n */\n updateLayer(): void {\n if (this.source) {\n this.source.changed() // 타일 다시 로드 트리거\n }\n\n // 속성 업데이트 (향상된 색상 매핑 옵션)\n if (this.layer) {\n this.layer.set('useEnhancedColors', this.useEnhancedColors)\n }\n }\n\n /**\n * 데이터 설정 메서드 (호환성용, 실제 데이터는 PNG 이미지에 고정됨)\n */\n setWeatherData(data: any): void {\n // 이 구현에서는 외부 데이터를 직접 설정하지 않음\n // 필요하다면 updateLayer 호출 또는 다른 로직 구현 가능\n console.warn('setWeatherData called on WindDataTileLayer, but data is static.')\n this.updateLayer() // 데이터가 변경된 것처럼 타일 갱신 시도\n }\n}\n"]}
@@ -19,7 +19,7 @@ const windData = new Promise((resolve, reject) => {
19
19
  canvas.height = height;
20
20
  const context = canvas.getContext('2d');
21
21
  context.drawImage(image, 0, 0);
22
- const data = context.getImageData(0, 0, width, height).data;
22
+ const data = context.getImageData(0, 0, width, height).data.buffer;
23
23
  resolve({ data, width, height });
24
24
  };
25
25
  image.onerror = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"wind-rasterized-layer.js","sourceRoot":"","sources":["../../client/ol-components/wind-rasterized-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import { get as getProjection, transform } from 'ol/proj.js'\nimport { createXYZ } from 'ol/tilegrid.js'\nimport { WeatherLayerType } from '@hyperviz/weather'\nimport BaseLayer from 'ol/layer/Base.js'\nimport ImageLayer from 'ol/layer/Image.js'\nimport Static from 'ol/source/ImageStatic.js'\nimport Map from 'ol/Map.js'\n\n/**\n * 바람 데이터를 캔버스에 래스터화하여 표시하는 레이어\n * 전체 데이터를 한 번에 처리하여 이미지로 변환해 표시하는 방식\n *\n * @class WindRasterizedLayer\n */\n\n// --- 데이터 로딩 및 변환 로직 ---\n\n/** 바람 데이터 이미지 로딩 Promise */\nconst windData: Promise<{ data: ArrayBuffer; width: number; height: number }> = new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n const canvas = document.createElement('canvas')\n const width = image.width\n const height = image.height\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')!\n context.drawImage(image, 0, 0)\n const data = context.getImageData(0, 0, width, height).data\n resolve({ data, width, height })\n }\n image.onerror = () => {\n reject(new Error('바람 데이터 이미지 로드 실패'))\n }\n image.src = '/assets/images/wind.png'\n})\n\n/**\n * 바이리니어 보간법을 사용하여 픽셀 값 계산\n */\nfunction bilinearInterpolation(\n xAlong: number,\n yAlong: number,\n v11: number,\n v21: number,\n v12: number,\n v22: number\n): number {\n const q11 = (1 - xAlong) * (1 - yAlong) * v11\n const q21 = xAlong * (1 - yAlong) * v21\n const q12 = (1 - xAlong) * yAlong * v12\n const q22 = xAlong * yAlong * v22\n return q11 + q21 + q12 + q22\n}\n\n/**\n * 픽셀 배열에 대한 보간법 적용\n */\nfunction interpolatePixels(\n xAlong: number,\n yAlong: number,\n p11: number[],\n p21: number[],\n p12: number[],\n p22: number[]\n): number[] {\n return p11.map((_, i) => bilinearInterpolation(xAlong, yAlong, p11[i], p21[i], p12[i], p22[i]))\n}\n\n// 바람 데이터 관련 상수\nconst inputImageProjection = getProjection('EPSG:4326')!\nconst inputBands = 4 // RGBA\n\n// 바람 속도 범위 (원본 이미지 값 기준)\nconst minU = -21.32\nconst maxU = 26.8\nconst deltaU = maxU - minU\nconst minV = -21.57\nconst maxV = 21.42\nconst deltaV = maxV - minV\n\n// 바람 속도에 따른 색상 매핑 (속도, [R, G, B, A])\nconst windColorMap: Array<[number, [number, number, number, number]]> = [\n [0, [0, 50, 170, 100]], // 약한 바람 (파란색)\n [5, [0, 100, 220, 150]], // 중약한 바람\n [10, [0, 150, 200, 180]], // 중간 바람 (청록색)\n [15, [0, 200, 150, 200]], // 중강한 바람 (녹색)\n [20, [150, 250, 0, 220]], // 강한 바람 (노란색)\n [25, [200, 150, 0, 230]], // 매우 강한 바람 (주황색)\n [30, [250, 50, 0, 250]] // 극심한 바람 (빨간색)\n]\n\n/**\n * 바람 속도에 따른 색상 계산\n * @param speed 바람 속도 (m/s)\n * @returns RGBA 색상 배열 [r, g, b, a] (0-255)\n */\nfunction getWindColor(speed: number): [number, number, number, number] {\n // 기본 색상 (약한 바람)\n let color: [number, number, number, number] = [0, 50, 170, 100]\n\n // 색상 맵에서 가장 가까운 색상 찾기\n for (let i = 0; i < windColorMap.length - 1; i++) {\n const [speed1, color1] = windColorMap[i]\n const [speed2, color2] = windColorMap[i + 1]\n\n if (speed >= speed1 && speed <= speed2) {\n // 두 색상 사이 보간\n const t = (speed - speed1) / (speed2 - speed1)\n color = [\n Math.floor(color1[0] * (1 - t) + color2[0] * t),\n Math.floor(color1[1] * (1 - t) + color2[1] * t),\n Math.floor(color1[2] * (1 - t) + color2[2] * t),\n Math.floor(color1[3] * (1 - t) + color2[3] * t)\n ]\n break\n }\n }\n\n // 최대 색상 (매우 강한 바람)\n if (speed > windColorMap[windColorMap.length - 1][0]) {\n color = [...windColorMap[windColorMap.length - 1][1]]\n }\n\n return color\n}\n\n// --- 레이어 클래스 구현 ---\n\nexport class WindRasterizedLayer {\n private layer: ImageLayer<Static> | null = null\n private dataPromise: Promise<{ data: ArrayBuffer; width: number; height: number }> | null = null\n private canvas: HTMLCanvasElement | null = null\n private ctx: CanvasRenderingContext2D | null = null\n private width = 800\n private height = 400\n private map: Map | null = null\n private useEnhancedColors: boolean = true\n private isDisposed: boolean = false\n\n /**\n * 바람 래스터화 레이어 생성자\n * @param options 옵션 객체\n */\n constructor(\n options: {\n width?: number\n height?: number\n useEnhancedColors?: boolean\n } = {}\n ) {\n this.dataPromise = windData\n\n // 캔버스 크기 설정\n if (options.width) this.width = options.width\n if (options.height) this.height = options.height\n\n // 색상 매핑 옵션\n if (options.useEnhancedColors !== undefined) {\n this.useEnhancedColors = options.useEnhancedColors\n }\n\n // 사전에 캔버스 준비\n this.canvas = document.createElement('canvas')\n this.canvas.width = this.width\n this.canvas.height = this.height\n this.ctx = this.canvas.getContext('2d')\n }\n\n /**\n * 레이어 타입 반환 (호환성용)\n */\n getType(): WeatherLayerType {\n return 'wind'\n }\n\n /**\n * 향상된 색상 매핑 사용 여부 설정\n */\n setUseEnhancedColors(use: boolean): void {\n this.useEnhancedColors = use\n this.updateLayer() // 변경사항 적용을 위해 레이어 업데이트\n }\n\n /**\n * OpenLayers 레이어 객체 생성 또는 반환\n */\n createLayer(): BaseLayer {\n if (this.isDisposed) {\n throw new Error('레이어가 이미 폐기되었습니다')\n }\n\n if (!this.canvas || !this.ctx) {\n throw new Error('캔버스가 초기화되지 않았습니다')\n }\n\n // 초기 이미지 렌더링\n this.renderWindData()\n\n // 정적 이미지 소스 생성\n const source = new Static({\n url: this.canvas.toDataURL(),\n imageExtent: [-180, -90, 180, 90],\n projection: 'EPSG:4326',\n interpolate: true\n })\n\n // 레이어 생성\n this.layer = new ImageLayer({\n source: source,\n opacity: 0.7,\n properties: {\n useEnhancedColors: this.useEnhancedColors\n }\n })\n\n return this.layer\n }\n\n /**\n * 바람 데이터 렌더링\n */\n async renderWindData(): Promise<void> {\n if (!this.ctx || !this.canvas || this.isDisposed) return\n\n try {\n const { data, width, height } = await this.dataPromise!\n\n // 캔버스 지우기\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\n // 바람 데이터 시각화\n const imgData = this.ctx.createImageData(this.canvas.width, this.canvas.height)\n\n for (let y = 0; y < this.canvas.height; y++) {\n for (let x = 0; x < this.canvas.width; x++) {\n const idx = (y * this.canvas.width + x) * 4\n\n // 위치 계산\n const lon = -180 + (x / this.canvas.width) * 360\n const lat = 90 - (y / this.canvas.height) * 180\n\n // 원본 이미지에서의 위치 계산\n const imgX = Math.floor((width * (lon + 180)) / 360)\n const imgY = Math.floor((height * (90 - lat)) / 180)\n\n // 경계 체크\n if (imgX < 0 || imgX >= width || imgY < 0 || imgY >= height) {\n continue\n }\n\n // 원본 데이터 인덱스\n const dataIdx = (imgY * width + imgX) * inputBands\n\n // 바람 속도 계산\n const u = minU + (deltaU * data[dataIdx]) / 255\n const v = minV + (deltaV * data[dataIdx + 1]) / 255\n const speed = Math.sqrt(u * u + v * v)\n\n // 색상 계산: 향상된 색상 매핑 또는 기본 스키마 사용\n let r, g, b, a\n\n if (this.useEnhancedColors) {\n // 향상된 색상 매핑 사용\n const color = getWindColor(speed)\n ;[r, g, b, a] = color\n } else {\n // 기본 색상 매핑 (녹청색 그라데이션)\n const normalizedSpeed = Math.min(speed / 20, 1)\n r = Math.floor(normalizedSpeed * 0)\n g = Math.floor(normalizedSpeed * 150)\n b = Math.floor(normalizedSpeed * 255)\n a = Math.floor(normalizedSpeed * 200)\n }\n\n // 이미지 데이터에 색상 설정\n imgData.data[idx] = r\n imgData.data[idx + 1] = g\n imgData.data[idx + 2] = b\n imgData.data[idx + 3] = a\n }\n }\n\n // 캔버스에 이미지 데이터 적용\n this.ctx.putImageData(imgData, 0, 0)\n\n // 소스 업데이트\n if (this.layer && !this.isDisposed) {\n try {\n const newSource = new Static({\n url: this.canvas.toDataURL(),\n imageExtent: [-180, -90, 180, 90],\n projection: 'EPSG:4326',\n interpolate: true\n })\n\n this.layer.setSource(newSource)\n } catch (error) {\n console.error('소스 업데이트 실패:', error)\n }\n }\n } catch (error) {\n console.error('바람 데이터 렌더링 실패:', error)\n }\n }\n\n /**\n * 레이어 업데이트 요청\n */\n updateLayer(): void {\n if (this.isDisposed) return\n\n this.renderWindData()\n\n // 속성 업데이트 (향상된 색상 매핑 옵션)\n if (this.layer) {\n this.layer.set('useEnhancedColors', this.useEnhancedColors)\n }\n }\n\n /**\n * 레이어를 맵에 추가\n */\n addToMap(map: Map): void {\n if (this.isDisposed) {\n console.warn('폐기된 레이어는 맵에 추가할 수 없습니다')\n return\n }\n\n this.map = map\n\n if (!this.layer) {\n this.layer = this.createLayer() as ImageLayer<Static>\n }\n\n this.map.addLayer(this.layer)\n }\n\n /**\n * 레이어를 맵에서 제거\n */\n removeFromMap(): void {\n if (!this.layer || !this.map || this.isDisposed) {\n return\n }\n\n try {\n // 렌더링 플래그 설정 (렌더링 방지)\n if (this.layer['rendered'] !== undefined) {\n this.layer['rendered'] = false\n }\n\n // 소스 정리\n const source = this.layer.getSource()\n if (source) {\n try {\n // setUrl 메서드가 없으므로 소스 자체를 null로 설정\n this.layer.setSource(null)\n } catch (e) {\n // 오류 무시\n }\n }\n\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n } finally {\n // 맵 참조 해제\n this.map = null\n }\n }\n\n /**\n * 레이어 관련 리소스 해제\n */\n dispose(): void {\n if (this.isDisposed) {\n return\n }\n\n // 이미 맵에서 제거되지 않았다면 제거\n if (this.map && this.layer) {\n this.removeFromMap()\n }\n\n try {\n // 레이어 정리\n if (this.layer) {\n const source = this.layer.getSource()\n if (source) {\n try {\n source.dispose()\n } catch (e) {\n // 오류 무시\n }\n }\n\n try {\n // 레이어 자체 dispose 호출\n this.layer.dispose()\n } catch (e) {\n // 오류 무시\n }\n\n this.layer = null\n }\n\n // 캔버스 정리\n if (this.canvas) {\n // 캔버스 메모리 해제 (크기를 최소화)\n this.canvas.width = 1\n this.canvas.height = 1\n this.canvas = null\n this.ctx = null\n }\n\n // 데이터 참조 정리\n this.dataPromise = null\n\n // 폐기 플래그 설정\n this.isDisposed = true\n } catch (e) {\n console.error('리소스 해제 중 오류:', e)\n }\n }\n\n /**\n * 데이터 설정 메서드 (호환성용)\n */\n setWeatherData(data: any): void {\n // 이 구현에서는 외부 데이터를 직접 설정하지 않음\n console.warn('WindRasterizedLayer에서 setWeatherData가 호출되었지만, 데이터는 정적입니다.')\n this.updateLayer() // 데이터가 변경된 것처럼 레이어 갱신\n }\n}\n"]}
1
+ {"version":3,"file":"wind-rasterized-layer.js","sourceRoot":"","sources":["../../client/ol-components/wind-rasterized-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import { get as getProjection, transform } from 'ol/proj.js'\nimport { createXYZ } from 'ol/tilegrid.js'\nimport { WeatherLayerType } from '@hyperviz/weather'\nimport BaseLayer from 'ol/layer/Base.js'\nimport ImageLayer from 'ol/layer/Image.js'\nimport Static from 'ol/source/ImageStatic.js'\nimport Map from 'ol/Map.js'\n\n/**\n * 바람 데이터를 캔버스에 래스터화하여 표시하는 레이어\n * 전체 데이터를 한 번에 처리하여 이미지로 변환해 표시하는 방식\n *\n * @class WindRasterizedLayer\n */\n\n// --- 데이터 로딩 및 변환 로직 ---\n\n/** 바람 데이터 이미지 로딩 Promise */\nconst windData: Promise<{ data: ArrayBuffer; width: number; height: number }> = new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n const canvas = document.createElement('canvas')\n const width = image.width\n const height = image.height\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext('2d')!\n context.drawImage(image, 0, 0)\n const data = context.getImageData(0, 0, width, height).data.buffer\n resolve({ data, width, height })\n }\n image.onerror = () => {\n reject(new Error('바람 데이터 이미지 로드 실패'))\n }\n image.src = '/assets/images/wind.png'\n})\n\n/**\n * 바이리니어 보간법을 사용하여 픽셀 값 계산\n */\nfunction bilinearInterpolation(\n xAlong: number,\n yAlong: number,\n v11: number,\n v21: number,\n v12: number,\n v22: number\n): number {\n const q11 = (1 - xAlong) * (1 - yAlong) * v11\n const q21 = xAlong * (1 - yAlong) * v21\n const q12 = (1 - xAlong) * yAlong * v12\n const q22 = xAlong * yAlong * v22\n return q11 + q21 + q12 + q22\n}\n\n/**\n * 픽셀 배열에 대한 보간법 적용\n */\nfunction interpolatePixels(\n xAlong: number,\n yAlong: number,\n p11: number[],\n p21: number[],\n p12: number[],\n p22: number[]\n): number[] {\n return p11.map((_, i) => bilinearInterpolation(xAlong, yAlong, p11[i], p21[i], p12[i], p22[i]))\n}\n\n// 바람 데이터 관련 상수\nconst inputImageProjection = getProjection('EPSG:4326')!\nconst inputBands = 4 // RGBA\n\n// 바람 속도 범위 (원본 이미지 값 기준)\nconst minU = -21.32\nconst maxU = 26.8\nconst deltaU = maxU - minU\nconst minV = -21.57\nconst maxV = 21.42\nconst deltaV = maxV - minV\n\n// 바람 속도에 따른 색상 매핑 (속도, [R, G, B, A])\nconst windColorMap: Array<[number, [number, number, number, number]]> = [\n [0, [0, 50, 170, 100]], // 약한 바람 (파란색)\n [5, [0, 100, 220, 150]], // 중약한 바람\n [10, [0, 150, 200, 180]], // 중간 바람 (청록색)\n [15, [0, 200, 150, 200]], // 중강한 바람 (녹색)\n [20, [150, 250, 0, 220]], // 강한 바람 (노란색)\n [25, [200, 150, 0, 230]], // 매우 강한 바람 (주황색)\n [30, [250, 50, 0, 250]] // 극심한 바람 (빨간색)\n]\n\n/**\n * 바람 속도에 따른 색상 계산\n * @param speed 바람 속도 (m/s)\n * @returns RGBA 색상 배열 [r, g, b, a] (0-255)\n */\nfunction getWindColor(speed: number): [number, number, number, number] {\n // 기본 색상 (약한 바람)\n let color: [number, number, number, number] = [0, 50, 170, 100]\n\n // 색상 맵에서 가장 가까운 색상 찾기\n for (let i = 0; i < windColorMap.length - 1; i++) {\n const [speed1, color1] = windColorMap[i]\n const [speed2, color2] = windColorMap[i + 1]\n\n if (speed >= speed1 && speed <= speed2) {\n // 두 색상 사이 보간\n const t = (speed - speed1) / (speed2 - speed1)\n color = [\n Math.floor(color1[0] * (1 - t) + color2[0] * t),\n Math.floor(color1[1] * (1 - t) + color2[1] * t),\n Math.floor(color1[2] * (1 - t) + color2[2] * t),\n Math.floor(color1[3] * (1 - t) + color2[3] * t)\n ]\n break\n }\n }\n\n // 최대 색상 (매우 강한 바람)\n if (speed > windColorMap[windColorMap.length - 1][0]) {\n color = [...windColorMap[windColorMap.length - 1][1]]\n }\n\n return color\n}\n\n// --- 레이어 클래스 구현 ---\n\nexport class WindRasterizedLayer {\n private layer: ImageLayer<Static> | null = null\n private dataPromise: Promise<{ data: ArrayBuffer; width: number; height: number }> | null = null\n private canvas: HTMLCanvasElement | null = null\n private ctx: CanvasRenderingContext2D | null = null\n private width = 800\n private height = 400\n private map: Map | null = null\n private useEnhancedColors: boolean = true\n private isDisposed: boolean = false\n\n /**\n * 바람 래스터화 레이어 생성자\n * @param options 옵션 객체\n */\n constructor(\n options: {\n width?: number\n height?: number\n useEnhancedColors?: boolean\n } = {}\n ) {\n this.dataPromise = windData\n\n // 캔버스 크기 설정\n if (options.width) this.width = options.width\n if (options.height) this.height = options.height\n\n // 색상 매핑 옵션\n if (options.useEnhancedColors !== undefined) {\n this.useEnhancedColors = options.useEnhancedColors\n }\n\n // 사전에 캔버스 준비\n this.canvas = document.createElement('canvas')\n this.canvas.width = this.width\n this.canvas.height = this.height\n this.ctx = this.canvas.getContext('2d')\n }\n\n /**\n * 레이어 타입 반환 (호환성용)\n */\n getType(): WeatherLayerType {\n return 'wind'\n }\n\n /**\n * 향상된 색상 매핑 사용 여부 설정\n */\n setUseEnhancedColors(use: boolean): void {\n this.useEnhancedColors = use\n this.updateLayer() // 변경사항 적용을 위해 레이어 업데이트\n }\n\n /**\n * OpenLayers 레이어 객체 생성 또는 반환\n */\n createLayer(): BaseLayer {\n if (this.isDisposed) {\n throw new Error('레이어가 이미 폐기되었습니다')\n }\n\n if (!this.canvas || !this.ctx) {\n throw new Error('캔버스가 초기화되지 않았습니다')\n }\n\n // 초기 이미지 렌더링\n this.renderWindData()\n\n // 정적 이미지 소스 생성\n const source = new Static({\n url: this.canvas.toDataURL(),\n imageExtent: [-180, -90, 180, 90],\n projection: 'EPSG:4326',\n interpolate: true\n })\n\n // 레이어 생성\n this.layer = new ImageLayer({\n source: source,\n opacity: 0.7,\n properties: {\n useEnhancedColors: this.useEnhancedColors\n }\n })\n\n return this.layer\n }\n\n /**\n * 바람 데이터 렌더링\n */\n async renderWindData(): Promise<void> {\n if (!this.ctx || !this.canvas || this.isDisposed) return\n\n try {\n const { data, width, height } = await this.dataPromise!\n\n // 캔버스 지우기\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n\n // 바람 데이터 시각화\n const imgData = this.ctx.createImageData(this.canvas.width, this.canvas.height)\n\n for (let y = 0; y < this.canvas.height; y++) {\n for (let x = 0; x < this.canvas.width; x++) {\n const idx = (y * this.canvas.width + x) * 4\n\n // 위치 계산\n const lon = -180 + (x / this.canvas.width) * 360\n const lat = 90 - (y / this.canvas.height) * 180\n\n // 원본 이미지에서의 위치 계산\n const imgX = Math.floor((width * (lon + 180)) / 360)\n const imgY = Math.floor((height * (90 - lat)) / 180)\n\n // 경계 체크\n if (imgX < 0 || imgX >= width || imgY < 0 || imgY >= height) {\n continue\n }\n\n // 원본 데이터 인덱스\n const dataIdx = (imgY * width + imgX) * inputBands\n\n // 바람 속도 계산\n const u = minU + (deltaU * data[dataIdx]) / 255\n const v = minV + (deltaV * data[dataIdx + 1]) / 255\n const speed = Math.sqrt(u * u + v * v)\n\n // 색상 계산: 향상된 색상 매핑 또는 기본 스키마 사용\n let r, g, b, a\n\n if (this.useEnhancedColors) {\n // 향상된 색상 매핑 사용\n const color = getWindColor(speed)\n ;[r, g, b, a] = color\n } else {\n // 기본 색상 매핑 (녹청색 그라데이션)\n const normalizedSpeed = Math.min(speed / 20, 1)\n r = Math.floor(normalizedSpeed * 0)\n g = Math.floor(normalizedSpeed * 150)\n b = Math.floor(normalizedSpeed * 255)\n a = Math.floor(normalizedSpeed * 200)\n }\n\n // 이미지 데이터에 색상 설정\n imgData.data[idx] = r\n imgData.data[idx + 1] = g\n imgData.data[idx + 2] = b\n imgData.data[idx + 3] = a\n }\n }\n\n // 캔버스에 이미지 데이터 적용\n this.ctx.putImageData(imgData, 0, 0)\n\n // 소스 업데이트\n if (this.layer && !this.isDisposed) {\n try {\n const newSource = new Static({\n url: this.canvas.toDataURL(),\n imageExtent: [-180, -90, 180, 90],\n projection: 'EPSG:4326',\n interpolate: true\n })\n\n this.layer.setSource(newSource)\n } catch (error) {\n console.error('소스 업데이트 실패:', error)\n }\n }\n } catch (error) {\n console.error('바람 데이터 렌더링 실패:', error)\n }\n }\n\n /**\n * 레이어 업데이트 요청\n */\n updateLayer(): void {\n if (this.isDisposed) return\n\n this.renderWindData()\n\n // 속성 업데이트 (향상된 색상 매핑 옵션)\n if (this.layer) {\n this.layer.set('useEnhancedColors', this.useEnhancedColors)\n }\n }\n\n /**\n * 레이어를 맵에 추가\n */\n addToMap(map: Map): void {\n if (this.isDisposed) {\n console.warn('폐기된 레이어는 맵에 추가할 수 없습니다')\n return\n }\n\n this.map = map\n\n if (!this.layer) {\n this.layer = this.createLayer() as ImageLayer<Static>\n }\n\n this.map.addLayer(this.layer)\n }\n\n /**\n * 레이어를 맵에서 제거\n */\n removeFromMap(): void {\n if (!this.layer || !this.map || this.isDisposed) {\n return\n }\n\n try {\n // 렌더링 플래그 설정 (렌더링 방지)\n if (this.layer['rendered'] !== undefined) {\n this.layer['rendered'] = false\n }\n\n // 소스 정리\n const source = this.layer.getSource()\n if (source) {\n try {\n // setUrl 메서드가 없으므로 소스 자체를 null로 설정\n this.layer.setSource(null)\n } catch (e) {\n // 오류 무시\n }\n }\n\n // 맵에서 레이어 제거\n this.map.removeLayer(this.layer)\n } catch (e) {\n console.error('맵에서 레이어 제거 중 오류:', e)\n } finally {\n // 맵 참조 해제\n this.map = null\n }\n }\n\n /**\n * 레이어 관련 리소스 해제\n */\n dispose(): void {\n if (this.isDisposed) {\n return\n }\n\n // 이미 맵에서 제거되지 않았다면 제거\n if (this.map && this.layer) {\n this.removeFromMap()\n }\n\n try {\n // 레이어 정리\n if (this.layer) {\n const source = this.layer.getSource()\n if (source) {\n try {\n source.dispose()\n } catch (e) {\n // 오류 무시\n }\n }\n\n try {\n // 레이어 자체 dispose 호출\n this.layer.dispose()\n } catch (e) {\n // 오류 무시\n }\n\n this.layer = null\n }\n\n // 캔버스 정리\n if (this.canvas) {\n // 캔버스 메모리 해제 (크기를 최소화)\n this.canvas.width = 1\n this.canvas.height = 1\n this.canvas = null\n this.ctx = null\n }\n\n // 데이터 참조 정리\n this.dataPromise = null\n\n // 폐기 플래그 설정\n this.isDisposed = true\n } catch (e) {\n console.error('리소스 해제 중 오류:', e)\n }\n }\n\n /**\n * 데이터 설정 메서드 (호환성용)\n */\n setWeatherData(data: any): void {\n // 이 구현에서는 외부 데이터를 직접 설정하지 않음\n console.warn('WindRasterizedLayer에서 setWeatherData가 호출되었지만, 데이터는 정적입니다.')\n this.updateLayer() // 데이터가 변경된 것처럼 레이어 갱신\n }\n}\n"]}