@mint-ui/map 1.2.0-test.60 → 1.2.0-test.62

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.
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import { MarkerOptions, Position } from '../../../types';
2
+ import { MarkerOptions } from '../../../types';
3
3
  import { CanvasData, CustomRenderBase, CustomRenderEvent } from '../shared';
4
4
  export { CanvasDataType, CanvasProvider, LRUCache, SpatialHashGrid } from '../shared';
5
- export type { CanvasData, CanvasOption, CustomRenderBase, CustomRenderEvent, RenderBaseParams, RenderEventParams, RenderUtils } from '../shared';
5
+ export type { CanvasData, CanvasOption, CustomRenderBase, CustomRenderEvent, MarkerBoundingBox, RenderBaseParams, RenderEventParams, RenderUtils } from '../shared';
6
6
  /**
7
7
  * CanvasMarkerLayer Props
8
8
  *
@@ -14,12 +14,7 @@ export interface CanvasMarkerLayerProps<T> extends Pick<MarkerOptions, 'zIndex'
14
14
  /** 마커 클릭 시 호출되는 콜백 함수 */
15
15
  onClick?: (payload: CanvasData<T>, selectedIds: Set<string>) => void;
16
16
  /** 마커에 마우스 오버 시 호출되는 콜백 함수 */
17
- onMouseOver?: (payload: CanvasData<T> & {
18
- boundingBox?: {
19
- bottomRight: Position;
20
- leftTop: Position;
21
- };
22
- }) => void;
17
+ onMouseOver?: (payload: CanvasData<T>) => void;
23
18
  /** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
24
19
  onMouseOut?: (payload: CanvasData<T>) => void;
25
20
  /** 다중 선택 활성화 여부 (기본값: false) */
@@ -7,7 +7,7 @@ var Konva = require('konva');
7
7
  var React = require('react');
8
8
  var reactDom = require('react-dom');
9
9
  var MapDrawables = require('../../../types/MapDrawables.js');
10
- var MapTypes = require('../../../types/MapTypes.js');
10
+ require('../../../types/MapTypes.js');
11
11
  require('../../../types/MapEventTypes.js');
12
12
  var MintMapProvider = require('../../provider/MintMapProvider.js');
13
13
  var context = require('../shared/context.js');
@@ -381,25 +381,17 @@ var CanvasMarkerLayer = function (props) {
381
381
 
382
382
 
383
383
  var getMarkerBoundingBoxCoordinates = function (item) {
384
- try {
385
- var offset = getOrComputeMarkerOffset(item);
386
- if (!offset) return null;
387
- var boundingBox = computeBoundingBox(item);
388
- if (!boundingBox) return null; // 왼쪽 상단 좌표 (minX, minY)
389
-
390
- var leftTopOffset = new MapTypes.Offset(boundingBox.minX, boundingBox.minY);
391
- var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표 (maxX, maxY)
392
-
393
- var bottomRightOffset = new MapTypes.Offset(boundingBox.maxX, boundingBox.maxY);
394
- var bottomRight = controller.offsetToPosition(bottomRightOffset);
395
- return {
396
- bottomRight: bottomRight,
397
- leftTop: leftTop
398
- };
399
- } catch (error) {
400
- console.error('[CanvasMarkerLayer] getMarkerBoundingBoxCoordinates error:', error, item);
401
- return null;
402
- }
384
+ if (!item.position) return null;
385
+ return utils.calculateMarkerBoundingBox({
386
+ controller: controller,
387
+ height: item.boxHeight || 28,
388
+ lat: item.position.lat,
389
+ lng: item.position.lng,
390
+ offsetX: item.offsetX || 0,
391
+ offsetY: item.offsetY || 0,
392
+ tailHeight: item.tailHeight || 0,
393
+ width: item.boxWidth || 50
394
+ });
403
395
  }; // 마우스 이동 이벤트 핸들러 (hover 감지)
404
396
 
405
397
 
@@ -416,12 +408,11 @@ var CanvasMarkerLayer = function (props) {
416
408
  if (prevHovered) onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
417
409
 
418
410
  if (hoveredItem) {
419
- var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
411
+ var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
420
412
 
421
413
  var payload = tslib.__assign(tslib.__assign({}, hoveredItem), {
422
414
  boundingBox: boundingBox || undefined
423
- }); // 타입 체크를 통과하도록 타입 단언 추가
424
-
415
+ });
425
416
 
426
417
  onMouseOver === null || onMouseOver === void 0 ? void 0 : onMouseOver(payload);
427
418
  }
