@mint-ui/map 1.2.0-test.3 → 1.2.0-test.5

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.
@@ -1031,7 +1031,7 @@ var WoongKonvaMarkerComponent = function (_a) {
1031
1031
  */
1032
1032
 
1033
1033
 
1034
- React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
1034
+ var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
1035
1035
  // 1. markers 비교
1036
1036
  var prevMarkers = prevProps.markers;
1037
1037
  var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
@@ -1062,3 +1062,4 @@ Object.defineProperty(exports, 'CanvasDataType', {
1062
1062
  exports.KonvaMarkerProvider = context.KonvaMarkerProvider;
1063
1063
  exports.LRUCache = performance.LRUCache;
1064
1064
  exports.SpatialHashGrid = performance.SpatialHashGrid;
1065
+ exports["default"] = WoongKonvaMarker;
@@ -1,2 +1,3 @@
1
+ export { default as WoongKonvaMarker } from "./WoongKonvaMarker";
1
2
  export * from "./WoongKonvaMarker";
2
3
  export * from "./shared";
@@ -14,7 +14,15 @@ export declare const computeMarkerOffset: (markerData: KonvaCanvasMarkerData<any
14
14
  */
15
15
  export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => boolean;
16
16
  /**
17
- * 폴리곤 히트 테스트
17
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
18
+ *
19
+ * 로직:
20
+ * 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
21
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
22
+ *
23
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
24
+ * - 도넛 폴리곤 A: isDonutPolygon=true
25
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
18
26
  */
19
27
  export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasMarkerData<any>, getPolygonOffsets: (data: KonvaCanvasMarkerData<any>) => number[][][][] | null) => boolean;
20
28
  /**
@@ -72,18 +72,67 @@ var isPointInPolygon = function (point, polygon) {
72
72
  return inside;
73
73
  };
74
74
  /**
75
- * 폴리곤 히트 테스트
75
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
76
+ *
77
+ * 로직:
78
+ * 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
79
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
80
+ *
81
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
82
+ * - 도넛 폴리곤 A: isDonutPolygon=true
83
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
76
84
  */
77
85
 
78
86
  var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
79
87
  var polygonOffsets = getPolygonOffsets(polygonData);
80
- if (!polygonOffsets) return false;
88
+ if (!polygonOffsets) return false; // 🍩 도넛 폴리곤 처리 (isDonutPolygon === true)
81
89
 
82
- for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
83
- var multiPolygon = polygonOffsets_1[_i];
90
+ if (polygonData.isDonutPolygon) {
91
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
92
+ var multiPolygon = polygonOffsets_1[_i];
93
+ if (multiPolygon.length === 0) continue; // 외부 폴리곤만 있는 경우 (구멍 없음) - 일반 폴리곤처럼 처리
84
94
 
85
- for (var _a = 0, multiPolygon_2 = multiPolygon; _a < multiPolygon_2.length; _a++) {
86
- var polygonGroup = multiPolygon_2[_a];
95
+ if (multiPolygon.length === 1) {
96
+ if (isPointInPolygon(clickedOffset, multiPolygon[0])) {
97
+ return true;
98
+ }
99
+
100
+ continue;
101
+ } // 1. 외부 폴리곤(첫 번째)에 포함되는지 확인
102
+
103
+
104
+ var outerPolygon = multiPolygon[0];
105
+
106
+ if (!isPointInPolygon(clickedOffset, outerPolygon)) {
107
+ continue; // 외부 폴리곤 밖이면 다음 multiPolygon 확인
108
+ } // 2. 내부 구멍들(나머지)에 포함되는지 확인
109
+
110
+
111
+ for (var i = 1; i < multiPolygon.length; i++) {
112
+ var hole = multiPolygon[i];
113
+
114
+ if (isPointInPolygon(clickedOffset, hole)) {
115
+ // ❌ 구멍 안에 있음 → 이 도넛 폴리곤은 히트 안 됨
116
+ // 다른 multiPolygon 체크하지 않고 바로 false 반환
117
+ // (도넛 폴리곤의 구멍 안은 무조건 클릭 불가)
118
+ return false;
119
+ }
120
+ } // ✅ 외부 폴리곤 안 + 구멍 밖 = 히트!
121
+
122
+
123
+ return true;
124
+ }
125
+
126
+ return false;
127
+ } // 일반 폴리곤 처리 (isDonutPolygon === false 또는 undefined)
128
+
129
+
130
+ for (var _a = 0, polygonOffsets_2 = polygonOffsets; _a < polygonOffsets_2.length; _a++) {
131
+ var multiPolygon = polygonOffsets_2[_a];
132
+
133
+ for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
134
+ var polygonGroup = multiPolygon_2[_b];
135
+ if (polygonGroup.length === 0) continue;
87
136
 
88
137
  if (isPointInPolygon(clickedOffset, polygonGroup)) {
89
138
  return true;
package/dist/index.es.js CHANGED
@@ -860,18 +860,67 @@ var isPointInPolygon = function (point, polygon) {
860
860
  return inside;
861
861
  };
862
862
  /**
863
- * 폴리곤 히트 테스트
863
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
864
+ *
865
+ * 로직:
866
+ * 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
867
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
868
+ *
869
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
870
+ * - 도넛 폴리곤 A: isDonutPolygon=true
871
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
864
872
  */
865
873
 
866
874
  var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
867
875
  var polygonOffsets = getPolygonOffsets(polygonData);
868
- if (!polygonOffsets) return false;
876
+ if (!polygonOffsets) return false; // 🍩 도넛 폴리곤 처리 (isDonutPolygon === true)
877
+
878
+ if (polygonData.isDonutPolygon) {
879
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
880
+ var multiPolygon = polygonOffsets_1[_i];
881
+ if (multiPolygon.length === 0) continue; // 외부 폴리곤만 있는 경우 (구멍 없음) - 일반 폴리곤처럼 처리
882
+
883
+ if (multiPolygon.length === 1) {
884
+ if (isPointInPolygon(clickedOffset, multiPolygon[0])) {
885
+ return true;
886
+ }
887
+
888
+ continue;
889
+ } // 1. 외부 폴리곤(첫 번째)에 포함되는지 확인
890
+
891
+
892
+ var outerPolygon = multiPolygon[0];
893
+
894
+ if (!isPointInPolygon(clickedOffset, outerPolygon)) {
895
+ continue; // 외부 폴리곤 밖이면 다음 multiPolygon 확인
896
+ } // 2. 내부 구멍들(나머지)에 포함되는지 확인
897
+
898
+
899
+ for (var i = 1; i < multiPolygon.length; i++) {
900
+ var hole = multiPolygon[i];
901
+
902
+ if (isPointInPolygon(clickedOffset, hole)) {
903
+ // ❌ 구멍 안에 있음 → 이 도넛 폴리곤은 히트 안 됨
904
+ // 다른 multiPolygon 체크하지 않고 바로 false 반환
905
+ // (도넛 폴리곤의 구멍 안은 무조건 클릭 불가)
906
+ return false;
907
+ }
908
+ } // ✅ 외부 폴리곤 안 + 구멍 밖 = 히트!
909
+
910
+
911
+ return true;
912
+ }
913
+
914
+ return false;
915
+ } // 일반 폴리곤 처리 (isDonutPolygon === false 또는 undefined)
916
+
869
917
 
870
- for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
871
- var multiPolygon = polygonOffsets_1[_i];
918
+ for (var _a = 0, polygonOffsets_2 = polygonOffsets; _a < polygonOffsets_2.length; _a++) {
919
+ var multiPolygon = polygonOffsets_2[_a];
872
920
 
873
- for (var _a = 0, multiPolygon_2 = multiPolygon; _a < multiPolygon_2.length; _a++) {
874
- var polygonGroup = multiPolygon_2[_a];
921
+ for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
922
+ var polygonGroup = multiPolygon_2[_b];
923
+ if (polygonGroup.length === 0) continue;
875
924
 
876
925
  if (isPointInPolygon(clickedOffset, polygonGroup)) {
877
926
  return true;
@@ -6332,7 +6381,7 @@ var WoongKonvaMarkerComponent = function (_a) {
6332
6381
  */
6333
6382
 
6334
6383
 
6335
- React.memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6384
+ var WoongKonvaMarker = React.memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6336
6385
  // 1. markers 비교
6337
6386
  var prevMarkers = prevProps.markers;
6338
6387
  var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
@@ -9187,4 +9236,4 @@ function MintMap(_a) {
9187
9236
  }), loading));
9188
9237
  }
9189
9238
 
9190
- export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerHanquf, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, KonvaMarkerProvider, 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, computeMarkerOffset, computePolygonOffsets, getClusterInfo, getMapOfType, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, useKonvaMarkerContext, useMarkerMoving, useMintMapController, waiting };
9239
+ export { AnimationPlayer, Bounds, CanvasDataType, CanvasMarker, CanvasMarkerClaude, CanvasMarkerHanquf, CircleMarker, DEFAULT_CULLING_MARGIN, DEFAULT_MAX_CACHE_SIZE, Drawable, GeoCalulator, GoogleMintMapController, KonvaMarkerProvider, 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, WoongKonvaMarker, computeMarkerOffset, computePolygonOffsets, getClusterInfo, getMapOfType, isPointInMarkerData, isPointInPolygon, isPointInPolygonData, log, useKonvaMarkerContext, useMarkerMoving, useMintMapController, waiting };
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ var CanvasMarkerHanquf = require('./components/mint-map/core/advanced/canvas/Can
16
16
  var CanvasMarkerClaude = require('./components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js');
17
17
  var MapBuildingProjection = require('./components/mint-map/core/advanced/MapBuildingProjection.js');
18
18
  var MapLoadingComponents = require('./components/mint-map/core/advanced/MapLoadingComponents.js');
19
- require('./components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js');
19
+ var WoongKonvaMarker = require('./components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js');
20
20
  var types = require('./components/mint-map/core/advanced/woongCanvas/shared/types.js');
21
21
  var utils = require('./components/mint-map/core/advanced/woongCanvas/shared/utils.js');
22
22
  var context = require('./components/mint-map/core/advanced/woongCanvas/shared/context.js');
@@ -60,6 +60,7 @@ exports.CanvasMarkerClaude = CanvasMarkerClaude.CanvasMarkerClaude;
60
60
  exports.MapBuildingProjection = MapBuildingProjection.MapBuildingProjection;
61
61
  exports.MapLoadingWithImage = MapLoadingComponents.MapLoadingWithImage;
62
62
  exports.PointLoading = MapLoadingComponents.PointLoading;
63
+ exports.WoongKonvaMarker = WoongKonvaMarker["default"];
63
64
  Object.defineProperty(exports, 'CanvasDataType', {
64
65
  enumerable: true,
65
66
  get: function () { return types.CanvasDataType; }
package/dist/index.umd.js CHANGED
@@ -864,18 +864,67 @@
864
864
  return inside;
865
865
  };
866
866
  /**
867
- * 폴리곤 히트 테스트
867
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
868
+ *
869
+ * 로직:
870
+ * 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
871
+ * 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
872
+ *
873
+ * 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
874
+ * - 도넛 폴리곤 A: isDonutPolygon=true
875
+ * - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
868
876
  */
869
877
 
870
878
  var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
871
879
  var polygonOffsets = getPolygonOffsets(polygonData);
872
- if (!polygonOffsets) return false;
880
+ if (!polygonOffsets) return false; // 🍩 도넛 폴리곤 처리 (isDonutPolygon === true)
881
+
882
+ if (polygonData.isDonutPolygon) {
883
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
884
+ var multiPolygon = polygonOffsets_1[_i];
885
+ if (multiPolygon.length === 0) continue; // 외부 폴리곤만 있는 경우 (구멍 없음) - 일반 폴리곤처럼 처리
886
+
887
+ if (multiPolygon.length === 1) {
888
+ if (isPointInPolygon(clickedOffset, multiPolygon[0])) {
889
+ return true;
890
+ }
891
+
892
+ continue;
893
+ } // 1. 외부 폴리곤(첫 번째)에 포함되는지 확인
894
+
895
+
896
+ var outerPolygon = multiPolygon[0];
897
+
898
+ if (!isPointInPolygon(clickedOffset, outerPolygon)) {
899
+ continue; // 외부 폴리곤 밖이면 다음 multiPolygon 확인
900
+ } // 2. 내부 구멍들(나머지)에 포함되는지 확인
901
+
902
+
903
+ for (var i = 1; i < multiPolygon.length; i++) {
904
+ var hole = multiPolygon[i];
905
+
906
+ if (isPointInPolygon(clickedOffset, hole)) {
907
+ // ❌ 구멍 안에 있음 → 이 도넛 폴리곤은 히트 안 됨
908
+ // 다른 multiPolygon 체크하지 않고 바로 false 반환
909
+ // (도넛 폴리곤의 구멍 안은 무조건 클릭 불가)
910
+ return false;
911
+ }
912
+ } // ✅ 외부 폴리곤 안 + 구멍 밖 = 히트!
913
+
914
+
915
+ return true;
916
+ }
917
+
918
+ return false;
919
+ } // 일반 폴리곤 처리 (isDonutPolygon === false 또는 undefined)
920
+
873
921
 
874
- for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
875
- var multiPolygon = polygonOffsets_1[_i];
922
+ for (var _a = 0, polygonOffsets_2 = polygonOffsets; _a < polygonOffsets_2.length; _a++) {
923
+ var multiPolygon = polygonOffsets_2[_a];
876
924
 
877
- for (var _a = 0, multiPolygon_2 = multiPolygon; _a < multiPolygon_2.length; _a++) {
878
- var polygonGroup = multiPolygon_2[_a];
925
+ for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
926
+ var polygonGroup = multiPolygon_2[_b];
927
+ if (polygonGroup.length === 0) continue;
879
928
 
880
929
  if (isPointInPolygon(clickedOffset, polygonGroup)) {
881
930
  return true;
@@ -6336,7 +6385,7 @@
6336
6385
  */
6337
6386
 
6338
6387
 
6339
- React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6388
+ var WoongKonvaMarker = React__default["default"].memo(WoongKonvaMarkerComponent, function (prevProps, nextProps) {
6340
6389
  // 1. markers 비교
6341
6390
  var prevMarkers = prevProps.markers;
6342
6391
  var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
@@ -9235,6 +9284,7 @@
9235
9284
  exports.Spacing = Spacing;
9236
9285
  exports.SpatialHashGrid = SpatialHashGrid;
9237
9286
  exports.Status = Status;
9287
+ exports.WoongKonvaMarker = WoongKonvaMarker;
9238
9288
  exports.computeMarkerOffset = computeMarkerOffset;
9239
9289
  exports.computePolygonOffsets = computePolygonOffsets;
9240
9290
  exports.getClusterInfo = getClusterInfo;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mint-ui/map",
3
- "version": "1.2.0-test.3",
3
+ "version": "1.2.0-test.5",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "browser": "./dist/index.umd.js",