@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.
- package/client/ol-components/wind-data-tile-layer.ts +1 -1
- package/client/ol-components/wind-rasterized-layer.ts +1 -1
- package/dist-client/ol-components/wind-data-tile-layer.js +1 -1
- package/dist-client/ol-components/wind-data-tile-layer.js.map +1 -1
- package/dist-client/ol-components/wind-rasterized-layer.js +1 -1
- package/dist-client/ol-components/wind-rasterized-layer.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/services/headless-pool.d.ts +10 -1
- package/dist-server/services/headless-pool.js +25 -79
- package/dist-server/services/headless-pool.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -7
- package/server/services/headless-pool.ts +27 -90
|
@@ -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":"AAAA,OAAO,EAAE,GAAG,IAAI,aAAa,EAAa,MAAM,YAAY,CAAA;AAI5D,OAAO,UAAU,MAAM,mBAAmB,CAAA;AAC1C,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAG7C;;;;;GAKG;AAEH,yBAAyB;AAEzB,4BAA4B;AAC5B,MAAM,QAAQ,GAAkE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9G,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;IACzB,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;QAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAA;QACxC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAClE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAClC,CAAC,CAAA;IACD,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAA;IACvC,CAAC,CAAA;IACD,KAAK,CAAC,GAAG,GAAG,yBAAyB,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF;;GAEG;AACH,SAAS,qBAAqB,CAC5B,MAAc,EACd,MAAc,EACd,GAAW,EACX,GAAW,EACX,GAAW,EACX,GAAW;IAEX,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAA;IACvC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,GAAG,GAAG,CAAA;IACvC,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAA;IACjC,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,MAAc,EACd,MAAc,EACd,GAAa,EACb,GAAa,EACb,GAAa,EACb,GAAa;IAEb,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjG,CAAC;AAED,eAAe;AACf,MAAM,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAE,CAAA;AACxD,MAAM,UAAU,GAAG,CAAC,CAAA,CAAC,OAAO;AAE5B,yBAAyB;AACzB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAA;AACnB,MAAM,IAAI,GAAG,IAAI,CAAA;AACjB,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAA;AACnB,MAAM,IAAI,GAAG,KAAK,CAAA;AAClB,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;AAE1B,qCAAqC;AACrC,MAAM,YAAY,GAAsD;IACtE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc;IACtC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc;IACxC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,cAAc;IACxC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,iBAAiB;IAC3C,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe;CACxC,CAAA;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,gBAAgB;IAChB,IAAI,KAAK,GAAqC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAE/D,sBAAsB;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAE5C,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;YACvC,aAAa;YACb,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;YAC9C,KAAK,GAAG;gBACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChD,CAAA;YACD,MAAK;QACP,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,qBAAqB;AAErB,MAAM,OAAO,mBAAmB;IAW9B;;;OAGG;IACH,YACE,UAII,EAAE;QAnBA,UAAK,GAA8B,IAAI,CAAA;QACvC,gBAAW,GAAyE,IAAI,CAAA;QACxF,WAAM,GAA6B,IAAI,CAAA;QACvC,QAAG,GAAoC,IAAI,CAAA;QAC3C,UAAK,GAAG,GAAG,CAAA;QACX,WAAM,GAAG,GAAG,CAAA;QACZ,QAAG,GAAe,IAAI,CAAA;QACtB,sBAAiB,GAAY,IAAI,CAAA;QACjC,eAAU,GAAY,KAAK,CAAA;QAajC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAA;QAE3B,YAAY;QACZ,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC7C,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAEhD,WAAW;QACX,IAAI,OAAO,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;QACpD,CAAC;QAED,aAAa;QACb,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACzC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,GAAY;QAC/B,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAA;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAA,CAAC,uBAAuB;IAC5C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC;QAED,aAAa;QACb,IAAI,CAAC,cAAc,EAAE,CAAA;QAErB,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAC5B,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;YACjC,UAAU,EAAE,WAAW;YACvB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAA;QAEF,SAAS;QACT,IAAI,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE;gBACV,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C;SACF,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAExD,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAY,CAAA;YAEvD,UAAU;YACV,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE/D,aAAa;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAE/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;oBAE3C,QAAQ;oBACR,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;oBAChD,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;oBAE/C,kBAAkB;oBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;oBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;oBAEpD,QAAQ;oBACR,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;wBAC5D,SAAQ;oBACV,CAAC;oBAED,aAAa;oBACb,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,UAAU,CAAA;oBAElD,WAAW;oBACX,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAA;oBAC/C,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;oBACnD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;oBAEtC,gCAAgC;oBAChC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;oBAEd,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC3B,eAAe;wBACf,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAChC;wBAAA,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAA;oBACvB,CAAC;yBAAM,CAAC;wBACN,uBAAuB;wBACvB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;wBAC/C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAA;wBACnC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAA;wBACrC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAA;wBACrC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,CAAA;oBACvC,CAAC;oBAED,iBAAiB;oBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBACrB,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;oBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;oBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC3B,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAEpC,UAAU;YACV,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC;wBAC3B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;wBAC5B,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;wBACjC,UAAU,EAAE,WAAW;wBACvB,WAAW,EAAE,IAAI;qBAClB,CAAC,CAAA;oBAEF,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;gBACjC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAE3B,IAAI,CAAC,cAAc,EAAE,CAAA;QAErB,yBAAyB;QACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAQ;QACf,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QAEd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAwB,CAAA;QACvD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,sBAAsB;YACtB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAA;YAChC,CAAC;YAED,QAAQ;YACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,mCAAmC;oBACnC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC5B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,QAAQ;gBACV,CAAC;YACH,CAAC;YAED,aAAa;YACb,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAA;QACtC,CAAC;gBAAS,CAAC;YACT,UAAU;YACV,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;QAED,IAAI,CAAC;YACH,SAAS;YACT,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;gBACrC,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC;wBACH,MAAM,CAAC,OAAO,EAAE,CAAA;oBAClB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,QAAQ;oBACV,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC;oBACH,oBAAoB;oBACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;gBACtB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,QAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACnB,CAAC;YAED,SAAS;YACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,uBAAuB;gBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;gBACrB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;YACjB,CAAC;YAED,YAAY;YACZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YAEvB,YAAY;YACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAS;QACtB,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;QACzE,IAAI,CAAC,WAAW,EAAE,CAAA,CAAC,sBAAsB;IAC3C,CAAC;CACF","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"]}
|