@@ -535,12 +526,11 @@ var CanvasMarkerLayer = function (props) {
535
526
  if (context$1) {
536
527
  // context를 통한 onMouseOver 호출 시에도 boundingBox를 포함하도록 래핑
537
528
  var wrappedOnMouseOver = onMouseOver ? function (payload) {
538
- var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
529
+ var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
539
530
 
540
531
  var enhancedPayload = tslib.__assign(tslib.__assign({}, payload), {
541
532
  boundingBox: boundingBox || undefined
542
- }); // 타입 체크를 통과하도록 타입 단언 추가
543
-
533
+ });
544
534
 
545
535
  onMouseOver(enhancedPayload);
546
536
  } : undefined;
@@ -14,6 +14,15 @@ export interface Paths {
14
14
  type: string;
15
15
  coordinates: number[][][][];
16
16
  }
17
+ /**
18
+ * 마커 바운딩 박스 좌표 (위도/경도)
19
+ */
20
+ export interface MarkerBoundingBox {
21
+ /** 왼쪽 상단 좌표 */
22
+ leftTop: Position;
23
+ /** 우측 하단 좌표 */
24
+ bottomRight: Position;
25
+ }
17
26
  /**
18
27
  * 캔버스 마커/폴리곤의 기본 필수 속성
19
28
  */
@@ -29,6 +38,8 @@ export interface CanvasOption {
29
38
  offsetX?: number;
30
39
  /** 렌더링 오프셋 Y (픽셀 단위, 기본값: 0) */
31
40
  offsetY?: number;
41
+ /** 마커 바운딩 박스 좌표 (onMouseOver 이벤트에서만 제공됨) */
42
+ boundingBox?: MarkerBoundingBox;
32
43
  }
33
44
  /**
34
45
  * 서버 데이터와 캔버스 옵션을 결합한 타입
@@ -1,3 +1,4 @@
1
+ import type { MarkerBoundingBox } from './types';
1
2
  import { CanvasData, CanvasOption } from './types';
2
3
  import { Offset } from '../../../types';
3
4
  import { MintMapController } from '../../MintMapController';
@@ -128,3 +129,45 @@ export declare function createCanvasData<T extends Record<string, any>>(serverDa
128
129
  * ```
129
130
  */
130
131
  export declare function createCanvasDataArray<T extends Record<string, any>>(serverDataArray: T[], getCanvasOptions: (serverData: T, index: number) => CanvasOption): CanvasData<T>[];
