@things-factory/weather 9.0.0-9.0.0-beta.59.0
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/CHANGELOG.md +8 -0
- package/assets/images/wind.png +0 -0
- package/assets/images/wind2.png +0 -0
- package/client/bootstrap.ts +1 -0
- package/client/index.ts +0 -0
- package/client/ol-components/webgl-canvas-layer.ts +413 -0
- package/client/ol-components/wind-data-tile-layer.ts +485 -0
- package/client/ol-components/wind-rasterized-layer.ts +437 -0
- package/client/pages/weather-page.ts +353 -0
- package/client/route.ts +7 -0
- package/client/tsconfig.json +11 -0
- package/config/config.development.js +28 -0
- package/config/config.production.js +10 -0
- package/data/geo-json/countries-max-geo.json +1 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +2 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +0 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/ol-components/webgl-canvas-layer.d.ts +61 -0
- package/dist-client/ol-components/webgl-canvas-layer.js +364 -0
- package/dist-client/ol-components/webgl-canvas-layer.js.map +1 -0
- package/dist-client/ol-components/wind-data-tile-layer.d.ts +59 -0
- package/dist-client/ol-components/wind-data-tile-layer.js +414 -0
- package/dist-client/ol-components/wind-data-tile-layer.js.map +1 -0
- package/dist-client/ol-components/wind-rasterized-layer.d.ts +59 -0
- package/dist-client/ol-components/wind-rasterized-layer.js +363 -0
- package/dist-client/ol-components/wind-rasterized-layer.js.map +1 -0
- package/dist-client/pages/weather-page.d.ts +23 -0
- package/dist-client/pages/weather-page.js +348 -0
- package/dist-client/pages/weather-page.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +8 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/controllers/open-meteo-adapter.d.ts +4 -0
- package/dist-server/controllers/open-meteo-adapter.js +87 -0
- package/dist-server/controllers/open-meteo-adapter.js.map +1 -0
- package/dist-server/controllers/types.d.ts +55 -0
- package/dist-server/controllers/types.js +3 -0
- package/dist-server/controllers/types.js.map +1 -0
- package/dist-server/controllers/weather-controller.d.ts +12 -0
- package/dist-server/controllers/weather-controller.js +179 -0
- package/dist-server/controllers/weather-controller.js.map +1 -0
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +4 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/routers/geo-router.d.ts +59 -0
- package/dist-server/routers/geo-router.js +277 -0
- package/dist-server/routers/geo-router.js.map +1 -0
- package/dist-server/routers/weather-router.d.ts +1 -0
- package/dist-server/routers/weather-router.js +10 -0
- package/dist-server/routers/weather-router.js.map +1 -0
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/routes.js +11 -0
- package/dist-server/routes.js.map +1 -0
- package/dist-server/services/chrome-renderer.d.ts +13 -0
- package/dist-server/services/chrome-renderer.js +162 -0
- package/dist-server/services/chrome-renderer.js.map +1 -0
- package/dist-server/services/headless-pool.d.ts +4 -0
- package/dist-server/services/headless-pool.js +89 -0
- package/dist-server/services/headless-pool.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/dist-server/utils/svg-utils.d.ts +35 -0
- package/dist-server/utils/svg-utils.js +89 -0
- package/dist-server/utils/svg-utils.js.map +1 -0
- package/dist-server/utils/tile-utils.d.ts +38 -0
- package/dist-server/utils/tile-utils.js +64 -0
- package/dist-server/utils/tile-utils.js.map +1 -0
- package/package.json +46 -0
- package/server/controllers/open-meteo-adapter.ts +96 -0
- package/server/controllers/types.ts +63 -0
- package/server/controllers/weather-controller.ts +192 -0
- package/server/index.ts +1 -0
- package/server/routers/geo-router.ts +297 -0
- package/server/routers/weather-router.ts +8 -0
- package/server/routes.ts +10 -0
- package/server/services/chrome-renderer.ts +206 -0
- package/server/services/data.json +8438 -0
- package/server/services/headless-pool.ts +97 -0
- package/server/tsconfig.json +10 -0
- package/server/utils/svg-utils.ts +108 -0
- package/server/utils/tile-utils.ts +77 -0
- package/things-factory.config.js +8 -0
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { css, html } from 'lit';
|
|
3
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
4
|
+
import { PageView } from '@operato/shell';
|
|
5
|
+
import Map from 'ol/Map.js';
|
|
6
|
+
import View from 'ol/View.js';
|
|
7
|
+
import TileLayer from 'ol/layer/Tile.js';
|
|
8
|
+
import { fromLonLat } from 'ol/proj.js';
|
|
9
|
+
import 'ol/ol.css';
|
|
10
|
+
import { MVT } from 'ol/format';
|
|
11
|
+
import { VectorTile, XYZ } from 'ol/source';
|
|
12
|
+
import VectorTileLayer from 'ol/layer/VectorTile';
|
|
13
|
+
import { Style, Stroke } from 'ol/style';
|
|
14
|
+
import { TemperatureLayer, PrecipitationLayer, initializeWorkerSystem } from '@hyperviz/weather';
|
|
15
|
+
import { WindDataTileLayer } from '../ol-components/wind-data-tile-layer.js';
|
|
16
|
+
let WeatherPage = class WeatherPage extends PageView {
|
|
17
|
+
static get styles() {
|
|
18
|
+
return css `
|
|
19
|
+
:host {
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
height: 100%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.map-container {
|
|
26
|
+
flex: 1;
|
|
27
|
+
display: flex;
|
|
28
|
+
position: relative;
|
|
29
|
+
background-color: #f9f9f9;
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#map {
|
|
34
|
+
flex: 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.controls {
|
|
38
|
+
position: absolute;
|
|
39
|
+
top: 10px;
|
|
40
|
+
right: 10px;
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: 10px;
|
|
44
|
+
background: rgba(255, 255, 255, 0.8);
|
|
45
|
+
padding: 15px;
|
|
46
|
+
border-radius: 4px;
|
|
47
|
+
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
|
48
|
+
z-index: 10;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.weather-btn {
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
padding: 8px 12px;
|
|
54
|
+
background-color: #f0f0f0;
|
|
55
|
+
border: 1px solid #ddd;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
font-weight: bold;
|
|
58
|
+
transition: all 0.3s;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.weather-btn.active {
|
|
62
|
+
background-color: #4281f5;
|
|
63
|
+
color: white;
|
|
64
|
+
border-color: #2d5ed9;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.refresh-btn {
|
|
68
|
+
margin-top: 10px;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
padding: 8px 12px;
|
|
71
|
+
background-color: #00c851;
|
|
72
|
+
color: white;
|
|
73
|
+
border: none;
|
|
74
|
+
border-radius: 4px;
|
|
75
|
+
font-weight: bold;
|
|
76
|
+
transition: all 0.3s;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.refresh-btn:hover {
|
|
80
|
+
background-color: #00a651;
|
|
81
|
+
}
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
constructor() {
|
|
85
|
+
super();
|
|
86
|
+
this.activeType = 'temperature';
|
|
87
|
+
this.map = null;
|
|
88
|
+
this.weatherLayer = null;
|
|
89
|
+
}
|
|
90
|
+
render() {
|
|
91
|
+
return html `
|
|
92
|
+
<div class="map-container">
|
|
93
|
+
<div id="map"></div>
|
|
94
|
+
|
|
95
|
+
<div class="controls">
|
|
96
|
+
<button
|
|
97
|
+
class="weather-btn ${this.activeType === 'temperature' ? 'active' : ''}"
|
|
98
|
+
@click=${() => this._changeWeatherType('temperature')}
|
|
99
|
+
>
|
|
100
|
+
온도
|
|
101
|
+
</button>
|
|
102
|
+
<button
|
|
103
|
+
class="weather-btn ${this.activeType === 'wind' ? 'active' : ''}"
|
|
104
|
+
@click=${() => this._changeWeatherType('wind')}
|
|
105
|
+
>
|
|
106
|
+
바람
|
|
107
|
+
</button>
|
|
108
|
+
<button
|
|
109
|
+
class="weather-btn ${this.activeType === 'precipitation' ? 'active' : ''}"
|
|
110
|
+
@click=${() => this._changeWeatherType('precipitation')}
|
|
111
|
+
>
|
|
112
|
+
강수량
|
|
113
|
+
</button>
|
|
114
|
+
<button class="refresh-btn" @click=${this._refreshWeatherMap}>새로고침</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
connectedCallback() {
|
|
120
|
+
super.connectedCallback();
|
|
121
|
+
initializeWorkerSystem();
|
|
122
|
+
requestAnimationFrame(() => {
|
|
123
|
+
this._initMap();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
disconnectedCallback() {
|
|
127
|
+
super.disconnectedCallback();
|
|
128
|
+
if (this.weatherLayer) {
|
|
129
|
+
try {
|
|
130
|
+
this.weatherLayer.removeFromMap();
|
|
131
|
+
this.weatherLayer.dispose();
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
console.error('Error disposing weather layer:', e);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (this.map) {
|
|
138
|
+
this.map.dispose();
|
|
139
|
+
}
|
|
140
|
+
this.map = null;
|
|
141
|
+
this.weatherLayer = null;
|
|
142
|
+
}
|
|
143
|
+
_initMap() {
|
|
144
|
+
const lightOSM = new TileLayer({
|
|
145
|
+
source: new XYZ({
|
|
146
|
+
url: 'https://{a-c}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png',
|
|
147
|
+
attributions: '© OpenStreetMap contributors, © CartoDB'
|
|
148
|
+
}),
|
|
149
|
+
background: 'transparent',
|
|
150
|
+
opacity: 1
|
|
151
|
+
});
|
|
152
|
+
const labelOSM = new TileLayer({
|
|
153
|
+
source: new XYZ({
|
|
154
|
+
url: 'https://{a-c}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png'
|
|
155
|
+
}),
|
|
156
|
+
background: 'transparent',
|
|
157
|
+
opacity: 1
|
|
158
|
+
});
|
|
159
|
+
const vectorTile = new VectorTile({
|
|
160
|
+
format: new MVT({
|
|
161
|
+
layerName: 'countries',
|
|
162
|
+
layers: ['countries']
|
|
163
|
+
}),
|
|
164
|
+
url: `/geo/tiles/{z}/{x}/{y}.mvt`,
|
|
165
|
+
maxZoom: 10,
|
|
166
|
+
projection: 'EPSG:3857'
|
|
167
|
+
});
|
|
168
|
+
const outlineLayer = new VectorTileLayer({
|
|
169
|
+
source: vectorTile,
|
|
170
|
+
style: new Style({
|
|
171
|
+
stroke: new Stroke({
|
|
172
|
+
color: '#858585',
|
|
173
|
+
// color: '#484848',
|
|
174
|
+
width: 1
|
|
175
|
+
})
|
|
176
|
+
})
|
|
177
|
+
});
|
|
178
|
+
this.map = new Map({
|
|
179
|
+
target: this.renderRoot.querySelector('#map'),
|
|
180
|
+
pixelRatio: Math.min(window.devicePixelRatio, 2),
|
|
181
|
+
layers: [lightOSM, outlineLayer, labelOSM],
|
|
182
|
+
view: new View({
|
|
183
|
+
center: fromLonLat([126.9779692, 37.5662952]),
|
|
184
|
+
zoom: 5
|
|
185
|
+
})
|
|
186
|
+
});
|
|
187
|
+
this._addWeatherLayer();
|
|
188
|
+
}
|
|
189
|
+
_addWeatherLayer() {
|
|
190
|
+
if (!this.map)
|
|
191
|
+
return;
|
|
192
|
+
switch (this.activeType) {
|
|
193
|
+
case 'temperature':
|
|
194
|
+
this.weatherLayer = new TemperatureLayer();
|
|
195
|
+
break;
|
|
196
|
+
case 'wind':
|
|
197
|
+
this.weatherLayer = new WindDataTileLayer();
|
|
198
|
+
break;
|
|
199
|
+
case 'precipitation':
|
|
200
|
+
this.weatherLayer = new PrecipitationLayer();
|
|
201
|
+
break;
|
|
202
|
+
default:
|
|
203
|
+
this.weatherLayer = new TemperatureLayer();
|
|
204
|
+
}
|
|
205
|
+
if (this.weatherLayer) {
|
|
206
|
+
this.weatherLayer.addToMap(this.map);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 날씨 레이어를 변경하고 새 레이어를 맵에 추가
|
|
211
|
+
*/
|
|
212
|
+
_changeWeatherType(type) {
|
|
213
|
+
if (this.activeType === type)
|
|
214
|
+
return;
|
|
215
|
+
// 현재 활성 타입 저장
|
|
216
|
+
const previousType = this.activeType;
|
|
217
|
+
// 새로운 타입으로 변경
|
|
218
|
+
this.activeType = type;
|
|
219
|
+
console.log(`날씨 타입 변경 시작: ${previousType} -> ${type}`);
|
|
220
|
+
// 이전 레이어가 있을 경우 처리
|
|
221
|
+
if (this.map && this.weatherLayer) {
|
|
222
|
+
// 맵 참조 저장
|
|
223
|
+
const mapRef = this.map;
|
|
224
|
+
// 이전 레이어 참조 저장
|
|
225
|
+
const oldLayer = this.weatherLayer;
|
|
226
|
+
// 렌더링 참조 제거
|
|
227
|
+
this.weatherLayer = null;
|
|
228
|
+
// 이전 레이어 제거 처리
|
|
229
|
+
try {
|
|
230
|
+
console.log(`이전 레이어(${previousType}) 제거 시작`);
|
|
231
|
+
// 1. 레이어 시각적으로 즉시 숨김 (특히 WindDataTileLayer 경우 중요)
|
|
232
|
+
if (previousType === 'wind') {
|
|
233
|
+
if (oldLayer['layer'] && typeof oldLayer['layer'].setVisible === 'function') {
|
|
234
|
+
oldLayer['layer'].setVisible(false);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// 2. 컴포넌트에서 참조 제거 (렌더링 사이클에서 제외)
|
|
238
|
+
this.weatherLayer = null;
|
|
239
|
+
// 3. 비동기 처리: 렌더링 사이클이 완료된 후 실행
|
|
240
|
+
requestAnimationFrame(() => {
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
try {
|
|
243
|
+
// 레이어 참조가 남아있을 경우에만 제거 시도
|
|
244
|
+
if (oldLayer) {
|
|
245
|
+
oldLayer.removeFromMap();
|
|
246
|
+
// 약간의 지연 후 자원 해제
|
|
247
|
+
setTimeout(() => {
|
|
248
|
+
try {
|
|
249
|
+
oldLayer.dispose();
|
|
250
|
+
console.log(`이전 레이어(${previousType}) 완전히 제거됨`);
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
console.warn('레이어 리소스 해제 중 오류:', e);
|
|
254
|
+
}
|
|
255
|
+
// 새 레이어 생성 시작
|
|
256
|
+
this._addNewLayer(type, mapRef);
|
|
257
|
+
}, 50); // dispose 지연
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// 레이어 참조가 없는 경우 즉시 새 레이어 생성
|
|
261
|
+
this._addNewLayer(type, mapRef);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
console.error('레이어 제거 중 오류 발생:', e);
|
|
266
|
+
// 오류 발생해도 새 레이어 생성 시도
|
|
267
|
+
this._addNewLayer(type, mapRef);
|
|
268
|
+
}
|
|
269
|
+
}, 100); // 레이어 제거 지연
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch (e) {
|
|
273
|
+
console.error('레이어 전환 중 오류:', e);
|
|
274
|
+
// 에러 상태에서도 새 레이어 추가 시도
|
|
275
|
+
this._addNewLayer(type, mapRef);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// 기존 레이어가 없으면 바로 새 레이어 추가
|
|
280
|
+
this._addWeatherLayer();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* 새 레이어를 안전하게 추가하는 헬퍼 메소드
|
|
285
|
+
*/
|
|
286
|
+
_addNewLayer(type, mapRef) {
|
|
287
|
+
// 타입이 바뀌지 않았는지 확인
|
|
288
|
+
if (this.activeType !== type) {
|
|
289
|
+
console.log(`타입이 변경되어 레이어 생성 취소: ${this.activeType}로 변경됨`);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
console.log(`새 레이어(${type}) 생성 시작`);
|
|
293
|
+
try {
|
|
294
|
+
// 맵 참조 확인
|
|
295
|
+
if (!this.map && mapRef) {
|
|
296
|
+
this.map = mapRef;
|
|
297
|
+
}
|
|
298
|
+
if (this.map) {
|
|
299
|
+
// 새 레이어 생성 및 맵에 추가
|
|
300
|
+
this._addWeatherLayer();
|
|
301
|
+
console.log(`새 레이어(${type}) 생성 완료`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
console.error('맵 참조 없음: 레이어를 추가할 수 없습니다');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
catch (e) {
|
|
308
|
+
console.error('새 레이어 생성 중 오류:', e);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
_refreshWeatherMap() {
|
|
312
|
+
if (this.weatherLayer) {
|
|
313
|
+
try {
|
|
314
|
+
// 타입에 따라 적절한 메서드 호출
|
|
315
|
+
if (this.activeType === 'wind') {
|
|
316
|
+
;
|
|
317
|
+
this.weatherLayer.updateLayer();
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// @hyperviz/weather 레이어
|
|
321
|
+
;
|
|
322
|
+
this.weatherLayer.setWeatherData([]);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (e) {
|
|
326
|
+
console.error('Error refreshing weather layer:', e);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
__decorate([
|
|
332
|
+
property({ type: String }),
|
|
333
|
+
__metadata("design:type", Object)
|
|
334
|
+
], WeatherPage.prototype, "activeType", void 0);
|
|
335
|
+
__decorate([
|
|
336
|
+
state(),
|
|
337
|
+
__metadata("design:type", Object)
|
|
338
|
+
], WeatherPage.prototype, "map", void 0);
|
|
339
|
+
__decorate([
|
|
340
|
+
state(),
|
|
341
|
+
__metadata("design:type", Object)
|
|
342
|
+
], WeatherPage.prototype, "weatherLayer", void 0);
|
|
343
|
+
WeatherPage = __decorate([
|
|
344
|
+
customElement('weather-page'),
|
|
345
|
+
__metadata("design:paramtypes", [])
|
|
346
|
+
], WeatherPage);
|
|
347
|
+
export { WeatherPage };
|
|
348
|
+
//# sourceMappingURL=weather-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather-page.js","sourceRoot":"","sources":["../../client/pages/weather-page.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { PageView } from '@operato/shell'\n\nimport Map from 'ol/Map.js'\nimport View from 'ol/View.js'\nimport TileLayer from 'ol/layer/Tile.js'\nimport { fromLonLat } from 'ol/proj.js'\nimport 'ol/ol.css'\nimport { MVT } from 'ol/format'\nimport { VectorTile, XYZ } from 'ol/source'\nimport VectorTileLayer from 'ol/layer/VectorTile'\nimport { Style, Stroke } from 'ol/style'\n\nimport { BaseWeatherLayer, TemperatureLayer, PrecipitationLayer, initializeWorkerSystem } from '@hyperviz/weather'\n\nimport { WindDataTileLayer } from '../ol-components/wind-data-tile-layer.js'\n\n// 통합 날씨 레이어 타입 (BaseWeatherLayer와 WindDataTileLayer 모두 포함)\ntype WeatherLayerType = BaseWeatherLayer | WindDataTileLayer\n\n@customElement('weather-page')\nexport class WeatherPage extends PageView {\n static get styles() {\n return css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .map-container {\n flex: 1;\n display: flex;\n position: relative;\n background-color: #f9f9f9;\n overflow: hidden;\n }\n\n #map {\n flex: 1;\n }\n\n .controls {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n background: rgba(255, 255, 255, 0.8);\n padding: 15px;\n border-radius: 4px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n z-index: 10;\n }\n\n .weather-btn {\n cursor: pointer;\n padding: 8px 12px;\n background-color: #f0f0f0;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-weight: bold;\n transition: all 0.3s;\n }\n\n .weather-btn.active {\n background-color: #4281f5;\n color: white;\n border-color: #2d5ed9;\n }\n\n .refresh-btn {\n margin-top: 10px;\n cursor: pointer;\n padding: 8px 12px;\n background-color: #00c851;\n color: white;\n border: none;\n border-radius: 4px;\n font-weight: bold;\n transition: all 0.3s;\n }\n\n .refresh-btn:hover {\n background-color: #00a651;\n }\n `\n }\n\n @property({ type: String }) private activeType = 'temperature'\n @state() private map: Map | null = null\n @state() private weatherLayer: WeatherLayerType | null = null\n\n constructor() {\n super()\n }\n\n render() {\n return html`\n <div class=\"map-container\">\n <div id=\"map\"></div>\n\n <div class=\"controls\">\n <button\n class=\"weather-btn ${this.activeType === 'temperature' ? 'active' : ''}\"\n @click=${() => this._changeWeatherType('temperature')}\n >\n 온도\n </button>\n <button\n class=\"weather-btn ${this.activeType === 'wind' ? 'active' : ''}\"\n @click=${() => this._changeWeatherType('wind')}\n >\n 바람\n </button>\n <button\n class=\"weather-btn ${this.activeType === 'precipitation' ? 'active' : ''}\"\n @click=${() => this._changeWeatherType('precipitation')}\n >\n 강수량\n </button>\n <button class=\"refresh-btn\" @click=${this._refreshWeatherMap}>새로고침</button>\n </div>\n </div>\n `\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n initializeWorkerSystem()\n requestAnimationFrame(() => {\n this._initMap()\n })\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n if (this.weatherLayer) {\n try {\n this.weatherLayer.removeFromMap()\n this.weatherLayer.dispose()\n } catch (e) {\n console.error('Error disposing weather layer:', e)\n }\n }\n if (this.map) {\n this.map.dispose()\n }\n this.map = null\n this.weatherLayer = null\n }\n\n private _initMap() {\n const lightOSM = new TileLayer({\n source: new XYZ({\n url: 'https://{a-c}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png',\n attributions: '© OpenStreetMap contributors, © CartoDB'\n }),\n background: 'transparent',\n opacity: 1\n })\n\n const labelOSM = new TileLayer({\n source: new XYZ({\n url: 'https://{a-c}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png'\n }),\n background: 'transparent',\n opacity: 1\n })\n\n const vectorTile = new VectorTile({\n format: new MVT({\n layerName: 'countries',\n layers: ['countries']\n }),\n url: `/geo/tiles/{z}/{x}/{y}.mvt`,\n maxZoom: 10,\n projection: 'EPSG:3857'\n })\n\n const outlineLayer = new VectorTileLayer({\n source: vectorTile,\n style: new Style({\n stroke: new Stroke({\n color: '#858585',\n // color: '#484848',\n width: 1\n })\n })\n })\n\n this.map = new Map({\n target: this.renderRoot.querySelector('#map') as HTMLElement,\n pixelRatio: Math.min(window.devicePixelRatio, 2),\n layers: [lightOSM, outlineLayer, labelOSM],\n view: new View({\n center: fromLonLat([126.9779692, 37.5662952]),\n zoom: 5\n })\n })\n\n this._addWeatherLayer()\n }\n\n private _addWeatherLayer() {\n if (!this.map) return\n\n switch (this.activeType) {\n case 'temperature':\n this.weatherLayer = new TemperatureLayer()\n break\n case 'wind':\n this.weatherLayer = new WindDataTileLayer()\n break\n case 'precipitation':\n this.weatherLayer = new PrecipitationLayer()\n break\n default:\n this.weatherLayer = new TemperatureLayer()\n }\n\n if (this.weatherLayer) {\n this.weatherLayer.addToMap(this.map)\n }\n }\n\n /**\n * 날씨 레이어를 변경하고 새 레이어를 맵에 추가\n */\n private _changeWeatherType(type: string) {\n if (this.activeType === type) return\n\n // 현재 활성 타입 저장\n const previousType = this.activeType\n // 새로운 타입으로 변경\n this.activeType = type\n\n console.log(`날씨 타입 변경 시작: ${previousType} -> ${type}`)\n\n // 이전 레이어가 있을 경우 처리\n if (this.map && this.weatherLayer) {\n // 맵 참조 저장\n const mapRef = this.map\n\n // 이전 레이어 참조 저장\n const oldLayer = this.weatherLayer\n // 렌더링 참조 제거\n this.weatherLayer = null\n\n // 이전 레이어 제거 처리\n try {\n console.log(`이전 레이어(${previousType}) 제거 시작`)\n\n // 1. 레이어 시각적으로 즉시 숨김 (특히 WindDataTileLayer 경우 중요)\n if (previousType === 'wind') {\n if (oldLayer['layer'] && typeof oldLayer['layer'].setVisible === 'function') {\n oldLayer['layer'].setVisible(false)\n }\n }\n\n // 2. 컴포넌트에서 참조 제거 (렌더링 사이클에서 제외)\n this.weatherLayer = null\n\n // 3. 비동기 처리: 렌더링 사이클이 완료된 후 실행\n requestAnimationFrame(() => {\n setTimeout(() => {\n try {\n // 레이어 참조가 남아있을 경우에만 제거 시도\n if (oldLayer) {\n oldLayer.removeFromMap()\n\n // 약간의 지연 후 자원 해제\n setTimeout(() => {\n try {\n oldLayer.dispose()\n console.log(`이전 레이어(${previousType}) 완전히 제거됨`)\n } catch (e) {\n console.warn('레이어 리소스 해제 중 오류:', e)\n }\n\n // 새 레이어 생성 시작\n this._addNewLayer(type, mapRef)\n }, 50) // dispose 지연\n } else {\n // 레이어 참조가 없는 경우 즉시 새 레이어 생성\n this._addNewLayer(type, mapRef)\n }\n } catch (e) {\n console.error('레이어 제거 중 오류 발생:', e)\n // 오류 발생해도 새 레이어 생성 시도\n this._addNewLayer(type, mapRef)\n }\n }, 100) // 레이어 제거 지연\n })\n } catch (e) {\n console.error('레이어 전환 중 오류:', e)\n // 에러 상태에서도 새 레이어 추가 시도\n this._addNewLayer(type, mapRef)\n }\n } else {\n // 기존 레이어가 없으면 바로 새 레이어 추가\n this._addWeatherLayer()\n }\n }\n\n /**\n * 새 레이어를 안전하게 추가하는 헬퍼 메소드\n */\n private _addNewLayer(type: string, mapRef: Map | null): void {\n // 타입이 바뀌지 않았는지 확인\n if (this.activeType !== type) {\n console.log(`타입이 변경되어 레이어 생성 취소: ${this.activeType}로 변경됨`)\n return\n }\n\n console.log(`새 레이어(${type}) 생성 시작`)\n\n try {\n // 맵 참조 확인\n if (!this.map && mapRef) {\n this.map = mapRef\n }\n\n if (this.map) {\n // 새 레이어 생성 및 맵에 추가\n this._addWeatherLayer()\n console.log(`새 레이어(${type}) 생성 완료`)\n } else {\n console.error('맵 참조 없음: 레이어를 추가할 수 없습니다')\n }\n } catch (e) {\n console.error('새 레이어 생성 중 오류:', e)\n }\n }\n\n private _refreshWeatherMap() {\n if (this.weatherLayer) {\n try {\n // 타입에 따라 적절한 메서드 호출\n if (this.activeType === 'wind') {\n ;(this.weatherLayer as WindDataTileLayer).updateLayer()\n } else {\n // @hyperviz/weather 레이어\n ;(this.weatherLayer as BaseWeatherLayer).setWeatherData([])\n }\n } catch (e) {\n console.error('Error refreshing weather layer:', e)\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function route(page: string): "weather-page" | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,cAAc;YACjB,MAAM,CAAC,yBAAyB,CAAC,CAAA;YACjC,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'weather-page':\n import('./pages/weather-page.js')\n return page\n }\n}\n"]}
|