@operato/weather 9.0.1 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/src/index.d.ts +1 -0
  3. package/dist/src/index.js +2 -0
  4. package/dist/src/index.js.map +1 -0
  5. package/dist/src/layers/base-weather-layer.d.ts +56 -0
  6. package/dist/src/layers/base-weather-layer.js +83 -0
  7. package/dist/src/layers/base-weather-layer.js.map +1 -0
  8. package/dist/src/layers/cloud-layer.d.ts +17 -0
  9. package/dist/src/layers/cloud-layer.js +203 -0
  10. package/dist/src/layers/cloud-layer.js.map +1 -0
  11. package/dist/src/layers/precipitation-layer.d.ts +27 -0
  12. package/dist/src/layers/precipitation-layer.js +344 -0
  13. package/dist/src/layers/precipitation-layer.js.map +1 -0
  14. package/dist/src/layers/solar-layer.d.ts +17 -0
  15. package/dist/src/layers/solar-layer.js +253 -0
  16. package/dist/src/layers/solar-layer.js.map +1 -0
  17. package/dist/src/layers/temperature-layer.d.ts +13 -0
  18. package/dist/src/layers/temperature-layer.js +230 -0
  19. package/dist/src/layers/temperature-layer.js.map +1 -0
  20. package/dist/src/layers/wind-layer.d.ts +60 -0
  21. package/dist/src/layers/wind-layer.js +311 -0
  22. package/dist/src/layers/wind-layer.js.map +1 -0
  23. package/dist/src/ox-weather.d.ts +112 -0
  24. package/dist/src/ox-weather.js +645 -0
  25. package/dist/src/ox-weather.js.map +1 -0
  26. package/dist/src/ox-wind.d.ts +91 -0
  27. package/dist/src/ox-wind.js +425 -0
  28. package/dist/src/ox-wind.js.map +1 -0
  29. package/dist/src/services/weather-service.d.ts +79 -0
  30. package/dist/src/services/weather-service.js +560 -0
  31. package/dist/src/services/weather-service.js.map +1 -0
  32. package/dist/src/types.d.ts +71 -0
  33. package/dist/src/types.js +2 -0
  34. package/dist/src/types.js.map +1 -0
  35. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather-service.js","sourceRoot":"","sources":["../../../src/services/weather-service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WeatherService as IWeatherService,\n Location,\n WeatherData,\n WeatherGridData,\n WeatherServiceOptions\n} from '../types.js'\n\n/**\n * 날씨 데이터를 가져오고 관리하는 서비스 클래스\n */\nexport class WeatherService implements IWeatherService {\n private apiKey?: string\n private endpoint: string\n private cachedData: WeatherData[] = []\n private lastUpdated?: Date\n private updateInterval: number = 30 * 60 * 1000 // 기본 30분\n private updateTimer?: number\n private onDataUpdate?: (data: WeatherData[]) => void\n\n /**\n * 날씨 서비스 생성자\n * @param options 날씨 서비스 설정 옵션\n */\n constructor(options: WeatherServiceOptions = {}) {\n this.apiKey = options.apiKey\n this.endpoint = options.endpoint || 'https://api.weather.example.com/v1'\n\n if (options.updateInterval) {\n this.updateInterval = options.updateInterval * 1000 // 초 단위를 밀리초로 변환\n }\n\n if (options.mockData) {\n this.cachedData = options.mockData\n this.lastUpdated = new Date()\n }\n }\n\n /**\n * 날씨 데이터를 가져옵니다.\n * @param bounds 지도 경계 좌표 (남서, 북동)\n * @param forceUpdate 강제 업데이트 여부\n * @returns 최신 날씨 데이터\n */\n async fetchWeatherData(\n bounds: [[number, number], [number, number]],\n forceUpdate: boolean = false\n ): Promise<WeatherData[]> {\n console.log('날씨 데이터 요청 - 경계:', bounds, '강제 업데이트:', forceUpdate)\n\n // 캐시된 데이터가 있고 강제 업데이트가 아니면 캐시 반환\n const now = Date.now()\n const cacheTTL = 5 * 60 * 1000 // 5분 캐시\n\n if (!forceUpdate && this.cachedData.length > 0 && this.lastUpdated && now - this.lastUpdated.getTime() < cacheTTL) {\n console.log('캐시된 날씨 데이터 반환 - 데이터 수:', this.cachedData.length)\n return Promise.resolve(this.cachedData)\n }\n\n try {\n // API 호출 (실제 API 키가 있으면 실행)\n if (this.apiKey && this.endpoint) {\n try {\n console.log('실제 API에서 날씨 데이터 요청 중...')\n // API 호출 구현\n // const apiData = await this.callAPI(bounds)\n // return this.processApiData(apiData)\n } catch (error) {\n console.error('API 데이터 가져오기 실패, 모의 데이터로 대체합니다:', error)\n }\n }\n\n console.log('모의 날씨 데이터 생성 시작')\n\n // 비동기적으로 데이터 생성 (메인 스레드 차단 방지)\n const mockData = await this.generateMockDataAsync(bounds)\n\n // 생성된 데이터 캐싱\n this.cachedData = mockData\n this.lastUpdated = new Date()\n\n return mockData\n } catch (error) {\n console.error('날씨 데이터 생성 오류:', error)\n return this.cachedData.length > 0 ? this.cachedData : []\n }\n }\n\n /**\n * 비동기적으로 모의 날씨 데이터를 생성합니다.\n * 메인 스레드 차단을 방지하기 위해 청크 단위로 처리합니다.\n */\n private async generateMockDataAsync(bounds: [[number, number], [number, number]]): Promise<WeatherData[]> {\n return new Promise(resolve => {\n // 작업을 비동기로 처리하여 UI 차단 방지\n setTimeout(() => {\n const mockData = this.generateMockData(bounds)\n resolve(mockData)\n }, 0)\n })\n }\n\n /**\n * 데이터 업데이트 자동화 시작\n * @param bounds 지도 경계 좌표\n * @param callback 데이터 업데이트 시 호출될 콜백 함수\n */\n startAutoUpdate(bounds: [[number, number], [number, number]], callback?: (data: WeatherData[]) => void) {\n if (callback) {\n this.onDataUpdate = callback\n }\n\n // 이전 타이머가 있으면 제거\n if (this.updateTimer) {\n clearInterval(this.updateTimer)\n }\n\n // 즉시 데이터 갱신\n this.fetchWeatherData(bounds).then(data => {\n if (this.onDataUpdate) {\n this.onDataUpdate(data)\n }\n })\n\n // 갱신 타이머 설정\n this.updateTimer = window.setInterval(() => {\n this.fetchWeatherData(bounds, true).then(data => {\n if (this.onDataUpdate) {\n this.onDataUpdate(data)\n }\n })\n }, this.updateInterval)\n }\n\n /**\n * 자동 업데이트 중지\n */\n stopAutoUpdate() {\n if (this.updateTimer) {\n clearInterval(this.updateTimer)\n this.updateTimer = undefined\n }\n }\n\n /**\n * API 데이터 처리 및 변환\n * @param apiData API에서 받은 데이터\n * @returns 변환된 날씨 데이터 배열\n */\n private processApiData(apiData: any): WeatherData[] {\n // API 응답 포맷에 맞게 데이터 변환\n // 실제 API 구현에 따라 수정 필요\n return apiData.map((item: any) => ({\n location: {\n latitude: item.lat,\n longitude: item.lon\n },\n temperature: {\n current: item.temp,\n unit: 'celsius'\n },\n wind: {\n speed: item.wind_speed,\n direction: item.wind_dir,\n unit: 'm/s'\n },\n cloud: {\n coverage: item.cloud_cover,\n height: item.cloud_height\n },\n solar: {\n radiation: item.solar_rad,\n unit: 'W/m²'\n },\n precipitation: {\n amount: item.precip,\n probability: item.precip_prob,\n unit: 'mm'\n },\n time: new Date(item.timestamp)\n }))\n }\n\n /**\n * 모의 날씨 데이터를 생성합니다.\n * @param bounds 지도 경계 좌표\n * @returns 생성된 목업 날씨 데이터\n */\n private generateMockData(bounds: [[number, number], [number, number]]): WeatherData[] {\n // 한반도 및 주변 지역 위치로 제한 (북위 33-39도, 동경 124-132도)\n const [[swLng, swLat], [neLng, neLat]] = bounds\n\n // 남한 지역 위주의 경계로 제한\n const minLng = Math.max(swLng, 124.0)\n const maxLng = Math.min(neLng, 132.0)\n const minLat = Math.max(swLat, 32.0)\n const maxLat = Math.min(neLat, 40.0)\n\n console.log('모의 날씨 데이터 생성 중 - 제한된 영역:', [\n [minLng, minLat],\n [maxLng, maxLat]\n ])\n\n // 적절한 데이터 밀도 (성능 최적화)\n const gridSize = 30 // 기존 90에서 30으로 축소\n const latStep = (maxLat - minLat) / gridSize\n const lngStep = (maxLng - minLng) / gridSize\n\n // 날씨 패턴 - 주요 지역만 포함\n const weatherPatterns = [\n { center: [126.9, 37.5], type: 'warm', radius: 2.0 }, // 서울 근처\n { center: [129.0, 35.2], type: 'sunny', radius: 1.5 }, // 부산 근처\n { center: [126.5, 34.8], type: 'rainy', radius: 2.0 }, // 목포 근처\n { center: [130.0, 38.0], type: 'cold', radius: 2.5 } // 동해 북부\n ]\n\n const currentDate = new Date()\n const hour = currentDate.getHours()\n\n // 시간에 따른 태양광 베이스 값\n const baseSolarRadiation = hour >= 6 && hour <= 18 ? 500 + Math.sin(((hour - 6) * Math.PI) / 12) * 500 : 0\n\n // 계절에 따른 기본 온도 (월별)\n const month = currentDate.getMonth() // 0(1월)~11(12월)\n const baseTempByMonth = [0, 2, 8, 15, 20, 25, 28, 28, 22, 15, 8, 2]\n const baseTemp = baseTempByMonth[month]\n\n const mockData: WeatherData[] = []\n let totalPoints = 0\n let count = 0\n\n // 희소한 샘플링으로 대표 위치만 선택\n for (let lat = minLat; lat <= maxLat; lat += latStep) {\n for (let lng = minLng; lng <= maxLng; lng += lngStep) {\n totalPoints++\n\n // 75% 정도의 포인트만 생성 (랜덤 샘플링)\n if (Math.random() > 0.75) {\n continue\n }\n\n count++\n\n // 가장 가까운 날씨 패턴 찾기\n const nearestPattern = weatherPatterns\n .map(pattern => {\n const [patternLng, patternLat] = pattern.center\n const distance = Math.sqrt(Math.pow(lng - patternLng, 2) + Math.pow(lat - patternLat, 2))\n return { ...pattern, distance }\n })\n .sort((a, b) => a.distance - b.distance)[0]\n\n // 패턴에 따른 날씨 변화\n const patternFactor = Math.max(0, 1 - nearestPattern.distance / nearestPattern.radius)\n const randomFactor = Math.random() * 0.5 // 약간의 랜덤성 추가\n\n // 위도에 따른 온도 변화 (남쪽이 더 따뜻함)\n const latFactor = (lat - minLat) / (maxLat - minLat) // 0 (남) ~ 1 (북)\n const latTempAdjust = (1 - latFactor) * 8 // 최대 8도 차이\n\n // 기본 온도에 패턴 효과 적용\n let temp = baseTemp + latTempAdjust\n switch (nearestPattern.type) {\n case 'warm':\n temp += 5 * patternFactor\n break\n case 'cold':\n temp -= 8 * patternFactor\n break\n default:\n temp += (randomFactor - 0.25) * 2 // -0.5 ~ +0.5\n }\n\n // 구름 양과 강수 확률\n let cloud = 0\n let precipProb = 0\n let precipAmount = 0\n\n switch (nearestPattern.type) {\n case 'rainy':\n cloud = 0.7 + 0.3 * patternFactor + randomFactor * 0.2\n precipProb = Math.min(100, 70 + 30 * patternFactor + randomFactor * 10)\n precipAmount = 5 * patternFactor + randomFactor * 3\n break\n case 'sunny':\n cloud = 0.1 + randomFactor * 0.2\n precipProb = Math.max(0, randomFactor * 5)\n precipAmount = 0\n break\n default:\n cloud = 0.3 + randomFactor * 0.4\n precipProb = 10 + randomFactor * 20\n precipAmount = randomFactor * 2\n }\n\n // 태양광 (구름 양에 따라 감소)\n const solar = baseSolarRadiation * (1 - cloud * 0.8)\n\n // 바람 속도와 방향\n // 기본 바람 패턴: 저위도에서 고위도로, 바다에서 육지로\n const isCoastal = this.isCoastalRegion(lng, lat)\n\n // 바람 방향 결정 (0-360, 북쪽이 0도, 시계방향)\n let windDirection = 0\n\n // 계절에 따른 주요 바람 방향\n if (month >= 11 || month <= 1) {\n // 겨울: 북서풍 우세\n windDirection = 315 + (Math.random() - 0.5) * 40\n } else if (month >= 5 && month <= 8) {\n // 여름: 남동풍 우세\n windDirection = 135 + (Math.random() - 0.5) * 40\n } else {\n // 봄/가을: 서풍 우세\n windDirection = 270 + (Math.random() - 0.5) * 60\n }\n\n // 해안가는 낮에는 육지에서 바다로, 밤에는 바다에서 육지로\n if (isCoastal) {\n if (hour >= 10 && hour <= 16) {\n // 낮\n windDirection = (windDirection + 60) % 360\n } else if (hour >= 22 || hour <= 4) {\n // 밤\n windDirection = (windDirection - 60 + 360) % 360\n }\n }\n\n // 패턴에 따른 풍속 조정\n let windSpeed = 0\n switch (nearestPattern.type) {\n case 'rainy':\n // 비 구역은 바람이 더 강함\n windSpeed = 5 + 10 * patternFactor + randomFactor * 3\n break\n case 'warm':\n // 따뜻한 지역은 바람이 약함\n windSpeed = 2 + randomFactor * 3\n break\n case 'cold':\n // 추운 지역은 바람이 강함\n windSpeed = 6 + 8 * patternFactor + randomFactor * 3\n break\n default:\n windSpeed = 3 + randomFactor * 5\n }\n\n // 고도에 따른 풍속 증가 (높은 위도에서 더 강함)\n windSpeed *= 1 + latFactor * 0.5\n\n // 풍속 범위 제한 (0.5 ~ 20 m/s)\n windSpeed = Math.max(0.5, Math.min(20, windSpeed))\n\n // 날씨 데이터 객체 생성\n mockData.push({\n location: {\n latitude: lat,\n longitude: lng\n },\n temperature: {\n current: Number(temp.toFixed(1)),\n unit: 'celsius'\n },\n wind: {\n speed: Number(windSpeed.toFixed(1)),\n direction: Math.round(windDirection),\n unit: 'm/s'\n },\n cloud: {\n coverage: Number((cloud * 100).toFixed(0)),\n height: 1000 + Math.random() * 2000\n },\n solar: {\n radiation: Number(solar.toFixed(0)),\n unit: 'W/m²'\n },\n precipitation: {\n amount: Number(precipAmount.toFixed(1)),\n probability: Math.round(precipProb),\n unit: 'mm'\n },\n time: new Date()\n })\n }\n }\n\n console.log(`모의 날씨 데이터 생성 완료: 총 ${count}개 생성 (전체 격자 중 ${totalPoints}개)`)\n console.log(\n '샘플 데이터:',\n mockData.length > 0\n ? [\n {\n location: mockData[0].location,\n temp: mockData[0].temperature.current,\n wind: mockData[0].wind,\n solar: mockData[0].solar\n },\n {\n location: mockData[Math.floor(mockData.length / 2)].location,\n temp: mockData[Math.floor(mockData.length / 2)].temperature.current,\n wind: mockData[Math.floor(mockData.length / 2)].wind,\n solar: mockData[Math.floor(mockData.length / 2)].solar\n }\n ]\n : 'No data'\n )\n\n return mockData\n }\n\n /**\n * 위치가 해안 지역인지 확인합니다 (간단한 모의 함수)\n * @param lng 경도\n * @param lat 위도\n * @returns 해안 지역 여부\n */\n private isCoastalRegion(lng: number, lat: number): boolean {\n // 한반도 해안선 근사:\n // 서해안: ~126-126.6도\n // 동해안: ~129-130도\n // 남해안: ~34.4-35도\n\n // 서해안\n if (125.9 <= lng && lng <= 126.7 && lat >= 34.5) {\n return true\n }\n\n // 동해안\n if (128.8 <= lng && lng <= 130.1 && lat >= 35.0) {\n return true\n }\n\n // 남해안\n if (126.5 <= lng && lng <= 129.3 && 34.3 <= lat && lat <= 35.1) {\n return true\n }\n\n // 제주도 주변\n if (126.0 <= lng && lng <= 127.0 && 33.0 <= lat && lat <= 33.6) {\n return true\n }\n\n return false\n }\n\n /**\n * 특정 위치의 날씨 정보를 가져옵니다.\n */\n async getWeatherByLocation(location: Location): Promise<WeatherData> {\n // 실제 구현에서는 API 호출 등으로 데이터를 가져옵니다.\n // 테스트를 위해 임시 데이터를 생성합니다.\n return this.generateMockWeatherData(location)\n }\n\n /**\n * 특정 위치 주변의 날씨 정보를 그리드 형태로 가져옵니다.\n */\n async getWeatherAroundLocation(location: Location, radius: number): Promise<WeatherGridData> {\n return this.generateMockWeatherGridData(location, radius)\n }\n\n /**\n * 테스트용 날씨 데이터 생성\n */\n private generateMockWeatherData(location: Location): WeatherData {\n const cloudCoverage = Math.random() * 100\n const solarRadiation = Math.random() * 1000\n const currentTime = new Date()\n\n return {\n location,\n temperature: {\n current: 20 + Math.random() * 10,\n unit: '°C'\n },\n wind: {\n speed: 5 + Math.random() * 20,\n unit: 'km/h',\n direction: Math.random() * 360\n },\n humidity: 30 + Math.random() * 50,\n cloud: {\n coverage: cloudCoverage,\n height: 1000 + Math.random() * 2000\n },\n cloudCoverage,\n solar: {\n radiation: solarRadiation,\n unit: 'W/m²'\n },\n solarRadiation,\n precipitation: {\n amount: Math.random() * 10,\n probability: Math.random() * 100\n },\n weatherDescription: this.getWeatherDescription(cloudCoverage),\n time: currentTime,\n timestamp: currentTime.toISOString()\n }\n }\n\n /**\n * 테스트용 그리드 날씨 데이터 생성\n */\n private generateMockWeatherGridData(center: Location, radius: number): WeatherGridData {\n const gridSize = {\n rows: 10,\n cols: 10\n }\n\n const latRange = radius / 111 // 대략적인 위도 1도당 111km\n const lonRange = radius / (111 * Math.cos((center.latitude * Math.PI) / 180))\n\n const bounds = {\n north: center.latitude + latRange,\n south: center.latitude - latRange,\n east: center.longitude + lonRange,\n west: center.longitude - lonRange\n }\n\n const data: WeatherData[][] = []\n\n // 격자별 위치 계산\n const latStep = (bounds.north - bounds.south) / gridSize.rows\n const lonStep = (bounds.east - bounds.west) / gridSize.cols\n\n // 기상 현상 중심점 생성\n const weatherCenters = [\n { i: gridSize.rows * 0.3, j: gridSize.cols * 0.3, type: 'storm' as const },\n { i: gridSize.rows * 0.7, j: gridSize.cols * 0.7, type: 'heat' as const },\n { i: gridSize.rows * 0.5, j: gridSize.cols * 0.2, type: 'cold' as const },\n { i: gridSize.rows * 0.2, j: gridSize.cols * 0.8, type: 'rain' as const }\n ]\n\n for (let i = 0; i < gridSize.rows; i++) {\n data[i] = []\n for (let j = 0; j < gridSize.cols; j++) {\n const lat = bounds.south + i * latStep\n const lon = bounds.west + j * lonStep\n\n // 각 기상 현상 중심점으로부터의 영향 계산\n let tempEffect = 0\n let windEffect = 0\n let cloudEffect = 0\n let solarEffect = 0\n let rainEffect = 0\n\n weatherCenters.forEach(center => {\n const dist = Math.sqrt(Math.pow(i - center.i, 2) + Math.pow(j - center.j, 2))\n const influence = Math.exp(-dist / 15) // 거리에 따른 영향력 감소\n\n switch (center.type) {\n case 'storm':\n windEffect += influence * 2\n cloudEffect += influence * 1.5\n rainEffect += influence\n tempEffect -= influence * 5\n solarEffect -= influence\n break\n case 'heat':\n tempEffect += influence * 10\n solarEffect += influence\n break\n case 'cold':\n tempEffect -= influence * 10\n cloudEffect += influence * 0.5\n break\n case 'rain':\n rainEffect += influence * 2\n cloudEffect += influence\n solarEffect -= influence\n break\n }\n })\n\n // 바람 방향 계산 (기상 현상 중심에서 멀어지는 방향)\n let windDirection = 0\n weatherCenters.forEach(center => {\n const dx = j - center.j\n const dy = i - center.i\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist > 0) {\n const dir = Math.atan2(dx, dy) * (180 / Math.PI)\n windDirection += dir\n }\n })\n windDirection = (windDirection / weatherCenters.length + 360) % 360\n\n // 날씨 데이터 생성\n data[i][j] = {\n location: { latitude: lat, longitude: lon },\n temperature: {\n current: 20 + tempEffect,\n unit: '°C'\n },\n wind: {\n speed: 5 + windEffect * 10,\n unit: 'km/h',\n direction: windDirection\n },\n humidity: Math.min(100, Math.max(0, 50 + rainEffect * 20 + cloudEffect * 10)),\n cloudCoverage: Math.min(100, Math.max(0, 20 + cloudEffect * 50)),\n solarRadiation: Math.max(0, 500 + solarEffect * 300),\n precipitation: {\n amount: Math.max(0, rainEffect * 5),\n probability: Math.min(100, Math.max(0, rainEffect * 70))\n },\n weatherDescription: this.getWeatherDescription(cloudEffect * 100 + rainEffect * 50),\n time: new Date(),\n cloud: {\n coverage: Math.min(100, Math.max(0, 20 + cloudEffect * 50)),\n height: 1000 + Math.random() * 2000\n },\n solar: {\n radiation: Math.max(0, 500 + solarEffect * 300),\n unit: 'W/m²'\n },\n timestamp: new Date().toISOString()\n }\n }\n }\n\n return {\n bounds,\n gridSize,\n data\n }\n }\n\n /**\n * 구름량에 따른 날씨 설명을 반환합니다.\n */\n private getWeatherDescription(cloudcover: number): string {\n if (cloudcover < 10) return '맑음'\n if (cloudcover < 30) return '대체로 맑음'\n if (cloudcover < 60) return '구름 조금'\n if (cloudcover < 90) return '대체로 흐림'\n return '흐림'\n }\n}\n"]}
@@ -0,0 +1,71 @@
1
+ export type WeatherLayerType = 'wind' | 'cloud' | 'solar' | 'temperature' | 'precipitation';
2
+ export interface Location {
3
+ latitude: number;
4
+ longitude: number;
5
+ }
6
+ export interface Temperature {
7
+ current: number;
8
+ value?: number;
9
+ unit: string;
10
+ }
11
+ export interface Wind {
12
+ speed: number;
13
+ unit: string;
14
+ direction: number;
15
+ }
16
+ export interface Precipitation {
17
+ amount: number;
18
+ probability: number;
19
+ unit?: string;
20
+ }
21
+ export interface Cloud {
22
+ coverage: number;
23
+ height: number;
24
+ }
25
+ export interface Solar {
26
+ radiation: number;
27
+ unit: string;
28
+ }
29
+ export interface WeatherData {
30
+ location: Location;
31
+ temperature: Temperature;
32
+ wind: Wind;
33
+ humidity?: number;
34
+ cloud: Cloud;
35
+ cloudCoverage?: number;
36
+ solar: Solar;
37
+ solarRadiation?: number;
38
+ precipitation: Precipitation;
39
+ weatherDescription?: string;
40
+ time: Date;
41
+ timestamp?: string;
42
+ }
43
+ export interface WeatherGridData {
44
+ bounds: {
45
+ north: number;
46
+ south: number;
47
+ east: number;
48
+ west: number;
49
+ };
50
+ gridSize: {
51
+ rows: number;
52
+ cols: number;
53
+ };
54
+ data: WeatherData[][];
55
+ }
56
+ /**
57
+ * 날씨 서비스 옵션 인터페이스
58
+ */
59
+ export interface WeatherServiceOptions {
60
+ apiKey?: string;
61
+ endpoint?: string;
62
+ updateInterval?: number;
63
+ mockData?: WeatherData[];
64
+ }
65
+ export interface WeatherService {
66
+ fetchWeatherData(bounds: [[number, number], [number, number]], forceUpdate?: boolean): Promise<WeatherData[]>;
67
+ startAutoUpdate(bounds: [[number, number], [number, number]], callback?: (data: WeatherData[]) => void): void;
68
+ stopAutoUpdate(): void;
69
+ getWeatherByLocation(location: Location): Promise<WeatherData>;
70
+ getWeatherAroundLocation(location: Location, radius: number): Promise<WeatherGridData>;
71
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["// 날씨 레이어 타입 정의\nexport type WeatherLayerType = 'wind' | 'cloud' | 'solar' | 'temperature' | 'precipitation'\n\n// Weather 타입 정의\nexport interface Location {\n latitude: number\n longitude: number\n}\n\nexport interface Temperature {\n current: number\n value?: number // 호환성을 위해 추가\n unit: string\n}\n\nexport interface Wind {\n speed: number\n unit: string\n direction: number\n}\n\nexport interface Precipitation {\n amount: number // mm\n probability: number // %\n unit?: string // 호환성을 위해 추가\n}\n\nexport interface Cloud {\n coverage: number // %\n height: number // m\n}\n\nexport interface Solar {\n radiation: number\n unit: string\n}\n\nexport interface WeatherData {\n location: Location\n temperature: Temperature\n wind: Wind\n humidity?: number\n cloud: Cloud\n cloudCoverage?: number // 이전 버전과의 호환성을 위해 유지\n solar: Solar\n solarRadiation?: number // 이전 버전과의 호환성을 위해 유지\n precipitation: Precipitation\n weatherDescription?: string\n time: Date\n timestamp?: string // 이전 버전과의 호환성을 위해 유지\n}\n\nexport interface WeatherGridData {\n bounds: {\n north: number\n south: number\n east: number\n west: number\n }\n gridSize: {\n rows: number\n cols: number\n }\n data: WeatherData[][]\n}\n\n/**\n * 날씨 서비스 옵션 인터페이스\n */\nexport interface WeatherServiceOptions {\n apiKey?: string\n endpoint?: string\n updateInterval?: number // 초 단위\n mockData?: WeatherData[]\n}\n\nexport interface WeatherService {\n fetchWeatherData(bounds: [[number, number], [number, number]], forceUpdate?: boolean): Promise<WeatherData[]>\n startAutoUpdate(bounds: [[number, number], [number, number]], callback?: (data: WeatherData[]) => void): void\n stopAutoUpdate(): void\n getWeatherByLocation(location: Location): Promise<WeatherData>\n getWeatherAroundLocation(location: Location, radius: number): Promise<WeatherGridData>\n}\n"]}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@operato/weather",
3
- "version": "9.0.1",
3
+ "version": "9.0.2",
4
4
  "description": "User interface for weather layer over map",
5
5
  "author": "heartyoh",
6
6
  "type": "module",
7
- "main": "dist/index.js",
8
- "module": "dist/index.js",
7
+ "main": "dist/src/index.js",
8
+ "module": "dist/src/index.js",
9
9
  "license": "MIT",
10
10
  "operato": true,
11
11
  "publishConfig": {
@@ -83,5 +83,5 @@
83
83
  "prettier --write"
84
84
  ]
85
85
  },
86
- "gitHead": "28e94ba161590458a69c7d68e93aa9283fd95531"
86
+ "gitHead": "595a66745b97ab3f364e870aabff7b05c7bf3da8"
87
87
  }