132
+ /**
133
+ * 마커 바운딩 박스 좌표 계산 (위도/경도)
134
+ *
135
+ * 마커의 중심 좌표와 크기를 기반으로 현재 뷰포트에서의 바운딩 박스 좌표를 계산합니다.
136
+ *
137
+ * @param params 계산 파라미터
138
+ * @param params.lat 마커의 중심 위도
139
+ * @param params.lng 마커의 중심 경도
140
+ * @param params.width 마커의 너비 (픽셀 단위, boxWidth)
141
+ * @param params.height 마커의 높이 (픽셀 단위, boxHeight)
142
+ * @param params.controller MintMapController 인스턴스 (뷰포트 상태를 알기 위해 필요)
143
+ * @param params.tailHeight 마커 꼬리 높이 (픽셀 단위, 기본값: 0)
144
+ * @param params.offsetX 마커 오프셋 X (픽셀 단위, 기본값: 0)
145
+ * @param params.offsetY 마커 오프셋 Y (픽셀 단위, 기본값: 0)
146
+ * @returns 마커 바운딩 박스 좌표 (위도/경도) 또는 null
147
+ *
148
+ * @example
149
+ * ```typescript
150
+ * const boundingBox = calculateMarkerBoundingBox({
151
+ * lat: 37.5665,
152
+ * lng: 126.9780,
153
+ * width: 100,
154
+ * height: 50,
155
+ * controller: mintMapController
156
+ * });
157
+ *
158
+ * if (boundingBox) {
159
+ * console.log('왼쪽 상단:', boundingBox.leftTop);
160
+ * console.log('우측 하단:', boundingBox.bottomRight);
161
+ * }
162
+ * ```
163
+ */
164
+ export declare const calculateMarkerBoundingBox: (params: {
165
+ lat: number;
166
+ lng: number;
167
+ width: number;
168
+ height: number;
169
+ controller: MintMapController;
170
+ tailHeight?: number;
171
+ offsetX?: number;
172
+ offsetY?: number;
173
+ }) => MarkerBoundingBox | null;
@@ -299,7 +299,78 @@ function createCanvasDataArray(serverDataArray, getCanvasOptions) {
299
299
  return createCanvasData(serverData, canvasOptions);
300
300
  });
301
301
  }
302
+ /**
303
+ * 마커 바운딩 박스 좌표 계산 (위도/경도)
304
+ *
305
+ * 마커의 중심 좌표와 크기를 기반으로 현재 뷰포트에서의 바운딩 박스 좌표를 계산합니다.
306
+ *
307
+ * @param params 계산 파라미터
308
+ * @param params.lat 마커의 중심 위도
309
+ * @param params.lng 마커의 중심 경도
310
+ * @param params.width 마커의 너비 (픽셀 단위, boxWidth)
311
+ * @param params.height 마커의 높이 (픽셀 단위, boxHeight)
312
+ * @param params.controller MintMapController 인스턴스 (뷰포트 상태를 알기 위해 필요)
313
+ * @param params.tailHeight 마커 꼬리 높이 (픽셀 단위, 기본값: 0)
314
+ * @param params.offsetX 마커 오프셋 X (픽셀 단위, 기본값: 0)
315
+ * @param params.offsetY 마커 오프셋 Y (픽셀 단위, 기본값: 0)
316
+ * @returns 마커 바운딩 박스 좌표 (위도/경도) 또는 null
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * const boundingBox = calculateMarkerBoundingBox({
321
+ * lat: 37.5665,
322
+ * lng: 126.9780,
323
+ * width: 100,
324
+ * height: 50,
325
+ * controller: mintMapController
326
+ * });
327
+ *
328
+ * if (boundingBox) {
329
+ * console.log('왼쪽 상단:', boundingBox.leftTop);
330
+ * console.log('우측 하단:', boundingBox.bottomRight);
331
+ * }
332
+ * ```
333
+ */
334
+
335
+ var calculateMarkerBoundingBox = function (params) {
336
+ try {
337
+ var lat = params.lat,
338
+ lng = params.lng,
339
+ width = params.width,
340
+ height = params.height,
341
+ controller = params.controller,
342
+ _a = params.tailHeight,
343
+ tailHeight = _a === void 0 ? 0 : _a,
344
+ _b = params.offsetX,
345
+ offsetX = _b === void 0 ? 0 : _b,
346
+ _c = params.offsetY,
347
+ offsetY = _c === void 0 ? 0 : _c; // 마커의 중심 좌표를 화면 좌표로 변환
348
+
349
+ var markerPosition = new MapTypes.Position(lat, lng);
350
+ var markerOffset = controller.positionToOffset(markerPosition);
351
+ if (!markerOffset) return null; // 바운딩 박스의 화면 좌표 계산
352
+
353
+ var minX = markerOffset.x + offsetX - width / 2;
354
+ var minY = markerOffset.y + offsetY - height - tailHeight;
355
+ var maxX = markerOffset.x + offsetX + width / 2;
356
+ var maxY = markerOffset.y + offsetY; // 왼쪽 상단 좌표를 위도/경도로 변환
357
+
358
+ var leftTopOffset = new MapTypes.Offset(minX, minY);
359
+ var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표를 위도/경도로 변환
360
+
361
+ var bottomRightOffset = new MapTypes.Offset(maxX, maxY);
362
+ var bottomRight = controller.offsetToPosition(bottomRightOffset);
363
+ return {
364
+ bottomRight: bottomRight,
365
+ leftTop: leftTop
366
+ };
367
+ } catch (error) {
368
+ console.error('[calculateMarkerBoundingBox] error:', error);
369
+ return null;
370
+ }
371
+ };
302
372
 
