@mint-ui/map 1.2.0-test.8 → 1.2.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/.eslintrc.js +11 -4
- package/.vscode/settings.json +32 -9
- package/dist/components/mint-map/core/MintMapController.d.ts +1 -0
- package/dist/components/mint-map/core/MintMapCore.js +5 -6
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +12 -0
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +962 -0
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/index.d.ts +4 -0
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/types.d.ts +280 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +17 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +624 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/index.d.ts +4 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +303 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +1091 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/types.d.ts +284 -0
- package/dist/components/mint-map/core/advanced/canvas/CanvasMarker.d.ts +7 -0
- package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js +7 -7
- package/dist/components/mint-map/core/advanced/canvas/index.d.ts +0 -1
- package/dist/components/mint-map/core/advanced/index.d.ts +4 -2
- package/dist/components/mint-map/core/advanced/shared/context.d.ts +44 -0
- package/dist/components/mint-map/core/advanced/shared/context.js +230 -0
- package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
- package/dist/components/mint-map/core/advanced/shared/helpers.js +41 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.js +196 -0
- package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +5 -2
- package/dist/components/mint-map/core/advanced/shared/performance.d.ts +82 -0
- package/dist/components/mint-map/core/advanced/shared/performance.js +288 -0
- package/dist/components/mint-map/core/advanced/shared/types.d.ts +150 -0
- package/dist/components/mint-map/core/advanced/shared/types.js +31 -0
- package/dist/components/mint-map/core/advanced/shared/utils.d.ts +173 -0
- package/dist/components/mint-map/core/advanced/shared/utils.js +382 -0
- package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
- package/dist/components/mint-map/core/advanced/shared/viewport.js +52 -0
- package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
- package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
- package/dist/components/mint-map/google/GoogleMintMapController.js +13 -8
- package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +13 -8
- package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
- package/dist/components/mint-map/naver/NaverMintMapController.js +46 -11
- package/dist/index.es.js +5605 -4056
- package/dist/index.js +47 -27
- package/dist/index.umd.js +5621 -4059
- package/package.json +1 -1
- package/CLAUDE.md +0 -100
- package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.d.ts +0 -22
- package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.js +0 -413
- package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -53
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1123
- package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +0 -164
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +0 -14
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -31
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -164
- package/dist/components/mint-map/core/util/geohash.js +0 -125
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import Konva from "konva";
|
|
2
|
-
import { Position, Offset } from "../../../../types";
|
|
3
|
-
/**
|
|
4
|
-
* 캔버스 데이터 타입 Enum
|
|
5
|
-
* 마커인지 폴리곤인지 구분하는 상수
|
|
6
|
-
*/
|
|
7
|
-
export declare enum CanvasDataType {
|
|
8
|
-
MARKER = "MARKER",
|
|
9
|
-
POLYGON = "POLYGON"
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* 폴리곤 경로 정의
|
|
13
|
-
*/
|
|
14
|
-
export interface Paths {
|
|
15
|
-
type: string;
|
|
16
|
-
coordinates: number[][][][];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 캔버스 마커/폴리곤 기본 옵션
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Konva 캔버스 마커/폴리곤의 기본 필수 속성
|
|
23
|
-
* (렌더링에 필요한 최소 정보)
|
|
24
|
-
*/
|
|
25
|
-
export interface KonvaCanvasMarkerOption {
|
|
26
|
-
id: string;
|
|
27
|
-
position: Position;
|
|
28
|
-
boxWidth?: number;
|
|
29
|
-
boxHeight?: number;
|
|
30
|
-
paths?: Paths;
|
|
31
|
-
isDonutPolygon?: boolean;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* 서버 데이터와 캔버스 옵션을 결합한 타입
|
|
35
|
-
* @template T 서버에서 받은 원본 데이터 타입 (예: Marker, Polygon)
|
|
36
|
-
* @example
|
|
37
|
-
* // API에서 받은 Marker 타입을 그대로 유지하면서 캔버스 렌더링 정보 추가
|
|
38
|
-
* type MarkerWithCanvas = KonvaCanvasMarkerData<Marker>
|
|
39
|
-
* // { raId, lat, lng, buildingName, totalArea } + { id, position, boxWidth, ... }
|
|
40
|
-
*/
|
|
41
|
-
export declare type KonvaCanvasMarkerData<T = {}> = T & KonvaCanvasMarkerOption;
|
|
42
|
-
/**
|
|
43
|
-
* 렌더링 유틸리티 함수들
|
|
44
|
-
*/
|
|
45
|
-
export interface RenderUtils<T> {
|
|
46
|
-
getOrComputePolygonOffsets: (polygonData: KonvaCanvasMarkerData<T>) => number[][][][] | null;
|
|
47
|
-
getOrComputeMarkerOffset: (markerData: KonvaCanvasMarkerData<T>) => Offset | null;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 커스텀 렌더링 함수 파라미터 - Base Layer
|
|
51
|
-
*/
|
|
52
|
-
export interface RenderBaseParams<T> {
|
|
53
|
-
/** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
|
|
54
|
-
ctx: CanvasRenderingContext2D;
|
|
55
|
-
/** 렌더링할 마커 데이터 배열 */
|
|
56
|
-
items: KonvaCanvasMarkerData<T>[];
|
|
57
|
-
/** 현재 선택된 마커 ID Set */
|
|
58
|
-
selectedIds: Set<string>;
|
|
59
|
-
/** 렌더링 유틸리티 함수들 */
|
|
60
|
-
utils: RenderUtils<T>;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* 커스텀 렌더링 함수 타입 - Base Layer
|
|
64
|
-
*
|
|
65
|
-
* 🔥 순수 Canvas API 사용 (Konva 지식 불필요!)
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* const renderBase = ({ ctx, items, selectedIds, utils }) => {
|
|
69
|
-
* for (const item of items) {
|
|
70
|
-
* if (selectedIds.has(item.id)) continue;
|
|
71
|
-
* const pos = utils.getOrComputeMarkerOffset(item);
|
|
72
|
-
* ctx.fillRect(pos.x, pos.y, 50, 50); // 순수 Canvas API!
|
|
73
|
-
* }
|
|
74
|
-
* };
|
|
75
|
-
*/
|
|
76
|
-
export declare type CustomRenderBase<T> = (params: RenderBaseParams<T>) => void;
|
|
77
|
-
/**
|
|
78
|
-
* 커스텀 렌더링 함수 파라미터 - Animation Layer
|
|
79
|
-
*/
|
|
80
|
-
export interface RenderAnimationParams<T> {
|
|
81
|
-
/** Konva Layer 인스턴스 */
|
|
82
|
-
layer: Konva.Layer;
|
|
83
|
-
/** 현재 선택된 마커 ID Set */
|
|
84
|
-
selectedIds: Set<string>;
|
|
85
|
-
/** 전체 마커 데이터 배열 */
|
|
86
|
-
items: KonvaCanvasMarkerData<T>[];
|
|
87
|
-
/** 렌더링 유틸리티 함수들 */
|
|
88
|
-
utils: RenderUtils<T>;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* 커스텀 렌더링 함수 타입 - Animation Layer (선택)
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* const renderAnimation = ({ layer, selectedIds, items, utils }) => {
|
|
95
|
-
* for (const id of selectedIds) {
|
|
96
|
-
* const item = items.find(i => i.id === id);
|
|
97
|
-
* // Konva 애니메이션 구현
|
|
98
|
-
* }
|
|
99
|
-
* };
|
|
100
|
-
*/
|
|
101
|
-
export declare type CustomRenderAnimation<T> = (params: RenderAnimationParams<T>) => void;
|
|
102
|
-
/**
|
|
103
|
-
* 커스텀 렌더링 함수 파라미터 - Event Layer
|
|
104
|
-
*/
|
|
105
|
-
export interface RenderEventParams<T> {
|
|
106
|
-
/** Canvas 2D 렌더링 컨텍스트 (순수 Canvas API) */
|
|
107
|
-
ctx: CanvasRenderingContext2D;
|
|
108
|
-
/** 현재 hover된 마커 데이터 */
|
|
109
|
-
hoveredItem: KonvaCanvasMarkerData<T> | null;
|
|
110
|
-
/** 렌더링 유틸리티 함수들 */
|
|
111
|
-
utils: RenderUtils<T>;
|
|
112
|
-
/** 현재 선택된 마커 데이터 배열 (선택 강조용) */
|
|
113
|
-
selectedItems?: KonvaCanvasMarkerData<T>[];
|
|
114
|
-
/** 외부에서 전달된 단일 선택 아이템 (특별한 효과용) */
|
|
115
|
-
selectedItem?: KonvaCanvasMarkerData<T> | null;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* 커스텀 렌더링 함수 타입 - Event Layer
|
|
119
|
-
*
|
|
120
|
-
* 🔥 순수 Canvas API 사용 (Konva 지식 불필요!)
|
|
121
|
-
*
|
|
122
|
-
* @example
|
|
123
|
-
* const renderEvent = ({ ctx, hoveredItem, utils, selectedItems }) => {
|
|
124
|
-
* if (hoveredItem) {
|
|
125
|
-
* const pos = utils.getOrComputeMarkerOffset(hoveredItem);
|
|
126
|
-
* ctx.fillStyle = 'red';
|
|
127
|
-
* ctx.fillRect(pos.x, pos.y, 50, 50); // 순수 Canvas API!
|
|
128
|
-
* }
|
|
129
|
-
* };
|
|
130
|
-
*/
|
|
131
|
-
export declare type CustomRenderEvent<T> = (params: RenderEventParams<T>) => void;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 캔버스 데이터 타입 Enum
|
|
7
|
-
* 마커인지 폴리곤인지 구분하는 상수
|
|
8
|
-
*/
|
|
9
|
-
exports.CanvasDataType = void 0;
|
|
10
|
-
|
|
11
|
-
(function (CanvasDataType) {
|
|
12
|
-
CanvasDataType["MARKER"] = "MARKER";
|
|
13
|
-
CanvasDataType["POLYGON"] = "POLYGON";
|
|
14
|
-
})(exports.CanvasDataType || (exports.CanvasDataType = {}));
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Offset } from "../../../../types";
|
|
2
|
-
import { MintMapController } from "../../../MintMapController";
|
|
3
|
-
import { KonvaCanvasMarkerData } from "./types";
|
|
4
|
-
/**
|
|
5
|
-
* 폴리곤 offset 계산
|
|
6
|
-
*/
|
|
7
|
-
export declare const computePolygonOffsets: (polygonData: KonvaCanvasMarkerData<any>, controller: MintMapController) => number[][][][] | null;
|
|
8
|
-
/**
|
|
9
|
-
* 마커 offset 계산
|
|
10
|
-
*/
|
|
11
|
-
export declare const computeMarkerOffset: (markerData: KonvaCanvasMarkerData<any>, controller: MintMapController) => Offset | null;
|
|
12
|
-
/**
|
|
13
|
-
* Point-in-Polygon 알고리즘
|
|
14
|
-
*/
|
|
15
|
-
export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => boolean;
|
|
16
|
-
/**
|
|
17
|
-
* 폴리곤 히트 테스트 (도넛 폴리곤 지원)
|
|
18
|
-
*
|
|
19
|
-
* 로직:
|
|
20
|
-
* 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
|
|
21
|
-
* 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
|
|
22
|
-
*
|
|
23
|
-
* 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
|
|
24
|
-
* - 도넛 폴리곤 A: isDonutPolygon=true
|
|
25
|
-
* - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
|
|
26
|
-
*/
|
|
27
|
-
export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasMarkerData<any>, getPolygonOffsets: (data: KonvaCanvasMarkerData<any>) => number[][][][] | null) => boolean;
|
|
28
|
-
/**
|
|
29
|
-
* 마커 히트 테스트
|
|
30
|
-
*/
|
|
31
|
-
export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasMarkerData<any>, getMarkerOffset: (data: KonvaCanvasMarkerData<any>) => Offset | null) => boolean;
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
require('../../../../types/MapDrawables.js');
|
|
6
|
-
var MapTypes = require('../../../../types/MapTypes.js');
|
|
7
|
-
require('../../../../types/MapEventTypes.js');
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 폴리곤 offset 계산
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
var computePolygonOffsets = function (polygonData, controller) {
|
|
14
|
-
var paths = polygonData.paths;
|
|
15
|
-
|
|
16
|
-
if (!paths || paths.type !== 'MultiPolygon' || !paths.coordinates) {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
var result = [];
|
|
21
|
-
|
|
22
|
-
for (var _i = 0, _a = paths.coordinates; _i < _a.length; _i++) {
|
|
23
|
-
var multiPolygon = _a[_i];
|
|
24
|
-
var multiPolygonOffsets = [];
|
|
25
|
-
|
|
26
|
-
for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
|
|
27
|
-
var polygonGroup = multiPolygon_1[_b];
|
|
28
|
-
var polygonOffsets = [];
|
|
29
|
-
|
|
30
|
-
for (var _c = 0, polygonGroup_1 = polygonGroup; _c < polygonGroup_1.length; _c++) {
|
|
31
|
-
var coord = polygonGroup_1[_c];
|
|
32
|
-
var pos = new MapTypes.Position(coord[1], coord[0]);
|
|
33
|
-
var offset = controller.positionToOffset(pos);
|
|
34
|
-
polygonOffsets.push([offset.x, offset.y]);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
multiPolygonOffsets.push(polygonOffsets);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
result.push(multiPolygonOffsets);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return result;
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* 마커 offset 계산
|
|
47
|
-
*/
|
|
48
|
-
|
|
49
|
-
var computeMarkerOffset = function (markerData, controller) {
|
|
50
|
-
if (!markerData.position) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return controller.positionToOffset(markerData.position);
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Point-in-Polygon 알고리즘
|
|
58
|
-
*/
|
|
59
|
-
|
|
60
|
-
var isPointInPolygon = function (point, polygon) {
|
|
61
|
-
var inside = false;
|
|
62
|
-
|
|
63
|
-
for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
64
|
-
var xi = polygon[i][0],
|
|
65
|
-
yi = polygon[i][1];
|
|
66
|
-
var xj = polygon[j][0],
|
|
67
|
-
yj = polygon[j][1];
|
|
68
|
-
var intersect = yi > point.y !== yj > point.y && point.x < (xj - xi) * (point.y - yi) / (yj - yi) + xi;
|
|
69
|
-
if (intersect) inside = !inside;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return inside;
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* 폴리곤 히트 테스트 (도넛 폴리곤 지원)
|
|
76
|
-
*
|
|
77
|
-
* 로직:
|
|
78
|
-
* 1. 외부 폴리곤(첫 번째): 내부에 있어야 함
|
|
79
|
-
* 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
|
|
80
|
-
*
|
|
81
|
-
* 중요: 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됨
|
|
82
|
-
* - 도넛 폴리곤 A: isDonutPolygon=true
|
|
83
|
-
* - 내부 폴리곤 B: isDonutPolygon=false (별도 데이터)
|
|
84
|
-
*/
|
|
85
|
-
|
|
86
|
-
var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
|
|
87
|
-
var polygonOffsets = getPolygonOffsets(polygonData);
|
|
88
|
-
if (!polygonOffsets) return false; // 🍩 도넛 폴리곤 처리 (isDonutPolygon === true)
|
|
89
|
-
|
|
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; // 외부 폴리곤만 있는 경우 (구멍 없음) - 일반 폴리곤처럼 처리
|
|
94
|
-
|
|
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;
|
|
136
|
-
|
|
137
|
-
if (isPointInPolygon(clickedOffset, polygonGroup)) {
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return false;
|
|
144
|
-
};
|
|
145
|
-
/**
|
|
146
|
-
* 마커 히트 테스트
|
|
147
|
-
*/
|
|
148
|
-
|
|
149
|
-
var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset) {
|
|
150
|
-
var markerOffset = getMarkerOffset(markerData);
|
|
151
|
-
if (!markerOffset) return false;
|
|
152
|
-
var boxWidth = markerData.boxWidth || 50;
|
|
153
|
-
var boxHeight = markerData.boxHeight || 28;
|
|
154
|
-
var tailHeight = 6;
|
|
155
|
-
var x = markerOffset.x - boxWidth / 2;
|
|
156
|
-
var y = markerOffset.y - boxHeight - tailHeight;
|
|
157
|
-
return clickedOffset.x >= x && clickedOffset.x <= x + boxWidth && clickedOffset.y >= y && clickedOffset.y <= y + boxHeight;
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
exports.computeMarkerOffset = computeMarkerOffset;
|
|
161
|
-
exports.computePolygonOffsets = computePolygonOffsets;
|
|
162
|
-
exports.isPointInMarkerData = isPointInMarkerData;
|
|
163
|
-
exports.isPointInPolygon = isPointInPolygon;
|
|
164
|
-
exports.isPointInPolygonData = isPointInPolygonData;
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
// Lightweight Geohash encoder and neighbor utilities
|
|
6
|
-
var BASE32 = '0123456789bcdefghjkmnpqrstuvwxyz';
|
|
7
|
-
var NEIGHBORS = {
|
|
8
|
-
n: {
|
|
9
|
-
even: {
|
|
10
|
-
border: 'prxz',
|
|
11
|
-
neighbor: 'bc01fg45238967deuvhjyznpkmstqrwx'
|
|
12
|
-
},
|
|
13
|
-
odd: {
|
|
14
|
-
border: 'bcfguvyz',
|
|
15
|
-
neighbor: 'p0r21436x8zb9dcf5h7kjnmqesgutwvy'
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
s: {
|
|
19
|
-
even: {
|
|
20
|
-
border: '028b',
|
|
21
|
-
neighbor: '238967debc01fg45kmstqrwxuvhjyznp'
|
|
22
|
-
},
|
|
23
|
-
odd: {
|
|
24
|
-
border: '0145hjnp',
|
|
25
|
-
neighbor: '14365h7k9dcfesgujnmqp0r2twvyx8zb'
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
e: {
|
|
29
|
-
even: {
|
|
30
|
-
border: 'bcfguvyz',
|
|
31
|
-
neighbor: '14365h7k9dcfesgujnmqp0r2twvyx8zb'
|
|
32
|
-
},
|
|
33
|
-
odd: {
|
|
34
|
-
border: 'prxz',
|
|
35
|
-
neighbor: 'bc01fg45238967deuvhjyznpkmstqrwx'
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
w: {
|
|
39
|
-
even: {
|
|
40
|
-
border: '0145hjnp',
|
|
41
|
-
neighbor: '238967debc01fg45kmstqrwxuvhjyznp'
|
|
42
|
-
},
|
|
43
|
-
odd: {
|
|
44
|
-
border: '028b',
|
|
45
|
-
neighbor: 'p0r21436x8zb9dcf5h7kjnmqesgutwvy'
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
function geohashEncode(lat, lon, precision) {
|
|
50
|
-
if (precision === void 0) {
|
|
51
|
-
precision = 6;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
var idx = 0;
|
|
55
|
-
var bit = 0;
|
|
56
|
-
var evenBit = true;
|
|
57
|
-
var geohash = '';
|
|
58
|
-
var latMin = -90,
|
|
59
|
-
latMax = 90;
|
|
60
|
-
var lonMin = -180,
|
|
61
|
-
lonMax = 180;
|
|
62
|
-
|
|
63
|
-
while (geohash.length < precision) {
|
|
64
|
-
if (evenBit) {
|
|
65
|
-
var lonMid = (lonMin + lonMax) / 2;
|
|
66
|
-
|
|
67
|
-
if (lon >= lonMid) {
|
|
68
|
-
idx = idx * 2 + 1;
|
|
69
|
-
lonMin = lonMid;
|
|
70
|
-
} else {
|
|
71
|
-
idx = idx * 2;
|
|
72
|
-
lonMax = lonMid;
|
|
73
|
-
}
|
|
74
|
-
} else {
|
|
75
|
-
var latMid = (latMin + latMax) / 2;
|
|
76
|
-
|
|
77
|
-
if (lat >= latMid) {
|
|
78
|
-
idx = idx * 2 + 1;
|
|
79
|
-
latMin = latMid;
|
|
80
|
-
} else {
|
|
81
|
-
idx = idx * 2;
|
|
82
|
-
latMax = latMid;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
evenBit = !evenBit;
|
|
87
|
-
|
|
88
|
-
if (++bit == 5) {
|
|
89
|
-
geohash += BASE32.charAt(idx);
|
|
90
|
-
bit = 0;
|
|
91
|
-
idx = 0;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return geohash;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function adjacent(hash, dir) {
|
|
99
|
-
var lastChr = hash[hash.length - 1];
|
|
100
|
-
var type = hash.length % 2 ? 'odd' : 'even'; // @ts-ignore
|
|
101
|
-
|
|
102
|
-
var border = NEIGHBORS[dir][type].border; // @ts-ignore
|
|
103
|
-
|
|
104
|
-
var neighbor = NEIGHBORS[dir][type].neighbor;
|
|
105
|
-
var base = hash.substring(0, hash.length - 1);
|
|
106
|
-
|
|
107
|
-
if (border.indexOf(lastChr) !== -1) {
|
|
108
|
-
base = adjacent(base, dir);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
var pos = neighbor.indexOf(lastChr);
|
|
112
|
-
var nextChr = BASE32.charAt(pos);
|
|
113
|
-
return base + nextChr;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function geohashNeighbors(hash) {
|
|
117
|
-
var n = adjacent(hash, 'n');
|
|
118
|
-
var s = adjacent(hash, 's');
|
|
119
|
-
var e = adjacent(hash, 'e');
|
|
120
|
-
var w = adjacent(hash, 'w');
|
|
121
|
-
return [hash, n, s, e, w, adjacent(n, 'e'), adjacent(n, 'w'), adjacent(s, 'e'), adjacent(s, 'w')];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
exports.geohashEncode = geohashEncode;
|
|
125
|
-
exports.geohashNeighbors = geohashNeighbors;
|