react-naver-maps-kit 1.1.1 → 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/dist/index.cjs +914 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +906 -2
- package/dist/index.js.map +1 -1
- package/dist/overlays/data/GeoJson.d.ts +43 -0
- package/dist/overlays/data/GeoJson.d.ts.map +1 -0
- package/dist/overlays/data/Gpx.d.ts +42 -0
- package/dist/overlays/data/Gpx.d.ts.map +1 -0
- package/dist/overlays/data/Kmz.d.ts +42 -0
- package/dist/overlays/data/Kmz.d.ts.map +1 -0
- package/dist/react/components/NaverMap.d.ts +1 -1
- package/dist/react/components/NaverMap.d.ts.map +1 -1
- package/package.json +4 -3
package/dist/index.cjs
CHANGED
|
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
let react = require("react");
|
|
3
3
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
4
|
let react_dom = require("react-dom");
|
|
5
|
+
let module$1 = require("module");
|
|
5
6
|
|
|
6
7
|
//#region src/core/loader/loadNaverMapsScript.ts
|
|
7
8
|
const NAVER_MAPS_SCRIPT_BASE_URL = "https://oapi.map.naver.com/openapi/v3/maps.js";
|
|
@@ -3887,16 +3888,928 @@ const Rectangle = (0, react.forwardRef)(function RectangleInner(props, ref) {
|
|
|
3887
3888
|
});
|
|
3888
3889
|
Rectangle.displayName = "Rectangle";
|
|
3889
3890
|
|
|
3891
|
+
//#endregion
|
|
3892
|
+
//#region src/overlays/data/GeoJson.tsx
|
|
3893
|
+
function buildGeoJsonEventBindings(props) {
|
|
3894
|
+
return [
|
|
3895
|
+
{
|
|
3896
|
+
eventName: "addfeature",
|
|
3897
|
+
invoke: props.onAddFeature ? (event) => props.onAddFeature?.(event) : void 0
|
|
3898
|
+
},
|
|
3899
|
+
{
|
|
3900
|
+
eventName: "removefeature",
|
|
3901
|
+
invoke: props.onRemoveFeature ? (event) => props.onRemoveFeature?.(event) : void 0
|
|
3902
|
+
},
|
|
3903
|
+
{
|
|
3904
|
+
eventName: "property_changed",
|
|
3905
|
+
invoke: props.onPropertyChanged ? (event) => props.onPropertyChanged?.(event) : void 0
|
|
3906
|
+
},
|
|
3907
|
+
{
|
|
3908
|
+
eventName: "click",
|
|
3909
|
+
invoke: props.onClick ? (event) => props.onClick?.(event) : void 0
|
|
3910
|
+
},
|
|
3911
|
+
{
|
|
3912
|
+
eventName: "dblclick",
|
|
3913
|
+
invoke: props.onDblClick ? (event) => props.onDblClick?.(event) : void 0
|
|
3914
|
+
},
|
|
3915
|
+
{
|
|
3916
|
+
eventName: "rightclick",
|
|
3917
|
+
invoke: props.onRightClick ? (event) => props.onRightClick?.(event) : void 0
|
|
3918
|
+
},
|
|
3919
|
+
{
|
|
3920
|
+
eventName: "mousedown",
|
|
3921
|
+
invoke: props.onMouseDown ? (event) => props.onMouseDown?.(event) : void 0
|
|
3922
|
+
},
|
|
3923
|
+
{
|
|
3924
|
+
eventName: "mouseup",
|
|
3925
|
+
invoke: props.onMouseUp ? (event) => props.onMouseUp?.(event) : void 0
|
|
3926
|
+
},
|
|
3927
|
+
{
|
|
3928
|
+
eventName: "mouseover",
|
|
3929
|
+
invoke: props.onMouseOver ? (event) => props.onMouseOver?.(event) : void 0
|
|
3930
|
+
},
|
|
3931
|
+
{
|
|
3932
|
+
eventName: "mouseout",
|
|
3933
|
+
invoke: props.onMouseOut ? (event) => props.onMouseOut?.(event) : void 0
|
|
3934
|
+
}
|
|
3935
|
+
];
|
|
3936
|
+
}
|
|
3937
|
+
const GeoJson = (0, react.forwardRef)(function GeoJsonInner(props, ref) {
|
|
3938
|
+
const { map: contextMap, sdkStatus } = useNaverMap();
|
|
3939
|
+
const dataRef = (0, react.useRef)(null);
|
|
3940
|
+
const dataEventListenersRef = (0, react.useRef)([]);
|
|
3941
|
+
const onDataDestroyRef = (0, react.useRef)(props.onDataDestroy);
|
|
3942
|
+
const prevDataRef = (0, react.useRef)(null);
|
|
3943
|
+
(0, react.useEffect)(() => {
|
|
3944
|
+
onDataDestroyRef.current = props.onDataDestroy;
|
|
3945
|
+
}, [props.onDataDestroy]);
|
|
3946
|
+
const invokeDataMethod = (0, react.useCallback)((methodName, ...args) => {
|
|
3947
|
+
const data = dataRef.current;
|
|
3948
|
+
if (!data) return;
|
|
3949
|
+
const method = data[methodName];
|
|
3950
|
+
if (typeof method !== "function") return;
|
|
3951
|
+
return method.apply(data, args);
|
|
3952
|
+
}, []);
|
|
3953
|
+
const teardownData = (0, react.useCallback)(() => {
|
|
3954
|
+
const data = dataRef.current;
|
|
3955
|
+
if (!data) return;
|
|
3956
|
+
try {
|
|
3957
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
3958
|
+
dataEventListenersRef.current = [];
|
|
3959
|
+
naver.maps.Event.clearInstanceListeners(data);
|
|
3960
|
+
} catch (error) {
|
|
3961
|
+
console.error("[react-naver-maps-kit] failed to clear GeoJson data layer listeners", error);
|
|
3962
|
+
}
|
|
3963
|
+
data.setMap(null);
|
|
3964
|
+
dataRef.current = null;
|
|
3965
|
+
prevDataRef.current = null;
|
|
3966
|
+
onDataDestroyRef.current?.();
|
|
3967
|
+
}, []);
|
|
3968
|
+
(0, react.useImperativeHandle)(ref, () => ({
|
|
3969
|
+
getInstance: () => dataRef.current,
|
|
3970
|
+
getAllFeature: (...args) => invokeDataMethod("getAllFeature", ...args),
|
|
3971
|
+
getFeatureById: (...args) => invokeDataMethod("getFeatureById", ...args),
|
|
3972
|
+
getMap: (...args) => invokeDataMethod("getMap", ...args),
|
|
3973
|
+
getStyle: (...args) => invokeDataMethod("getStyle", ...args),
|
|
3974
|
+
overrideStyle: (...args) => invokeDataMethod("overrideStyle", ...args),
|
|
3975
|
+
removeFeature: (...args) => invokeDataMethod("removeFeature", ...args),
|
|
3976
|
+
revertStyle: (...args) => invokeDataMethod("revertStyle", ...args),
|
|
3977
|
+
setStyle: (...args) => invokeDataMethod("setStyle", ...args),
|
|
3978
|
+
toGeoJson: (...args) => invokeDataMethod("toGeoJson", ...args)
|
|
3979
|
+
}), [invokeDataMethod]);
|
|
3980
|
+
(0, react.useEffect)(() => {
|
|
3981
|
+
if (sdkStatus !== "ready" || !contextMap || dataRef.current) return;
|
|
3982
|
+
try {
|
|
3983
|
+
const data = new naver.maps.Data();
|
|
3984
|
+
data.setMap(contextMap);
|
|
3985
|
+
if (props.style) data.setStyle(props.style);
|
|
3986
|
+
const features = data.addGeoJson(props.data, props.autoStyle ?? true);
|
|
3987
|
+
prevDataRef.current = props.data;
|
|
3988
|
+
dataRef.current = data;
|
|
3989
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildGeoJsonEventBindings(props));
|
|
3990
|
+
props.onDataReady?.(data);
|
|
3991
|
+
props.onFeaturesAdded?.(features);
|
|
3992
|
+
} catch (error) {
|
|
3993
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to create naver.maps.Data instance for GeoJson.");
|
|
3994
|
+
props.onDataError?.(normalizedError);
|
|
3995
|
+
}
|
|
3996
|
+
}, [sdkStatus, contextMap]);
|
|
3997
|
+
(0, react.useEffect)(() => {
|
|
3998
|
+
const data = dataRef.current;
|
|
3999
|
+
if (!data || props.data === prevDataRef.current) return;
|
|
4000
|
+
try {
|
|
4001
|
+
if (prevDataRef.current) data.removeGeoJson(prevDataRef.current);
|
|
4002
|
+
const features = data.addGeoJson(props.data, props.autoStyle ?? true);
|
|
4003
|
+
prevDataRef.current = props.data;
|
|
4004
|
+
props.onFeaturesAdded?.(features);
|
|
4005
|
+
} catch (error) {
|
|
4006
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to update GeoJson data.");
|
|
4007
|
+
props.onDataError?.(normalizedError);
|
|
4008
|
+
}
|
|
4009
|
+
}, [props.data, props.autoStyle]);
|
|
4010
|
+
(0, react.useEffect)(() => {
|
|
4011
|
+
const data = dataRef.current;
|
|
4012
|
+
if (!data) return;
|
|
4013
|
+
if (props.style) data.setStyle(props.style);
|
|
4014
|
+
}, [props.style]);
|
|
4015
|
+
(0, react.useEffect)(() => {
|
|
4016
|
+
const data = dataRef.current;
|
|
4017
|
+
if (!data) return;
|
|
4018
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildGeoJsonEventBindings(props));
|
|
4019
|
+
return () => {
|
|
4020
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
4021
|
+
dataEventListenersRef.current = [];
|
|
4022
|
+
};
|
|
4023
|
+
}, [props]);
|
|
4024
|
+
(0, react.useEffect)(() => {
|
|
4025
|
+
return () => {
|
|
4026
|
+
teardownData();
|
|
4027
|
+
};
|
|
4028
|
+
}, [teardownData]);
|
|
4029
|
+
return null;
|
|
4030
|
+
});
|
|
4031
|
+
GeoJson.displayName = "GeoJson";
|
|
4032
|
+
|
|
4033
|
+
//#endregion
|
|
4034
|
+
//#region src/overlays/data/Gpx.tsx
|
|
4035
|
+
function buildGpxEventBindings(props) {
|
|
4036
|
+
return [
|
|
4037
|
+
{
|
|
4038
|
+
eventName: "addfeature",
|
|
4039
|
+
invoke: props.onAddFeature ? (event) => props.onAddFeature?.(event) : void 0
|
|
4040
|
+
},
|
|
4041
|
+
{
|
|
4042
|
+
eventName: "removefeature",
|
|
4043
|
+
invoke: props.onRemoveFeature ? (event) => props.onRemoveFeature?.(event) : void 0
|
|
4044
|
+
},
|
|
4045
|
+
{
|
|
4046
|
+
eventName: "property_changed",
|
|
4047
|
+
invoke: props.onPropertyChanged ? (event) => props.onPropertyChanged?.(event) : void 0
|
|
4048
|
+
},
|
|
4049
|
+
{
|
|
4050
|
+
eventName: "click",
|
|
4051
|
+
invoke: props.onClick ? (event) => props.onClick?.(event) : void 0
|
|
4052
|
+
},
|
|
4053
|
+
{
|
|
4054
|
+
eventName: "dblclick",
|
|
4055
|
+
invoke: props.onDblClick ? (event) => props.onDblClick?.(event) : void 0
|
|
4056
|
+
},
|
|
4057
|
+
{
|
|
4058
|
+
eventName: "rightclick",
|
|
4059
|
+
invoke: props.onRightClick ? (event) => props.onRightClick?.(event) : void 0
|
|
4060
|
+
},
|
|
4061
|
+
{
|
|
4062
|
+
eventName: "mousedown",
|
|
4063
|
+
invoke: props.onMouseDown ? (event) => props.onMouseDown?.(event) : void 0
|
|
4064
|
+
},
|
|
4065
|
+
{
|
|
4066
|
+
eventName: "mouseup",
|
|
4067
|
+
invoke: props.onMouseUp ? (event) => props.onMouseUp?.(event) : void 0
|
|
4068
|
+
},
|
|
4069
|
+
{
|
|
4070
|
+
eventName: "mouseover",
|
|
4071
|
+
invoke: props.onMouseOver ? (event) => props.onMouseOver?.(event) : void 0
|
|
4072
|
+
},
|
|
4073
|
+
{
|
|
4074
|
+
eventName: "mouseout",
|
|
4075
|
+
invoke: props.onMouseOut ? (event) => props.onMouseOut?.(event) : void 0
|
|
4076
|
+
}
|
|
4077
|
+
];
|
|
4078
|
+
}
|
|
4079
|
+
function parseXml(xmlString) {
|
|
4080
|
+
const doc = new DOMParser().parseFromString(xmlString, "application/xml");
|
|
4081
|
+
const parseError = doc.querySelector("parsererror");
|
|
4082
|
+
if (parseError) throw new Error(`XML parse error: ${parseError.textContent}`);
|
|
4083
|
+
return doc;
|
|
4084
|
+
}
|
|
4085
|
+
const Gpx = (0, react.forwardRef)(function GpxInner(props, ref) {
|
|
4086
|
+
const { map: contextMap, sdkStatus } = useNaverMap();
|
|
4087
|
+
const dataRef = (0, react.useRef)(null);
|
|
4088
|
+
const dataEventListenersRef = (0, react.useRef)([]);
|
|
4089
|
+
const onDataDestroyRef = (0, react.useRef)(props.onDataDestroy);
|
|
4090
|
+
const prevUrlRef = (0, react.useRef)(null);
|
|
4091
|
+
const abortRef = (0, react.useRef)(null);
|
|
4092
|
+
(0, react.useEffect)(() => {
|
|
4093
|
+
onDataDestroyRef.current = props.onDataDestroy;
|
|
4094
|
+
}, [props.onDataDestroy]);
|
|
4095
|
+
const invokeDataMethod = (0, react.useCallback)((methodName, ...args) => {
|
|
4096
|
+
const data = dataRef.current;
|
|
4097
|
+
if (!data) return;
|
|
4098
|
+
const method = data[methodName];
|
|
4099
|
+
if (typeof method !== "function") return;
|
|
4100
|
+
return method.apply(data, args);
|
|
4101
|
+
}, []);
|
|
4102
|
+
const teardownData = (0, react.useCallback)(() => {
|
|
4103
|
+
abortRef.current?.abort();
|
|
4104
|
+
abortRef.current = null;
|
|
4105
|
+
const data = dataRef.current;
|
|
4106
|
+
if (!data) return;
|
|
4107
|
+
try {
|
|
4108
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
4109
|
+
dataEventListenersRef.current = [];
|
|
4110
|
+
naver.maps.Event.clearInstanceListeners(data);
|
|
4111
|
+
} catch (error) {
|
|
4112
|
+
console.error("[react-naver-maps-kit] failed to clear GPX data layer listeners", error);
|
|
4113
|
+
}
|
|
4114
|
+
data.setMap(null);
|
|
4115
|
+
dataRef.current = null;
|
|
4116
|
+
prevUrlRef.current = null;
|
|
4117
|
+
onDataDestroyRef.current?.();
|
|
4118
|
+
}, []);
|
|
4119
|
+
(0, react.useImperativeHandle)(ref, () => ({
|
|
4120
|
+
getInstance: () => dataRef.current,
|
|
4121
|
+
getAllFeature: (...args) => invokeDataMethod("getAllFeature", ...args),
|
|
4122
|
+
getFeatureById: (...args) => invokeDataMethod("getFeatureById", ...args),
|
|
4123
|
+
getMap: (...args) => invokeDataMethod("getMap", ...args),
|
|
4124
|
+
getStyle: (...args) => invokeDataMethod("getStyle", ...args),
|
|
4125
|
+
overrideStyle: (...args) => invokeDataMethod("overrideStyle", ...args),
|
|
4126
|
+
removeFeature: (...args) => invokeDataMethod("removeFeature", ...args),
|
|
4127
|
+
revertStyle: (...args) => invokeDataMethod("revertStyle", ...args),
|
|
4128
|
+
setStyle: (...args) => invokeDataMethod("setStyle", ...args),
|
|
4129
|
+
toGeoJson: (...args) => invokeDataMethod("toGeoJson", ...args)
|
|
4130
|
+
}), [invokeDataMethod]);
|
|
4131
|
+
const loadAndAddGpx = (0, react.useCallback)(async (data, url, isInitial) => {
|
|
4132
|
+
const controller = new AbortController();
|
|
4133
|
+
abortRef.current = controller;
|
|
4134
|
+
try {
|
|
4135
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
4136
|
+
if (!response.ok) throw new Error(`Failed to fetch GPX: ${response.status} ${response.statusText}`);
|
|
4137
|
+
const xmlDoc = parseXml(await response.text());
|
|
4138
|
+
if (controller.signal.aborted) return;
|
|
4139
|
+
if (!isInitial) data.getAllFeature().forEach((feature) => data.removeFeature(feature));
|
|
4140
|
+
const features = data.addGpx(xmlDoc, props.autoStyle ?? true);
|
|
4141
|
+
prevUrlRef.current = url;
|
|
4142
|
+
props.onFeaturesAdded?.(features);
|
|
4143
|
+
} catch (error) {
|
|
4144
|
+
if (controller.signal.aborted) return;
|
|
4145
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to load GPX data.");
|
|
4146
|
+
props.onDataError?.(normalizedError);
|
|
4147
|
+
}
|
|
4148
|
+
}, [
|
|
4149
|
+
props.autoStyle,
|
|
4150
|
+
props.onFeaturesAdded,
|
|
4151
|
+
props.onDataError
|
|
4152
|
+
]);
|
|
4153
|
+
(0, react.useEffect)(() => {
|
|
4154
|
+
if (sdkStatus !== "ready" || !contextMap || dataRef.current) return;
|
|
4155
|
+
try {
|
|
4156
|
+
const data = new naver.maps.Data();
|
|
4157
|
+
data.setMap(contextMap);
|
|
4158
|
+
if (props.style) data.setStyle(props.style);
|
|
4159
|
+
dataRef.current = data;
|
|
4160
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildGpxEventBindings(props));
|
|
4161
|
+
props.onDataReady?.(data);
|
|
4162
|
+
loadAndAddGpx(data, props.url, true);
|
|
4163
|
+
} catch (error) {
|
|
4164
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to create naver.maps.Data instance.");
|
|
4165
|
+
props.onDataError?.(normalizedError);
|
|
4166
|
+
}
|
|
4167
|
+
}, [sdkStatus, contextMap]);
|
|
4168
|
+
(0, react.useEffect)(() => {
|
|
4169
|
+
const data = dataRef.current;
|
|
4170
|
+
if (!data || props.url === prevUrlRef.current) return;
|
|
4171
|
+
abortRef.current?.abort();
|
|
4172
|
+
loadAndAddGpx(data, props.url, false);
|
|
4173
|
+
}, [props.url, loadAndAddGpx]);
|
|
4174
|
+
(0, react.useEffect)(() => {
|
|
4175
|
+
const data = dataRef.current;
|
|
4176
|
+
if (!data) return;
|
|
4177
|
+
if (props.style) data.setStyle(props.style);
|
|
4178
|
+
}, [props.style]);
|
|
4179
|
+
(0, react.useEffect)(() => {
|
|
4180
|
+
const data = dataRef.current;
|
|
4181
|
+
if (!data) return;
|
|
4182
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildGpxEventBindings(props));
|
|
4183
|
+
return () => {
|
|
4184
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
4185
|
+
dataEventListenersRef.current = [];
|
|
4186
|
+
};
|
|
4187
|
+
}, [props]);
|
|
4188
|
+
(0, react.useEffect)(() => {
|
|
4189
|
+
return () => {
|
|
4190
|
+
teardownData();
|
|
4191
|
+
};
|
|
4192
|
+
}, [teardownData]);
|
|
4193
|
+
return null;
|
|
4194
|
+
});
|
|
4195
|
+
Gpx.displayName = "Gpx";
|
|
4196
|
+
|
|
4197
|
+
//#endregion
|
|
4198
|
+
//#region ../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/index.mjs
|
|
4199
|
+
var require$1 = (0, module$1.createRequire)("/");
|
|
4200
|
+
var Worker;
|
|
4201
|
+
try {
|
|
4202
|
+
Worker = require$1("worker_threads").Worker;
|
|
4203
|
+
} catch (e) {}
|
|
4204
|
+
var u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;
|
|
4205
|
+
var fleb = new u8([
|
|
4206
|
+
0,
|
|
4207
|
+
0,
|
|
4208
|
+
0,
|
|
4209
|
+
0,
|
|
4210
|
+
0,
|
|
4211
|
+
0,
|
|
4212
|
+
0,
|
|
4213
|
+
0,
|
|
4214
|
+
1,
|
|
4215
|
+
1,
|
|
4216
|
+
1,
|
|
4217
|
+
1,
|
|
4218
|
+
2,
|
|
4219
|
+
2,
|
|
4220
|
+
2,
|
|
4221
|
+
2,
|
|
4222
|
+
3,
|
|
4223
|
+
3,
|
|
4224
|
+
3,
|
|
4225
|
+
3,
|
|
4226
|
+
4,
|
|
4227
|
+
4,
|
|
4228
|
+
4,
|
|
4229
|
+
4,
|
|
4230
|
+
5,
|
|
4231
|
+
5,
|
|
4232
|
+
5,
|
|
4233
|
+
5,
|
|
4234
|
+
0,
|
|
4235
|
+
0,
|
|
4236
|
+
0,
|
|
4237
|
+
0
|
|
4238
|
+
]);
|
|
4239
|
+
var fdeb = new u8([
|
|
4240
|
+
0,
|
|
4241
|
+
0,
|
|
4242
|
+
0,
|
|
4243
|
+
0,
|
|
4244
|
+
1,
|
|
4245
|
+
1,
|
|
4246
|
+
2,
|
|
4247
|
+
2,
|
|
4248
|
+
3,
|
|
4249
|
+
3,
|
|
4250
|
+
4,
|
|
4251
|
+
4,
|
|
4252
|
+
5,
|
|
4253
|
+
5,
|
|
4254
|
+
6,
|
|
4255
|
+
6,
|
|
4256
|
+
7,
|
|
4257
|
+
7,
|
|
4258
|
+
8,
|
|
4259
|
+
8,
|
|
4260
|
+
9,
|
|
4261
|
+
9,
|
|
4262
|
+
10,
|
|
4263
|
+
10,
|
|
4264
|
+
11,
|
|
4265
|
+
11,
|
|
4266
|
+
12,
|
|
4267
|
+
12,
|
|
4268
|
+
13,
|
|
4269
|
+
13,
|
|
4270
|
+
0,
|
|
4271
|
+
0
|
|
4272
|
+
]);
|
|
4273
|
+
var clim = new u8([
|
|
4274
|
+
16,
|
|
4275
|
+
17,
|
|
4276
|
+
18,
|
|
4277
|
+
0,
|
|
4278
|
+
8,
|
|
4279
|
+
7,
|
|
4280
|
+
9,
|
|
4281
|
+
6,
|
|
4282
|
+
10,
|
|
4283
|
+
5,
|
|
4284
|
+
11,
|
|
4285
|
+
4,
|
|
4286
|
+
12,
|
|
4287
|
+
3,
|
|
4288
|
+
13,
|
|
4289
|
+
2,
|
|
4290
|
+
14,
|
|
4291
|
+
1,
|
|
4292
|
+
15
|
|
4293
|
+
]);
|
|
4294
|
+
var freb = function(eb, start) {
|
|
4295
|
+
var b = new u16(31);
|
|
4296
|
+
for (var i = 0; i < 31; ++i) b[i] = start += 1 << eb[i - 1];
|
|
4297
|
+
var r = new i32(b[30]);
|
|
4298
|
+
for (var i = 1; i < 30; ++i) for (var j = b[i]; j < b[i + 1]; ++j) r[j] = j - b[i] << 5 | i;
|
|
4299
|
+
return {
|
|
4300
|
+
b,
|
|
4301
|
+
r
|
|
4302
|
+
};
|
|
4303
|
+
};
|
|
4304
|
+
var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;
|
|
4305
|
+
fl[28] = 258, revfl[258] = 28;
|
|
4306
|
+
var _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;
|
|
4307
|
+
var rev = new u16(32768);
|
|
4308
|
+
for (var i = 0; i < 32768; ++i) {
|
|
4309
|
+
var x = (i & 43690) >> 1 | (i & 21845) << 1;
|
|
4310
|
+
x = (x & 52428) >> 2 | (x & 13107) << 2;
|
|
4311
|
+
x = (x & 61680) >> 4 | (x & 3855) << 4;
|
|
4312
|
+
rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
|
|
4313
|
+
}
|
|
4314
|
+
var hMap = (function(cd, mb, r) {
|
|
4315
|
+
var s = cd.length;
|
|
4316
|
+
var i = 0;
|
|
4317
|
+
var l = new u16(mb);
|
|
4318
|
+
for (; i < s; ++i) if (cd[i]) ++l[cd[i] - 1];
|
|
4319
|
+
var le = new u16(mb);
|
|
4320
|
+
for (i = 1; i < mb; ++i) le[i] = le[i - 1] + l[i - 1] << 1;
|
|
4321
|
+
var co;
|
|
4322
|
+
if (r) {
|
|
4323
|
+
co = new u16(1 << mb);
|
|
4324
|
+
var rvb = 15 - mb;
|
|
4325
|
+
for (i = 0; i < s; ++i) if (cd[i]) {
|
|
4326
|
+
var sv = i << 4 | cd[i];
|
|
4327
|
+
var r_1 = mb - cd[i];
|
|
4328
|
+
var v = le[cd[i] - 1]++ << r_1;
|
|
4329
|
+
for (var m = v | (1 << r_1) - 1; v <= m; ++v) co[rev[v] >> rvb] = sv;
|
|
4330
|
+
}
|
|
4331
|
+
} else {
|
|
4332
|
+
co = new u16(s);
|
|
4333
|
+
for (i = 0; i < s; ++i) if (cd[i]) co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
|
|
4334
|
+
}
|
|
4335
|
+
return co;
|
|
4336
|
+
});
|
|
4337
|
+
var flt = new u8(288);
|
|
4338
|
+
for (var i = 0; i < 144; ++i) flt[i] = 8;
|
|
4339
|
+
for (var i = 144; i < 256; ++i) flt[i] = 9;
|
|
4340
|
+
for (var i = 256; i < 280; ++i) flt[i] = 7;
|
|
4341
|
+
for (var i = 280; i < 288; ++i) flt[i] = 8;
|
|
4342
|
+
var fdt = new u8(32);
|
|
4343
|
+
for (var i = 0; i < 32; ++i) fdt[i] = 5;
|
|
4344
|
+
var flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1);
|
|
4345
|
+
var fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
|
|
4346
|
+
var max = function(a) {
|
|
4347
|
+
var m = a[0];
|
|
4348
|
+
for (var i = 1; i < a.length; ++i) if (a[i] > m) m = a[i];
|
|
4349
|
+
return m;
|
|
4350
|
+
};
|
|
4351
|
+
var bits = function(d, p, m) {
|
|
4352
|
+
var o = p / 8 | 0;
|
|
4353
|
+
return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
|
|
4354
|
+
};
|
|
4355
|
+
var bits16 = function(d, p) {
|
|
4356
|
+
var o = p / 8 | 0;
|
|
4357
|
+
return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
|
|
4358
|
+
};
|
|
4359
|
+
var shft = function(p) {
|
|
4360
|
+
return (p + 7) / 8 | 0;
|
|
4361
|
+
};
|
|
4362
|
+
var slc = function(v, s, e) {
|
|
4363
|
+
if (s == null || s < 0) s = 0;
|
|
4364
|
+
if (e == null || e > v.length) e = v.length;
|
|
4365
|
+
return new u8(v.subarray(s, e));
|
|
4366
|
+
};
|
|
4367
|
+
var ec = [
|
|
4368
|
+
"unexpected EOF",
|
|
4369
|
+
"invalid block type",
|
|
4370
|
+
"invalid length/literal",
|
|
4371
|
+
"invalid distance",
|
|
4372
|
+
"stream finished",
|
|
4373
|
+
"no stream handler",
|
|
4374
|
+
,
|
|
4375
|
+
"no callback",
|
|
4376
|
+
"invalid UTF-8 data",
|
|
4377
|
+
"extra field too long",
|
|
4378
|
+
"date not in range 1980-2099",
|
|
4379
|
+
"filename too long",
|
|
4380
|
+
"stream finishing",
|
|
4381
|
+
"invalid zip data"
|
|
4382
|
+
];
|
|
4383
|
+
var err = function(ind, msg, nt) {
|
|
4384
|
+
var e = new Error(msg || ec[ind]);
|
|
4385
|
+
e.code = ind;
|
|
4386
|
+
if (Error.captureStackTrace) Error.captureStackTrace(e, err);
|
|
4387
|
+
if (!nt) throw e;
|
|
4388
|
+
return e;
|
|
4389
|
+
};
|
|
4390
|
+
var inflt = function(dat, st, buf, dict) {
|
|
4391
|
+
var sl = dat.length, dl = dict ? dict.length : 0;
|
|
4392
|
+
if (!sl || st.f && !st.l) return buf || new u8(0);
|
|
4393
|
+
var noBuf = !buf;
|
|
4394
|
+
var resize = noBuf || st.i != 2;
|
|
4395
|
+
var noSt = st.i;
|
|
4396
|
+
if (noBuf) buf = new u8(sl * 3);
|
|
4397
|
+
var cbuf = function(l) {
|
|
4398
|
+
var bl = buf.length;
|
|
4399
|
+
if (l > bl) {
|
|
4400
|
+
var nbuf = new u8(Math.max(bl * 2, l));
|
|
4401
|
+
nbuf.set(buf);
|
|
4402
|
+
buf = nbuf;
|
|
4403
|
+
}
|
|
4404
|
+
};
|
|
4405
|
+
var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
|
|
4406
|
+
var tbts = sl * 8;
|
|
4407
|
+
do {
|
|
4408
|
+
if (!lm) {
|
|
4409
|
+
final = bits(dat, pos, 1);
|
|
4410
|
+
var type = bits(dat, pos + 1, 3);
|
|
4411
|
+
pos += 3;
|
|
4412
|
+
if (!type) {
|
|
4413
|
+
var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
|
|
4414
|
+
if (t > sl) {
|
|
4415
|
+
if (noSt) err(0);
|
|
4416
|
+
break;
|
|
4417
|
+
}
|
|
4418
|
+
if (resize) cbuf(bt + l);
|
|
4419
|
+
buf.set(dat.subarray(s, t), bt);
|
|
4420
|
+
st.b = bt += l, st.p = pos = t * 8, st.f = final;
|
|
4421
|
+
continue;
|
|
4422
|
+
} else if (type == 1) lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
|
|
4423
|
+
else if (type == 2) {
|
|
4424
|
+
var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
|
|
4425
|
+
var tl = hLit + bits(dat, pos + 5, 31) + 1;
|
|
4426
|
+
pos += 14;
|
|
4427
|
+
var ldt = new u8(tl);
|
|
4428
|
+
var clt = new u8(19);
|
|
4429
|
+
for (var i = 0; i < hcLen; ++i) clt[clim[i]] = bits(dat, pos + i * 3, 7);
|
|
4430
|
+
pos += hcLen * 3;
|
|
4431
|
+
var clb = max(clt), clbmsk = (1 << clb) - 1;
|
|
4432
|
+
var clm = hMap(clt, clb, 1);
|
|
4433
|
+
for (var i = 0; i < tl;) {
|
|
4434
|
+
var r = clm[bits(dat, pos, clbmsk)];
|
|
4435
|
+
pos += r & 15;
|
|
4436
|
+
var s = r >> 4;
|
|
4437
|
+
if (s < 16) ldt[i++] = s;
|
|
4438
|
+
else {
|
|
4439
|
+
var c = 0, n = 0;
|
|
4440
|
+
if (s == 16) n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
|
|
4441
|
+
else if (s == 17) n = 3 + bits(dat, pos, 7), pos += 3;
|
|
4442
|
+
else if (s == 18) n = 11 + bits(dat, pos, 127), pos += 7;
|
|
4443
|
+
while (n--) ldt[i++] = c;
|
|
4444
|
+
}
|
|
4445
|
+
}
|
|
4446
|
+
var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
|
|
4447
|
+
lbt = max(lt);
|
|
4448
|
+
dbt = max(dt);
|
|
4449
|
+
lm = hMap(lt, lbt, 1);
|
|
4450
|
+
dm = hMap(dt, dbt, 1);
|
|
4451
|
+
} else err(1);
|
|
4452
|
+
if (pos > tbts) {
|
|
4453
|
+
if (noSt) err(0);
|
|
4454
|
+
break;
|
|
4455
|
+
}
|
|
4456
|
+
}
|
|
4457
|
+
if (resize) cbuf(bt + 131072);
|
|
4458
|
+
var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
|
|
4459
|
+
var lpos = pos;
|
|
4460
|
+
for (;; lpos = pos) {
|
|
4461
|
+
var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
|
|
4462
|
+
pos += c & 15;
|
|
4463
|
+
if (pos > tbts) {
|
|
4464
|
+
if (noSt) err(0);
|
|
4465
|
+
break;
|
|
4466
|
+
}
|
|
4467
|
+
if (!c) err(2);
|
|
4468
|
+
if (sym < 256) buf[bt++] = sym;
|
|
4469
|
+
else if (sym == 256) {
|
|
4470
|
+
lpos = pos, lm = null;
|
|
4471
|
+
break;
|
|
4472
|
+
} else {
|
|
4473
|
+
var add = sym - 254;
|
|
4474
|
+
if (sym > 264) {
|
|
4475
|
+
var i = sym - 257, b = fleb[i];
|
|
4476
|
+
add = bits(dat, pos, (1 << b) - 1) + fl[i];
|
|
4477
|
+
pos += b;
|
|
4478
|
+
}
|
|
4479
|
+
var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
|
|
4480
|
+
if (!d) err(3);
|
|
4481
|
+
pos += d & 15;
|
|
4482
|
+
var dt = fd[dsym];
|
|
4483
|
+
if (dsym > 3) {
|
|
4484
|
+
var b = fdeb[dsym];
|
|
4485
|
+
dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
|
|
4486
|
+
}
|
|
4487
|
+
if (pos > tbts) {
|
|
4488
|
+
if (noSt) err(0);
|
|
4489
|
+
break;
|
|
4490
|
+
}
|
|
4491
|
+
if (resize) cbuf(bt + 131072);
|
|
4492
|
+
var end = bt + add;
|
|
4493
|
+
if (bt < dt) {
|
|
4494
|
+
var shift = dl - dt, dend = Math.min(dt, end);
|
|
4495
|
+
if (shift + bt < 0) err(3);
|
|
4496
|
+
for (; bt < dend; ++bt) buf[bt] = dict[shift + bt];
|
|
4497
|
+
}
|
|
4498
|
+
for (; bt < end; ++bt) buf[bt] = buf[bt - dt];
|
|
4499
|
+
}
|
|
4500
|
+
}
|
|
4501
|
+
st.l = lm, st.p = lpos, st.b = bt, st.f = final;
|
|
4502
|
+
if (lm) final = 1, st.m = lbt, st.d = dm, st.n = dbt;
|
|
4503
|
+
} while (!final);
|
|
4504
|
+
return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
|
|
4505
|
+
};
|
|
4506
|
+
var et = /* @__PURE__ */ new u8(0);
|
|
4507
|
+
var b2 = function(d, b) {
|
|
4508
|
+
return d[b] | d[b + 1] << 8;
|
|
4509
|
+
};
|
|
4510
|
+
var b4 = function(d, b) {
|
|
4511
|
+
return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
|
|
4512
|
+
};
|
|
4513
|
+
var b8 = function(d, b) {
|
|
4514
|
+
return b4(d, b) + b4(d, b + 4) * 4294967296;
|
|
4515
|
+
};
|
|
4516
|
+
/**
|
|
4517
|
+
* Expands DEFLATE data with no wrapper
|
|
4518
|
+
* @param data The data to decompress
|
|
4519
|
+
* @param opts The decompression options
|
|
4520
|
+
* @returns The decompressed version of the data
|
|
4521
|
+
*/
|
|
4522
|
+
function inflateSync(data, opts) {
|
|
4523
|
+
return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);
|
|
4524
|
+
}
|
|
4525
|
+
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
4526
|
+
var tds = 0;
|
|
4527
|
+
try {
|
|
4528
|
+
td.decode(et, { stream: true });
|
|
4529
|
+
tds = 1;
|
|
4530
|
+
} catch (e) {}
|
|
4531
|
+
var dutf8 = function(d) {
|
|
4532
|
+
for (var r = "", i = 0;;) {
|
|
4533
|
+
var c = d[i++];
|
|
4534
|
+
var eb = (c > 127) + (c > 223) + (c > 239);
|
|
4535
|
+
if (i + eb > d.length) return {
|
|
4536
|
+
s: r,
|
|
4537
|
+
r: slc(d, i - 1)
|
|
4538
|
+
};
|
|
4539
|
+
if (!eb) r += String.fromCharCode(c);
|
|
4540
|
+
else if (eb == 3) c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | d[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);
|
|
4541
|
+
else if (eb & 1) r += String.fromCharCode((c & 31) << 6 | d[i++] & 63);
|
|
4542
|
+
else r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | d[i++] & 63);
|
|
4543
|
+
}
|
|
4544
|
+
};
|
|
4545
|
+
/**
|
|
4546
|
+
* Converts a Uint8Array to a string
|
|
4547
|
+
* @param dat The data to decode to string
|
|
4548
|
+
* @param latin1 Whether or not to interpret the data as Latin-1. This should
|
|
4549
|
+
* not need to be true unless encoding to binary string.
|
|
4550
|
+
* @returns The original UTF-8/Latin-1 string
|
|
4551
|
+
*/
|
|
4552
|
+
function strFromU8(dat, latin1) {
|
|
4553
|
+
if (latin1) {
|
|
4554
|
+
var r = "";
|
|
4555
|
+
for (var i = 0; i < dat.length; i += 16384) r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));
|
|
4556
|
+
return r;
|
|
4557
|
+
} else if (td) return td.decode(dat);
|
|
4558
|
+
else {
|
|
4559
|
+
var _a = dutf8(dat), s = _a.s, r = _a.r;
|
|
4560
|
+
if (r.length) err(8);
|
|
4561
|
+
return s;
|
|
4562
|
+
}
|
|
4563
|
+
}
|
|
4564
|
+
var slzh = function(d, b) {
|
|
4565
|
+
return b + 30 + b2(d, b + 26) + b2(d, b + 28);
|
|
4566
|
+
};
|
|
4567
|
+
var zh = function(d, b, z) {
|
|
4568
|
+
var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);
|
|
4569
|
+
var _a = z && bs == 4294967295 ? z64e(d, es) : [
|
|
4570
|
+
bs,
|
|
4571
|
+
b4(d, b + 24),
|
|
4572
|
+
b4(d, b + 42)
|
|
4573
|
+
], sc = _a[0], su = _a[1], off = _a[2];
|
|
4574
|
+
return [
|
|
4575
|
+
b2(d, b + 10),
|
|
4576
|
+
sc,
|
|
4577
|
+
su,
|
|
4578
|
+
fn,
|
|
4579
|
+
es + b2(d, b + 30) + b2(d, b + 32),
|
|
4580
|
+
off
|
|
4581
|
+
];
|
|
4582
|
+
};
|
|
4583
|
+
var z64e = function(d, b) {
|
|
4584
|
+
for (; b2(d, b) != 1; b += 4 + b2(d, b + 2));
|
|
4585
|
+
return [
|
|
4586
|
+
b8(d, b + 12),
|
|
4587
|
+
b8(d, b + 4),
|
|
4588
|
+
b8(d, b + 20)
|
|
4589
|
+
];
|
|
4590
|
+
};
|
|
4591
|
+
/**
|
|
4592
|
+
* Synchronously decompresses a ZIP archive. Prefer using `unzip` for better
|
|
4593
|
+
* performance with more than one file.
|
|
4594
|
+
* @param data The raw compressed ZIP file
|
|
4595
|
+
* @param opts The ZIP extraction options
|
|
4596
|
+
* @returns The decompressed files
|
|
4597
|
+
*/
|
|
4598
|
+
function unzipSync(data, opts) {
|
|
4599
|
+
var files = {};
|
|
4600
|
+
var e = data.length - 22;
|
|
4601
|
+
for (; b4(data, e) != 101010256; --e) if (!e || data.length - e > 65558) err(13);
|
|
4602
|
+
var c = b2(data, e + 8);
|
|
4603
|
+
if (!c) return {};
|
|
4604
|
+
var o = b4(data, e + 16);
|
|
4605
|
+
var z = o == 4294967295 || c == 65535;
|
|
4606
|
+
if (z) {
|
|
4607
|
+
var ze = b4(data, e - 12);
|
|
4608
|
+
z = b4(data, ze) == 101075792;
|
|
4609
|
+
if (z) {
|
|
4610
|
+
c = b4(data, ze + 32);
|
|
4611
|
+
o = b4(data, ze + 48);
|
|
4612
|
+
}
|
|
4613
|
+
}
|
|
4614
|
+
var fltr = opts && opts.filter;
|
|
4615
|
+
for (var i = 0; i < c; ++i) {
|
|
4616
|
+
var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);
|
|
4617
|
+
o = no;
|
|
4618
|
+
if (!fltr || fltr({
|
|
4619
|
+
name: fn,
|
|
4620
|
+
size: sc,
|
|
4621
|
+
originalSize: su,
|
|
4622
|
+
compression: c_2
|
|
4623
|
+
})) if (!c_2) files[fn] = slc(data, b, b + sc);
|
|
4624
|
+
else if (c_2 == 8) files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });
|
|
4625
|
+
else err(14, "unknown compression type " + c_2);
|
|
4626
|
+
}
|
|
4627
|
+
return files;
|
|
4628
|
+
}
|
|
4629
|
+
|
|
4630
|
+
//#endregion
|
|
4631
|
+
//#region src/overlays/data/Kmz.tsx
|
|
4632
|
+
function buildKmzEventBindings(props) {
|
|
4633
|
+
return [
|
|
4634
|
+
{
|
|
4635
|
+
eventName: "addfeature",
|
|
4636
|
+
invoke: props.onAddFeature ? (event) => props.onAddFeature?.(event) : void 0
|
|
4637
|
+
},
|
|
4638
|
+
{
|
|
4639
|
+
eventName: "removefeature",
|
|
4640
|
+
invoke: props.onRemoveFeature ? (event) => props.onRemoveFeature?.(event) : void 0
|
|
4641
|
+
},
|
|
4642
|
+
{
|
|
4643
|
+
eventName: "property_changed",
|
|
4644
|
+
invoke: props.onPropertyChanged ? (event) => props.onPropertyChanged?.(event) : void 0
|
|
4645
|
+
},
|
|
4646
|
+
{
|
|
4647
|
+
eventName: "click",
|
|
4648
|
+
invoke: props.onClick ? (event) => props.onClick?.(event) : void 0
|
|
4649
|
+
},
|
|
4650
|
+
{
|
|
4651
|
+
eventName: "dblclick",
|
|
4652
|
+
invoke: props.onDblClick ? (event) => props.onDblClick?.(event) : void 0
|
|
4653
|
+
},
|
|
4654
|
+
{
|
|
4655
|
+
eventName: "rightclick",
|
|
4656
|
+
invoke: props.onRightClick ? (event) => props.onRightClick?.(event) : void 0
|
|
4657
|
+
},
|
|
4658
|
+
{
|
|
4659
|
+
eventName: "mousedown",
|
|
4660
|
+
invoke: props.onMouseDown ? (event) => props.onMouseDown?.(event) : void 0
|
|
4661
|
+
},
|
|
4662
|
+
{
|
|
4663
|
+
eventName: "mouseup",
|
|
4664
|
+
invoke: props.onMouseUp ? (event) => props.onMouseUp?.(event) : void 0
|
|
4665
|
+
},
|
|
4666
|
+
{
|
|
4667
|
+
eventName: "mouseover",
|
|
4668
|
+
invoke: props.onMouseOver ? (event) => props.onMouseOver?.(event) : void 0
|
|
4669
|
+
},
|
|
4670
|
+
{
|
|
4671
|
+
eventName: "mouseout",
|
|
4672
|
+
invoke: props.onMouseOut ? (event) => props.onMouseOut?.(event) : void 0
|
|
4673
|
+
}
|
|
4674
|
+
];
|
|
4675
|
+
}
|
|
4676
|
+
function extractKmlFromKmz(arrayBuffer) {
|
|
4677
|
+
const files = unzipSync(new Uint8Array(arrayBuffer));
|
|
4678
|
+
const kmlFileName = Object.keys(files).find((name) => name.endsWith(".kml") || name === "doc.kml");
|
|
4679
|
+
if (!kmlFileName) throw new Error("No KML file found in KMZ archive.");
|
|
4680
|
+
const kmlBytes = files[kmlFileName];
|
|
4681
|
+
const kmlString = new TextDecoder("utf-8").decode(kmlBytes);
|
|
4682
|
+
const doc = new DOMParser().parseFromString(kmlString, "application/xml");
|
|
4683
|
+
const parseError = doc.querySelector("parsererror");
|
|
4684
|
+
if (parseError) throw new Error(`KML parse error: ${parseError.textContent}`);
|
|
4685
|
+
return doc;
|
|
4686
|
+
}
|
|
4687
|
+
const Kmz = (0, react.forwardRef)(function KmzInner(props, ref) {
|
|
4688
|
+
const { map: contextMap, sdkStatus } = useNaverMap();
|
|
4689
|
+
const dataRef = (0, react.useRef)(null);
|
|
4690
|
+
const dataEventListenersRef = (0, react.useRef)([]);
|
|
4691
|
+
const onDataDestroyRef = (0, react.useRef)(props.onDataDestroy);
|
|
4692
|
+
const prevUrlRef = (0, react.useRef)(null);
|
|
4693
|
+
const abortRef = (0, react.useRef)(null);
|
|
4694
|
+
(0, react.useEffect)(() => {
|
|
4695
|
+
onDataDestroyRef.current = props.onDataDestroy;
|
|
4696
|
+
}, [props.onDataDestroy]);
|
|
4697
|
+
const invokeDataMethod = (0, react.useCallback)((methodName, ...args) => {
|
|
4698
|
+
const data = dataRef.current;
|
|
4699
|
+
if (!data) return;
|
|
4700
|
+
const method = data[methodName];
|
|
4701
|
+
if (typeof method !== "function") return;
|
|
4702
|
+
return method.apply(data, args);
|
|
4703
|
+
}, []);
|
|
4704
|
+
const teardownData = (0, react.useCallback)(() => {
|
|
4705
|
+
abortRef.current?.abort();
|
|
4706
|
+
abortRef.current = null;
|
|
4707
|
+
const data = dataRef.current;
|
|
4708
|
+
if (!data) return;
|
|
4709
|
+
try {
|
|
4710
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
4711
|
+
dataEventListenersRef.current = [];
|
|
4712
|
+
naver.maps.Event.clearInstanceListeners(data);
|
|
4713
|
+
} catch (error) {
|
|
4714
|
+
console.error("[react-naver-maps-kit] failed to clear KMZ data layer listeners", error);
|
|
4715
|
+
}
|
|
4716
|
+
data.setMap(null);
|
|
4717
|
+
dataRef.current = null;
|
|
4718
|
+
prevUrlRef.current = null;
|
|
4719
|
+
onDataDestroyRef.current?.();
|
|
4720
|
+
}, []);
|
|
4721
|
+
(0, react.useImperativeHandle)(ref, () => ({
|
|
4722
|
+
getInstance: () => dataRef.current,
|
|
4723
|
+
getAllFeature: (...args) => invokeDataMethod("getAllFeature", ...args),
|
|
4724
|
+
getFeatureById: (...args) => invokeDataMethod("getFeatureById", ...args),
|
|
4725
|
+
getMap: (...args) => invokeDataMethod("getMap", ...args),
|
|
4726
|
+
getStyle: (...args) => invokeDataMethod("getStyle", ...args),
|
|
4727
|
+
overrideStyle: (...args) => invokeDataMethod("overrideStyle", ...args),
|
|
4728
|
+
removeFeature: (...args) => invokeDataMethod("removeFeature", ...args),
|
|
4729
|
+
revertStyle: (...args) => invokeDataMethod("revertStyle", ...args),
|
|
4730
|
+
setStyle: (...args) => invokeDataMethod("setStyle", ...args),
|
|
4731
|
+
toGeoJson: (...args) => invokeDataMethod("toGeoJson", ...args)
|
|
4732
|
+
}), [invokeDataMethod]);
|
|
4733
|
+
const loadAndAddKmz = (0, react.useCallback)(async (data, url, isInitial) => {
|
|
4734
|
+
const controller = new AbortController();
|
|
4735
|
+
abortRef.current = controller;
|
|
4736
|
+
try {
|
|
4737
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
4738
|
+
if (!response.ok) throw new Error(`Failed to fetch KMZ: ${response.status} ${response.statusText}`);
|
|
4739
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
4740
|
+
if (controller.signal.aborted) return;
|
|
4741
|
+
const kmlDoc = extractKmlFromKmz(arrayBuffer);
|
|
4742
|
+
if (!isInitial) data.getAllFeature().forEach((feature) => data.removeFeature(feature));
|
|
4743
|
+
const features = data.addKml(kmlDoc, props.autoStyle ?? true);
|
|
4744
|
+
prevUrlRef.current = url;
|
|
4745
|
+
props.onFeaturesAdded?.(features);
|
|
4746
|
+
} catch (error) {
|
|
4747
|
+
if (controller.signal.aborted) return;
|
|
4748
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to load KMZ data.");
|
|
4749
|
+
props.onDataError?.(normalizedError);
|
|
4750
|
+
}
|
|
4751
|
+
}, [
|
|
4752
|
+
props.autoStyle,
|
|
4753
|
+
props.onFeaturesAdded,
|
|
4754
|
+
props.onDataError
|
|
4755
|
+
]);
|
|
4756
|
+
(0, react.useEffect)(() => {
|
|
4757
|
+
if (sdkStatus !== "ready" || !contextMap || dataRef.current) return;
|
|
4758
|
+
try {
|
|
4759
|
+
const data = new naver.maps.Data();
|
|
4760
|
+
data.setMap(contextMap);
|
|
4761
|
+
if (props.style) data.setStyle(props.style);
|
|
4762
|
+
dataRef.current = data;
|
|
4763
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildKmzEventBindings(props));
|
|
4764
|
+
props.onDataReady?.(data);
|
|
4765
|
+
loadAndAddKmz(data, props.url, true);
|
|
4766
|
+
} catch (error) {
|
|
4767
|
+
const normalizedError = error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to create naver.maps.Data instance.");
|
|
4768
|
+
props.onDataError?.(normalizedError);
|
|
4769
|
+
}
|
|
4770
|
+
}, [sdkStatus, contextMap]);
|
|
4771
|
+
(0, react.useEffect)(() => {
|
|
4772
|
+
const data = dataRef.current;
|
|
4773
|
+
if (!data || props.url === prevUrlRef.current) return;
|
|
4774
|
+
abortRef.current?.abort();
|
|
4775
|
+
loadAndAddKmz(data, props.url, false);
|
|
4776
|
+
}, [props.url, loadAndAddKmz]);
|
|
4777
|
+
(0, react.useEffect)(() => {
|
|
4778
|
+
const data = dataRef.current;
|
|
4779
|
+
if (!data) return;
|
|
4780
|
+
if (props.style) data.setStyle(props.style);
|
|
4781
|
+
}, [props.style]);
|
|
4782
|
+
(0, react.useEffect)(() => {
|
|
4783
|
+
const data = dataRef.current;
|
|
4784
|
+
if (!data) return;
|
|
4785
|
+
bindOverlayEventListeners(data, dataEventListenersRef, buildKmzEventBindings(props));
|
|
4786
|
+
return () => {
|
|
4787
|
+
removeOverlayEventListeners(dataEventListenersRef.current);
|
|
4788
|
+
dataEventListenersRef.current = [];
|
|
4789
|
+
};
|
|
4790
|
+
}, [props]);
|
|
4791
|
+
(0, react.useEffect)(() => {
|
|
4792
|
+
return () => {
|
|
4793
|
+
teardownData();
|
|
4794
|
+
};
|
|
4795
|
+
}, [teardownData]);
|
|
4796
|
+
return null;
|
|
4797
|
+
});
|
|
4798
|
+
Kmz.displayName = "Kmz";
|
|
4799
|
+
|
|
3890
4800
|
//#endregion
|
|
3891
4801
|
//#region src/index.ts
|
|
3892
|
-
const version = "
|
|
4802
|
+
const version = "1.2.0";
|
|
3893
4803
|
|
|
3894
4804
|
//#endregion
|
|
3895
4805
|
exports.Circle = Circle;
|
|
3896
4806
|
exports.ClustererContext = ClustererContext;
|
|
3897
4807
|
exports.Ellipse = Ellipse;
|
|
4808
|
+
exports.GeoJson = GeoJson;
|
|
4809
|
+
exports.Gpx = Gpx;
|
|
3898
4810
|
exports.GroundOverlay = GroundOverlay;
|
|
3899
4811
|
exports.InfoWindow = InfoWindow;
|
|
4812
|
+
exports.Kmz = Kmz;
|
|
3900
4813
|
exports.Marker = Marker;
|
|
3901
4814
|
exports.MarkerClusterer = MarkerClusterer;
|
|
3902
4815
|
exports.NaverMap = NaverMap;
|