373
+ exports.calculateMarkerBoundingBox = calculateMarkerBoundingBox;
303
374
  exports.calculateTextBoxWidth = calculateTextBoxWidth;
304
375
  exports.computeMarkerOffset = computeMarkerOffset;
305
376
  exports.computePolygonOffsets = computePolygonOffsets;
package/dist/index.es.js CHANGED
@@ -1761,6 +1761,76 @@ function createCanvasDataArray(serverDataArray, getCanvasOptions) {
1761
1761
  return createCanvasData(serverData, canvasOptions);
1762
1762
  });
1763
1763
  }
1764
+ /**
1765
+ * 마커 바운딩 박스 좌표 계산 (위도/경도)
1766
+ *
1767
+ * 마커의 중심 좌표와 크기를 기반으로 현재 뷰포트에서의 바운딩 박스 좌표를 계산합니다.
1768
+ *
1769
+ * @param params 계산 파라미터
1770
+ * @param params.lat 마커의 중심 위도
1771
+ * @param params.lng 마커의 중심 경도
1772
+ * @param params.width 마커의 너비 (픽셀 단위, boxWidth)
1773
+ * @param params.height 마커의 높이 (픽셀 단위, boxHeight)
1774
+ * @param params.controller MintMapController 인스턴스 (뷰포트 상태를 알기 위해 필요)
1775
+ * @param params.tailHeight 마커 꼬리 높이 (픽셀 단위, 기본값: 0)
1776
+ * @param params.offsetX 마커 오프셋 X (픽셀 단위, 기본값: 0)
1777
+ * @param params.offsetY 마커 오프셋 Y (픽셀 단위, 기본값: 0)
1778
+ * @returns 마커 바운딩 박스 좌표 (위도/경도) 또는 null
1779
+ *
1780
+ * @example
1781
+ * ```typescript
1782
+ * const boundingBox = calculateMarkerBoundingBox({
1783
+ * lat: 37.5665,
1784
+ * lng: 126.9780,
1785
+ * width: 100,
1786
+ * height: 50,
1787
+ * controller: mintMapController
1788
+ * });
1789
+ *
1790
+ * if (boundingBox) {
1791
+ * console.log('왼쪽 상단:', boundingBox.leftTop);
1792
+ * console.log('우측 하단:', boundingBox.bottomRight);
1793
+ * }
1794
+ * ```
1795
+ */
1796
+
1797
+ var calculateMarkerBoundingBox = function (params) {
1798
+ try {
1799
+ var lat = params.lat,
1800
+ lng = params.lng,
1801
+ width = params.width,
1802
+ height = params.height,
1803
+ controller = params.controller,
1804
+ _a = params.tailHeight,
1805
+ tailHeight = _a === void 0 ? 0 : _a,
1806
+ _b = params.offsetX,
1807
+ offsetX = _b === void 0 ? 0 : _b,
1808
+ _c = params.offsetY,
1809
+ offsetY = _c === void 0 ? 0 : _c; // 마커의 중심 좌표를 화면 좌표로 변환
1810
+
1811
+ var markerPosition = new Position(lat, lng);
1812
+ var markerOffset = controller.positionToOffset(markerPosition);
1813
+ if (!markerOffset) return null; // 바운딩 박스의 화면 좌표 계산
1814
+
1815
+ var minX = markerOffset.x + offsetX - width / 2;
1816
+ var minY = markerOffset.y + offsetY - height - tailHeight;
1817
+ var maxX = markerOffset.x + offsetX + width / 2;
1818
+ var maxY = markerOffset.y + offsetY; // 왼쪽 상단 좌표를 위도/경도로 변환
1819
+
1820
+ var leftTopOffset = new Offset(minX, minY);
1821
+ var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표를 위도/경도로 변환
1822
+
1823
+ var bottomRightOffset = new Offset(maxX, maxY);
1824
+ var bottomRight = controller.offsetToPosition(bottomRightOffset);
1825
+ return {
1826
+ bottomRight: bottomRight,
1827
+ leftTop: leftTop
1828
+ };
1829
+ } catch (error) {
1830
+ console.error('[calculateMarkerBoundingBox] error:', error);
1831
+ return null;
1832
+ }
1833
+ };
1764
1834
 
1765
1835
  /**
1766
1836
  * 캔버스 데이터 타입 Enum
@@ -4222,25 +4292,17 @@ var CanvasMarkerLayer = function (props) {
4222
4292
 
4223
4293
 
4224
4294
  var getMarkerBoundingBoxCoordinates = function (item) {
4225
- try {
4226
- var offset = getOrComputeMarkerOffset(item);
4227
- if (!offset) return null;
4228
- var boundingBox = computeBoundingBox(item);
4229
- if (!boundingBox) return null; // 왼쪽 상단 좌표 (minX, minY)
4230
-
4231
- var leftTopOffset = new Offset(boundingBox.minX, boundingBox.minY);
4232
- var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표 (maxX, maxY)
4233
-
4234
- var bottomRightOffset = new Offset(boundingBox.maxX, boundingBox.maxY);
4235
- var bottomRight = controller.offsetToPosition(bottomRightOffset);
4236
- return {
4237
- bottomRight: bottomRight,
4238
- leftTop: leftTop
4239
- };
4240
- } catch (error) {
4241
- console.error('[CanvasMarkerLayer] getMarkerBoundingBoxCoordinates error:', error, item);
4242
- return null;
4243
- }
4295
+ if (!item.position) return null;
4296
+ return calculateMarkerBoundingBox({
4297
+ controller: controller,
4298
+ height: item.boxHeight || 28,
4299
+ lat: item.position.lat,
4300
+ lng: item.position.lng,
4301
+ offsetX: item.offsetX || 0,
4302
+ offsetY: item.offsetY || 0,
4303
+ tailHeight: item.tailHeight || 0,
4304
+ width: item.boxWidth || 50
4305
+ });
4244
4306
  }; // 마우스 이동 이벤트 핸들러 (hover 감지)
4245
4307
 
4246
4308
 
@@ -4257,12 +4319,11 @@ var CanvasMarkerLayer = function (props) {
4257
4319
  if (prevHovered) onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
4258
4320
 
4259
4321
  if (hoveredItem) {
4260
- var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
4322
+ var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
4261
4323
 
4262
4324
  var payload = __assign(__assign({}, hoveredItem), {
4263
4325
  boundingBox: boundingBox || undefined
4264
- }); // 타입 체크를 통과하도록 타입 단언 추가
4265
-
4326
+ });
4266
4327
 
4267
4328
  onMouseOver === null || onMouseOver === void 0 ? void 0 : onMouseOver(payload);
4268
4329
  }
@@ -4376,12 +4437,11 @@ var CanvasMarkerLayer = function (props) {
4376
4437
  if (context) {
4377
4438
  // context를 통한 onMouseOver 호출 시에도 boundingBox를 포함하도록 래핑
4378
4439
  var wrappedOnMouseOver = onMouseOver ? function (payload) {
4379
- var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
4440
+ var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
4380
4441
 
4381
4442
  var enhancedPayload = __assign(__assign({}, payload), {
4382
4443
  boundingBox: boundingBox || undefined
4383
- }); // 타입 체크를 통과하도록 타입 단언 추가
4384
-
4444
+ });
4385
4445
 
4386
4446
  onMouseOver(enhancedPayload);
4387
4447
  } : undefined;
@@ -10389,4 +10449,4 @@ function MintMap(_a) {
10389
10449
  }), loading));
10390
10450
  }
10391
10451
 
10392
- export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerLayer, CanvasPolygonLayer, CanvasProvider, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, LRUCache, MapBuildingProjection, MapCanvasMarkerWrapper, MapCanvasWrapper, MapControlWrapper, MapEvent, MapLoadingWithImage, MapMarkerWrapper, MapPolygonWrapper, MapPolylineWrapper, MapUIEvent, Marker, MintMap, MintMapCanvasRenderer, MintMapController, MintMapCore, MintMapProvider, NaverMintMapController, Offset, PointLoading, Polygon, PolygonCalculator, PolygonMarker, Polyline, Position, SPATIAL_GRID_CELL_SIZE, SVGCircle, SVGPolygon, SVGRect, Spacing, SpatialHashGrid, Status, buildSpatialIndex, calculateTextBoxWidth, computeMarkerOffset, computePolygonOffsets, createCanvasData, createCanvasDataArray, createMapEventHandlers, getClusterInfo, getMapOfType, hexToRgba, isInViewport, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, mapValuesToArray, syncExternalSelectedItems, syncSelectedItems, updateViewport, useCanvasContext, useMarkerMoving, useMintMapController, validateEvent, waiting };
10452
+ export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerLayer, CanvasPolygonLayer, CanvasProvider, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, LRUCache, MapBuildingProjection, MapCanvasMarkerWrapper, MapCanvasWrapper, MapControlWrapper, MapEvent, MapLoadingWithImage, MapMarkerWrapper, MapPolygonWrapper, MapPolylineWrapper, MapUIEvent, Marker, MintMap, MintMapCanvasRenderer, MintMapController, MintMapCore, MintMapProvider, NaverMintMapController, Offset, PointLoading, Polygon, PolygonCalculator, PolygonMarker, Polyline, Position, SPATIAL_GRID_CELL_SIZE, SVGCircle, SVGPolygon, SVGRect, Spacing, SpatialHashGrid, Status, buildSpatialIndex, calculateMarkerBoundingBox, calculateTextBoxWidth, computeMarkerOffset, computePolygonOffsets, createCanvasData, createCanvasDataArray, createMapEventHandlers, getClusterInfo, getMapOfType, hexToRgba, isInViewport, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, mapValuesToArray, syncExternalSelectedItems, syncSelectedItems, updateViewport, useCanvasContext, useMarkerMoving, useMintMapController, validateEvent, waiting };
package/dist/index.js CHANGED
@@ -71,6 +71,7 @@ Object.defineProperty(exports, 'CanvasDataType', {
71
71
  enumerable: true,
72
72
  get: function () { return types.CanvasDataType; }
73
73
  });
74
+ exports.calculateMarkerBoundingBox = utils.calculateMarkerBoundingBox;
74
75
  exports.calculateTextBoxWidth = utils.calculateTextBoxWidth;
75
76
  exports.computeMarkerOffset = utils.computeMarkerOffset;
76
77
  exports.computePolygonOffsets = utils.computePolygonOffsets;
package/dist/index.umd.js CHANGED
@@ -1765,6 +1765,76 @@
1765
1765
  return createCanvasData(serverData, canvasOptions);
1766
1766
  });
1767
1767
  }
1768
+ /**
1769
+ * 마커 바운딩 박스 좌표 계산 (위도/경도)
1770
+ *
1771
+ * 마커의 중심 좌표와 크기를 기반으로 현재 뷰포트에서의 바운딩 박스 좌표를 계산합니다.
1772
+ *
1773
+ * @param params 계산 파라미터
1774
+ * @param params.lat 마커의 중심 위도
1775
+ * @param params.lng 마커의 중심 경도
1776
+ * @param params.width 마커의 너비 (픽셀 단위, boxWidth)
1777
+ * @param params.height 마커의 높이 (픽셀 단위, boxHeight)
1778
+ * @param params.controller MintMapController 인스턴스 (뷰포트 상태를 알기 위해 필요)
1779
+ * @param params.tailHeight 마커 꼬리 높이 (픽셀 단위, 기본값: 0)
1780
+ * @param params.offsetX 마커 오프셋 X (픽셀 단위, 기본값: 0)
1781
+ * @param params.offsetY 마커 오프셋 Y (픽셀 단위, 기본값: 0)
1782
+ * @returns 마커 바운딩 박스 좌표 (위도/경도) 또는 null
1783
+ *
1784
+ * @example
1785
+ * ```typescript
1786
+ * const boundingBox = calculateMarkerBoundingBox({
1787
+ * lat: 37.5665,
1788
+ * lng: 126.9780,
1789
+ * width: 100,
1790
+ * height: 50,
1791
+ * controller: mintMapController
1792
+ * });
1793
+ *
1794
+ * if (boundingBox) {
1795
+ * console.log('왼쪽 상단:', boundingBox.leftTop);
1796
+ * console.log('우측 하단:', boundingBox.bottomRight);
1797
+ * }
1798
+ * ```
1799
+ */
1800
+
1801
+ var calculateMarkerBoundingBox = function (params) {
1802
+ try {
1803
+ var lat = params.lat,
1804
+ lng = params.lng,
1805
+ width = params.width,
1806
+ height = params.height,
1807
+ controller = params.controller,
1808
+ _a = params.tailHeight,
1809
+ tailHeight = _a === void 0 ? 0 : _a,
1810
+ _b = params.offsetX,
1811
+ offsetX = _b === void 0 ? 0 : _b,
1812
+ _c = params.offsetY,
1813
+ offsetY = _c === void 0 ? 0 : _c; // 마커의 중심 좌표를 화면 좌표로 변환
1814
+
1815
+ var markerPosition = new Position(lat, lng);
1816
+ var markerOffset = controller.positionToOffset(markerPosition);
1817
+ if (!markerOffset) return null; // 바운딩 박스의 화면 좌표 계산
1818
+
1819
+ var minX = markerOffset.x + offsetX - width / 2;
1820
+ var minY = markerOffset.y + offsetY - height - tailHeight;
1821
+ var maxX = markerOffset.x + offsetX + width / 2;
1822
+ var maxY = markerOffset.y + offsetY; // 왼쪽 상단 좌표를 위도/경도로 변환
1823
+
1824
+ var leftTopOffset = new Offset(minX, minY);
1825
+ var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표를 위도/경도로 변환
1826
+
1827
+ var bottomRightOffset = new Offset(maxX, maxY);
1828
+ var bottomRight = controller.offsetToPosition(bottomRightOffset);
1829
+ return {
1830
+ bottomRight: bottomRight,
1831
+ leftTop: leftTop
1832
+ };
1833
+ } catch (error) {
1834
+ console.error('[calculateMarkerBoundingBox] error:', error);
1835
+ return null;
1836
+ }
1837
+ };
1768
1838
 
1769
1839
  /**
1770
1840
  * 캔버스 데이터 타입 Enum
@@ -4226,25 +4296,17 @@
4226
4296
 
4227
4297
 
4228
4298
  var getMarkerBoundingBoxCoordinates = function (item) {
4229
- try {
4230
- var offset = getOrComputeMarkerOffset(item);
4231
- if (!offset) return null;
4232
- var boundingBox = computeBoundingBox(item);
4233
- if (!boundingBox) return null; // 왼쪽 상단 좌표 (minX, minY)
4234
-
4235
- var leftTopOffset = new Offset(boundingBox.minX, boundingBox.minY);
4236
- var leftTop = controller.offsetToPosition(leftTopOffset); // 우측 하단 좌표 (maxX, maxY)
4237
-
4238
- var bottomRightOffset = new Offset(boundingBox.maxX, boundingBox.maxY);
4239
- var bottomRight = controller.offsetToPosition(bottomRightOffset);
4240
- return {
4241
- bottomRight: bottomRight,
4242
- leftTop: leftTop
4243
- };
4244
- } catch (error) {
4245
- console.error('[CanvasMarkerLayer] getMarkerBoundingBoxCoordinates error:', error, item);
4246
- return null;
4247
- }
4299
+ if (!item.position) return null;
4300
+ return calculateMarkerBoundingBox({
4301
+ controller: controller,
4302
+ height: item.boxHeight || 28,
4303
+ lat: item.position.lat,
4304
+ lng: item.position.lng,
4305
+ offsetX: item.offsetX || 0,
4306
+ offsetY: item.offsetY || 0,
4307
+ tailHeight: item.tailHeight || 0,
4308
+ width: item.boxWidth || 50
4309
+ });
4248
4310
  }; // 마우스 이동 이벤트 핸들러 (hover 감지)
4249
4311
 
4250
4312
 
@@ -4261,12 +4323,11 @@
4261
4323
  if (prevHovered) onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
4262
4324
 
4263
4325
  if (hoveredItem) {
4264
- var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
4326
+ var boundingBox = getMarkerBoundingBoxCoordinates(hoveredItem); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
4265
4327
 
4266
4328
  var payload = tslib.__assign(tslib.__assign({}, hoveredItem), {
4267
4329
  boundingBox: boundingBox || undefined
4268
- }); // 타입 체크를 통과하도록 타입 단언 추가
4269
-
4330
+ });
4270
4331
 
4271
4332
  onMouseOver === null || onMouseOver === void 0 ? void 0 : onMouseOver(payload);
4272
4333
  }
@@ -4380,12 +4441,11 @@
4380
4441
  if (context) {
4381
4442
  // context를 통한 onMouseOver 호출 시에도 boundingBox를 포함하도록 래핑
4382
4443
  var wrappedOnMouseOver = onMouseOver ? function (payload) {
4383
- var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (빌드 후에도 확실히 포함되도록)
4444
+ var boundingBox = getMarkerBoundingBoxCoordinates(payload); // boundingBox를 명시적으로 포함 (CanvasData<T>에 boundingBox 속성이 포함됨)
4384
4445
 
4385
4446
  var enhancedPayload = tslib.__assign(tslib.__assign({}, payload), {
4386
4447
  boundingBox: boundingBox || undefined
4387
- }); // 타입 체크를 통과하도록 타입 단언 추가
4388
-
4448
+ });
4389
4449
 
4390
4450
  onMouseOver(enhancedPayload);
4391
4451
  } : undefined;
@@ -10439,6 +10499,7 @@
10439
10499
  exports.SpatialHashGrid = SpatialHashGrid;
10440
10500
  exports.Status = Status;
10441
10501
  exports.buildSpatialIndex = buildSpatialIndex;
10502
+ exports.calculateMarkerBoundingBox = calculateMarkerBoundingBox;
10442
10503
  exports.calculateTextBoxWidth = calculateTextBoxWidth;
10443
10504
  exports.computeMarkerOffset = computeMarkerOffset;
10444
10505
  exports.computePolygonOffsets = computePolygonOffsets;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.60",
3
+ "version": "1.2.0-test.62",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",