tg-map-vue3 3.7.11 → 3.7.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/dist/tg-map.js +417 -415
- package/dist/tg-map.js.map +1 -1
- package/dist/tg-map.umd.cjs +5 -5
- package/dist/tg-map.umd.cjs.map +1 -1
- package/package.json +3 -4
package/dist/tg-map.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tg-map.umd.cjs","sources":["../src/map/event.ts","../node_modules/.pnpm/github.com+TranscodeGroup+coordtransform@75f539951e6b8e9c80bd156a670e2886f4e1fde6_erresvh33ayp76eoeefwsujamu/node_modules/coordtransform/index.js","../src/utils/assert.ts","../src/utils/mapped-types.ts","../src/utils/utils.ts","../src/map/lat-lng.ts","../src/utils/elements.ts","../src/utils/arrays.ts","../src/map/event-target.ts","../src/utils/values.ts","../src/map/map/controls/control.ts","../src/map/map/map-type.ts","../src/map/map/controls/map-type.control.ts","../src/map/map/controls/scale.control.ts","../src/map/map/controls/street-view.control.ts","../src/map/map/controls/zoom.control.ts","../src/utils/google-utils.ts","../src/map/map/extra/autocomplete.ts","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.Heatmap@d10d1a6609a20230cb11f1ff775abfac1da57ec5_5m62dobqccwj3jyaiw4teknuga/node_modules/bmaplib.heatmap/index.js","../src/map/map/extra/heatmap.ts","../src/map/map/extra/map-urls.ts","../node_modules/.pnpm/@google+markerclusterer@2.0.3/node_modules/@google/markerclusterer/dist/markerclusterer.esm.js","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.TextIconOverlay@a5e383395b3c7d0921cf4de1329d6625259bb69f_ax5jbzszzsksndmqbcgpnto4si/node_modules/bmaplib.texticonoverlay/index.js","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.MarkerClusterer@81179405d7f50e1ff499c1b65f6d5347d8b3b67b_5h4jsikof26eydbgv5ah4qixaa/node_modules/bmaplib.markerclusterer/index.esm.js","../src/map/map/extra/marker-clusterer.ts","../src/map/map/extra/places-service.ts","../src/map/map/extra/search-box.ts","../src/map/map/map.ts","../node_modules/.pnpm/deepmerge@4.3.0/node_modules/deepmerge/dist/cjs.js","../node_modules/.pnpm/is-plain-object@3.0.1/node_modules/is-plain-object/index.es.js","../src/utils/objects.ts","../src/map/map/map-options.ts","../src/map/map/overlay/overlay.ts","../src/map/map/overlay/shape.ts","../src/map/map/overlay/circle.ts","../src/utils/baidu-utils.ts","../src/map/types.ts","../src/map/map/overlay/baidu-info-box.ts","../src/map/map/overlay/info-window.ts","../src/map/map/overlay/info-box.ts","../src/utils/strings.ts","../src/map/map/overlay/element-overlay.ts","../src/map/map/overlay/google-label.ts","../src/map/map/overlay/label.ts","../src/map/map/overlay/icon.ts","../src/map/map/overlay/marker.ts","../src/map/map/overlay/polyline.ts","../src/map/map/overlay/polygon.ts","../src/map/map/overlay/rectangle.ts","../src/map/map/baidu-map.ts","../src/map/map/google-map.ts","../src/utils/here-utils.ts","../src/map/map-config.ts","../src/map/map/here-map.ts","../src/map/map-factory.ts","../src/map/map-loader.ts","../src/utils/vue-utils.ts","../src/components/map-mixin.ts","../src/components/TgMap.vue","../src/utils/formatter.ts","../src/components/TgMapWidget.vue","../src/components/controls/TgCustomControl.vue","../src/components/controls/TgMapTypeControl.vue","../src/components/controls/TgScaleControl.vue","../src/utils/hooks.ts","../src/components/map-hooks.ts","../src/components/controls/TgStreetViewControl.vue","../src/components/controls/TgZoomControl.vue","../src/components/extra/TgHeatmap.vue","../src/components/extra/TgMarkerClusterer.vue","../src/components/layers/TgTrafficLayer.vue","../src/components/overlays/TgCircle.vue","../src/components/overlays/TgElementOverlay.vue","../src/components/overlays/TgMarker.vue","../src/components/overlays/TgInfoBox.vue","../src/components/overlays/TgInfoWindow.vue","../src/components/overlays/TgLabel.vue","../src/components/overlays/TgPolygon.vue","../src/components/overlays/TgPolyline.vue","../src/components/overlays/TgRectangle.vue","../src/utils/lifecycle-log.ts","../src/utils/spherical-utils.ts","../src/components/index.ts"],"sourcesContent":["import type { LatLng } from './lat-lng'\n\n/**\n * ## 事件机制对比\n * - DOM: add/removeEventListener, Event {type, target}\n * - Vue: $on/$off, 没有Event, listener直接接收数据\n * - baidu: 模仿DOM\n * - here: 模仿DOM\n * - google: addListener+remove, 没有Event, listener直接接收数据\n *\n * 综合对比之后, 决定模仿DOM的事件机制\n */\nexport namespace Tg {\n export interface Event {\n type: string,\n target: EventTarget\n originalEvent?: any\n }\n export interface MouseEvent extends Event {\n position: LatLng\n }\n\n export interface EventListener {\n (this: EventTarget, event: Event): void\n /** 唯一id */\n __id__?: number\n }\n\n export interface EventTarget {\n addEventListener(type: string, listener: EventListener): void\n removeEventListener(type: string, listener: EventListener): void\n }\n\n /**\n * 拥有更详细的类型信息\n * @see EventTarget\n * */\n export interface EventTargetTyped<THIS extends EventTarget, MAP extends { [k: string]: Event }> extends EventTarget {\n addEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void\n removeEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void\n }\n}\n\nexport function bindEvents(listeners: Record<string, unknown>, target: Tg.EventTarget, excludes?: string[]) {\n Object.keys(listeners).forEach(eventName => {\n if (eventName.startsWith('update:')) {\n // `update:`开头的事件是sync事件, 应该排除\n return\n }\n if (excludes?.includes(eventName)) {\n // 需要排除掉一些事件\n return\n }\n target.addEventListener(eventName, (listeners[eventName] as any))\n })\n}\n\nlet eventListenerId = 1\nexport function generateNextEventListenerId() {\n return eventListenerId++\n}\n\n/**\n * JS的Map/object的key都不支持自定义hashCode()/equals(), 故只能生成字符串当作key\n */\nexport function generateEventKey(type: string, listener: Tg.EventListener) {\n if (!listener.__id__) {\n listener.__id__ = generateNextEventListenerId()\n }\n return `${type}::${listener.__id__}`\n}\n","/**\n * Created by Wandergis on 2015/7/8.\n * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换\n */\n//UMD魔法代码\n// if the module has no dependencies, the above pattern can be simplified to\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.coordtransform = factory();\n }\n}(this, function () {\n //定义一些常量\n var x_PI = 3.14159265358979324 * 3000.0 / 180.0;\n var PI = 3.1415926535897932384626;\n var a = 6378245.0;\n var ee = 0.00669342162296594323;\n\n function Rectangle(lng1, lat1, lng2, lat2) {\n this.west = Math.min(lng1, lng2);\n this.north = Math.max(lat1, lat2);\n this.east = Math.max(lng1, lng2);\n this.south = Math.min(lat1, lat2);\n }\n /**\n * @param {number} lon\n * @param {number} lat\n */\n Rectangle.prototype.contain = function (lon, lat) {\n return this.west <= lon && this.east >= lon && this.north >= lat && this.south <= lat;\n }\n\n //China region - raw data\n var region = [\n new Rectangle(79.446200, 49.220400, 96.330000, 42.889900),\n new Rectangle(109.687200, 54.141500, 135.000200, 39.374200),\n new Rectangle(73.124600, 42.889900, 124.143255, 29.529700),\n new Rectangle(82.968400, 29.529700, 97.035200, 26.718600),\n new Rectangle(97.025300, 29.529700, 124.367395, 20.414096),\n new Rectangle(107.975793, 20.414096, 111.744104, 17.871542)\n ];\n //China excluded region - raw data\n var exclude = [\n new Rectangle(119.921265, 25.398623, 122.497559, 21.785006),\n new Rectangle(101.865200, 22.284000, 106.665000, 20.098800),\n new Rectangle(106.452500, 21.542200, 108.051000, 20.487800),\n new Rectangle(109.032300, 55.817500, 119.127000, 50.325700),\n new Rectangle(127.456800, 55.817500, 137.022700, 49.557400),\n new Rectangle(131.266200, 44.892200, 137.022700, 42.569200),\n new Rectangle(73.124600, 35.398637, 77.948114, 29.529700)\n ];\n\n function isInChina(lon, lat) {\n for (var i = 0; i < region.length; i++) {\n if (region[i].contain(lon, lat)) {\n for (var j = 0; j < exclude.length; j++) {\n if (exclude[j].contain(lon, lat)) {\n return false;\n }\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换\n * 即 百度 转 谷歌、高德\n * @param {number} bd_lon\n * @param {number} bd_lat\n * @returns {*[]}\n */\n function bd09togcj02(bd_lon, bd_lat) {\n var x = bd_lon - 0.0065;\n var y = bd_lat - 0.006;\n var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);\n var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);\n var gg_lng = z * Math.cos(theta);\n var gg_lat = z * Math.sin(theta);\n return [gg_lng, gg_lat]\n };\n\n /**\n * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换\n * 即谷歌、高德 转 百度\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function gcj02tobd09(lng, lat) {\n var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);\n var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);\n var bd_lng = z * Math.cos(theta) + 0.0065;\n var bd_lat = z * Math.sin(theta) + 0.006;\n return [bd_lng, bd_lat]\n };\n\n /**\n * WGS84转GCj02\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function wgs84togcj02(lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n return transform(lng, lat)\n };\n\n /**\n * GCJ02 转换为 WGS84\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function gcj02towgs84(lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var out = transform(lng, lat)\n return [lng * 2 - out[0], lat * 2 - out[1]]\n };\n\n function transform(lng, lat) {\n var dlat = transformlat(lng - 105.0, lat - 35.0);\n var dlng = transformlng(lng - 105.0, lat - 35.0);\n var radlat = lat / 180.0 * PI;\n var magic = Math.sin(radlat);\n magic = 1 - ee * magic * magic;\n var sqrtmagic = Math.sqrt(magic);\n dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);\n dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);\n var mglat = lat + dlat;\n var mglng = lng + dlng;\n return [mglng, mglat]\n }\n\n function transformlat(lng, lat) {\n var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));\n ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;\n ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;\n ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;\n return ret\n };\n\n function transformlng(lng, lat) {\n var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));\n ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;\n ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;\n ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;\n return ret\n };\n\n return {\n // 向前兼容\n bd09togcj02: bd09togcj02,\n gcj02tobd09: gcj02tobd09,\n wgs84togcj02: wgs84togcj02,\n gcj02towgs84: gcj02towgs84,\n // 小驼峰命名风格\n bd09ToGcj02: bd09togcj02,\n gcj02ToBd09: gcj02tobd09,\n wgs84ToGcj02: wgs84togcj02,\n gcj02ToWgs84: gcj02towgs84,\n bd09ToWgs84: function (lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var gcj02 = bd09togcj02(lng, lat)\n return gcj02towgs84(gcj02[0], gcj02[1])\n },\n wgs84ToBd09: function (lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var gcj02 = wgs84togcj02(lng, lat)\n return gcj02tobd09(gcj02[0], gcj02[1])\n }\n }\n}));\n","/**\n * typescript 3.7 的新特性[Assertion Functions](https://github.com/microsoft/TypeScript/issues/33352)\n * */\nexport function assert(condition: any, msg?: string): asserts condition {\n if (!condition) {\n throw new Error(`AssertionError: ${msg}`)\n }\n}\n\n/**\n * 可以用来防止switch时少写case\n * @see https://www.zhihu.com/question/354601204\n */\nexport function assertNever(x: never): never {\n throw new Error(`Unexpected object: ${x}`)\n}\n","// [PrimitiveToWrapper]就是用来转换这两种类型的\n/* eslint-disable @typescript-eslint/ban-types */\nimport type { Component, ComponentPublicInstance } from 'vue'\n\n/** deep版的 `Partial` */\nexport type DeepPartial<T> = {\n [U in keyof T]?: T[U] extends object\n ? DeepPartial<T[U]>\n : T[U]\n}\n\n/** 表示一个函数 */\nexport type AnyFunction = (...args: any[]) => any\n\n/**\n * 表示一个构造器\n * {@link import('vue/types/options').Constructor}\n * */\nexport type Constructor<T = {}> = new (...args: any[]) => T\n\n/**\n * 抽象构造器类型, 相比{@link Constructor}, 不能直接用new创建对象\n * @see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-2.html#abstract-construct-signatures\n */\nexport type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T\n\n/** 原始类型=>包装类型 */\nexport type PrimitiveToWrapper<T> =\n T extends boolean ? Boolean :\n T extends string ? String :\n T extends number ? Number :\n T\n\n/** 包装类型=>原始类型 */\nexport type WrapperToPrimitive<T> =\n T extends Boolean ? boolean :\n T extends String ? string :\n T extends Number ? number :\n T\n\n/**\n * 返回undefined但类型是指定的泛型T, 需要你自身保证在使用前先初始化\n * 模仿了kotlin的lateinit关键字\n * */\nexport function lateinit<T>(): T {\n return undefined as any\n}\n\nexport function typed<T>(): T | undefined\nexport function typed<T>(t: T): T\n/** 用来给纯对象的成员加上类型验证 */\nexport function typed<T>(t?: T) {\n return t\n}\n\n/**\n * `vue instanceof VueConstructor`时`vue`并不会自动转换成`VueConstructor`的子类, 用该方法可以实现这种转换\n */\nexport function isInstanceOf<T>(obj: any, constructor: Constructor<T>): obj is T {\n return obj instanceof constructor\n}\n\n/** @see isInstanceOf */\nexport function safeAs<T>(obj: any, constructor: Constructor<T>): T | undefined {\n if (obj instanceof constructor) {\n return obj\n }\n return undefined\n}\n\n/** 判断{@link instance}是否是{@link component}的实例 */\nexport function isComponentByType<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): instance is InstanceType<C> {\n // TODO: 2023/03/15 ipcjs 看有没有其他更好的方式判断组件类型\n return instance?.$options.name === component.name\n}\n\n/** 安全转换组件类型, 若不能转换会返回`undefined` */\nexport function safeAsComponent<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): InstanceType<C> | undefined {\n return isComponentByType(instance, component) ? instance : undefined\n}\n\n/**\n * 查找[startInstance, endComponent)之间的第一个类型为{@link component}的父组件\n * @param component 查找的组件\n * @param startInstance 查找的开始实例, 包含\n * @param endComponent 查找的终止组件, 不包含\n * @returns\n */\nexport function findAncestorComponentByType<C extends Component & AbstractConstructor>(\n component: C,\n startInstance: ComponentPublicInstance | null,\n endComponent?: Component & AbstractConstructor,\n): InstanceType<C> | undefined {\n let instance = startInstance\n while (instance) {\n if (isComponentByType(instance, component)) {\n return instance\n } else if (endComponent && isComponentByType(instance, endComponent)) {\n return undefined\n } else {\n instance = instance.$parent\n }\n }\n return undefined\n}\n\n/** {@link NonNullable} 的反义词 */\nexport type Nullable<T> = T | null | undefined\n\n/** T的所有value的联合类型 */\nexport type ValueOf<T> = T[keyof T]\n\n/**\n * 提取出T中value为V的子类的所有key\n * @see https://stackoverflow.com/questions/54520676/in-typescript-how-to-specify-only-keys-of-a-generic-object-whose-values-are-stri\n * */\nexport type KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * 并不存在可以精确表示一个枚举类型, 该类只能近似表示一个字符枚举\n * */\nexport type StringEnumLike = { [k: string]: string }\n\n/**\n * String枚举的值, 包括`string`类型\n * @see https://stackoverflow.com/questions/52393730/typescript-string-literal-union-type-from-enum\n */\nexport type StringEnumValue<E extends StringEnumLike> = ValueOf<E> | `${ValueOf<E>}`\n\n/**\n * 包装`T`中的部分枚举字段的值为{@link StringEnumValue}\n *\n * 会校验{@link EnumObjects}中的类型是否书写正确, 若写错, 会推断成`never`\n * */\nexport type WrapStringEnumValue<T, EnumObjects extends { [k in keyof T]?: StringEnumLike }, > = {\n [P in keyof T]: P extends keyof EnumObjects\n ? EnumObjects[P] extends StringEnumLike\n ? T[P] extends ValueOf<EnumObjects[P]> | undefined\n ? StringEnumValue<EnumObjects[P]>\n : never\n : never\n : T[P]\n}\n\n/** 取消包装`T`中的{@link StringEnumValue}字段 */\nexport function unwrapStringEnumValue<T extends object>(value: T): {\n [K in keyof T]: T[K] extends StringEnumValue<infer Enum>\n ? StringEnumLike extends Enum\n // 若Enum推断成StringEnumLike, 说明Enum不是真的枚举, 直接返回原始的类型T[K]\n ? T[K]\n // 否则, Enum则时真正的枚举, 返回枚举的类型\n : Enum[keyof Enum]\n : Exclude<T[K], undefined> extends StringEnumValue<infer Enum>\n ? StringEnumLike extends Enum\n // 同上\n ? T[K]\n :Enum[keyof Enum] | undefined\n : T[K]\n}\n\nexport function unwrapStringEnumValue<E extends StringEnumLike>(value: StringEnumValue<E>, enumObject?: E): E[keyof E]\nexport function unwrapStringEnumValue<E extends StringEnumLike>(value: StringEnumValue<E> | undefined, enumObject?: E): E[keyof E] | undefined\n/**\n * 取消包装`StringEnumValue`, 将其还原成枚举, 和{@link WrapStringEnumValue}对应\n *\n * 整个方法没有逻辑, 只是做类型校验; 重载中的`enumObject`也仅用与辅助推理`E`的类型, 并没有实际作用;\n */\nexport function unwrapStringEnumValue(value: any): any {\n return value\n}\n\n/**\n * 非空的值\n *\n * 类型`{}`也表示\"任何非空的值\", 但由于它看起来像空对象, 所以一般更推荐用Thing\n *\n * @see https://github.com/microsoft/TypeScript/issues/7648#issuecomment-541625573\n * @see https://github.com/typescript-eslint/typescript-eslint/issues/2063#issuecomment-675156492\n */\nexport type Thing = string | number | boolean | bigint | object | symbol\n\n/** 除T指定的类型外, 其他参数 */\nexport type TypedAny<T> = T & { [k: string]: any }\n","/** 抛异常是语句不是表达式, 使用该方法替换则可以在表达式中使用 */\nexport function throwError(msg?: string): never {\n throw new Error(msg)\n}\n\nexport function throwUnsupported(msg?: string): never {\n throw new Error(`Unsupported: ${msg}`)\n}\n\nexport function todo(msg?: string): never {\n throw new Error(`todo: ${msg}`)\n}\n\nexport function debug(msg?: any): any {\n // debugger\n return msg\n}\n\n/** 啥也不做 */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function noop(...args: any[]) { /* noop */ }\n\n/** 可以用在Array.filter(isDef)中, 用来过滤为空的值 */\nexport function isDef<T>(v: T | undefined | null): v is T {\n return v != null\n}\n\n/**\n * entry的value是否定义了\n *\n * 可以用在Array.filter(isEntryValueDef)中, 用来过滤值为空的元素\n * @see isDef\n */\nexport function isEntryValueDef<K, V>(entry: [K, V]): entry is [K, NonNullable<V>] {\n return entry[1] != null\n}\n\n/**\n * 创建一个异步初始化的单例, 保证只初始化成功一次\n */\nexport function createAsyncSingleton<T>(creator: () => Promise<T>) {\n let promise: Promise<T> | null = null\n return () => {\n // eslint-disable-next-line no-return-assign\n return promise ??= creator() //\n .catch((e) => {\n // 异常时清空promise, 下次请求就能重试\n promise = null\n return Promise.reject(e)\n })\n }\n}\n","import coordtransform, { type LngLatTuple } from 'coordtransform'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { type Arrays } from '../utils/arrays'\nimport { assert } from '../utils/assert'\nimport { unwrapStringEnumValue, type StringEnumValue } from '../utils/mapped-types'\nimport { noop, throwError } from '../utils/utils'\n\nexport enum CoordType {\n wgs84 = 'wgs84',\n gcj02 = 'gcj02',\n bd09 = 'bd09',\n}\n\nconst COORD_TYPE_DEFAULT = CoordType.wgs84\n\nexport interface CoordTypeSupplier {\n readonly coordType: CoordType\n}\n\nexport interface LatLngLiteral {\n readonly lat: number\n readonly lng: number\n readonly coord?: CoordType\n}\n\nexport interface WeightedLatLng {\n position: LatLng\n weight: number\n}\n\nexport class LatLng {\n static ZERO = LatLng.create(0, 0)\n /**\n * {@template latlng_normalize}\n *\n * 对经纬度进行标准化, 参考google的实现\n *\n * ## 行为不一致\n * - google: google.maps.LatLng的构造器会对经纬度进行标准化, 所有点都能正常显示\n * - baidu: BMap.Point的构造器不会对经纬度进行标准化, 超出范围的点显示到(0, 0)位置\n *\n * {@endtemplate}\n */\n /* private */ static _normalize(lng: number, lat: number) {\n // lat限制在[-90, 90]范围内\n const normalizedLat = lat > 90\n ? 90\n : lat < -90\n ? -90\n : lat\n // lng转换到[-180, 180]范围内\n const normalizedLng = lng > 180 //\n ? (lng + 180) % 360 - 180\n : lng < -180\n ? (lng - 180) % 360 + 180\n : lng\n return [normalizedLng, normalizedLat]\n }\n\n /** @param coord Baidu Map的坐标一般都是bd09 */\n static fromBaidu(point: BMap.Point, coord: CoordType) {\n return new LatLng(point.lat, point.lng, coord)\n }\n /** @param coord Google Map的坐标依据地图类型不同是不一样的 */\n static fromGoogle(latlng: google.maps.LatLng, coord: CoordType) {\n return new LatLng(latlng.lat(), latlng.lng(), coord)\n }\n static fromHere(point: H.geo.IPoint, coord: CoordType) {\n return new LatLng(point.lat, point.lng, coord)\n }\n\n static fromLiteral(latlng: LatLngLiteral) {\n return new LatLng(latlng.lat, latlng.lng, latlng.coord || COORD_TYPE_DEFAULT)\n }\n\n static fromLngLat(lng: number, lat: number, coord: CoordType = COORD_TYPE_DEFAULT) {\n return new LatLng(lat, lng, coord)\n }\n\n static create(lat: number, lng: number, coord: CoordType = COORD_TYPE_DEFAULT) {\n return new LatLng(lat, lng, coord)\n }\n\n constructor(\n /**\n * 纬度, 分南北, [-90, 90], 0点为赤道\n */\n public readonly lat: number,\n /**\n * 经度, 分东西, [-180, 180], 0点为本初子午线\n */\n public readonly lng: number,\n /** 坐标系 */\n public readonly coord: CoordType,\n ) {\n noop()\n }\n\n /** 转换坐标到指定坐标系 */\n to(coordType: StringEnumValue<typeof CoordType>) {\n const coord = unwrapStringEnumValue(coordType, CoordType)\n if (this.coord === coord) {\n return this\n }\n const [lng, lat] = this._convert(coord)\n return new LatLng(lat, lng, coord)\n }\n\n /**\n * TODO: normalize要不要默认设为true, 和google的行为保持一致?\n * 转换成baidu的经纬度\n * @param normalize 转换时是否进行标准化, 默认false\n * @see _normalize {@macro latlng_normalize}\n */\n toBaidu(coord: CoordType, normalize = false) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n if (normalize) {\n [lng, lat] = LatLng._normalize(lng, lat)\n }\n return new BMap.Point(lng, lat)\n }\n\n /**\n * 转换成google的经纬度, 内部会自动进行标准化\n * @see _normalize {@macro latlng_normalize}\n */\n toGoogle(coord: CoordType) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n return new google.maps.LatLng(lat, lng)\n }\n\n toHere(coord: CoordType) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n return new H.geo.Point(lat, lng)\n }\n\n /**\n * 该方法之所以设计的这么不友好, 是为了防止不必要的开销(大概有点影响😅)\n *\n * 私有方法, 外部需要转换坐标系, 请使用{@link to}/toBaidu/Google/Here, 之所以不添加private关键字, 是因为设成私有后, 有的地方会报类型错误...\n *\n * @returns `[lng, lat]` 注意不要取错顺序\n * @throws 若当前coord和targetCoord相同, 会抛异常, 故请在外部判断\n */\n /* private */ _convert(targetCoord: CoordType): LngLatTuple {\n switch (this.coord) {\n case CoordType.bd09:\n if (targetCoord === CoordType.gcj02) {\n return coordtransform.bd09ToGcj02(this.lng, this.lat)\n } else {\n return coordtransform.bd09ToWgs84(this.lng, this.lat)\n }\n\n case CoordType.gcj02:\n if (targetCoord === CoordType.wgs84) {\n return coordtransform.gcj02ToWgs84(this.lng, this.lat)\n } else {\n return coordtransform.gcj02ToBd09(this.lng, this.lat)\n }\n\n case CoordType.wgs84:\n if (targetCoord === CoordType.bd09) {\n return coordtransform.wgs84ToBd09(this.lng, this.lat)\n } else {\n return coordtransform.wgs84ToGcj02(this.lng, this.lat)\n }\n }\n\n throw new Error(`不支持的坐标转换: ${this.coord}=>${targetCoord}`)\n }\n\n /**\n * 标准化, 返回合法的坐标点\n * @see _normalize {@macro latlng_normalize}\n */\n normalize() {\n const [lng, lat] = LatLng._normalize(this.lng, this.lat)\n if (lat === this.lat && lng === this.lng) {\n return this\n }\n return new LatLng(lat, lng, this.coord)\n }\n\n equals(other: LatLng) {\n if (this === other) {\n return true\n }\n return this.lat === other.lat && this.lng === other.lng && this.coord === other.coord\n }\n\n toString() {\n return JSON.stringify(this)\n }\n}\n\n/** 少数接口同时支持对象形式和字面量形式 */\nexport type LatLngType = LatLng | LatLngLiteral\n\n/**\n * 反编译自{@link com.google.android.gms.maps.model.LatLngBounds}\n */\nexport class LatLngBounds {\n static EMPTY = new LatLngBounds(LatLng.ZERO, LatLng.ZERO)\n static isBetweenLng(minLng: number, maxLng: number, lng: number) {\n return minLng <= maxLng\n ? minLng <= lng && lng <= maxLng\n // 例如: 10->181的情况, 会被表示成10->-179, 导致minLag比maxLng数值上更大\n : minLng <= lng || lng <= maxLng\n }\n /**\n * 从数组创建bounds\n *\n * 只有{@link positions}为空时, 才会返回`undefined`, 可以借助{@link Arrays.isNotEmpty}协助进行类型推断\n */\n static fromArray(positions: readonly []): undefined\n /** @see Arrays.isNotEmpty */\n static fromArray(positions: readonly [LatLng, ...LatLng[]]): LatLngBounds\n static fromArray(positions: readonly LatLng[]): LatLngBounds | undefined\n static fromArray(positions: readonly LatLng[]): LatLngBounds | undefined {\n if (positions.length === 0) {\n return undefined\n }\n const builder = new LatLngBounds.Builder(positions[0])\n for (let i = 1; i < positions.length; i++) {\n builder.include(positions[i])\n }\n return builder.build()\n }\n\n static from(...positions: LatLng[]): LatLngBounds {\n return this.fromArray(positions) ?? throwError('positions中没有点')\n }\n\n static fromGoogle(bounds: google.maps.LatLngBounds, coord: CoordType) {\n return new LatLngBounds(\n LatLng.fromGoogle(bounds.getSouthWest(), coord),\n LatLng.fromGoogle(bounds.getNorthEast(), coord),\n )\n }\n\n static fromBaidu(bounds: BMap.Bounds, coord: CoordType) {\n return new LatLngBounds(\n LatLng.fromBaidu(bounds.getSouthWest(), coord),\n LatLng.fromBaidu(bounds.getNorthEast(), coord),\n )\n }\n\n static create(sw: LatLng, ne: LatLng) {\n return this.from(sw, ne)\n }\n\n coord: CoordType\n /**\n * 不推荐直接创建LatLngBounds, sw和ne的大小关系可能没法保证, 推荐用LatLngBounds.Builder或者LatLngBounds.from等静态方法来创建\n * @param sw 西南, lat/lng更小\n * @param ne 东北, lat/lng更大\n */\n constructor(\n public sw: LatLng,\n public ne: LatLng,\n ) {\n assert(sw.coord === ne.coord, 'sw和ne的coord应该相同')\n assert(Number.isFinite(sw.lat) && Number.isFinite(sw.lng) && Number.isFinite(ne.lat) && Number.isFinite(ne.lng), `sw(${sw})和ne(${ne})不能包含NaN或Infinite`)\n assert(sw.lat <= ne.lat, `sw.lat(${sw.lat})应该比ne.lat(${ne.lat})小`)\n this.coord = sw.coord\n }\n\n isEmpty() {\n return this.sw.equals(this.ne)\n }\n\n contains(position: LatLng) {\n const { lat, lng } = position.to(this.coord)\n return this.sw.lat <= lat && lat <= this.ne.lat &&\n LatLngBounds.isBetweenLng(this.sw.lng, this.ne.lng, lng)\n }\n\n getCenter(): LatLng {\n if (this.sw.equals(this.ne)) {\n return this.sw\n }\n const lat = (this.sw.lat + this.ne.lat) / 2\n const lng = (this.sw.lng + this.ne.lng + (this.sw.lng < this.ne.lng ? 0 : 360)) / 2\n return LatLng.create(lat, lng, this.coord)\n }\n\n toString() {\n return JSON.stringify(this)\n }\n\n equals(other: LatLngBounds) {\n return this.sw.equals(other.sw) && this.ne.equals(other.ne)\n }\n\n /**\n * 矩形的四个点数组\n * 顺时针: sw(西南) -> nw(西北) -> ne(东北) -> se(东南)\n * */\n toRectArray() {\n const coord = this.sw.coord\n return [\n this.sw,\n LatLng.fromLngLat(this.sw.lng, this.ne.lat, coord),\n this.ne,\n LatLng.fromLngLat(this.ne.lng, this.sw.lat, coord),\n ]\n }\n\n toGoogle(coord: CoordType) {\n return new google.maps.LatLngBounds(this.sw.toGoogle(coord), this.ne.toGoogle(coord))\n }\n toBaidu(coord: CoordType) {\n return new BMap.Bounds(this.sw.toBaidu(coord), this.ne.toBaidu(coord))\n }\n toBaiduArray(coord: CoordType) {\n return [this.sw.toBaidu(coord), this.ne.toBaidu(coord)]\n }\n}\n\nexport namespace LatLngBounds {\n export class Builder {\n private coord: CoordType\n private minLat: number\n private minLng: number\n private maxLat: number\n private maxLng: number\n\n constructor(start: LatLng) {\n this.coord = start.coord\n this.minLat = this.maxLat = start.lat\n this.minLng = this.maxLng = start.lng\n }\n\n build() {\n return new LatLngBounds(\n // sw对应min\n LatLng.create(this.minLat, this.minLng, this.coord),\n // ne对应max\n LatLng.create(this.maxLat, this.maxLng, this.coord),\n )\n }\n\n include(position: LatLng) {\n const { lat, lng } = position.to(this.coord)\n // lat的范围是[-90, 90], 是\"线性\"的, 可以直接比较大小\n this.minLat = Math.min(this.minLat, lat)\n this.maxLat = Math.max(this.maxLat, lat)\n // lng的范围是[-180, 180], 是\"一个圆\", 大于181将被表示成-179\n if (!LatLngBounds.isBetweenLng(this.minLng, this.maxLng, lng)) {\n // 比较minLng和maxLng, 谁离lng更近, 谁更近minLng->maxLng的范围往谁身上扩展\n if (this.delta(this.minLng, lng) < this.delta(lng, this.maxLng)) {\n this.minLng = lng\n } else {\n this.maxLng = lng\n }\n }\n return this\n }\n private delta(end: number, start: number) {\n return (end - start + 360) % 360\n }\n }\n}\n/** 在导航/搜索等接口中使用的 位置 */\nexport type Location = string | LatLng\n\nexport namespace Location {\n export function toString(place: Location | undefined, coordType: CoordType) {\n if (place == null) {\n return undefined\n }\n if (typeof place === 'string') {\n return place\n }\n const ll = place.to(coordType)\n return `${ll.lat},${ll.lng}`\n }\n export function getCoordType(place: Location | undefined) {\n return typeof place === 'string' ? undefined : place?.coord\n }\n}\n","export namespace Elements {\n /** @see https://stackoverflow.com/questions/4880381/check-whether-html-element-has-scrollbars */\n export function isScrollable(ele: Element) {\n return ele.scrollWidth > ele.clientWidth || ele.scrollHeight > ele.clientHeight\n }\n}\n","import { type AnyFunction, type Constructor } from '../components'\n\nexport namespace Arrays {\n /**\n * 浅层比较\n * @see https://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript\n * */\n export function equals<T>(a: T[], b: T[]) {\n return a.length === b.length && a.every((v, i) => v === b[i])\n }\n\n export function remove<T>(arr: T[], item: T): T | undefined {\n const index = arr.indexOf(item)\n if (index !== -1) {\n return arr.splice(index, 1)[0]\n }\n return undefined\n }\n\n export function findByType<T>(arr: any[], constructor: Constructor<T>): T | undefined {\n for (const item of arr) {\n if (item instanceof constructor) {\n return item\n }\n }\n return undefined\n }\n\n /** 自动推断item的类型的{@link Array.includes} */\n export function includesTyped<T extends E, E>(arr: T[], item: E): item is T {\n return (arr as E[]).includes(item)\n }\n\n /** 设置 指定位置的值 */\n export function at<T>(arr: T[], index: number, value: T): void\n /** 获取 指定位置的值 */\n export function at<T>(arr: T[], index: number): T | undefined\n /**\n * @param index 可以是负数, `-1`表示倒数第一个元素\n * @see RelativeIndexable.at\n */\n export function at<T>(arr: T[], index: number, value?: T) {\n const i = index >= 0 ? index : arr.length + index\n // 需要严格判定undefined\n if (value === undefined) {\n return arr[i]\n }\n arr[i] = value\n }\n\n /**\n * 判断并推断数组非空\n * @see https://stackoverflow.com/questions/56006111/is-it-possible-to-define-a-non-empty-array-type-in-typescript\n */\n export function isNotEmpty<T>(arr: T[]): arr is [T, ...T[]] {\n return arr.length > 0\n }\n}\n\nexport namespace MVCArrays {\n export function indexOf<T>(arr: google.maps.MVCArray<T>, item: T): number {\n const length = arr.getLength()\n for (let i = 0; i < length; i++) {\n if (arr.getAt(i) === item) {\n return i\n }\n }\n return -1\n }\n export function remove<T>(arr: google.maps.MVCArray<T>, item: T): T | undefined {\n const index = indexOf(arr, item)\n if (index !== -1) {\n return arr.removeAt(index)\n }\n return undefined\n }\n /**\n * 监听数组内容变化\n * @see https://developers.google.com/maps/documentation/javascript/shapes#editable_events\n * */\n export function listenChanged<T>(path: google.maps.MVCArray<T>, handler: AnyFunction) {\n return [\n path.addListener('insert_at', handler),\n path.addListener('remove_at', handler),\n path.addListener('set_at', handler),\n ]\n }\n}\n","// cSpell:ignore maptypeid, maptypechange\nimport type { AbstractMap, AbstractMapEventMap } from '../components'\nimport { Arrays } from '../utils/arrays'\nimport { lateinit } from '../utils/mapped-types'\nimport { generateEventKey, type Tg } from './event'\nimport { LatLng, type CoordTypeSupplier } from './lat-lng'\nimport type { UnionBaiduEventTarget, UnionGoogleEventTarget } from './unions'\n\n/**\n * 移除事件监听的函数\n *\n * 实现{@link EventTarget}有点复杂, 对于简单的情况, 实现一个设置监听的函数+返回{@link RemoveEventListenerFunction}就够了\n * @see addBaiduEventListener\n * @see addGoogleEventListener\n * */\nexport interface RemoveEventListenerFunction {\n (): void\n}\nexport function addGoogleEventListener(target: UnionGoogleEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction {\n return target.addListener(type, listener).remove\n}\n\nexport function addBaiduEventListener(target: UnionBaiduEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction {\n target.addEventListener(type, listener)\n return () => target.removeEventListener(type, listener)\n}\n\nexport function addHtmlEventListener<K extends keyof EventMap, EventMap=HTMLElementEventMap, T extends EventTarget=HTMLElement>(\n target: T,\n type: K,\n listener: (this: T, ev: EventMap[K]) => any,\n options?: AddEventListenerOptions | boolean,\n): RemoveEventListenerFunction {\n target.addEventListener(type as any, listener as any, options)\n return () => target.removeEventListener(type as any, listener as any, options)\n}\n\nexport function addTgEventListener<K extends keyof EventMap, EventMap=AbstractMapEventMap, T extends Tg.EventTarget=AbstractMap>(\n target: T,\n type: K,\n listener: (this: T, ev: EventMap[K]) => any,\n): RemoveEventListenerFunction {\n target.addEventListener(type as any, listener as any)\n return () => target.removeEventListener(type as any, listener as any)\n}\n\nexport interface EventTargetDelegate extends Tg.EventTarget {\n setTarget(target: Tg.EventTarget): this\n}\n\n/**\n * ## Delegate(代理) VS Mixin(混合)\n * Delegate相对于Mixin的优点是调用路径更明确, 缺点是js/ts原生不支持, 需要写样板代码\n */\nexport abstract class AbstractEventTargetDelegate<T = any> implements EventTargetDelegate {\n protected eventMap = new Map<string, any>()\n protected target = lateinit<Tg.EventTarget>()\n constructor(\n protected inner: T,\n protected coordTypeSupplier: CoordTypeSupplier,\n ) {\n // 绑定this, 防止this指向错误\n this.addEventListener = this.addEventListener.bind(this)\n this.removeEventListener = this.removeEventListener.bind(this)\n }\n setTarget(target: Tg.EventTarget) {\n this.target = target\n return this\n }\n abstract addEventListener(type: string, listener: Tg.EventListener): void\n abstract removeEventListener(type: string, listener: Tg.EventListener): void\n}\n\nexport class EventHubEventTargetDelegate<EventTypes extends string=string> implements EventTargetDelegate {\n private eventHub = new EventHub()\n constructor(\n private delegate: EventTargetDelegate,\n private options: {\n /** 由{@link eventHub}手动处理的事件 */\n types: EventTypes[],\n /** 用户开始监听{@link type} */\n onListen: (type: EventTypes) => void,\n /** 用户结束监听{@link type} */\n onCancel: (type: EventTypes) => void,\n },\n ) { }\n\n notify(event: Tg.Event) {\n this.eventHub.notify(event)\n }\n\n hasListener(type: EventTypes) {\n return this.eventHub.hasListener(type)\n }\n\n setTarget(target: Tg.EventTarget): this {\n this.delegate.setTarget(target)\n return this\n }\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n if (Arrays.includesTyped(this.options.types, type)) {\n // 第一次添加\n if (!this.eventHub.hasListener(type)) {\n this.options.onListen(type)\n }\n this.eventHub.addEventListener(type, listener)\n return\n }\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n if (Arrays.includesTyped(this.options.types, type)) {\n this.eventHub.removeEventListener(type, listener)\n // 最后一次移除\n if (!this.eventHub.hasListener(type)) {\n this.options.onCancel(type)\n }\n return\n }\n this.delegate.removeEventListener(type, listener)\n }\n}\n\nexport class GoogleEventTargetDelegate<T extends UnionGoogleEventTarget = UnionGoogleEventTarget> extends AbstractEventTargetDelegate<T> {\n // 事件类型映射: tg => google\n private static EVENT_TYPE_MAP: { [k: string]: string } = {\n 'center-changed': 'center_changed',\n 'zoom-changed': 'zoom_changed',\n 'radius-changed': 'radius_changed',\n 'bounds-changed': 'bounds_changed',\n 'map-type-changed': 'maptypeid_changed',\n // google地图的overlay会拦截地图的事件, 导致在map上设置的监听缺少一部分事件, baidu地图没有这个问题\n // 规避方式一:\n // 在map监听事件的同时, 在overlay上使用`map-*`监听相同的事件..., 具体使用方式参考主项目中的`SearchInRectTool2`\n // 规避方式二: (推荐)\n // 给overlay设置`clickable=\"false\"`, 不让它接收事件\n 'map-mousedown': 'mousedown',\n 'map-mousemove': 'mousemove',\n 'map-mouseup': 'mouseup',\n 'map-dblclick': 'dblclick',\n }\n\n override addEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n if (this.eventMap.get(key)) {\n console.warn('listener已经添加过了', key, listener)\n return\n }\n const removable = this.inner.addListener(GoogleEventTargetDelegate.EVENT_TYPE_MAP[type] || type, (event?: { latLng?: google.maps.LatLng }) => {\n const ev: Tg.Event = {\n type: type,\n target: this.target,\n originalEvent: event,\n }\n if (event?.latLng) { // google.maps.MouseEvent\n (ev as Tg.MouseEvent).position = LatLng.fromGoogle(event.latLng, this.coordTypeSupplier.coordType)\n }\n listener.call(this.target, ev)\n })\n this.eventMap.set(key, removable)\n }\n override removeEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n const removable: google.maps.MapsEventListener = this.eventMap.get(key)\n if (removable) {\n removable.remove()\n this.eventMap.delete(key)\n } else {\n console.warn('移除失败, 不存在该listener', key, listener)\n }\n }\n}\nexport class BaiduEventTargetDelegate<T extends UnionBaiduEventTarget = UnionBaiduEventTarget> extends AbstractEventTargetDelegate<T> {\n // cSpell:words clickclose\n // 事件类型映射, tg => baidu\n private static EVENT_TYPE_MAP: { [k: string]: string } = {\n drag: 'dragging',\n closeclick: 'clickclose',\n // baidu不支持contextmenu事件, 将其映射为rightclick\n contextmenu: 'rightclick',\n 'zoom-changed': 'zoomend',\n 'map-type-changed': 'maptypechange',\n }\n\n override addEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n if (this.eventMap.get(key)) {\n console.warn('listener已经添加过了', key, listener)\n return\n }\n const actualListener = (event: { point?: BMap.Point }) => {\n const ev: Tg.Event = {\n type: type,\n target: this.target,\n originalEvent: event,\n }\n if (event.point) {\n (ev as Tg.MouseEvent).position = LatLng.fromBaidu(event.point, this.coordTypeSupplier.coordType)\n }\n listener.call(this.target, ev)\n }\n this.inner.addEventListener(BaiduEventTargetDelegate.EVENT_TYPE_MAP[type] || type, actualListener)\n this.eventMap.set(key, actualListener)\n }\n override removeEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n const actualListener: BMap.Callback = this.eventMap.get(key)\n if (actualListener) {\n this.inner.removeEventListener(BaiduEventTargetDelegate.EVENT_TYPE_MAP[type] || type, actualListener)\n this.eventMap.delete(key)\n } else {\n console.warn('移除失败, 不存在该listener', key, listener)\n }\n }\n}\n\n/** 手动维护事件 */\nexport class EventHub implements Tg.EventTarget {\n private typeMap = new Map<string, Tg.EventListener[]>()\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n let listeners = this.typeMap.get(type)\n if (!listeners) {\n listeners = []\n this.typeMap.set(type, listeners)\n }\n if (listeners.includes(listener)) {\n return\n }\n listeners.push(listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n const listeners = this.typeMap.get(type)\n if (!listeners) {\n return\n }\n Arrays.remove(listeners, listener)\n }\n hasListener(type: string) {\n const listeners = this.typeMap.get(type)\n return listeners != null && listeners.length > 0\n }\n notify(event: Tg.Event) {\n const listeners = this.typeMap.get(event.type)\n if (listeners) {\n listeners.forEach(it => it.call(event.target, event))\n }\n }\n}\n","import { assert } from './assert'\nimport { noop, throwError } from './utils'\n\n/** 键值对 */\nexport class KeyValue<K, V> {\n private keyToValue = new Map<K, V>()\n private valueToKey = new Map<V, K>()\n /**\n * `keys`和`values`数组中可以有相同的值, 若存在相同值, 则index越小的优先级越高\n */\n constructor(keys: K[], values: V[]) {\n assert(keys.length === values.length)\n // 倒序遍历, 确保index越小, 优先级越高\n for (let i = keys.length - 1; i >= 0; i--) {\n this.keyToValue.set(keys[i], values[i])\n this.valueToKey.set(values[i], keys[i])\n }\n }\n toKey(value: V): K {\n return this.valueToKey.get(value) ?? throwError()\n }\n toValue(key: K): V {\n return this.keyToValue.get(key) ?? throwError()\n }\n}\n\nexport type KeySelector<T, K> = (this: T) => K\n\n/** 用key快速查找元素的数组 */\nexport class FastFindValues<T> {\n private map = new Map<KeySelector<T, any>, Map<any, T>>()\n constructor(\n public values: readonly T[],\n private maxSize4Debug = 10,\n ) {\n noop()\n }\n\n /** 获取保存key-value映射的Map */\n getValueMap<K>(keySelector: KeySelector<T, K>): Map<K, T> {\n let valueMap = this.map.get(keySelector)\n if (!valueMap) {\n valueMap = new Map<K, T>()\n // 倒序遍历, 保证index越小, 优先级越高\n for (let i = this.values.length - 1; i >= 0; i--) {\n const value = this.values[i]\n valueMap.set(keySelector.call(value), value)\n }\n this.map.set(keySelector, valueMap)\n if (process.env.NODE_ENV !== 'production' && this.map.size > this.maxSize4Debug) {\n console.warn(`this.map的大小(${this.map.size})超过了设置的最大大小(${this.maxSize4Debug}), 这可能是由于你每次都创建新的keySelector造成的, 请保证相同功能的keySelector只创建一个对象`)\n }\n }\n return valueMap\n }\n\n /**\n * 直接用key获取value\n * @param keySelector 从T中读取key的方法, 会用它当key, 缓存结果, 故多次调用需要使用相同的keySelector对象, 不要每次创建新的, 推荐直接使用T.prototype.getXxx作为keySelector\n */\n getOrNull<K>(keySelector: KeySelector<T, K>, key: K): T | undefined {\n return this.getValueMap(keySelector).get(key)\n }\n\n get<K>(keySelector: KeySelector<T, K>, key: K): T {\n return this.getOrNull(keySelector, key) ?? throwError(`key(${key})不存在与valueMap(${this.getValueMap(keySelector)})中`)\n }\n}\n\n/** 缓存的值 */\nexport class CachedValue<T> {\n private value: T | undefined\n constructor(private creator: () => T) { noop() }\n get(): T {\n if (this.value === undefined) {\n this.value = this.creator()\n }\n return this.value\n }\n}\n","import { noop } from '../../../utils/utils'\nimport { KeyValue } from '../../../utils/values'\nimport type { UnionControl } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport enum ControlPosition {\n /** 左上 */\n TOP_LEFT = 'top-left',\n TOP_CENTER = 'top-center',\n /** 右上 */\n TOP_RIGHT = 'top-right',\n BOTTOM_LEFT = 'bottom-left',\n BOTTOM_CENTER = 'bottom-center',\n BOTTOM_RIGHT = 'bottom-right',\n LEFT_TOP = 'left-top',\n LEFT_CENTER = 'left-center',\n /** 左下 */\n LEFT_BOTTOM = 'left-bottom',\n RIGHT_TOP = 'right-top',\n RIGHT_CENTER = 'right-center',\n /** 右下 */\n RIGHT_BOTTOM = 'right-bottom',\n}\n\nexport namespace ControlPositionConverter {\n let baiduKeyValue: KeyValue<ControlPosition, BMap.ControlAnchor> | undefined\n let googleKeyValue: KeyValue<ControlPosition, google.maps.ControlPosition> | undefined\n const controlPositionValues = [\n ControlPosition.TOP_LEFT,\n ControlPosition.TOP_CENTER,\n ControlPosition.TOP_RIGHT,\n ControlPosition.BOTTOM_LEFT,\n ControlPosition.BOTTOM_CENTER,\n ControlPosition.BOTTOM_RIGHT,\n ControlPosition.LEFT_TOP,\n ControlPosition.LEFT_CENTER,\n ControlPosition.LEFT_BOTTOM,\n ControlPosition.RIGHT_TOP,\n ControlPosition.RIGHT_CENTER,\n ControlPosition.RIGHT_BOTTOM,\n ]\n export function getBaidu() {\n if (!baiduKeyValue) {\n // 延迟初始化, 防止取不到`BMAP_*`的值\n // 反向映射存在一对多的情况, 取index最小的那个值\n baiduKeyValue = new KeyValue(controlPositionValues, [\n /* | @tg/map |名字相同| baidu | */\n /* TOP_LEFT = */ BMAP_ANCHOR_TOP_LEFT,\n /* TOP_CENTER */ BMAP_ANCHOR_TOP_LEFT,\n /* TOP_RIGHT = */ BMAP_ANCHOR_TOP_RIGHT,\n /* BOTTOM_LEFT = */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* BOTTOM_CENTER */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* BOTTOM_RIGHT = */ BMAP_ANCHOR_BOTTOM_RIGHT,\n /* LEFT_TOP */ BMAP_ANCHOR_TOP_LEFT,\n /* LEFT_CENTER */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* LEFT_BOTTOM */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* RIGHT_TOP */ BMAP_ANCHOR_TOP_RIGHT,\n /* RIGHT_CENTER */ BMAP_ANCHOR_BOTTOM_RIGHT,\n /* RIGHT_BOTTOM */ BMAP_ANCHOR_BOTTOM_RIGHT,\n ])\n }\n return baiduKeyValue\n }\n export function getGoogle() {\n if (!googleKeyValue) {\n // 同上\n googleKeyValue = new KeyValue(controlPositionValues, [\n google.maps.ControlPosition.TOP_LEFT,\n google.maps.ControlPosition.TOP_CENTER,\n google.maps.ControlPosition.TOP_RIGHT,\n google.maps.ControlPosition.BOTTOM_LEFT,\n google.maps.ControlPosition.BOTTOM_CENTER,\n google.maps.ControlPosition.BOTTOM_RIGHT,\n google.maps.ControlPosition.LEFT_TOP,\n google.maps.ControlPosition.LEFT_CENTER,\n google.maps.ControlPosition.LEFT_BOTTOM,\n google.maps.ControlPosition.RIGHT_TOP,\n google.maps.ControlPosition.RIGHT_CENTER,\n google.maps.ControlPosition.RIGHT_BOTTOM,\n ])\n }\n return googleKeyValue\n }\n}\n\n/**\n * 自定义的Control\n * @see BaiduMap.addCustomControl\n * @see GoogleMap.addCustomControl\n * */\nexport abstract class CustomControl {\n /** 实际添加到地图中的control对象 */\n inner?: UnionControl\n constructor(\n public position: ControlPosition,\n ) {\n noop()\n }\n /** 创建UI元素 */\n abstract onCreateElement(): HTMLElement\n}\n\n/** 内置的Control */\nexport abstract class AbstractControl {\n abstract isVisible(): boolean\n abstract setVisible(visible: boolean): void\n abstract getPosition(): ControlPosition\n abstract setPosition(position: ControlPosition): void\n abstract addTo(map: AbstractMap): void\n abstract removeFrom(map: AbstractMap): void\n}\n\n/** Control的空实现 */\nexport class EmptyControl extends AbstractControl {\n constructor(\n private visible: boolean,\n private position: ControlPosition,\n ) {\n super()\n }\n override isVisible(): boolean {\n return this.visible\n }\n override setVisible(visible: boolean): void {\n this.visible = visible\n }\n override getPosition(): ControlPosition {\n return this.position\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n }\n override addTo(_map: AbstractMap): void {\n }\n override removeFrom(_map: AbstractMap): void {\n }\n}\n\n/**\n * baidu内置的Control\n * - NavigationControl\n * - OverviewMapControl\n * - ScaleControl\n * - MapTypeControl\n * - CopyrightControl\n * - GeolocationControl\n */\nexport class BaiduControl<CONTROL extends BMap.Control = BMap.Control> extends AbstractControl {\n constructor(\n private inner: CONTROL,\n /** 由于@tg/map的position和baidu的position是多对一的关系, 为了防止set后再get, 得到不同的值, 应该用this.position保存set的值 */\n private position?: ControlPosition,\n ) {\n super()\n }\n override isVisible() {\n return this.inner.isVisible()\n }\n override setVisible(visible: boolean) {\n visible ? this.inner.show() : this.inner.hide()\n }\n override getPosition(): ControlPosition {\n return this.position ?? ControlPositionConverter.getBaidu().toKey(this.inner.getAnchor())\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n this.inner.setAnchor(ControlPositionConverter.getBaidu().toValue(position))\n }\n override addTo(map: BaiduMap): void {\n map.innerMap.addControl(this.inner)\n }\n override removeFrom(map: BaiduMap): void {\n map.innerMap.removeControl(this.inner)\n }\n}\n\nexport type GoogleControlType = 'zoom' | 'mapType' | 'scale' | 'streetView' | 'rotate' | 'fullscreen'\n\n/**\n * google内置的Control\n * - ZoomControl\n * - MapTypeControl\n * - ScaleControl\n * - StreetViewControl\n * - RotateControl\n * - FullscreenControl\n */\nexport class GoogleControl extends AbstractControl {\n visible = false\n private map: GoogleMap | undefined\n constructor(\n private _type: GoogleControlType,\n /** 每种类型的position的初始值不一样, 需要外部传入 */\n private position: ControlPosition,\n ) {\n super()\n }\n override isVisible(): boolean {\n return this.visible\n }\n override setVisible(visible: boolean): void {\n this.visible = visible\n this.tryUpdateOptions()\n }\n override getPosition(): ControlPosition {\n return this.position\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n this.tryUpdateOptions()\n }\n\n override addTo(map: GoogleMap): void {\n if (!this.map) {\n this.map = map\n this.setVisible(true)\n }\n }\n override removeFrom(/* map: GoogleMap */): void {\n if (this.map) {\n // 没有remove方法, 只能把visible设为false\n this.setVisible(false)\n this.map = undefined\n }\n }\n\n protected onCreateOptions(): any {\n return {\n position: ControlPositionConverter.getGoogle().toValue(this.position),\n }\n }\n\n protected tryUpdateOptions() {\n if (this.map) {\n this.map.innerMap.setOptions({\n [`${this._type}Control`]: this.visible,\n [`${this._type}ControlOptions`]: this.onCreateOptions(),\n })\n }\n }\n}\n","import { noop, throwUnsupported } from '../../utils/utils'\nimport { CachedValue, FastFindValues } from '../../utils/values'\nimport { CoordType } from '../lat-lng'\nimport type { Point } from '../types'\nimport type { GoogleLayer } from '../unions'\n\n/**\n * 内置地图的id\n */\nexport enum BuildInMapTypeId {\n normal = 'normal',\n satellite = 'satellite',\n hybrid = 'hybrid',\n}\n\n/**\n * 包括不兼容的地图类型\n * - 'terrain': google中为地形图, baidu中为三维图\n * */\nexport type BuildInMapTypeIdIncludeIncompatible = BuildInMapTypeId | 'terrain'\n\n/**\n * ## 注意\n * `asXxx()`多次调用时应返回同一个对象\n */\nexport interface MapType {\n /** MapType的唯一标识符, 命名时推荐包含`-`, 防止和BuildInMapTypeId冲突 */\n id: string\n\n getBaiduCoordType(): CoordType\n asBaiduMapType(): BaiduMapType\n\n getGoogleCoordType(): CoordType\n asGoogleMapType(): GoogleMapType\n}\n\nexport interface Layer {\n asBaiduLayer(): BMap.TileLayer\n asGoogleLayer(): GoogleLayer\n}\n\n/**\n * 同时实现`MapType`和`Layer`的对象被称作`OverlayMapType`\n * - 往google中添加`OverlayMapType`, 将被看作`MapType`\n * - 往baidu中添加`OverlayMapType`, 将被看作`Layer`\n * @see TgMap.addOverlayMapType\n * @see TgMap.removeOverlayMapType\n * @see ImageMapType\n */\nexport type OverlayMapType = MapType & Layer\n\nexport class BuildInMapType implements MapType {\n constructor(\n public id: BuildInMapTypeIdIncludeIncompatible,\n private baidu: () => BMap.MapType, // 需要延迟初始化, 故写成方法\n private google: () => google.maps.MapTypeId, // 同上\n private googleCoordType: CoordType,\n ) { noop() }\n\n getId() {\n return this.id\n }\n\n getBaiduCoordType() {\n // 百度地图的坐标都是bd09\n return CoordType.bd09\n }\n asBaiduMapType(): BaiduMapType {\n // 内置的MapType会做特殊处理, 不需要设置 __baidu_map_type__\n return this.baidu()\n }\n\n getGoogleCoordType() {\n return this.googleCoordType\n }\n /** 内置地图的id和google的id是不一样的 */\n getGoogleMapTypeId(): google.maps.MapTypeId {\n return this.google()\n }\n asGoogleMapType(): GoogleMapType {\n throwUnsupported('google的内置地图没有对应的实例')\n }\n}\nexport type GoogleMapType = google.maps.MapType & {\n /** 需要在创建实例时设置该值 */\n __google_map_type__?: MapType\n}\nexport type BaiduMapType = BMap.MapType & {\n /** 需要在创建实例时设置该值 */\n __baidu_map_type__?: MapType\n}\n\nexport interface ImageMapTypeOptions {\n readonly id: string\n /**\n * @param tileCoord 统一成google的瓦片坐标, 原点在左上角\n * @returns 返回值可以为空\n */\n getTileUrl: (tileCoord: Point, zoom: number) => string | null\n maxZoom: number\n minZoom?: number\n name: string\n describe?: string\n}\n\n/**\n * ImageMapType应该同时实现MapType和Layer接口\n */\nexport class ImageMapType implements OverlayMapType {\n private baiduLayerCached = new CachedValue(() => {\n const layer = new BMap.TileLayer({})\n layer.getTilesUrl = (tileCoord: BMap.Pixel, zoom: number): string => {\n // 转换成google形式的瓦片坐标\n // x: -2,-1,0,1 => 0,1,2,3\n // y: 1,0,-1,-2 => 0,1,2,3\n const halfTileRange = Math.pow(2, zoom - 1)\n const x = tileCoord.x + halfTileRange\n const y = halfTileRange - 1 - tileCoord.y\n return this.options.getTileUrl({ x, y }, zoom)! // 返回值为空也没有问题, 可以强转\n }\n return layer\n })\n private baiduMapTypeCached = new CachedValue(() => {\n const baiduMapType: BaiduMapType = new BMap.MapType(this.options.name, this.baiduLayerCached.get(), {\n maxZoom: this.options.maxZoom,\n minZoom: this.options.minZoom,\n tips: this.options.describe,\n })\n baiduMapType.__baidu_map_type__ = this\n return baiduMapType\n })\n private googleCached = new CachedValue(() => {\n const googleMapType: GoogleMapType = new google.maps.ImageMapType({\n getTileUrl: (tileCoord: google.maps.Point, zoom: number): string => {\n return this.options.getTileUrl(tileCoord, zoom)! // 同上\n },\n tileSize: new google.maps.Size(256, 256),\n name: this.options.name,\n alt: this.options.describe,\n maxZoom: this.options.maxZoom,\n minZoom: this.options.minZoom,\n })\n googleMapType.__google_map_type__ = this\n return googleMapType\n })\n constructor(\n public coordType: CoordType,\n public options: ImageMapTypeOptions,\n ) {\n noop()\n }\n get id() {\n return this.options.id\n }\n\n getBaiduCoordType() {\n return this.coordType\n }\n asBaiduMapType(): BaiduMapType {\n return this.baiduMapTypeCached.get()\n }\n asBaiduLayer(): BMap.TileLayer {\n return this.baiduLayerCached.get()\n }\n\n getGoogleCoordType() {\n return this.coordType\n }\n asGoogleMapType(): GoogleMapType {\n return this.googleCached.get()\n }\n asGoogleLayer(): GoogleLayer {\n throwUnsupported('这个方法不会被调用')\n }\n}\n\n/** 交通流量图层 */\nexport class TrafficLayer implements Layer {\n private baiduCache = new CachedValue(() => new BMap.TrafficLayer())\n private googleCache = new CachedValue(() => new google.maps.TrafficLayer())\n asBaiduLayer(): BMap.TileLayer {\n return this.baiduCache.get()\n }\n asGoogleLayer(): GoogleLayer {\n return this.googleCache.get()\n }\n}\n\nexport namespace MapType {\n export const NORMAL = new BuildInMapType(BuildInMapTypeId.normal, () => BMAP_NORMAL_MAP, () => google.maps.MapTypeId.ROADMAP, CoordType.gcj02)\n export const SATELLITE = new BuildInMapType(BuildInMapTypeId.satellite, () => BMAP_SATELLITE_MAP, () => google.maps.MapTypeId.SATELLITE, CoordType.wgs84)\n export const HYBRID = new BuildInMapType(BuildInMapTypeId.hybrid, () => BMAP_HYBRID_MAP, () => google.maps.MapTypeId.HYBRID, CoordType.gcj02)\n export const TERRAIN = new BuildInMapType('terrain', () => /* 三维 */BMAP_PERSPECTIVE_MAP, () => /* 地形 */google.maps.MapTypeId.TERRAIN, CoordType.wgs84)\n export const BUILD_IN_MAP_TYPES = new FastFindValues([NORMAL, SATELLITE, HYBRID, TERRAIN])\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { BuildInMapType, MapType } from '../map-type'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface MapTypeControl extends AbstractControl {\n}\n\nexport enum MapTypeControlType {\n DEFAULT = 'default',\n HORIZONTAL = 'horizontal',\n DROPDOWN = 'dropdown',\n}\n\nconst MAP_TYPES_DEFAULT = [MapType.NORMAL, MapType.SATELLITE, MapType.HYBRID]\n\nexport interface MapTypeControlOptions {\n position?: ControlPosition\n type?: MapTypeControlType\n /** @default MAP_TYPES_DEFAULT 这有这些mapTypes才是各种地图都兼容的 */\n mapTypes?: MapType[]\n}\n\nexport class BaiduMapTypeControl extends BaiduControl<BMap.MapTypeControl> implements MapTypeControl {\n static create(this: BaiduMap, options: MapTypeControlOptions) {\n const mapTypes = options.mapTypes ?? MAP_TYPES_DEFAULT\n const type2baidu = {\n [MapTypeControlType.DEFAULT]: BMAP_MAPTYPE_CONTROL_HORIZONTAL,\n [MapTypeControlType.HORIZONTAL]: BMAP_MAPTYPE_CONTROL_HORIZONTAL,\n [MapTypeControlType.DROPDOWN]: BMAP_MAPTYPE_CONTROL_DROPDOWN,\n }\n const inner = new BMap.MapTypeControl({\n type: options.type && type2baidu[options.type],\n mapTypes: mapTypes.map(it => it.asBaiduMapType()),\n })\n if (options.position) {\n inner.setAnchor(ControlPositionConverter.getBaidu().toValue(options.position))\n }\n return new BaiduMapTypeControl(inner, options.position)\n }\n}\n\nexport class GoogleMapTypeControl extends GoogleControl implements MapTypeControl {\n static create(this: GoogleMap, options: MapTypeControlOptions) {\n return new GoogleMapTypeControl(options.type, options.position, options.mapTypes)\n }\n private static type2google: { [k in MapTypeControlType]: google.maps.MapTypeControlStyle }\n constructor(\n public type: MapTypeControlType = MapTypeControlType.DEFAULT,\n position: ControlPosition = ControlPosition.TOP_LEFT,\n private mapTypes: MapType[] = MAP_TYPES_DEFAULT,\n ) {\n super('mapType', position)\n if (!GoogleMapTypeControl.type2google) {\n GoogleMapTypeControl.type2google = {\n [MapTypeControlType.DEFAULT]: google.maps.MapTypeControlStyle.DEFAULT,\n [MapTypeControlType.HORIZONTAL]: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,\n [MapTypeControlType.DROPDOWN]: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\n }\n }\n }\n override onCreateOptions(): any {\n const options: google.maps.MapTypeControlOptions = super.onCreateOptions()\n options.style = GoogleMapTypeControl.type2google[this.type]\n options.mapTypeIds = this.mapTypes.map(it => it instanceof BuildInMapType ? it.getGoogleMapTypeId() : it.id)\n return options\n }\n override addTo(map: GoogleMap): void {\n super.addTo(map)\n this.mapTypes.forEach(mapType => {\n if (!(mapType instanceof BuildInMapType)) {\n // 非内置地图需要注册地图实例\n map.innerMap.mapTypes.set(mapType.id, mapType.asGoogleMapType())\n }\n })\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface ScaleControl extends AbstractControl {\n\n}\n\nexport interface ScaleControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduScaleControl extends BaiduControl implements ScaleControl {\n static create(this: BaiduMap, options: ScaleControlOptions) {\n const inner = new BMap.ScaleControl({\n anchor: options.position && ControlPositionConverter.getBaidu().toValue(options.position),\n })\n return new BaiduScaleControl(inner, options.position)\n }\n}\n\nexport class GoogleScaleControl extends GoogleControl implements ScaleControl {\n static create(this: GoogleMap, options: ScaleControlOptions) {\n return new GoogleScaleControl(options.position)\n }\n\n constructor(position: ControlPosition = ControlPosition.BOTTOM_RIGHT) {\n super('scale', position)\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, ControlPosition, EmptyControl, GoogleControl } from './control'\n\n/**\n * ## 不同实现\n * - google: 支持街景控件\n * - baidu: 不支持, {@link BaiduStreetViewControl}是一个空实现\n */\nexport interface StreetViewControl extends AbstractControl {\n}\n\nexport interface StreetViewControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduStreetViewControl extends EmptyControl implements StreetViewControl {\n static create(this: BaiduMap, options: StreetViewControlOptions) {\n return new BaiduStreetViewControl(true, options.position ?? ControlPosition.RIGHT_BOTTOM)\n }\n}\n\nexport class GoogleStreetViewControl extends GoogleControl implements StreetViewControl {\n static create(this: GoogleMap, options: StreetViewControlOptions) {\n return new GoogleStreetViewControl(options.position)\n }\n constructor(position: ControlPosition = ControlPosition.RIGHT_BOTTOM) {\n super('streetView', position)\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface ZoomControl extends AbstractControl {\n}\n\nexport interface ZoomControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduZoomControl extends BaiduControl<BMap.NavigationControl> implements ZoomControl {\n static create(this: BaiduMap, options: ZoomControlOptions) {\n const inner = new BMap.NavigationControl({\n type: BMAP_NAVIGATION_CONTROL_ZOOM,\n // enableGeolocation: true,\n anchor: options.position && ControlPositionConverter.getBaidu().toValue(options.position),\n })\n return new BaiduZoomControl(inner, options.position)\n }\n}\n\nexport class GoogleZoomControl extends GoogleControl implements ZoomControl {\n static create(this: GoogleMap, options: ZoomControlOptions) {\n return new GoogleZoomControl(options.position)\n }\n constructor(position: ControlPosition = ControlPosition.RIGHT_BOTTOM) {\n super('zoom', position)\n }\n}\n","import { LatLng, type CoordTypeSupplier } from '../map/lat-lng'\nimport type { Place } from '../map/map/extra/places-service'\n\n/**\n * Google地图官方提供的载入方式, 使用{@link google.map.importLibrary}动态载入依赖\n *\n * 实验性的特性, 实测当前只有`3.52`版支持\n *\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api#dynamic-library-import\n */\nexport function initGoogleMapDynamicLibraryImport(args: {\n key: string,\n v?: string,\n // Add other bootstrap parameters as needed, using camel case.\n // Use the 'v' parameter to indicate the version to load (alpha, beta, weekly, etc.)\n}) {\n let promise: Promise<unknown> | undefined | void\n let script\n let arg\n const googleTitle = 'The Google Maps JavaScript API'\n const googleName = 'google'\n const importMethod = 'importLibrary'\n const callbackId = '__ib__'\n const dom = document\n const global: any = window\n const google: any = global[googleName] || (global[googleName] = {})\n const googleMaps = google.maps || (google.maps = {})\n const libraries = new Set()\n const url = new URLSearchParams()\n // eslint-disable-next-line no-async-promise-executor\n const loader = () => promise || (promise = new Promise(async(resolve, reject) => {\n await (script = dom.createElement('script'))\n url.set('libraries', [...libraries] + '')\n for (arg in args) url.set(arg.replace(/[A-Z]/g, t => '_' + t[0].toLowerCase()), (args as any)[arg])\n url.set('callback', googleName + '.maps.' + callbackId)\n script.src = `https://maps.${googleName}apis.com/maps/api/js?` + url\n googleMaps[callbackId] = resolve\n // eslint-disable-next-line no-return-assign\n script.onerror = () => promise = reject(Error(googleTitle + ' could not load.'))\n script.nonce = (dom.querySelector('script[nonce]') as HTMLScriptElement)?.nonce || ''\n dom.head.append(script)\n }))\n googleMaps[importMethod]\n ? console.warn(googleTitle + ' only loads once. Ignoring:', args)\n : googleMaps[importMethod] = (library: string, ...rest: string[]) => libraries.add(library) && loader().then(() => googleMaps[importMethod](library, ...rest))\n}\n\nlet _LATLNG_ZERO: google.maps.LatLng | undefined\nlet _BOUNDS_ZERO: google.maps.LatLngBounds | undefined\n\nexport const GoogleConst = {\n /** Google的坐标0点 */\n get LATLNG_ZERO() {\n return (_LATLNG_ZERO ??= new google.maps.LatLng({ lat: 0, lng: 0 }))\n },\n get BOUNDS_ZERO() {\n return (_BOUNDS_ZERO ??= new google.maps.LatLngBounds(this.LATLNG_ZERO, this.LATLNG_ZERO))\n },\n}\n\nexport interface AddressFields{\n /** 国家 */\n country: string\n /** 省 */\n province: string\n /** 市 */\n city: string\n /** 区 */\n district: string\n /** 街道 */\n street: string\n /** 门牌号 */\n streetNumber: string\n}\n\nexport function parseGoogleAddressComponents(\n addressComponents: google.maps.GeocoderAddressComponent[],\n outResult: AddressFields = { country: '', province: '', city: '', district: '', street: '', streetNumber: '' },\n): AddressFields {\n for (const component of addressComponents) {\n for (const type of component.types) {\n switch (type) {\n case 'street_number':\n outResult.streetNumber = component.long_name\n break\n case 'route':\n outResult.street = component.long_name\n break\n case 'locality':\n outResult.city = component.long_name\n break\n case 'sublocality':\n outResult.district = component.long_name\n break\n case 'administrative_area_level_1':\n outResult.province = component.long_name\n break\n case 'country':\n outResult.country = component.long_name\n break\n }\n }\n }\n return outResult\n}\n\nexport function parseGooglePlace(place: google.maps.places.PlaceResult, coordTypeSupplier: CoordTypeSupplier) : Place {\n const fields = place.address_components && parseGoogleAddressComponents(place.address_components)\n return {\n country: fields?.country ?? '',\n province: fields?.province ?? '',\n city: fields?.city ?? '',\n id: place.place_id ?? '',\n address: place.formatted_address ?? '',\n position: LatLng.fromGoogle(place.geometry?.location ?? GoogleConst.LATLNG_ZERO, coordTypeSupplier.coordType),\n title: place.name ?? '',\n }\n}\n","import type { EventCallback, LatLngBounds } from '../../../components'\nimport { parseGoogleAddressComponents, type AddressFields } from '../../../utils/google-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Tg } from '../../event'\nimport { addBaiduEventListener, addGoogleEventListener, addHtmlEventListener, addTgEventListener, type RemoveEventListenerFunction } from '../../event-target'\nimport type { UnionAutocomplete } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport interface AutocompleteResult extends AddressFields {\n /** 名字 */\n title: string\n}\n\nexport interface AutocompleteOptions {\n input: HTMLInputElement\n /** 将{@link Autocomplete.setBounds}自动设为地图的当前范围 */\n bindToMap?: boolean\n}\n\n/**\n * 该类没有太多事件, 故没有去实现{@link Tg.EventTarget}接口\n */\nexport abstract class Autocomplete {\n abstract inner: UnionAutocomplete\n abstract map: AbstractMap\n\n abstract addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction\n abstract setBounds(bounds: LatLngBounds):void\n}\n\nexport class GoogleAutocomplete extends Autocomplete {\n inner: google.maps.places.Autocomplete\n constructor(public map: GoogleMap, options: AutocompleteOptions) {\n super()\n this.inner = new google.maps.places.Autocomplete(options.input, {\n fields: [\n 'address_components',\n // 'formatted_address',\n 'name',\n ],\n })\n if (options.bindToMap) {\n this.inner.bindTo('bounds', map.innerMap)\n }\n }\n\n override setBounds(bounds: LatLngBounds): void {\n this.inner.setBounds(bounds.toGoogle(this.map.coordType))\n }\n\n override addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction {\n return addGoogleEventListener(this.inner, 'place_changed', () => {\n const place = this.inner.getPlace()\n const result: AutocompleteResult = {\n title: place.name ?? '',\n province: '',\n city: '',\n district: '',\n street: '',\n streetNumber: '',\n country: '',\n }\n if (place.address_components) {\n // 包含地址字段才是从下拉框选择的, 否则是直接回车的结果\n parseGoogleAddressComponents(place.address_components, result)\n }\n listener(result)\n })\n }\n}\nexport class BaiduAutocomplete extends Autocomplete {\n inner: BMap.Autocomplete\n private input: HTMLInputElement\n // TODO: 要不要添加个移除监听的方法?\n private removeableArray: RemoveEventListenerFunction[] = []\n constructor(public map: BaiduMap, options: AutocompleteOptions) {\n super()\n this.input = options.input\n this.inner = new BMap.Autocomplete({\n input: options.input,\n location: options.bindToMap ? map.innerMap : undefined,\n })\n if (options.bindToMap) {\n const onBoundsChanged = () => {\n this.inner.setLocation(this.map.innerMap)\n }\n this.removeableArray.push(addTgEventListener(this.map, 'center-changed', onBoundsChanged))\n this.removeableArray.push(addTgEventListener(this.map, 'zoom-changed', onBoundsChanged))\n }\n }\n\n override setBounds(bounds: LatLngBounds): void {\n this.inner.setLocation(bounds.getCenter().toBaidu(this.map.coordType))\n }\n\n override addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction {\n let confirmEventTimestamp = 0\n const removeOnConfirm = addBaiduEventListener(this.inner, 'confirm', (event: { item: { value: BMap.AutocompleteResultPoi } }) => {\n const place = event.item.value\n confirmEventTimestamp = Date.now()\n listener(Object.assign({\n title: place.business,\n country: '', // Baidu的自动完成只支持中国\n }, place))\n })\n // 模仿google, 回车也触发监听\n const removeOnKeyup = addHtmlEventListener(this.input, 'keyup', (event) => {\n if (event.key === 'Enter') {\n if (Date.now() - confirmEventTimestamp > 100) {\n listener({\n title: this.input.value,\n country: '',\n city: '',\n district: '',\n province: '',\n street: '',\n streetNumber: '',\n })\n } else {\n // Enter同时触发了confirm事件, 则需要忽略\n }\n }\n })\n\n return () => {\n removeOnKeyup()\n removeOnConfirm()\n }\n }\n}\n","/*\n * heatmap.js v2.0.0 | JavaScript Heatmap Library\n *\n * Copyright 2008-2014 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved.\n * Dual licensed under MIT and Beerware license \n *\n * :: 2014-10-31 21:16\n */\n(function (root, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n root.BMapLib = root.BMapLib || {};\n root.BMapLib.Heatmap = root.BMapLib.Heatmap || factory();\n }\n})(this, function () {\n const heatmapFactory = (function () {\n // Heatmap Config stores default values and will be merged with instance config\n var HeatmapConfig = {\n defaultRadius: 40,\n defaultRenderer: 'canvas2d',\n defaultGradient: { 0.45: \"rgb(0,0,255)\", 0.55: \"rgb(0,255,255)\", 0.65: \"rgb(0,255,0)\", 0.95: \"yellow\", 1.0: \"rgb(255,0,0)\" },\n defaultMaxOpacity: 1,\n defaultMinOpacity: 0,\n defaultBlur: .85,\n defaultXField: 'x',\n defaultYField: 'y',\n defaultValueField: 'value',\n plugins: {}\n };\n var Store = (function StoreClosure() {\n\n var Store = function Store(config) {\n this._coordinator = {};\n this._data = [];\n this._radi = [];\n this._min = 0;\n this._max = 1;\n this._xField = config['xField'] || config.defaultXField;\n this._yField = config['yField'] || config.defaultYField;\n this._valueField = config['valueField'] || config.defaultValueField;\n\n if (config[\"radius\"]) {\n this._cfgRadius = config[\"radius\"];\n }\n };\n\n var defaultRadius = HeatmapConfig.defaultRadius;\n\n Store.prototype = {\n // when forceRender = false -> called from setData, omits renderall event\n _organiseData: function (dataPoint, forceRender) {\n var x = dataPoint[this._xField];\n var y = dataPoint[this._yField];\n var radi = this._radi;\n var store = this._data;\n var max = this._max;\n var min = this._min;\n var value = dataPoint[this._valueField] || 1;\n var radius = dataPoint.radius || this._cfgRadius || defaultRadius;\n\n if (!store[x]) {\n store[x] = [];\n radi[x] = [];\n }\n\n if (!store[x][y]) {\n store[x][y] = value;\n radi[x][y] = radius;\n } else {\n store[x][y] += value;\n }\n\n if (store[x][y] > max) {\n if (!forceRender) {\n this._max = store[x][y];\n } else {\n this.setDataMax(store[x][y]);\n }\n return false;\n } else {\n return {\n x: x,\n y: y,\n value: value,\n radius: radius,\n min: min,\n max: max\n };\n }\n },\n _unOrganizeData: function () {\n var unorganizedData = [];\n var data = this._data;\n var radi = this._radi;\n\n for (var x in data) {\n for (var y in data[x]) {\n\n unorganizedData.push({\n x: x,\n y: y,\n radius: radi[x][y],\n value: data[x][y]\n });\n\n }\n }\n return {\n min: this._min,\n max: this._max,\n data: unorganizedData\n };\n },\n _onExtremaChange: function () {\n this._coordinator.emit('extremachange', {\n min: this._min,\n max: this._max\n });\n },\n addData: function () {\n if (arguments[0].length > 0) {\n var dataArr = arguments[0];\n var dataLen = dataArr.length;\n while (dataLen--) {\n this.addData.call(this, dataArr[dataLen]);\n }\n } else {\n // add to store \n var organisedEntry = this._organiseData(arguments[0], true);\n if (organisedEntry) {\n this._coordinator.emit('renderpartial', {\n min: this._min,\n max: this._max,\n data: [organisedEntry]\n });\n }\n }\n return this;\n },\n setData: function (data) {\n var dataPoints = data.data;\n var pointsLen = dataPoints.length;\n\n\n // reset data arrays\n this._data = [];\n this._radi = [];\n\n for (var i = 0; i < pointsLen; i++) {\n this._organiseData(dataPoints[i], false);\n }\n this._max = data.max;\n this._min = data.min || 0;\n\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n removeData: function () {\n // TODO: implement\n },\n setDataMax: function (max) {\n this._max = max;\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n setDataMin: function (min) {\n this._min = min;\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n setCoordinator: function (coordinator) {\n this._coordinator = coordinator;\n },\n _getInternalData: function () {\n return {\n max: this._max,\n min: this._min,\n data: this._data,\n radi: this._radi\n };\n },\n getData: function () {\n return this._unOrganizeData();\n }/*,\n\n // TODO: rethink.\n getValueAt: function (point) {\n var value;\n var radius = 100;\n var x = point.x;\n var y = point.y;\n var data = this._data;\n\n if (data[x] && data[x][y]) {\n return data[x][y];\n } else {\n var values = [];\n // radial search for datapoints based on default radius\n for (var distance = 1; distance < radius; distance++) {\n var neighbors = distance * 2 + 1;\n var startX = x - distance;\n var startY = y - distance;\n\n for (var i = 0; i < neighbors; i++) {\n for (var o = 0; o < neighbors; o++) {\n if ((i == 0 || i == neighbors - 1) || (o == 0 || o == neighbors - 1)) {\n if (data[startY + i] && data[startY + i][startX + o]) {\n values.push(data[startY + i][startX + o]);\n }\n } else {\n continue;\n }\n }\n }\n }\n if (values.length > 0) {\n return Math.max.apply(Math, values);\n }\n }\n return false;\n }*/\n };\n\n\n return Store;\n })();\n\n var Canvas2dRenderer = (function Canvas2dRendererClosure() {\n\n var _getColorPalette = function (config) {\n var gradientConfig = config.gradient || config.defaultGradient;\n var paletteCanvas = document.createElement('canvas');\n var paletteCtx = paletteCanvas.getContext('2d');\n\n paletteCanvas.width = 256;\n paletteCanvas.height = 1;\n\n var gradient = paletteCtx.createLinearGradient(0, 0, 256, 1);\n for (var key in gradientConfig) {\n gradient.addColorStop(key, gradientConfig[key]);\n }\n\n paletteCtx.fillStyle = gradient;\n paletteCtx.fillRect(0, 0, 256, 1);\n\n return paletteCtx.getImageData(0, 0, 256, 1).data;\n };\n\n var _getPointTemplate = function (radius, blurFactor) {\n var tplCanvas = document.createElement('canvas');\n var tplCtx = tplCanvas.getContext('2d');\n var x = radius;\n var y = radius;\n tplCanvas.width = tplCanvas.height = radius * 2;\n\n if (blurFactor == 1) {\n tplCtx.beginPath();\n tplCtx.arc(x, y, radius, 0, 2 * Math.PI, false);\n tplCtx.fillStyle = 'rgba(0,0,0,1)';\n tplCtx.fill();\n } else {\n var gradient = tplCtx.createRadialGradient(x, y, radius * blurFactor, x, y, radius);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n tplCtx.fillStyle = gradient;\n tplCtx.fillRect(0, 0, 2 * radius, 2 * radius);\n }\n\n\n\n return tplCanvas;\n };\n\n var _prepareData = function (data) {\n var renderData = [];\n var min = data.min;\n var max = data.max;\n var radi = data.radi;\n var data = data.data;\n\n var xValues = Object.keys(data);\n var xValuesLen = xValues.length;\n\n while (xValuesLen--) {\n var xValue = xValues[xValuesLen];\n var yValues = Object.keys(data[xValue]);\n var yValuesLen = yValues.length;\n while (yValuesLen--) {\n var yValue = yValues[yValuesLen];\n var value = data[xValue][yValue];\n var radius = radi[xValue][yValue];\n renderData.push({\n x: xValue,\n y: yValue,\n value: value,\n radius: radius\n });\n }\n }\n\n return {\n min: min,\n max: max,\n data: renderData\n };\n };\n\n\n function Canvas2dRenderer(config) {\n var container = config.element;\n var shadowCanvas = this.shadowCanvas = document.createElement('canvas');\n var canvas = this.canvas = config.canvas || document.createElement('canvas');\n var renderBoundaries = this._renderBoundaries = [10000, 10000, 0, 0];\n\n var computed = getComputedStyle(config.element) || {};\n\n canvas.className = 'heatmap-canvas';\n\n this._width = canvas.width = shadowCanvas.width = +(computed.width.replace(/px/, ''));\n this._height = canvas.height = shadowCanvas.height = +(computed.height.replace(/px/, ''));\n\n this.shadowCtx = shadowCanvas.getContext('2d');\n this.ctx = canvas.getContext('2d');\n\n // @TODO:\n // conditional wrapper\n\n canvas.style.cssText = shadowCanvas.style.cssText = 'position:absolute;left:0;top:0;';\n\n container.style.position = 'relative';\n container.appendChild(canvas);\n\n this._palette = _getColorPalette(config);\n this._templates = {};\n\n this._setStyles(config);\n };\n\n Canvas2dRenderer.prototype = {\n renderPartial: function (data) {\n this._drawAlpha(data);\n this._colorize();\n },\n renderAll: function (data) {\n // reset render boundaries\n this._clear();\n this._drawAlpha(_prepareData(data));\n this._colorize();\n },\n _updateGradient: function (config) {\n this._palette = _getColorPalette(config);\n },\n updateConfig: function (config, oldConfig) {\n if (config.gradient !== oldConfig.gradient) {\n this._updateGradient(config);\n }\n this._setStyles(config);\n },\n setDimensions: function (width, height) {\n this._width = width;\n this._height = height;\n this.canvas.width = this.shadowCanvas.width = width;\n this.canvas.height = this.shadowCanvas.height = height;\n },\n _clear: function () {\n this.shadowCtx.clearRect(0, 0, this._width, this._height);\n this.ctx.clearRect(0, 0, this._width, this._height);\n },\n _setStyles: function (config) {\n this._blur = (config.blur == 0) ? 0 : (config.blur || config.defaultBlur);\n\n if (config.backgroundColor) {\n this.canvas.style.backgroundColor = config.backgroundColor;\n }\n\n this._opacity = (config.opacity || 0) * 255;\n this._maxOpacity = (config.maxOpacity || config.defaultMaxOpacity) * 255;\n this._minOpacity = (config.minOpacity || config.defaultMinOpacity) * 255;\n this._useGradientOpacity = !!config.useGradientOpacity;\n },\n _drawAlpha: function (data) {\n var min = this._min = data.min;\n var max = this._max = data.max;\n var data = data.data || [];\n var dataLen = data.length;\n // on a point basis?\n var blur = 1 - this._blur;\n\n while (dataLen--) {\n\n var point = data[dataLen];\n\n var x = point.x;\n var y = point.y;\n var radius = point.radius;\n // if value is bigger than max\n // use max as value\n var value = Math.min(point.value, max);\n var rectX = x - radius;\n var rectY = y - radius;\n var shadowCtx = this.shadowCtx;\n\n\n\n\n var tpl;\n if (!this._templates[radius]) {\n this._templates[radius] = tpl = _getPointTemplate(radius, blur);\n } else {\n tpl = this._templates[radius];\n }\n // value from minimum / value range\n // => [0, 1]\n shadowCtx.globalAlpha = (value - min) / (max - min);\n\n shadowCtx.drawImage(tpl, rectX, rectY);\n\n // update renderBoundaries\n if (rectX < this._renderBoundaries[0]) {\n this._renderBoundaries[0] = rectX;\n }\n if (rectY < this._renderBoundaries[1]) {\n this._renderBoundaries[1] = rectY;\n }\n if (rectX + 2 * radius > this._renderBoundaries[2]) {\n this._renderBoundaries[2] = rectX + 2 * radius;\n }\n if (rectY + 2 * radius > this._renderBoundaries[3]) {\n this._renderBoundaries[3] = rectY + 2 * radius;\n }\n\n }\n },\n _colorize: function () {\n var x = this._renderBoundaries[0];\n var y = this._renderBoundaries[1];\n var width = this._renderBoundaries[2] - x;\n var height = this._renderBoundaries[3] - y;\n var maxWidth = this._width;\n var maxHeight = this._height;\n var opacity = this._opacity;\n var maxOpacity = this._maxOpacity;\n var minOpacity = this._minOpacity;\n var useGradientOpacity = this._useGradientOpacity;\n\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n if (x + width > maxWidth) {\n width = maxWidth - x;\n }\n if (y + height > maxHeight) {\n height = maxHeight - y;\n }\n\n var img = this.shadowCtx.getImageData(x, y, width, height);\n var imgData = img.data;\n var len = imgData.length;\n var palette = this._palette;\n\n\n for (var i = 3; i < len; i += 4) {\n var alpha = imgData[i];\n var offset = alpha * 4;\n\n\n if (!offset) {\n continue;\n }\n\n var finalAlpha;\n if (opacity > 0) {\n finalAlpha = opacity;\n } else {\n if (alpha < maxOpacity) {\n if (alpha < minOpacity) {\n finalAlpha = minOpacity;\n } else {\n finalAlpha = alpha;\n }\n } else {\n finalAlpha = maxOpacity;\n }\n }\n\n imgData[i - 3] = palette[offset];\n imgData[i - 2] = palette[offset + 1];\n imgData[i - 1] = palette[offset + 2];\n imgData[i] = useGradientOpacity ? palette[offset + 3] : finalAlpha;\n\n }\n\n this.ctx.putImageData(img, x, y);\n\n this._renderBoundaries = [1000, 1000, 0, 0];\n\n },\n getValueAt: function (point) {\n var value;\n var shadowCtx = this.shadowCtx;\n var img = shadowCtx.getImageData(point.x, point.y, 1, 1);\n var data = img.data[3];\n var max = this._max;\n var min = this._min;\n\n value = (Math.abs(max - min) * (data / 255)) >> 0;\n\n return value;\n },\n getDataURL: function () {\n return this.canvas.toDataURL();\n }\n };\n\n\n return Canvas2dRenderer;\n })();\n\n var Renderer = (function RendererClosure() {\n\n var rendererFn = false;\n\n if (HeatmapConfig['defaultRenderer'] === 'canvas2d') {\n rendererFn = Canvas2dRenderer;\n }\n\n return rendererFn;\n })();\n\n\n var Util = {\n merge: function () {\n var merged = {};\n var argsLen = arguments.length;\n for (var i = 0; i < argsLen; i++) {\n var obj = arguments[i]\n for (var key in obj) {\n merged[key] = obj[key];\n }\n }\n return merged;\n }\n };\n // Heatmap Constructor\n var Heatmap = (function HeatmapClosure() {\n\n var Coordinator = (function CoordinatorClosure() {\n\n function Coordinator() {\n this.cStore = {};\n };\n\n Coordinator.prototype = {\n on: function (evtName, callback, scope) {\n var cStore = this.cStore;\n\n if (!cStore[evtName]) {\n cStore[evtName] = [];\n }\n cStore[evtName].push((function (data) {\n return callback.call(scope, data);\n }));\n },\n emit: function (evtName, data) {\n var cStore = this.cStore;\n if (cStore[evtName]) {\n var len = cStore[evtName].length;\n for (var i = 0; i < len; i++) {\n var callback = cStore[evtName][i];\n callback(data);\n }\n }\n }\n };\n\n return Coordinator;\n })();\n\n\n var _connect = function (scope) {\n var renderer = scope._renderer;\n var coordinator = scope._coordinator;\n var store = scope._store;\n\n coordinator.on('renderpartial', renderer.renderPartial, renderer);\n coordinator.on('renderall', renderer.renderAll, renderer);\n coordinator.on('extremachange', function (data) {\n scope._config.onExtremaChange &&\n scope._config.onExtremaChange({\n min: data.min,\n max: data.max,\n gradient: scope._config['gradient'] || scope._config['defaultGradient']\n });\n });\n store.setCoordinator(coordinator);\n };\n\n\n function Heatmap() {\n var config = this._config = Util.merge(HeatmapConfig, arguments[0] || {});\n this._coordinator = new Coordinator();\n if (config['plugin']) {\n var pluginToLoad = config['plugin'];\n if (!HeatmapConfig.plugins[pluginToLoad]) {\n throw new Error('Plugin \\'' + pluginToLoad + '\\' not found. Maybe it was not registered.');\n } else {\n var plugin = HeatmapConfig.plugins[pluginToLoad];\n // set plugin renderer and store\n this._renderer = new plugin.renderer(config);\n this._store = new plugin.store(config);\n }\n } else {\n this._renderer = new Renderer(config);\n this._store = new Store(config);\n }\n _connect(this);\n };\n\n // @TODO:\n // add API documentation\n Heatmap.prototype = {\n addData: function () {\n this._store.addData.apply(this._store, arguments);\n return this;\n },\n removeData: function () {\n this._store.removeData && this._store.removeData.apply(this._store, arguments);\n return this;\n },\n setData: function () {\n this._store.setData.apply(this._store, arguments);\n return this;\n },\n setDataMax: function () {\n this._store.setDataMax.apply(this._store, arguments);\n return this;\n },\n setDataMin: function () {\n this._store.setDataMin.apply(this._store, arguments);\n return this;\n },\n configure: function (config) {\n const oldConfig = this._config\n this._config = Util.merge(this._config, config);\n this._renderer.updateConfig(this._config, oldConfig);\n this._coordinator.emit('renderall', this._store._getInternalData());\n return this;\n },\n repaint: function () {\n this._coordinator.emit('renderall', this._store._getInternalData());\n return this;\n },\n getData: function () {\n return this._store.getData();\n },\n getDataURL: function () {\n return this._renderer.getDataURL();\n },\n getValueAt: function (point) {\n\n if (this._store.getValueAt) {\n return this._store.getValueAt(point);\n } else if (this._renderer.getValueAt) {\n return this._renderer.getValueAt(point);\n } else {\n return null;\n }\n }\n };\n\n return Heatmap;\n\n })();\n\n\n // core\n var heatmapFactory = {\n create: function (config) {\n return new Heatmap(config);\n },\n register: function (pluginKey, plugin) {\n HeatmapConfig.plugins[pluginKey] = plugin;\n }\n };\n\n return heatmapFactory;\n\n\n })()\n\n\n\n\n\n\n /*==============================以上部分为heatmap.js的核心代码,只负责热力图的展现====================================*/\n\n\n /*==============================以下部分为专为百度地图打造的覆盖物===================================================*/\n /**\n * @fileoverview 百度地图的热力图功能,对外开放。\n * 主要基于http://www.patrick-wied.at/static/heatmapjs/index.html 修改而得\n \n * 主入口类是<a href=\"symbols/BMapLib.Heatmap.html\">Heatmap</a>,\n * 基于Baidu Map API 2.0。\n *\n * @author Baidu Map Api Group\n * @version 1.0\n */\n\n /**\n * 热力图的覆盖物\n * @class 热力图的覆盖物\n * 实例化该类后,使用map.addOverlay即可以添加热力图\n * \n * @constructor\n * @param {Json Object} opts 可选的输入参数,非必填项。可输入选项包括:<br />\n * {\"<b>radius</b>\" : {String} 热力图的半径,\n * <br />\"<b>visible</b>\" : {Number} 热力图是否显示,\n * <br />\"<b>gradient</b>\" : {JSON} 热力图的渐变区间,\n * <br />\"<b>opacity</b>\" : {Number} 热力的透明度,\n *\n * @example <b>参考示例:</b><br />\n * var map = new BMap.Map(\"container\");<br />map.centerAndZoom(new BMap.Point(116.404, 39.915), 15);<br />var heatmapOverlay = new BMapLib.HeatmapOverlay({\"radius\":10, \"visible\":true, \"opacity\":70});<br />heatmapOverlay.setDataSet(data);//data是热力图的详细数据\n */\n\n var HeatmapOverlay = function (opts) {\n if (Reflect.getPrototypeOf(HeatmapOverlay.prototype) !== BMap.Overlay.prototype) {\n // 保证让HeatmapOverlay继承BMap.Overlay\n // 根据文档, 修改原型链会降低访问属性的速度, 但这种写法对代码的修改最少, 故采用\n // @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf\n Reflect.setPrototypeOf(HeatmapOverlay.prototype, BMap.Overlay.prototype)\n }\n this.conf = opts;\n this.conf.visible = opts.visible === undefined ? true : opts.visible;\n this.heatmap = null;\n this.latlngs = [];\n this.bounds = null;\n }\n\n HeatmapOverlay.prototype = Object.create(typeof BMap === 'undefined' ? null : BMap.Overlay.prototype);\n\n HeatmapOverlay.prototype.initialize = function (map) {\n\n this._map = map;\n var el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.top = 0;\n el.style.left = 0;\n el.style.border = 0;\n el.style.width = this._map.getSize().width + \"px\";\n el.style.height = this._map.getSize().height + \"px\";\n this.conf.element = el;\n\n\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return el;\n }\n map.getPanes().mapPane.appendChild(el);\n this.conf.valueField = this.conf.valueField || \"count\";\n this.heatmap = heatmapFactory.create(this.conf);\n\n var that = this;\n map.addEventListener('resize', function (e) {\n var size = e.size;\n el.style.width = size.width + \"px\";\n el.style.height = size.height + \"px\";\n that.heatmap._renderer.setDimensions(size.width, size.height);\n that.draw();\n });\n\n this._div = el;\n return el;\n }\n\n HeatmapOverlay.prototype.draw = function () {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n var currentBounds = this._map.getBounds();\n\n if (currentBounds.equals(this.bounds)) {\n return;\n }\n this.bounds = currentBounds;\n\n var ne = this._map.pointToOverlayPixel(currentBounds.getNorthEast()),\n sw = this._map.pointToOverlayPixel(currentBounds.getSouthWest()),\n topY = ne.y,\n leftX = sw.x,\n h = sw.y - ne.y,\n w = ne.x - sw.x;\n\n this.conf.element.style.left = leftX + 'px';\n this.conf.element.style.top = topY + 'px';\n this.conf.element.style.width = w + 'px';\n this.conf.element.style.height = h + 'px';\n //this.heatmap.store.get(\"heatmap\").resize();\n\n if (this.latlngs.length > 0) {\n this.heatmap.removeData();\n\n var len = this.latlngs.length;\n const d = {\n max: this.heatmap._store.getData().max,\n data: []\n };\n\n while (len--) {\n var latlng = this.latlngs[len].latlng;\n\n if (!currentBounds.containsPoint(latlng)) {\n continue;\n }\n\n var divPixel = this._map.pointToOverlayPixel(latlng),\n leftX = this._map.pointToOverlayPixel(currentBounds.getSouthWest()).x,\n topY = this._map.pointToOverlayPixel(currentBounds.getNorthEast()).y,\n screenPixel = new BMap.Pixel(divPixel.x - leftX, divPixel.y - topY);\n var roundedPoint = this.pixelTransform(screenPixel);\n d.data.push({\n x: roundedPoint.x,\n y: roundedPoint.y,\n count: this.latlngs[len].c\n });\n }\n\n if (this.conf.radiusChangeByZoom) {\n this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom());\n }\n this.heatmap.setData(d);\n }\n }\n\n\n //内部使用的坐标转化\n HeatmapOverlay.prototype.pixelTransform = function (p) {\n var w = this.heatmap.width,\n h = this.heatmap.height;\n\n while (p.x < 0) {\n p.x += w;\n }\n\n while (p.x > w) {\n p.x -= w;\n }\n\n while (p.y < 0) {\n p.y += h;\n }\n\n while (p.y > h) {\n p.y -= h;\n }\n\n p.x = (p.x >> 0);\n p.y = (p.y >> 0);\n\n return p;\n }\n\n /**\n * 设置热力图展现的详细数据, 实现之后,即可以立刻展现 \n * @param {Json Object } data\n * {\"<b>max</b>\" : {Number} 权重的最大值,\n * <br />\"<b>data</b>\" : {Array} 坐标详细数据,格式如下 <br/>\n * {\"lng\":116.421969,\"lat\":39.913527,\"count\":3}, 其中<br/>\n * lng lat分别为经纬度, count权重值\n */\n HeatmapOverlay.prototype.setDataSet = function (data) {\n this.data = data;\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n var currentBounds = this._map.getBounds();\n var mapdata = {\n max: data.max,\n data: []\n };\n var d = data.data,\n dlen = d.length;\n\n\n this.latlngs = [];\n this.heatmap.removeData();\n\n if (this.conf.radiusChangeByZoom) {\n this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom());\n }\n\n while (dlen--) {\n var latlng = new BMap.Point(d[dlen].lng, d[dlen].lat);\n this.latlngs.push({\n latlng: latlng,\n c: d[dlen].count\n });\n\n if (!currentBounds.containsPoint(latlng)) {\n continue;\n }\n\n var divPixel = this._map.pointToOverlayPixel(latlng),\n leftX = this._map.pointToOverlayPixel(currentBounds.getSouthWest()).x,\n topY = this._map.pointToOverlayPixel(currentBounds.getNorthEast()).y,\n screenPixel = new BMap.Pixel(divPixel.x - leftX, divPixel.y - topY);\n var point = this.pixelTransform(screenPixel);\n\n mapdata.data.push({\n x: point.x,\n y: point.y,\n count: d[dlen].count\n });\n }\n this.heatmap.setData(mapdata);\n }\n\n /**\n * 添加热力图的详细坐标点\n * @param {Number} lng 经度坐标\n * @param {Number} lat 纬度坐标\n * @param {Number} count 权重\n */\n HeatmapOverlay.prototype.addDataPoint = function (lng, lat, count) {\n\n if (!isSupportCanvas()) {\n return;\n }\n if (this.data && this.data.data) {\n this.data.data.push({\n lng: lng,\n lat: lat,\n count: count\n });\n }\n\n var latlng = new BMap.Point(lng, lat),\n point = this.pixelTransform(this._map.pointToOverlayPixel(latlng));\n\n this.heatmap.store.addDataPoint(point.x, point.y, count);\n this.latlngs.push({\n latlng: latlng,\n c: count\n });\n }\n\n /**\n * 更改热力图的展现或者关闭\n */\n\n HeatmapOverlay.prototype.toggle = function () {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n if (this.conf.visible === true) {\n this.conf.visible = false;\n } else {\n this.conf.visible = true;\n };\n if (this.conf.visible) {\n this.conf.element.style.display = \"block\";\n } else {\n this.conf.element.style.display = \"none\";\n }\n }\n /**\n * 设置热力图展现的配置\n * @param {Json Object} options 可选的输入参数,非必填项。可输入选项包括:<br />\n * {\"<b>radius</b>\" : {String} 热力图的半径,\n * <br />\"<b>visible</b>\" : {Number} 热力图是否显示,\n * <br />\"<b>gradient</b>\" : {JSON} 热力图的渐变区间,\n * <br />\"<b>opacity</b>\" : {Number} 热力的透明度,}\n */\n HeatmapOverlay.prototype.setOptions = function (options) {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n for (var key in options) {\n if (key == \"radius\") {\n this.heatmap._store._cfgRadius = options[key];\n }\n }\n this.heatmap.configure(options);\n if (this.data) {\n this.setDataSet(this.data);//重新渲染\n }\n }\n\n\n function isSupportCanvas() {\n var elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n }\n\n return HeatmapOverlay\n})\n","import BHeatMapOverlay from 'bmaplib.heatmap'\nimport type { CoordType, LatLng, WeightedLatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\ntype BHeatMapOverlay = InstanceType<typeof BHeatMapOverlay>\n\n/** 默认半径 */\nconst RADIUS_DEFAULT = 10\n\nexport interface HeatmapOptions {\n data: HeatmapData\n /**\n * 透明度\n *\n * ## 不同效果\n * - google: 正常\n * - baidu: 设置透明度后模糊效果有问题, 感觉是bug\n */\n opacity?: number\n /**\n * 半径\n *\n * ## 默认半径的区别\n * - google: 默认半径是10\n * - baidu: 默认半径是40\n *\n * 这里统一成默认半径{@link RADIUS_DEFAULT}\n */\n radius?: number\n /**\n * ## 不同实现\n * - google: 接收颜色数组, 不能设置插值的位置\n * - baidu: 接收`{.1: 'red', .9: 'green'}`形式的颜色对象, 可以指定插值的位置\n */\n gradient?: Record<number, string>\n maxIntensity?: number\n}\nconst HeatmapOptions = {\n toGoogle: (options: HeatmapOptions, coord: CoordType): google.maps.visualization.HeatmapLayerOptions => ({\n opacity: options.opacity,\n radius: options.radius ?? RADIUS_DEFAULT,\n // key是小数和整数的混合, 故读取出来时不会维持\n gradient: options.gradient && Object.entries(options.gradient).sort(([k1], [k2]) => +k1 - +k2).map(([_, v]) => v),\n maxIntensity: options.maxIntensity,\n data: HeatmapData.toGoogle(options.data, coord),\n }),\n toBaidu: (options: HeatmapOptions, coord: CoordType, dataMax: number | undefined) => ({\n opacity: options.opacity,\n radius: options.radius ?? RADIUS_DEFAULT,\n gradient: options.gradient,\n data: HeatmapData.toBaidu(options.data, coord, dataMax),\n }),\n}\n\nexport type HeatmapData = (LatLng | WeightedLatLng)[]\n\nconst HeatmapData = {\n toGoogle: (data: HeatmapData, coord: CoordType) => data.map(it => 'weight' in it\n ? { weight: it.weight, location: it.position.toGoogle(coord) }\n : it.toGoogle(coord),\n ),\n toBaidu: (data: HeatmapData, coord: CoordType, dataMax: number | undefined) => {\n let max = 1 // baidu一定要传max\n const finalData = data.map(it => {\n let position: LatLng, count: number\n if ('weight' in it) {\n position = it.position.to(coord)\n count = it.weight\n } else {\n position = it.to(coord)\n count = 1\n }\n if (max < count) {\n max = count\n }\n return { lng: position.lng, lat: position.lat, count }\n })\n return { data: finalData, max: dataMax ?? max }\n },\n}\n\nexport abstract class Heatmap {\n abstract inner: google.maps.visualization.HeatmapLayer | BHeatMapOverlay\n abstract map: AbstractMap\n\n /** 只更新data */\n abstract setData(data: HeatmapData): void\n /** 一次性更新所有options */\n abstract setOptions(options: HeatmapOptions): void\n\n /**\n * 从地图上移除\n * 创建之后会被立即添加到地图上, 故只有remove方法\n * */\n abstract remove(): void\n}\n\nexport class GoogleHeatmap extends Heatmap {\n override inner: google.maps.visualization.HeatmapLayer\n constructor(\n public override map: GoogleMap,\n options: HeatmapOptions,\n ) {\n super()\n this.inner = new google.maps.visualization.HeatmapLayer(HeatmapOptions.toGoogle(options, this.map.coordType))\n\n this.inner.setMap(map.innerMap)\n }\n override setData(data: HeatmapData): void {\n this.inner.setData(HeatmapData.toGoogle(data, this.map.coordType))\n }\n override setOptions(options: HeatmapOptions): void {\n this.inner.setOptions(HeatmapOptions.toGoogle(options, this.map.coordType))\n }\n override remove(): void {\n this.inner.setMap(null)\n }\n}\n\nexport class BaiduHeatmap extends Heatmap {\n override inner: BHeatMapOverlay\n /**\n * 当前的最大值\n * 直接读取/修改`inner.data.max`, 实现类似google那种, 可以直接设置最大值的效果\n * */\n private get innerDataMax() {\n return this.inner.data?.max\n }\n private set innerDataMax(v: number | undefined) {\n (this.inner.data ??= {}).max = v\n }\n constructor(\n public override map: BaiduMap,\n options: HeatmapOptions,\n ) {\n super()\n const opts = HeatmapOptions.toBaidu(options, this.map.coordType, options.maxIntensity)\n this.inner = new BHeatMapOverlay(opts)\n // 直接添加到地图上\n map.innerMap.addOverlay(this.inner)\n // 添加到地图上之后, 才能调用setDataSet\n this.inner.setDataSet(opts.data)\n }\n override setData(data: HeatmapData): void {\n this.inner.setDataSet(HeatmapData.toBaidu(data, this.map.coordType, this.innerDataMax))\n }\n override setOptions(options: HeatmapOptions): void {\n const opts = HeatmapOptions.toBaidu(options, this.map.coordType, options.maxIntensity ?? this.innerDataMax)\n if (options.data !== this.inner.data) {\n this.inner.setDataSet(opts.data)\n } else if (options.maxIntensity) {\n // 未修改data, 只修改了maxIntensity, 则可以直接赋值\n this.innerDataMax = options.maxIntensity\n }\n this.inner.setOptions(opts)\n }\n\n override remove(): void {\n this.map.innerMap.removeOverlay(this.inner)\n }\n}\n","import { Strings, isEntryValueDef } from '../../../components'\nimport { CoordType, Location, type LatLng } from '../../lat-lng'\n\nexport type DirectionMode = 'transit' | 'driving' | 'walking'\n\n/** google多支持一种导航模式 */\ntype GoogleDirectionMode = DirectionMode | 'bicycling'\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MapUrlsOptions {\n\n}\n\nexport abstract class MapUrls {\n constructor(\n protected options: MapUrlsOptions,\n ) { }\n /**\n * 导航\n *\n * ## {@link origin}为空时的行为差异\n * - google: 用我的位置当做起点\n * - baidu: 用{@link destination}当作起点\n */\n abstract directions(origin: Location | undefined, destination: Location, mode?: DirectionMode): URL\n\n /**\n * 搜索\n */\n abstract search(location: Location): URL\n}\n\nfunction buildUrl(baseUrl: string | undefined, url: string, params: Record<string, string | undefined>) {\n const result = new URL(url, baseUrl)\n const urlParams = new URLSearchParams(Object.entries(params).filter(isEntryValueDef))\n result.search = '?' + urlParams.toString()\n return result\n}\n\n/** Baidu的src参数, 必须是形如`webapp.baidu.openAPIdemo`的三段格式 */\nfunction generateBaiduSrc() {\n const segments = window.location.hostname.split('.').filter(it => !Strings.isInt(it))\n if (segments.length === 3) {\n return segments.join('.')\n }\n return [...segments, 'tg', 'map', 'urls']\n .slice(0, 3)\n .join('.')\n}\n\n/**\n * @see https://developers.google.com/maps/documentation/urls/get-started\n */\nexport class GoogleMapUrls extends MapUrls {\n static BASE_URL = 'https://www.google.com/maps/'\n\n /** @see https://developers.google.com/maps/documentation/urls/get-started#directions-action */\n override directions(origin: Location | undefined, destination: Location, mode?: GoogleDirectionMode): URL {\n return buildUrl(GoogleMapUrls.BASE_URL, 'dir/', {\n api: '1',\n // {@template google_map_normal_gcj02}\n // google地图的普通地图, 在国内其实上是gcj02坐标, 卫星地图是wgs84坐标, 因为这里打开的是基础地图, 故使用gcj02\n // {@endtemplate}\n origin: Location.toString(origin, CoordType.gcj02),\n destination: Location.toString(destination, CoordType.gcj02),\n travelmode: mode,\n })\n }\n\n /** @see https://developers.google.com/maps/documentation/urls/get-started#search-action */\n override search(location: Location): URL {\n // 示例: https://www.google.com/maps/search/?api=1&query=47.5951518%2C-122.3316393\n return buildUrl(GoogleMapUrls.BASE_URL, 'search/', {\n api: '1',\n // {@macro google_map_normal_gcj02}\n query: Location.toString(location, CoordType.gcj02),\n })\n }\n}\n\n/**\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri\n */\nexport class BaiduMapUrls extends MapUrls {\n static BASE_URL = 'https://api.map.baidu.com/'\n\n /**\n * 导航\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#:~:text=%E6%9C%8D%E5%8A%A1%E5%9C%B0%E5%9D%80-,http%3A//api.map.baidu.com/direction,-//PC%26Webapp%E6%9C%8D%E5%8A%A1\n * */\n override directions(origin: Location | undefined, destination: Location, mode: DirectionMode = 'driving'): URL {\n // 优先以终点坐标系为准\n const coordType = Location.getCoordType(destination) ?? Location.getCoordType(origin) ?? CoordType.bd09\n const destinationStr = Location.toString(destination, coordType)\n // 示例: http://api.map.baidu.com/direction?origin=latlng:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving®ion=西安&output=html&src=webapp.baidu.openAPIdemo\n return buildUrl(BaiduMapUrls.BASE_URL, 'direction', {\n // baidu地图, 一定要有起点, 故这里用终点当起点, 防止导航失败\n origin: Location.toString(origin, coordType) ?? (typeof destination !== 'string'\n ? `name:请选择起点|latlng:${destinationStr}`\n : destinationStr),\n destination: destinationStr,\n // 默认就是bd09\n coord_type: coordType === CoordType.bd09 ? undefined : coordType,\n mode: mode,\n output: 'html',\n region: '中国',\n src: generateBaiduSrc(),\n })\n }\n\n override search(location: Location): URL {\n return typeof location === 'string'\n ? this.geocoderApi(location)\n : this.latlngApi(location)\n }\n\n /**\n * 显示经纬度, {@link markerApi}中途跳转的url, 一定能够定位到\n * */\n latlngApi(location: LatLng): URL {\n // 示例: https://map.baidu.com/?latlng=42.194873,116.491569&title=title&content=content&autoOpen=true&l=\n const position = location.to(CoordType.bd09)\n return new URL(`https://map.baidu.com/?latlng=${position.lat},${position.lng}`)\n }\n\n /**\n * 显示marker点, 由于缓存等因素的存在, 不一定能够定位到点\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#%E5%9B%BE%E5%8C%BA%E5%8A%9F%E8%83%BD\n */\n markerApi(location: LatLng, title: string, content: string): URL {\n return buildUrl(BaiduMapUrls.BASE_URL, 'marker', {\n location: `${location.lat},${location.lng}`,\n coord_type: location.coord === CoordType.bd09 ? undefined : location.coord,\n title,\n content,\n output: 'html',\n src: generateBaiduSrc(),\n })\n }\n\n /**\n * 编码/反编码, 由于缓存等因素的存在, 不一定能够定位到点\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#%E5%9B%BE%E5%8C%BA%E5%8A%9F%E8%83%BD:~:text=%E4%B8%8D%E4%BF%9D%E8%AF%81%E6%9C%8D%E5%8A%A1%E3%80%82-,2.1.2%20%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90,-%E8%B0%83%E7%94%A8%E8%AF%A5\n * */\n geocoderApi(location: Location): URL {\n // 示例:\n // http://api.map.baidu.com/geocoder?address=北京市海淀区上地信息路9号奎科科技大厦&output=html&src=webapp.baidu.openAPIdemo\n // http://api.map.baidu.com/geocoder?location=39.990912172420714%2C116.32715863448607&coord_type=gcj02&output=html&src=webapp.baidu.openAPIdemo\n return buildUrl(BaiduMapUrls.BASE_URL, 'geocoder', {\n ...(typeof location === 'string'\n ? {\n address: location,\n }\n : {\n location: `${location.lat},${location.lng}`,\n // 默认就是bd09\n coord_type: location.coord === CoordType.bd09 ? undefined : location.coord,\n }),\n output: 'html',\n src: generateBaiduSrc(),\n })\n }\n}\n","/**\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @name MarkerClusterer for Google Maps v3\n * @author Luke Mahe\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of\n * markers.\n */\n\n/**\n * A Marker Clusterer that clusters markers.\n *\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.<google.maps.Marker>=} opt_markers Optional markers to add to\n * the cluster.\n * @param {Object=} opt_options support the following options:\n * 'gridSize': (number) The grid size of a cluster in pixels.\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\n * cluster.\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\n * cluster is to zoom into it.\n * 'imagePath': (string) The base URL where the images representing\n * clusters will be found. The full URL will be:\n * {imagePath}[1-5].{imageExtension}\n * Default: '../images/m'.\n * 'imageExtension': (string) The suffix for images URL representing\n * clusters will be found. See _imagePath_ for details.\n * Default: 'png'.\n * 'averageCenter': (boolean) Whether the center of each cluster should be\n * the average of all markers in the cluster.\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\n * cluster before the markers are hidden and a count\n * is shown.\n * 'zIndex': (number) the z-index of a cluster.\n * Default: google.maps.Marker.MAX_ZINDEX + 1\n * 'styles': (object) An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition': (string) The position of the backgound x, y.\n * @constructor\n * @extends google.maps.OverlayView\n */\n\nclass MarkerClusterer {\n constructor(map, opt_markers, opt_options) {\n this.extend(MarkerClusterer, google.maps.OverlayView);\n this.map_ = map;\n\n /**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\n this.MARKER_CLUSTER_IMAGE_PATH_ = \"../images/m\";\n\n /**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\n this.MARKER_CLUSTER_IMAGE_EXTENSION_ = \"png\";\n /**\n * @type {Array.<google.maps.Marker>}\n * @private\n */\n this.markers_ = [];\n\n /**\n * @type {Array.<Cluster>}\n */\n this.clusters_ = [];\n\n this.sizes = [53, 56, 66, 78, 90];\n\n /**\n * @private\n */\n this.styles_ = [];\n\n /**\n * @type {boolean}\n * @private\n */\n this.ready_ = false;\n\n var options = opt_options || {};\n\n /**\n * @type {number}\n */\n this.zIndex_ = options[\"zIndex\"] || google.maps.Marker.MAX_ZINDEX + 1;\n\n /**\n * @type {number}\n * @private\n */\n this.gridSize_ = options[\"gridSize\"] || 60;\n\n /**\n * @private\n */\n this.minClusterSize_ = options[\"minimumClusterSize\"] || 2;\n\n /**\n * @type {?number}\n * @private\n */\n this.maxZoom_ = options[\"maxZoom\"] || null;\n\n this.styles_ = options[\"styles\"] || [];\n\n /**\n * @type {string}\n * @private\n */\n this.imagePath_ = options[\"imagePath\"] || this.MARKER_CLUSTER_IMAGE_PATH_;\n\n /**\n * @type {string}\n * @private\n */\n this.imageExtension_ =\n options[\"imageExtension\"] || this.MARKER_CLUSTER_IMAGE_EXTENSION_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.zoomOnClick_ = true;\n\n if (options[\"zoomOnClick\"] != undefined) {\n this.zoomOnClick_ = options[\"zoomOnClick\"];\n }\n\n /**\n * @type {boolean}\n * @private\n */\n this.averageCenter_ = false;\n\n if (options[\"averageCenter\"] != undefined) {\n this.averageCenter_ = options[\"averageCenter\"];\n }\n\n this.setupStyles_();\n\n this.setMap(map);\n\n /**\n * @type {number}\n * @private\n */\n this.prevZoom_ = this.map_.getZoom();\n\n // Add the map event listeners\n var that = this;\n google.maps.event.addListener(this.map_, \"zoom_changed\", function() {\n // Determines map type and prevent illegal zoom levels\n var zoom = that.map_.getZoom();\n var minZoom = that.map_.minZoom || 0;\n var maxZoom = Math.min(\n that.map_.maxZoom || 100,\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom\n );\n zoom = Math.min(Math.max(zoom, minZoom), maxZoom);\n\n if (that.prevZoom_ != zoom) {\n that.prevZoom_ = zoom;\n that.resetViewport();\n }\n });\n\n google.maps.event.addListener(this.map_, \"idle\", function() {\n that.redraw();\n });\n\n // Finally, add the markers\n if (\n opt_markers &&\n (opt_markers.length || Object.keys(opt_markers).length)\n ) {\n this.addMarkers(opt_markers, false);\n }\n }\n\n /**\n * Extends a objects prototype by anothers.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\n extend(obj1, obj2) {\n return function(object) {\n for (var property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }.apply(obj1, [obj2]);\n }\n\n /**\n * Implementaion of the interface method.\n * @ignore\n */\n onAdd() {\n this.setReady_(true);\n }\n\n /**\n * Implementaion of the interface method.\n * @ignore\n */\n draw() {}\n\n /**\n * Sets up the styles object.\n *\n * @private\n */\n setupStyles_() {\n if (this.styles_.length) {\n return;\n }\n\n for (var i = 0, size; (size = this.sizes[i]); i++) {\n this.styles_.push({\n url: this.imagePath_ + (i + 1) + \".\" + this.imageExtension_,\n height: size,\n width: size\n });\n }\n }\n\n /**\n * Fit the map to the bounds of the markers in the clusterer.\n */\n fitMapToMarkers() {\n var markers = this.getMarkers();\n var bounds = new google.maps.LatLngBounds();\n for (var i = 0, marker; (marker = markers[i]); i++) {\n bounds.extend(marker.getPosition());\n }\n\n this.map_.fitBounds(bounds);\n }\n\n /**\n * @param {number} zIndex\n */\n setZIndex(zIndex) {\n this.zIndex_ = zIndex;\n }\n\n /**\n * @return {number}\n */\n getZIndex() {\n return this.zIndex_;\n }\n\n /**\n * Sets the styles.\n *\n * @param {Object} styles The style to set.\n */\n setStyles(styles) {\n this.styles_ = styles;\n }\n\n /**\n * Gets the styles.\n *\n * @return {Object} The styles object.\n */\n getStyles() {\n return this.styles_;\n }\n\n /**\n * Whether zoom on click is set.\n *\n * @return {boolean} True if zoomOnClick_ is set.\n */\n isZoomOnClick() {\n return this.zoomOnClick_;\n }\n\n /**\n * Whether average center is set.\n *\n * @return {boolean} True if averageCenter_ is set.\n */\n isAverageCenter() {\n return this.averageCenter_;\n }\n\n /**\n * Returns the array of markers in the clusterer.\n *\n * @return {Array.<google.maps.Marker>} The markers.\n */\n getMarkers() {\n return this.markers_;\n }\n\n /**\n * Returns the number of markers in the clusterer\n *\n * @return {Number} The number of markers.\n */\n getTotalMarkers() {\n return this.markers_.length;\n }\n\n /**\n * Sets the max zoom for the clusterer.\n *\n * @param {number} maxZoom The max zoom level.\n */\n setMaxZoom(maxZoom) {\n this.maxZoom_ = maxZoom;\n }\n\n /**\n * Gets the max zoom for the clusterer.\n *\n * @return {number} The max zoom level.\n */\n getMaxZoom() {\n return this.maxZoom_;\n }\n\n /**\n * The function for calculating the cluster icon image.\n *\n * @param {Array.<google.maps.Marker>} markers The markers in the clusterer.\n * @param {number} numStyles The number of styles available.\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\n * @private\n */\n calculator_(markers, numStyles) {\n var index = 0;\n var count = markers.length;\n var dv = count;\n while (dv !== 0) {\n dv = parseInt(dv / 10, 10);\n index++;\n }\n\n index = Math.min(index, numStyles);\n return {\n text: count,\n index: index\n };\n }\n\n /**\n * Set the calculator function.\n *\n * @param {function(Array, number)} calculator The function to set as the\n * calculator. The function should return a object properties:\n * 'text' (string) and 'index' (number).\n *\n */\n setCalculator(calculator) {\n this.calculator_ = calculator;\n }\n\n /**\n * Get the calculator function.\n *\n * @return {function(Array, number)} the calculator function.\n */\n getCalculator() {\n return this.calculator_;\n }\n\n /**\n * Add an array of markers to the clusterer.\n *\n * @param {Array.<google.maps.Marker>} markers The markers to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\n addMarkers(markers, opt_nodraw) {\n if (markers.length) {\n for (let i = 0, marker; (marker = markers[i]); i++) {\n this.pushMarkerTo_(marker);\n }\n } else if (Object.keys(markers).length) {\n for (let marker in markers) {\n this.pushMarkerTo_(markers[marker]);\n }\n }\n if (!opt_nodraw) {\n this.redraw();\n }\n }\n\n /**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\n pushMarkerTo_(marker) {\n marker.isAdded = false;\n if (marker[\"draggable\"]) {\n // If the marker is draggable add a listener so we update the clusters on\n // the drag end.\n var that = this;\n google.maps.event.addListener(marker, \"dragend\", function() {\n marker.isAdded = false;\n that.repaint();\n });\n }\n this.markers_.push(marker);\n }\n\n /**\n * Adds a marker to the clusterer and redraws if needed.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\n addMarker(marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw();\n }\n }\n\n /**\n * Removes a marker and returns true if removed, false if not\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n * @private\n */\n removeMarker_(marker) {\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (var i = 0, m; (m = this.markers_[i]); i++) {\n if (m == marker) {\n index = i;\n break;\n }\n }\n }\n\n if (index == -1) {\n // Marker is not in our list of markers.\n return false;\n }\n\n marker.setMap(null);\n\n this.markers_.splice(index, 1);\n\n return true;\n }\n\n /**\n * Remove a marker from the cluster.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n * @return {boolean} True if the marker was removed.\n */\n removeMarker(marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Removes an array of markers from the cluster.\n *\n * @param {Array.<google.maps.Marker>} markers The markers to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n */\n removeMarkers(markers, opt_nodraw) {\n // create a local copy of markers if required\n // (removeMarker_ modifies the getMarkers() array in place)\n var markersCopy = markers === this.getMarkers() ? markers.slice() : markers;\n var removed = false;\n\n for (var i = 0, marker; (marker = markersCopy[i]); i++) {\n var r = this.removeMarker_(marker);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n }\n }\n\n /**\n * Sets the clusterer's ready state.\n *\n * @param {boolean} ready The state.\n * @private\n */\n setReady_(ready) {\n if (!this.ready_) {\n this.ready_ = ready;\n this.createClusters_();\n }\n }\n\n /**\n * Returns the number of clusters in the clusterer.\n *\n * @return {number} The number of clusters.\n */\n getTotalClusters() {\n return this.clusters_.length;\n }\n\n /**\n * Returns the google map that the clusterer is associated with.\n *\n * @return {google.maps.Map} The map.\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Sets the google map that the clusterer is associated with.\n *\n * @param {google.maps.Map} map The map.\n */\n setMap(map) {\n this.map_ = map;\n }\n\n /**\n * Returns the size of the grid.\n *\n * @return {number} The grid size.\n */\n getGridSize() {\n return this.gridSize_;\n }\n\n /**\n * Sets the size of the grid.\n *\n * @param {number} size The grid size.\n */\n setGridSize(size) {\n this.gridSize_ = size;\n }\n\n /**\n * Returns the min cluster size.\n *\n * @return {number} The grid size.\n */\n getMinClusterSize() {\n return this.minClusterSize_;\n }\n\n /**\n * Sets the min cluster size.\n *\n * @param {number} size The grid size.\n */\n setMinClusterSize(size) {\n this.minClusterSize_ = size;\n }\n\n /**\n * Extends a bounds object by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n */\n getExtendedBounds(bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(\n bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng()\n );\n var bl = new google.maps.LatLng(\n bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng()\n );\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n }\n\n /**\n * Determins if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n * @private\n */\n isMarkerInBounds_(marker, bounds) {\n return bounds.contains(marker.getPosition());\n }\n\n /**\n * Clears all clusters and markers from the clusterer.\n */\n clearMarkers() {\n this.resetViewport(true);\n\n // Set the markers a empty array.\n this.markers_ = [];\n }\n\n /**\n * Clears all existing clusters and recreates them.\n * @param {boolean} opt_hide To also hide the marker.\n */\n resetViewport(opt_hide) {\n // Remove all the clusters\n for (let i = 0, cluster; (cluster = this.clusters_[i]); i++) {\n cluster.remove();\n }\n\n // Reset the markers to not be added and to be invisible.\n for (let i = 0, marker; (marker = this.markers_[i]); i++) {\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n\n this.clusters_ = [];\n }\n\n /**\n *\n */\n repaint() {\n var oldClusters = this.clusters_.slice();\n this.clusters_.length = 0;\n this.resetViewport();\n this.redraw();\n\n // Remove the old clusters.\n // Do it in a timeout so the other clusters have been drawn first.\n setTimeout(function() {\n for (var i = 0, cluster; (cluster = oldClusters[i]); i++) {\n cluster.remove();\n }\n }, 0);\n }\n\n /**\n * Redraws the clusters.\n */\n redraw() {\n this.createClusters_();\n }\n\n /**\n * Calculates the distance between two latlng locations in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @private\n */\n distanceBetweenPoints_(p1, p2) {\n if (!p1 || !p2) {\n return 0;\n }\n\n var R = 6371; // Radius of the Earth in km\n var dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180;\n var dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180;\n var a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n }\n\n /**\n * Add a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\n addToClosestCluster_(marker) {\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (var i = 0, cluster; (cluster = this.clusters_[i]); i++) {\n var center = cluster.getCenter();\n if (center) {\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n var newCluster = new Cluster(this);\n newCluster.addMarker(marker);\n this.clusters_.push(newCluster);\n }\n }\n\n /**\n * Creates the clusters.\n *\n * @private\n */\n createClusters_() {\n if (!this.ready_) {\n return;\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n var mapBounds = new google.maps.LatLngBounds(\n this.map_.getBounds().getSouthWest(),\n this.map_.getBounds().getNorthEast()\n );\n var bounds = this.getExtendedBounds(mapBounds);\n\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n}\n\n/**\n * A cluster that contains markers.\n *\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\n * cluster is associated with.\n * @constructor\n * @ignore\n */\nclass Cluster {\n constructor(markerClusterer) {\n this.markerClusterer_ = markerClusterer;\n this.map_ = markerClusterer.getMap();\n this.gridSize_ = markerClusterer.getGridSize();\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\n this.averageCenter_ = markerClusterer.isAverageCenter();\n this.center_ = null;\n this.markers_ = [];\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(\n this,\n markerClusterer.getStyles(),\n markerClusterer.getGridSize()\n );\n }\n\n /**\n * Determins if a marker is already added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker is already added.\n */\n isMarkerAlreadyAdded(marker) {\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; (m = this.markers_[i]); i++) {\n if (m == marker) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Add a marker the cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @return {boolean} True if the marker was added.\n */\n addMarker(marker) {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat =\n (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng =\n (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n var len = this.markers_.length;\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\n // Min cluster size not reached so show the marker.\n marker.setMap(this.map_);\n }\n\n if (len == this.minClusterSize_) {\n // Hide the markers that were showing.\n for (var i = 0; i < len; i++) {\n this.markers_[i].setMap(null);\n }\n }\n\n if (len >= this.minClusterSize_) {\n marker.setMap(null);\n }\n\n this.updateIcon();\n return true;\n }\n\n /**\n * Returns the marker clusterer that the cluster is associated with.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n */\n getMarkerClusterer() {\n return this.markerClusterer_;\n }\n\n /**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n */\n getBounds() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (var i = 0, marker; (marker = markers[i]); i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n }\n\n /**\n * Removes the cluster\n */\n remove() {\n this.clusterIcon_.remove();\n this.markers_.length = 0;\n delete this.markers_;\n }\n\n /**\n * Returns the number of markers in the cluster.\n *\n * @return {number} The number of markers in the cluster.\n */\n getSize() {\n return this.markers_.length;\n }\n\n /**\n * Returns a list of the markers in the cluster.\n *\n * @return {Array.<google.maps.Marker>} The markers in the cluster.\n */\n getMarkers() {\n return this.markers_;\n }\n\n /**\n * Returns the center of the cluster.\n *\n * @return {google.maps.LatLng} The cluster center.\n */\n getCenter() {\n return this.center_;\n }\n\n /**\n * Calculated the extended bounds of the cluster with the grid.\n *\n * @private\n */\n calculateBounds_() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n }\n\n /**\n * Determines if a marker lies in the clusters bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n */\n isMarkerInClusterBounds(marker) {\n return this.bounds_.contains(marker.getPosition());\n }\n\n /**\n * Returns the map that the cluster is associated with.\n *\n * @return {google.maps.Map} The map.\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Updates the cluster icon\n */\n updateIcon() {\n var zoom = this.map_.getZoom();\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz && zoom > mz) {\n // The zoom is greater than our max zoom so show all the markers in cluster.\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\n marker.setMap(this.map_);\n }\n return;\n }\n\n if (this.markers_.length < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.setSums(sums);\n this.clusterIcon_.show();\n }\n}\n\n/**\n * A cluster icon\n *\n * @param {Cluster} cluster The cluster to be associated with.\n * @param {Object} styles An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition: (string) The background postition x, y.\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\n * @constructor\n * @extends google.maps.OverlayView\n * @ignore\n */\nclass ClusterIcon {\n constructor(cluster, styles, opt_padding) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.styles_ = styles;\n this.padding_ = opt_padding || 0;\n this.cluster_ = cluster;\n this.center_ = null;\n this.map_ = cluster.getMap();\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(this.map_);\n }\n\n /**\n * Triggers the clusterclick event and zoom's if the option is set.\n */\n triggerClusterClick() {\n var clusterBounds = this.cluster_.getBounds();\n var markerClusterer = this.cluster_.getMarkerClusterer();\n\n // Trigger the clusterclick event.\n google.maps.event.trigger(\n markerClusterer.map_,\n \"clusterclick\",\n this.cluster_\n );\n\n if (markerClusterer.isZoomOnClick()) {\n // Zoom into the cluster.\n this.map_.fitBounds(clusterBounds);\n this.map_.setCenter(clusterBounds.getCenter());\n }\n }\n\n /**\n * Adding the cluster icon to the dom.\n * @ignore\n */\n onAdd() {\n this.div_ = document.createElement(\"DIV\");\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.innerHTML = this.sums_.text;\n }\n\n var panes = this.getPanes();\n panes.overlayMouseTarget.appendChild(this.div_);\n\n var that = this;\n google.maps.event.addDomListener(this.div_, \"click\", function() {\n that.triggerClusterClick();\n });\n }\n\n /**\n * Returns the position to place the div dending on the latlng.\n *\n * @param {google.maps.LatLng} latlng The position in latlng.\n * @return {google.maps.Point} The position in pixels.\n * @private\n */\n getPosFromLatLng_(latlng) {\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\n pos.x -= parseInt(this.width_ / 2, 10);\n pos.y -= parseInt(this.height_ / 2, 10);\n return pos;\n }\n\n /**\n * Draw the icon.\n * @ignore\n */\n draw() {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + \"px\";\n this.div_.style.left = pos.x + \"px\";\n }\n }\n\n /**\n * Hide the icon.\n */\n hide() {\n if (this.div_) {\n this.div_.style.display = \"none\";\n }\n this.visible_ = false;\n }\n\n /**\n * Position and show the icon.\n */\n show() {\n if (this.div_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.style.display = \"\";\n }\n this.visible_ = true;\n }\n\n /**\n * Remove the icon from the map\n */\n remove() {\n this.setMap(null);\n }\n\n /**\n * Implementation of the onRemove interface.\n * @ignore\n */\n onRemove() {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n }\n\n /**\n * Set the sums of the icon.\n *\n * @param {Object} sums The sums containing:\n * 'text': (string) The text to display in the icon.\n * 'index': (number) The style index of the icon.\n */\n setSums(sums) {\n this.sums_ = sums;\n this.text_ = sums.text;\n this.index_ = sums.index;\n if (this.div_) {\n this.div_.innerHTML = sums.text;\n }\n\n this.useStyle();\n }\n\n /**\n * Sets the icon to the the styles.\n */\n useStyle() {\n var index = Math.max(0, this.sums_.index - 1);\n index = Math.min(this.styles_.length - 1, index);\n var style = this.styles_[index];\n this.url_ = style[\"url\"];\n this.height_ = style[\"height\"];\n this.width_ = style[\"width\"];\n this.textColor_ = style[\"textColor\"];\n this.anchor_ = style[\"anchor\"];\n this.textSize_ = style[\"textSize\"];\n this.backgroundPosition_ = style[\"backgroundPosition\"];\n }\n\n /**\n * Sets the center of the icon.\n *\n * @param {google.maps.LatLng} center The latlng to set as the center.\n */\n setCenter(center) {\n this.center_ = center;\n }\n\n /**\n * Create the css text based on the position of the icon.\n *\n * @param {google.maps.Point} pos The position.\n * @return {string} The css style text.\n */\n createCss(pos) {\n var style = [];\n style.push(\"z-index:\" + this.cluster_.markerClusterer_.getZIndex() + \";\");\n style.push(\"background-image:url(\" + this.url_ + \");\");\n var backgroundPosition = this.backgroundPosition_\n ? this.backgroundPosition_\n : \"0 0\";\n style.push(\"background-position:\" + backgroundPosition + \";\");\n\n if (typeof this.anchor_ === \"object\") {\n if (\n typeof this.anchor_[0] === \"number\" &&\n this.anchor_[0] > 0 &&\n this.anchor_[0] < this.height_\n ) {\n style.push(\n \"height:\" +\n (this.height_ - this.anchor_[0]) +\n \"px; padding-top:\" +\n this.anchor_[0] +\n \"px;\"\n );\n } else {\n style.push(\n \"height:\" + this.height_ + \"px; line-height:\" + this.height_ + \"px;\"\n );\n }\n if (\n typeof this.anchor_[1] === \"number\" &&\n this.anchor_[1] > 0 &&\n this.anchor_[1] < this.width_\n ) {\n style.push(\n \"width:\" +\n (this.width_ - this.anchor_[1]) +\n \"px; padding-left:\" +\n this.anchor_[1] +\n \"px;\"\n );\n } else {\n style.push(\"width:\" + this.width_ + \"px; text-align:center;\");\n }\n } else {\n style.push(\n \"height:\" +\n this.height_ +\n \"px; line-height:\" +\n this.height_ +\n \"px; width:\" +\n this.width_ +\n \"px; text-align:center;\"\n );\n }\n\n var txtColor = this.textColor_ ? this.textColor_ : \"black\";\n var txtSize = this.textSize_ ? this.textSize_ : 11;\n\n style.push(\n \"cursor:pointer; top:\" +\n pos.y +\n \"px; left:\" +\n pos.x +\n \"px; color:\" +\n txtColor +\n \"; position:absolute; font-size:\" +\n txtSize +\n \"px; font-family:Arial,sans-serif; font-weight:bold\"\n );\n return style.join(\"\");\n }\n}\n\nexport default MarkerClusterer;\n","(function (root, factory) { \n if (typeof exports === 'object') { \n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) { \n define(factory); \n } else {\n root.BMapLib = root.BMapLib || {};\n root.BMapLib.TextIconOverlay = root.BMapLib.TextIconOverlay || factory(); \n } \n})(this, function() {\n var T,\n baidu = T = baidu || {version: \"1.3.8\"}; \n var context = {}\n //提出guid,防止在与老版本Tangram混用时\n //在下一行错误的修改context[undefined]\n baidu.guid = \"$BAIDU$\";\n\n //Tangram可能被放在闭包中\n //一些页面级别唯一的属性,需要挂载在context[baidu.guid]上\n context[baidu.guid] = context[baidu.guid] || {};\n\n /** \n * @ignore\n * @namespace baidu.dom 操作dom的方法。\n */\n baidu.dom = baidu.dom || {};\n\n \n /**\n * 从文档中获取指定的DOM元素\n * @name baidu.dom.g\n * @function\n * @grammar baidu.dom.g(id)\n * @param {string|HTMLElement} id 元素的id或DOM元素\n * @shortcut g,T.G\n * @meta standard\n * @see baidu.dom.q\n * \n * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数\n */\n baidu.dom.g = function (id) {\n if ('string' == typeof id || id instanceof String) {\n return document.getElementById(id);\n } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {\n return id;\n }\n return null;\n };\n\n // 声明快捷方法\n baidu.g = baidu.G = baidu.dom.g;\n\n /**\n * 获取目标元素所属的document对象\n * @name baidu.dom.getDocument\n * @function\n * @grammar baidu.dom.getDocument(element)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @meta standard\n * @see baidu.dom.getWindow\n * \n * @returns {HTMLDocument} 目标元素所属的document对象\n */\n baidu.dom.getDocument = function (element) {\n element = baidu.dom.g(element);\n return element.nodeType == 9 ? element : element.ownerDocument || element.document;\n };\n\n /**\n * @ignore\n * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。\n */\n baidu.lang = baidu.lang || {};\n\n /**\n * 判断目标参数是否string类型或String对象\n * @name baidu.lang.isString\n * @function\n * @grammar baidu.lang.isString(source)\n * @param {Any} source 目标参数\n * @shortcut isString\n * @meta standard\n * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n * \n * @returns {boolean} 类型判断结果\n */\n baidu.lang.isString = function (source) {\n return '[object String]' == Object.prototype.toString.call(source);\n };\n\n // 声明快捷方法\n baidu.isString = baidu.lang.isString;\n\n /**\n * 从文档中获取指定的DOM元素\n * **内部方法**\n * \n * @param {string|HTMLElement} id 元素的id或DOM元素\n * @meta standard\n * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数\n */\n baidu.dom._g = function (id) {\n if (baidu.lang.isString(id)) {\n return document.getElementById(id);\n }\n return id;\n };\n\n // 声明快捷方法\n baidu._g = baidu.dom._g;\n\n /**\n * @ignore\n * @namespace baidu.browser 判断浏览器类型和特性的属性。\n */\n baidu.browser = baidu.browser || {};\n\n if (/msie (\\d+\\.\\d)/i.test(navigator.userAgent)) {\n //IE 8下,以documentMode为准\n //在百度模板中,可能会有$,防止冲突,将$1 写成 \\x241\n /**\n * 判断是否为ie浏览器\n * @property ie ie版本号\n * @grammar baidu.browser.ie\n * @meta standard\n * @shortcut ie\n * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon \n */\n baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\\x241'];\n }\n\n /**\n * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)\n *\n * @author berg\n * @name baidu.dom.getComputedStyle\n * @function\n * @grammar baidu.dom.getComputedStyle(element, key)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @param {string} key 要获取的样式名\n *\n * @see baidu.dom.getStyle\n * \n * @returns {string} 目标元素的computed style值\n */\n\n baidu.dom.getComputedStyle = function(element, key){\n element = baidu.dom._g(element);\n var doc = baidu.dom.getDocument(element),\n styles;\n if (doc.defaultView && doc.defaultView.getComputedStyle) {\n styles = doc.defaultView.getComputedStyle(element, null);\n if (styles) {\n return styles[key] || styles.getPropertyValue(key);\n }\n }\n return ''; \n };\n\n /**\n * 提供给setStyle与getStyle使用\n */\n baidu.dom._styleFixer = baidu.dom._styleFixer || {};\n\n /**\n * 提供给setStyle与getStyle使用\n */\n baidu.dom._styleFilter = baidu.dom._styleFilter || [];\n\n /**\n * 为获取和设置样式的过滤器\n * @private\n * @meta standard\n */\n baidu.dom._styleFilter.filter = function (key, value, method) {\n for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {\n if (filter = filter[method]) {\n value = filter(key, value);\n }\n }\n return value;\n };\n\n /**\n * @ignore\n * @namespace baidu.string 操作字符串的方法。\n */\n baidu.string = baidu.string || {};\n\n /**\n * 将目标字符串进行驼峰化处理\n * @name baidu.string.toCamelCase\n * @function\n * @grammar baidu.string.toCamelCase(source)\n * @param {string} source 目标字符串\n * @remark\n * 支持单词以“-_”分隔\n * @meta standard\n * \n * @returns {string} 驼峰化处理后的字符串\n */\n baidu.string.toCamelCase = function (source) {\n //提前判断,提高getStyle等的效率 thanks xianwei\n if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {\n return source;\n }\n return source.replace(/[-_][^-_]/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n };\n\n /**\n * 获取目标元素的样式值\n * @name baidu.dom.getStyle\n * @function\n * @grammar baidu.dom.getStyle(element, key)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @param {string} key 要获取的样式名\n * @remark\n * \n * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br />\n * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br />\n * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。\t\n * @shortcut getStyle\n * @meta standard\n * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle\n * \n * @returns {string} 目标元素的样式值\n */\n baidu.dom.getStyle = function (element, key) {\n var dom = baidu.dom;\n\n element = dom.g(element);\n key = baidu.string.toCamelCase(key);\n //computed style, then cascaded style, then explicitly set style.\n var value = element.style[key] ||\n (element.currentStyle ? element.currentStyle[key] : \"\") || \n dom.getComputedStyle(element, key);\n\n // 在取不到值的时候,用fixer进行修正\n if (!value) {\n var fixer = dom._styleFixer[key];\n if(fixer){\n value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer);\n }\n }\n\n /* 检查结果过滤器 */\n if (fixer = dom._styleFilter) {\n value = fixer.filter(key, value, 'get');\n }\n\n return value;\n };\n\n // 声明快捷方法\n baidu.getStyle = baidu.dom.getStyle;\n\n\n if (/opera\\/(\\d+\\.\\d)/i.test(navigator.userAgent)) {\n /**\n * 判断是否为opera浏览器\n * @property opera opera版本号\n * @grammar baidu.browser.opera\n * @meta standard\n * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome \n */\n baidu.browser.opera = + RegExp['\\x241'];\n }\n\n /**\n * 判断是否为webkit内核\n * @property isWebkit \n * @grammar baidu.browser.isWebkit\n * @meta standard\n * @see baidu.browser.isGecko\n */\n baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);\n\n /**\n * 判断是否为gecko内核\n * @property isGecko \n * @grammar baidu.browser.isGecko\n * @meta standard\n * @see baidu.browser.isWebkit\n */\n baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);\n\n /**\n * 判断是否严格标准的渲染模式\n * @property isStrict \n * @grammar baidu.browser.isStrict\n * @meta standard\n */\n baidu.browser.isStrict = document.compatMode == \"CSS1Compat\";\n\n /**\n * 获取目标元素相对于整个文档左上角的位置\n * @name baidu.dom.getPosition\n * @function\n * @grammar baidu.dom.getPosition(element)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @meta standard\n * \n * @returns {Object} 目标元素的位置,键值为top和left的Object。\n */\n baidu.dom.getPosition = function (element) {\n element = baidu.dom.g(element);\n var doc = baidu.dom.getDocument(element), \n browser = baidu.browser,\n getStyle = baidu.dom.getStyle,\n // Gecko 1.9版本以下用getBoxObjectFor计算位置\n // 但是某些情况下是有bug的\n // 对于这些有bug的情况\n // 使用递归查找的方式\n BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && \n doc.getBoxObjectFor &&\n getStyle(element, 'position') == 'absolute' &&\n (element.style.top === '' || element.style.left === ''),\n pos = {\"left\":0,\"top\":0},\n viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement,\n parent,\n box;\n\n if(element == viewport){\n return pos;\n }\n\n if(element.getBoundingClientRect){ // IE and Gecko 1.9+\n \n //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的\n //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题.\n box = element.getBoundingClientRect();\n\n pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);\n pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);\n \n // IE会给HTML元素添加一个border,默认是medium(2px)\n // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖\n // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得\n // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium\n // clientTop和clientLeft不会更新\n pos.left -= doc.documentElement.clientLeft;\n pos.top -= doc.documentElement.clientTop;\n \n var htmlDom = doc.body,\n // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的\n htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')),\n htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth'));\n if(browser.ie && !browser.isStrict){\n pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth;\n pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth;\n }\n } else { \n // safari/opera/firefox\n parent = element;\n\n do {\n pos.left += parent.offsetLeft;\n pos.top += parent.offsetTop;\n \n // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了\n if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') {\n pos.left += doc.body.scrollLeft;\n pos.top += doc.body.scrollTop;\n break;\n }\n \n parent = parent.offsetParent;\n } while (parent && parent != element);\n\n // 对body offsetTop的修正\n if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){\n pos.top -= doc.body.offsetTop;\n }\n\n // 计算除了body的scroll\n parent = element.offsetParent;\n while (parent && parent != doc.body) {\n pos.left -= parent.scrollLeft;\n // see https://bugs.opera.com/show_bug.cgi?id=249965\n if (!browser.opera || parent.tagName != 'TR') {\n pos.top -= parent.scrollTop;\n }\n parent = parent.offsetParent;\n }\n }\n\n return pos;\n };\n\n /**\n * @ignore\n * @namespace baidu.event 屏蔽浏览器差异性的事件封装。\n * @property target \t事件的触发元素\n * @property pageX \t\t鼠标事件的鼠标x坐标\n * @property pageY \t\t鼠标事件的鼠标y坐标\n * @property keyCode \t键盘事件的键值\n */\n baidu.event = baidu.event || {};\n\n /**\n * 事件监听器的存储表\n * @private\n * @meta standard\n */\n baidu.event._listeners = baidu.event._listeners || [];\n\n /**\n * 为目标元素添加事件监听器\n * @name baidu.event.on\n * @function\n * @grammar baidu.event.on(element, type, listener)\n * @param {HTMLElement|string|window} element 目标元素或目标元素id\n * @param {string} type 事件类型\n * @param {Function} listener 需要添加的监听器\n * @remark\n * \n 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br>\n 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败\n\n * @shortcut on\n * @meta standard\n * @see baidu.event.un\n * \n * @returns {HTMLElement|window} 目标元素\n */\n baidu.event.on = function (element, type, listener) {\n type = type.replace(/^on/i, '');\n element = baidu.dom._g(element);\n\n var realListener = function (ev) {\n // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载\n // 2. element是为了修正this\n listener.call(element, ev);\n },\n lis = baidu.event._listeners,\n filter = baidu.event._eventFilter,\n afterFilter,\n realType = type;\n type = type.toLowerCase();\n // filter过滤\n if(filter && filter[type]){\n afterFilter = filter[type](element, type, realListener);\n realType = afterFilter.type;\n realListener = afterFilter.listener;\n }\n\n // 事件监听器挂载\n if (element.addEventListener) {\n element.addEventListener(realType, realListener, false);\n } else if (element.attachEvent) {\n element.attachEvent('on' + realType, realListener);\n }\n\n // 将监听器存储到数组中\n lis[lis.length] = [element, type, listener, realListener, realType];\n return element;\n };\n\n // 声明快捷方法\n baidu.on = baidu.event.on;\n\n /**\n * 返回一个当前页面的唯一标识字符串。\n * @name baidu.lang.guid\n * @function\n * @grammar baidu.lang.guid()\n * @version 1.1.1\n * @meta standard\n * \n * @returns {String} 当前页面的唯一标识字符串\n */\n\n (function(){\n //不直接使用window,可以提高3倍左右性能\n var guid = context[baidu.guid];\n\n baidu.lang.guid = function() {\n return \"TANGRAM__\" + (guid._counter ++).toString(36);\n };\n\n guid._counter = guid._counter || 1;\n })();\n\n /**\n * 所有类的实例的容器\n * key为每个实例的guid\n * @meta standard\n */\n\n context[baidu.guid]._instances = context[baidu.guid]._instances || {};\n\n /**\n * 判断目标参数是否为function或Function实例\n * @name baidu.lang.isFunction\n * @function\n * @grammar baidu.lang.isFunction(source)\n * @param {Any} source 目标参数\n * @version 1.2\n * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n * @meta standard\n * @returns {boolean} 类型判断结果\n */\n baidu.lang.isFunction = function (source) {\n // chrome下,'function' == typeof /a/ 为true.\n return '[object Function]' == Object.prototype.toString.call(source);\n };\n\n /**\n * \n * @ignore\n * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。\n * @name \tbaidu.lang.Class\n * @grammar baidu.lang.Class(guid)\n * @param \t{string}\tguid\t对象的唯一标识\n * @meta standard\n * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。\n * @meta standard\n * @see baidu.lang.inherits,baidu.lang.Event\n */\n baidu.lang.Class = function(guid) {\n this.guid = guid || baidu.lang.guid();\n context[baidu.guid]._instances[this.guid] = this;\n };\n context[baidu.guid]._instances = context[baidu.guid]._instances || {};\n\n /**\n * 释放对象所持有的资源,主要是自定义事件。\n * @name dispose\n * @grammar obj.dispose()\n */\n baidu.lang.Class.prototype.dispose = function(){\n delete context[baidu.guid]._instances[this.guid];\n\n for(var property in this){\n if (!baidu.lang.isFunction(this[property])) {\n delete this[property];\n }\n }\n this.disposed = true;\n };\n\n /**\n * 重载了默认的toString方法,使得返回信息更加准确一些。\n * @return {string} 对象的String表示形式\n */\n baidu.lang.Class.prototype.toString = function(){\n return \"[object \" + (this._className || \"Object\" ) + \"]\";\n };\n\n /**\n * @ignore\n * @class 自定义的事件对象。\n * @name \tbaidu.lang.Event\n * @grammar baidu.lang.Event(type[, target])\n * @param \t{string} type\t 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以\"on\"(小写)开头。\n * @param \t{Object} [target]触发事件的对象\n * @meta standard\n * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。\n * @meta standard\n * @see baidu.lang.Class\n */\n baidu.lang.Event = function (type, target) {\n this.type = type;\n this.returnValue = true;\n this.target = target || null;\n this.currentTarget = null;\n };\n\n /**\n * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.addEventListener(type, handler[, key])\n * @param \t{string} type 自定义事件的名称\n * @param \t{Function} handler 自定义事件被触发时应该调用的回调函数\n * @param \t{string} [key]\t\t为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。\n * @remark \t事件类型区分大小写。如果自定义事件名称不是以小写\"on\"开头,该方法会给它加上\"on\"再进行判断,即\"click\"和\"onclick\"会被认为是同一种事件。 \n */\n baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {\n if (!baidu.lang.isFunction(handler)) {\n return;\n }\n\n !this.__listeners && (this.__listeners = {});\n\n var t = this.__listeners, id;\n if (typeof key == \"string\" && key) {\n if (/[^\\w\\-]/.test(key)) {\n throw(\"nonstandard key:\" + key);\n } else {\n handler.hashCode = key; \n id = key;\n }\n }\n type.indexOf(\"on\") != 0 && (type = \"on\" + type);\n\n typeof t[type] != \"object\" && (t[type] = {});\n id = id || baidu.lang.guid();\n handler.hashCode = id;\n t[type][id] = handler;\n };\n\n /**\n * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.removeEventListener(type, handler)\n * @param {string} type 事件类型\n * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key\n * @remark \t如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。\n */\n baidu.lang.Class.prototype.removeEventListener = function (type, handler) {\n if (typeof handler != \"undefined\") {\n if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode))\n || (! baidu.lang.isString(handler))\n ){\n return;\n }\n }\n\n !this.__listeners && (this.__listeners = {});\n\n type.indexOf(\"on\") != 0 && (type = \"on\" + type);\n\n var t = this.__listeners;\n if (!t[type]) {\n return;\n }\n if (typeof handler != \"undefined\") {\n t[type][handler] && delete t[type][handler];\n } else {\n for(var guid in t[type]){\n delete t[type][guid];\n }\n }\n };\n\n /**\n * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.dispatchEvent(event, options)\n * @param {baidu.lang.Event|String} event \tEvent对象,或事件名称(1.1.1起支持)\n * @param {Object} \t\t\t\t\toptions 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)\n * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br>\n myobj.onMyEvent = function(){}<br>\n myobj.addEventListener(\"onMyEvent\", function(){});\n */\n baidu.lang.Class.prototype.dispatchEvent = function (event, options) {\n if (baidu.lang.isString(event)) {\n event = new baidu.lang.Event(event);\n }\n !this.__listeners && (this.__listeners = {});\n\n // 20100603 添加本方法的第二个参数,将 options extend到event中去传递\n options = options || {};\n for (var i in options) {\n event[i] = options[i];\n }\n\n var i, t = this.__listeners, p = event.type;\n event.target = event.target || this;\n event.currentTarget = this;\n\n p.indexOf(\"on\") != 0 && (p = \"on\" + p);\n\n baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);\n\n if (typeof t[p] == \"object\") {\n for (i in t[p]) {\n t[p][i].apply(this, arguments);\n }\n }\n return event.returnValue;\n };\n\n\n baidu.lang.inherits = function (subClass, superClass, className) {\n var key, proto,\n selfProps = subClass.prototype,\n clazz = new Function();\n\n clazz.prototype = superClass.prototype;\n proto = subClass.prototype = new clazz();\n for (key in selfProps) {\n proto[key] = selfProps[key];\n }\n subClass.prototype.constructor = subClass;\n subClass.superClass = superClass.prototype;\n\n // 类名标识,兼容Class的toString,基本没用\n if (\"string\" == typeof className) {\n proto._className = className;\n }\n };\n // 声明快捷方法\n baidu.inherits = baidu.lang.inherits;\n\n\n /**\n \n * 图片的路径\n\n * @private\n * @type {String}\n \n */\n var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m';\n\n /**\n \n * 图片的后缀名\n\n * @private\n * @type {String}\n \n */\n var _IMAGE_EXTENSION = 'png';\n\n /**\n *@exports TextIconOverlay as BMapLib.TextIconOverlay\n */\n \n /**\n * TextIconOverlay\n * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。\n * 该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。\n *\n * @constructor\n * @param {Point} position 表示一个经纬度坐标位置。\n * @param {string} text 表示该覆盖物显示的文字信息。\n * @param {TextIconOverlayOptions=} options 选项。\n *\n * @typedef {object} TextIconOverlayOptions\n * @property {IconStyle[]=} styles 一组图标风格。\n * @property {number=} zIndex 等同与CSS中的z-index属性\n * \n * @typedef {object} IconStyle\n * @property {string} url 图片的url地址。\n * @property {Size} size 图片的大小。\n * @property {Size=} anchor 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。\n * @property {Size=} offset 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。\n * @property {number=} [textSize=10] 文字的大小。\n * @property {string} [textColor='black'] 文字的颜色。\n */\n var TextIconOverlay = function(position, text, options){\n try {\n BMap;\n } catch (e) {\n throw Error('Baidu Map JS API is not ready yet!');\n }\n T.lang.inherits(TextIconOverlay, BMap.Overlay, \"TextIconOverlay\");\n this._position = position;\n this._text = text;\n this._options = options || {};\n this._styles = this._options['styles'] || [];\n /** @type {number | undefined} */\n this._zIndex = this._options['zIndex'];\n (!this._styles.length) && this._setupDefaultStyles(); \n };\n\n\n TextIconOverlay.prototype._setupDefaultStyles = function(){ \n var sizes = [53, 56, 66, 78, 90];\n for(var i = 0, size; size = sizes[i]; i++){\n this._styles.push({\n url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION,\n size: new BMap.Size(size, size)\n });\n }//for循环的简洁写法\n };\n\n /**\n *继承Overlay的intialize方法,自定义覆盖物时必须。\n *@param {Map} map BMap.Map的实例化对象。\n *@return {HTMLElement} 返回覆盖物对应的HTML元素。\n */\n TextIconOverlay.prototype.initialize = function(map){\n this._map = map;\n \n this._domElement = document.createElement('div'); \n this._updateCss(); \n this._updateText();\n this._updatePosition(); \n \n this._bind();\n\n this._map.getPanes().markerMouseTarget.appendChild(this._domElement);\n return this._domElement; \n };\n\n /**\n *继承Overlay的draw方法,自定义覆盖物时必须。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.draw = function(){\n this._map && this._updatePosition();\n };\n \n /**\n *获取该覆盖物上的文字。\n *@return {String} 该覆盖物上的文字。\n */\n TextIconOverlay.prototype.getText = function(){\n return this._text;\n };\n\n /**\n *设置该覆盖物上的文字。\n *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.setText = function(text){\n if(text && (!this._text || (this._text.toString() != text.toString()))){\n this._text = text;\n this._updateText();\n this._updateCss();\n this._updatePosition(); \n }\n };\n\n /**\n *获取该覆盖物的位置。\n *@return {Point} 该覆盖物的经纬度坐标。\n */\n TextIconOverlay.prototype.getPosition = function () {\n return this._position;\n };\n \n /**\n *设置该覆盖物的位置。\n *@param {Point} position 要设置的经纬度坐标。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.setPosition = function (position) {\n if(position && (!this._position || !this._position.equals(position))){\n this._position = position; \n this._updatePosition();\n }\n };\n\n /**\n *由文字信息获取风格数组的对应索引值。\n *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2.\n *如果需要自定义映射关系,请覆盖该函数。\n *@param {String} text 文字。\n *@param {Array<IconStyle>} styles 一组图标风格。\n *@return {Number} 对应的索引值。\n */\n TextIconOverlay.prototype.getStyleByText = function(text, styles){\n var count = parseInt(text);\n var index = parseInt(count / 10);\n index = Math.max(0, index);\n index = Math.min(index, styles.length - 1);\n return styles[index]; \n }\n\n /**\n *更新相应的CSS。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updateCss = function(){\n if (!this._domElement) {\n return\n }\n var style = this.getStyleByText(this._text, this._styles);\n this._domElement.style.cssText = this._buildCssText(style);\n };\n\n /**\n *更新覆盖物的显示文字。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updateText = function(){\n if (this._domElement) {\n this._domElement.innerHTML = this._text;\n }\n };\n\n /**\n *调整覆盖物在地图上的位置更新覆盖物的显示文字。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updatePosition = function(){\n if (this._domElement && this._position) {\n var style = this._domElement.style;\n var pixelPosition= this._map.pointToOverlayPixel(this._position); \n pixelPosition.x -= Math.ceil(parseInt(style.width) / 2);\n pixelPosition.y -= Math.ceil(parseInt(style.height) / 2); \n style.left = pixelPosition.x + \"px\";\n style.top = pixelPosition.y + \"px\";\n }\n };\n \n /**\n * 为该覆盖物的HTML元素构建CSS\n * @param {IconStyle} 一个图标的风格。\n * @return {String} 构建完成的CSSTEXT。\n */\n TextIconOverlay.prototype._buildCssText = function(style) { \n //根据style来确定一些默认值\n var url = style['url'];\n var size = style['size'];\n var anchor = style['anchor'];\n var offset = style['offset'];\n var textColor = style['textColor'] || 'black';\n var textSize = style['textSize'] || 10;\n\n var csstext = [];\n if (this._zIndex) {\n csstext.push('z-index:' + this._zIndex + ';');\n }\n if (T.browser[\"ie\"] < 7) {\n csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +\n 'sizingMethod=scale,src=\"' + url + '\");');\n } else {\n csstext.push('background-image:url(' + url + ');');\n var backgroundPosition = '0 0';\n (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px'); \n csstext.push('background-position:' + backgroundPosition + ';');\n }\n\n if (size instanceof BMap.Size){\n if (anchor instanceof BMap.Size) {\n if (anchor.height > 0 && anchor.height < size.height) {\n csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;');\n }\n if(anchor.width > 0 && anchor.width < size.width){\n csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;'); \n }\n } else {\n csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;');\n csstext.push('width:' + size.width + 'px; text-align:center;');\n }\n }\n \n csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' +\n textSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\n return csstext.join('');\n };\n\n\n /**\n \n * 当鼠标点击该覆盖物时会触发该事件\n\n * @name TextIconOverlay#click\n\n * @event\n\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n \n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n *\n\n */\n\n /**\n\n * 当鼠标进入该覆盖物区域时会触发该事件\n\n * @name TextIconOverlay#mouseover\n\n * @event\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n \n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n * <br />\"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象\n\n * <br />\"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象\n\n *\n\n * @example <b>参考示例:</b><br />\n\n * myTextIconOverlay.addEventListener(\"mouseover\", function(e) { alert(e.point); });\n\n */\n\n /**\n\n * 当鼠标离开该覆盖物区域时会触发该事件\n\n * @name TextIconOverlay#mouseout\n\n * @event\n\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n\n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n * <br />\"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象\n\n * <br />\"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象\n\n *\n\n * @example <b>参考示例:</b><br />\n\n * myTextIconOverlay.addEventListener(\"mouseout\", function(e) { alert(e.point); });\n\n */\n\n\n /**\n * 为该覆盖物绑定一系列事件\n * 当前支持click mouseover mouseout\n * @return 无返回值。\n */\n TextIconOverlay.prototype._bind = function(){\n if (!this._domElement){\n return;\n }\n\n var me = this;\n var map = this._map;\n\n var BaseEvent = T.lang.Event;\n function eventExtend(e, be){\n var elem = e.srcElement || e.target;\n var x = e.clientX || e.pageX;\n var y = e.clientY || e.pageY;\n if (e && be && x && y && elem){\n var offset = T.dom.getPosition(map.getContainer());\n be.pixel = new BMap.Pixel(x - offset.left, y - offset.top);\n be.point = map.pixelToPoint(be.pixel);\n }\n return be;\n }//给事件参数增加pixel和point两个值\n\n T.event.on(this._domElement,\"mouseover\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onmouseover\")));\n });\n T.event.on(this._domElement,\"mouseout\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onmouseout\")));\n });\n T.event.on(this._domElement,\"click\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onclick\")));\n });\n };\n\n return TextIconOverlay;\n});\n","import TextIconOverlay from 'bmaplib.texticonoverlay';\n\n/**\n * 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。\n * @param {BMap.Map} map BMap.Map的实例化对象\n * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象\n * @param {Number} gridSize 要扩大的像素值\n *\n * @return {BMap.Bounds} 返回扩大后的视图范围。\n */\nvar getExtendedBounds = function(map, bounds, gridSize){\n bounds = cutBoundsInRange(bounds);\n var pixelNE = map.pointToPixel(bounds.getNorthEast());\n var pixelSW = map.pointToPixel(bounds.getSouthWest()); \n pixelNE.x += gridSize;\n pixelNE.y -= gridSize;\n pixelSW.x -= gridSize;\n pixelSW.y += gridSize;\n var newNE = map.pixelToPoint(pixelNE);\n var newSW = map.pixelToPoint(pixelSW);\n return new BMap.Bounds(newSW, newNE);\n};\n\n/**\n * 按照百度地图支持的世界范围对bounds进行边界处理\n * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象\n *\n * @return {BMap.Bounds} 返回不越界的视图范围\n */\nvar cutBoundsInRange = function (bounds) {\n var maxX = getRange(bounds.getNorthEast().lng, -180, 180);\n var minX = getRange(bounds.getSouthWest().lng, -180, 180);\n var maxY = getRange(bounds.getNorthEast().lat, -74, 74);\n var minY = getRange(bounds.getSouthWest().lat, -74, 74);\n return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY));\n}; \n\n/**\n * 对单个值进行边界处理。\n * @param {Number} i 要处理的数值\n * @param {Number} min 下边界值\n * @param {Number} max 上边界值\n * \n * @return {Number} 返回不越界的数值\n */\nvar getRange = function (i, mix, max) {\n mix && (i = Math.max(i, mix));\n max && (i = Math.min(i, max));\n return i;\n};\n\n/**\n * 判断给定的对象是否为数组\n * @param {Object} source 要测试的对象\n *\n * @return {Boolean} 如果是数组返回true,否则返回false\n */\nvar isArray = function (source) {\n return '[object Array]' === Object.prototype.toString.call(source);\n};\n\n/**\n * 返回item在source中的索引位置\n * @param {Object} item 要测试的对象\n * @param {Array} source 数组\n *\n * @return {Number} 如果在数组内,返回索引,否则返回-1\n */\nvar indexOf = function(item, source){\n var index = -1;\n if(isArray(source)){\n if (source.indexOf) {\n index = source.indexOf(item);\n } else {\n for (var i = 0, m; m = source[i]; i++) {\n if (m === item) {\n index = i;\n break;\n }\n }\n }\n } \n return index;\n};\n\n/**\n *@exports MarkerClusterer as BMapLib.MarkerClusterer\n */\n\n/**\n * MarkerClusterer\n * @class 用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能\n * @constructor\n * @param {BMap.Map} map 地图的一个实例。\n * @param {MarkerClustererOptions=} options 可选参数\n * \n * @typedef {object} MarkerClustererOptions\n * @property {Marker[]=} markers 要聚合的标记数组\n * @property {number=} [gridSize=60] 聚合计算时网格的像素大小,默认60\n * @property {number=} maxZoom 最大的聚合级别,大于该级别就不进行相应的聚合\n * @property {number=} [minClusterSize=2] 最小的聚合数量,小于该数量的不能成为一个聚合,默认为2\n * @property {boolean=} [isAverageCenter=false] 聚合点的落脚位置是否是所有聚合在内点的平均值,默认为否,落脚在聚合内的第一个点\n * @property {IconStyle[]=} styles 自定义聚合后的图标风格,请参考TextIconOverlay类\n * @property {number=} zIndex 聚合图标的z-index\n */\nvar MarkerClusterer = function(map, options){\n try {\n BMap;\n } catch (e) {\n throw Error('Baidu Map JS API is not ready yet!');\n }\n if (!map){\n return;\n }\n this._map = map;\n this._markers = [];\n this._clusters = [];\n \n var opts = options || {};\n this._zIndex = opts[\"zIndex\"];\n this._gridSize = opts[\"gridSize\"] || 60;\n this._maxZoom = opts[\"maxZoom\"] || 18;\n this._minClusterSize = opts[\"minClusterSize\"] || 2; \n this._isAverageCenter = false;\n if (opts['isAverageCenter'] != undefined) {\n this._isAverageCenter = opts['isAverageCenter'];\n } \n this._styles = opts[\"styles\"] || [];\n\n var that = this;\n this._map.addEventListener(\"zoomend\",function(){\n that._redraw(); \n });\n\n this._map.addEventListener(\"moveend\",function(){\n that._redraw(); \n });\n\n var mkrs = opts[\"markers\"];\n isArray(mkrs) && this.addMarkers(mkrs);\n};\n\n/**\n * 添加要聚合的标记数组。\n * @param {Array<Marker>} markers 要聚合的标记数组\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype.addMarkers = function(markers){\n if (!markers.length) {\n return\n }\n for(var i = 0, len = markers.length; i <len ; i++){\n this._pushMarkerTo(markers[i]);\n }\n this._createClusters(); \n};\n\n/**\n * 把一个标记添加到要聚合的标记数组中\n * @param {BMap.Marker} marker 要添加的标记\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype._pushMarkerTo = function(marker){\n var index = indexOf(marker, this._markers);\n if(index === -1){\n marker.isInCluster = false;\n this._markers.push(marker);//Marker拖放后enableDragging不做变化,忽略\n }\n};\n\n/**\n * 添加一个聚合的标记。\n * @param {BMap.Marker} marker 要聚合的单个标记。\n * @return 无返回值。\n */\nMarkerClusterer.prototype.addMarker = function(marker) {\n this._pushMarkerTo(marker);\n this._createClusters();\n};\n\n/**\n * 根据所给定的标记,创建聚合点\n * @return 无返回值\n */\nMarkerClusterer.prototype._createClusters = function(){\n var mapBounds = this._map.getBounds();\n if (!mapBounds.getCenter()) {\n return\n }\n var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize);\n for(var i = 0, marker; marker = this._markers[i]; i++){\n if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ \n this._addToClosestCluster(marker);\n }\n }\n var len = this._markers.length;\n for (var i = 0; i < len; i++) {\n if(this._clusters[i]){\n this._clusters[i].render();\n }\n } \n};\n\n/**\n * 根据标记的位置,把它添加到最近的聚合中\n * @param {BMap.Marker} marker 要进行聚合的单个标记\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype._addToClosestCluster = function (marker){\n var distance = 4000000;\n var clusterToAddTo = null;\n var position = marker.getPosition();\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){\n var center = cluster.getCenter();\n if(center){\n var d = this._map.getDistance(center, marker.getPosition());\n if(d < distance){\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){\n clusterToAddTo.addMarker(marker);\n } else {\n var cluster = new Cluster(this);\n cluster.addMarker(marker); \n this._clusters.push(cluster);\n } \n};\n\n/**\n * 清除上一次的聚合的结果\n * @return 无返回值。\n */\nMarkerClusterer.prototype._clearLastClusters = function(){\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){ \n cluster.remove();\n }\n this._clusters = [];//置空Cluster数组\n this._removeMarkersFromCluster();//把Marker的cluster标记设为false\n};\n\n/**\n * 清除某个聚合中的所有标记\n * @return 无返回值\n */\nMarkerClusterer.prototype._removeMarkersFromCluster = function(){\n for(var i = 0, marker; marker = this._markers[i]; i++){\n marker.isInCluster = false;\n }\n};\n\n/**\n * 把所有的标记从地图上清除\n * @return 无返回值\n */\nMarkerClusterer.prototype._removeMarkersFromMap = function(){\n for(var i = 0, marker; marker = this._markers[i]; i++){\n marker.isInCluster = false;\n var label = marker.getLabel();\n this._map.removeOverlay(marker);\n marker.setLabel(label);\n }\n};\n\n/**\n * 删除单个标记\n * @param {BMap.Marker} marker 需要被删除的marker\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype._removeMarker = function(marker) {\n var index = indexOf(marker, this._markers);\n if (index === -1) {\n return false;\n }\n this._map.removeOverlay(marker);\n this._markers.splice(index, 1);\n return true;\n};\n\n/**\n * 删除单个标记\n * @param {BMap.Marker} marker 需要被删除的marker\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype.removeMarker = function(marker) {\n var success = this._removeMarker(marker);\n if (success) {\n this._clearLastClusters();\n this._createClusters();\n }\n return success;\n};\n\n/**\n * 删除一组标记\n * @param {Array<BMap.Marker>} markers 需要被删除的marker数组\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype.removeMarkers = function(markers) {\n var success = false;\n for (var i = 0; i < markers.length; i++) {\n var r = this._removeMarker(markers[i]);\n success = success || r; \n }\n\n if (success) {\n this._clearLastClusters();\n this._createClusters();\n }\n return success;\n};\n\n/**\n * 从地图上彻底清除所有的标记\n * @return 无返回值\n */\nMarkerClusterer.prototype.clearMarkers = function() {\n this._clearLastClusters();\n this._removeMarkersFromMap();\n this._markers = [];\n};\n\n/**\n * 重新生成,比如改变了属性等\n * @return 无返回值\n */\nMarkerClusterer.prototype._redraw = function () {\n this._clearLastClusters();\n this._createClusters();\n};\n\n/**\n * 获取网格大小\n * @return {Number} 网格大小\n */\nMarkerClusterer.prototype.getGridSize = function() {\n return this._gridSize;\n};\n\n/**\n * 设置网格大小\n * @param {Number} size 网格大小\n * @return 无返回值\n */\nMarkerClusterer.prototype.setGridSize = function(size) {\n this._gridSize = size;\n this._redraw();\n};\n\n/**\n * 获取聚合的最大缩放级别。\n * @return {Number} 聚合的最大缩放级别。\n */\nMarkerClusterer.prototype.getMaxZoom = function() {\n return this._maxZoom; \n};\n\n/**\n * 设置聚合的最大缩放级别\n * @param {Number} maxZoom 聚合的最大缩放级别\n * @return 无返回值\n */\nMarkerClusterer.prototype.setMaxZoom = function(maxZoom) {\n this._maxZoom = maxZoom;\n this._redraw();\n};\n\n/**\n * 获取聚合图标的z-index\n * @return {number | undefined}\n */\nMarkerClusterer.prototype.getZIndex = function () {\n return this._zIndex;\n};\n\n/**\n * 设置聚合图标的z-index\n * @param {number} zIndex\n */\nMarkerClusterer.prototype.setZIndex = function (zIndex) {\n if (this._zIndex != zIndex) {\n this.zIndex = zIndex;\n this._redraw();\n }\n};\n\n/**\n * 获取聚合的样式风格集合\n * @return {Array<IconStyle>} 聚合的样式风格集合\n */\nMarkerClusterer.prototype.getStyles = function() {\n return this._styles;\n};\n\n/**\n * 设置聚合的样式风格集合\n * @param {Array<IconStyle>} styles 样式风格数组\n * @return 无返回值\n */\nMarkerClusterer.prototype.setStyles = function(styles) {\n this._styles = styles;\n this._redraw();\n};\n\n/**\n * 获取单个聚合的最小数量。\n * @return {Number} 单个聚合的最小数量。\n */\nMarkerClusterer.prototype.getMinClusterSize = function() {\n return this._minClusterSize;\n};\n\n/**\n * 设置单个聚合的最小数量。\n * @param {Number} size 单个聚合的最小数量。\n * @return 无返回值。\n */\nMarkerClusterer.prototype.setMinClusterSize = function(size) {\n this._minClusterSize = size;\n this._redraw();\n};\n\n/**\n * 获取单个聚合的落脚点是否是聚合内所有标记的平均中心。\n * @return {Boolean} true或false。\n */\nMarkerClusterer.prototype.isAverageCenter = function() {\n return this._isAverageCenter;\n};\n\n/**\n * 获取聚合的Map实例。\n * @return {BMap.Map} Map的示例。\n */\nMarkerClusterer.prototype.getMap = function() {\n return this._map;\n};\n\n/**\n * 获取所有的标记数组。\n * @return {Array<Marker>} 标记数组。\n */\nMarkerClusterer.prototype.getMarkers = function() {\n return this._markers;\n};\n\n/**\n * 获取聚合的总数量。\n * @return {Number} 聚合的总数量。\n */\nMarkerClusterer.prototype.getClustersCount = function() {\n var count = 0;\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){\n cluster.isReal() && count++; \n }\n return count;\n};\n\n/**\n * 用于计算cluster的文本\n * @param {Array<BMap.Marker>} markers cluster的markers\n * @return {String}\n */\nMarkerClusterer.prototype._textCalculator = function(markers){\n return markers.length.toString();\n};\n\n/**\n * 用于计算cluster的styles的索引\n * @param {Array<BMap.Marker>} markers cluster的markers\n * @param {Number} stylesLength styles的总长度\n * @return {Number} styles的索引\n */\nMarkerClusterer.prototype._stylesIndexCalculator = null;/* function(markers, stylesLength){\n return -1;\n}*/\n\n/**\n * 设置计算cluster的文本的计算函数\n * @param {function(Array<BMap.Marker>)} calculator\n */\nMarkerClusterer.prototype.setTextCalculator = function(calculator){\n this._textCalculator = calculator;\n};\n\n/**\n * 设置计算cluster的styles的索引的计算函数\n * @param {function(Array<BMap.Marker>, Number)} calculator\n */\nMarkerClusterer.prototype.setStylesIndexCalculator = function(calculator){\n this._stylesIndexCalculator = calculator;\n};\n\n/**\n * @ignore\n * Cluster\n * @class 表示一个聚合对象,该聚合,包含有N个标记,这N个标记组成的范围,并有予以显示在Map上的TextIconOverlay等。\n * @constructor\n * @param {MarkerClusterer} markerClusterer 一个标记聚合器示例。\n */\nfunction Cluster(markerClusterer){\n var that = this;\n this._markerClusterer = markerClusterer;\n this._map = markerClusterer.getMap();\n this._minClusterSize = markerClusterer.getMinClusterSize();\n this._isAverageCenter = markerClusterer.isAverageCenter();\n this._center = null;//落脚位置\n this._markers = [];//这个Cluster中所包含的markers\n this._gridBounds = null;//以中心点为准,向四边扩大gridSize个像素的范围,也即网格范围\n this._isReal = false; //真的是个聚合\n\n this._clusterMarker = new TextIconOverlay(this._center, this._markers.length, {\n \"styles\": this._markerClusterer.getStyles(),\n zIndex: markerClusterer._zIndex\n });\n this._clusterMarker.getStyleByText = function (text, styles) {\n if (that._markerClusterer._stylesIndexCalculator) {\n var index = that._markerClusterer._stylesIndexCalculator(that._markers, styles.length);\n return styles[index];\n }\n return TextIconOverlay.prototype.getStyleByText.call(this, text, styles);\n };\n //this._map.addOverlay(this._clusterMarker);\n this._clusterMarker.addEventListener && this._clusterMarker.addEventListener(\"click\", function (event) {\n that._map.setViewport(that.getBounds());\n });\n}\n\n/**\n * 向该聚合添加一个标记。\n * @param {Marker} marker 要添加的标记。\n * @return 无返回值。\n */\nCluster.prototype.addMarker = function(marker){\n if(this.isMarkerInCluster(marker)){\n return false;\n }//也可用marker.isInCluster判断,外面判断OK,这里基本不会命中\n\n if (!this._center){\n this._center = marker.getPosition();\n this.updateGridBounds();//\n } else {\n if(this._isAverageCenter){\n var l = this._markers.length + 1;\n var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l;\n var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l;\n this._center = new BMap.Point(lng, lat);\n this.updateGridBounds();\n }//计算新的Center\n }\n\n marker.isInCluster = true;\n this._markers.push(marker);\n\n // var len = this._markers.length;\n // if(len < this._minClusterSize ){ \n // this._map.addOverlay(marker);\n // //this.updateClusterMarker();\n // return true;\n // } else if (len === this._minClusterSize) {\n // for (var i = 0; i < len; i++) {\n // var label = this._markers[i].getLabel();\n // this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);\n // this._markers[i].setLabel(label);\n // }\n \n // } \n // this._map.addOverlay(this._clusterMarker);\n // this._isReal = true;\n // this.updateClusterMarker();\n return true;\n};\n\nCluster.prototype.render = function(){\n var len = this._markers.length;\n \n if (len < this._minClusterSize) {\n for (var i = 0; i < len; i++) {\n this._map.addOverlay(this._markers[i]);\n }\n } else {\n this._map.addOverlay(this._clusterMarker);\n this._isReal = true;\n this.updateClusterMarker();\n }\n};\n\n/**\n * 判断一个标记是否在该聚合中。\n * @param {Marker} marker 要判断的标记。\n * @return {Boolean} true或false。\n */\nCluster.prototype.isMarkerInCluster= function(marker){\n if (this._markers.indexOf) {\n return this._markers.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; m = this._markers[i]; i++) {\n if (m === marker) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * 判断一个标记是否在该聚合网格范围中。\n * @param {Marker} marker 要判断的标记。\n * @return {Boolean} true或false。\n */\nCluster.prototype.isMarkerInClusterBounds = function(marker) {\n return this._gridBounds.containsPoint(marker.getPosition());\n};\n\nCluster.prototype.isReal = function(marker) {\n return this._isReal;\n};\n\n/**\n * 更新该聚合的网格范围。\n * @return 无返回值。\n */\nCluster.prototype.updateGridBounds = function() {\n var bounds = new BMap.Bounds(this._center, this._center);\n this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize());\n};\n\n/**\n * 更新该聚合的显示样式,也即TextIconOverlay。\n * @return 无返回值。\n */\nCluster.prototype.updateClusterMarker = function () {\n if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) {\n this._clusterMarker && this._map.removeOverlay(this._clusterMarker);\n for (var i = 0, marker; marker = this._markers[i]; i++) {\n this._map.addOverlay(marker);\n }\n return;\n }\n\n if (this._markers.length < this._minClusterSize) {\n this._clusterMarker.hide();\n return;\n }\n\n this._clusterMarker.setPosition(this._center);\n \n this._clusterMarker.setText(this._markerClusterer._textCalculator(this._markers));\n};\n\n/**\n * 删除该聚合。\n * @return 无返回值。\n */\nCluster.prototype.remove = function(){\n for (var i = 0, m; m = this._markers[i]; i++) {\n var label = this._markers[i].getLabel();\n this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);\n this._markers[i].setLabel(label);\n }//清除散的标记点\n this._map.removeOverlay(this._clusterMarker);\n this._markers.length = 0;\n delete this._markers;\n};\n\n/**\n * 获取该聚合所包含的所有标记的最小外接矩形的范围。\n * @return {BMap.Bounds} 计算出的范围。\n */\nCluster.prototype.getBounds = function() {\n var bounds = new BMap.Bounds(this._center,this._center);\n for (var i = 0, marker; marker = this._markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n};\n\n/**\n * 获取该聚合的落脚点。\n * @return {BMap.Point} 该聚合的落脚点。\n */\nCluster.prototype.getCenter = function() {\n return this._center;\n};\n\nexport default MarkerClusterer;\n","// cspell: ignore bmaplib, markerclusterer, texticonoverlay\nimport GMarkerClusterer from '@google/markerclusterer'\nimport BMarkerClusterer from 'bmaplib.markerclusterer'\nimport { noop } from '../../../utils/utils'\nimport type { Point, Size } from '../../types'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\nimport type { GoogleMarker, MarkerOverlay } from '../overlay/marker'\n\nexport interface MarkerClustererOptions {\n markers?: MarkerOverlay[]\n gridSize?: number\n maxZoom?: number\n minClusterSize?: number\n averageCenter?: boolean\n styles?: ClusterIconStyle[],\n stylesIndexCalculator?: (markersLength: number, stylesLength: number) => number,\n zIndex?: number,\n}\nexport interface ClusterIconStyle {\n url: string\n size: Size\n anchor?: Point\n offset?: Point\n textColor?: string\n textSize?: number\n}\nnamespace ClusterIconStyle {\n export function toBaidu(style: ClusterIconStyle) {\n return {\n url: style.url,\n size: new BMap.Size(style.size.width, style.size.height),\n anchor: style.anchor && new BMap.Size(style.anchor.x, style.anchor.y),\n offset: style.offset && new BMap.Size(style.offset.x, style.offset.y),\n textColor: style.textColor,\n textSize: style.textSize,\n }\n }\n\n export function toGoogle(style: ClusterIconStyle) {\n return {\n url: style.url,\n width: style.size.width,\n height: style.size.height,\n anchor: style.anchor && [style.anchor.y, style.anchor.x],\n backgroundPosition: style.offset && `${style.offset.x} ${style.offset.y}`,\n textColor: style.textColor,\n textSize: style.textSize,\n }\n }\n\n}\n\n// cSpell:words nodraw\n/**\n * ## GMarkerClusterer 和 BMarkerClusterer 的区别\n *\n * GMarkerClusterer\n * - resetViewport(): 移除\n * - redraw(): 绘制新的\n * - repaint(): 先移除, 再绘制\n * - setXxx(): 只修改值, 不触发repaint()\n * - add/removeMarker/s(): 接收`opt_nodraw`参数, 为true时不触发redraw/repaint()\n * - clearMarkers(): 只有clear才会将marker从map上移除\n *\n * BMarkerClusterer\n * - _clearLastClusters(): 移除\n * - _createClusters(): 绘制新的\n * - _redraw(): 先移除, 再重绘\n * - setXxx(): 修改值, 同时触发_redraw()\n * - add/removeMarker/s(): 每次都触发_redraw/_createClusters()\n * - clearMarkers(): 同GMarkerClusterer\n *\n * H.clustering.Provider(here的点聚合工具类)\n * - 和baidu/google的api有很大不同, 但总体倾向于baidu的实现, 每次修改坐标点都触发重新计算点聚合\n */\nexport abstract class MarkerClusterer {\n abstract inner: any\n constructor(\n public map: AbstractMap,\n ) {\n noop()\n }\n /** baidu/google 拥有相同的函数名 */\n clearMarkers() {\n this.inner.clearMarkers()\n }\n /** @see clearMarkers */\n addMarker(marker: MarkerOverlay) {\n this.inner.addMarker(marker.innerOverlay)\n }\n /** @see clearMarkers */\n removeMarker(marker: MarkerOverlay): boolean {\n return this.inner.removeMarker(marker.innerOverlay)\n }\n /** @see clearMarkers */\n addMarkers(markers: MarkerOverlay[]) {\n this.inner.addMarkers(markers.map(it => it.innerOverlay))\n }\n /** @see clearMarkers */\n removeMarkers(markers: MarkerOverlay[]): boolean {\n return this.inner.removeMarkers(markers.map(it => it.innerOverlay))\n }\n\n abstract recreate(): void\n}\n\nexport class BaiduMarkerClusterer extends MarkerClusterer {\n inner: BMarkerClusterer\n constructor(map: BaiduMap, options: MarkerClustererOptions) {\n super(map)\n // ## webpack:\n // 延时导入, 防止BMap不存在\n // const BMarkerClusterer = require('bmaplib.markerclusterer')\n // ## vite:\n // import导入是异步的, 故无法写在这里, 改成在模块顶部直接导入\n // TODO: 2023/03/16 ipcjs 会不会有初始化时机的问题?\n this.inner = new BMarkerClusterer(map.innerMap, {\n // baidu的构造器中的markers, 会触发重绘, 会导致使用旧的calculator计算cluster\n // markers: options.markers?.map(it => (it as BaiduMarker).innerOverlay),\n gridSize: options.gridSize,\n maxZoom: options.maxZoom,\n minClusterSize: options.minClusterSize,\n isAverageCenter: options.averageCenter,\n styles: options.styles?.map(it => ClusterIconStyle.toBaidu(it)),\n zIndex: options.zIndex,\n })\n const calculator = options.stylesIndexCalculator\n if (calculator) {\n this.inner.setStylesIndexCalculator((markers: any[], stylesLength: number) => {\n return calculator(markers.length, stylesLength)\n })\n }\n // 在设置了calculator后再添加marker\n if (options.markers) {\n this.addMarkers(options.markers)\n }\n }\n override recreate(): void {\n this.inner._redraw()\n }\n}\nexport class GoogleMarkerClusterer extends MarkerClusterer {\n inner: GMarkerClusterer\n constructor(map: GoogleMap, options: MarkerClustererOptions) {\n super(map)\n this.inner = new GMarkerClusterer(\n map.innerMap,\n // google的构造器中的markers,不会触发重绘, 第一次绘制通过监听地图的'idle'事件触发, 可以直接设置\n options.markers?.map(it => (it as GoogleMarker).innerOverlay),\n {\n gridSize: options.gridSize,\n maxZoom: options.maxZoom,\n minimumClusterSize: options.minClusterSize,\n averageCenter: options.averageCenter,\n styles: options.styles?.map(it => ClusterIconStyle.toGoogle(it)),\n zIndex: options.zIndex,\n },\n )\n const calculator = options.stylesIndexCalculator\n if (calculator) {\n this.inner.setCalculator((markers: any[], stylesLength: number) => {\n return {\n text: markers.length,\n // google内部, 取index时, 会`-1`...故我们这里`+1`, 抵消掉它\n index: calculator(markers.length, stylesLength) + 1,\n }\n })\n }\n }\n override recreate(): void {\n this.inner.repaint()\n }\n}\n","import { LatLng, LatLngBounds, Location, noop, throwUnsupported, type AbstractMap } from '../../../components'\nimport { parseGooglePlace } from '../../../utils/google-utils'\nimport type { UnionPlacesService } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\n\nexport interface Place {\n id: string\n position: LatLng\n country: string\n province: string\n city: string\n title: string\n address: string\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PlacesServiceOptions {\n\n}\n\nexport abstract class PlacesService {\n abstract inner: UnionPlacesService\n abstract map: AbstractMap\n constructor(\n ) { noop() }\n\n /** 指定{@link location}搜索, 若不指定, 则默认使用地图的中心点 */\n abstract search(query: string, location?: Location): Promise<Place[]>\n /** 在指定的bounds范围内搜索 */\n abstract searchInBounds(query: string, bounds: LatLngBounds): Promise<Place[]>\n /** 在指定的center+radius范围内搜索 */\n abstract searchNearBy(query: string, center: LatLng, radius: number): Promise<Place[]>\n}\n\nexport class GooglePlacesService extends PlacesService {\n inner: google.maps.places.PlacesService\n constructor(public map: GoogleMap, _options: PlacesServiceOptions) {\n super()\n this.inner = new google.maps.places.PlacesService(map.innerMap)\n }\n override search(query: string, location?: Location): Promise<Place[]> {\n return this.searchImpl(\n query,\n location instanceof LatLng ? location.toGoogle(this.map.coordType) : location ?? this.map.innerMap.getCenter(),\n )\n }\n override searchInBounds(query: string, bounds: LatLngBounds) {\n return this.searchImpl(query, bounds.toGoogle(this.map.coordType))\n }\n override searchNearBy(query: string, center: LatLng, radius: number) {\n return this.searchImpl(query, { center: center.toGoogle(this.map.coordType), radius: radius })\n }\n\n private searchImpl(\n query: string,\n locationBias?: google.maps.LatLng | google.maps.LatLngLiteral |\n google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral |\n google.maps.Circle | google.maps.CircleLiteral | string,\n ): Promise<Place[]> {\n return new Promise((resolve, reject) => {\n this.inner.findPlaceFromQuery({\n query: query,\n fields: [\n 'formatted_address',\n 'geometry',\n 'name',\n 'place_id',\n // 'address_components', // TODO: 2023/04/28 ipcjs 查询请求不支持该字段...\n ],\n locationBias,\n }, (results, status) => {\n switch (status) {\n case google.maps.places.PlacesServiceStatus.ZERO_RESULTS:\n case google.maps.places.PlacesServiceStatus.OK: {\n const places = (results ?? []).map(result => parseGooglePlace(result, this.map))\n resolve(places)\n break\n }\n default:\n reject(new Error(`status: ${status}`))\n break\n }\n })\n })\n }\n}\n\nexport class BaiduPlacesService extends PlacesService {\n private searchRequestMap = new Map<string, { resolve: any, reject: any }>()\n get inner() {\n return this.currentSearch!\n }\n currentSearch: BMap.LocalSearch | undefined\n constructor(public map: BaiduMap, _options: PlacesServiceOptions) {\n super()\n }\n override search(query: string, location?: Location): Promise<Place[]> {\n return this.newSearch(\n location instanceof LatLng ? location.toBaidu(this.map.coordType) : location ?? this.map.innerMap.getCenter(),\n (search) => {\n search.search(query)\n },\n )\n }\n\n override searchInBounds(query: string, bounds: LatLngBounds): Promise<Place[]> {\n return this.newSearch(undefined, (search) => {\n search.searchInBounds(query, bounds.toBaidu(this.map.coordType))\n })\n }\n\n override searchNearBy(query: string, center: LatLng, radius: number): Promise<Place[]> {\n return this.newSearch(undefined, (search) => {\n search.searchNearby(query, center.toBaidu(this.map.coordType), radius)\n })\n }\n\n private newSearch(location: string | BMap.Point | undefined, block: (search: BMap.LocalSearch) => void) {\n return new Promise<Place[]>((resolve, reject) => {\n const search = new BMap.LocalSearch(location ?? this.map.innerMap, {\n onSearchComplete: (result) => {\n if (Array.isArray(result)) {\n throwUnsupported('当前只支持一次搜索一条数据')\n }\n const status = search.getStatus()\n switch (status) {\n case BMAP_STATUS_SUCCESS: {\n // TODO: 2023/04/28 ipcjs 怎么处理分页?\n const places: Place[] = []\n for (let i = 0; i < result.getCurrentNumPois(); i++) {\n const poi = result.getPoi(i)\n places.push({\n id: poi.uid,\n city: poi.city,\n country: '', // 百度地图只支持中国\n position: LatLng.fromBaidu(poi.point, this.map.coordType),\n province: poi.province,\n title: poi.title,\n address: poi.address,\n })\n }\n resolve(places)\n break\n }\n case BMAP_STATUS_UNKNOWN_LOCATION:\n // 和google保持一致, 未找到时直接返回空数组\n resolve([])\n break\n default:\n reject(new Error(`status: ${status}`))\n break\n }\n },\n })\n block(search)\n })\n }\n}\n","import { parseGooglePlace } from '../../../utils/google-utils'\nimport { noop, throwError } from '../../../utils/utils'\nimport type { EventCallback } from '../../../utils/vue-utils'\nimport { addGoogleEventListener, type RemoveEventListenerFunction } from '../../event-target'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\nimport type { Autocomplete } from './autocomplete'\nimport type { Place, PlacesService } from './places-service'\n\nexport interface SearchBoxOptions {\n input: HTMLInputElement,\n}\n\nexport abstract class SearchBox {\n protected onData: EventCallback<Place[]> | undefined\n protected onError: ((e: any) => void) | undefined\n constructor(\n public map: AbstractMap,\n protected input: HTMLInputElement,\n ) { noop() }\n\n /**\n * 设置搜索结果监听\n *\n * @mustCallSuper 子类必须调用一次`super.setSearchListener`, 用来保存{@link onData}和{@link onError}\n * */\n setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n if (this.onData) throwError('setSearchListener只能调用一次')\n this.onData = onData\n this.onError = onError\n return noop\n }\n\n /** 用输入框的内容执行一次搜索 */\n abstract search(): void\n}\n\nexport class GoogleSearchBox extends SearchBox {\n private searchBox: google.maps.places.SearchBox\n constructor(map: GoogleMap, options: SearchBoxOptions) {\n super(map, options.input)\n this.searchBox = new google.maps.places.SearchBox(options.input)\n this.searchBox.bindTo('bounds', map.innerMap)\n }\n\n override setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n super.setSearchListener(onData, onError)\n return addGoogleEventListener(this.searchBox, 'places_changed', () => {\n const places = this.searchBox.getPlaces() // 返回数据不包含address_components字段...\n onData((places ?? []).map(it => parseGooglePlace(it, this.map)))\n })\n }\n\n override search(): void {\n if (!this.input.value) return\n // https://stackoverflow.com/questions/20407045/google-maps-trigger-search-box-on-button-click\n // 1. 聚焦\n google.maps.event.trigger(this.input, 'focus', {})\n // 2. 回车, 执行搜索\n google.maps.event.trigger(this.input, 'keydown', { keyCode: 13 })\n }\n}\nexport class BaiduSearchBox extends SearchBox {\n private autocomplete: Autocomplete\n private placesService: PlacesService\n constructor(map: BaiduMap, options: SearchBoxOptions) {\n super(map, options.input)\n this.autocomplete = map.createAutocomplete({ input: options.input, bindToMap: true })\n this.placesService = map.createPlacesService({})\n }\n\n override setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n super.setSearchListener(onData, onError)\n return this.autocomplete.addResultListener((result) => {\n this.searchImpl(result.country + result.province + result.city + result.district + result.street + result.streetNumber + result.title)\n })\n }\n\n override search(): void {\n if (!this.input.value) return\n this.searchImpl(this.input.value)\n }\n\n private searchImpl(value: string) {\n this.placesService.search(value)\n .then(this.onData, this.onError)\n }\n}\n","import type * as CSS from 'csstype'\nimport { lateinit } from '../../utils/mapped-types'\nimport type { Tg } from '../event'\nimport type { AbstractEventTargetDelegate } from '../event-target'\nimport type { CoordType, CoordTypeSupplier, LatLng, LatLngBounds } from '../lat-lng'\nimport type { Padding, Point } from '../types'\nimport type { UnionMap } from '../unions'\nimport type { AbstractControl, CustomControl } from './controls/control'\nimport type { MapTypeControl, MapTypeControlOptions } from './controls/map-type.control'\nimport type { ScaleControlOptions } from './controls/scale.control'\nimport type { StreetViewControl, StreetViewControlOptions } from './controls/street-view.control'\nimport type { ZoomControl, ZoomControlOptions } from './controls/zoom.control'\nimport type { Autocomplete, AutocompleteOptions } from './extra/autocomplete'\nimport type { Heatmap, HeatmapOptions } from './extra/heatmap'\nimport type { MapUrls, MapUrlsOptions } from './extra/map-urls'\nimport type { MarkerClusterer, MarkerClustererOptions } from './extra/marker-clusterer'\nimport type { PlacesService, PlacesServiceOptions } from './extra/places-service'\nimport type { SearchBox, SearchBoxOptions } from './extra/search-box'\nimport type { GestureHandlingOptions, MapStyle } from './map-options'\nimport type { BuildInMapTypeId, Layer, MapType, OverlayMapType } from './map-type'\nimport type { CircleOptions, CircleOverlay } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport type { InfoBoxOptions, InfoBoxOverlay } from './overlay/info-box'\nimport type { InfoWindowOptions, InfoWindowOverlay } from './overlay/info-window'\nimport type { LabelOptions, LabelOverlay } from './overlay/label'\nimport type { MarkerOptions, MarkerOverlay } from './overlay/marker'\nimport type { Overlay } from './overlay/overlay'\nimport type { PolygonOptions, PolygonOverlay } from './overlay/polygon'\nimport type { PolylineOptions, PolylineOverlay } from './overlay/polyline'\nimport type { RectangleOptions, RectangleOverlay } from './overlay/rectangle'\n\nexport type AbstractMapEventMap = {\n click: Tg.MouseEvent\n dblclick: Tg.MouseEvent\n /** @deprecated 使用`contextmenu`替代 */\n rightclick: Tg.MouseEvent\n contextmenu: Tg.MouseEvent\n\n dragstart: Tg.Event\n drag: Tg.Event\n dragend: Tg.Event\n\n /**\n * ## 不同行为\n * - baidu: 不会触发\n * - google: 正常触发\n */\n mouseover: Tg.MouseEvent\n /** @see mouseover */\n mouseout: Tg.MouseEvent\n\n mousedown: Tg.MouseEvent\n mousemove: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n\n tilesloaded: Tg.Event\n /**\n * ## 不同实现\n * - baidu: 同时监听movestart & moving & moveend & zoomend事件, 只要地图\"移动\"就会触发\n * - google: 监听center_changed事件, 拖着地图移动时会不断触发, 松手后只触发一次, center的值直接变为地图停止时的最终值...\n */\n 'center-changed': Tg.Event\n /**\n * ## 不同实现\n * - baidu: 监听zoomend事件\n * - google: 监听zoom_changed事件\n */\n 'zoom-changed': Tg.Event\n 'map-type-changed': Tg.Event\n}\n\n/** 预设的几个地图Zoom等级 */\nexport const enum MapZoom {\n /** 世界 */\n WORLD = 1,\n /** 大洲 */\n STATE = 5,\n /** 城市 */\n CITY = 10,\n /** 街道 */\n STREET = 15,\n /** 建筑 */\n BUILDING = 20,\n}\n\n/** 抽象出来的Map类 */\nexport abstract class AbstractMap implements CoordTypeSupplier, Tg.EventTarget {\n private latestInfoWindow: InfoWindowOverlay | undefined\n /** 使用{@link setEventTargetDelegate}初始化 */\n private delegate = lateinit<AbstractEventTargetDelegate>()\n constructor(\n public element: HTMLElement,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n setTimeout(() => {\n if (!this.delegate) {\n console.warn(`${this.constructor.name}继承了AbstractMap, 但未调用setEventTargetDelegate(delegate)`)\n }\n })\n }\n }\n abstract setGestureHandling(gestureHandling: GestureHandlingOptions): void\n\n abstract get innerMap(): UnionMap\n abstract get coordType(): CoordType\n protected setEventTargetDelegate(delegate: AbstractEventTargetDelegate) {\n this.delegate = delegate.setTarget(this)\n }\n /** 使用重载, 规范事件类型 */\n addEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void\n addEventListener(type: string, listener: Tg.EventListener): void\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n /** @see addEventListener */\n removeEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void\n removeEventListener(type: string, listener: Tg.EventListener): void\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n\n /** 最后一次显示的InfoWindow, 不保证当前它仍然是打开状态 */\n getLatestInfoWindow(): InfoWindowOverlay | undefined {\n return this.latestInfoWindow\n }\n /** 仅用于@tg/map内部使用, 外部不要调用 */\n setLatestInfoWindowInternal(infoWindow: InfoWindowOverlay) {\n this.latestInfoWindow = infoWindow\n }\n /** 地图容器内的坐标点到经纬度之间转换 */\n abstract fromContainerPointToLatLng(point: Point): LatLng\n /** @see fromContainerPointToLatLng */\n abstract fromLatLngToContainerPoint(latLng: LatLng): Point\n abstract setDefaultCursor(cursor: CSS.Property.Cursor): void\n /**\n * ## 不同行为\n * - baidu: 禁用拖拽后, 依然可以滚轮缩放\n * - google: 禁用拖拽后, 不能滚轮缩放\n */\n abstract setDraggable(draggable: boolean): void\n /** 启用/禁用双击放大 */\n abstract setDoubleClickZoom(enable: boolean): void\n abstract getCenter(): LatLng\n /**\n * ## {@link setZoom}和{@link setCenter}的调用顺序问题\n * - baidu: 这两个方法调用是区分顺序的, 若先调用`setCenter`再调用`setZoom`, 中心点会出现偏移\n * - google: 不区分顺序\n */\n abstract setCenter(latlng: LatLng): void\n abstract setMinZoom(zoom: number): void\n abstract setMaxZoom(zoom: number): void\n abstract setMapStyle(mapStyle?: MapStyle): void\n /** setMapType的便利版, 只能够用来设置内置地图类型 */\n abstract setBuildInMapTypeId(id: BuildInMapTypeId): void\n abstract setMapType(mapType: MapType): void\n abstract getMapType(): MapType\n abstract addLayer(layer: Layer): void\n abstract removeLayer(layer: Layer): void\n addOverlayMapType(mapType: OverlayMapType): void {\n this.addLayer(mapType)\n }\n removeOverlayMapType(mapType: OverlayMapType): void {\n this.removeLayer(mapType)\n }\n abstract panTo(position: LatLng): void\n abstract panBy(x: number, y: number): void\n abstract fitBounds(bounds: LatLngBounds, padding?: Padding): void\n abstract getBounds(): LatLngBounds\n // Overlay\n abstract addElementOverlay(overlay: ElementOverlay): void\n abstract removeElementOverlay(overlay: ElementOverlay): void\n abstract addOverlay(overlay: Overlay): void\n abstract removeOverlay(overlay: Overlay): void\n abstract createMarker(options: MarkerOptions): MarkerOverlay\n abstract createMarkerClusterer(options: MarkerClustererOptions): MarkerClusterer\n abstract createHeatmap(options: HeatmapOptions): Heatmap\n abstract createAutocomplete(options: AutocompleteOptions): Autocomplete\n abstract createSearchBox(options: SearchBoxOptions): SearchBox\n abstract createPlacesService(options: PlacesServiceOptions): PlacesService\n abstract createMapUrls(options: MapUrlsOptions): MapUrls\n abstract createInfoWindow(options: InfoWindowOptions): InfoWindowOverlay\n abstract createInfoBox(options: InfoBoxOptions): InfoBoxOverlay\n abstract createPolyline(options: PolylineOptions): PolylineOverlay\n abstract createPolygon(options: PolygonOptions): PolygonOverlay\n abstract createRectangle(options: RectangleOptions): RectangleOverlay\n abstract createCircle(options: CircleOptions): CircleOverlay\n abstract createLabel(options: LabelOptions): LabelOverlay\n // Control\n /**\n * ## 不同行为\n * - baidu: 添加的同一个方位的自定义Control会重叠在一起\n * - google: 添加的同一个方位的自定义Control不会重叠, 会平铺开来\n */\n abstract addCustomControl(control: CustomControl): void\n abstract removeCustomControl(control: CustomControl): void\n abstract createMapTypeControl(options: MapTypeControlOptions): MapTypeControl\n abstract createZoomControl(options: ZoomControlOptions): ZoomControl\n abstract createStreetViewControl(options: StreetViewControlOptions): StreetViewControl\n abstract createScaleControl(options: ScaleControlOptions): ZoomControl\n addControl(control: AbstractControl): void {\n control.addTo(this)\n }\n removeControl(control: AbstractControl): void {\n control.removeFrom(this)\n }\n // 同名方法\n getZoom(): number {\n return this.innerMap.getZoom() ?? 0\n }\n /** @see setCenter */\n setZoom(zoom: number): void {\n this.innerMap.setZoom(zoom)\n }\n}\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(val) {\n return val != null && typeof val === 'object' && Array.isArray(val) === false;\n}\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObjectObject(o) {\n return isObject(o) === true\n && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObjectObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (typeof ctor !== 'function') return false;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObjectObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexport default isPlainObject;\n","import isPlainObject from 'is-plain-object'\n\nexport namespace Objects {\n export function fromArray<T>(arr: T[], keySelector: (it: T) => string) {\n return arr.reduce((r, it) => {\n r[keySelector(it)] = it\n return r\n }, {} as { [key: string]: T })\n }\n\n export function fromEntries<V>(entries: [string, V][]) {\n return entries.reduce((r, it) => {\n r[it[0]] = it[1]\n return r\n }, {} as { [k: string]: V })\n }\n\n export function toJsonSafely(value: any) {\n return JSON.stringify(value, (key, value) => {\n if (typeof value === 'object' && Object.getPrototypeOf(value) !== Object.prototype) {\n // 针对非纯对象做特殊处理, 防止stringify中报错\n return value.toString !== Object.prototype.toString\n ? value.toString() // 自定义了toString, 则使用\n : `[object ${Object.getPrototypeOf(value).constructor.name}]` // 否则打印构造器的名字\n }\n return value\n })\n }\n\n /** 删除obj中纯对象上的值为undefined的属性 */\n export function deleteUndefinedPropertyOnPlainObjectDeeply(obj: any) {\n if (isPlainObject(obj)) {\n Object.keys(obj).forEach((key) => {\n if (obj[key] === undefined) {\n delete obj[key]\n } else {\n deleteUndefinedPropertyOnPlainObjectDeeply(obj[key])\n }\n })\n }\n }\n /** 存在则返回, 不存在则新建 */\n export function putIfAbsent<K extends keyof any, V>(\n obj: Record<K, V>,\n key: K,\n ifAbsent: () => Exclude<V, undefined>,\n ) {\n let value = obj[key]\n if (value === undefined) {\n value = ifAbsent()\n obj[key] = value\n }\n return value as Exclude<V, undefined>\n }\n\n /** @see Omit */\n export function omit<T, K extends keyof any>(obj: T, ...keys: K[]): Omit<T, K> {\n const includes = includesMethod(keys)\n\n const result: any = {}\n for (const key in obj) {\n if (!includes(key)) {\n result[key] = obj[key]\n }\n }\n return result\n }\n /** @see Pick */\n export function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n const includes = includesMethod(keys)\n\n const result: any = {}\n for (const key in obj) {\n if (includes(key)) {\n result[key] = obj[key]\n }\n }\n return result\n }\n /**\n * 使用{@link keyPath}读取`obj`的字段\n *\n * @param keyPath `.`分隔的字段名 或 字段名数组\n * @returns 若字段不存在, 则返回`undefined`\n */\n export function get(obj: any, keyPath: string | string[]): any {\n const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath\n let value = obj\n for (const key of keys) {\n if (value == null) {\n return undefined\n }\n value = value[key]\n }\n return value\n }\n export function del(obj: any, keyPath: string | string[]): any {\n const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath\n const lastObj = get(obj, keys.slice(0, -1))\n const lastKey = keys[keys.length - 1]\n if (lastObj != null) {\n delete lastObj[lastKey]\n }\n }\n}\n\nfunction includesMethod(keys: any[]) {\n if (keys.length <= 4) {\n return keys.includes.bind(keys)\n } else {\n const keySet = new Set(keys)\n return keySet.has.bind(keySet)\n }\n}\n\n/** 用于替代Vue2中的filter, 直接交给模板使用 */\nexport const stringify = Objects.toJsonSafely\n","import deepmerge from 'deepmerge'\nimport isPlainObject from 'is-plain-object'\nimport { Objects } from '../../utils/objects'\nimport { LatLng } from '../lat-lng'\nimport type { BuildInMapTypeId } from './map-type'\n\nexport const InfoWindowModeValues = ['single', 'multi'] as const\n\nexport type InfoWindowMode = typeof InfoWindowModeValues[number]\n\n/**\n * 完全模仿google的模式, 合并如下配置:\n * - draggable\n * - scrollWheel\n * - doubleClickZoom\n */\nexport enum GestureHandlingOptions {\n /** 默认, 若页面可滚动, 则为cooperative, 否则为greedy */\n auto = 'auto',\n /** 全部设为false */\n none = 'none',\n /** 贪婪, 全部设为true */\n greedy = 'greedy',\n /** 合作, 按住ctrl或者双指才能缩放地图 */\n cooperative = 'cooperative'\n}\n\nexport interface MapOptions {\n /** 中心点 */\n center: LatLng\n /** 缩放等级, 必须是整数 */\n zoom: number\n /**\n * ## 不同行为\n * - baidu: 只支持单窗口\n * - google: 支持单窗口或多窗口, 默认多窗口\n *\n * 要显示多个弹窗, 推荐使用InfoBox替代\n *\n * {@macros info_window_vs_box}\n */\n infoWindowMode?: InfoWindowMode\n gestureHandling?: GestureHandlingOptions\n minZoom?: number\n maxZoom?: number\n mapStyle?: MapStyle\n buildInMapTypeId?: BuildInMapTypeId\n}\n\nexport namespace MapOptions {\n export function create(options?: Partial<MapOptions>): MapOptions {\n // 删掉多余的undefined属性, 防止覆盖默认值\n Objects.deleteUndefinedPropertyOnPlainObjectDeeply(options)\n const defaultOptions = { center: LatLng.ZERO, zoom: 5 }\n\n const mergeOptions: deepmerge.Options = {\n isMergeableObject: isPlainObject,\n }\n return deepmerge(defaultOptions, options || {}, mergeOptions)\n }\n}\n\n/**\n * ## 本地样式编辑器\n * - google: https://mapstyle.withgoogle.com/\n * - baidu: https://lbsyun.baidu.com/apiconsole/custommap\n *\n * ## 关于云端样式\n * - google: mapId只有创建时有效, 之后再更改无效\n * - baidu: styleId无效, 原因未知\n */\nexport interface MapStyle {\n baidu: BMap.MapStyleV2\n google: {\n styles?: google.maps.MapTypeStyle[],\n mapId?: string,\n }\n}\n","import type { Tg } from '../../event'\nimport { BaiduEventTargetDelegate, GoogleEventTargetDelegate, type EventTargetDelegate } from '../../event-target'\nimport type { CoordType } from '../../lat-lng'\nimport type { UnionBaiduOverlay, UnionGoogleOverlay } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport interface OverlayOptions {\n /** @default true */\n visible?: boolean\n}\n\nexport abstract class Overlay<T = unknown> implements Tg.EventTarget {\n constructor(\n public innerOverlay: T,\n /** 用于保存Overlay内部点的坐标, 它的值有可能和map的不同 */\n protected coordType: CoordType,\n ) { }\n protected abstract map: AbstractMap\n\n // 使用方法创建Delegate, 子类复写起来更方便\n protected abstract createDelegate(): EventTargetDelegate\n\n private _delegate: EventTargetDelegate | undefined\n private get delegate(): EventTargetDelegate {\n this._delegate ??= this.createDelegate().setTarget(this)\n return this._delegate\n }\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n\n remove() {\n this.map.removeOverlay(this)\n }\n\n abstract isVisible(): boolean\n abstract setVisible(visible: boolean): void\n}\n\nexport class GoogleOverlay<T extends UnionGoogleOverlay = UnionGoogleOverlay> extends Overlay<T> {\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n protected override map: GoogleMap,\n ) {\n super(innerOverlay, coordType)\n }\n\n protected createDelegate(): EventTargetDelegate {\n return new GoogleEventTargetDelegate(this.innerOverlay, this.map)\n }\n\n override isVisible() {\n return this.innerOverlay.getVisible()\n }\n override setVisible(visible: boolean) {\n this.innerOverlay.setVisible(visible)\n }\n}\n\nexport class BaiduOverlay<T extends UnionBaiduOverlay = UnionBaiduOverlay> extends Overlay<T> {\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n protected override map: BaiduMap,\n ) {\n super(innerOverlay, coordType)\n }\n\n protected createDelegate(): EventTargetDelegate {\n return new BaiduEventTargetDelegate(this.innerOverlay, this.map)\n }\n\n /** 仅限内部使用; 设为private时, 生成的d.ts文件中, 方法返回值会变成any, 故改成了public */\n get overlay() {\n // 这几个属性被声明成可选的, 这里将其强转成必选\n return this.innerOverlay as Required<Pick<UnionBaiduOverlay, 'isVisible' | 'show' | 'hide'>>\n }\n\n override isVisible() {\n return this.overlay.isVisible()\n }\n\n override setVisible(visible: boolean) {\n if (visible) {\n this.overlay.show()\n } else {\n this.overlay.hide()\n }\n }\n\n /** 在创建BaiduOverlay时, 设置options.visible, 仅内部使用 */\n visibleOptionInternal(visible: boolean | undefined) {\n if (visible !== undefined) {\n if (!visible) {\n this.setVisible(false)\n }\n }\n return this\n }\n}\n","import type { CoordType } from '../../lat-lng'\nimport type { UnionBaiduShape, UnionGoogleShape } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { SymbolIcon } from './icon'\nimport { BaiduOverlay, GoogleOverlay, type OverlayOptions } from './overlay'\n\nexport interface ShapeOptions extends OverlayOptions {\n clickable?: boolean\n editable?: boolean\n strokeColor?: string\n strokeOpacity?: number\n /**\n * ## 取值范围不同\n * - google: 最大值约为32, 更大的值不影响线宽\n * - baidu: 没有上限\n */\n strokeWeight?: number\n fillColor?: string\n fillOpacity?: number\n}\n\nexport interface Shape {\n isEditable(): boolean\n setEditable(editable: boolean): void\n setStrokeColor(color: string): void\n setStrokeOpacity(opacity: number): void\n setStrokeWeight(weight: number): void\n /** Polyline 没有该方法 */\n setFillColor(color: string): void\n /** @see setFillColor */\n setFillOpacity(opacity: number): void\n}\n\nexport type NotFillableShape = Omit<Shape, 'setFillColor' | 'setFillOpacity'>\n\nexport type NotFillableShapeOptions = Omit<ShapeOptions, 'fillColor' | 'fillOpacity'>\n\nexport abstract class BaiduShape<T extends UnionBaiduShape> extends BaiduOverlay<T> implements Shape {\n /**\n * baidu地图的透明度属性有如下问题:\n * - 在透明度为0时, 无法隐藏掉颜色\n * - 透明度为0.7和0.8时, 在maintain的发布模式下, polyline的线条会不可见 (原因未知, 在tg-map中无法复现)\n * 故统一加个0.001, 规避这些问题...\n */\n static OPACITY_DELTA = 0.001\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n map: BaiduMap,\n protected state: { editable: boolean, symbolIcons?: SymbolIcon[] },\n ) {\n super(innerOverlay, coordType, map)\n }\n isEditable(): boolean {\n return this.state.editable\n }\n setEditable(editable: boolean): void {\n this.state.editable = editable\n editable ? this.innerOverlay.enableEditing() : this.innerOverlay.disableEditing()\n }\n\n setStrokeColor(color: string): void {\n this.innerOverlay.setStrokeColor(color)\n }\n setStrokeOpacity(opacity: number): void {\n this.innerOverlay.setStrokeOpacity(opacity + BaiduShape.OPACITY_DELTA)\n }\n setStrokeWeight(weight: number): void {\n this.innerOverlay.setStrokeWeight(weight)\n }\n setFillColor(color: string): void {\n this.innerOverlay.setFillColor(color)\n }\n setFillOpacity(opacity: number): void {\n this.innerOverlay.setFillOpacity(opacity + BaiduShape.OPACITY_DELTA)\n }\n}\n\nexport abstract class GoogleShape<T extends UnionGoogleShape> extends GoogleOverlay<T> implements Shape {\n isEditable(): boolean {\n return this.innerOverlay.getEditable()\n }\n setEditable(editable: boolean): void {\n this.innerOverlay.setEditable(editable)\n }\n\n setStrokeColor(color: string): void {\n this.innerOverlay.setOptions({ strokeColor: color })\n }\n setStrokeOpacity(opacity: number): void {\n this.innerOverlay.setOptions({ strokeOpacity: opacity })\n }\n setStrokeWeight(weight: number): void {\n this.innerOverlay.setOptions({ strokeWeight: weight })\n }\n setFillColor(color: string): void {\n this.innerOverlay.setOptions({ fillColor: color })\n }\n setFillOpacity(opacity: number): void {\n this.innerOverlay.setOptions({ fillOpacity: opacity })\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type CircleEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n 'radius-changed': Tg.Event,\n 'center-changed': Tg.Event,\n}\n\nexport interface CircleOptions extends ShapeOptions {\n center: LatLng\n radius: number\n}\n\nexport interface Circle extends Tg.EventTargetTyped<Circle, CircleEventMap>, Shape {\n setCenter(center: LatLng): void\n getCenter(): LatLng\n setRadius(radius: number): void\n getRadius(): number\n}\n\nexport type CircleOverlay = Circle & Overlay\n\nexport class BaiduCircle extends BaiduShape<BMap.Circle> implements Circle {\n static create(this: BaiduMap, options: CircleOptions) {\n const coord = this.coordType\n const inner = new BMap.Circle(options.center.toBaidu(coord), options.radius, {\n enableClicking: options.clickable,\n // 详见: {@macros circle.baidu.radius_maybe_zero}\n enableEditing: false, // options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n const circle = new BaiduCircle(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n // {@template circle.baidu.radius_maybe_zero}\n // 在创建inner时直接设置成可编辑状态, 有时会出现半径变成0的情况\n // 改成延后一帧设置, 可以规避该问题\n // {@endtemplate}\n if (circle.state.editable) {\n setTimeout(() => {\n if (circle.state.editable) {\n inner.enableEditing()\n }\n }, 0)\n }\n return circle\n }\n\n private prevCenter: BMap.Point | undefined\n private prevRadius: number | undefined\n private isDoingSetCenter = false\n private isDoingSetRadius = false\n private eventHubDelegate: EventHubEventTargetDelegate<'radius-changed'|'center-changed'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['radius-changed', 'center-changed'],\n onListen: (type) => {\n // 从lineupdate事件中过滤出单个属性的变更的逻辑, 参考: [BaiduPolyShape](file://./polyline.ts#L40)\n if (type === 'radius-changed') {\n this.prevRadius = this.innerOverlay.getRadius()\n this.innerOverlay.addEventListener('lineupdate', this.onRadiusChanged)\n } else {\n this.prevCenter = this.innerOverlay.getCenter()\n this.innerOverlay.addEventListener('lineupdate', this.onCenterChanged)\n }\n },\n onCancel: (type) => {\n this.innerOverlay.removeEventListener('lineupdate', type === 'radius-changed' ? this.onRadiusChanged : this.onCenterChanged)\n },\n }))\n }\n\n private onRadiusChanged = () => {\n const radius = this.innerOverlay.getRadius()\n if (this.prevRadius !== radius) {\n if (!this.isDoingSetRadius) this.eventHubDelegate?.notify({ type: 'radius-changed', target: this })\n this.prevRadius = radius\n }\n }\n private onCenterChanged = () => {\n const center = this.innerOverlay.getCenter()\n if (this.prevCenter !== center) {\n if (!this.isDoingSetCenter) this.eventHubDelegate?.notify({ type: 'center-changed', target: this })\n this.prevCenter = center\n }\n }\n\n private resetEditableTimeoutId : TimeoutId | undefined\n\n setCenter(center: LatLng): void {\n this.coordType = this.map.coordType\n this.isDoingSetCenter = true\n this.innerOverlay.setCenter(center.toBaidu(this.coordType))\n this.isDoingSetCenter = false\n\n if (this.state.editable) {\n // 修改中心点后, 有很大概率会丢失编辑中状态, 原因未知\n // 手动重置一次状态, 保证依然处于编辑中\n clearTimeout(this.resetEditableTimeoutId)\n this.resetEditableTimeoutId = setTimeout(() => {\n if (this.state.editable) {\n this.innerOverlay.disableEditing()\n this.innerOverlay.enableEditing()\n }\n }, 0)\n }\n }\n getCenter(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getCenter(), this.coordType)\n }\n setRadius(radius: number): void {\n this.isDoingSetRadius = true\n this.innerOverlay.setRadius(radius)\n this.isDoingSetRadius = false\n }\n getRadius(): number {\n return this.innerOverlay.getRadius()\n }\n}\nexport class GoogleCircle extends GoogleShape<google.maps.Circle> implements Circle {\n static create(this: GoogleMap, options: CircleOptions) {\n const coord = this.coordType\n const inner = new google.maps.Circle({\n center: options.center.toGoogle(coord),\n radius: options.radius,\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GoogleCircle(inner, coord, this)\n }\n\n setCenter(center: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setCenter(center.toGoogle(this.coordType))\n }\n getCenter(): LatLng {\n return LatLng.fromGoogle(this.innerOverlay.getCenter() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n setRadius(radius: number): void {\n this.innerOverlay.setRadius(radius)\n }\n getRadius(): number {\n return this.innerOverlay.getRadius()\n }\n}\n","/**\n * 3.0版的Overlay是类\n * @see http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html#a3b0\n */\nexport function ensureBaiduV3() {\n if (BMap.OverlayV3) {\n return\n }\n BMap.OverlayV3 = (BMap as any).Overlay\n}\n\nexport const BMapPoints = {\n /** {@link BMap.Point.equals} 无效, 故需要自己写一个 */\n equals(a: BMap.Point, b: BMap.Point) {\n return a.lat === b.lat && a.lng === b.lng\n },\n}\n","export interface Size {\n readonly width: number\n readonly height: number\n}\nexport interface Point {\n readonly x: number\n readonly y: number\n}\nexport namespace Point {\n export const ZERO: Point = { x: 0, y: 0 }\n}\nexport interface Padding {\n top: number\n right: number\n bottom: number\n left: number\n}\n","import { ensureBaiduV3 } from '../../../utils/baidu-utils'\nimport { Point } from '../../types'\nimport './baidu-info-box.scss'\nimport type { BMarker } from './marker'\n\nexport type BaiduInfoBox = InstanceType<ReturnType<typeof createBaiduInfoBoxClass>>\n\nlet BaiduInfoBox: ReturnType<typeof createBaiduInfoBoxClass> | undefined\n\nexport function createBaiduInfoBox(\n content: HTMLElement,\n position?: BMap.Point,\n offset?: Point,\n zIndex?: number,\n maxWidth?: number,\n borderClass?: string,\n) {\n if (!BaiduInfoBox) {\n BaiduInfoBox = createBaiduInfoBoxClass()\n }\n return new BaiduInfoBox(content, position, offset, zIndex, maxWidth, borderClass)\n}\n\n/**\n * {@template info_window_vs_box}\n * baidu自带的InfoWindow有如下问题:\n * 1. 窗体不可自定义, 默认的窗体有点丑\n * 2. 一次只能显示一个\n * 3. 和MarkerClusterer的配合并不好, 重建聚合时会使InfoWindow消失\n *\n * 故重新实现了一个InfoBox, 解决上述问题, 用来替代InfoWindow, 但Info也点问题...:\n * 1. 未实现InfoWindow的autoPan功能\n * {@endtemplate }\n */\n\nfunction createBaiduInfoBoxClass() {\n ensureBaiduV3()\n const POINT_ZERO = new BMap.Point(0, 0)\n return class BaiduInfoBox extends BMap.OverlayV3 {\n // 类表达式不能有私有成员, 故改成public\n public container: HTMLElement\n public border: HTMLElement\n public inner: HTMLElement\n public map: BMap.Map | undefined\n public marker: BMarker | undefined\n constructor(\n public content: HTMLElement,\n public position: BMap.Point = POINT_ZERO,\n public offset: Point = Point.ZERO,\n zIndex?: number,\n maxWidth: number = 654, // google的InfoWindow的默认maxWidth就是654\n borderClass: string = '',\n ) {\n super()\n const rootClass = 'baidu-info-box-container'\n this.container = document.createElement('div')\n this.container.className = rootClass\n this.container.style.position = 'absolute'\n\n this.border = document.createElement('div')\n this.border.className = `${rootClass}__border ${borderClass}`\n\n this.inner = document.createElement('div')\n this.inner.className = rootClass + '__inner'\n\n const close = document.createElement('img')\n close.className = rootClass + '__close'\n close.src = 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224px%22%20height%3D%2224px%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22%23000000%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M19%206.41L17.59%205%2012%2010.59%206.41%205%205%206.41%2010.59%2012%205%2017.59%206.41%2019%2012%2013.41%2017.59%2019%2019%2017.59%2013.41%2012z%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%0A%3C%2Fsvg%3E%0A'\n close.addEventListener('click', () => {\n // cSpell:ignore onclickclose\n // 设计成和InfoWindow的关闭监听同名\n this.close()\n this.dispatchEvent({ type: 'onclickclose' })\n })\n\n this.inner.appendChild(content)\n this.border.appendChild(this.inner)\n this.border.appendChild(close)\n this.container.appendChild(this.border)\n\n if (zIndex) {\n this.setZIndex(zIndex)\n }\n this.setMaxWidth(maxWidth)\n this.onMarkerPositionChanged = this.onMarkerPositionChanged.bind(this)\n }\n\n override initialize(map: BMap.Map) {\n this.map = map\n map.getPanes().floatPane!.appendChild(this.container)\n // console.log('initialize', map)\n return this.container\n }\n\n override draw() {\n if (!this.map) {\n return\n }\n\n const point = this.marker ? this.marker.getPosition() : this.position\n const pixel = this.map.pointToOverlayPixel(point)\n const x = pixel.x + this.offset.x\n const y = pixel.y + this.offset.y\n\n // console.log('draw', this.width, this.height, width, height)\n\n this.container.style.left = `${x}px`\n this.container.style.top = `${y}px`\n }\n\n open(map: BMap.Map, anchor?: BMarker) {\n if (anchor && anchor === this.marker) {\n // 使用相同的marker, 不需要处理\n return\n }\n if (this.marker) {\n this.detachMarker(this.marker)\n }\n // 一定要先设置marker, addOverlay触发的draw方法需要读取marker\n this.marker = anchor\n if (this.marker) {\n this.attachMarker(this.marker)\n }\n\n if (this.isOpen()) {\n // 若已打开, 则只需要刷新\n this.draw()\n } else if (this.marker && !this.marker.getMap()) {\n // marker存在, 且未被添加到map上, 则需要等marker添加后, 再添加\n // @see {BaiduMap}\n } else {\n // 否则添加\n map.addOverlay(this)\n }\n }\n\n attachMarker(marker: BMarker) {\n marker.__info_box__ = this\n marker.addEventListener('dragging', this.onMarkerPositionChanged)\n marker.addEventListener('dragend', this.onMarkerPositionChanged)\n }\n\n detachMarker(marker: BMarker) {\n marker.__info_box__ = undefined\n marker.removeEventListener('dragging', this.onMarkerPositionChanged)\n marker.removeEventListener('dragend', this.onMarkerPositionChanged)\n }\n\n close() {\n if (this.map) {\n this.map.removeOverlay(this)\n if (this.marker) {\n this.detachMarker(this.marker)\n this.marker = undefined\n }\n this.map = undefined\n }\n }\n\n isOpen() {\n return this.map && this.map.getPanes().floatPane === this.container.parentNode\n }\n\n onMarkerPositionChanged() {\n this.draw()\n }\n\n setZIndex(zIndex: number) {\n this.container.style.zIndex = `${zIndex}`\n }\n\n setMaxWidth(maxWidth: number) {\n this.border.style.maxWidth = `${maxWidth}px`\n }\n\n setPosition(position: BMap.Point) {\n if (!this.marker) {\n this.position = position\n this.draw()\n }\n }\n\n getPosition() {\n return this.position\n }\n\n setOffset(offset: Point) {\n this.offset = offset\n this.draw()\n }\n\n getOffset() {\n return this.offset\n }\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { AbstractEventTargetDelegate, BaiduEventTargetDelegate, EventHub, GoogleEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { Point } from '../../types'\nimport type { UnionInfoWindow } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { BaiduMarker, GoogleMarker, Marker } from './marker'\n\n/**\n * ## InfoWindow的初始偏移, 不同实现\n * - baidu: 根据Icon的infoWindowAnchor选项, 确定相对Icon左上角的偏移\n * - google: 根据Marker的anchorPoint选项, 确定相对marker的position的偏移\n *\n * 统一成: InfoWindow的底部中点对齐Marker的position, 需要多少偏移使用offset选项来设置\n */\nexport interface InfoWindowOptions {\n content: string | HTMLElement\n /** @default {LatLng.ZERO} */\n position?: LatLng\n maxWidth?: number\n offset?: Point\n disableAutoPan?: boolean\n}\n\n/**\n * cSpell:words clickclose, statechange\n * ## 打开/关闭InfoWindow的不同行为\n * - google\n * 0. 添加时, 默认不显示\n * 1. close(), 不发送事件\n * 2. 点击x, 发送`closeclick`事件\n * 3. open(), 不发送事件\n * 4. 可以同时打开多个InfoWindow\n * - baidu:\n * 0. 添加时, 默认不显示\n * 1. close(), 发送`close`事件\n * 2. 点击x, 先后发送`clickclose`, `close`事件\n * 3. 点击地图的空白区域, 发送`close`事件\n * 4. open(), 发送`open`事件\n * 5. 同时只能打开一个, 之前的会自动关闭(发送`close`事件)\n * - here(InfoBubble)\n * 0. 添加时, 默认显示, 不发送事件\n * 1. close(), 发送`statechange`事件\n * 2. 点击x, 发送`statechange`事件\n * 3. open(), 发送`statechange`事件\n * 4. 可以同时打开多个InfoBubble\n *\n * 结论: 在baidu以外的地图上模拟open/close事件, 保证行为一致\n */\nexport type InfoWindowEventMap = {\n closeclick: Tg.Event\n /**\n * ## 不同实现\n * baidu: 原生支持open/close事件\n * google: 通过拦截open()/close()/closeclick, 实现open/close事件\n */\n open: Tg.Event\n /** @see open */\n close: Tg.Event\n}\n\n/** 之所以需要这个type, 是为了将event的类型信息合并进去, 通过实现interface的方式似乎做不到这一点, 使用函数重载其实也可以做到 */\nexport type InfoWindowOverlay = InfoWindow & Tg.EventTargetTyped<InfoWindow, InfoWindowEventMap>\n\n/** 在@tg/map中 InfoWindow 不继承 Overlay... */\nexport abstract class InfoWindow implements Tg.EventTarget {\n constructor(\n private delegate: AbstractEventTargetDelegate<UnionInfoWindow>,\n ) {\n this.delegate.setTarget(this)\n }\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n abstract inner: UnionInfoWindow\n /**\n * 若anchor为空, 则添加到地图上\n *\n * ## 不同行为\n * - baidu: 一定要anchor添加到地图上之后, 才能正常打开infoWindow\n * - google: 没有上述限制\n **/\n abstract open(anchor?: Marker): void\n abstract close(): void\n abstract getPosition(): LatLng\n abstract setPosition(position: LatLng): void\n abstract isOpen(): boolean\n}\n\nexport class BaiduInfoWindow extends InfoWindow {\n static create(this: BaiduMap, options: InfoWindowOptions) {\n const position = options.position || LatLng.ZERO\n const inner = new BMap.InfoWindow(options.content, {\n maxWidth: options.maxWidth,\n offset: options.offset && new BMap.Size(options.offset.x, options.offset.y),\n enableAutoPan: !options.disableAutoPan,\n })\n return new BaiduInfoWindow(inner, this, { position: position })\n }\n\n constructor(\n public inner: BMap.InfoWindow,\n private map: BaiduMap,\n private state: { position?: LatLng },\n ) {\n super(new BaiduEventTargetDelegate(inner, map))\n }\n override isOpen() {\n return this.inner.isOpen()\n }\n override open(anchor?: BaiduMarker): void {\n /*\n // baidu 一次只能显示一个InfoWindow, 打开新的前需要关闭老的\n // baidu 内部会处理这个逻辑, 故这些代码可以注释掉\n const latestInfoWindow = this.map.getLatestInfoWindow()\n if (latestInfoWindow && latestInfoWindow !== this) {\n console.log('关闭之前的InfoWindow')\n latestInfoWindow.close()\n }\n */\n if (anchor) {\n anchor.innerOverlay.openInfoWindow(this.inner)\n } else {\n this.map.innerMap.openInfoWindow(this.inner, (this.state.position || LatLng.ZERO).toBaidu(this.map.coordType))\n }\n this.map.setLatestInfoWindowInternal(this)\n }\n override close() {\n // 通过map也可以关闭marker上的InfoWindow\n // 该方法会关闭任何打开的InfoWindow, 在某些情况下, 可能不是当前InfoWindow, 故需要先判断下\n if (this.inner.isOpen()) {\n this.map.innerMap.closeInfoWindow()\n }\n }\n override getPosition(): LatLng {\n // 这个值有可能为空\n const innerPosition: BMap.Point | undefined = this.inner.getPosition()\n return (innerPosition && LatLng.fromBaidu(innerPosition, this.map.coordType)) || this.state.position || LatLng.ZERO\n }\n override setPosition(position: LatLng): void {\n this.state.position = position\n if (this.inner.isOpen()) {\n this.open()\n }\n }\n}\n\nexport class GoogleInfoWindow extends InfoWindow {\n static create(this: GoogleMap, options: InfoWindowOptions) {\n const position = options.position || LatLng.ZERO\n const inner = new google.maps.InfoWindow({\n content: options.content,\n maxWidth: options.maxWidth,\n pixelOffset: options.offset && new google.maps.Size(options.offset.x, options.offset.y),\n position: position.toGoogle(this.coordType),\n disableAutoPan: options.disableAutoPan,\n })\n return new GoogleInfoWindow(inner, this)\n }\n\n private eventHub = new EventHub()\n private isOpened = false\n constructor(\n public inner: google.maps.InfoWindow,\n private map: GoogleMap,\n ) {\n super(new GoogleEventTargetDelegate(inner, map))\n inner.addListener('closeclick', () => {\n this.isOpened = false\n if (this.eventHub.hasListener('close')) {\n this.eventHub.notify({ type: 'close', target: this })\n }\n })\n // map_changed事件和getMap()都没有文档...\n // 当infoWindow从地图上添加/移除时, 都会触发该事件\n // 仅仅用来处理marker移除导致的infoWindow移除\n inner.addListener('map_changed', () => {\n const prev = this.isOpened\n this.isOpened = !!inner.getMap()\n if (prev && !this.isOpened && this.eventHub.hasListener('close')) {\n this.eventHub.notify({ type: 'close', target: this })\n }\n })\n }\n override isOpen() {\n return this.isOpened\n }\n override addEventListener<K extends keyof InfoWindowEventMap>(type: K, listener: (event: InfoWindowEventMap[K]) => void): void {\n if (type === 'open' || type === 'close') {\n this.eventHub.addEventListener(type, listener)\n return\n }\n super.addEventListener(type, listener)\n }\n override removeEventListener<K extends keyof InfoWindowEventMap>(type: K, listener: (event: InfoWindowEventMap[K]) => void): void {\n if (type === 'open' || type === 'close') {\n this.eventHub.removeEventListener(type, listener)\n return\n }\n super.removeEventListener(type, listener)\n }\n override open(anchor?: GoogleMarker): void {\n if (!this.isOpened) {\n if (this.map.mapOptions.infoWindowMode === 'single') {\n // 'single'模式下, 需要关闭之前的InfoWindow\n const prev = this.map.getLatestInfoWindow()\n if (prev) {\n prev.close()\n }\n }\n this.inner.open(this.map.innerMap, anchor?.innerOverlay)\n this.isOpened = true\n this.map.setLatestInfoWindowInternal(this)\n this.eventHub.notify({ type: 'open', target: this })\n }\n }\n override close(): void {\n if (this.isOpened) {\n // 先设为false, 这样, close()过程中触发的map_changed就不会重复触发close事件\n this.isOpened = false\n this.inner.close()\n this.eventHub.notify({ type: 'close', target: this })\n }\n }\n override getPosition(): LatLng {\n return LatLng.fromGoogle(this.inner.getPosition() ?? GoogleConst.LATLNG_ZERO, this.map.coordType)\n }\n override setPosition(position: LatLng): void {\n this.inner.setPosition(position.toGoogle(this.map.coordType))\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { GoogleEventTargetDelegate } from '../../event-target'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport type { Point } from '../../types'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { createBaiduInfoBox, type BaiduInfoBox } from './baidu-info-box'\nimport { InfoWindow } from './info-window'\nimport type { BaiduMarker, GoogleMarker, Marker } from './marker'\nimport { BaiduOverlay } from './overlay'\n\nexport type InfoBoxEventMap = {\n closeclick: Tg.Event\n}\n\n/**\n * 初始偏移量同{@link InfoWindow}, 底部中点对齐position\n */\nexport interface InfoBoxOptions {\n content: HTMLElement\n position?: LatLng\n offset?: Point\n zIndex?: number\n maxWidth?: number\n borderClass?: string\n}\n\n/** {@macros info_window_vs_box} */\nexport interface InfoBox extends Tg.EventTarget {\n open(anchor?: Marker): void\n close(): void\n getPosition(): LatLng\n setPosition(position: LatLng): void\n setMaxWidth(maxWidth: number): void\n setZIndex(zIndex: number): void\n}\n\n/** 虽然叫\"Overlay\", 但并没有继承Overlay... */\nexport type InfoBoxOverlay = InfoBox & Tg.EventTargetTyped<InfoBox, InfoBoxEventMap>\n\nexport class BaiduInfoBoxOverlay extends BaiduOverlay<BaiduInfoBox> implements InfoBox {\n static create(this: BaiduMap, options: InfoBoxOptions) {\n const coord = this.coordType\n const inner = createBaiduInfoBox(\n options.content,\n options.position?.toBaidu(coord),\n options.offset,\n options.zIndex,\n options.maxWidth,\n options.borderClass,\n )\n return new BaiduInfoBoxOverlay(inner, coord, this)\n }\n\n constructor(\n innerOverlay: BaiduInfoBox,\n coordType: CoordType,\n private baiduMap: BaiduMap,\n ) {\n super(innerOverlay, coordType, baiduMap)\n }\n open(anchor?: BaiduMarker): void {\n this.innerOverlay.open(this.baiduMap.innerMap, anchor?.innerOverlay)\n }\n close(): void {\n this.innerOverlay.close()\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType))\n }\n setMaxWidth(maxWidth: number) {\n this.innerOverlay.setMaxWidth(maxWidth)\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n}\n\nexport class GoogleInfoBoxOverlay extends InfoWindow implements InfoBox {\n static create(this: GoogleMap, options: InfoBoxOptions) {\n const coord = this.coordType\n const inner = new google.maps.InfoWindow({\n content: options.content,\n position: options.position?.toGoogle(coord),\n pixelOffset: options.offset && new google.maps.Size(options.offset.x, options.offset.y),\n zIndex: options.zIndex,\n maxWidth: options.maxWidth,\n })\n const borderClass = options.borderClass\n if (borderClass) {\n inner.addListener('domready', () => {\n const border = options.content.parentElement?.parentElement\n if (border && border.className.includes('gm-style-iw-c') && !border.className.includes(borderClass)) {\n border.className += ` ${borderClass}`\n }\n })\n }\n return new GoogleInfoBoxOverlay(inner, coord, this)\n }\n constructor(\n public inner: google.maps.InfoWindow,\n private coordType: CoordType,\n private map: GoogleMap,\n ) {\n super(new GoogleEventTargetDelegate(inner, map))\n }\n\n open(anchor?: GoogleMarker | undefined): void {\n this.inner.open(this.map.innerMap, anchor?.innerOverlay)\n }\n close(): void {\n this.inner.close()\n }\n getPosition(): LatLng {\n return LatLng.fromGoogle(this.inner.getPosition() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.inner.setPosition(position.toGoogle(this.coordType))\n }\n isOpen(): boolean {\n return this.inner.getMap() != null\n }\n setMaxWidth(maxWidth: number) {\n if (this.isOpen()) {\n // 开启状态, 则需要先关闭, 后打开\n // https://developers.google.com/maps/documentation/javascript/reference/info-window#InfoWindowOptions.maxWidth\n const map = this.inner.getMap()\n const anchor = this.inner.getAnchor()\n this.inner.close()\n this.inner.setOptions({ maxWidth: maxWidth })\n this.inner.open(map, anchor)\n } else {\n this.inner.setOptions({ maxWidth: maxWidth })\n }\n }\n setZIndex(zIndex: number) {\n this.inner.setZIndex(zIndex)\n }\n}\n","import type { StringEnumLike } from './mapped-types'\n\nexport namespace Strings {\n /**\n * 将string转换成字符枚举, 转换失败返回undefined\n * @see {@link import('./vue-utils.ts').stringEnumProp} 由于使用了Object.values(enumObject), 应该避免在enumObject上添加其他属性/方法\n * @deprecated 使用{@link import('./mapped-types.ts').unwrapStringEnumValue}替代\n */\n export function toEnumOrNull<E extends StringEnumLike>(value: string | undefined, enumObject: E): E[keyof E] | undefined {\n if (value === undefined) {\n return undefined\n }\n return Object.values(enumObject).includes(value) ? value as E[keyof E] : undefined\n }\n export function trimIndent(str: string) {\n return str.split('\\n').map(it => it.trim()).join('\\n')\n }\n /** 转换: `FuckYou` -> `fuck-you` */\n export function pascal2kebab(str: string) {\n return str.replace(/([^A-Z]?)([A-Z])/g, (_, a, b) => a ? `${a}-${b.toLowerCase()}` : b.toLowerCase())\n }\n\n /**\n * 简单判断字符串是否表示一个整数\n * - `10` : ✅️\n * - `-10`: ✅️\n * - `+10`: ❌️\n * - `2e2`: ❌️\n * @see https://stackoverflow.com/questions/175739/how-can-i-check-if-a-string-is-a-valid-number\n * */\n export function isInt(str: string) {\n return /^-?\\d+$/.test(str)\n }\n}\n\n/** @see https://github.com/browserify/path-browserify */\nexport const path = {\n /** @see https://nodejs.org/docs/v10.3.0/api/path.html#path_path_basename_path_ext */\n basename(path: string, ext?: string) {\n const normalized = path.endsWith('/') ? path.slice(0, -1) : path\n\n const index = normalized.lastIndexOf('/')\n const filename = index >= 0 ? normalized.substring(index + 1) : normalized\n if (ext && filename.endsWith(ext)) {\n return filename.slice(0, -ext.length)\n }\n return filename\n },\n}\n","import { throwError } from '../../../components'\nimport { assertNever } from '../../../utils/assert'\nimport { ensureBaiduV3 } from '../../../utils/baidu-utils'\nimport { GoogleConst } from '../../../utils/google-utils'\nimport { lateinit } from '../../../utils/mapped-types'\nimport { LatLng } from '../../lat-lng'\nimport { Point } from '../../types'\nimport type { AbstractMap } from '../map'\nimport './element-overlay.scss'\n\nexport enum MapPane {\n map = 'map',\n overlay = 'overlay',\n overlayMouseTarget = 'overlayMouseTarget',\n float = 'float',\n}\nexport namespace MapPanes {\n export function toGoogle(mapPane: MapPane, panes: google.maps.MapPanes): Element {\n switch (mapPane) {\n case MapPane.float:\n return panes.floatPane\n case MapPane.overlayMouseTarget:\n return panes.overlayMouseTarget\n case MapPane.overlay:\n return panes.overlayLayer\n case MapPane.map:\n return panes.mapPane\n default:\n assertNever(mapPane)\n }\n }\n export function toBaidu(mapPane: MapPane, panes: BMap.MapPanes): HTMLElement | undefined {\n switch (mapPane) {\n case MapPane.float:\n return panes.floatPane\n case MapPane.overlayMouseTarget:\n return panes.markerMouseTarget\n case MapPane.overlay:\n return panes.markerPane\n case MapPane.map:\n return panes.mapPane\n default:\n assertNever(mapPane)\n }\n }\n}\n\nexport interface ElementOverlayOptions {\n mapPane: MapPane\n}\n\nexport interface OverlayProjection {\n fromLatLngToOverlayPoint(latLng: LatLng): Point\n fromOverlayPointToLatLng(point: Point): LatLng\n}\n\nexport abstract class ElementOverlay {\n private baidu: BMap.OverlayV3 | undefined\n private google: google.maps.OverlayView | undefined\n private projection: OverlayProjection | undefined\n protected element = lateinit<HTMLElement>()\n private mapPane: MapPane\n constructor(\n public map: AbstractMap,\n options: ElementOverlayOptions,\n ) {\n this.mapPane = options.mapPane\n }\n\n create() {\n this.element = this.onCreate()\n this.element.className += ' element-overlay'\n return this.element\n }\n\n draw() {\n if (this.projection) {\n this.onDraw(this.projection)\n }\n }\n\n protected abstract onCreate(): HTMLElement\n\n protected abstract onDraw(projection: OverlayProjection): void\n\n getProjection(): OverlayProjection | undefined {\n return this.projection\n }\n\n asBaidu() {\n if (!this.baidu) {\n const that = this\n ensureBaiduV3()\n class BaiduElementOverlay extends BMap.OverlayV3 {\n override initialize(map: BMap.Map) {\n const ele = that.create()\n const panes = map.getPanes()\n MapPanes.toBaidu(that.mapPane, panes)?.appendChild(ele)\n return ele\n }\n override draw() {\n that.draw()\n }\n }\n this.baidu = new BaiduElementOverlay()\n const map = that.map.innerMap as BMap.Map\n this.projection = {\n fromLatLngToOverlayPoint(latLng: LatLng): Point {\n return map.pointToOverlayPixel(latLng.toBaidu(that.map.coordType))\n },\n fromOverlayPointToLatLng(point: Point): LatLng {\n return LatLng.fromBaidu(map.overlayPixelToPoint(new BMap.Pixel(point.x, point.y)), that.map.coordType)\n },\n }\n }\n return this.baidu\n }\n\n asGoogle() {\n if (!this.google) {\n const that = this\n class GoogleElementOverlay extends google.maps.OverlayView {\n override onAdd() {\n const element = that.create()\n const panes = this.getPanes() ?? throwError('onAdd回调中一定会有panes')\n MapPanes.toGoogle(that.mapPane, panes).appendChild(element)\n }\n\n override draw() {\n that.draw()\n }\n\n override onRemove() {\n // 根据文档这里应该手动移除, 但实际调用时parentNode却是null...\n // https://developers.google.com/maps/documentation/javascript/customoverlays#remove\n that.element.parentNode?.removeChild(that.element)\n }\n }\n this.google = new GoogleElementOverlay()\n this.projection = {\n fromLatLngToOverlayPoint(latLng: LatLng): Point {\n return that.google!.getProjection().fromLatLngToDivPixel(latLng.toGoogle(that.map.coordType)) ?? Point.ZERO\n },\n fromOverlayPointToLatLng(point: Point): LatLng {\n return LatLng.fromGoogle(that.google!.getProjection().fromDivPixelToLatLng(new google.maps.Point(point.x, point.y)) ?? GoogleConst.LATLNG_ZERO, that.map.coordType)\n },\n }\n }\n return this.google\n }\n}\n","import { throwError, type Nullable } from '../../../components'\r\nimport type { Point } from '../../types'\r\nimport { MapPane, MapPanes } from './element-overlay'\r\n\r\nexport type GoogleLabel = InstanceType<ReturnType<typeof createGoogleLabelClass>>\r\n\r\nlet GoogleLabel: ReturnType<typeof createGoogleLabelClass> | undefined\r\n\r\nexport function createGoogleLabel(\r\n element: HTMLElement,\r\n position: Nullable<google.maps.LatLng>,\r\n offset?: Point,\r\n mapPane?: MapPane,\r\n zIndex?: number,\r\n) {\r\n if (!GoogleLabel) {\r\n GoogleLabel = createGoogleLabelClass()\r\n }\r\n return new GoogleLabel(element, position, offset, mapPane, zIndex)\r\n}\r\n\r\n/** 打开页面时 google.maps.OverlayView 并没有加载, 故需要将GoogleLabel类写到方法中去 */\r\nfunction createGoogleLabelClass() {\r\n return class GoogleLabel extends google.maps.OverlayView {\r\n container: HTMLElement\r\n constructor(\r\n element: HTMLElement,\r\n // 类表达式的私有成员, 会报TS4094错误, 故只能设置为public\r\n public position: Nullable<google.maps.LatLng>,\r\n public offset?: Point,\r\n // 同上, 只能设为public\r\n public _mapPane: MapPane = MapPane.overlayMouseTarget,\r\n zIndex?: number,\r\n ) {\r\n super()\r\n this.container = document.createElement('div')\r\n this.container.className = 'label-container'\r\n this.container.style.position = 'absolute'\r\n if (zIndex) {\r\n this.setZIndex(zIndex)\r\n }\r\n this.container.addEventListener('click', () => {\r\n google.maps.event.trigger(this, 'click')\r\n })\r\n this.setElement(element)\r\n }\r\n setZIndex(zIndex: number) {\r\n this.container.style.zIndex = `${zIndex}`\r\n }\r\n setElement(element: HTMLElement) {\r\n const child = this.container.firstChild\r\n if (child === element) {\r\n return\r\n }\r\n if (child) {\r\n this.container.replaceChild(child, element)\r\n } else {\r\n this.container.appendChild(element)\r\n }\r\n }\r\n\r\n override onAdd(): void {\r\n const panes = this.getPanes() ?? throwError('onAdd回调中一定能够获取panes')\r\n MapPanes.toGoogle(this._mapPane, panes).appendChild(this.container)\r\n }\r\n\r\n override draw(): void {\r\n // 设置了position时才显示\r\n this.container.style.display = this.position ? 'block' : 'none'\r\n if (this.position) {\r\n const projection = this.getProjection()\r\n // 没添加到地图上的时候, 投影会为空\r\n if (projection) {\r\n const pixel = projection.fromLatLngToDivPixel(this.position)\r\n if (pixel) {\r\n this.container.style.left = `${pixel.x + (this.offset?.x ?? 0)}px`\r\n this.container.style.top = `${pixel.y + (this.offset?.y ?? 0)}px`\r\n }\r\n }\r\n }\r\n }\r\n\r\n override onRemove(): void {\r\n this.container.parentNode?.removeChild(this.container)\r\n }\r\n\r\n setPosition(position: Nullable<google.maps.LatLng>) {\r\n this.position = position\r\n this.draw()\r\n }\r\n getPosition(): Nullable<google.maps.LatLng> {\r\n return this.position\r\n }\r\n setOffset(offset: Point) {\r\n this.offset = offset\r\n this.draw()\r\n }\r\n getOffset(): Point | undefined {\r\n return this.offset\r\n }\r\n getVisible(): boolean {\r\n return this.container.style.visibility !== 'hidden'\r\n }\r\n setVisible(visible: boolean): void {\r\n this.container.style.visibility = visible ? 'visible' : 'hidden'\r\n }\r\n }\r\n}\r\n","import { assert } from '../../../utils/assert'\nimport { lateinit } from '../../../utils/mapped-types'\nimport { Strings } from '../../../utils/strings'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport { Point, type Size } from '../../types'\nimport type { UnionBaiduIcon } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { MapPane } from './element-overlay'\nimport { createGoogleLabel, type GoogleLabel } from './google-label'\nimport type { BaiduSymbolIcon } from './icon'\nimport { BaiduOverlay, GoogleOverlay, Overlay } from './overlay'\n\nexport type BaiduLabel = BMap.Label & { __label__?: BaiduLabelOverlay }\n\nexport type LabelEventMap = {\n click: Tg.Event\n}\n\n/**\n * 初始位置, 左上角对齐position\n */\nexport interface LabelOptions {\n content: LabelContent\n position?: LatLng\n offset?: Point\n /**\n * ## 不同行为\n * 当将label添加到marker中时:\n * - baidu: zIndex设置无效, Label的元素的z-index始终为80\n * - google: 依然有效, 但貌似是由于marker元素的opacity:0;的原因, 调整成比marker小的zIndex后, 依然不能位于marker后方...\n * */\n zIndex?: number\n /**\n * ## 不同行为\n * - baidu: 不支持该属性\n * - google: 支持, 默认为{@link MapPane.overlayMouseTarget}\n */\n mapPane?: MapPane\n}\n\n/**\n * ## 不同实现\n * - baidu: 有Label类,\n * - 添加到地图上时, 默认左上角对齐position\n * - 添加到marker中时, 默认左上角对齐marker的icon的左上角\n * - 内容只能是string, string可以是html字符串\n * - google: 没有Label类, 我们用OverlayView实现了一个GoogleLabel\n * - 添加到地图上时, 默认左上角对齐position\n * - 没有添加到marker中的功能\n * - 内容是HTMLElement\n *\n * 针对这些不同, 使用了如下方法使它们行为尽量一致:\n * 1. {@link BaiduLabelOverlay.attachIcon}, 让BaiduLabelOverlay关联icon, 使其添加到地图上时也是左上角对齐position\n * 2. {@link GoogleMarker.setLabel}, 让GoogleMarker关联GoogleLabel, 联动它们的显隐/位置, 使其支持添加到marker中\n * 3. {@link BaiduLabelOverlay.setContentInternal}, 将HTMLElement转成string, 并让BaiduLabelOverlay监听HTMLElement的改变, 由于转换成了string, 故里面的事件监听是无效的, 只能使用{@link LabelEventMap}中的事件\n */\nexport interface Label {\n setContent(content: LabelContent): void\n getPosition(): LatLng\n setPosition(position: LatLng): void\n getOffset(): Point\n setOffset(offset: Point): void\n setZIndex(zIndex: number): void\n}\n\nexport type LabelOverlay = Label & Overlay\n\ntype LabelContent = string | HTMLElement\nnamespace LabelContent {\n export function toString(content: LabelContent) {\n return typeof content === 'string' ? content : content.outerHTML\n }\n export function toElement(content: LabelContent) {\n if (typeof content === 'string') {\n const $div = document.createElement('div')\n $div.innerHTML = content\n return $div\n }\n return content\n }\n}\n\n/** 内容只能是固定不变的 */\nexport class BaiduLabelOverlay extends BaiduOverlay<BaiduLabel> implements Label {\n static create(this: BaiduMap, options: LabelOptions): BaiduLabelOverlay {\n const coord = this.coordType\n const label: BaiduLabel = new BMap.Label(LabelContent.toString(options.content), {\n position: options.position?.toBaidu(coord),\n offset: options.offset && new BMap.Size(options.offset.x, options.offset.y),\n })\n if (options.zIndex) {\n label.setZIndex(options.zIndex)\n }\n // 清除baidu自带的样式\n label.setStyle({\n border: '0px',\n padding: '0px',\n backgroundColor: 'unset',\n })\n const baiduLabel = new BaiduLabelOverlay(label, coord, this, options.content)\n label.__label__ = baiduLabel\n return baiduLabel\n }\n private icon: UnionBaiduIcon | undefined\n private iconAnchor: Size | undefined\n private content = lateinit<LabelContent>()\n private contentObserver: MutationObserver | undefined\n constructor(\n innerOverlay: BaiduLabel,\n coordType: CoordType,\n map: BaiduMap,\n content: LabelContent,\n ) {\n super(innerOverlay, coordType, map)\n this.setContentInternal(content, true)\n }\n private setContentInternal(content: LabelContent, initialize = false) {\n if (this.content === content) {\n return\n }\n if (this.contentObserver) {\n this.contentObserver.disconnect()\n this.contentObserver = undefined\n }\n if (typeof content !== 'string') {\n this.contentObserver = new MutationObserver(() => {\n this.innerOverlay.setContent(content.outerHTML)\n })\n this.contentObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n })\n }\n // 初始化时, content已经设置过了, 不需要重复设置\n if (!initialize) {\n this.innerOverlay.setContent(LabelContent.toString(content))\n }\n this.content = content\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType))\n }\n getOffset(): Point {\n const offset = this.innerOverlay.getOffset()\n let deltaX = 0\n let deltaY = 0\n if (this.iconAnchor) {\n deltaX = this.iconAnchor.width\n deltaY = this.iconAnchor.height\n }\n // 获取时要减去icon的anchor\n return { x: offset.width - deltaX, y: offset.height - deltaY }\n }\n setOffset(offset: Point): void {\n let deltaX = 0\n let deltaY = 0\n if (this.iconAnchor) {\n deltaX = this.iconAnchor.width\n deltaY = this.iconAnchor.height\n }\n // 设置时要加上icon的anchor\n this.innerOverlay.setOffset(new BMap.Size(offset.x + deltaX, offset.y + deltaY))\n }\n setContent(content: LabelContent) {\n this.setContentInternal(content)\n }\n\n /**\n * 关联新的Icon, 内部使用的方法\n * @description baidu中Label默认左上角对齐Icon的左上, 我们要将其转换为对齐marker的position\n * */\n attachIcon(icon: BMap.Icon | BaiduSymbolIcon | undefined) {\n let iconAnchor: Size | undefined\n if (icon instanceof BMap.Icon) {\n iconAnchor = icon.anchor\n } else if (icon /* BaiduSymbolIcon */) {\n if (icon.anchor) {\n iconAnchor = icon.anchor\n } else {\n // 第一次添加时icon.anchor不存在, 需要借助baiduLabelOffset来计算实际偏移\n const labelOffset = icon.__icon__?.baiduLabelOffset ?? { x: 0, y: 0 }\n iconAnchor = {\n width: icon.style.anchor.width + labelOffset.x,\n height: icon.style.anchor.height + labelOffset.y,\n }\n // 开发模式下需要检测baiduLabelOffset的值设置的是否正确\n if (process.env.NODE_ENV !== 'production') {\n setTimeout(() => {\n assert(icon.__icon__, `${icon}必须是由'SymbolIcon.toBaidu()'创建的`)\n if (!icon.anchor) {\n console.log('BaiduLabelOverlay.attachIcon', 'Bmap.Symbol.anchor尚未计算完成')\n return\n }\n const x = icon.anchor.width - icon.style.anchor.width\n const y = icon.anchor.height - icon.style.anchor.height\n\n if (labelOffset.x !== x || labelOffset.y !== y) {\n const iconInfo = [\n icon.__icon__.anchor?.x,\n icon.__icon__.anchor?.y,\n icon.__icon__.rotation,\n icon.__icon__.scale,\n icon.__icon__.strokeWeight,\n ].map(it => it ?? '').join(',')\n\n console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, Strings.trimIndent(`\n 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成: \n ${JSON.stringify({ x, y })}\n `,\n ))\n }\n }, 1)\n }\n }\n }\n\n const offset = this.innerOverlay.getOffset()\n let x = offset.width\n let y = offset.height\n if (this.iconAnchor) {\n // 减去之前的icon的anchor\n x -= this.iconAnchor.width\n y -= this.iconAnchor.height\n }\n if (iconAnchor) {\n // 加上新的icon的anchor\n x += iconAnchor.width\n y += iconAnchor.height\n }\n this.innerOverlay.setOffset(new BMap.Size(x, y))\n this.icon = icon\n this.iconAnchor = iconAnchor\n }\n}\n\nexport class GoogleLabelOverlay extends GoogleOverlay<GoogleLabel> implements Label {\n static create(this: GoogleMap, options: LabelOptions) {\n const coord = this.coordType\n const label = createGoogleLabel(\n LabelContent.toElement(options.content),\n options.position?.toGoogle(coord),\n options.offset,\n options.mapPane,\n options.zIndex,\n )\n return new GoogleLabelOverlay(label, coord, this)\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n setContent(content: LabelContent): void {\n this.innerOverlay.setElement(LabelContent.toElement(content))\n }\n getPosition(): LatLng {\n const position = this.innerOverlay.getPosition()\n if (position) {\n return LatLng.fromGoogle(position, this.coordType)\n }\n return LatLng.ZERO\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toGoogle(this.coordType))\n }\n getOffset(): Point {\n return this.innerOverlay.getOffset() ?? Point.ZERO\n }\n setOffset(offset: Point): void {\n this.innerOverlay.setOffset(offset)\n }\n}\n","/* eslint-disable camelcase */\nimport type { Point, Size } from '../../types'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { BaiduLabelOverlay } from './label'\n\nexport type UnionIcon = Icon | SymbolIcon\n\nexport const UnionIcon = {\n toGoogle: (icon: UnionIcon) => 'url' in icon ? Icon.toGoogle(icon) : SymbolIcon.toGoogle(icon),\n toBaidu: (icon: UnionIcon) => 'url' in icon ? Icon.toBaidu(icon) : SymbolIcon.toBaidu(icon),\n}\n\n/**\n * 图片Icon\n *\n * 字面量形式, 使用起来会简单点, 目前没看出使用class形式的必要🤔\n * */\nexport interface Icon {\n readonly url: string\n /** 显示的图片区域大小 */\n readonly size: Size\n /** 图片的显示区域的原点在图片中的坐标, 默认为(0, 0) */\n readonly origin?: Point\n /** 图片显示到地图上的锚点, 默认为图标的底部中点 */\n readonly anchor?: Point\n /** 缩放后的图片大小, 不传则不缩放 */\n readonly scaledSize?:Size\n}\n\nexport namespace Icon {\n export function toGoogle(icon: Icon): google.maps.Icon {\n return {\n url: icon.url,\n size: new google.maps.Size(icon.size.width, icon.size.height),\n origin: icon.origin && new google.maps.Point(icon.origin.x, icon.origin.y),\n scaledSize: icon.scaledSize && new google.maps.Size(icon.scaledSize.width, icon.scaledSize.height),\n // google的锚点默认就是图标的底部中点\n anchor: icon.anchor && new google.maps.Point(icon.anchor.x, icon.anchor.y),\n }\n }\n\n export function toBaidu(icon: Icon): BMap.Icon {\n return new BMap.Icon(icon.url, new BMap.Size(icon.size.width, icon.size.height), {\n imageOffset: icon.origin && new BMap.Size(-icon.origin.x, -icon.origin.y),\n imageSize: icon.scaledSize && new BMap.Size(icon.scaledSize.width, icon.scaledSize.height),\n // baidu的锚点默认为图标的中心点, 故需要和@tg/map统一, 改成图标的底部中点\n anchor: icon.anchor ? new BMap.Size(icon.anchor.x, icon.anchor.y) : new BMap.Size(icon.size.width / 2, icon.size.height),\n // InfoWindow相对图标左上角的偏移量, 不指定则InfoWindow不会偏移, 直接指到marker的position上\n // infoWindowAnchor: new BMap.Size(0, 0),\n })\n }\n}\n/** 简单的矢量Icon */\nexport interface SymbolIcon {\n readonly path: string | SymbolPath\n readonly anchor?: Point\n readonly fillColor?: string\n /** @default 0, 不显示填充色 */\n readonly fillOpacity?: number\n readonly scale?: number\n readonly rotation?: number\n readonly strokeColor?: string\n /** @default 1, 显示stroke */\n readonly strokeOpacity?: number\n /**\n * 默认等于{@link scale}\n * - google: 可以设为0\n * - baidu: 不能设为0, 为0相当于使用默认值\n */\n readonly strokeWeight?: number\n\n /**\n * baidu地图中Marker的Label的偏移量, 用来保证Label默认对齐到Marker的position\n *\n * 这个值的取值和如下参数相关, 但计算这个值的公式没找到...故只能运行时读取+手动设置:\n * - {@link path}\n * - {@link rotation}\n * - {@link scale}\n * - {@link strokeWeight}\n * - {@link anchor}\n *\n * 详见{@link BaiduLabelOverlay.attachIcon}\n *\n * TODO: 使用矩阵运行时计算偏移量\n */\n readonly baiduLabelOffset?: Point\n}\n\nexport namespace SymbolIcon {\n export function toGoogle(icon: SymbolIcon): google.maps.Symbol {\n return {\n path: typeof icon.path === 'string' ? icon.path : icon.path.google(),\n // TODO: 2023/05/17 ipcjs 检查google和baidu的锚点位置是否相同\n anchor: icon.anchor && new google.maps.Point(icon.anchor.x, icon.anchor.y),\n fillColor: icon.fillColor,\n fillOpacity: icon.fillOpacity,\n scale: icon.scale,\n rotation: icon.rotation,\n strokeColor: icon.strokeColor,\n strokeOpacity: icon.strokeOpacity,\n strokeWeight: icon.strokeWeight,\n }\n }\n\n export function toBaidu(icon: SymbolIcon): BaiduSymbolIcon {\n const baiduIcon: BaiduSymbolIcon = new BMap.Symbol(typeof icon.path === 'string' ? icon.path : icon.path.baidu(), {\n anchor: icon.anchor && new BMap.Size(icon.anchor.x, icon.anchor.y),\n fillColor: icon.fillColor,\n fillOpacity: icon.fillOpacity,\n scale: icon.scale,\n rotation: icon.rotation,\n strokeColor: icon.strokeColor,\n strokeOpacity: icon.strokeOpacity,\n strokeWeight: icon.strokeWeight,\n })\n baiduIcon.__icon__ = icon\n return baiduIcon\n }\n}\n\nexport type BaiduSymbolIcon = BMap.Symbol & {__icon__?: SymbolIcon}\n\nexport interface SymbolPath {\n baidu(): BMap.SymbolShapeType\n google(): google.maps.SymbolPath\n toString(): string\n}\n\n/** 模拟一个SymbolPath的枚举对象 */\nexport const SymbolPath = {\n CIRCLE: { baidu: () => BMap_Symbol_SHAPE_CIRCLE, google: () => google.maps.SymbolPath.CIRCLE },\n BACKWARD_CLOSED_ARROW: { baidu: () => BMap_Symbol_SHAPE_BACKWARD_CLOSED_ARROW, google: () => google.maps.SymbolPath.BACKWARD_CLOSED_ARROW },\n BACKWARD_OPEN_ARROW: { baidu: () => BMap_Symbol_SHAPE_BACKWARD_OPEN_ARROW, google: () => google.maps.SymbolPath.BACKWARD_OPEN_ARROW },\n FORWARD_CLOSED_ARROW: { baidu: () => BMap_Symbol_SHAPE_FORWARD_CLOSED_ARROW, google: () => google.maps.SymbolPath.FORWARD_CLOSED_ARROW },\n FORWARD_OPEN_ARROW: { baidu: () => BMap_Symbol_SHAPE_FORWARD_OPEN_ARROW, google: () => google.maps.SymbolPath.FORWARD_OPEN_ARROW },\n} as const satisfies Record<string, SymbolPath>\n\n/** 矢量Icon序列 */\nexport interface IconSequence {\n /** 矢量Icon */\n icon: SymbolIcon;\n /** @default false */\n fixedRotation?: boolean;\n /**\n * 相对起点的位置, 取值可以是像素或百分比\n * @default 100%\n */\n offset?: string;\n /**\n * 重复显示是的间距, 取值可以是像素或百分比;\n * 若和{@link offset}同时设置, 只有{@link repeat}会生效\n */\n repeat?: string;\n}\n\nexport namespace IconSequence {\n export function toGoogle(value: IconSequence): google.maps.IconSequence {\n return {\n icon: SymbolIcon.toGoogle(value.icon),\n offset: value.offset,\n repeat: value.repeat,\n fixedRotation: value.fixedRotation,\n }\n }\n export function toBaidu(value: IconSequence): BMap.IconSequence {\n return new BMap.IconSequence(\n SymbolIcon.toBaidu(value.icon),\n value.offset,\n value.repeat ?? '',\n value.fixedRotation,\n )\n }\n}\n","import type { Nullable } from '../../../utils/mapped-types'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport type { UnionBaiduIcon, UnionGoogleIcon } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { BaiduInfoBox } from './baidu-info-box'\nimport { UnionIcon } from './icon'\nimport type { BaiduLabel, BaiduLabelOverlay, GoogleLabelOverlay, LabelOverlay } from './label'\nimport { BaiduOverlay, GoogleOverlay, Overlay, type OverlayOptions } from './overlay'\n\nexport interface MarkerOptions extends OverlayOptions {\n position: LatLng\n /**\n * 执行{@link LatLng.toBaidu}时是否对经纬度进行标准化\n *\n * 因为{@link LatLng.toGoogle}内部是会自动标准化的, 并且LatLng绝大部分情况下是合法的,\n * 所以添加这个参数, 只在使用者认为必要的时候, 执行标准化\n *\n * {@macro latlng_normalize}\n */\n normalizePositionForBaidu?: boolean\n title?: string\n icon?: UnionIcon\n /** @default true */\n clickable?: boolean\n /** @default false */\n draggable?: boolean\n /**\n * 拖拽时是否显示`x`\n * @default true\n * */\n crossOnDrag?: boolean,\n /**\n * ## 不同行为\n * - google: 有`cursor` 属性, 作用是hover时改变cursor\n * - baidu: 有`draggingCursor`属性, 作用是拖动时改变cursor\n * @deprecated 不推荐使用\n */\n cursor?: string\n zIndex?: number\n}\n\n/** 仅仅起到类型声明的作用... */\nexport type MarkerEventMap = {\n click: Tg.MouseEvent\n dblclick: Tg.MouseEvent\n /** @deprecated 使用`contextmenu`替代 */\n rightclick: Tg.MouseEvent\n contextmenu: Tg.MouseEvent\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n dragstart: Tg.MouseEvent\n drag: Tg.MouseEvent\n dragend: Tg.MouseEvent\n}\n\nexport interface Marker extends Tg.EventTargetTyped<Marker, MarkerEventMap> {\n getPosition(): LatLng\n setPosition(position: LatLng): void\n setTitle(title: string): void\n getTitle(): string\n setIcon(icon: UnionIcon): void\n /** 感觉并没有读取Icon的必要, 直接返回内部的Icon, 懒得写包装类_(:3」∠)_ */\n getIcon(): Nullable<UnionGoogleIcon | UnionBaiduIcon>\n /**\n * ## 不同行为\n * - baidu: 不支持设置clickable\n * - google: 支持\n * @deprecated 不推荐使用\n */\n setClickable(enable: boolean): void\n isClickable(): boolean\n setDraggable(enable: boolean): void\n isDraggable(): boolean\n /**\n * ## 不同行为\n * - baidu: 调用该方法无效\n * - google: 有效\n */\n setZIndex(zIndex?: number): void\n getZIndex(): number | undefined\n\n setLabel(label: LabelOverlay | undefined): void\n}\n\nexport type MarkerOverlay = Marker & Overlay\n\nexport type BMarker = BMap.Marker & {\n __info_box__?: BaiduInfoBox\n __create_by_tg__?: boolean\n}\n\nexport class BaiduMarker extends BaiduOverlay<BMarker> implements Marker {\n static create(this: BaiduMap, options: MarkerOptions): BaiduMarker {\n const coordType = this.coordType\n const icon = options.icon\n const opts: BMap.MarkerOptions = {\n title: options.title,\n icon: icon && UnionIcon.toBaidu(icon),\n enableClicking: options.clickable,\n enableDragging: options.draggable,\n // baidu的raiseOnDrag属性, 默认为false, 而我们的options.crossOnDrag默认为true, 故这里需要转换下\n raiseOnDrag: options.crossOnDrag === undefined ? true : options.crossOnDrag,\n draggingCursor: options.cursor,\n }\n\n const marker: BMarker = new BMap.Marker(options.position.toBaidu(coordType, options.normalizePositionForBaidu), opts)\n marker.__create_by_tg__ = true\n if (options.zIndex !== undefined) {\n marker.setZIndex(options.zIndex)\n }\n // clickable默认为true\n const clickable = options.clickable === undefined ? true : options.clickable\n // draggable默认为false\n const draggable = !!options.draggable\n return new BaiduMarker(marker, coordType, this, { clickable, draggable, zIndex: options.zIndex, normalize: options.normalizePositionForBaidu })\n .visibleOptionInternal(options.visible)\n }\n\n constructor(\n innerOverlay: BMap.Marker,\n coordType: CoordType,\n map: BaiduMap,\n /** baidu的Marker不支持读/写clickable等属性, 故只能将创建临时的clickable保存在这个state中 */\n private state: { clickable: boolean, draggable: boolean, zIndex: number | undefined, normalize?: boolean },\n ) {\n super(innerOverlay, coordType, map)\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n // 为了防止map的coordType改变, 要保存它\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType, this.state.normalize))\n this.innerOverlay.__info_box__?.onMarkerPositionChanged()\n }\n setTitle(title: string): void {\n this.innerOverlay.setTitle(title)\n }\n getTitle(): string {\n return this.innerOverlay.getTitle()\n }\n setIcon(icon: UnionIcon): void {\n const baiduIcon = UnionIcon.toBaidu(icon)\n this.innerOverlay.setIcon(baiduIcon)\n // Icon改变之后, 需要重新关联到label中\n const label = this.getLabel()\n if (label) {\n label.attachIcon(baiduIcon)\n }\n }\n getIcon(): UnionBaiduIcon {\n return this.innerOverlay.getIcon()\n }\n setClickable(enable: boolean): void {\n // baidu 没有这个方法...这里只能改变下flag\n this.state.clickable = enable\n }\n isClickable(): boolean {\n return this.state.clickable\n }\n setDraggable(enable: boolean): void {\n this.state.draggable = enable\n if (enable) {\n this.innerOverlay.enableDragging()\n } else {\n this.innerOverlay.disableDragging()\n }\n }\n isDraggable(): boolean {\n return this.state.draggable\n }\n setZIndex(zIndex?: number): void {\n this.state.zIndex = zIndex\n this.innerOverlay.setZIndex(zIndex || 0)\n }\n getZIndex(): number | undefined {\n return this.state.zIndex\n }\n\n setLabel(label: BaiduLabelOverlay | undefined): void {\n const prevLabel = this.getLabel()\n if (prevLabel) {\n // 将之前的label关联的icon置为空\n prevLabel.attachIcon(undefined)\n }\n if (label) {\n // 给新的label关联icon\n label.attachIcon(this.innerOverlay.getIcon())\n }\n // 即使设置空值, 貌似也没问题\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n this.innerOverlay.setLabel(label?.innerOverlay!)\n }\n getLabel(): BaiduLabelOverlay | undefined {\n return (this.innerOverlay.getLabel() as BaiduLabel)?.__label__\n }\n}\n\nexport class GoogleMarker extends GoogleOverlay<google.maps.Marker> implements Marker {\n static create(this: GoogleMap, options: MarkerOptions): GoogleMarker {\n const coordType = this.coordType\n const icon = options.icon\n const opts: google.maps.MarkerOptions = {\n position: options.position.toGoogle(coordType),\n title: options.title,\n zIndex: options.zIndex,\n visible: options.visible,\n icon: icon && UnionIcon.toGoogle(icon),\n clickable: options.clickable,\n draggable: options.draggable,\n // google的crossOnDrag和我们的crossOnDrag是匹配的, 不需要转换\n crossOnDrag: options.crossOnDrag,\n cursor: options.cursor,\n // InfoWindow相对marker的position的偏移量, 若不指定, 则偏移到marker的icon的上部中央\n anchorPoint: new google.maps.Point(0, 0),\n }\n return new GoogleMarker(new google.maps.Marker(opts), coordType, this)\n }\n private label: GoogleLabelOverlay | undefined\n private labelPositionListener: google.maps.MapsEventListener | undefined\n private labelVisibleListener: google.maps.MapsEventListener | undefined\n private labelMapChangedListener: google.maps.MapsEventListener | undefined\n getPosition(): LatLng {\n return LatLng.fromGoogle(this.innerOverlay.getPosition()!, this.coordType)\n }\n setPosition(position: LatLng): void {\n // 同上\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toGoogle(this.coordType))\n }\n setTitle(title: string): void {\n this.innerOverlay.setTitle(title)\n }\n getTitle(): string {\n return this.innerOverlay.getTitle() || ''\n }\n setIcon(icon: UnionIcon): void {\n this.innerOverlay.setIcon(UnionIcon.toGoogle(icon))\n }\n getIcon(): Nullable<UnionGoogleIcon> {\n return this.innerOverlay.getIcon()\n }\n setClickable(flag: boolean): void {\n this.innerOverlay.setClickable(flag)\n }\n isClickable(): boolean {\n return this.innerOverlay.getClickable()\n }\n setDraggable(enable: boolean): void {\n this.innerOverlay.setDraggable(enable)\n }\n isDraggable(): boolean {\n // draggable默认是false, 故可以直接用`!!`转成boolean\n return !!this.innerOverlay.getDraggable()\n }\n setZIndex(zIndex?: number): void {\n this.innerOverlay.setZIndex(zIndex === undefined ? null : zIndex)\n }\n getZIndex(): number | undefined {\n const zIndex = this.innerOverlay.getZIndex()\n return zIndex === null ? undefined : zIndex\n }\n setLabel(label: GoogleLabelOverlay | undefined): void {\n this.label && this.map.removeOverlay(this.label)\n this.labelPositionListener && this.labelPositionListener.remove()\n this.labelVisibleListener && this.labelVisibleListener.remove()\n this.labelMapChangedListener && this.labelMapChangedListener.remove()\n if (label) {\n const positionChanged = () => {\n label.innerOverlay.setPosition(this.innerOverlay.getPosition())\n }\n const visibleChanged = () => {\n label.innerOverlay.setVisible(this.innerOverlay.getVisible())\n }\n const mapChanged = () => {\n // 存在map说明marker已经被添加到地图上, label也要添加进去\n if (this.innerOverlay.getMap()) {\n this.map.addOverlay(label)\n } else {\n this.map.removeOverlay(label)\n }\n }\n mapChanged()\n positionChanged()\n visibleChanged()\n this.label = label\n // map_changed事件在文档中没有写, 但是目前确实有这个事件...\n // https://stackoverflow.com/questions/10866607/markerclustererplus-event-when-marker-is-shown-hidden-in-cluster\n this.labelMapChangedListener = this.innerOverlay.addListener('map_changed', mapChanged)\n this.labelPositionListener = this.innerOverlay.addListener('position_changed', positionChanged)\n this.labelVisibleListener = this.innerOverlay.addListener('visible_changed', visibleChanged)\n } else {\n this.label = undefined\n this.labelPositionListener = undefined\n this.labelVisibleListener = undefined\n this.labelMapChangedListener = undefined\n }\n }\n}\n","import { MVCArrays } from '../../../utils/arrays'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { IconSequence, type BaiduSymbolIcon } from './icon'\nimport type { BMarker } from './marker'\nimport type { Overlay } from './overlay'\nimport { BaiduShape, GoogleShape, type NotFillableShape, type NotFillableShapeOptions } from './shape'\n\nexport type PolylineEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /**\n * 在`editable`模式下编辑了path的事件\n * 外部调用{@link Polyline#setPath}, 不触发该事件 (之所以这样设计, 是为了避免频繁的进行LatLng<=>地图点对象的相互转换)\n *\n * ## 原理\n * 该事件的实现比较杂, 原始地图并没有等效的事件, 都是通过转换实现的\n * - google: 通过监听path的`insert/remove/set_at`实现\n * - baidu: 通过监听`lineupdate`事件, 然后判断path有没有被修改, 来实现的\n */\n 'path-edited': Tg.Event\n}\n\nexport interface PolylineOptions extends NotFillableShapeOptions {\n path: LatLng[]\n /**\n * ## 不同行为\n * - google: 功能正常\n * - baidu: 百度地图在移除Polyline时, icons不会被移除, 导致错乱, 这里通过复写{@link BaiduPolyline.remove}, 规避了该bug\n */\n icons?: IconSequence[],\n}\n\nexport interface Polyline extends Tg.EventTargetTyped<Polyline, PolylineEventMap>, NotFillableShape {\n getPath(): LatLng[]\n setPath(path: LatLng[]): void\n}\n\nexport type PolylineOverlay = Polyline & Overlay\n\nexport abstract class BaiduPolyShape<T extends BMap.Polyline | BMap.Polygon> extends BaiduShape<T> {\n /** 路径被编辑的事件名 */\n protected abstract pathEditedEventType: string\n\n /** 修改路径, 仅内部使用 */\n protected setPathInternal(path: BMap.Point[]) {\n this.isDoingSetPath = true\n this.innerOverlay.setPath(path)\n this.isDoingSetPath = false\n }\n\n private eventHubDelegate : EventHubEventTargetDelegate | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: [this.pathEditedEventType],\n onListen: () => {\n // 读取内部的path, 方便在`lineupdate`触发后比较有没有变更\n this.prevPath = this.innerOverlay.getPath()\n this.innerOverlay.addEventListener('lineupdate', this.onLineUpdate)\n },\n onCancel: () => {\n this.innerOverlay.removeEventListener('lineupdate', this.onLineUpdate)\n this.prevPath = undefined\n },\n }))\n }\n\n private prevPath: BMap.Point[] | undefined\n private isDoingSetPath = false\n private onLineUpdate = () => {\n const path = this.innerOverlay.getPath()\n // 过滤掉path不变和通过setPath触发事件的情况\n if (path !== this.prevPath) {\n if (!this.isDoingSetPath) {\n this.eventHubDelegate?.notify({\n type: this.pathEditedEventType,\n target: this,\n // [BaiduRectangle.onBoundsChanged](file://./rectangle.ts#L63)中需要读取则两个数据\n originalEvent: {\n prevPath: this.prevPath,\n path: path,\n },\n })\n }\n this.prevPath = path\n }\n }\n}\n\nexport class BaiduPolyline extends BaiduPolyShape<BMap.Polyline> implements Polyline {\n static create(this: BaiduMap, options: PolylineOptions): BaiduPolyline {\n const coordType = this.coordType\n const inner = new BMap.Polyline(options.path.map(it => it.toBaidu(coordType)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n icons: options.icons?.map(IconSequence.toBaidu),\n })\n return new BaiduPolyline(inner, coordType, this, {\n editable: !!options.editable,\n symbolIcons: options.icons?.map(it => it.icon),\n })\n .visibleOptionInternal(options.visible)\n }\n\n protected override pathEditedEventType: string = 'path-edited'\n\n getPath(): LatLng[] {\n return this.innerOverlay.getPath().map(it => LatLng.fromBaidu(it, this.coordType))\n }\n setPath(path: LatLng[]): void {\n this.coordType = this.map.coordType\n this.setPathInternal(path.map(it => it.toBaidu(this.coordType)))\n }\n override remove(): void {\n super.remove()\n // baidu的PolylineOptions.icons实现有bug, 在移除Polyline时, 由Polyline维护的icons不会被移除\n // 这里将可能是Polyline的Icon的Marker过滤出来, 手动移除它们\n if (this.state.symbolIcons?.length) {\n const icons = this.map.innerMap.getOverlays().filter(overlay => {\n if (!(overlay instanceof BMap.Marker)) return false\n\n const marker = overlay as BMarker\n if (marker.__create_by_tg__) return false\n\n const icon = marker.getIcon()\n if (!(icon instanceof BMap.Symbol)) return false\n\n const symbolIcon = icon as BaiduSymbolIcon\n if (!symbolIcon.__icon__) return false\n\n return this.state.symbolIcons?.includes(symbolIcon.__icon__)\n })\n icons.forEach(it => this.map.innerMap.removeOverlay(it))\n }\n }\n}\n\n/**\n * Google地图的网页版不支持Advanced Polyline(纹理/渐变等效果), 详见: https://issuetracker.google.com/issues/267845944\n */\nexport class GooglePolyline extends GoogleShape<google.maps.Polyline> implements Polyline {\n static create(this: GoogleMap, options: PolylineOptions): GooglePolyline {\n const coordType = this.coordType\n const inner = new google.maps.Polyline({\n path: options.path.map(it => it.toGoogle(coordType)),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n visible: options.visible,\n icons: options.icons?.map(IconSequence.toGoogle),\n })\n return new GooglePolyline(inner, coordType, this)\n }\n\n private pathChangedListeners: google.maps.MapsEventListener[] | undefined\n\n private setupPathChangedListeners() {\n const notify = () => this.eventHubDelegate?.notify({ type: 'path-edited', target: this })\n const path = this.innerOverlay.getPath()\n this.pathChangedListeners = MVCArrays.listenChanged(path, notify)\n }\n private clearPathChangedListeners() {\n this.pathChangedListeners?.forEach(it => it.remove())\n this.pathChangedListeners = undefined\n }\n private eventHubDelegate: EventHubEventTargetDelegate<'path-edited'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['path-edited'],\n onListen: () => this.setupPathChangedListeners(),\n onCancel: () => this.clearPathChangedListeners(),\n }))\n }\n\n getPath(): LatLng[] {\n const path: LatLng[] = []\n this.innerOverlay.getPath().forEach(point => {\n path.push(LatLng.fromGoogle(point, this.coordType))\n })\n return path\n }\n setPath(path: LatLng[]): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPath(path.map(it => it.toGoogle(this.coordType)))\n if (this.eventHubDelegate?.hasListener('path-edited')) {\n // 修改path后, 需要重新设置监听\n this.setupPathChangedListeners()\n }\n }\n}\n","import { MVCArrays } from '../../../components'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { BaiduPolyShape, type PolylineEventMap } from './polyline'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type PolygonEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /** @see PolylineEventMap `.path-edited` */\n 'paths-edited': Tg.Event\n}\n\nexport interface PolygonOptions extends ShapeOptions {\n paths: LatLng[][]\n}\n\nexport interface Polygon extends Tg.EventTargetTyped<Polygon, PolygonEventMap>, Shape {\n getPaths(): LatLng[][]\n setPaths(paths: LatLng[][]): void\n}\n\nexport type PolygonOverlay = Polygon & Overlay\n\nexport class BaiduPolygon extends BaiduPolyShape<BMap.Polygon> implements Polygon {\n static create(this: BaiduMap, options: PolygonOptions) {\n const coord = this.coordType\n if (options.paths.length > 1) {\n console.warn('baidu不支持多path, 只会显示paths[0]')\n }\n const path = options.paths[0] || []\n const inner = new BMap.Polygon(path.map(it => it.toBaidu(coord)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n return new BaiduPolygon(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n }\n\n protected override pathEditedEventType: string = 'paths-edited'\n\n getPaths(): LatLng[][] {\n return [this.innerOverlay.getPath().map(it => LatLng.fromBaidu(it, this.coordType))]\n }\n setPaths(paths: LatLng[][]): void {\n if (paths.length > 1) {\n console.warn('baidu不支持多path, 只会显示paths[0]')\n }\n this.coordType = this.map.coordType\n this.setPathInternal((paths[0] || []).map(it => it.toBaidu(this.coordType)))\n }\n}\n\nexport class GooglePolygon extends GoogleShape<google.maps.Polygon> implements Polygon {\n static create(this: GoogleMap, options: PolygonOptions) {\n const coord = this.coordType\n const inner = new google.maps.Polygon({\n paths: options.paths.map(it => it.map(it => it.toGoogle(coord))),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GooglePolygon(inner, coord, this)\n }\n\n private pathChangedListeners: google.maps.MapsEventListener[] | undefined\n\n private setupPathChangedListeners() {\n const notify = () => this.eventHubDelegate?.notify({ type: 'paths-edited', target: this })\n const paths = this.innerOverlay.getPaths()\n this.pathChangedListeners = []\n paths.forEach((path) => {\n this.pathChangedListeners!.push(...MVCArrays.listenChanged(path, notify))\n })\n }\n private clearPathChangedListeners() {\n this.pathChangedListeners?.forEach(it => it.remove())\n this.pathChangedListeners = undefined\n }\n\n private eventHubDelegate: EventHubEventTargetDelegate<'paths-edited'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['paths-edited'],\n onListen: () => this.setupPathChangedListeners(),\n onCancel: () => this.clearPathChangedListeners(),\n }))\n }\n\n getPaths(): LatLng[][] {\n const paths = this.innerOverlay.getPaths()\n const pathsLL: LatLng[][] = []\n paths.forEach(path => {\n const pathLL: LatLng[] = []\n pathsLL.push(pathLL)\n path.forEach(point => {\n pathLL.push(LatLng.fromGoogle(point, this.coordType))\n })\n })\n return pathsLL\n }\n setPaths(paths: LatLng[][]): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPaths(paths.map(it => it.map(it => it.toGoogle(this.coordType))))\n if (this.eventHubDelegate?.hasListener('paths-edited')) {\n // 修改paths后, 需要重新设置监听\n this.setupPathChangedListeners()\n }\n }\n}\n","import { BMapPoints } from '../../../utils/baidu-utils'\nimport { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng, LatLngBounds } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\nimport { BaiduPolyShape } from './polyline'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type RectangleEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /**\n * - google: 监听[bounds_changed](https://developers.google.com/maps/documentation/javascript/shapes#editable_events)\n * - baidu: 内部使用Polygon并监听`lineupdate`实现\n */\n 'bounds-changed': Tg.Event\n}\n\nexport interface RectangleOptions extends ShapeOptions {\n bounds: LatLngBounds\n}\n\nexport interface Rectangle extends Tg.EventTargetTyped<Rectangle, RectangleEventMap>, Shape {\n getBounds(): LatLngBounds\n setBounds(bounds: LatLngBounds):void\n}\n\n/**\n * 矩形覆盖物\n *\n * - google: 有矩形\n * - baidu: 没有矩形, 使用{@link BMap.Polygon}变相实现\n */\nexport type RectangleOverlay = Rectangle & Overlay\n\nexport class BaiduRectangle extends BaiduPolyShape<BMap.Polygon> implements Rectangle {\n static create(this: BaiduMap, options: RectangleOptions) {\n const coord = this.coordType\n const inner = new BMap.Polygon(options.bounds.toRectArray().map(it => it.toBaidu(coord)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n return new BaiduRectangle(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n }\n\n constructor(\n innerOverlay: BMap.Polygon,\n coordType: CoordType,\n map: BaiduMap,\n state: { editable: boolean },\n ) {\n super(innerOverlay, coordType, map, state)\n this.addEventListener('bounds-changed', this.onBoundsChanged)\n }\n\n protected override pathEditedEventType: string = 'bounds-changed'\n\n private isDoingUpdateRectangle = false\n private onBoundsChanged = ({ originalEvent }: Tg.Event) => {\n if (this.isDoingUpdateRectangle) {\n // 防止递归\n return\n }\n const prevPath: BMap.Point[] = originalEvent.prevPath ?? []\n const path: BMap.Point[] = originalEvent.path\n // timeout一下, 防止报递归错误\n setTimeout(() => {\n let points: BMap.Point[] = path\n const length = path.length\n if (prevPath.length !== 4) {\n // 之前的点数不为4\n } else if (length > prevPath.length) {\n // 点变多, 取对边的两个点, 和新的点, 构成新的矩形\n for (let i = 0; i < length; i++) {\n if (prevPath[i] == null || !BMapPoints.equals(path[i], prevPath[i])) {\n const lineStart = path[(i - 2 + length) % length] // 取i之前的点时, `+ length`可以防止index变负数\n const beforePoint = path[(i - 1 + length) % length] // 同上\n const point = path[i]\n const afterPoint = path[(i + 1) % length]\n const lineEnd = path[(i + 2) % length]\n\n let newPoint: BMap.Point\n if (beforePoint.lat === afterPoint.lat) {\n // 前后两个点的lat相同, 就使用新的点的lat\n newPoint = new BMap.Point(beforePoint.lng, point.lat)\n } else if (beforePoint.lng === afterPoint.lng) {\n // 前后两个点的lng相同, 就使用新的点的lng\n newPoint = new BMap.Point(point.lng, beforePoint.lat)\n } else {\n newPoint = point\n }\n points = [lineStart, lineEnd, newPoint]\n break\n }\n }\n } else if (length === prevPath.length) {\n // 点不变, 取对角的点, 构成新的矩形\n for (let i = 0; i < length; i++) {\n if (!BMapPoints.equals(path[i], prevPath[i])) {\n points = [\n path[i],\n path[(i + 2) % 4],\n ]\n break\n }\n }\n } else if (length < prevPath.length) {\n // 点变少, 不做特殊处理\n }\n\n // 从points重新创建矩形\n const bounds = LatLngBounds.fromArray(points.map(it => LatLng.fromBaidu(it, this.coordType)))\n if (bounds) {\n this.isDoingUpdateRectangle = true\n // 使用原始的setPath方法, 保证触发`bounds-changed`事件\n this.innerOverlay.setPath(bounds.toRectArray().map(it => it.toBaidu(this.coordType)))\n this.isDoingUpdateRectangle = false\n }\n }, 0)\n }\n\n getBounds(): LatLngBounds {\n return LatLngBounds.fromBaidu(this.innerOverlay.getBounds(), this.coordType)\n }\n setBounds(bounds: LatLngBounds): void {\n const rect = bounds.toRectArray()\n if (this.innerOverlay.getPath().length === rect.length) {\n bounds.toRectArray().forEach((item, index) => {\n // setPositionAt会触发`lineupdate`, 但由于只是path的元素改变了, path本身并没有被替换, 所以不会触发`bounds-changed`\n this.innerOverlay.setPositionAt(index, item.toBaidu(this.coordType))\n })\n } else {\n this.setPathInternal(rect.map(it => it.toBaidu(this.coordType)))\n }\n }\n}\n\nexport class GoogleRectangle extends GoogleShape<google.maps.Rectangle> implements Rectangle {\n static create(this: GoogleMap, options: RectangleOptions) {\n const coord = this.coordType\n const inner = new google.maps.Rectangle({\n bounds: options.bounds.toGoogle(coord),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GoogleRectangle(inner, coord, this)\n }\n getBounds(): LatLngBounds {\n return LatLngBounds.fromGoogle(this.innerOverlay.getBounds() ?? GoogleConst.BOUNDS_ZERO, this.coordType)\n }\n setBounds(bounds: LatLngBounds): void {\n const value = bounds.toGoogle(this.coordType)\n // `bounds-changed`事件在设置相同的值时也会触发, 故这里需要过滤相同的值\n if (value.equals(this.innerOverlay.getBounds())) {\n return\n }\n this.innerOverlay.setBounds(value)\n }\n}\n","import { assert } from '../../utils/assert'\nimport { Elements } from '../../utils/elements'\nimport { throwError } from '../../utils/utils'\nimport { BaiduEventTargetDelegate } from '../event-target'\nimport { LatLng, LatLngBounds } from '../lat-lng'\nimport type { Padding, Point } from '../types'\nimport { ControlPositionConverter, CustomControl } from './controls/control'\nimport { BaiduMapTypeControl } from './controls/map-type.control'\nimport { BaiduScaleControl } from './controls/scale.control'\nimport { BaiduStreetViewControl } from './controls/street-view.control'\nimport { BaiduZoomControl } from './controls/zoom.control'\nimport { BaiduAutocomplete, type Autocomplete, type AutocompleteOptions } from './extra/autocomplete'\nimport { BaiduHeatmap, type Heatmap, type HeatmapOptions } from './extra/heatmap'\nimport { BaiduMapUrls, type MapUrls, type MapUrlsOptions } from './extra/map-urls'\nimport { BaiduMarkerClusterer, type MarkerClustererOptions } from './extra/marker-clusterer'\nimport { BaiduPlacesService, type PlacesService, type PlacesServiceOptions } from './extra/places-service'\nimport { BaiduSearchBox, type SearchBox, type SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap, type AbstractMapEventMap } from './map'\nimport { GestureHandlingOptions, MapOptions, type MapStyle } from './map-options'\nimport { BuildInMapType, BuildInMapTypeId, MapType, type BaiduMapType, type BuildInMapTypeIdIncludeIncompatible, type Layer } from './map-type'\nimport { BaiduCircle } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport { BaiduInfoBoxOverlay } from './overlay/info-box'\nimport { BaiduInfoWindow } from './overlay/info-window'\nimport { BaiduLabelOverlay } from './overlay/label'\nimport { BaiduMarker, type BMarker } from './overlay/marker'\nimport type { BaiduOverlay } from './overlay/overlay'\nimport { BaiduPolygon } from './overlay/polygon'\nimport { BaiduPolyline } from './overlay/polyline'\nimport { BaiduRectangle } from './overlay/rectangle'\n\n/**\n * 以google地图的zoom为基准, baidu地图的zoom的值比google地图的大1级\n * 所以在setter中需要+1, 在getter中需要-1\n * */\nconst ZOOM_DELTA = 1\n\n// cSpell:ignore BIMT\nexport class BaiduMap extends AbstractMap {\n private buildInMapTypeId2BIMT: Map<BuildInMapTypeIdIncludeIncompatible, BuildInMapType>\n private baiduMapType2BIMT: Map<BaiduMapType, BuildInMapType>\n private map: BMap.Map\n constructor(\n element: HTMLElement,\n mapOptions: MapOptions,\n ) {\n super(element)\n this.buildInMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getId)\n this.baiduMapType2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.asBaiduMapType)\n\n this.map = new BMap.Map(element, {\n minZoom: mapOptions.minZoom && mapOptions.minZoom + ZOOM_DELTA,\n maxZoom: mapOptions.maxZoom && mapOptions.maxZoom + ZOOM_DELTA,\n mapType: mapOptions.buildInMapTypeId && this.buildInMapTypeId2BIMT.get(mapOptions.buildInMapTypeId)?.asBaiduMapType(),\n enableMapClick: false, // 关闭底图点击功能\n })\n this.map.centerAndZoom(mapOptions.center.toBaidu(this.coordType), mapOptions.zoom + ZOOM_DELTA)\n this.setGestureHandling(mapOptions.gestureHandling)\n if (mapOptions.infoWindowMode === 'multi') {\n console.warn('baidu不支持多个InfoWindow, 可能会出现未知问题')\n }\n if (mapOptions.mapStyle) {\n this.map.setMapStyleV2(mapOptions.mapStyle.baidu)\n }\n this.setEventTargetDelegate(new BaiduEventTargetDelegate(this.map, this))\n this.map.addEventListener('addoverlay', (event) => {\n // 将target当作BMarker看待\n const infoBox = (event.target as BMarker).__info_box__\n if (infoBox) {\n console.debug('add:info-box', infoBox)\n this.map.addOverlay(infoBox)\n }\n })\n this.map.addEventListener('removeoverlay', (event) => {\n // 同上\n const infoBox = (event.target as BMarker).__info_box__\n if (infoBox) {\n console.debug('remove:info-box', infoBox)\n this.map.removeOverlay(infoBox)\n }\n })\n }\n override setGestureHandling(gestureHandling: GestureHandlingOptions = GestureHandlingOptions.auto) {\n if (gestureHandling === GestureHandlingOptions.auto) {\n gestureHandling = this.element.parentElement && Elements.isScrollable(this.element.parentElement)\n ? GestureHandlingOptions.cooperative\n : GestureHandlingOptions.greedy\n }\n switch (gestureHandling) {\n case GestureHandlingOptions.cooperative:\n this.map.disableScrollWheelZoom()\n this.map.enableDragging()\n this.map.enableDoubleClickZoom()\n break\n case GestureHandlingOptions.greedy:\n this.map.enableScrollWheelZoom()\n this.map.enableDragging()\n this.map.enableDoubleClickZoom()\n break\n case GestureHandlingOptions.none:\n this.map.disableDragging()\n this.map.disableScrollWheelZoom()\n this.map.disableDoubleClickZoom()\n break\n }\n }\n override get innerMap(): BMap.Map {\n return this.map\n }\n override get coordType() {\n return this.getMapType().getBaiduCoordType()\n }\n override addEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void {\n if (type === 'center-changed') {\n // 一个事件转成三个事件\n super.addEventListener('movestart', listener as any)\n super.addEventListener('moving', listener as any)\n super.addEventListener('moveend', listener as any)\n super.addEventListener('zoomend', listener as any)\n return\n }\n super.addEventListener(type, listener)\n }\n\n override removeEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void {\n if (type === 'center-changed') {\n // 同上\n super.removeEventListener('movestart', listener as any)\n super.removeEventListener('moving', listener as any)\n super.removeEventListener('moveend', listener as any)\n super.removeEventListener('zoomend', listener as any)\n return\n }\n super.removeEventListener(type, listener)\n }\n\n override fromContainerPointToLatLng(point: Point): LatLng {\n return LatLng.fromBaidu(this.innerMap.pixelToPoint(new BMap.Pixel(point.x, point.y)), this.coordType)\n }\n\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n return this.innerMap.pointToPixel(latLng.toBaidu(this.coordType))\n }\n\n override setDefaultCursor(cursor: string): void {\n this.innerMap.setDefaultCursor(cursor)\n }\n\n override setDraggable(draggable: boolean) {\n draggable ? this.innerMap.enableDragging() : this.innerMap.disableDragging()\n }\n\n override setDoubleClickZoom(enable: boolean) {\n if (enable) {\n this.map.enableDoubleClickZoom()\n } else {\n this.map.disableDoubleClickZoom()\n }\n }\n\n override getCenter() {\n return LatLng.fromBaidu(this.map.getCenter(), this.coordType)\n }\n override setCenter(latlng: LatLng) {\n this.map.setCenter(latlng.toBaidu(this.coordType))\n }\n override getZoom(): number {\n return super.getZoom() - ZOOM_DELTA\n }\n override setZoom(zoom: number): void {\n return super.setZoom(zoom + ZOOM_DELTA)\n }\n override setMinZoom(zoom: number): void {\n this.map.setMinZoom(zoom + ZOOM_DELTA)\n }\n override setMaxZoom(zoom: number): void {\n this.map.setMaxZoom(zoom + ZOOM_DELTA)\n }\n override setMapStyle(mapStyle?: MapStyle) {\n this.map.setMapStyleV2(mapStyle?.baidu ?? { styleJson: [] })\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n const mapType = this.buildInMapTypeId2BIMT.get(id)?.asBaiduMapType()\n this.map.setMapType(mapType ?? throwError('理论上来说不可能为空'))\n }\n override setMapType(mapType: MapType) {\n this.map.setMapType(mapType.asBaiduMapType())\n }\n override getMapType(): MapType {\n const mapType: BaiduMapType = this.map.getMapType()\n // 内置的MapType\n const buildInMapType = this.baiduMapType2BIMT.get(mapType)\n if (buildInMapType) {\n return buildInMapType\n }\n // 其他MapType\n return mapType.__baidu_map_type__ ?? throwError('实现asBaiduMapType()时, 忘了给实例设置__baidu_map_type__?')\n }\n override addLayer(layer: Layer) {\n this.map.addTileLayer(layer.asBaiduLayer())\n }\n override removeLayer(layer: Layer) {\n this.map.removeTileLayer(layer.asBaiduLayer())\n }\n override panTo(position: LatLng): void {\n this.map.panTo(position.toBaidu(this.coordType))\n }\n override panBy(x: number, y: number): void {\n this.map.panBy(x, y)\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding): void {\n this.map.setViewport(bounds.toBaiduArray(this.coordType), {\n // enableAnimation: true, // 默认为true\n margins: padding && [padding.top, padding.right, padding.bottom, padding.left],\n })\n }\n override getBounds(): LatLngBounds {\n return LatLngBounds.fromBaidu(this.map.getBounds(), this.coordType)\n }\n override addElementOverlay(overlay: ElementOverlay) {\n this.map.addOverlay(overlay.asBaidu())\n }\n override removeElementOverlay(overlay: ElementOverlay) {\n this.map.removeOverlay(overlay.asBaidu())\n }\n override addOverlay(overlay: BaiduOverlay) {\n this.map.addOverlay(overlay.innerOverlay)\n }\n override removeOverlay(overlay: BaiduOverlay) {\n this.map.removeOverlay(overlay.innerOverlay)\n }\n override addCustomControl(control: CustomControl): void {\n if (!control.inner) {\n const BaiduControl = class extends BMap.Control {\n override defaultAnchor = ControlPositionConverter.getBaidu().toValue(control.position)\n override defaultOffset = new BMap.Size(0, 0)\n override initialize(map: BMap.Map): HTMLElement {\n const element = control.onCreateElement()\n map.getContainer().appendChild(element)\n return element\n }\n }\n control.inner = new BaiduControl()\n this.map.addControl(control.inner)\n }\n }\n override removeCustomControl(control: CustomControl): void {\n if (control.inner) {\n assert(control.inner instanceof BMap.Control, `control.inner(${control.inner})需要是BMap.Control`)\n this.map.removeControl(control.inner)\n }\n }\n override createLabel = BaiduLabelOverlay.create\n override createCircle = BaiduCircle.create\n override createPolygon = BaiduPolygon.create\n override createPolyline = BaiduPolyline.create\n override createRectangle = BaiduRectangle.create\n override createInfoWindow = BaiduInfoWindow.create\n override createInfoBox = BaiduInfoBoxOverlay.create\n override createMarker = BaiduMarker.create\n override createMapTypeControl = BaiduMapTypeControl.create\n override createZoomControl = BaiduZoomControl.create\n override createStreetViewControl = BaiduStreetViewControl.create\n override createScaleControl = BaiduScaleControl.create\n override createMarkerClusterer(options: MarkerClustererOptions): BaiduMarkerClusterer {\n return new BaiduMarkerClusterer(this, options)\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n return new BaiduHeatmap(this, options)\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n return new BaiduAutocomplete(this, options)\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n return new BaiduSearchBox(this, options)\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n return new BaiduPlacesService(this, options)\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n return new BaiduMapUrls(options)\n }\n}\n","import { MVCArrays } from '../../utils/arrays'\nimport { GoogleConst } from '../../utils/google-utils'\nimport { throwError } from '../../utils/utils'\nimport { GoogleEventTargetDelegate } from '../event-target'\nimport { LatLng, LatLngBounds } from '../lat-lng'\nimport { Point, type Padding } from '../types'\nimport { ControlPositionConverter, CustomControl } from './controls/control'\nimport { GoogleMapTypeControl } from './controls/map-type.control'\nimport { GoogleScaleControl } from './controls/scale.control'\nimport { GoogleStreetViewControl } from './controls/street-view.control'\nimport { GoogleZoomControl } from './controls/zoom.control'\nimport { Autocomplete, GoogleAutocomplete, type AutocompleteOptions } from './extra/autocomplete'\nimport { GoogleHeatmap, type Heatmap, type HeatmapOptions } from './extra/heatmap'\nimport { GoogleMapUrls, type MapUrls, type MapUrlsOptions } from './extra/map-urls'\nimport { GoogleMarkerClusterer, type MarkerClustererOptions } from './extra/marker-clusterer'\nimport { GooglePlacesService, type PlacesService, type PlacesServiceOptions } from './extra/places-service'\nimport { GoogleSearchBox, SearchBox, type SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap } from './map'\nimport type { GestureHandlingOptions, MapOptions, MapStyle } from './map-options'\nimport { BuildInMapType, BuildInMapTypeId, MapType, type BuildInMapTypeIdIncludeIncompatible, type GoogleMapType, type Layer, type OverlayMapType } from './map-type'\nimport { GoogleCircle } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport { GoogleInfoBoxOverlay } from './overlay/info-box'\nimport { GoogleInfoWindow } from './overlay/info-window'\nimport { GoogleLabelOverlay } from './overlay/label'\nimport { GoogleMarker } from './overlay/marker'\nimport type { GoogleOverlay } from './overlay/overlay'\nimport { GooglePolygon } from './overlay/polygon'\nimport { GooglePolyline } from './overlay/polyline'\nimport { GoogleRectangle } from './overlay/rectangle'\n// cSpell:ignore BIMT\nexport class GoogleMap extends AbstractMap {\n private buildInMapTypeId2BIMT: Map<BuildInMapTypeIdIncludeIncompatible, BuildInMapType>\n private googleMapTypeId2BIMT: Map</* google.maps.MapTypeId */string, BuildInMapType>\n private map: google.maps.Map\n constructor(\n element: HTMLElement,\n public mapOptions: MapOptions,\n ) {\n super(element)\n this.buildInMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getId)\n this.googleMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getGoogleMapTypeId)\n\n const initialMapType = mapOptions.buildInMapTypeId && this.buildInMapTypeId2BIMT.get(mapOptions.buildInMapTypeId)\n this.map = new google.maps.Map(element, {\n center: mapOptions.center.toGoogle((initialMapType ?? MapType.NORMAL).getGoogleCoordType()),\n zoom: mapOptions.zoom,\n disableDefaultUI: true,\n gestureHandling: mapOptions.gestureHandling,\n minZoom: mapOptions.minZoom,\n maxZoom: mapOptions.maxZoom,\n styles: mapOptions.mapStyle?.google.styles,\n mapId: mapOptions.mapStyle?.google.mapId,\n mapTypeId: initialMapType?.getGoogleMapTypeId(),\n })\n this.setEventTargetDelegate(new GoogleEventTargetDelegate(this.map, this))\n }\n override setGestureHandling(gestureHandling?: GestureHandlingOptions) {\n this.map.setOptions({\n gestureHandling: gestureHandling,\n })\n }\n get innerMap(): google.maps.Map {\n return this.map\n }\n get coordType() {\n return this.getMapType().getGoogleCoordType()\n }\n\n override fromContainerPointToLatLng(point: Point): LatLng {\n // Google地图的Projection使用的是世界坐标, 需要转换成屏幕内坐标\n // 详见: https://stackoverflow.com/questions/25219346/how-to-convert-from-x-y-screen-coordinates-to-latlng-google-maps\n const projection = this.innerMap.getProjection()\n const bounds = this.innerMap.getBounds()\n if (projection == null || bounds == null) {\n return LatLng.ZERO\n }\n const bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest())\n const topRight = projection.fromLatLngToPoint(bounds.getNorthEast())\n const zoom = this.innerMap.getZoom()\n if (bottomLeft == null || topRight == null || zoom == null) {\n return LatLng.ZERO\n }\n const scale = Math.pow(2, zoom)\n const wordPoint = new google.maps.Point(point.x / scale + bottomLeft.x, point.y / scale + topRight.y)\n return LatLng.fromGoogle(projection.fromPointToLatLng(wordPoint) ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n // 同上\n const projection = this.innerMap.getProjection()\n const bounds = this.innerMap.getBounds()\n if (projection == null || bounds == null) {\n return Point.ZERO\n }\n const bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest())\n const topRight = projection.fromLatLngToPoint(bounds.getNorthEast())\n const zoom = this.innerMap.getZoom()\n if (bottomLeft == null || topRight == null || zoom == null) {\n return Point.ZERO\n }\n const scale = Math.pow(2, zoom)\n const wordPoint = projection.fromLatLngToPoint(latLng.toGoogle(this.coordType))\n if (wordPoint == null) {\n return Point.ZERO\n }\n return { x: (wordPoint.x - bottomLeft.x) * scale, y: (wordPoint.y - topRight.y) * scale }\n }\n\n override setDefaultCursor(cursor: string): void {\n this.innerMap.setOptions({ draggableCursor: cursor })\n }\n\n override setDraggable(draggable: boolean) {\n this.innerMap.setOptions({ draggable })\n }\n\n override setDoubleClickZoom(enable: boolean) {\n this.map.setOptions({ disableDoubleClickZoom: !enable })\n }\n\n override getCenter() {\n return LatLng.fromGoogle(this.map.getCenter() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n override setCenter(latlng: LatLng) {\n this.map.setCenter(latlng.toGoogle(this.coordType))\n }\n override setMinZoom(zoom: number): void {\n this.map.setOptions({ minZoom: zoom })\n }\n override setMaxZoom(zoom: number): void {\n this.map.setOptions({ maxZoom: zoom })\n }\n override setMapStyle(mapStyle?: MapStyle) {\n this.map.setOptions({\n styles: mapStyle?.google.styles,\n mapId: mapStyle?.google.mapId,\n })\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n const mapTypeId = this.buildInMapTypeId2BIMT.get(id)?.getGoogleMapTypeId()\n this.map.setMapTypeId(mapTypeId ?? throwError('理论上来说不可能为空'))\n }\n override setMapType(mapType: MapType) {\n if (mapType instanceof BuildInMapType) {\n // 内置地图没有地图实例, 只需要用id设置就行了\n this.map.setMapTypeId(mapType.getGoogleMapTypeId())\n } else {\n this.map.mapTypes.set(mapType.id, mapType.asGoogleMapType())\n this.map.setMapTypeId(mapType.id)\n }\n }\n override getMapType(): MapType {\n const mapTypeId = this.map.getMapTypeId() ?? google.maps.MapTypeId.ROADMAP\n // 内置的MapType\n const buildInMapType = this.googleMapTypeId2BIMT.get(mapTypeId)\n if (buildInMapType) {\n return buildInMapType\n }\n // 其他MapType\n const mapType: GoogleMapType = this.map.mapTypes.get(mapTypeId)\n return mapType.__google_map_type__ ?? throwError(`实现${mapTypeId}的asGoogleMapType()时, 忘了给实例设置__google_map_type__?`)\n }\n override addOverlayMapType(mapType: OverlayMapType) {\n this.map.overlayMapTypes.push(mapType.asGoogleMapType())\n }\n override removeOverlayMapType(mapType: OverlayMapType) {\n MVCArrays.remove(this.map.overlayMapTypes, mapType.asGoogleMapType())\n }\n override addLayer(layer: Layer): void {\n layer.asGoogleLayer().setMap(this.map)\n }\n override removeLayer(layer: Layer): void {\n layer.asGoogleLayer().setMap(null)\n }\n override panTo(position: LatLng): void {\n this.map.panTo(position.toGoogle(this.coordType))\n }\n override panBy(x: number, y: number): void {\n this.map.panBy(x, y)\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding): void {\n this.map.fitBounds(bounds.toGoogle(this.coordType), padding)\n }\n override getBounds(): LatLngBounds {\n const bounds = this.map.getBounds()\n if (!bounds) {\n return LatLngBounds.EMPTY\n }\n return LatLngBounds.fromGoogle(bounds, this.coordType)\n }\n override addElementOverlay(overlay: ElementOverlay) {\n overlay.asGoogle().setMap(this.map)\n }\n override removeElementOverlay(overlay: ElementOverlay) {\n overlay.asGoogle().setMap(null)\n }\n override addOverlay(overlay: GoogleOverlay) {\n overlay.innerOverlay.setMap(this.map)\n }\n override removeOverlay(overlay: GoogleOverlay) {\n overlay.innerOverlay.setMap(null)\n }\n\n override addCustomControl(control: CustomControl) {\n if (!control.inner) {\n control.inner = control.onCreateElement()\n this.map.controls[ControlPositionConverter.getGoogle().toValue(control.position)].push(control.inner)\n }\n }\n override removeCustomControl(control: CustomControl) {\n if (control.inner) {\n const controlArray = this.map.controls[ControlPositionConverter.getGoogle().toValue(control.position)]\n MVCArrays.remove(controlArray, control.inner)\n }\n }\n override createLabel = GoogleLabelOverlay.create\n override createCircle = GoogleCircle.create\n override createPolygon = GooglePolygon.create\n override createPolyline = GooglePolyline.create\n override createRectangle = GoogleRectangle.create\n override createInfoWindow = GoogleInfoWindow.create\n override createInfoBox = GoogleInfoBoxOverlay.create\n override createMarker = GoogleMarker.create\n override createMapTypeControl = GoogleMapTypeControl.create\n override createZoomControl = GoogleZoomControl.create\n override createStreetViewControl = GoogleStreetViewControl.create\n override createScaleControl = GoogleScaleControl.create\n override createMarkerClusterer(options: MarkerClustererOptions): GoogleMarkerClusterer {\n return new GoogleMarkerClusterer(this, options)\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n return new GoogleHeatmap(this, options)\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n return new GoogleAutocomplete(this, options)\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n return new GoogleSearchBox(this, options)\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n return new GooglePlacesService(this, options)\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n return new GoogleMapUrls(options)\n }\n}\n","/**\n * 最新是3.1版, 但@types/heremaps和以前的项目都用的是3.0版, 故当前先用3.0...\n * TODO: 改成使用3.1版实现\n **/\nexport const HERE_SUPPORTED_VERSIONS = ['3.0'] as const\n\n/**\n * 当前@types/heremaps是v3.0版, 和v3.1版api有区别, 若要使用3.1版, 需要用这个方法来做到类型注解兼容...\n * @see https://developer.here.com/documentation/maps/topics/migration.html\n */\nexport function ensureHereV31() {\n if (H.service.PlatformV31) {\n return\n }\n H.service.PlatformV31 = H.service.Platform as any\n}\n","import deepmerge from 'deepmerge'\nimport { HERE_SUPPORTED_VERSIONS } from '../utils/here-utils'\nimport type { DeepPartial } from '../utils/mapped-types'\nimport { throwError } from '../utils/utils'\n\nexport interface MapConfig {\n key: string\n version: string\n}\n\nexport interface TgMapConfig {\n google: MapConfig & {\n /** @see https://developers.google.com/maps/documentation/javascript/versions */\n version: 'weekly' | 'quarterly' | 'beta' | 'alpha' | '3.49' | '3.50' | '3.51' | '3.52'\n language: string,\n /** @see https://developers.google.com/maps/documentation/javascript/libraries */\n libraries: ('drawing' | 'geometry' | 'journeySharing' | 'localContext' | 'marker' | 'places' | 'visualization')[]\n }\n baidu: MapConfig & {\n /** @see https://lbsyun.baidu.com/index.php?title=jspopular3.0/theupdatelog */\n version: '3.0'\n }\n here: MapConfig & {\n version: typeof HERE_SUPPORTED_VERSIONS[number]\n }\n}\n\nexport type PartialTgMapConfig = DeepPartial<TgMapConfig>\n\nconst defaultConfig: TgMapConfig = {\n baidu: {\n version: '3.0',\n // 在build时会被静态替换, 导致使用者不能无法设置它\n // @see https://cn.vitejs.dev/guide/build.html#library-mode:~:text=%E6%A8%A1%E5%BC%8F%E4%B8%8B%EF%BC%8C%E6%89%80%E6%9C%89-,import.meta.env.*,-%E7%94%A8%E6%B3%95%E5%9C%A8%E6%9E%84\n // @see @vite_process_env_detail\n key: import.meta.env.VITE_APP_DEV_KEY_BAIDU,\n },\n google: {\n version: 'quarterly',\n key: import.meta.env.VITE_APP_DEV_KEY_GOOGLE,\n language: 'en-us',\n libraries: ['places', 'visualization'],\n },\n here: {\n version: HERE_SUPPORTED_VERSIONS[0],\n key: import.meta.env.VITE_APP_DEV_KEY_HERE,\n },\n}\n\nlet tgMapConfig: TgMapConfig | undefined\n\nexport function getTgMapConfig(): TgMapConfig {\n return tgMapConfig || throwError('请先安装: Vue<PartialTgMapConfig>.use(TgMap, {})')\n}\n\nexport function setTgMapConfig(config?: PartialTgMapConfig) {\n if (config != null) {\n tgMapConfig = deepmerge(defaultConfig, config) as TgMapConfig\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n// cSpell:ignore apikey, mapevents\nimport { HERE_SUPPORTED_VERSIONS } from '../../utils/here-utils'\nimport { throwError } from '../../utils/utils'\nimport { CoordType, LatLng, LatLngBounds } from '../lat-lng'\nimport { getTgMapConfig } from '../map-config'\nimport type { Padding, Point } from '../types'\nimport type { CustomControl } from './controls/control'\nimport type { MapTypeControl, MapTypeControlOptions } from './controls/map-type.control'\nimport type { ScaleControlOptions } from './controls/scale.control'\nimport type { StreetViewControl, StreetViewControlOptions } from './controls/street-view.control'\nimport type { ZoomControl, ZoomControlOptions } from './controls/zoom.control'\nimport type { Autocomplete, AutocompleteOptions } from './extra/autocomplete'\nimport type { Heatmap, HeatmapOptions } from './extra/heatmap'\nimport type { MapUrls, MapUrlsOptions } from './extra/map-urls'\nimport type { MarkerClusterer, MarkerClustererOptions } from './extra/marker-clusterer'\nimport type { PlacesService, PlacesServiceOptions } from './extra/places-service'\nimport type { SearchBox, SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap } from './map'\nimport type { GestureHandlingOptions, MapOptions, MapStyle } from './map-options'\nimport type { BuildInMapTypeId, Layer, MapType } from './map-type'\nimport type { CircleOptions, CircleOverlay } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport type { InfoBoxOptions, InfoBoxOverlay } from './overlay/info-box'\nimport type { InfoWindowOptions, InfoWindowOverlay } from './overlay/info-window'\nimport type { LabelOptions, LabelOverlay } from './overlay/label'\nimport type { MarkerOptions, MarkerOverlay } from './overlay/marker'\nimport type { Overlay } from './overlay/overlay'\nimport type { PolygonOptions, PolygonOverlay } from './overlay/polygon'\nimport type { PolylineOptions, PolylineOverlay } from './overlay/polyline'\nimport type { RectangleOptions, RectangleOverlay } from './overlay/rectangle'\n\nexport class HereMap extends AbstractMap {\n private map: H.Map\n public defaultLayers: H.service.DefaultLayers\n constructor(\n element: HTMLElement,\n public mapOptions: MapOptions,\n ) {\n super(element)\n const config = getTgMapConfig().here\n if (!HERE_SUPPORTED_VERSIONS.includes(config.version)) {\n throwError(`不支持${config.version}, HereMap当前只支持如下版本: ${HERE_SUPPORTED_VERSIONS}`)\n }\n const platform = new H.service.Platform({\n app_id: config.key.split(',')[0],\n app_code: config.key.split(',')[1],\n })\n this.defaultLayers = platform.createDefaultLayers()\n this.map = new H.Map(element, this.defaultLayers.normal.map, {\n zoom: mapOptions.zoom,\n center: mapOptions.center?.toHere(this.coordType),\n })\n const behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(this.map))\n const ui = H.ui.UI.createDefault(this.map, this.defaultLayers)\n }\n\n override get innerMap(): H.Map {\n return this.map\n }\n\n override get coordType(): CoordType {\n return CoordType.wgs84\n }\n override getCenter(): LatLng {\n return LatLng.fromHere(this.map.getCenter(), this.coordType)\n }\n override setCenter(latlng: LatLng): void {\n this.map.setCenter(latlng.toHere(this.coordType))\n }\n // TODO: 实现其他方法\n override setGestureHandling(gestureHandling: GestureHandlingOptions): void {\n throw new Error('Method not implemented.')\n }\n override fromContainerPointToLatLng(point: Point): LatLng {\n throw new Error('Method not implemented.')\n }\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n throw new Error('Method not implemented.')\n }\n override setDefaultCursor(cursor: string): void {\n throw new Error('Method not implemented.')\n }\n override setDraggable(draggable: boolean): void {\n throw new Error('Method not implemented.')\n }\n override setDoubleClickZoom(enable: boolean): void {\n throw new Error('Method not implemented.')\n }\n override setMinZoom(zoom: number): void {\n throw new Error('Method not implemented.')\n }\n override setMaxZoom(zoom: number): void {\n throw new Error('Method not implemented.')\n }\n override setMapStyle(mapStyle?: MapStyle): void {\n throw new Error('Method not implemented.')\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n throw new Error('Method not implemented.')\n }\n override setMapType(mapType: MapType): void {\n throw new Error('Method not implemented.')\n }\n override getMapType(): MapType {\n throw new Error('Method not implemented.')\n }\n override addLayer(layer: Layer): void {\n throw new Error('Method not implemented.')\n }\n override removeLayer(layer: Layer): void {\n throw new Error('Method not implemented.')\n }\n override panTo(position: LatLng): void {\n throw new Error('Method not implemented.')\n }\n override panBy(x: number, y: number): void {\n throw new Error('Method not implemented.')\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding | undefined): void {\n throw new Error('Method not implemented.')\n }\n override getBounds(): LatLngBounds {\n throw new Error('Method not implemented.')\n }\n override addElementOverlay(overlay: ElementOverlay): void {\n throw new Error('Method not implemented.')\n }\n override removeElementOverlay(overlay: ElementOverlay): void {\n throw new Error('Method not implemented.')\n }\n override addOverlay(overlay: Overlay<unknown>): void {\n throw new Error('Method not implemented.')\n }\n override removeOverlay(overlay: Overlay<unknown>): void {\n throw new Error('Method not implemented.')\n }\n override createMarker(options: MarkerOptions): MarkerOverlay {\n throw new Error('Method not implemented.')\n }\n override createMarkerClusterer(options: MarkerClustererOptions): MarkerClusterer {\n throw new Error('Method not implemented.')\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n throw new Error('Method not implemented.')\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n throw new Error('Method not implemented.')\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n throw new Error('Method not implemented.')\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n throw new Error('Method not implemented.')\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n throw new Error('Method not implemented.')\n }\n override createInfoWindow(options: InfoWindowOptions): InfoWindowOverlay {\n throw new Error('Method not implemented.')\n }\n override createInfoBox(options: InfoBoxOptions): InfoBoxOverlay {\n throw new Error('Method not implemented.')\n }\n override createPolyline(options: PolylineOptions): PolylineOverlay {\n throw new Error('Method not implemented.')\n }\n override createPolygon(options: PolygonOptions): PolygonOverlay {\n throw new Error('Method not implemented.')\n }\n override createRectangle(options: RectangleOptions): RectangleOverlay {\n throw new Error('Method not implemented.')\n }\n override createCircle(options: CircleOptions): CircleOverlay {\n throw new Error('Method not implemented.')\n }\n override createLabel(options: LabelOptions): LabelOverlay {\n throw new Error('Method not implemented.')\n }\n override addCustomControl(control: CustomControl): void {\n throw new Error('Method not implemented.')\n }\n override removeCustomControl(control: CustomControl): void {\n throw new Error('Method not implemented.')\n }\n override createMapTypeControl(options: MapTypeControlOptions): MapTypeControl {\n throw new Error('Method not implemented.')\n }\n override createZoomControl(options: ZoomControlOptions): ZoomControl {\n throw new Error('Method not implemented.')\n }\n override createStreetViewControl(options: StreetViewControlOptions): StreetViewControl {\n throw new Error('Method not implemented.')\n }\n override createScaleControl(options: ScaleControlOptions): ZoomControl {\n throw new Error('Method not implemented.')\n }\n}\n","import { BaiduMap } from './map/baidu-map'\nimport { GoogleMap } from './map/google-map'\nimport { HereMap } from './map/here-map'\nimport type { AbstractMap } from './map/map'\nimport { MapOptions } from './map/map-options'\n\nexport enum TgMapType {\n google = 'google',\n baidu = 'baidu',\n here = 'here',\n}\n\nexport namespace TgMapFactory {\n export function createMap(type: TgMapType, $map: HTMLElement, mapOptions?: Partial<MapOptions>): AbstractMap {\n const options = MapOptions.create(mapOptions)\n switch (type) {\n case TgMapType.google:\n return new GoogleMap($map, options)\n case TgMapType.baidu:\n return new BaiduMap($map, options)\n case TgMapType.here:\n return new HereMap($map, options)\n }\n }\n}\n","// cSpell:ignore mapevents\nimport { assertNever } from '../utils/assert'\nimport { initGoogleMapDynamicLibraryImport } from '../utils/google-utils'\nimport { HERE_SUPPORTED_VERSIONS } from '../utils/here-utils'\nimport { Objects } from '../utils/objects'\nimport { createAsyncSingleton, throwError } from '../utils/utils'\nimport { getTgMapConfig, type TgMapConfig } from './map-config'\nimport { TgMapType } from './map-factory'\n\n/**\n * 使用类型映射的方式`TgMapConfig[T]`, 确定`type`的类型之后, 不会自动推断`config`的类型,\n * 故另外声明了一个联合类型{@link LoadMapOptionsImpl}, 在实现代码中使用它来自动推断类型\n */\ntype LoadMapOptions<T extends TgMapType> = { type: T, config: TgMapConfig[T] }\n\ntype LoadMapOptionsImpl =\n | { type: TgMapType.baidu, config: TgMapConfig[TgMapType.baidu] }\n | { type: TgMapType.google, config: TgMapConfig[TgMapType.google] }\n | { type: TgMapType.here, config: TgMapConfig[TgMapType.here] }\n\nconst cachedMapLoaders: Record<string, () => Promise<unknown>> = {}\n\n/**\n * 加载缓存的地图, 保证一种地图只加载一次\n */\nexport function loadCachedMap(type: TgMapType) {\n const loader = Objects.putIfAbsent(cachedMapLoaders, type, () => {\n return createAsyncSingleton(() => loadMap({ type, config: getTgMapConfig()[type] }))\n })\n return loader()\n}\n\n/** 载入地图库 */\nexport function loadMap<T extends TgMapType>(options: LoadMapOptions<T>): Promise<unknown>\nexport function loadMap({ type, config }: LoadMapOptionsImpl): Promise<unknown> {\n const global = window as any\n const namespace = getMapNamespace(type)\n if (Objects.get(global, namespace)) {\n return Promise.resolve()\n }\n if (type !== TgMapType.here && !config.key) {\n // here目前未完成, 不检查它的key\n throwError(`请先配置${type}地图的key`)\n }\n switch (type) {\n case TgMapType.google:\n if (import.meta.env.VITE_FALSE) {\n // 测试新的动态载入方式\n initGoogleMapDynamicLibraryImport({\n key: config.key,\n v: '3.52',\n // v: config.version,\n })\n return google.maps.importLibrary('core')\n }\n // TODO: 修改语言后, 要重新载入\n return loadJsonp(`https://maps.googleapis.com/maps/api/js?key=${config.key}&language=${config.language}&v=${config.version}&libraries=${config.libraries.join(',')}`)\n\n case TgMapType.baidu:\n return loadJsonp(`https://api.map.baidu.com/api?v=${config.version}&ak=${config.key}`)\n case TgMapType.here:\n // TODO: 改成分模块判断是否载入过\n return loadJs(getHereModuleUrl('core', config.version)) // 要先载入core\n .then(() => Promise.all([ // 其他大多数模块都可以同时载入\n loadJs(getHereModuleUrl('service', config.version)),\n loadJs(getHereModuleUrl('mapevents', config.version)),\n loadJs(getHereModuleUrl('clustering', config.version)),\n loadJs(getHereModuleUrl('ui', config.version)),\n ]))\n .catch(e => {\n // 有可能core载入成功, 其他模块载入失败, 需要删除全局变量, 方便下次从头重新载入\n Objects.del(global, namespace)\n return Promise.reject(e)\n })\n default:\n assertNever(type)\n }\n}\n\n/**\n * 除了如下特例外, 都依赖`core`:\n * - `core`不依赖其他模块\n * - `service-legacy`依赖`core`和`service`\n*/\nfunction getHereModuleUrl(\n name: 'core' | 'core-legacy' | 'service' | 'service-legacy' | 'mapevents' | 'ui' | 'clustering' | 'data',\n version = HERE_SUPPORTED_VERSIONS[0],\n) {\n return `https://js.api.here.com/v3/${version}/mapsjs-${name}.js`\n}\n\nfunction getMapNamespace(type: TgMapType) {\n switch (type) {\n case TgMapType.google:\n return 'google.maps'\n case TgMapType.baidu:\n return 'BMap'\n case TgMapType.here:\n return 'H'\n }\n}\n\nlet callbackId = 0\nexport function loadJsonp(url: string, callbackParamName = 'callback') {\n return new Promise((resolve, reject) => {\n const callbackName = `__callback${callbackId++}`\n ; (window as any)[callbackName] = resolve\n const $script = document.createElement('script')\n $script.src = `${url}&${callbackParamName}=${callbackName}`\n $script.onerror = reject\n document.body.appendChild($script)\n })\n}\n\nexport function loadJs(url: string) {\n return new Promise((resolve, reject) => {\n const $script = document.createElement('script')\n $script.src = url\n $script.onload = resolve\n $script.onerror = reject\n document.body.appendChild($script)\n })\n}\n","import {\n computed,\n createCommentVNode,\n type Component,\n type ComponentOptions,\n type ComponentPublicInstance,\n type ComputedRef,\n type Prop,\n type PropType,\n type Ref,\n type RendererElement,\n type RendererNode,\n type Slots,\n type VNode,\n type WritableComputedOptions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n type reactive,\n} from 'vue'\nimport type { AbstractConstructor, KeysMatching, StringEnumLike, StringEnumValue, Thing } from './mapped-types'\nimport { Strings } from './strings'\nimport { noop } from './utils'\n\n/** 组件选项中的hook名 */\nexport type VueHookName = ExcludeSubtype<\n KeysMatching<OmitStartsWith<RemoveIndex<ComponentOptions>, '_'>, { (): void } | undefined>,\n 'serverPrefetch' | 'emits' | 'computed' | 'extends' | 'methods' | 'call' | undefined\n>\n\nexport type VueHookFunction = (this: ComponentPublicInstance) => void\n\n/**\n * 模仿Vue的计算属性的写法\n * @see ComputedOptions\n */\nexport type Property<T> = T | { (): T } | { get(): T, set?(value: T): void }\n\n/**\n * ## Vue2\n * 和typed()联合使用, 写成: `props: typed<Props<Options>>({...})`, 可以将`Options`作为属性的类型声明,\n * ### 注意\n * 1. 对于`Options`中可选的属性, 漏了VSCode不会报错...要小心\n * 2. `...`中理论上来说只要写Vue的纯js式的类型验证信息(Boolean/Number/String/Object/...)就行了, 并且还有ts的类型检查\n * 3. 对于`Options`中可选的`boolean`属性, 若将类型验证信息写为`Boolean`时, 该属性的默认值并不是`undefined`而是`false`, 这和它的类型声明(`boolean | undefined`)不匹配, 推荐写成`optionalProp(Boolean)`\n * 4. 因为存在上述特殊情况, 推荐使用{@link requiredProp},{@link optionalProp}等快捷方法写类型验证信息, 方法的传入参数直接写Vue的纯js式的类型验证信息, 就行了\n *\n * ## Vue3\n * 需要用`props: {...} satisfies Props<Options>`替代`typed()`, 防止{@link NotNullProp}被Vue看成必选的属性\n * */\nexport type Props<T> = {\n [K in keyof T]-?: T[K] extends {} ? NotNullProp<T[K]> : Prop<Exclude<T[K], undefined>>\n}\n/** 表示一个非空的Prop, `required`为true 或者 设置了`default`的{@link Prop}, 才是非空的Prop */\ntype NotNullProp<T = any, D = T> = { type: PropType<T> } & ({ required: true } | { default: D | (() => D) })\n\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue: E[keyof E]): { type: PropType<StringEnumValue<E>>, default: E[keyof E] }\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E): { type: PropType<StringEnumValue<E>> }\n/**\n * 注意: 由于使用了`Object.values(enumObject)`来获取所有枚举值\n * - 若enumObject为数字枚举, 获取出来的值会同时包含枚举名和枚举值, 故不支持\n * - 若enumObject同时是命名空间名, 获取出来的值会包含命名空间上的方法, 应当避免\n *\n * @param enumObject 枚举对象\n * @param defaultValue 默认值\n * @see https://frontendsociety.com/using-a-typescript-interfaces-and-types-as-a-prop-type-in-vuejs-508ab3f83480\n * */\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue?: E[keyof E]): Prop<StringEnumValue<E>> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: E[keyof E]) => Object.values(enumObject).includes(value),\n }\n}\n\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue: T): { type: PropType<T[][number]>, default: T }\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[]): { type: PropType<T[][number]> }\n/** 使用方法重载, 声明`是否提供defaultValue`和`返回值是否可undefined`的关系_(:3」∠)_ */\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue?: T): Prop<T[][number]> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: T) => values.includes(value),\n }\n}\n\nexport function requiredProp<T>(type: PropType<T>): { type: PropType<T>, required: true } {\n return {\n type: type,\n required: true,\n }\n}\n\nexport function optionalProp<T>(type: PropType<T>, defaultValue: T | (() => T)): { type: PropType<T>, default: T }\nexport function optionalProp<T>(type: PropType<T>): { type: PropType<T> }\nexport function optionalProp<T>(type: PropType<T>, defaultValue?: T | (() => T)): Prop<T> {\n return {\n type: type,\n default: defaultValue,\n }\n}\n\n/**\n * 保存在this上的属性\n * @param defaultValues 属性的默认值\n *\n * @deprecated Vue3中已经不支持`cache: false`的计算属性, 使用setup中返回普通的值替代\n */\nexport function computedSaveOnThis<T>(defaultValues: { [K in keyof T]: T[K] }): { [K in keyof T]: WritableComputedOptions<T[K]> } {\n const accessors: any = {}\n Object.entries(defaultValues).forEach(([key, defaultValue]) => {\n const name = `__${key}`\n accessors[key] = {\n get() {\n const value = this[name]\n return value === undefined ? defaultValue : value\n },\n set(value: any) {\n this[name] = value\n },\n // Vue3已经不支持该属性\n // cache: false\n }\n })\n return accessors\n}\n\n// 这个对象是可以共享的~~\nconst sharedPropertyDefinition: PropertyDescriptor = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop,\n}\n\n/**\n * 模仿Vue的计算属性的写法, 将方法转换成属性\n * @deprecated 在Vue2时用来将provide的方法转换成属性, 方便使用, Vue3中不生效, 故废弃\n */\nexport function createPropertyObject(obj: any): any {\n Object.keys(obj).forEach(key => {\n const value = obj[key]\n let redefined = false\n if (typeof value === 'function') {\n sharedPropertyDefinition.get = value\n sharedPropertyDefinition.set = noop\n redefined = true\n } else if (typeof value === 'object' && typeof value.get === 'function') {\n sharedPropertyDefinition.get = value.get\n sharedPropertyDefinition.set = value.set\n redefined = true\n }\n if (redefined) {\n obj[key] = Object.defineProperty(obj, key, sharedPropertyDefinition)\n }\n })\n return obj\n}\n\n/**\n * 相比{@link createPropertyObject}增加类型信息\n * @see createPropertyObject\n * @deprecated Vue3中没用\n * */\nexport function createPropertyObjectTyped<T>(obj: { [K in keyof T]: Property<T[K]> }): T {\n return createPropertyObject(obj)\n}\n\n/**\n * 创建空节点\n *\n * Vue2中使用`this._e()`创建空节点: https://github.com/vuejs/vue/blob/b6247fc9d7442c50d60ccf366a7cb183a4d02129/src/core/instance/render-helpers/index.js#L28\n *\n * Vue3中等价的实现是{@link createCommentVNode}: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/compat/instance.ts#L162\n */\nexport function createEmptyVNode(): VNode {\n return createCommentVNode()\n}\n/**\n * @see https://github.com/vuejs/vue/blob/43b98fe25151b0b6bacd36f3ee27c5d61add5fdb/packages/weex-vue-framework/factory.js/#L2906\n * */\nexport function callHook(vm: ComponentPublicInstance, hookName: VueHookName) {\n // $options中的每个hook函数被合并成一个数组了\n const hooks: Array<VueHookFunction> | undefined = (vm.$options as any)[hookName]\n if (!hooks) {\n return\n }\n for (const hook of hooks) {\n hook.call(vm)\n }\n}\n\n/**\n * {@link import('./mapped-types.ts').safeAsComponent}\n * @deprecated Vue3已经不能遍历子组件的实例了, 所以这个方法目前没用\n */\nexport function findByComponentType<T extends Component & AbstractConstructor>(\n arr: ComponentPublicInstance[],\n component: T,\n): InstanceType<T> | undefined {\n for (const item of arr) {\n // TO-DO: 2023/03/16 ipcjs 有没有更好的判断组件实例的方式?\n // => 目前没找到\n if (item.$options.name === component.name) {\n return item as InstanceType<T>\n }\n }\n return undefined\n}\n\n/**\n * 通过构造slots内容的方式, 提取出slots中对应{@link component}的VNode, {@link VNode.props}就是当前给组件设置的属性值\n *\n * 注意, 该方法并无法获取到{@link component}的实例\n *\n * @see https://stackoverflow.com/questions/64154002/vue-3-how-to-get-information-about-children\n */\nexport function extractVNodeFromSlotsByComponent<Props>(slots: Slots, component: ComponentOptions<Props>) {\n if (!slots.default) return undefined\n\n const nodeList = slots.default()\n for (const node of nodeList) {\n if ((node?.type as Component).name === component.name) {\n return node as VNode<RendererNode, RendererElement, Props>\n }\n }\n return undefined\n}\n\n/**\n * Vue3中 class/style/未声明的事件/未声明的属性 都会集合到`this.$attrs`中\n * 默认情况下(`inheritAttrs`为true), 将被透传给组件的根节点\n *\n * 而Vue2, `this.$attrs`值包含 未声明的属性, 所有事件放到了`this.$listeners`中\n *\n * 这里模仿Vue2的行为, 从{@link attrs}中拆分出未声明的事件, 方便将他们透传给地图的对象\n * 同时若传入{@link props}, 也会从它里面拆分出 声明的事件类型的属性\n *\n * ## 如何给事件添加类型信息\n *\n * - 声明在`emits`中的事件, 会给emit方法添加类型信息, 但没办法在运行时判断是否有被设置\n * - 声明在`props`中的事件, 不会.................. , 但可以通过读取`this.$props`判断是否被设置\n *\n * 所有我们最终选择用{@link EventProps}在`props`中声明事件, 同时用{@link EventEmits}在`emits`上声明事件的类型,\n * 达到既有类型信息, 又能判断是否存在的效果, 写法如下:\n * ```\n * {\n * props: {...} satisfies EventProps<TgMapEmits>,\n * emits: undefined as any as EventEmits<TgMapEmits>,\n * }\n * ```\n *\n * ## 参考\n * - https://cn.vuejs.org/guide/components/attrs.html#disabling-attribute-inheritance\n * - https://v3-migration.vuejs.org/zh/breaking-changes/listeners-removed.html\n * - https://eslint.vuejs.org/rules/require-explicit-emits.html#options\n */\nexport function splitAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n const listeners: Record<string, unknown> = {}\n const binds: Record<string, unknown> = {}\n const listenerProps: Record<string, unknown> = {}\n Object.keys(attrs).forEach(key => {\n if (key.startsWith('on')) {\n listeners[Strings.pascal2kebab(key.substring(2))] = attrs[key]\n } else {\n binds[key] = attrs[key]\n }\n })\n if (props) {\n Object.keys(props).forEach(key => {\n if (key.startsWith('on')) {\n listenerProps[Strings.pascal2kebab(key.substring(2))] = props[key]\n }\n })\n }\n return {\n /** class/style/未声明的属性 等 */\n binds,\n /** 未声明的事件 */\n listeners,\n /** 声明在`props`中的事件 */\n listenerProps,\n }\n}\n\n/** 响应式的{@link splitAttrs} */\nexport function useSplittedAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n return computed(() => splitAttrs(attrs, props))\n}\n\nexport type EventCallback<E = any> = (event: E) => void\n\n/**\n * 事件类型的属性\n * @see splitAttrs\n * */\nexport type EventProps<Emits> = Emits extends string\n // 转换 简单的String Union, 类型使用Function, 是为了简便, 省得写详细的类型信息\n // eslint-disable-next-line @typescript-eslint/ban-types\n ? { [K in Emits as `on${Capitalize<K>}`]: Prop<Function> }\n // 转换 事件名=>事件类型的映射\n : {\n [K in keyof Emits as K extends string ? `on${Capitalize<K>}` : never]: Prop<EventCallback<Emits[K]>>\n }\n\n/**\n * 用来声明事件的类型信息\n * @see splitAttrs\n * */\nexport type EventEmits<T> = {\n [K in keyof T]: (event: T[K]) => boolean\n}\n\n/** 给事件类型的属性标注类型 */\nexport function eventProp<E = any>(): Prop<EventCallback<E>> {\n return Function as PropType<EventCallback<E>>\n}\n\nexport const useEventLogMethods = () => {\n let prevType: Thing | undefined\n let prevTime: number | undefined\n /**\n * @event 一般来说传{@link Tg.Event}对象, 但传其他对象也不会报错\n */\n function eventLog(event: Thing | null | undefined) {\n console.log(event)\n prevType = event && (event as any).type\n prevTime = Date.now()\n }\n /** @see eventLog */\n function eventLogLess(this: any, event: Thing | null | undefined) {\n if ((event && (event as any).type) !== prevType || Date.now() - (prevTime ?? 0) > 1000) {\n eventLog(event)\n }\n }\n return { eventLog, eventLogLess }\n}\n\n/**\n * 值可能是Ref的对象\n * 可以用来给{@link reactive}的参数做类型约束\n * */\nexport type MaybeWrapRefs<T> = {\n [P in keyof T]: Ref<T[P]> | T[P] | ComputedRef<T[P]>\n}\n","import { defineComponent } from 'vue'\nimport type { AbstractMap } from '../map/map/map'\nimport { callHook, createEmptyVNode } from '../utils/vue-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { useTgMapInner } from './map-hooks'\n\nexport const MIXIN_MAP_NAME = '$map'\nexport const MIXIN_HOOK_CREATE = 'onCreate'\nexport const MIXIN_HOOK_DESTROY = 'onDestroy'\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n /** 混合了MapMixin的Vue才会有该属性 */\n [MIXIN_MAP_NAME]: AbstractMap,\n /** 混合了MapMixin的Vue才会有该属性, 会依次调用onDestroy + onCreate, 你应该在这两个hook中分别实现 移除 和 创建并添加 覆盖物的逻辑 */\n recreate: () => void,\n }\n\n interface ComponentCustomOptions {\n [MIXIN_HOOK_CREATE]?(): void\n [MIXIN_HOOK_DESTROY]?(): void\n }\n}\n\n/** @deprecated 使用{@link useTgMapInner}替代 */\nconst MapMixin = defineComponent({\n inject: [MIXIN_MAP_NAME],\n mounted() {\n // children先执行, parent后执行\n // parent中可以读取到this.$children, 参见: TgMarkerClusterer\n callHook(this, MIXIN_HOOK_CREATE)\n },\n beforeUnmount() {\n // parent先执行, children后执行\n callHook(this, MIXIN_HOOK_DESTROY)\n },\n methods: {\n recreate() {\n callHook(this, MIXIN_HOOK_DESTROY)\n callHook(this, MIXIN_HOOK_CREATE)\n },\n },\n render() {\n return createEmptyVNode()\n },\n})\n\nexport default MapMixin\n","<template>\n <div class=\"tg-map\" v-bind=\"attrs.binds\">\n <div\n ref=\"map\"\n :class=\"{\n 'tg-map__map': true,\n [`tg-map__map--hide-logo-${type}`]: hideLogo,\n }\"\n />\n <div v-if=\"false\" style=\"position:absolute;right:0px;top:0px;\">\n props:{{ propsJson }}\n </div>\n <template v-if=\"map\">\n <slot />\n </template>\n <slot name=\"overlay\" />\n </div>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, markRaw, watch, type PropType } from 'vue'\nimport { bindEvents } from '../map/event'\nimport { LatLng } from '../map/lat-lng'\nimport { TgMapFactory, TgMapType } from '../map/map-factory'\nimport { loadCachedMap } from '../map/map-loader'\nimport type { AbstractMap, AbstractMapEventMap } from '../map/map/map'\nimport { GestureHandlingOptions, InfoWindowModeValues, type MapOptions, type MapStyle } from '../map/map/map-options'\nimport { BuildInMapTypeId, MapType } from '../map/map/map-type'\nimport { typed, unwrapStringEnumValue, type StringEnumValue, type WrapStringEnumValue } from '../utils/mapped-types'\nimport { Objects } from '../utils/objects'\nimport { eventProp, optionalProp, requiredProp, stringEnumProp, stringUnionPropFromValues, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../utils/vue-utils'\nimport { MIXIN_MAP_NAME } from './map-mixin'\n\ntype TgMapEmits = {\n load: AbstractMap,\n error: any,\n 'update:center': LatLng,\n 'update:current-center': LatLng,\n 'update:zoom': number,\n 'update:map-type': MapType,\n 'update:map-type-id': string,\n 'update:last-center': LatLng,\n}\n\nexport default defineComponent({\n name: 'tg-map',\n provide() {\n return {\n [MIXIN_MAP_NAME]: computed(() => this.map),\n }\n },\n inheritAttrs: false,\n props: {\n /** type没做响应式, 但外部可以把type作为tg-map的key, 让type修改时完全重建tg-map */\n type: stringEnumProp(TgMapType, TgMapType.google),\n /**\n * 当对该属性使用双向绑定时, 改变center将触发update:center又反过来触发center改变, 最终导致无限循环...\n * 当前通过setCenter()时判断center是否有改变来避免该问题, 但为了避免可能存在的问题, 另外设计了如下机制:\n * - :center-sync-delay=\"300\": 延时同步center, 防止center的值更新过快\n * - :current-center.sync=\"currentCenter\": 实时获取center的值\n * - :last-center.sync=\"center\": 获取tg-map销毁时的最后的center的值, 使用这种方式可以做到type切换时保留中心点位置\n * @see AbstractMapEventMap.center-changed\n * */\n center: requiredProp(LatLng),\n /**\n * 同步center的延时\n * @default 300\n * @see center\n */\n centerSyncDelay: optionalProp(Number, 300),\n /**\n * 仅用来获取center的值, 需要设置center的值请使用`center`属性\n * @see center\n * */\n currentCenter: optionalProp(LatLng),\n /**\n * 仅用于获取tg-map销毁时的最后的center的值\n * @see center\n */\n lastCenter: optionalProp(LatLng),\n zoom: requiredProp(Number),\n /**\n * 该属性不会响应式更新, 要让它立即生效, 请参考{@link file://./../views/map/InfoDemo.vue#L3}\n * @see MapOptions.infoWindowMode\n */\n infoWindowMode: stringUnionPropFromValues(InfoWindowModeValues),\n gestureHandling: stringEnumProp(GestureHandlingOptions),\n minZoom: optionalProp(Number),\n maxZoom: optionalProp(Number),\n mapStyle: optionalProp(Object as PropType<MapStyle>),\n mapTypeId: stringEnumProp(BuildInMapTypeId),\n /** 地图类型对象, 优先级比mapTypeId高 */\n mapType: optionalProp(Object),\n hideLogo: optionalProp(Boolean),\n onLoad: eventProp(),\n 'onUpdate:center': eventProp(),\n 'onUpdate:current-center': eventProp(),\n 'onUpdate:last-center': eventProp(),\n 'onUpdate:map-type': eventProp(),\n 'onUpdate:map-type-id': eventProp(),\n 'onUpdate:zoom': eventProp(),\n onError: eventProp(),\n } satisfies Props<WrapStringEnumValue<Omit<MapOptions, 'buildInMapTypeId'>, {\n gestureHandling: typeof GestureHandlingOptions,\n }> & {\n type: StringEnumValue<typeof TgMapType>,\n currentCenter?: LatLng,\n lastCenter?: LatLng,\n centerSyncDelay: number,\n mapTypeId?: StringEnumValue<typeof BuildInMapTypeId>,\n mapType?: MapType\n hideLogo?: boolean\n }> & EventProps<TgMapEmits>,\n /** 声明事件的类型信息, 详见: {@link splitAttrs} */\n emits: undefined as any as EventEmits<AbstractMapEventMap & TgMapEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n centerSyncTimeoutId: undefined as TimeoutId | undefined,\n }\n },\n data() {\n return {\n map: typed<AbstractMap>(),\n isDestroyed: false,\n }\n },\n computed: {\n propsJson() {\n return Objects.toJsonSafely(this.$props)\n },\n },\n watch: {\n gestureHandling(value?: StringEnumValue<typeof GestureHandlingOptions>) {\n if (value) {\n this.map?.setGestureHandling(unwrapStringEnumValue(value, GestureHandlingOptions))\n }\n },\n minZoom(value) {\n this.map?.setMinZoom(value)\n },\n maxZoom(value) {\n this.map?.setMaxZoom(value)\n },\n mapStyle(value?: MapStyle) {\n this.map?.setMapStyle(value)\n },\n mapTypeId(value?: StringEnumValue<typeof BuildInMapTypeId>) {\n if (value) {\n this.map?.setBuildInMapTypeId(unwrapStringEnumValue(value, BuildInMapTypeId))\n }\n },\n mapType(value?: MapType) {\n this.map?.setMapType(value ?? MapType.NORMAL)\n },\n },\n async mounted() {\n // type的值需要局部化, 防止外部修改\n const type = unwrapStringEnumValue(this.type, TgMapType)\n try {\n await loadCachedMap(type)\n } catch (e) {\n this.$emit('error', e)\n return\n }\n if (this.isDestroyed) {\n console.warn(`tg-map(type=${type})已销毁, 不需要继续执行`)\n return\n }\n // options不要直接传this, 因为createMap方法内部会修改options...\n const map = TgMapFactory.createMap(type, this.$refs.map as HTMLElement, /* options: */{\n center: this.center,\n zoom: this.zoom,\n infoWindowMode: this.infoWindowMode,\n gestureHandling: unwrapStringEnumValue(this.gestureHandling, GestureHandlingOptions),\n minZoom: this.minZoom,\n maxZoom: this.maxZoom,\n mapStyle: this.mapStyle,\n buildInMapTypeId: unwrapStringEnumValue(this.mapTypeId, BuildInMapTypeId),\n })\n // map是复杂对象, 不需要转换成响应式对象\n this.map = markRaw(map)\n if (this.mapType) {\n map.setMapType(this.mapType)\n }\n\n // 未声明ready事件, 所以需要从attrs.listeners中查找是否存在\n if ('ready' in this.attrs.listeners) {\n console.error('地图载入完成的事件已经从ready改为了load, 请手动修改')\n }\n bindEvents(this.attrs.listeners, map, /* excludes: */['load'])\n // 需要先发送load(载入完成)事件, 保证外部能够获取到map对象\n this.$emit('load', map)\n\n // Baidu地图的setZoom/Center是区分顺序的, 若同时修改它们, 必须先setZoom再setCenter, 否则中心点会出现偏移\n // Google地图没这个问题\n // 为了规避该问题, 同时监听它们两个, 并按顺序执行set方法\n watch([\n () => this.zoom,\n () => this.center, //\n ], ([zoom, center], [oldZoom, oldCenter]) => {\n if (zoom !== oldZoom) {\n import.meta.env.DEV && console.debug('<tg-map> setZoom', center)\n map.setZoom(zoom)\n }\n if (center !== oldCenter) {\n const currentCenter = map.getCenter()\n if (!currentCenter.equals(center)) {\n import.meta.env.DEV && console.debug('<tg-map> setCenter', center)\n map.setCenter(center)\n }\n }\n })\n\n // 处理v-model(双向绑定)\n if ('update:center' in this.attrs.listenerProps) {\n const updateCenter = () => this.$emit('update:center', map.getCenter())\n map.addEventListener('center-changed', () => {\n if (this.centerSyncDelay > 0) {\n clearTimeout(this.centerSyncTimeoutId)\n this.centerSyncTimeoutId = setTimeout(updateCenter, this.centerSyncDelay)\n } else {\n updateCenter()\n }\n })\n }\n if ('update:current-center' in this.attrs.listenerProps) {\n // 初始值也得emit出去\n this.$emit('update:current-center', this.center)\n map.addEventListener('center-changed', () => {\n this.$emit('update:current-center', map.getCenter())\n })\n }\n if ('update:zoom' in this.attrs.listenerProps) {\n map.addEventListener('zoom-changed', () => {\n this.$emit('update:zoom', map.getZoom())\n })\n }\n const isUpdateMapType = 'update:map-type' in this.attrs.listenerProps\n const isUpdateMapTypeId = 'update:map-type-id' in this.attrs.listenerProps\n if (isUpdateMapType || isUpdateMapTypeId) {\n map.addEventListener('map-type-changed', () => {\n const mapType = map.getMapType()\n isUpdateMapType && this.$emit('update:map-type', mapType)\n isUpdateMapTypeId && this.$emit('update:map-type-id', mapType.id)\n })\n }\n },\n unmounted() {\n this.isDestroyed = true\n if (this.map) {\n if ('update:last-center' in this.attrs.listenerProps) {\n this.$emit('update:last-center', this.map.getCenter())\n }\n if ('update:center' in this.attrs.listenerProps) {\n clearTimeout(this.centerSyncTimeoutId)\n // 最终的值一定要更新出去, 保证切换地图时center的位置能够保持\n this.$emit('update:center', this.map.getCenter())\n }\n }\n },\n methods: {\n },\n})\n</script>\n\n<style lang=\"scss\">\n.tg-map {\n height: 100%;\n position: relative;\n\n &__map {\n width: 100%;\n height: 100%;\n\n &--hide-logo-google {\n .gm-style {\n // 隐藏logo\n a[target=\"_blank\"]:has(>div>img) {\n display: none !important;\n }\n\n // 隐藏右下角的Keyboard shortcuts/Terms of Use等\n &>div:last-child>div:last-child>div {\n display: none;\n }\n }\n }\n\n &--hide-logo-baidu {\n // 隐藏logo\n div.anchorBL>a[target=\"_blank\"]>img {\n display: none;\n }\n\n // 隐藏左下角的版权信息\n div.BMap_cpyCtrl {\n display: none;\n }\n }\n }\n}\n</style>\n","/* 将字符串或数字转换成尺寸字符串 */\nexport function dimen(value: string | number | null | undefined): string | undefined {\n if (value == null) {\n return undefined\n }\n let num: number\n if (typeof value === 'string') {\n num = +value // 使用+, 让字符转数字\n if (Number.isNaN(num)) {\n return value\n }\n } else {\n num = value\n }\n return `${num}px`\n}\n","<template>\n <div :class=\"$options.name\" :style=\"{ left: dimen(left), top:dimen(topValue), right:dimen(right), bottom:dimen(bottom)}\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { dimen } from '../utils/formatter'\n/** TgMap上的Widget, 只是对绝对布局进行简单的封装 */\nexport default defineComponent({\n name: 'tg-map-widget',\n props: {\n left: {\n type: [Number, String],\n default: null,\n },\n top: {\n type: [Number, String],\n default: null,\n },\n right: {\n type: [Number, String],\n default: null,\n },\n bottom: {\n type: [Number, String],\n default: null,\n },\n },\n computed: {\n topValue() {\n // 防止默认看不到组件\n return this.top == null && this.bottom == null ? 0 : this.top\n },\n },\n methods: {\n dimen,\n },\n})\n</script>\n<style lang=\"scss\">\n.tg-map-widget {\n position: absolute;\n}\n</style>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { unwrapStringEnumValue, lateinit, safeAsComponent, type StringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport { ControlPosition, CustomControl } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nimport { TgMap } from '..'\nexport default defineComponent({\n name: 'tg-custom-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<{\n position: StringEnumValue<typeof ControlPosition>\n }>,\n setup() {\n return {\n control: lateinit<CustomControl>(),\n }\n },\n watch: {\n position() {\n this.recreate()\n },\n },\n onCreate() {\n if (!safeAsComponent(this.$parent, TgMap)) {\n console.warn('请将tg-custom-control放到tg-map中')\n }\n const { $el } = this\n const C = class extends CustomControl {\n onCreateElement() {\n return $el as HTMLElement\n }\n }\n this.control = new C(unwrapStringEnumValue(this.position, ControlPosition))\n this.$map.addCustomControl(this.control)\n },\n onDestroy() {\n this.$map.removeCustomControl(this.control)\n },\n})\n</script>\n<style lang=\"scss\">\n// 当作为tg-map的直接child时不显示\n.tg-map > .tg-custom-control {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { type MapTypeControlOptions, MapTypeControlType, type MapTypeControl } from '../../map/map/controls/map-type.control'\nimport { unwrapStringEnumValue, lateinit, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp, optionalProp } from '../../utils/vue-utils'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n name: 'tg-map-type-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.TOP_LEFT),\n type: stringEnumProp(MapTypeControlType),\n mapTypes: optionalProp(Array as any),\n } satisfies Props<WrapStringEnumValue<MapTypeControlOptions, {\n position: typeof ControlPosition,\n type: typeof MapTypeControlType\n }>>,\n setup() {\n return {\n control: lateinit<MapTypeControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n type() {\n this.recreate()\n },\n mapTypes: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n },\n onCreate() {\n this.control = this.$map.createMapTypeControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { lateinit, type WrapStringEnumValue, unwrapStringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nimport type { ScaleControlOptions, ScaleControl } from '../../map/map/controls/scale.control'\nexport default defineComponent({\n name: 'tg-scale-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.BOTTOM_RIGHT),\n } satisfies Props<WrapStringEnumValue<ScaleControlOptions, {\n position: typeof ControlPosition\n }>>,\n setup() {\n return {\n control: lateinit<ScaleControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n },\n onCreate() {\n this.control = this.$map.createScaleControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","import { getCurrentInstance } from 'vue'\nimport { path } from './strings'\n\n/** 获取当前组件的名字 */\nexport function useComponentName(): string | undefined {\n const type = getCurrentInstance()?.type\n let name = type?.name ?? type?.__name\n if (!name) {\n const file = type?.__file\n if (file) {\n name = path.basename(file, '.vue')\n }\n }\n return name\n}\n","import { inject, onBeforeUnmount, onMounted, type Ref } from 'vue'\nimport { MIXIN_HOOK_CREATE, throwError, type AbstractMap } from '.'\nimport { useComponentName } from '../utils/hooks'\nimport { MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\n/** 作为Vue3下, `MapMixin`的替代 */\nexport function useTgMapInner() {\n const mapRef = inject<Ref<AbstractMap | undefined>>(MIXIN_MAP_NAME)\n let onCreate:VoidFunction|undefined\n let onDestroy:VoidFunction|undefined\n if (mapRef == null) throwError(`<${useComponentName() || 'unknown'}>必须作为<tg-map>的子代组件`)\n\n return {\n mapRef,\n /** 读取map对象, 只要放在<tg-map>里面的组件(除#overlay插槽外)都能够立即读取到map对象 */\n get map() {\n return mapRef.value ?? throwError('map尚未初始化')\n },\n /** 地图元素创建回调 */\n [MIXIN_HOOK_CREATE](hook: VoidFunction) {\n onMounted(hook)\n if (onCreate) throwError(`${MIXIN_HOOK_CREATE}只能调用一次`)\n onCreate = hook\n },\n /** 地图元素销毁回调 */\n [MIXIN_HOOK_DESTROY](hook: VoidFunction) {\n onBeforeUnmount(hook)\n if (onDestroy) throwError(`${MIXIN_HOOK_DESTROY}只能调用一次`)\n onDestroy = hook\n },\n /** 重新创建地图元素 */\n recreate() {\n onDestroy?.()\n onCreate?.()\n },\n }\n}\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport type { StreetViewControl, StreetViewControlOptions } from '../../map/map/controls/street-view.control'\nimport { lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n/**\n * 街景控件, 当前只有google支持\n * */\nexport default defineComponent({\n name: 'tg-street-view-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<StreetViewControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<StreetViewControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner()\n\n onCreate(() => {\n control = map.createStreetViewControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport type { ZoomControl, ZoomControlOptions } from '../../map/map/controls/zoom.control'\nimport { lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\nexport default defineComponent({\n name: 'tg-zoom-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<ZoomControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<ZoomControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner()\n\n onCreate(() => {\n control = map.createZoomControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { Heatmap, type HeatmapOptions } from '../../map/map/extra/heatmap'\nimport { lateinit } from '../../utils/mapped-types'\nimport { createEmptyVNode, optionalProp, requiredProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n name: 'tg-heatmap',\n props: {\n maxIntensity: optionalProp(Number),\n gradient: optionalProp(Object),\n opacity: optionalProp(Number),\n radius: optionalProp(Number),\n data: requiredProp(Array as any),\n } satisfies Props<HeatmapOptions>,\n setup(props) {\n const { map, onCreate, onDestroy } = useTgMapInner()\n let heatmap = lateinit<Heatmap>()\n\n onCreate(() => {\n heatmap = map.createHeatmap(props)\n })\n onDestroy(() => {\n heatmap.remove()\n })\n\n watch(() => props.data, (v) => heatmap.setData(v))\n watch(\n [() => props.maxIntensity, () => props.gradient, () => props.opacity, () => props.radius],\n () => heatmap.setOptions(props),\n )\n\n return createEmptyVNode\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nimport type { MarkerClusterer, MarkerClustererOptions } from '../../map/map/extra/marker-clusterer'\nimport { typed, lateinit } from '../../utils/mapped-types'\nimport { type Props, optionalProp } from '../../utils/vue-utils'\nimport type { MarkerOverlay } from '../../map/map/overlay/marker'\nimport { Arrays } from '../../utils/arrays'\nconst TgMarkerClusterer = defineComponent({\n name: 'tg-marker-clusterer',\n mixins: [MapMixin],\n // markers从this.$children中读取, 故需要省略(Omit)\n props: {\n gridSize: optionalProp(Number),\n maxZoom: optionalProp(Number),\n minClusterSize: optionalProp(Number),\n averageCenter: optionalProp(Boolean),\n styles: optionalProp(Array as any),\n stylesIndexCalculator: optionalProp(Function as any),\n zIndex: optionalProp(Number),\n } satisfies Props<Omit<MarkerClustererOptions, 'markers'>>,\n setup() {\n return {\n clusterer: lateinit<MarkerClusterer>(),\n markers: typed<MarkerOverlay[]>([]),\n }\n },\n watch: {\n gridSize() {\n this.recreate()\n },\n maxZoom() {\n this.recreate()\n },\n minClusterSize() {\n this.recreate()\n },\n averageCenter() {\n this.recreate()\n },\n styles: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n stylesIndexCalculator() {\n this.recreate()\n },\n zIndex() {\n this.recreate()\n },\n },\n onCreate() {\n // console.log('TgMarkerClusterer.onCreate', this.markers)\n this.clusterer = this.$map.createMarkerClusterer(this)\n },\n onDestroy() {\n this.clusterer.clearMarkers()\n },\n methods: {\n /** TgMarker有可能在该组件未初始化之前调用, 需要通过该方法判断 */\n isInitiated(): boolean {\n return this.clusterer != null\n },\n onAddMarker(marker: MarkerOverlay) {\n this.markers.push(marker)\n if (this.isInitiated()) {\n // TODO: 优化大量marker时的添加移除逻辑\n this.clusterer.addMarker(marker)\n }\n },\n onRemoveMarker(marker: MarkerOverlay) {\n if (this.isInitiated()) {\n this.clusterer.removeMarker(marker)\n }\n Arrays.remove(this.markers, marker)\n },\n },\n})\n/** TgMarkerClusterer作为构造器, 创建的Vue实例类型 */\ntype TgMarkerClusterer = InstanceType<typeof TgMarkerClusterer>\nexport default TgMarkerClusterer\n</script>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { lateinit } from '../../utils/mapped-types'\nimport MapMixin from '../map-mixin'\nimport { TrafficLayer } from '../../map/map/map-type'\nexport default defineComponent({\n name: 'tg-traffic-layer',\n mixins: [MapMixin],\n // 请直接使用v-if来控制它的显隐\n // 没有属性时, 写`{}`类型推断会有问题, 故注释掉\n // props: {} satisfies Props<{}>,\n setup() {\n return {\n layer: lateinit<TrafficLayer>(),\n }\n },\n watch: {\n\n },\n onCreate() {\n this.layer = new TrafficLayer()\n this.$map.addLayer(this.layer)\n },\n onDestroy() {\n this.$map.removeLayer(this.layer)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { CircleEventMap, CircleOptions, CircleOverlay } from '../../map/map/overlay/circle'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgCircleEmits = {\n 'update:center': LatLng,\n 'update:radius': number,\n}\nexport default defineComponent({\n name: 'tg-circle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n center: requiredProp(LatLng),\n radius: requiredProp(Number),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:center': eventProp(),\n 'onUpdate:radius': eventProp(),\n } satisfies Props<CircleOptions> & EventProps<TgCircleEmits>,\n emits: undefined as any as EventEmits<CircleEventMap & TgCircleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<CircleOverlay>(),\n emittedRadius: undefined as number | undefined,\n emittedCenter: undefined as LatLng | undefined,\n }\n },\n watch: {\n center(value) {\n if (this.emittedCenter != null) {\n const center = this.emittedCenter\n this.emittedCenter = undefined\n if (center === toRaw(value)) {\n // 防止emit出的center被设置回来\n return\n }\n }\n this.overlay.setCenter(value)\n },\n radius(value) {\n if (this.emittedRadius != null) {\n const radius = this.emittedRadius\n this.emittedRadius = undefined\n if (radius === value) {\n // 防止emit出的radius被设置回来\n return\n }\n }\n this.overlay.setRadius(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createCircle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:center' in this.attrs.listenerProps) {\n this.overlay.addEventListener('center-changed', () => {\n this.$emit('update:center', this.emittedCenter = this.overlay.getCenter())\n })\n }\n if ('update:radius' in this.attrs.listenerProps) {\n this.overlay.addEventListener('radius-changed', () => {\n this.$emit('update:radius', this.emittedRadius = this.overlay.getRadius())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"$attrs\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nimport { type Props, requiredProp, stringEnumProp } from '../../utils/vue-utils'\nimport { lateinit, type WrapStringEnumValue, unwrapStringEnumValue } from '../../utils/mapped-types'\nimport { LatLng } from '../../map/lat-lng'\nimport { type ElementOverlayOptions, MapPane, ElementOverlay, type OverlayProjection } from '../../map/map/overlay/element-overlay'\nimport type { AbstractMap } from '../../map/map/map'\n\n/** ElementOverlay的简单实现 */\nclass SimpleElementOverlay extends ElementOverlay {\n constructor(\n map: AbstractMap,\n options: ElementOverlayOptions,\n public content: HTMLElement,\n private position: LatLng,\n ) {\n super(map, options)\n }\n protected onCreate(): HTMLElement {\n return this.content\n }\n protected onDraw(projection: OverlayProjection): void {\n const point = projection.fromLatLngToOverlayPoint(this.position)\n this.content.style.left = point.x + 'px'\n this.content.style.top = point.y + 'px'\n }\n setPosition(position: LatLng) {\n this.position = position\n this.draw()\n }\n}\n\nconst TgElementOverlay = defineComponent({\n name: 'tg-element-overlay',\n mixins: [MapMixin],\n props: {\n mapPane: stringEnumProp(MapPane, MapPane.overlayMouseTarget),\n position: requiredProp(LatLng),\n } satisfies Props<WrapStringEnumValue<ElementOverlayOptions, {\n mapPane: typeof MapPane,\n }> & {position: LatLng}>,\n setup() {\n return {\n overlay: lateinit<SimpleElementOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n },\n onCreate() {\n this.overlay = new SimpleElementOverlay(this.$map, unwrapStringEnumValue(this), this.content(), this.position)\n this.$map.addElementOverlay(this.overlay)\n },\n onDestroy() {\n this.$map.removeElementOverlay(this.overlay)\n },\n})\ntype TgElementOverlay = InstanceType<typeof TgElementOverlay>\nexport default TgElementOverlay\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-element-overlay {\n display: none;\n}\n.tg-map__map .tg-element-overlay {\n display: block;\n}\n</style>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { UnionIcon } from '../../map/map/overlay/icon'\nimport { BaiduMarker, type MarkerEventMap, type MarkerOptions, type MarkerOverlay } from '../../map/map/overlay/marker'\nimport { lateinit, safeAsComponent, typed } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport TgMarkerClusterer from '../extra/TgMarkerClusterer.vue'\nimport MapMixin from '../map-mixin'\nimport type TgInfoBox from './TgInfoBox.vue'\nimport type TgInfoWindow from './TgInfoWindow.vue'\nimport type TgLabel from './TgLabel.vue'\n\ntype TgMarkerEmits = {\n 'update:position': LatLng,\n}\n\nconst TgMarker = defineComponent({\n name: 'tg-marker',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n position: requiredProp(LatLng),\n title: optionalProp(String),\n icon: optionalProp(Object as PropType<UnionIcon>),\n clickable: optionalProp(Boolean),\n draggable: optionalProp(Boolean),\n crossOnDrag: optionalProp(Boolean),\n cursor: optionalProp(String),\n zIndex: optionalProp(Number),\n visible: optionalProp(Boolean),\n normalizePositionForBaidu: optionalProp(Boolean),\n /**\n * 是否自动添加到TgMarkerClusterer中去\n * @default true\n */\n autoAddToClusterer: optionalProp(Boolean, true),\n 'onUpdate:position': eventProp(),\n } satisfies Props<MarkerOptions & {\n autoAddToClusterer?: boolean\n }> & EventProps<TgMarkerEmits>,\n emits: undefined as any as EventEmits<MarkerEventMap & TgMarkerEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n marker: lateinit<MarkerOverlay>(),\n label: typed<TgLabel>(),\n info: typed<TgInfo>(),\n emittedPosition: undefined as LatLng | undefined,\n autoAddToClustererWhenCreate: props.autoAddToClusterer,\n }\n },\n watch: {\n position(value: LatLng) {\n if (this.emittedPosition != null) {\n const position = this.emittedPosition\n this.emittedPosition = undefined\n if (position === toRaw(value)) {\n // 防止emit出的值被设置回来\n return\n }\n }\n this.marker.setPosition(value)\n },\n title(value: string) {\n this.marker.setTitle(value)\n },\n icon(value?: UnionIcon) {\n if (value) {\n this.marker.setIcon(value)\n } else {\n this.recreate()\n }\n },\n clickable(value: boolean) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // baidu不支持setClickable(), 故只能recreate()\n } else {\n this.marker.setClickable(value)\n }\n },\n draggable(value: boolean) {\n this.marker.setDraggable(value)\n },\n crossOnDrag() {\n this.recreate()\n },\n cursor() {\n this.recreate()\n },\n zIndex(value?: number) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // 当前版本, baidu调用setZIndex()无效\n } else {\n this.marker.setZIndex(value)\n }\n },\n visible(value: boolean) {\n this.marker.setVisible(value)\n },\n normalizePositionForBaidu() {\n this.recreate()\n },\n autoAddToClusterer() {\n this.recreate()\n },\n },\n onCreate() {\n // 结构化类型, this包含MarkerOptions的所有属性, 故可以直接传进去\n this.marker = this.$map.createMarker(this)\n if (this.label) {\n this.marker.setLabel(this.label.overlay)\n }\n\n if (this.$clusterer() && this.autoAddToClusterer) {\n this.$clusterer()!.onAddMarker(this.marker)\n } else {\n this.$map.addOverlay(this.marker)\n }\n // 保存创建时autoAddToClusterer的值, 销毁时需要使用它\n this.autoAddToClustererWhenCreate = this.autoAddToClusterer\n\n // baidu, 只有marker被添加到地图之后, 才能在它上面打开infoWindow\n // infoBox似乎没有这个限制, 但目前不区分infoWindow和infoBox, 故统一放在这里处理\n if (this.info) {\n this.info.show && this.info.overlay.open(this.marker)\n }\n\n bindEvents(this.attrs.listeners, this.marker)\n\n if ('update:position' in this.attrs.listenerProps) {\n this.marker.addEventListener('dragend', (event) => {\n this.$emit('update:position', this.emittedPosition = event.position)\n })\n }\n },\n onDestroy() {\n if (this.$clusterer() && this.autoAddToClustererWhenCreate) {\n this.$clusterer()!.onRemoveMarker(this.marker)\n } else {\n this.$map.removeOverlay(this.marker)\n }\n },\n methods: {\n $clusterer(): TgMarkerClusterer | undefined {\n return safeAsComponent(this.$parent, TgMarkerClusterer)\n },\n onAddLabel(label: TgLabel) {\n this.label = label\n // onAdd方法可能在创建this.marker前调用, 需要判断下\n if (this.marker) {\n this.marker.setLabel(label.overlay)\n }\n },\n onRemoveLabel(_label: TgLabel) {\n this.marker.setLabel(undefined)\n this.label = undefined\n },\n onAddInfo(info: TgInfo) {\n this.info = info\n // @see {@link onAddLabel}\n if (this.marker) {\n info.show && info.overlay.open(this.marker)\n }\n },\n onRemoveInfo(info: TgInfo) {\n info.overlay.close()\n this.info = undefined\n },\n onInfoShowChanged(info: TgInfo, isShow: boolean) {\n isShow ? info.overlay.open(this.marker) : info.overlay.close()\n },\n },\n})\ntype TgMarker = InstanceType<typeof TgMarker>\nexport default TgMarker\n\nexport type TgInfo = TgInfoWindow | TgInfoBox\n\nexport type TgMarkerPublicInstance = {\n marker: MarkerOverlay\n\n onAddInfo(info: TgInfo): void\n onRemoveInfo(info: TgInfo): void\n onInfoShowChanged(info: TgInfo, isShow: boolean): void\n\n onAddLabel(label: TgLabel): void\n onRemoveLabel(label: TgLabel): void\n}\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { InfoBoxOptions, InfoBoxOverlay } from '../../map/map/overlay/info-box'\nimport type { MarkerOverlay } from '../../map/map/overlay/marker'\nimport { findAncestorComponentByType, lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\ntype TgInfoBoxEmits = {\n 'update:show': boolean\n}\nconst TgInfoBox = defineComponent({\n name: 'tg-info-box',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n maxWidth: optionalProp(Number),\n borderClass: optionalProp(String),\n zIndex: optionalProp(Number),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoBoxOptions, 'content'> & {\n show: boolean\n }> & EventProps<TgInfoBoxEmits>,\n emits: undefined as any as EventEmits<TgInfoBoxEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoBoxOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n offset() {\n this.recreate()\n },\n maxWidth(value) {\n this.overlay.setMaxWidth(value)\n },\n borderClass() {\n this.recreate()\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoBox(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n if ('update:show' in this.attrs.listenerProps) {\n this.overlay.addEventListener('closeclick', () => {\n this.$emit('update:show', false)\n })\n }\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n methods: {\n getOptions(): InfoBoxOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n maxWidth: this.maxWidth,\n borderClass: this.borderClass,\n }\n },\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n open(marker?: MarkerOverlay) {\n this.overlay.open(marker)\n },\n close() {\n this.overlay.close()\n },\n },\n})\ntype TgInfoBox = InstanceType<typeof TgInfoBox>\nexport default TgInfoBox\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-info-box {\n display: none;\n}\n\n.tg-map__map .tg-info-box {\n display: block;\n}\n</style>\n","<template>\n <div v-show=\"show\" :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { InfoWindowEventMap, InfoWindowOptions, InfoWindowOverlay } from '../../map/map/overlay/info-window'\nimport { findAncestorComponentByType, lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\ntype TgInfoWindowEmits= {\n 'update:show': boolean\n}\nconst TgInfoWindow = defineComponent({\n name: 'tg-info-window',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n maxWidth: optionalProp(Number),\n offset: optionalProp(Object),\n disableAutoPan: optionalProp(Boolean),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoWindowOptions, 'content'> & {show: boolean}> & EventProps<TgInfoWindowEmits>,\n emits: undefined as any as EventEmits<InfoWindowEventMap & TgInfoWindowEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoWindowOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n maxWidth() {\n this.recreate()\n },\n offset() {\n this.recreate()\n },\n disableAutoPan() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): InfoWindowOptions {\n return {\n content: this.content(),\n position: this.position,\n maxWidth: this.maxWidth,\n offset: this.offset,\n disableAutoPan: this.disableAutoPan,\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoWindow(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n // 监听open/close\n this.overlay.addEventListener('open', () => {\n this.$emit('update:show', true)\n })\n this.overlay.addEventListener('close', () => {\n this.$emit('update:show', false)\n })\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n})\ntype TgInfoWindow = InstanceType<typeof TgInfoWindow>\nexport default TgInfoWindow\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport { MapPane } from '../../map/map/overlay/element-overlay'\nimport type { LabelEventMap, LabelOptions, LabelOverlay } from '../../map/map/overlay/label'\nimport type { Marker } from '../../map/map/overlay/marker'\nimport { findAncestorComponentByType, lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { optionalProp, stringEnumProp, useSplittedAttrs, type EventEmits, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\nconst TgLabel = defineComponent({\n name: 'tg-label',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n zIndex: optionalProp(Number),\n mapPane: stringEnumProp(MapPane),\n } satisfies Props<WrapStringEnumValue<\n Omit<LabelOptions, 'content'>,\n { mapPane: typeof MapPane }\n >>,\n emits: undefined as any as EventEmits<LabelEventMap>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs),\n overlay: lateinit<LabelOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n offset(value) {\n this.overlay.setOffset(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n marker(): Marker | undefined {\n return this.$marker()?.marker\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): LabelOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n mapPane: unwrapStringEnumValue(this.mapPane, MapPane),\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createLabel(this.getOptions())\n // 若父节点为marker, 则交由marker管理\n if (this.$marker()) {\n this.$marker()!.onAddLabel(this)\n } else {\n this.$map.addOverlay(this.overlay)\n }\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveLabel(this)\n } else {\n this.$map.removeOverlay(this.overlay)\n }\n },\n})\ntype TgLabel = InstanceType<typeof TgLabel>\nexport default TgLabel\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-label {\n display: none;\n}\n.tg-map__map .tg-label {\n display: block;\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport type { LatLng } from '../../map/lat-lng'\nimport type { PolygonEventMap, PolygonOptions, PolygonOverlay } from '../../map/map/overlay/polygon'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgPolygonEmits = {\n 'update:paths': LatLng[][],\n}\nexport default defineComponent({\n name: 'tg-polygon',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n paths: requiredProp(Array as PropType<LatLng[][]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:paths': eventProp(),\n } satisfies Props<PolygonOptions> & EventProps<TgPolygonEmits>,\n emits: undefined as any as EventEmits<PolygonEventMap & TgPolygonEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolygonOverlay>(),\n emittedPaths: undefined as LatLng[][] | undefined,\n }\n },\n watch: {\n paths: {\n handler(value: LatLng[][]) {\n if (this.emittedPaths != null) {\n const paths = this.emittedPaths\n this.emittedPaths = undefined\n // 由于paths数组绝大多数时候长度都是1, 故这里可以浅层比较它\n if (paths.length === value.length && paths.every((v, i) => v === toRaw(value[i]))) {\n // 防止emit出的paths被设置回来\n return\n }\n }\n this.overlay.setPaths(value)\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolygon(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:paths' in this.attrs.listenerProps) {\n this.overlay.addEventListener('paths-edited', () => {\n this.$emit('update:paths', this.emittedPaths = this.overlay.getPaths())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { IconSequence } from '../../map/map/overlay/icon'\nimport type { PolylineEventMap, PolylineOptions, PolylineOverlay } from '../../map/map/overlay/polyline'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolylineEmits = {\n 'update:path': LatLng[],\n}\nexport default defineComponent({\n name: 'tg-polyline',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n path: requiredProp(Array as PropType<LatLng[]>),\n icons: optionalProp(Array as PropType<IconSequence[]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n 'onUpdate:path': eventProp(),\n } satisfies Props<PolylineOptions> & EventProps<TgPolylineEmits>,\n emits: undefined as any as EventEmits<PolylineEventMap & TgPolylineEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolylineOverlay>(),\n emittedPath: undefined as LatLng[] | undefined,\n }\n },\n watch: {\n path: {\n handler(value) {\n if (this.emittedPath != null) {\n const path = this.emittedPath\n this.emittedPath = undefined\n if (path === toRaw(value)) {\n // 防止emit出的path又被设置回去, 导致Google地图移动点后的撤销功能无效\n return\n }\n }\n this.overlay.setPath(value)\n },\n deep: true,\n },\n icons: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolyline(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n\n if ('update:path' in this.attrs.listenerProps) {\n this.overlay.addEventListener('path-edited', () => {\n this.$emit('update:path', this.emittedPath = this.overlay.getPath())\n })\n }\n },\n onDestroy() {\n this.overlay.remove()\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport type { LatLngBounds } from '../../map/lat-lng'\nimport type { RectangleEventMap, RectangleOptions, RectangleOverlay } from '../../map/map/overlay/rectangle'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgRectangleEmits = {\n 'update:bounds': LatLngBounds,\n}\nexport default defineComponent({\n name: 'tg-rectangle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n bounds: requiredProp(Object as PropType<LatLngBounds>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:bounds': eventProp(),\n } satisfies Props<RectangleOptions> & EventProps<TgRectangleEmits>,\n emits: undefined as any as EventEmits<RectangleEventMap & TgRectangleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<RectangleOverlay>(),\n emittedBounds: undefined as LatLngBounds | undefined,\n }\n },\n watch: {\n bounds(value: LatLngBounds) {\n if (this.emittedBounds != null) {\n const bounds = this.emittedBounds\n this.emittedBounds = undefined\n // bounds很大可能会被重新创建, 故需要严格比较相等\n if (bounds.equals(value)) {\n // 防止emit出的值又被设置回来\n return\n }\n }\n this.overlay.setBounds(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createRectangle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:bounds' in this.attrs.listenerProps) {\n this.overlay.addEventListener('bounds-changed', () => {\n this.$emit('update:bounds', this.emittedBounds = this.overlay.getBounds())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","import { defineComponent, type App } from 'vue'\nimport { useComponentName } from './hooks'\nimport { noop } from './utils'\nimport type { VueHookName } from './vue-utils'\n\nconst DEFAULT_EXCLUDE_HOOK_NAMES: VueHookName[] = ['beforeUpdate', 'updated']\n\nexport interface LifecycleLogOptions {\n /** @default /^[A-Z]/ 匹配大写字母开头的组件名 */\n nameRegex?: RegExp\n /** @default true 开启log */\n enable?: boolean,\n /** @default 除 updated, beforeUpdate 外的所有hook */\n hookNames?: VueHookName[]\n}\n\nconst LifecycleLogPlugin = {\n install(app: App, options: LifecycleLogOptions = {}) {\n if (options.enable !== false) {\n const lifecycleLogMixin = defineComponent({\n beforeCreate() {\n const componentName = useComponentName() ?? ''\n const matched = (options.nameRegex || /^[A-Z]/).test(componentName)\n const __life = matched\n ? (hookName: VueHookName) => {\n if (options.hookNames) {\n if (options.hookNames.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n } else if (!DEFAULT_EXCLUDE_HOOK_NAMES.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n }\n : noop\n // `beforeCreate`触发在data/props/methods等组件状态初始化之前, 所以若`__life`方法直接在methods中实现, 在这里是调用不到的(\n __life('beforeCreate')\n ; (this as any).__life_impl = __life\n },\n created() {\n this.__life('created')\n },\n beforeMount() {\n this.__life('beforeMount')\n },\n mounted() {\n this.__life('mounted')\n },\n beforeUpdate() {\n this.__life('beforeUpdate')\n },\n updated() {\n this.__life('updated')\n },\n beforeUnmount() {\n this.__life('beforeUnmount')\n },\n unmounted() {\n this.__life('unmounted')\n },\n methods: {\n __life(hookName: VueHookName) {\n (this as any).__life_impl(hookName)\n },\n },\n onCreate() {\n this.__life('onCreate')\n },\n onDestroy() {\n this.__life('onDestroy')\n },\n })\n app.mixin(lifecycleLogMixin as any)\n }\n },\n}\nexport default LifecycleLogPlugin\n","import type { LatLngLiteral } from '../components'\n\nconst EARTH_RADIUS = 6378137.0\n\n/**\n * 度换成弧度\n *\n * @param d 度\n * @return 弧度\n */\nfunction getRad(d: number) {\n return (d * Math.PI) / 180.0\n}\n/**\n * 弧度换成度\n *\n * @param x 弧度\n * @return 度\n */\nfunction getDeg(x: number) {\n return (x * 180) / Math.PI\n}\n\n/**\n * 球面两点之间距离(米)\n * @param p1\n * @param p2\n */\nfunction getDistance(p1: LatLngLiteral, p2: LatLngLiteral) {\n if (p1.lat === p2.lat && p1.lng === p2.lng) {\n return 0\n }\n\n const f = getRad((p1.lat + p2.lat) / 2)\n const g = getRad((p1.lat - p2.lat) / 2)\n const l = getRad((p1.lng - p2.lng) / 2)\n let sg = Math.sin(g)\n let sl = Math.sin(l)\n let sf = Math.sin(f)\n\n const a = EARTH_RADIUS\n const fl = 1 / 298.257\n\n sg = sg * sg\n sl = sl * sl\n sf = sf * sf\n\n const s = sg * (1 - sl) + (1 - sf) * sl\n const c = (1 - sg) * (1 - sl) + sf * sl\n\n const w = Math.atan(Math.sqrt(s / c))\n const r = Math.sqrt(s * c) / w\n const d = 2 * w * a\n const h1 = (3 * r - 1) / 2 / c\n const h2 = (3 * r + 1) / 2 / s\n\n return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))\n}\n\n/**\n * 已知一点经纬度,方位角,距离求另一点\n * @param pt 点\n * @param angle 角度\n * @param dist 距离\n */\nexport function getDestination(pt: LatLngLiteral, angle: number, dist: number): LatLngLiteral {\n const a = 6378137\n const b = 6356752.3142\n const f = 1 / 298.257223563\n\n const alpha1 = getRad(angle)\n const sinAlpha1 = Math.sin(alpha1)\n const cosAlpha1 = Math.cos(alpha1)\n\n const tanU1 = (1 - f) * Math.tan(getRad(pt.lat))\n const cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1)\n const sinU1 = tanU1 * cosU1\n const sigma1 = Math.atan2(tanU1, cosAlpha1)\n const sinAlpha = cosU1 * sinAlpha1\n const cosSqAlpha = 1 - sinAlpha * sinAlpha\n const uSq = (cosSqAlpha * (a * a - b * b)) / (b * b)\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)))\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)))\n\n let cos2SigmaM = 0\n let sinSigma = 0\n let cosSigma = 0\n let sigma = dist / (b * A)\n let sigmaP = 2 * Math.PI\n while (Math.abs(sigma - sigmaP) > 1e-12) {\n cos2SigmaM = Math.cos(2 * sigma1 + sigma)\n sinSigma = Math.sin(sigma)\n cosSigma = Math.cos(sigma)\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -\n (B / 6) * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)))\n sigmaP = sigma\n sigma = dist / (b * A) + deltaSigma\n }\n\n const tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1\n const lat2 = Math.atan2(\n sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,\n (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp),\n )\n const lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1)\n const C = (f / 16) * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))\n const L =\n lambda -\n (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)))\n\n // var revAz = Math.atan2(sinAlpha, -tmp) // final bearing\n\n const destination = { lng: pt.lng + getDeg(L), lat: getDeg(lat2) }\n\n return destination\n}\n\n/** 球面工具 */\nexport const SphericalUtils = {\n getDistance,\n getDestination,\n}\n","// 将自定义的声明文件\"导出\", 防止依赖@tg/map的工程报错\n// TODO: 2023/03/23 ipcjs 这个类型导出现在有问题...\n// eslint-disable-next-line @typescript-eslint/triple-slash-reference\n/// <reference path=\"../map/dts/index.d.ts\"/>\nimport type { App, Component } from 'vue'\nimport { getTgMapConfig, setTgMapConfig, type PartialTgMapConfig, type TgMapConfig } from '../map/map-config'\nimport LifecycleLogPlugin, { type LifecycleLogOptions } from '../utils/lifecycle-log'\nimport { throwError } from '../utils/utils'\nimport MapMixin, { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\nconst TgMapPlugin = {\n install(app: App, config?: PartialTgMapConfig) {\n setTgMapConfig(config)\n // Vue3中提倡在需要用的地方导入组件, 对tree-shrink更友好\n if (import.meta.env.VITE_FALSE) {\n // 注册所有Tg开头的Vue\n // ## webpack:\n // const views = require.context('./', true, /Tg.*\\.vue$/)\n // ## vite:\n const views = import.meta.glob('./**/Tg*.vue', { eager: true, import: 'default' })\n Object.keys(views).forEach(key => {\n const TgVue = views[key] as Component\n app.component(TgVue.name ?? throwError(`Tg开头的组件必须设置name: ${key}`), TgVue)\n })\n }\n\n const strategies = app.config.optionMergeStrategies\n // Vue3中必须自己写合并策略: https://github.com/vuejs/core/issues/861\n strategies[MIXIN_HOOK_CREATE] = strategies[MIXIN_HOOK_DESTROY] = (to, from) => {\n // 依照Vue2的风格, 将方法合并成数组\n // 参考:\n // - Vue3兼容模式: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/componentOptions.ts#L1065\n // - Vue2: https://github.com/vuejs/vue/blob/a9ca2d85193e435e668ba25ace481bfb176b0c6e/src/core/util/options.ts#L154\n return to\n ? [...new Set([].concat(to as any, from as any))]\n : Array.isArray(from)\n ? from\n : [from]\n }\n },\n}\n\n/* 导出变量, 外部应该只使用从这里导出的变量 */\nexport default TgMapPlugin\n// 导出map和utils目录\nexport { type Tg } from '../map/event'\nexport * from '../map/lat-lng'\nexport * from '../map/map-factory'\nexport { loadCachedMap } from '../map/map-loader'\nexport * from '../map/map/controls/control'\nexport * from '../map/map/controls/map-type.control'\nexport * from '../map/map/controls/scale.control'\nexport * from '../map/map/controls/street-view.control'\nexport * from '../map/map/controls/zoom.control'\nexport * from '../map/map/extra/autocomplete'\nexport * from '../map/map/extra/heatmap'\nexport * from '../map/map/extra/map-urls'\nexport * from '../map/map/extra/marker-clusterer'\nexport * from '../map/map/extra/places-service'\nexport * from '../map/map/extra/search-box'\nexport * from '../map/map/map'\nexport * from '../map/map/map-options'\nexport * from '../map/map/map-type'\nexport * from '../map/map/overlay/circle'\nexport * from '../map/map/overlay/element-overlay'\nexport * from '../map/map/overlay/icon'\nexport * from '../map/map/overlay/info-box'\nexport * from '../map/map/overlay/info-window'\nexport * from '../map/map/overlay/marker'\nexport * from '../map/map/overlay/overlay'\nexport * from '../map/map/overlay/polygon'\nexport * from '../map/map/overlay/polyline'\nexport * from '../map/map/overlay/rectangle'\nexport * from '../map/types'\nexport * from '../utils/arrays'\nexport * from '../utils/assert'\nexport * from '../utils/mapped-types'\nexport { Objects } from '../utils/objects'\nexport * from '../utils/spherical-utils'\nexport * from '../utils/strings'\nexport * from '../utils/utils'\nexport * from '../utils/values'\nexport * from '../utils/vue-utils'\n// 导出vue文件\nexport { default as TgMap } from './TgMap.vue'\nexport { default as TgMapWidget } from './TgMapWidget.vue'\nexport { default as TgCustomControl } from './controls/TgCustomControl.vue'\nexport { default as TgMapTypeControl } from './controls/TgMapTypeControl.vue'\nexport { default as TgScaleControl } from './controls/TgScaleControl.vue'\nexport { default as TgStreetViewControl } from './controls/TgStreetViewControl.vue'\nexport { default as TgZoomControl } from './controls/TgZoomControl.vue'\nexport { default as TgHeatmap } from './extra/TgHeatmap.vue'\nexport { default as TgMarkerClusterer } from './extra/TgMarkerClusterer.vue'\nexport { default as TgTrafficLayer } from './layers/TgTrafficLayer.vue'\nexport * from './map-hooks'\nexport { default as TgCircle } from './overlays/TgCircle.vue'\nexport { default as TgElementOverlay } from './overlays/TgElementOverlay.vue'\nexport { default as TgInfoBox } from './overlays/TgInfoBox.vue'\nexport { default as TgInfoWindow } from './overlays/TgInfoWindow.vue'\nexport { default as TgLabel } from './overlays/TgLabel.vue'\nexport { default as TgMarker } from './overlays/TgMarker.vue'\nexport { default as TgPolygon } from './overlays/TgPolygon.vue'\nexport { default as TgPolyline } from './overlays/TgPolyline.vue'\nexport { default as TgRectangle } from './overlays/TgRectangle.vue'\nexport {\n LifecycleLogPlugin,\n MIXIN_HOOK_CREATE,\n MIXIN_HOOK_DESTROY,\n MIXIN_MAP_NAME,\n MapMixin,\n getTgMapConfig,\n setTgMapConfig,\n type LifecycleLogOptions,\n type PartialTgMapConfig,\n type TgMapConfig,\n}\n// END\n"],"names":["bindEvents","listeners","target","excludes","eventName","eventListenerId","generateNextEventListenerId","generateEventKey","type","listener","root","factory","module","this","x_PI","PI","a","ee","Rectangle","lng1","lat1","lng2","lat2","lon","lat","region","exclude","isInChina","i","j","bd09togcj02","bd_lon","bd_lat","x","y","z","theta","gg_lng","gg_lat","gcj02tobd09","lng","bd_lng","wgs84togcj02","transform","gcj02towgs84","out","dlat","transformlat","dlng","transformlng","radlat","magic","sqrtmagic","mglat","mglng","ret","gcj02","assert","condition","msg","assertNever","lateinit","typed","t","isInstanceOf","obj","constructor","safeAs","isComponentByType","instance","component","safeAsComponent","findAncestorComponentByType","startInstance","endComponent","unwrapStringEnumValue","value","throwError","throwUnsupported","todo","debug","noop","args","isDef","v","isEntryValueDef","entry","createAsyncSingleton","creator","promise","CoordType","COORD_TYPE_DEFAULT","_LatLng","coord","normalizedLat","point","latlng","coordType","normalize","targetCoord","coordtransform","other","LatLng","__publicField","_LatLngBounds","sw","ne","minLng","maxLng","positions","builder","bounds","position","LatLngBounds","Builder","start","end","exports","Location","toString","place","ll","getCoordType","Elements","isScrollable","ele","Arrays","equals","b","remove","arr","item","index","findByType","includesTyped","at","isNotEmpty","MVCArrays","indexOf","length","listenChanged","path","handler","addGoogleEventListener","addBaiduEventListener","addHtmlEventListener","options","addTgEventListener","AbstractEventTargetDelegate","inner","coordTypeSupplier","EventHubEventTargetDelegate","delegate","EventHub","event","_GoogleEventTargetDelegate","key","removable","ev","GoogleEventTargetDelegate","_BaiduEventTargetDelegate","actualListener","BaiduEventTargetDelegate","it","KeyValue","keys","values","FastFindValues","maxSize4Debug","keySelector","valueMap","CachedValue","ControlPosition","ControlPositionConverter","baiduKeyValue","googleKeyValue","controlPositionValues","getBaidu","getGoogle","CustomControl","AbstractControl","EmptyControl","visible","_map","BaiduControl","map","GoogleControl","_type","BuildInMapTypeId","BuildInMapType","id","baidu","google","googleCoordType","ImageMapType","layer","tileCoord","zoom","halfTileRange","baiduMapType","googleMapType","TrafficLayer","MapType","MapTypeControlType","MAP_TYPES_DEFAULT","BaiduMapTypeControl","mapTypes","type2baidu","_GoogleMapTypeControl","mapType","GoogleMapTypeControl","BaiduScaleControl","GoogleScaleControl","BaiduStreetViewControl","GoogleStreetViewControl","BaiduZoomControl","GoogleZoomControl","initGoogleMapDynamicLibraryImport","script","arg","googleTitle","googleName","importMethod","callbackId","dom","global","googleMaps","libraries","url","loader","resolve","reject","_a","library","rest","_LATLNG_ZERO","_BOUNDS_ZERO","GoogleConst","parseGoogleAddressComponents","addressComponents","outResult","parseGooglePlace","fields","Autocomplete","GoogleAutocomplete","result","BaiduAutocomplete","onBoundsChanged","confirmEventTimestamp","removeOnConfirm","removeOnKeyup","heatmapFactory","HeatmapConfig","Store","config","defaultRadius","dataPoint","forceRender","radi","store","max","min","radius","unorganizedData","data","dataArr","dataLen","organisedEntry","dataPoints","pointsLen","coordinator","Canvas2dRenderer","_getColorPalette","gradientConfig","paletteCanvas","paletteCtx","gradient","_getPointTemplate","blurFactor","tplCanvas","tplCtx","_prepareData","renderData","xValues","xValuesLen","xValue","yValues","yValuesLen","yValue","container","shadowCanvas","canvas","computed","oldConfig","width","height","blur","rectX","rectY","shadowCtx","tpl","maxWidth","maxHeight","opacity","maxOpacity","minOpacity","useGradientOpacity","img","imgData","len","palette","alpha","offset","finalAlpha","Renderer","rendererFn","Util","merged","argsLen","Heatmap","Coordinator","evtName","callback","scope","cStore","_connect","renderer","pluginToLoad","plugin","pluginKey","HeatmapOverlay","opts","el","isSupportCanvas","that","e","size","currentBounds","topY","leftX","h","w","d","divPixel","screenPixel","roundedPoint","p","mapdata","dlen","count","elem","RADIUS_DEFAULT","HeatmapOptions","k1","k2","_","HeatmapData","dataMax","GoogleHeatmap","BaiduHeatmap","BHeatMapOverlay","MapUrls","buildUrl","baseUrl","params","urlParams","generateBaiduSrc","segments","Strings","_GoogleMapUrls","origin","destination","mode","location","GoogleMapUrls","_BaiduMapUrls","destinationStr","title","content","BaiduMapUrls","MarkerClusterer$2","MarkerClusterer","opt_markers","opt_options","minZoom","maxZoom","obj1","obj2","object","property","markers","marker","zIndex","styles","numStyles","dv","calculator","opt_nodraw","m","removed","markersCopy","r","ready","projection","tr","bl","trPix","blPix","opt_hide","cluster","oldClusters","p1","p2","R","dLat","dLon","c","distance","clusterToAddTo","center","newCluster","Cluster","mapBounds","Cluster$1","markerClusterer","ClusterIcon","l","mz","sums","opt_padding","clusterBounds","pos","panes","style","backgroundPosition","txtColor","txtSize","T","context","element","source","doc","method","filters","filter","match","fixer","browser","getStyle","viewport","parent","box","htmlDom","htmlBorderLeftWidth","htmlBorderTopWidth","realListener","lis","afterFilter","realType","guid","subClass","superClass","className","proto","selfProps","clazz","_IMAGE_PATH","_IMAGE_EXTENSION","TextIconOverlay","text","sizes","pixelPosition","anchor","textColor","textSize","csstext","me","BaseEvent","eventExtend","be","getExtendedBounds","gridSize","cutBoundsInRange","pixelNE","pixelSW","newNE","newSW","maxX","getRange","minX","maxY","minY","mix","isArray","mkrs","extendedBounds","label","success","ClusterIconStyle","toBaidu","toGoogle","BaiduMarkerClusterer","BMarkerClusterer","stylesLength","GoogleMarkerClusterer","GMarkerClusterer","_b","PlacesService","GooglePlacesService","_options","query","locationBias","results","status","places","BaiduPlacesService","search","block","poi","SearchBox","input","onData","onError","GoogleSearchBox","BaiduSearchBox","MapZoom","AbstractMap","infoWindow","control","isMergeableObject","isNonNullObject","isSpecial","stringValue","isReactElement","canUseSymbol","REACT_ELEMENT_TYPE","emptyTarget","val","cloneUnlessOtherwiseSpecified","deepmerge","defaultArrayMerge","getMergeFunction","customMerge","getEnumerableOwnPropertySymbols","symbol","getKeys","propertyIsOnObject","propertyIsUnsafe","mergeObject","sourceIsArray","targetIsArray","sourceAndTargetTypesMatch","array","prev","next","deepmerge_1","cjs","isObject","isObjectObject","o","isPlainObject","ctor","prot","Objects","fromArray","fromEntries","entries","toJsonSafely","deleteUndefinedPropertyOnPlainObjectDeeply","putIfAbsent","ifAbsent","omit","includes","includesMethod","pick","get","keyPath","del","lastObj","lastKey","keySet","InfoWindowModeValues","GestureHandlingOptions","MapOptions","create","defaultOptions","Overlay","innerOverlay","GoogleOverlay","BaiduOverlay","_BaiduShape","state","editable","color","weight","BaiduShape","GoogleShape","BaiduCircle","circle","GoogleCircle","ensureBaiduV3","BMapPoints","Point","BaiduInfoBox","createBaiduInfoBox","borderClass","createBaiduInfoBoxClass","POINT_ZERO","rootClass","close","pixel","InfoWindow","BaiduInfoWindow","innerPosition","GoogleInfoWindow","BaiduInfoBoxOverlay","baiduMap","GoogleInfoBoxOverlay","border","toEnumOrNull","enumObject","trimIndent","str","pascal2kebab","isInt","ext","normalized","filename","MapPane","MapPanes","mapPane","ElementOverlay","BaiduElementOverlay","latLng","GoogleElementOverlay","GoogleLabel","createGoogleLabel","createGoogleLabelClass","_mapPane","child","LabelContent","toElement","$div","BaiduLabelOverlay","baiduLabel","initialize","deltaX","deltaY","icon","iconAnchor","labelOffset","iconInfo","GoogleLabelOverlay","UnionIcon","Icon","SymbolIcon","baiduIcon","SymbolPath","IconSequence","BaiduMarker","clickable","draggable","enable","prevLabel","GoogleMarker","flag","positionChanged","visibleChanged","mapChanged","BaiduPolyShape","BaiduPolyline","overlay","symbolIcon","GooglePolyline","notify","BaiduPolygon","paths","GooglePolygon","pathsLL","pathLL","BaiduRectangle","originalEvent","prevPath","points","lineStart","beforePoint","afterPoint","lineEnd","newPoint","rect","GoogleRectangle","ZOOM_DELTA","BaiduMap","mapOptions","infoBox","gestureHandling","cursor","mapStyle","buildInMapType","padding","GoogleMap","initialMapType","bottomLeft","topRight","scale","wordPoint","mapTypeId","controlArray","HERE_SUPPORTED_VERSIONS","defaultConfig","tgMapConfig","getTgMapConfig","setTgMapConfig","HereMap","platform","TgMapType","TgMapFactory","createMap","$map","cachedMapLoaders","loadCachedMap","loadMap","namespace","getMapNamespace","loadJsonp","loadJs","getHereModuleUrl","name","version","callbackParamName","callbackName","$script","stringEnumProp","defaultValue","stringUnionPropFromValues","requiredProp","optionalProp","computedSaveOnThis","defaultValues","accessors","sharedPropertyDefinition","createPropertyObject","redefined","createPropertyObjectTyped","createEmptyVNode","createCommentVNode","callHook","vm","hookName","hooks","hook","findByComponentType","extractVNodeFromSlotsByComponent","slots","nodeList","node","splitAttrs","attrs","props","binds","listenerProps","useSplittedAttrs","eventProp","useEventLogMethods","prevType","prevTime","eventLog","eventLogLess","MIXIN_MAP_NAME","MIXIN_HOOK_CREATE","MIXIN_HOOK_DESTROY","MapMixin","defineComponent","_sfc_main$c","markRaw","watch","oldZoom","oldCenter","updateCenter","isUpdateMapType","isUpdateMapTypeId","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_createCommentVNode","_renderSlot","dimen","num","_sfc_main$b","_normalizeClass","_normalizeStyle","_sfc_main$a","TgMap","$el","C","_sfc_main$9","_sfc_main$8","useComponentName","getCurrentInstance","file","useTgMapInner","mapRef","inject","onCreate","onDestroy","onMounted","onBeforeUnmount","_sfc_main$7","_sfc_main$6","_sfc_main$5","heatmap","TgMarkerClusterer","_sfc_main$4","_sfc_main$3","toRaw","SimpleElementOverlay","TgElementOverlay","TgMarker","_label","info","isShow","TgInfoBox","TgInfoWindow","_withDirectives","TgLabel","_sfc_main$2","_sfc_main$1","_sfc_main","DEFAULT_EXCLUDE_HOOK_NAMES","LifecycleLogPlugin","app","lifecycleLogMixin","componentName","__life","EARTH_RADIUS","getRad","getDeg","getDistance","f","g","sg","sl","sf","fl","s","h1","h2","getDestination","pt","angle","dist","alpha1","sinAlpha1","cosAlpha1","tanU1","cosU1","sinU1","sigma1","sinAlpha","cosSqAlpha","uSq","A","B","cos2SigmaM","sinSigma","cosSigma","sigma","sigmaP","deltaSigma","tmp","lambda","L","SphericalUtils","TgMapPlugin","views","TgVue","strategies","to","from"],"mappings":"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","x_google_ignoreList":[1,18,21,22,23,28,29]}
|
|
1
|
+
{"version":3,"file":"tg-map.umd.cjs","sources":["../src/map/event.ts","../node_modules/.pnpm/github.com+TranscodeGroup+coordtransform@75f539951e6b8e9c80bd156a670e2886f4e1fde6_erresvh33ayp76eoeefwsujamu/node_modules/coordtransform/index.js","../src/utils/assert.ts","../src/utils/mapped-types.ts","../src/utils/utils.ts","../src/map/lat-lng.ts","../src/utils/elements.ts","../src/utils/arrays.ts","../src/map/event-target.ts","../src/utils/values.ts","../src/map/map/controls/control.ts","../src/map/map/map-type.ts","../src/map/map/controls/map-type.control.ts","../src/map/map/controls/scale.control.ts","../src/map/map/controls/street-view.control.ts","../src/map/map/controls/zoom.control.ts","../src/utils/google-utils.ts","../src/map/map/extra/autocomplete.ts","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.Heatmap@d10d1a6609a20230cb11f1ff775abfac1da57ec5_5m62dobqccwj3jyaiw4teknuga/node_modules/bmaplib.heatmap/index.js","../src/map/map/extra/heatmap.ts","../src/map/map/extra/map-urls.ts","../node_modules/.pnpm/@google+markerclusterer@2.0.3/node_modules/@google/markerclusterer/dist/markerclusterer.esm.js","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.TextIconOverlay@a5e383395b3c7d0921cf4de1329d6625259bb69f_ax5jbzszzsksndmqbcgpnto4si/node_modules/bmaplib.texticonoverlay/index.js","../node_modules/.pnpm/github.com+TranscodeGroup+BMapLib.MarkerClusterer@81179405d7f50e1ff499c1b65f6d5347d8b3b67b_5h4jsikof26eydbgv5ah4qixaa/node_modules/bmaplib.markerclusterer/index.esm.js","../src/map/map/extra/marker-clusterer.ts","../src/map/map/extra/places-service.ts","../src/map/map/extra/search-box.ts","../src/map/map/map.ts","../node_modules/.pnpm/deepmerge@4.3.0/node_modules/deepmerge/dist/cjs.js","../node_modules/.pnpm/is-plain-object@3.0.1/node_modules/is-plain-object/index.es.js","../src/utils/objects.ts","../src/map/map/map-options.ts","../src/map/map/overlay/overlay.ts","../src/map/map/overlay/shape.ts","../src/map/map/overlay/circle.ts","../src/utils/baidu-utils.ts","../src/map/types.ts","../src/map/map/overlay/baidu-info-box.ts","../src/map/map/overlay/info-window.ts","../src/map/map/overlay/info-box.ts","../src/utils/strings.ts","../src/map/map/overlay/element-overlay.ts","../src/map/map/overlay/google-label.ts","../src/map/map/overlay/label.ts","../src/map/map/overlay/icon.ts","../src/map/map/overlay/marker.ts","../src/map/map/overlay/polyline.ts","../src/map/map/overlay/polygon.ts","../src/map/map/overlay/rectangle.ts","../src/map/map/baidu-map.ts","../src/map/map/google-map.ts","../src/utils/here-utils.ts","../src/map/map-config.ts","../src/map/map/here-map.ts","../src/map/map-factory.ts","../src/map/map-loader.ts","../src/utils/vue-utils.ts","../src/components/map-mixin.ts","../src/components/TgMap.vue","../src/utils/formatter.ts","../src/components/TgMapWidget.vue","../src/components/controls/TgCustomControl.vue","../src/components/controls/TgMapTypeControl.vue","../src/components/controls/TgScaleControl.vue","../src/utils/hooks.ts","../src/components/map-hooks.ts","../src/components/controls/TgStreetViewControl.vue","../src/components/controls/TgZoomControl.vue","../src/components/extra/TgHeatmap.vue","../src/components/extra/TgMarkerClusterer.vue","../src/components/layers/TgTrafficLayer.vue","../src/components/overlays/TgCircle.vue","../src/components/overlays/TgElementOverlay.vue","../src/components/overlays/TgMarker.vue","../src/components/overlays/TgInfoBox.vue","../src/components/overlays/TgInfoWindow.vue","../src/components/overlays/TgLabel.vue","../src/components/overlays/TgPolygon.vue","../src/components/overlays/TgPolyline.vue","../src/components/overlays/TgRectangle.vue","../src/utils/lifecycle-log.ts","../src/utils/spherical-utils.ts","../src/components/index.ts"],"sourcesContent":["import type { LatLng } from './lat-lng'\n\n/**\n * ## 事件机制对比\n * - DOM: add/removeEventListener, Event {type, target}\n * - Vue: $on/$off, 没有Event, listener直接接收数据\n * - baidu: 模仿DOM\n * - here: 模仿DOM\n * - google: addListener+remove, 没有Event, listener直接接收数据\n *\n * 综合对比之后, 决定模仿DOM的事件机制\n */\nexport namespace Tg {\n export interface Event {\n type: string,\n target: EventTarget\n originalEvent?: any\n }\n export interface MouseEvent extends Event {\n position: LatLng\n }\n\n export interface EventListener {\n (this: EventTarget, event: Event): void\n /** 唯一id */\n __id__?: number\n }\n\n export interface EventTarget {\n addEventListener(type: string, listener: EventListener): void\n removeEventListener(type: string, listener: EventListener): void\n }\n\n /**\n * 拥有更详细的类型信息\n * @see EventTarget\n * */\n export interface EventTargetTyped<THIS extends EventTarget, MAP extends { [k: string]: Event }> extends EventTarget {\n addEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void\n removeEventListener<K extends keyof MAP>(type: K, listener: (this: THIS, event: MAP[K]) => void): void\n }\n}\n\nexport function bindEvents(listeners: Record<string, unknown>, target: Tg.EventTarget, excludes?: string[]) {\n Object.keys(listeners).forEach(eventName => {\n if (eventName.startsWith('update:')) {\n // `update:`开头的事件是sync事件, 应该排除\n return\n }\n if (excludes?.includes(eventName)) {\n // 需要排除掉一些事件\n return\n }\n target.addEventListener(eventName, (listeners[eventName] as any))\n })\n}\n\nlet eventListenerId = 1\nexport function generateNextEventListenerId() {\n return eventListenerId++\n}\n\n/**\n * JS的Map/object的key都不支持自定义hashCode()/equals(), 故只能生成字符串当作key\n */\nexport function generateEventKey(type: string, listener: Tg.EventListener) {\n if (!listener.__id__) {\n listener.__id__ = generateNextEventListenerId()\n }\n return `${type}::${listener.__id__}`\n}\n","/**\n * Created by Wandergis on 2015/7/8.\n * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换\n */\n//UMD魔法代码\n// if the module has no dependencies, the above pattern can be simplified to\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.coordtransform = factory();\n }\n}(this, function () {\n //定义一些常量\n var x_PI = 3.14159265358979324 * 3000.0 / 180.0;\n var PI = 3.1415926535897932384626;\n var a = 6378245.0;\n var ee = 0.00669342162296594323;\n\n function Rectangle(lng1, lat1, lng2, lat2) {\n this.west = Math.min(lng1, lng2);\n this.north = Math.max(lat1, lat2);\n this.east = Math.max(lng1, lng2);\n this.south = Math.min(lat1, lat2);\n }\n /**\n * @param {number} lon\n * @param {number} lat\n */\n Rectangle.prototype.contain = function (lon, lat) {\n return this.west <= lon && this.east >= lon && this.north >= lat && this.south <= lat;\n }\n\n //China region - raw data\n var region = [\n new Rectangle(79.446200, 49.220400, 96.330000, 42.889900),\n new Rectangle(109.687200, 54.141500, 135.000200, 39.374200),\n new Rectangle(73.124600, 42.889900, 124.143255, 29.529700),\n new Rectangle(82.968400, 29.529700, 97.035200, 26.718600),\n new Rectangle(97.025300, 29.529700, 124.367395, 20.414096),\n new Rectangle(107.975793, 20.414096, 111.744104, 17.871542)\n ];\n //China excluded region - raw data\n var exclude = [\n new Rectangle(119.921265, 25.398623, 122.497559, 21.785006),\n new Rectangle(101.865200, 22.284000, 106.665000, 20.098800),\n new Rectangle(106.452500, 21.542200, 108.051000, 20.487800),\n new Rectangle(109.032300, 55.817500, 119.127000, 50.325700),\n new Rectangle(127.456800, 55.817500, 137.022700, 49.557400),\n new Rectangle(131.266200, 44.892200, 137.022700, 42.569200),\n new Rectangle(73.124600, 35.398637, 77.948114, 29.529700)\n ];\n\n function isInChina(lon, lat) {\n for (var i = 0; i < region.length; i++) {\n if (region[i].contain(lon, lat)) {\n for (var j = 0; j < exclude.length; j++) {\n if (exclude[j].contain(lon, lat)) {\n return false;\n }\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换\n * 即 百度 转 谷歌、高德\n * @param {number} bd_lon\n * @param {number} bd_lat\n * @returns {*[]}\n */\n function bd09togcj02(bd_lon, bd_lat) {\n var x = bd_lon - 0.0065;\n var y = bd_lat - 0.006;\n var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);\n var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);\n var gg_lng = z * Math.cos(theta);\n var gg_lat = z * Math.sin(theta);\n return [gg_lng, gg_lat]\n };\n\n /**\n * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换\n * 即谷歌、高德 转 百度\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function gcj02tobd09(lng, lat) {\n var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);\n var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);\n var bd_lng = z * Math.cos(theta) + 0.0065;\n var bd_lat = z * Math.sin(theta) + 0.006;\n return [bd_lng, bd_lat]\n };\n\n /**\n * WGS84转GCj02\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function wgs84togcj02(lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n return transform(lng, lat)\n };\n\n /**\n * GCJ02 转换为 WGS84\n * @param {number} lng\n * @param {number} lat\n * @returns {*[]}\n */\n function gcj02towgs84(lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var out = transform(lng, lat)\n return [lng * 2 - out[0], lat * 2 - out[1]]\n };\n\n function transform(lng, lat) {\n var dlat = transformlat(lng - 105.0, lat - 35.0);\n var dlng = transformlng(lng - 105.0, lat - 35.0);\n var radlat = lat / 180.0 * PI;\n var magic = Math.sin(radlat);\n magic = 1 - ee * magic * magic;\n var sqrtmagic = Math.sqrt(magic);\n dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);\n dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);\n var mglat = lat + dlat;\n var mglng = lng + dlng;\n return [mglng, mglat]\n }\n\n function transformlat(lng, lat) {\n var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));\n ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;\n ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;\n ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;\n return ret\n };\n\n function transformlng(lng, lat) {\n var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));\n ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;\n ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;\n ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;\n return ret\n };\n\n return {\n // 向前兼容\n bd09togcj02: bd09togcj02,\n gcj02tobd09: gcj02tobd09,\n wgs84togcj02: wgs84togcj02,\n gcj02towgs84: gcj02towgs84,\n // 小驼峰命名风格\n bd09ToGcj02: bd09togcj02,\n gcj02ToBd09: gcj02tobd09,\n wgs84ToGcj02: wgs84togcj02,\n gcj02ToWgs84: gcj02towgs84,\n bd09ToWgs84: function (lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var gcj02 = bd09togcj02(lng, lat)\n return gcj02towgs84(gcj02[0], gcj02[1])\n },\n wgs84ToBd09: function (lng, lat) {\n if (!isInChina(lng, lat)) {\n return [lng, lat]\n }\n var gcj02 = wgs84togcj02(lng, lat)\n return gcj02tobd09(gcj02[0], gcj02[1])\n }\n }\n}));\n","/**\n * typescript 3.7 的新特性[Assertion Functions](https://github.com/microsoft/TypeScript/issues/33352)\n * */\nexport function assert(condition: any, msg?: string): asserts condition {\n if (!condition) {\n throw new Error(`AssertionError: ${msg}`)\n }\n}\n\n/**\n * 可以用来防止switch时少写case\n * @see https://www.zhihu.com/question/354601204\n */\nexport function assertNever(x: never): never {\n throw new Error(`Unexpected object: ${x}`)\n}\n","// [PrimitiveToWrapper]就是用来转换这两种类型的\n/* eslint-disable @typescript-eslint/ban-types */\nimport type { Component, ComponentPublicInstance } from 'vue'\n\n/** deep版的 `Partial` */\nexport type DeepPartial<T> = {\n [U in keyof T]?: T[U] extends object\n ? DeepPartial<T[U]>\n : T[U]\n}\n\n/** 表示一个函数 */\nexport type AnyFunction = (...args: any[]) => any\n\n/**\n * 表示一个构造器\n * {@link import('vue/types/options').Constructor}\n * */\nexport type Constructor<T = {}> = new (...args: any[]) => T\n\n/**\n * 抽象构造器类型, 相比{@link Constructor}, 不能直接用new创建对象\n * @see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-2.html#abstract-construct-signatures\n */\nexport type AbstractConstructor<T = {}> = abstract new (...args: any[]) => T\n\n/** 原始类型=>包装类型 */\nexport type PrimitiveToWrapper<T> =\n T extends boolean ? Boolean :\n T extends string ? String :\n T extends number ? Number :\n T\n\n/** 包装类型=>原始类型 */\nexport type WrapperToPrimitive<T> =\n T extends Boolean ? boolean :\n T extends String ? string :\n T extends Number ? number :\n T\n\n/**\n * 返回undefined但类型是指定的泛型T, 需要你自身保证在使用前先初始化\n * 模仿了kotlin的lateinit关键字\n * */\nexport function lateinit<T>(): T {\n return undefined as any\n}\n\nexport function typed<T>(): T | undefined\nexport function typed<T>(t: T): T\n/** 用来给纯对象的成员加上类型验证 */\nexport function typed<T>(t?: T) {\n return t\n}\n\n/**\n * `vue instanceof VueConstructor`时`vue`并不会自动转换成`VueConstructor`的子类, 用该方法可以实现这种转换\n */\nexport function isInstanceOf<T>(obj: any, constructor: Constructor<T>): obj is T {\n return obj instanceof constructor\n}\n\n/** @see isInstanceOf */\nexport function safeAs<T>(obj: any, constructor: Constructor<T>): T | undefined {\n if (obj instanceof constructor) {\n return obj\n }\n return undefined\n}\n\n/** 判断{@link instance}是否是{@link component}的实例 */\nexport function isComponentByType<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): instance is InstanceType<C> {\n // TODO: 2023/03/15 ipcjs 看有没有其他更好的方式判断组件类型\n return instance?.$options.name === component.name\n}\n\n/** 安全转换组件类型, 若不能转换会返回`undefined` */\nexport function safeAsComponent<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): InstanceType<C> | undefined {\n return isComponentByType(instance, component) ? instance : undefined\n}\n\n/**\n * 查找[startInstance, endComponent)之间的第一个类型为{@link component}的父组件\n * @param component 查找的组件\n * @param startInstance 查找的开始实例, 包含\n * @param endComponent 查找的终止组件, 不包含\n * @returns\n */\nexport function findAncestorComponentByType<C extends Component & AbstractConstructor>(\n component: C,\n startInstance: ComponentPublicInstance | null,\n endComponent?: Component & AbstractConstructor,\n): InstanceType<C> | undefined {\n let instance = startInstance\n while (instance) {\n if (isComponentByType(instance, component)) {\n return instance\n } else if (endComponent && isComponentByType(instance, endComponent)) {\n return undefined\n } else {\n instance = instance.$parent\n }\n }\n return undefined\n}\n\n/** {@link NonNullable} 的反义词 */\nexport type Nullable<T> = T | null | undefined\n\n/** T的所有value的联合类型 */\nexport type ValueOf<T> = T[keyof T]\n\n/**\n * 提取出T中value为V的子类的所有key\n * @see https://stackoverflow.com/questions/54520676/in-typescript-how-to-specify-only-keys-of-a-generic-object-whose-values-are-stri\n * */\nexport type KeysMatching<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T]\n\n/**\n * 并不存在可以精确表示一个枚举类型, 该类只能近似表示一个字符枚举\n * */\nexport type StringEnumLike = { [k: string]: string }\n\n/**\n * String枚举的值, 包括`string`类型\n * @see https://stackoverflow.com/questions/52393730/typescript-string-literal-union-type-from-enum\n */\nexport type StringEnumValue<E extends StringEnumLike> = ValueOf<E> | `${ValueOf<E>}`\n\n/**\n * 包装`T`中的部分枚举字段的值为{@link StringEnumValue}\n *\n * 会校验{@link EnumObjects}中的类型是否书写正确, 若写错, 会推断成`never`\n * */\nexport type WrapStringEnumValue<T, EnumObjects extends { [k in keyof T]?: StringEnumLike }, > = {\n [P in keyof T]: P extends keyof EnumObjects\n ? EnumObjects[P] extends StringEnumLike\n ? T[P] extends ValueOf<EnumObjects[P]> | undefined\n ? StringEnumValue<EnumObjects[P]>\n : never\n : never\n : T[P]\n}\n\n/** 取消包装`T`中的{@link StringEnumValue}字段 */\nexport function unwrapStringEnumValue<T extends object>(value: T): {\n [K in keyof T]: T[K] extends StringEnumValue<infer Enum>\n ? StringEnumLike extends Enum\n // 若Enum推断成StringEnumLike, 说明Enum不是真的枚举, 直接返回原始的类型T[K]\n ? T[K]\n // 否则, Enum则时真正的枚举, 返回枚举的类型\n : Enum[keyof Enum]\n : Exclude<T[K], undefined> extends StringEnumValue<infer Enum>\n ? StringEnumLike extends Enum\n // 同上\n ? T[K]\n :Enum[keyof Enum] | undefined\n : T[K]\n}\n\nexport function unwrapStringEnumValue<E extends StringEnumLike>(value: StringEnumValue<E>, enumObject?: E): E[keyof E]\nexport function unwrapStringEnumValue<E extends StringEnumLike>(value: StringEnumValue<E> | undefined, enumObject?: E): E[keyof E] | undefined\n/**\n * 取消包装`StringEnumValue`, 将其还原成枚举, 和{@link WrapStringEnumValue}对应\n *\n * 整个方法没有逻辑, 只是做类型校验; 重载中的`enumObject`也仅用与辅助推理`E`的类型, 并没有实际作用;\n */\nexport function unwrapStringEnumValue(value: any): any {\n return value\n}\n\n/**\n * 非空的值\n *\n * 类型`{}`也表示\"任何非空的值\", 但由于它看起来像空对象, 所以一般更推荐用Thing\n *\n * @see https://github.com/microsoft/TypeScript/issues/7648#issuecomment-541625573\n * @see https://github.com/typescript-eslint/typescript-eslint/issues/2063#issuecomment-675156492\n */\nexport type Thing = string | number | boolean | bigint | object | symbol\n\n/** 除T指定的类型外, 其他参数 */\nexport type TypedAny<T> = T & { [k: string]: any }\n","/** 抛异常是语句不是表达式, 使用该方法替换则可以在表达式中使用 */\nexport function throwError(msg?: string): never {\n throw new Error(msg)\n}\n\nexport function throwUnsupported(msg?: string): never {\n throw new Error(`Unsupported: ${msg}`)\n}\n\nexport function todo(msg?: string): never {\n throw new Error(`todo: ${msg}`)\n}\n\nexport function debug(msg?: any): any {\n // debugger\n return msg\n}\n\n/** 啥也不做 */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function noop(...args: any[]) { /* noop */ }\n\n/** 可以用在Array.filter(isDef)中, 用来过滤为空的值 */\nexport function isDef<T>(v: T | undefined | null): v is T {\n return v != null\n}\n\n/**\n * entry的value是否定义了\n *\n * 可以用在Array.filter(isEntryValueDef)中, 用来过滤值为空的元素\n * @see isDef\n */\nexport function isEntryValueDef<K, V>(entry: [K, V]): entry is [K, NonNullable<V>] {\n return entry[1] != null\n}\n\n/**\n * 创建一个异步初始化的单例, 保证只初始化成功一次\n */\nexport function createAsyncSingleton<T>(creator: () => Promise<T>) {\n let promise: Promise<T> | null = null\n return () => {\n // eslint-disable-next-line no-return-assign\n return promise ??= creator() //\n .catch((e) => {\n // 异常时清空promise, 下次请求就能重试\n promise = null\n return Promise.reject(e)\n })\n }\n}\n","import coordtransform, { type LngLatTuple } from 'coordtransform'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { type Arrays } from '../utils/arrays'\nimport { assert } from '../utils/assert'\nimport { unwrapStringEnumValue, type StringEnumValue } from '../utils/mapped-types'\nimport { noop, throwError } from '../utils/utils'\n\nexport enum CoordType {\n wgs84 = 'wgs84',\n gcj02 = 'gcj02',\n bd09 = 'bd09',\n}\n\nconst COORD_TYPE_DEFAULT = CoordType.wgs84\n\nexport interface CoordTypeSupplier {\n readonly coordType: CoordType\n}\n\nexport interface LatLngLiteral {\n readonly lat: number\n readonly lng: number\n readonly coord?: CoordType\n}\n\nexport interface WeightedLatLng {\n position: LatLng\n weight: number\n}\n\nexport class LatLng {\n static ZERO = LatLng.create(0, 0)\n /**\n * {@template latlng_normalize}\n *\n * 对经纬度进行标准化, 参考google的实现\n *\n * ## 行为不一致\n * - google: google.maps.LatLng的构造器会对经纬度进行标准化, 所有点都能正常显示\n * - baidu: BMap.Point的构造器不会对经纬度进行标准化, 超出范围的点显示到(0, 0)位置\n *\n * {@endtemplate}\n */\n /* private */ static _normalize(lng: number, lat: number) {\n // lat限制在[-90, 90]范围内\n const normalizedLat = lat > 90\n ? 90\n : lat < -90\n ? -90\n : lat\n // lng转换到[-180, 180]范围内\n const normalizedLng = lng > 180 //\n ? (lng + 180) % 360 - 180\n : lng < -180\n ? (lng - 180) % 360 + 180\n : lng\n return [normalizedLng, normalizedLat]\n }\n\n /** @param coord Baidu Map的坐标一般都是bd09 */\n static fromBaidu(point: BMap.Point, coord: CoordType) {\n return new LatLng(point.lat, point.lng, coord)\n }\n /** @param coord Google Map的坐标依据地图类型不同是不一样的 */\n static fromGoogle(latlng: google.maps.LatLng, coord: CoordType) {\n return new LatLng(latlng.lat(), latlng.lng(), coord)\n }\n static fromHere(point: H.geo.IPoint, coord: CoordType) {\n return new LatLng(point.lat, point.lng, coord)\n }\n\n static fromLiteral(latlng: LatLngLiteral) {\n return new LatLng(latlng.lat, latlng.lng, latlng.coord || COORD_TYPE_DEFAULT)\n }\n\n static fromLngLat(lng: number, lat: number, coord: CoordType = COORD_TYPE_DEFAULT) {\n return new LatLng(lat, lng, coord)\n }\n\n static create(lat: number, lng: number, coord: CoordType = COORD_TYPE_DEFAULT) {\n return new LatLng(lat, lng, coord)\n }\n\n constructor(\n /**\n * 纬度, 分南北, [-90, 90], 0点为赤道\n */\n public readonly lat: number,\n /**\n * 经度, 分东西, [-180, 180], 0点为本初子午线\n */\n public readonly lng: number,\n /** 坐标系 */\n public readonly coord: CoordType,\n ) {\n noop()\n }\n\n /** 转换坐标到指定坐标系 */\n to(coordType: StringEnumValue<typeof CoordType>) {\n const coord = unwrapStringEnumValue(coordType, CoordType)\n if (this.coord === coord) {\n return this\n }\n const [lng, lat] = this._convert(coord)\n return new LatLng(lat, lng, coord)\n }\n\n /**\n * TODO: normalize要不要默认设为true, 和google的行为保持一致?\n * 转换成baidu的经纬度\n * @param normalize 转换时是否进行标准化, 默认false\n * @see _normalize {@macro latlng_normalize}\n */\n toBaidu(coord: CoordType, normalize = false) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n if (normalize) {\n [lng, lat] = LatLng._normalize(lng, lat)\n }\n return new BMap.Point(lng, lat)\n }\n\n /**\n * 转换成google的经纬度, 内部会自动进行标准化\n * @see _normalize {@macro latlng_normalize}\n */\n toGoogle(coord: CoordType) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n return new google.maps.LatLng(lat, lng)\n }\n\n toHere(coord: CoordType) {\n let lat = this.lat\n let lng = this.lng\n if (this.coord !== coord) {\n [lng, lat] = this._convert(coord)\n }\n return new H.geo.Point(lat, lng)\n }\n\n /**\n * 该方法之所以设计的这么不友好, 是为了防止不必要的开销(大概有点影响😅)\n *\n * 私有方法, 外部需要转换坐标系, 请使用{@link to}/toBaidu/Google/Here, 之所以不添加private关键字, 是因为设成私有后, 有的地方会报类型错误...\n *\n * @returns `[lng, lat]` 注意不要取错顺序\n * @throws 若当前coord和targetCoord相同, 会抛异常, 故请在外部判断\n */\n /* private */ _convert(targetCoord: CoordType): LngLatTuple {\n switch (this.coord) {\n case CoordType.bd09:\n if (targetCoord === CoordType.gcj02) {\n return coordtransform.bd09ToGcj02(this.lng, this.lat)\n } else {\n return coordtransform.bd09ToWgs84(this.lng, this.lat)\n }\n\n case CoordType.gcj02:\n if (targetCoord === CoordType.wgs84) {\n return coordtransform.gcj02ToWgs84(this.lng, this.lat)\n } else {\n return coordtransform.gcj02ToBd09(this.lng, this.lat)\n }\n\n case CoordType.wgs84:\n if (targetCoord === CoordType.bd09) {\n return coordtransform.wgs84ToBd09(this.lng, this.lat)\n } else {\n return coordtransform.wgs84ToGcj02(this.lng, this.lat)\n }\n }\n\n throw new Error(`不支持的坐标转换: ${this.coord}=>${targetCoord}`)\n }\n\n /**\n * 标准化, 返回合法的坐标点\n * @see _normalize {@macro latlng_normalize}\n */\n normalize() {\n const [lng, lat] = LatLng._normalize(this.lng, this.lat)\n if (lat === this.lat && lng === this.lng) {\n return this\n }\n return new LatLng(lat, lng, this.coord)\n }\n\n equals(other: LatLng) {\n if (this === other) {\n return true\n }\n return this.lat === other.lat && this.lng === other.lng && this.coord === other.coord\n }\n\n toString() {\n return JSON.stringify(this)\n }\n}\n\n/** 少数接口同时支持对象形式和字面量形式 */\nexport type LatLngType = LatLng | LatLngLiteral\n\n/**\n * 反编译自{@link com.google.android.gms.maps.model.LatLngBounds}\n */\nexport class LatLngBounds {\n static EMPTY = new LatLngBounds(LatLng.ZERO, LatLng.ZERO)\n static isBetweenLng(minLng: number, maxLng: number, lng: number) {\n return minLng <= maxLng\n ? minLng <= lng && lng <= maxLng\n // 例如: 10->181的情况, 会被表示成10->-179, 导致minLag比maxLng数值上更大\n : minLng <= lng || lng <= maxLng\n }\n /**\n * 从数组创建bounds\n *\n * 只有{@link positions}为空时, 才会返回`undefined`, 可以借助{@link Arrays.isNotEmpty}协助进行类型推断\n */\n static fromArray(positions: readonly []): undefined\n /** @see Arrays.isNotEmpty */\n static fromArray(positions: readonly [LatLng, ...LatLng[]]): LatLngBounds\n static fromArray(positions: readonly LatLng[]): LatLngBounds | undefined\n static fromArray(positions: readonly LatLng[]): LatLngBounds | undefined {\n if (positions.length === 0) {\n return undefined\n }\n const builder = new LatLngBounds.Builder(positions[0])\n for (let i = 1; i < positions.length; i++) {\n builder.include(positions[i])\n }\n return builder.build()\n }\n\n static from(...positions: LatLng[]): LatLngBounds {\n return this.fromArray(positions) ?? throwError('positions中没有点')\n }\n\n static fromGoogle(bounds: google.maps.LatLngBounds, coord: CoordType) {\n return new LatLngBounds(\n LatLng.fromGoogle(bounds.getSouthWest(), coord),\n LatLng.fromGoogle(bounds.getNorthEast(), coord),\n )\n }\n\n static fromBaidu(bounds: BMap.Bounds, coord: CoordType) {\n return new LatLngBounds(\n LatLng.fromBaidu(bounds.getSouthWest(), coord),\n LatLng.fromBaidu(bounds.getNorthEast(), coord),\n )\n }\n\n static create(sw: LatLng, ne: LatLng) {\n return this.from(sw, ne)\n }\n\n coord: CoordType\n /**\n * 不推荐直接创建LatLngBounds, sw和ne的大小关系可能没法保证, 推荐用LatLngBounds.Builder或者LatLngBounds.from等静态方法来创建\n * @param sw 西南, lat/lng更小\n * @param ne 东北, lat/lng更大\n */\n constructor(\n public sw: LatLng,\n public ne: LatLng,\n ) {\n assert(sw.coord === ne.coord, 'sw和ne的coord应该相同')\n assert(Number.isFinite(sw.lat) && Number.isFinite(sw.lng) && Number.isFinite(ne.lat) && Number.isFinite(ne.lng), `sw(${sw})和ne(${ne})不能包含NaN或Infinite`)\n assert(sw.lat <= ne.lat, `sw.lat(${sw.lat})应该比ne.lat(${ne.lat})小`)\n this.coord = sw.coord\n }\n\n isEmpty() {\n return this.sw.equals(this.ne)\n }\n\n contains(position: LatLng) {\n const { lat, lng } = position.to(this.coord)\n return this.sw.lat <= lat && lat <= this.ne.lat &&\n LatLngBounds.isBetweenLng(this.sw.lng, this.ne.lng, lng)\n }\n\n getCenter(): LatLng {\n if (this.sw.equals(this.ne)) {\n return this.sw\n }\n const lat = (this.sw.lat + this.ne.lat) / 2\n const lng = (this.sw.lng + this.ne.lng + (this.sw.lng < this.ne.lng ? 0 : 360)) / 2\n return LatLng.create(lat, lng, this.coord)\n }\n\n toString() {\n return JSON.stringify(this)\n }\n\n equals(other: LatLngBounds) {\n return this.sw.equals(other.sw) && this.ne.equals(other.ne)\n }\n\n /**\n * 矩形的四个点数组\n * 顺时针: sw(西南) -> nw(西北) -> ne(东北) -> se(东南)\n * */\n toRectArray() {\n const coord = this.sw.coord\n return [\n this.sw,\n LatLng.fromLngLat(this.sw.lng, this.ne.lat, coord),\n this.ne,\n LatLng.fromLngLat(this.ne.lng, this.sw.lat, coord),\n ]\n }\n\n toGoogle(coord: CoordType) {\n return new google.maps.LatLngBounds(this.sw.toGoogle(coord), this.ne.toGoogle(coord))\n }\n toBaidu(coord: CoordType) {\n return new BMap.Bounds(this.sw.toBaidu(coord), this.ne.toBaidu(coord))\n }\n toBaiduArray(coord: CoordType) {\n return [this.sw.toBaidu(coord), this.ne.toBaidu(coord)]\n }\n}\n\nexport namespace LatLngBounds {\n export class Builder {\n private coord: CoordType\n private minLat: number\n private minLng: number\n private maxLat: number\n private maxLng: number\n\n constructor(start: LatLng) {\n this.coord = start.coord\n this.minLat = this.maxLat = start.lat\n this.minLng = this.maxLng = start.lng\n }\n\n build() {\n return new LatLngBounds(\n // sw对应min\n LatLng.create(this.minLat, this.minLng, this.coord),\n // ne对应max\n LatLng.create(this.maxLat, this.maxLng, this.coord),\n )\n }\n\n include(position: LatLng) {\n const { lat, lng } = position.to(this.coord)\n // lat的范围是[-90, 90], 是\"线性\"的, 可以直接比较大小\n this.minLat = Math.min(this.minLat, lat)\n this.maxLat = Math.max(this.maxLat, lat)\n // lng的范围是[-180, 180], 是\"一个圆\", 大于181将被表示成-179\n if (!LatLngBounds.isBetweenLng(this.minLng, this.maxLng, lng)) {\n // 比较minLng和maxLng, 谁离lng更近, 谁更近minLng->maxLng的范围往谁身上扩展\n if (this.delta(this.minLng, lng) < this.delta(lng, this.maxLng)) {\n this.minLng = lng\n } else {\n this.maxLng = lng\n }\n }\n return this\n }\n private delta(end: number, start: number) {\n return (end - start + 360) % 360\n }\n }\n}\n/** 在导航/搜索等接口中使用的 位置 */\nexport type Location = string | LatLng\n\nexport namespace Location {\n export function toString(place: Location | undefined, coordType: CoordType) {\n if (place == null) {\n return undefined\n }\n if (typeof place === 'string') {\n return place\n }\n const ll = place.to(coordType)\n return `${ll.lat},${ll.lng}`\n }\n export function getCoordType(place: Location | undefined) {\n return typeof place === 'string' ? undefined : place?.coord\n }\n}\n","export namespace Elements {\n /** @see https://stackoverflow.com/questions/4880381/check-whether-html-element-has-scrollbars */\n export function isScrollable(ele: Element) {\n return ele.scrollWidth > ele.clientWidth || ele.scrollHeight > ele.clientHeight\n }\n}\n","import { type AnyFunction, type Constructor } from '../components'\n\nexport namespace Arrays {\n /**\n * 浅层比较\n * @see https://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript\n * */\n export function equals<T>(a: T[], b: T[]) {\n return a.length === b.length && a.every((v, i) => v === b[i])\n }\n\n export function remove<T>(arr: T[], item: T): T | undefined {\n const index = arr.indexOf(item)\n if (index !== -1) {\n return arr.splice(index, 1)[0]\n }\n return undefined\n }\n\n export function findByType<T>(arr: any[], constructor: Constructor<T>): T | undefined {\n for (const item of arr) {\n if (item instanceof constructor) {\n return item\n }\n }\n return undefined\n }\n\n /** 自动推断item的类型的{@link Array.includes} */\n export function includesTyped<T extends E, E>(arr: T[], item: E): item is T {\n return (arr as E[]).includes(item)\n }\n\n /** 设置 指定位置的值 */\n export function at<T>(arr: T[], index: number, value: T): void\n /** 获取 指定位置的值 */\n export function at<T>(arr: T[], index: number): T | undefined\n /**\n * @param index 可以是负数, `-1`表示倒数第一个元素\n * @see RelativeIndexable.at\n */\n export function at<T>(arr: T[], index: number, value?: T) {\n const i = index >= 0 ? index : arr.length + index\n // 需要严格判定undefined\n if (value === undefined) {\n return arr[i]\n }\n arr[i] = value\n }\n\n /**\n * 判断并推断数组非空\n * @see https://stackoverflow.com/questions/56006111/is-it-possible-to-define-a-non-empty-array-type-in-typescript\n */\n export function isNotEmpty<T>(arr: T[]): arr is [T, ...T[]] {\n return arr.length > 0\n }\n}\n\nexport namespace MVCArrays {\n export function indexOf<T>(arr: google.maps.MVCArray<T>, item: T): number {\n const length = arr.getLength()\n for (let i = 0; i < length; i++) {\n if (arr.getAt(i) === item) {\n return i\n }\n }\n return -1\n }\n export function remove<T>(arr: google.maps.MVCArray<T>, item: T): T | undefined {\n const index = indexOf(arr, item)\n if (index !== -1) {\n return arr.removeAt(index)\n }\n return undefined\n }\n /**\n * 监听数组内容变化\n * @see https://developers.google.com/maps/documentation/javascript/shapes#editable_events\n * */\n export function listenChanged<T>(path: google.maps.MVCArray<T>, handler: AnyFunction) {\n return [\n path.addListener('insert_at', handler),\n path.addListener('remove_at', handler),\n path.addListener('set_at', handler),\n ]\n }\n}\n","// cSpell:ignore maptypeid, maptypechange\nimport type { AbstractMap, AbstractMapEventMap } from '../components'\nimport { Arrays } from '../utils/arrays'\nimport { lateinit } from '../utils/mapped-types'\nimport { generateEventKey, type Tg } from './event'\nimport { LatLng, type CoordTypeSupplier } from './lat-lng'\nimport type { UnionBaiduEventTarget, UnionGoogleEventTarget } from './unions'\n\n/**\n * 移除事件监听的函数\n *\n * 实现{@link EventTarget}有点复杂, 对于简单的情况, 实现一个设置监听的函数+返回{@link RemoveEventListenerFunction}就够了\n * @see addBaiduEventListener\n * @see addGoogleEventListener\n * */\nexport interface RemoveEventListenerFunction {\n (): void\n}\nexport function addGoogleEventListener(target: UnionGoogleEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction {\n return target.addListener(type, listener).remove\n}\n\nexport function addBaiduEventListener(target: UnionBaiduEventTarget, type: string, listener: (...args: any[]) => void): RemoveEventListenerFunction {\n target.addEventListener(type, listener)\n return () => target.removeEventListener(type, listener)\n}\n\nexport function addHtmlEventListener<K extends keyof EventMap, EventMap=HTMLElementEventMap, T extends EventTarget=HTMLElement>(\n target: T,\n type: K,\n listener: (this: T, ev: EventMap[K]) => any,\n options?: AddEventListenerOptions | boolean,\n): RemoveEventListenerFunction {\n target.addEventListener(type as any, listener as any, options)\n return () => target.removeEventListener(type as any, listener as any, options)\n}\n\nexport function addTgEventListener<K extends keyof EventMap, EventMap=AbstractMapEventMap, T extends Tg.EventTarget=AbstractMap>(\n target: T,\n type: K,\n listener: (this: T, ev: EventMap[K]) => any,\n): RemoveEventListenerFunction {\n target.addEventListener(type as any, listener as any)\n return () => target.removeEventListener(type as any, listener as any)\n}\n\nexport interface EventTargetDelegate extends Tg.EventTarget {\n setTarget(target: Tg.EventTarget): this\n}\n\n/**\n * ## Delegate(代理) VS Mixin(混合)\n * Delegate相对于Mixin的优点是调用路径更明确, 缺点是js/ts原生不支持, 需要写样板代码\n */\nexport abstract class AbstractEventTargetDelegate<T = any> implements EventTargetDelegate {\n protected eventMap = new Map<string, any>()\n protected target = lateinit<Tg.EventTarget>()\n constructor(\n protected inner: T,\n protected coordTypeSupplier: CoordTypeSupplier,\n ) {\n // 绑定this, 防止this指向错误\n this.addEventListener = this.addEventListener.bind(this)\n this.removeEventListener = this.removeEventListener.bind(this)\n }\n setTarget(target: Tg.EventTarget) {\n this.target = target\n return this\n }\n abstract addEventListener(type: string, listener: Tg.EventListener): void\n abstract removeEventListener(type: string, listener: Tg.EventListener): void\n}\n\nexport class EventHubEventTargetDelegate<EventTypes extends string=string> implements EventTargetDelegate {\n private eventHub = new EventHub()\n constructor(\n private delegate: EventTargetDelegate,\n private options: {\n /** 由{@link eventHub}手动处理的事件 */\n types: EventTypes[],\n /** 用户开始监听{@link type} */\n onListen: (type: EventTypes) => void,\n /** 用户结束监听{@link type} */\n onCancel: (type: EventTypes) => void,\n },\n ) { }\n\n notify(event: Tg.Event) {\n this.eventHub.notify(event)\n }\n\n hasListener(type: EventTypes) {\n return this.eventHub.hasListener(type)\n }\n\n setTarget(target: Tg.EventTarget): this {\n this.delegate.setTarget(target)\n return this\n }\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n if (Arrays.includesTyped(this.options.types, type)) {\n // 第一次添加\n if (!this.eventHub.hasListener(type)) {\n this.options.onListen(type)\n }\n this.eventHub.addEventListener(type, listener)\n return\n }\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n if (Arrays.includesTyped(this.options.types, type)) {\n this.eventHub.removeEventListener(type, listener)\n // 最后一次移除\n if (!this.eventHub.hasListener(type)) {\n this.options.onCancel(type)\n }\n return\n }\n this.delegate.removeEventListener(type, listener)\n }\n}\n\nexport class GoogleEventTargetDelegate<T extends UnionGoogleEventTarget = UnionGoogleEventTarget> extends AbstractEventTargetDelegate<T> {\n // 事件类型映射: tg => google\n private static EVENT_TYPE_MAP: { [k: string]: string } = {\n 'center-changed': 'center_changed',\n 'zoom-changed': 'zoom_changed',\n 'radius-changed': 'radius_changed',\n 'bounds-changed': 'bounds_changed',\n 'map-type-changed': 'maptypeid_changed',\n // google地图的overlay会拦截地图的事件, 导致在map上设置的监听缺少一部分事件, baidu地图没有这个问题\n // 规避方式一:\n // 在map监听事件的同时, 在overlay上使用`map-*`监听相同的事件..., 具体使用方式参考主项目中的`SearchInRectTool2`\n // 规避方式二: (推荐)\n // 给overlay设置`clickable=\"false\"`, 不让它接收事件\n 'map-mousedown': 'mousedown',\n 'map-mousemove': 'mousemove',\n 'map-mouseup': 'mouseup',\n 'map-dblclick': 'dblclick',\n }\n\n override addEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n if (this.eventMap.get(key)) {\n console.warn('listener已经添加过了', key, listener)\n return\n }\n const removable = this.inner.addListener(GoogleEventTargetDelegate.EVENT_TYPE_MAP[type] || type, (event?: { latLng?: google.maps.LatLng }) => {\n const ev: Tg.Event = {\n type: type,\n target: this.target,\n originalEvent: event,\n }\n if (event?.latLng) { // google.maps.MouseEvent\n (ev as Tg.MouseEvent).position = LatLng.fromGoogle(event.latLng, this.coordTypeSupplier.coordType)\n }\n listener.call(this.target, ev)\n })\n this.eventMap.set(key, removable)\n }\n override removeEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n const removable: google.maps.MapsEventListener = this.eventMap.get(key)\n if (removable) {\n removable.remove()\n this.eventMap.delete(key)\n } else {\n console.warn('移除失败, 不存在该listener', key, listener)\n }\n }\n}\nexport class BaiduEventTargetDelegate<T extends UnionBaiduEventTarget = UnionBaiduEventTarget> extends AbstractEventTargetDelegate<T> {\n // cSpell:words clickclose\n // 事件类型映射, tg => baidu\n private static EVENT_TYPE_MAP: { [k: string]: string } = {\n drag: 'dragging',\n closeclick: 'clickclose',\n // baidu不支持contextmenu事件, 将其映射为rightclick\n contextmenu: 'rightclick',\n 'zoom-changed': 'zoomend',\n 'map-type-changed': 'maptypechange',\n }\n\n override addEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n if (this.eventMap.get(key)) {\n console.warn('listener已经添加过了', key, listener)\n return\n }\n const actualListener = (event: { point?: BMap.Point }) => {\n const ev: Tg.Event = {\n type: type,\n target: this.target,\n originalEvent: event,\n }\n if (event.point) {\n (ev as Tg.MouseEvent).position = LatLng.fromBaidu(event.point, this.coordTypeSupplier.coordType)\n }\n listener.call(this.target, ev)\n }\n this.inner.addEventListener(BaiduEventTargetDelegate.EVENT_TYPE_MAP[type] || type, actualListener)\n this.eventMap.set(key, actualListener)\n }\n override removeEventListener(type: string, listener: Tg.EventListener): void {\n const key = generateEventKey(type, listener)\n const actualListener: BMap.Callback = this.eventMap.get(key)\n if (actualListener) {\n this.inner.removeEventListener(BaiduEventTargetDelegate.EVENT_TYPE_MAP[type] || type, actualListener)\n this.eventMap.delete(key)\n } else {\n console.warn('移除失败, 不存在该listener', key, listener)\n }\n }\n}\n\n/** 手动维护事件 */\nexport class EventHub implements Tg.EventTarget {\n private typeMap = new Map<string, Tg.EventListener[]>()\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n let listeners = this.typeMap.get(type)\n if (!listeners) {\n listeners = []\n this.typeMap.set(type, listeners)\n }\n if (listeners.includes(listener)) {\n return\n }\n listeners.push(listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n const listeners = this.typeMap.get(type)\n if (!listeners) {\n return\n }\n Arrays.remove(listeners, listener)\n }\n hasListener(type: string) {\n const listeners = this.typeMap.get(type)\n return listeners != null && listeners.length > 0\n }\n notify(event: Tg.Event) {\n const listeners = this.typeMap.get(event.type)\n if (listeners) {\n listeners.forEach(it => it.call(event.target, event))\n }\n }\n}\n","import { assert } from './assert'\nimport { noop, throwError } from './utils'\n\n/** 键值对 */\nexport class KeyValue<K, V> {\n private keyToValue = new Map<K, V>()\n private valueToKey = new Map<V, K>()\n /**\n * `keys`和`values`数组中可以有相同的值, 若存在相同值, 则index越小的优先级越高\n */\n constructor(keys: K[], values: V[]) {\n assert(keys.length === values.length)\n // 倒序遍历, 确保index越小, 优先级越高\n for (let i = keys.length - 1; i >= 0; i--) {\n this.keyToValue.set(keys[i], values[i])\n this.valueToKey.set(values[i], keys[i])\n }\n }\n toKey(value: V): K {\n return this.valueToKey.get(value) ?? throwError()\n }\n toValue(key: K): V {\n return this.keyToValue.get(key) ?? throwError()\n }\n}\n\nexport type KeySelector<T, K> = (this: T) => K\n\n/** 用key快速查找元素的数组 */\nexport class FastFindValues<T> {\n private map = new Map<KeySelector<T, any>, Map<any, T>>()\n constructor(\n public values: readonly T[],\n private maxSize4Debug = 10,\n ) {\n noop()\n }\n\n /** 获取保存key-value映射的Map */\n getValueMap<K>(keySelector: KeySelector<T, K>): Map<K, T> {\n let valueMap = this.map.get(keySelector)\n if (!valueMap) {\n valueMap = new Map<K, T>()\n // 倒序遍历, 保证index越小, 优先级越高\n for (let i = this.values.length - 1; i >= 0; i--) {\n const value = this.values[i]\n valueMap.set(keySelector.call(value), value)\n }\n this.map.set(keySelector, valueMap)\n if (process.env.NODE_ENV !== 'production' && this.map.size > this.maxSize4Debug) {\n console.warn(`this.map的大小(${this.map.size})超过了设置的最大大小(${this.maxSize4Debug}), 这可能是由于你每次都创建新的keySelector造成的, 请保证相同功能的keySelector只创建一个对象`)\n }\n }\n return valueMap\n }\n\n /**\n * 直接用key获取value\n * @param keySelector 从T中读取key的方法, 会用它当key, 缓存结果, 故多次调用需要使用相同的keySelector对象, 不要每次创建新的, 推荐直接使用T.prototype.getXxx作为keySelector\n */\n getOrNull<K>(keySelector: KeySelector<T, K>, key: K): T | undefined {\n return this.getValueMap(keySelector).get(key)\n }\n\n get<K>(keySelector: KeySelector<T, K>, key: K): T {\n return this.getOrNull(keySelector, key) ?? throwError(`key(${key})不存在与valueMap(${this.getValueMap(keySelector)})中`)\n }\n}\n\n/** 缓存的值 */\nexport class CachedValue<T> {\n private value: T | undefined\n constructor(private creator: () => T) { noop() }\n get(): T {\n if (this.value === undefined) {\n this.value = this.creator()\n }\n return this.value\n }\n}\n","import { noop } from '../../../utils/utils'\nimport { KeyValue } from '../../../utils/values'\nimport type { UnionControl } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport enum ControlPosition {\n /** 左上 */\n TOP_LEFT = 'top-left',\n TOP_CENTER = 'top-center',\n /** 右上 */\n TOP_RIGHT = 'top-right',\n BOTTOM_LEFT = 'bottom-left',\n BOTTOM_CENTER = 'bottom-center',\n BOTTOM_RIGHT = 'bottom-right',\n LEFT_TOP = 'left-top',\n LEFT_CENTER = 'left-center',\n /** 左下 */\n LEFT_BOTTOM = 'left-bottom',\n RIGHT_TOP = 'right-top',\n RIGHT_CENTER = 'right-center',\n /** 右下 */\n RIGHT_BOTTOM = 'right-bottom',\n}\n\nexport namespace ControlPositionConverter {\n let baiduKeyValue: KeyValue<ControlPosition, BMap.ControlAnchor> | undefined\n let googleKeyValue: KeyValue<ControlPosition, google.maps.ControlPosition> | undefined\n const controlPositionValues = [\n ControlPosition.TOP_LEFT,\n ControlPosition.TOP_CENTER,\n ControlPosition.TOP_RIGHT,\n ControlPosition.BOTTOM_LEFT,\n ControlPosition.BOTTOM_CENTER,\n ControlPosition.BOTTOM_RIGHT,\n ControlPosition.LEFT_TOP,\n ControlPosition.LEFT_CENTER,\n ControlPosition.LEFT_BOTTOM,\n ControlPosition.RIGHT_TOP,\n ControlPosition.RIGHT_CENTER,\n ControlPosition.RIGHT_BOTTOM,\n ]\n export function getBaidu() {\n if (!baiduKeyValue) {\n // 延迟初始化, 防止取不到`BMAP_*`的值\n // 反向映射存在一对多的情况, 取index最小的那个值\n baiduKeyValue = new KeyValue(controlPositionValues, [\n /* | @tg/map |名字相同| baidu | */\n /* TOP_LEFT = */ BMAP_ANCHOR_TOP_LEFT,\n /* TOP_CENTER */ BMAP_ANCHOR_TOP_LEFT,\n /* TOP_RIGHT = */ BMAP_ANCHOR_TOP_RIGHT,\n /* BOTTOM_LEFT = */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* BOTTOM_CENTER */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* BOTTOM_RIGHT = */ BMAP_ANCHOR_BOTTOM_RIGHT,\n /* LEFT_TOP */ BMAP_ANCHOR_TOP_LEFT,\n /* LEFT_CENTER */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* LEFT_BOTTOM */ BMAP_ANCHOR_BOTTOM_LEFT,\n /* RIGHT_TOP */ BMAP_ANCHOR_TOP_RIGHT,\n /* RIGHT_CENTER */ BMAP_ANCHOR_BOTTOM_RIGHT,\n /* RIGHT_BOTTOM */ BMAP_ANCHOR_BOTTOM_RIGHT,\n ])\n }\n return baiduKeyValue\n }\n export function getGoogle() {\n if (!googleKeyValue) {\n // 同上\n googleKeyValue = new KeyValue(controlPositionValues, [\n google.maps.ControlPosition.TOP_LEFT,\n google.maps.ControlPosition.TOP_CENTER,\n google.maps.ControlPosition.TOP_RIGHT,\n google.maps.ControlPosition.BOTTOM_LEFT,\n google.maps.ControlPosition.BOTTOM_CENTER,\n google.maps.ControlPosition.BOTTOM_RIGHT,\n google.maps.ControlPosition.LEFT_TOP,\n google.maps.ControlPosition.LEFT_CENTER,\n google.maps.ControlPosition.LEFT_BOTTOM,\n google.maps.ControlPosition.RIGHT_TOP,\n google.maps.ControlPosition.RIGHT_CENTER,\n google.maps.ControlPosition.RIGHT_BOTTOM,\n ])\n }\n return googleKeyValue\n }\n}\n\n/**\n * 自定义的Control\n * @see BaiduMap.addCustomControl\n * @see GoogleMap.addCustomControl\n * */\nexport abstract class CustomControl {\n /** 实际添加到地图中的control对象 */\n inner?: UnionControl\n constructor(\n public position: ControlPosition,\n ) {\n noop()\n }\n /** 创建UI元素 */\n abstract onCreateElement(): HTMLElement\n}\n\n/** 内置的Control */\nexport abstract class AbstractControl {\n abstract isVisible(): boolean\n abstract setVisible(visible: boolean): void\n abstract getPosition(): ControlPosition\n abstract setPosition(position: ControlPosition): void\n abstract addTo(map: AbstractMap): void\n abstract removeFrom(map: AbstractMap): void\n}\n\n/** Control的空实现 */\nexport class EmptyControl extends AbstractControl {\n constructor(\n private visible: boolean,\n private position: ControlPosition,\n ) {\n super()\n }\n override isVisible(): boolean {\n return this.visible\n }\n override setVisible(visible: boolean): void {\n this.visible = visible\n }\n override getPosition(): ControlPosition {\n return this.position\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n }\n override addTo(_map: AbstractMap): void {\n }\n override removeFrom(_map: AbstractMap): void {\n }\n}\n\n/**\n * baidu内置的Control\n * - NavigationControl\n * - OverviewMapControl\n * - ScaleControl\n * - MapTypeControl\n * - CopyrightControl\n * - GeolocationControl\n */\nexport class BaiduControl<CONTROL extends BMap.Control = BMap.Control> extends AbstractControl {\n constructor(\n private inner: CONTROL,\n /** 由于@tg/map的position和baidu的position是多对一的关系, 为了防止set后再get, 得到不同的值, 应该用this.position保存set的值 */\n private position?: ControlPosition,\n ) {\n super()\n }\n override isVisible() {\n return this.inner.isVisible()\n }\n override setVisible(visible: boolean) {\n visible ? this.inner.show() : this.inner.hide()\n }\n override getPosition(): ControlPosition {\n return this.position ?? ControlPositionConverter.getBaidu().toKey(this.inner.getAnchor())\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n this.inner.setAnchor(ControlPositionConverter.getBaidu().toValue(position))\n }\n override addTo(map: BaiduMap): void {\n map.innerMap.addControl(this.inner)\n }\n override removeFrom(map: BaiduMap): void {\n map.innerMap.removeControl(this.inner)\n }\n}\n\nexport type GoogleControlType = 'zoom' | 'mapType' | 'scale' | 'streetView' | 'rotate' | 'fullscreen'\n\n/**\n * google内置的Control\n * - ZoomControl\n * - MapTypeControl\n * - ScaleControl\n * - StreetViewControl\n * - RotateControl\n * - FullscreenControl\n */\nexport class GoogleControl extends AbstractControl {\n visible = false\n private map: GoogleMap | undefined\n constructor(\n private _type: GoogleControlType,\n /** 每种类型的position的初始值不一样, 需要外部传入 */\n private position: ControlPosition,\n ) {\n super()\n }\n override isVisible(): boolean {\n return this.visible\n }\n override setVisible(visible: boolean): void {\n this.visible = visible\n this.tryUpdateOptions()\n }\n override getPosition(): ControlPosition {\n return this.position\n }\n override setPosition(position: ControlPosition): void {\n this.position = position\n this.tryUpdateOptions()\n }\n\n override addTo(map: GoogleMap): void {\n if (!this.map) {\n this.map = map\n this.setVisible(true)\n }\n }\n override removeFrom(/* map: GoogleMap */): void {\n if (this.map) {\n // 没有remove方法, 只能把visible设为false\n this.setVisible(false)\n this.map = undefined\n }\n }\n\n protected onCreateOptions(): any {\n return {\n position: ControlPositionConverter.getGoogle().toValue(this.position),\n }\n }\n\n protected tryUpdateOptions() {\n if (this.map) {\n this.map.innerMap.setOptions({\n [`${this._type}Control`]: this.visible,\n [`${this._type}ControlOptions`]: this.onCreateOptions(),\n })\n }\n }\n}\n","import { noop, throwUnsupported } from '../../utils/utils'\nimport { CachedValue, FastFindValues } from '../../utils/values'\nimport { CoordType } from '../lat-lng'\nimport type { Point } from '../types'\nimport type { GoogleLayer } from '../unions'\n\n/**\n * 内置地图的id\n */\nexport enum BuildInMapTypeId {\n normal = 'normal',\n satellite = 'satellite',\n hybrid = 'hybrid',\n}\n\n/**\n * 包括不兼容的地图类型\n * - 'terrain': google中为地形图, baidu中为三维图\n * */\nexport type BuildInMapTypeIdIncludeIncompatible = BuildInMapTypeId | 'terrain'\n\n/**\n * ## 注意\n * `asXxx()`多次调用时应返回同一个对象\n */\nexport interface MapType {\n /** MapType的唯一标识符, 命名时推荐包含`-`, 防止和BuildInMapTypeId冲突 */\n id: string\n\n getBaiduCoordType(): CoordType\n asBaiduMapType(): BaiduMapType\n\n getGoogleCoordType(): CoordType\n asGoogleMapType(): GoogleMapType\n}\n\nexport interface Layer {\n asBaiduLayer(): BMap.TileLayer\n asGoogleLayer(): GoogleLayer\n}\n\n/**\n * 同时实现`MapType`和`Layer`的对象被称作`OverlayMapType`\n * - 往google中添加`OverlayMapType`, 将被看作`MapType`\n * - 往baidu中添加`OverlayMapType`, 将被看作`Layer`\n * @see TgMap.addOverlayMapType\n * @see TgMap.removeOverlayMapType\n * @see ImageMapType\n */\nexport type OverlayMapType = MapType & Layer\n\nexport class BuildInMapType implements MapType {\n constructor(\n public id: BuildInMapTypeIdIncludeIncompatible,\n private baidu: () => BMap.MapType, // 需要延迟初始化, 故写成方法\n private google: () => google.maps.MapTypeId, // 同上\n private googleCoordType: CoordType,\n ) { noop() }\n\n getId() {\n return this.id\n }\n\n getBaiduCoordType() {\n // 百度地图的坐标都是bd09\n return CoordType.bd09\n }\n asBaiduMapType(): BaiduMapType {\n // 内置的MapType会做特殊处理, 不需要设置 __baidu_map_type__\n return this.baidu()\n }\n\n getGoogleCoordType() {\n return this.googleCoordType\n }\n /** 内置地图的id和google的id是不一样的 */\n getGoogleMapTypeId(): google.maps.MapTypeId {\n return this.google()\n }\n asGoogleMapType(): GoogleMapType {\n throwUnsupported('google的内置地图没有对应的实例')\n }\n}\nexport type GoogleMapType = google.maps.MapType & {\n /** 需要在创建实例时设置该值 */\n __google_map_type__?: MapType\n}\nexport type BaiduMapType = BMap.MapType & {\n /** 需要在创建实例时设置该值 */\n __baidu_map_type__?: MapType\n}\n\nexport interface ImageMapTypeOptions {\n readonly id: string\n /**\n * @param tileCoord 统一成google的瓦片坐标, 原点在左上角\n * @returns 返回值可以为空\n */\n getTileUrl: (tileCoord: Point, zoom: number) => string | null\n maxZoom: number\n minZoom?: number\n name: string\n describe?: string\n}\n\n/**\n * ImageMapType应该同时实现MapType和Layer接口\n */\nexport class ImageMapType implements OverlayMapType {\n private baiduLayerCached = new CachedValue(() => {\n const layer = new BMap.TileLayer({})\n layer.getTilesUrl = (tileCoord: BMap.Pixel, zoom: number): string => {\n // 转换成google形式的瓦片坐标\n // x: -2,-1,0,1 => 0,1,2,3\n // y: 1,0,-1,-2 => 0,1,2,3\n const halfTileRange = Math.pow(2, zoom - 1)\n const x = tileCoord.x + halfTileRange\n const y = halfTileRange - 1 - tileCoord.y\n return this.options.getTileUrl({ x, y }, zoom)! // 返回值为空也没有问题, 可以强转\n }\n return layer\n })\n private baiduMapTypeCached = new CachedValue(() => {\n const baiduMapType: BaiduMapType = new BMap.MapType(this.options.name, this.baiduLayerCached.get(), {\n maxZoom: this.options.maxZoom,\n minZoom: this.options.minZoom,\n tips: this.options.describe,\n })\n baiduMapType.__baidu_map_type__ = this\n return baiduMapType\n })\n private googleCached = new CachedValue(() => {\n const googleMapType: GoogleMapType = new google.maps.ImageMapType({\n getTileUrl: (tileCoord: google.maps.Point, zoom: number): string => {\n return this.options.getTileUrl(tileCoord, zoom)! // 同上\n },\n tileSize: new google.maps.Size(256, 256),\n name: this.options.name,\n alt: this.options.describe,\n maxZoom: this.options.maxZoom,\n minZoom: this.options.minZoom,\n })\n googleMapType.__google_map_type__ = this\n return googleMapType\n })\n constructor(\n public coordType: CoordType,\n public options: ImageMapTypeOptions,\n ) {\n noop()\n }\n get id() {\n return this.options.id\n }\n\n getBaiduCoordType() {\n return this.coordType\n }\n asBaiduMapType(): BaiduMapType {\n return this.baiduMapTypeCached.get()\n }\n asBaiduLayer(): BMap.TileLayer {\n return this.baiduLayerCached.get()\n }\n\n getGoogleCoordType() {\n return this.coordType\n }\n asGoogleMapType(): GoogleMapType {\n return this.googleCached.get()\n }\n asGoogleLayer(): GoogleLayer {\n throwUnsupported('这个方法不会被调用')\n }\n}\n\n/** 交通流量图层 */\nexport class TrafficLayer implements Layer {\n private baiduCache = new CachedValue(() => new BMap.TrafficLayer())\n private googleCache = new CachedValue(() => new google.maps.TrafficLayer())\n asBaiduLayer(): BMap.TileLayer {\n return this.baiduCache.get()\n }\n asGoogleLayer(): GoogleLayer {\n return this.googleCache.get()\n }\n}\n\nexport namespace MapType {\n export const NORMAL = new BuildInMapType(BuildInMapTypeId.normal, () => BMAP_NORMAL_MAP, () => google.maps.MapTypeId.ROADMAP, CoordType.gcj02)\n export const SATELLITE = new BuildInMapType(BuildInMapTypeId.satellite, () => BMAP_SATELLITE_MAP, () => google.maps.MapTypeId.SATELLITE, CoordType.wgs84)\n export const HYBRID = new BuildInMapType(BuildInMapTypeId.hybrid, () => BMAP_HYBRID_MAP, () => google.maps.MapTypeId.HYBRID, CoordType.gcj02)\n export const TERRAIN = new BuildInMapType('terrain', () => /* 三维 */BMAP_PERSPECTIVE_MAP, () => /* 地形 */google.maps.MapTypeId.TERRAIN, CoordType.wgs84)\n export const BUILD_IN_MAP_TYPES = new FastFindValues([NORMAL, SATELLITE, HYBRID, TERRAIN])\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { BuildInMapType, MapType } from '../map-type'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface MapTypeControl extends AbstractControl {\n}\n\nexport enum MapTypeControlType {\n DEFAULT = 'default',\n HORIZONTAL = 'horizontal',\n DROPDOWN = 'dropdown',\n}\n\nconst MAP_TYPES_DEFAULT = [MapType.NORMAL, MapType.SATELLITE, MapType.HYBRID]\n\nexport interface MapTypeControlOptions {\n position?: ControlPosition\n type?: MapTypeControlType\n /** @default MAP_TYPES_DEFAULT 这有这些mapTypes才是各种地图都兼容的 */\n mapTypes?: MapType[]\n}\n\nexport class BaiduMapTypeControl extends BaiduControl<BMap.MapTypeControl> implements MapTypeControl {\n static create(this: BaiduMap, options: MapTypeControlOptions) {\n const mapTypes = options.mapTypes ?? MAP_TYPES_DEFAULT\n const type2baidu = {\n [MapTypeControlType.DEFAULT]: BMAP_MAPTYPE_CONTROL_HORIZONTAL,\n [MapTypeControlType.HORIZONTAL]: BMAP_MAPTYPE_CONTROL_HORIZONTAL,\n [MapTypeControlType.DROPDOWN]: BMAP_MAPTYPE_CONTROL_DROPDOWN,\n }\n const inner = new BMap.MapTypeControl({\n type: options.type && type2baidu[options.type],\n mapTypes: mapTypes.map(it => it.asBaiduMapType()),\n })\n if (options.position) {\n inner.setAnchor(ControlPositionConverter.getBaidu().toValue(options.position))\n }\n return new BaiduMapTypeControl(inner, options.position)\n }\n}\n\nexport class GoogleMapTypeControl extends GoogleControl implements MapTypeControl {\n static create(this: GoogleMap, options: MapTypeControlOptions) {\n return new GoogleMapTypeControl(options.type, options.position, options.mapTypes)\n }\n private static type2google: { [k in MapTypeControlType]: google.maps.MapTypeControlStyle }\n constructor(\n public type: MapTypeControlType = MapTypeControlType.DEFAULT,\n position: ControlPosition = ControlPosition.TOP_LEFT,\n private mapTypes: MapType[] = MAP_TYPES_DEFAULT,\n ) {\n super('mapType', position)\n if (!GoogleMapTypeControl.type2google) {\n GoogleMapTypeControl.type2google = {\n [MapTypeControlType.DEFAULT]: google.maps.MapTypeControlStyle.DEFAULT,\n [MapTypeControlType.HORIZONTAL]: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,\n [MapTypeControlType.DROPDOWN]: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\n }\n }\n }\n override onCreateOptions(): any {\n const options: google.maps.MapTypeControlOptions = super.onCreateOptions()\n options.style = GoogleMapTypeControl.type2google[this.type]\n options.mapTypeIds = this.mapTypes.map(it => it instanceof BuildInMapType ? it.getGoogleMapTypeId() : it.id)\n return options\n }\n override addTo(map: GoogleMap): void {\n super.addTo(map)\n this.mapTypes.forEach(mapType => {\n if (!(mapType instanceof BuildInMapType)) {\n // 非内置地图需要注册地图实例\n map.innerMap.mapTypes.set(mapType.id, mapType.asGoogleMapType())\n }\n })\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface ScaleControl extends AbstractControl {\n\n}\n\nexport interface ScaleControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduScaleControl extends BaiduControl implements ScaleControl {\n static create(this: BaiduMap, options: ScaleControlOptions) {\n const inner = new BMap.ScaleControl({\n anchor: options.position && ControlPositionConverter.getBaidu().toValue(options.position),\n })\n return new BaiduScaleControl(inner, options.position)\n }\n}\n\nexport class GoogleScaleControl extends GoogleControl implements ScaleControl {\n static create(this: GoogleMap, options: ScaleControlOptions) {\n return new GoogleScaleControl(options.position)\n }\n\n constructor(position: ControlPosition = ControlPosition.BOTTOM_RIGHT) {\n super('scale', position)\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, ControlPosition, EmptyControl, GoogleControl } from './control'\n\n/**\n * ## 不同实现\n * - google: 支持街景控件\n * - baidu: 不支持, {@link BaiduStreetViewControl}是一个空实现\n */\nexport interface StreetViewControl extends AbstractControl {\n}\n\nexport interface StreetViewControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduStreetViewControl extends EmptyControl implements StreetViewControl {\n static create(this: BaiduMap, options: StreetViewControlOptions) {\n return new BaiduStreetViewControl(true, options.position ?? ControlPosition.RIGHT_BOTTOM)\n }\n}\n\nexport class GoogleStreetViewControl extends GoogleControl implements StreetViewControl {\n static create(this: GoogleMap, options: StreetViewControlOptions) {\n return new GoogleStreetViewControl(options.position)\n }\n constructor(position: ControlPosition = ControlPosition.RIGHT_BOTTOM) {\n super('streetView', position)\n }\n}\n","import type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { AbstractControl, BaiduControl, ControlPosition, ControlPositionConverter, GoogleControl } from './control'\n\nexport interface ZoomControl extends AbstractControl {\n}\n\nexport interface ZoomControlOptions {\n position?: ControlPosition\n}\n\nexport class BaiduZoomControl extends BaiduControl<BMap.NavigationControl> implements ZoomControl {\n static create(this: BaiduMap, options: ZoomControlOptions) {\n const inner = new BMap.NavigationControl({\n type: BMAP_NAVIGATION_CONTROL_ZOOM,\n // enableGeolocation: true,\n anchor: options.position && ControlPositionConverter.getBaidu().toValue(options.position),\n })\n return new BaiduZoomControl(inner, options.position)\n }\n}\n\nexport class GoogleZoomControl extends GoogleControl implements ZoomControl {\n static create(this: GoogleMap, options: ZoomControlOptions) {\n return new GoogleZoomControl(options.position)\n }\n constructor(position: ControlPosition = ControlPosition.RIGHT_BOTTOM) {\n super('zoom', position)\n }\n}\n","import { LatLng, type CoordTypeSupplier } from '../map/lat-lng'\nimport type { Place } from '../map/map/extra/places-service'\n\n/**\n * Google地图官方提供的载入方式, 使用{@link google.map.importLibrary}动态载入依赖\n *\n * 实验性的特性, 实测当前只有`3.52`版支持\n *\n * @see https://developers.google.com/maps/documentation/javascript/load-maps-js-api#dynamic-library-import\n */\nexport function initGoogleMapDynamicLibraryImport(args: {\n key: string,\n v?: string,\n // Add other bootstrap parameters as needed, using camel case.\n // Use the 'v' parameter to indicate the version to load (alpha, beta, weekly, etc.)\n}) {\n let promise: Promise<unknown> | undefined | void\n let script\n let arg\n const googleTitle = 'The Google Maps JavaScript API'\n const googleName = 'google'\n const importMethod = 'importLibrary'\n const callbackId = '__ib__'\n const dom = document\n const global: any = window\n const google: any = global[googleName] || (global[googleName] = {})\n const googleMaps = google.maps || (google.maps = {})\n const libraries = new Set()\n const url = new URLSearchParams()\n // eslint-disable-next-line no-async-promise-executor\n const loader = () => promise || (promise = new Promise(async(resolve, reject) => {\n await (script = dom.createElement('script'))\n url.set('libraries', [...libraries] + '')\n for (arg in args) url.set(arg.replace(/[A-Z]/g, t => '_' + t[0].toLowerCase()), (args as any)[arg])\n url.set('callback', googleName + '.maps.' + callbackId)\n script.src = `https://maps.${googleName}apis.com/maps/api/js?` + url\n googleMaps[callbackId] = resolve\n // eslint-disable-next-line no-return-assign\n script.onerror = () => promise = reject(Error(googleTitle + ' could not load.'))\n script.nonce = (dom.querySelector('script[nonce]') as HTMLScriptElement)?.nonce || ''\n dom.head.append(script)\n }))\n googleMaps[importMethod]\n ? console.warn(googleTitle + ' only loads once. Ignoring:', args)\n : googleMaps[importMethod] = (library: string, ...rest: string[]) => libraries.add(library) && loader().then(() => googleMaps[importMethod](library, ...rest))\n}\n\nlet _LATLNG_ZERO: google.maps.LatLng | undefined\nlet _BOUNDS_ZERO: google.maps.LatLngBounds | undefined\n\nexport const GoogleConst = {\n /** Google的坐标0点 */\n get LATLNG_ZERO() {\n return (_LATLNG_ZERO ??= new google.maps.LatLng({ lat: 0, lng: 0 }))\n },\n get BOUNDS_ZERO() {\n return (_BOUNDS_ZERO ??= new google.maps.LatLngBounds(this.LATLNG_ZERO, this.LATLNG_ZERO))\n },\n}\n\nexport interface AddressFields{\n /** 国家 */\n country: string\n /** 省 */\n province: string\n /** 市 */\n city: string\n /** 区 */\n district: string\n /** 街道 */\n street: string\n /** 门牌号 */\n streetNumber: string\n}\n\nexport function parseGoogleAddressComponents(\n addressComponents: google.maps.GeocoderAddressComponent[],\n outResult: AddressFields = { country: '', province: '', city: '', district: '', street: '', streetNumber: '' },\n): AddressFields {\n for (const component of addressComponents) {\n for (const type of component.types) {\n switch (type) {\n case 'street_number':\n outResult.streetNumber = component.long_name\n break\n case 'route':\n outResult.street = component.long_name\n break\n case 'locality':\n outResult.city = component.long_name\n break\n case 'sublocality':\n outResult.district = component.long_name\n break\n case 'administrative_area_level_1':\n outResult.province = component.long_name\n break\n case 'country':\n outResult.country = component.long_name\n break\n }\n }\n }\n return outResult\n}\n\nexport function parseGooglePlace(place: google.maps.places.PlaceResult, coordTypeSupplier: CoordTypeSupplier) : Place {\n const fields = place.address_components && parseGoogleAddressComponents(place.address_components)\n return {\n country: fields?.country ?? '',\n province: fields?.province ?? '',\n city: fields?.city ?? '',\n id: place.place_id ?? '',\n address: place.formatted_address ?? '',\n position: LatLng.fromGoogle(place.geometry?.location ?? GoogleConst.LATLNG_ZERO, coordTypeSupplier.coordType),\n title: place.name ?? '',\n }\n}\n","import type { EventCallback, LatLngBounds } from '../../../components'\nimport { parseGoogleAddressComponents, type AddressFields } from '../../../utils/google-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { Tg } from '../../event'\nimport { addBaiduEventListener, addGoogleEventListener, addHtmlEventListener, addTgEventListener, type RemoveEventListenerFunction } from '../../event-target'\nimport type { UnionAutocomplete } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport interface AutocompleteResult extends AddressFields {\n /** 名字 */\n title: string\n}\n\nexport interface AutocompleteOptions {\n input: HTMLInputElement\n /** 将{@link Autocomplete.setBounds}自动设为地图的当前范围 */\n bindToMap?: boolean\n}\n\n/**\n * 该类没有太多事件, 故没有去实现{@link Tg.EventTarget}接口\n */\nexport abstract class Autocomplete {\n abstract inner: UnionAutocomplete\n abstract map: AbstractMap\n\n abstract addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction\n abstract setBounds(bounds: LatLngBounds):void\n}\n\nexport class GoogleAutocomplete extends Autocomplete {\n inner: google.maps.places.Autocomplete\n constructor(public map: GoogleMap, options: AutocompleteOptions) {\n super()\n this.inner = new google.maps.places.Autocomplete(options.input, {\n fields: [\n 'address_components',\n // 'formatted_address',\n 'name',\n ],\n })\n if (options.bindToMap) {\n this.inner.bindTo('bounds', map.innerMap)\n }\n }\n\n override setBounds(bounds: LatLngBounds): void {\n this.inner.setBounds(bounds.toGoogle(this.map.coordType))\n }\n\n override addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction {\n return addGoogleEventListener(this.inner, 'place_changed', () => {\n const place = this.inner.getPlace()\n const result: AutocompleteResult = {\n title: place.name ?? '',\n province: '',\n city: '',\n district: '',\n street: '',\n streetNumber: '',\n country: '',\n }\n if (place.address_components) {\n // 包含地址字段才是从下拉框选择的, 否则是直接回车的结果\n parseGoogleAddressComponents(place.address_components, result)\n }\n listener(result)\n })\n }\n}\nexport class BaiduAutocomplete extends Autocomplete {\n inner: BMap.Autocomplete\n private input: HTMLInputElement\n // TODO: 要不要添加个移除监听的方法?\n private removeableArray: RemoveEventListenerFunction[] = []\n constructor(public map: BaiduMap, options: AutocompleteOptions) {\n super()\n this.input = options.input\n this.inner = new BMap.Autocomplete({\n input: options.input,\n location: options.bindToMap ? map.innerMap : undefined,\n })\n if (options.bindToMap) {\n const onBoundsChanged = () => {\n this.inner.setLocation(this.map.innerMap)\n }\n this.removeableArray.push(addTgEventListener(this.map, 'center-changed', onBoundsChanged))\n this.removeableArray.push(addTgEventListener(this.map, 'zoom-changed', onBoundsChanged))\n }\n }\n\n override setBounds(bounds: LatLngBounds): void {\n this.inner.setLocation(bounds.getCenter().toBaidu(this.map.coordType))\n }\n\n override addResultListener(listener: EventCallback<AutocompleteResult>): RemoveEventListenerFunction {\n let confirmEventTimestamp = 0\n const removeOnConfirm = addBaiduEventListener(this.inner, 'confirm', (event: { item: { value: BMap.AutocompleteResultPoi } }) => {\n const place = event.item.value\n confirmEventTimestamp = Date.now()\n listener(Object.assign({\n title: place.business,\n country: '', // Baidu的自动完成只支持中国\n }, place))\n })\n // 模仿google, 回车也触发监听\n const removeOnKeyup = addHtmlEventListener(this.input, 'keyup', (event) => {\n if (event.key === 'Enter') {\n if (Date.now() - confirmEventTimestamp > 100) {\n listener({\n title: this.input.value,\n country: '',\n city: '',\n district: '',\n province: '',\n street: '',\n streetNumber: '',\n })\n } else {\n // Enter同时触发了confirm事件, 则需要忽略\n }\n }\n })\n\n return () => {\n removeOnKeyup()\n removeOnConfirm()\n }\n }\n}\n","/*\n * heatmap.js v2.0.0 | JavaScript Heatmap Library\n *\n * Copyright 2008-2014 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved.\n * Dual licensed under MIT and Beerware license \n *\n * :: 2014-10-31 21:16\n */\n(function (root, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n root.BMapLib = root.BMapLib || {};\n root.BMapLib.Heatmap = root.BMapLib.Heatmap || factory();\n }\n})(this, function () {\n const heatmapFactory = (function () {\n // Heatmap Config stores default values and will be merged with instance config\n var HeatmapConfig = {\n defaultRadius: 40,\n defaultRenderer: 'canvas2d',\n defaultGradient: { 0.45: \"rgb(0,0,255)\", 0.55: \"rgb(0,255,255)\", 0.65: \"rgb(0,255,0)\", 0.95: \"yellow\", 1.0: \"rgb(255,0,0)\" },\n defaultMaxOpacity: 1,\n defaultMinOpacity: 0,\n defaultBlur: .85,\n defaultXField: 'x',\n defaultYField: 'y',\n defaultValueField: 'value',\n plugins: {}\n };\n var Store = (function StoreClosure() {\n\n var Store = function Store(config) {\n this._coordinator = {};\n this._data = [];\n this._radi = [];\n this._min = 0;\n this._max = 1;\n this._xField = config['xField'] || config.defaultXField;\n this._yField = config['yField'] || config.defaultYField;\n this._valueField = config['valueField'] || config.defaultValueField;\n\n if (config[\"radius\"]) {\n this._cfgRadius = config[\"radius\"];\n }\n };\n\n var defaultRadius = HeatmapConfig.defaultRadius;\n\n Store.prototype = {\n // when forceRender = false -> called from setData, omits renderall event\n _organiseData: function (dataPoint, forceRender) {\n var x = dataPoint[this._xField];\n var y = dataPoint[this._yField];\n var radi = this._radi;\n var store = this._data;\n var max = this._max;\n var min = this._min;\n var value = dataPoint[this._valueField] || 1;\n var radius = dataPoint.radius || this._cfgRadius || defaultRadius;\n\n if (!store[x]) {\n store[x] = [];\n radi[x] = [];\n }\n\n if (!store[x][y]) {\n store[x][y] = value;\n radi[x][y] = radius;\n } else {\n store[x][y] += value;\n }\n\n if (store[x][y] > max) {\n if (!forceRender) {\n this._max = store[x][y];\n } else {\n this.setDataMax(store[x][y]);\n }\n return false;\n } else {\n return {\n x: x,\n y: y,\n value: value,\n radius: radius,\n min: min,\n max: max\n };\n }\n },\n _unOrganizeData: function () {\n var unorganizedData = [];\n var data = this._data;\n var radi = this._radi;\n\n for (var x in data) {\n for (var y in data[x]) {\n\n unorganizedData.push({\n x: x,\n y: y,\n radius: radi[x][y],\n value: data[x][y]\n });\n\n }\n }\n return {\n min: this._min,\n max: this._max,\n data: unorganizedData\n };\n },\n _onExtremaChange: function () {\n this._coordinator.emit('extremachange', {\n min: this._min,\n max: this._max\n });\n },\n addData: function () {\n if (arguments[0].length > 0) {\n var dataArr = arguments[0];\n var dataLen = dataArr.length;\n while (dataLen--) {\n this.addData.call(this, dataArr[dataLen]);\n }\n } else {\n // add to store \n var organisedEntry = this._organiseData(arguments[0], true);\n if (organisedEntry) {\n this._coordinator.emit('renderpartial', {\n min: this._min,\n max: this._max,\n data: [organisedEntry]\n });\n }\n }\n return this;\n },\n setData: function (data) {\n var dataPoints = data.data;\n var pointsLen = dataPoints.length;\n\n\n // reset data arrays\n this._data = [];\n this._radi = [];\n\n for (var i = 0; i < pointsLen; i++) {\n this._organiseData(dataPoints[i], false);\n }\n this._max = data.max;\n this._min = data.min || 0;\n\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n removeData: function () {\n // TODO: implement\n },\n setDataMax: function (max) {\n this._max = max;\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n setDataMin: function (min) {\n this._min = min;\n this._onExtremaChange();\n this._coordinator.emit('renderall', this._getInternalData());\n return this;\n },\n setCoordinator: function (coordinator) {\n this._coordinator = coordinator;\n },\n _getInternalData: function () {\n return {\n max: this._max,\n min: this._min,\n data: this._data,\n radi: this._radi\n };\n },\n getData: function () {\n return this._unOrganizeData();\n }/*,\n\n // TODO: rethink.\n getValueAt: function (point) {\n var value;\n var radius = 100;\n var x = point.x;\n var y = point.y;\n var data = this._data;\n\n if (data[x] && data[x][y]) {\n return data[x][y];\n } else {\n var values = [];\n // radial search for datapoints based on default radius\n for (var distance = 1; distance < radius; distance++) {\n var neighbors = distance * 2 + 1;\n var startX = x - distance;\n var startY = y - distance;\n\n for (var i = 0; i < neighbors; i++) {\n for (var o = 0; o < neighbors; o++) {\n if ((i == 0 || i == neighbors - 1) || (o == 0 || o == neighbors - 1)) {\n if (data[startY + i] && data[startY + i][startX + o]) {\n values.push(data[startY + i][startX + o]);\n }\n } else {\n continue;\n }\n }\n }\n }\n if (values.length > 0) {\n return Math.max.apply(Math, values);\n }\n }\n return false;\n }*/\n };\n\n\n return Store;\n })();\n\n var Canvas2dRenderer = (function Canvas2dRendererClosure() {\n\n var _getColorPalette = function (config) {\n var gradientConfig = config.gradient || config.defaultGradient;\n var paletteCanvas = document.createElement('canvas');\n var paletteCtx = paletteCanvas.getContext('2d');\n\n paletteCanvas.width = 256;\n paletteCanvas.height = 1;\n\n var gradient = paletteCtx.createLinearGradient(0, 0, 256, 1);\n for (var key in gradientConfig) {\n gradient.addColorStop(key, gradientConfig[key]);\n }\n\n paletteCtx.fillStyle = gradient;\n paletteCtx.fillRect(0, 0, 256, 1);\n\n return paletteCtx.getImageData(0, 0, 256, 1).data;\n };\n\n var _getPointTemplate = function (radius, blurFactor) {\n var tplCanvas = document.createElement('canvas');\n var tplCtx = tplCanvas.getContext('2d');\n var x = radius;\n var y = radius;\n tplCanvas.width = tplCanvas.height = radius * 2;\n\n if (blurFactor == 1) {\n tplCtx.beginPath();\n tplCtx.arc(x, y, radius, 0, 2 * Math.PI, false);\n tplCtx.fillStyle = 'rgba(0,0,0,1)';\n tplCtx.fill();\n } else {\n var gradient = tplCtx.createRadialGradient(x, y, radius * blurFactor, x, y, radius);\n gradient.addColorStop(0, 'rgba(0,0,0,1)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n tplCtx.fillStyle = gradient;\n tplCtx.fillRect(0, 0, 2 * radius, 2 * radius);\n }\n\n\n\n return tplCanvas;\n };\n\n var _prepareData = function (data) {\n var renderData = [];\n var min = data.min;\n var max = data.max;\n var radi = data.radi;\n var data = data.data;\n\n var xValues = Object.keys(data);\n var xValuesLen = xValues.length;\n\n while (xValuesLen--) {\n var xValue = xValues[xValuesLen];\n var yValues = Object.keys(data[xValue]);\n var yValuesLen = yValues.length;\n while (yValuesLen--) {\n var yValue = yValues[yValuesLen];\n var value = data[xValue][yValue];\n var radius = radi[xValue][yValue];\n renderData.push({\n x: xValue,\n y: yValue,\n value: value,\n radius: radius\n });\n }\n }\n\n return {\n min: min,\n max: max,\n data: renderData\n };\n };\n\n\n function Canvas2dRenderer(config) {\n var container = config.element;\n var shadowCanvas = this.shadowCanvas = document.createElement('canvas');\n var canvas = this.canvas = config.canvas || document.createElement('canvas');\n var renderBoundaries = this._renderBoundaries = [10000, 10000, 0, 0];\n\n var computed = getComputedStyle(config.element) || {};\n\n canvas.className = 'heatmap-canvas';\n\n this._width = canvas.width = shadowCanvas.width = +(computed.width.replace(/px/, ''));\n this._height = canvas.height = shadowCanvas.height = +(computed.height.replace(/px/, ''));\n\n this.shadowCtx = shadowCanvas.getContext('2d');\n this.ctx = canvas.getContext('2d');\n\n // @TODO:\n // conditional wrapper\n\n canvas.style.cssText = shadowCanvas.style.cssText = 'position:absolute;left:0;top:0;';\n\n container.style.position = 'relative';\n container.appendChild(canvas);\n\n this._palette = _getColorPalette(config);\n this._templates = {};\n\n this._setStyles(config);\n };\n\n Canvas2dRenderer.prototype = {\n renderPartial: function (data) {\n this._drawAlpha(data);\n this._colorize();\n },\n renderAll: function (data) {\n // reset render boundaries\n this._clear();\n this._drawAlpha(_prepareData(data));\n this._colorize();\n },\n _updateGradient: function (config) {\n this._palette = _getColorPalette(config);\n },\n updateConfig: function (config, oldConfig) {\n if (config.gradient !== oldConfig.gradient) {\n this._updateGradient(config);\n }\n this._setStyles(config);\n },\n setDimensions: function (width, height) {\n this._width = width;\n this._height = height;\n this.canvas.width = this.shadowCanvas.width = width;\n this.canvas.height = this.shadowCanvas.height = height;\n },\n _clear: function () {\n this.shadowCtx.clearRect(0, 0, this._width, this._height);\n this.ctx.clearRect(0, 0, this._width, this._height);\n },\n _setStyles: function (config) {\n this._blur = (config.blur == 0) ? 0 : (config.blur || config.defaultBlur);\n\n if (config.backgroundColor) {\n this.canvas.style.backgroundColor = config.backgroundColor;\n }\n\n this._opacity = (config.opacity || 0) * 255;\n this._maxOpacity = (config.maxOpacity || config.defaultMaxOpacity) * 255;\n this._minOpacity = (config.minOpacity || config.defaultMinOpacity) * 255;\n this._useGradientOpacity = !!config.useGradientOpacity;\n },\n _drawAlpha: function (data) {\n var min = this._min = data.min;\n var max = this._max = data.max;\n var data = data.data || [];\n var dataLen = data.length;\n // on a point basis?\n var blur = 1 - this._blur;\n\n while (dataLen--) {\n\n var point = data[dataLen];\n\n var x = point.x;\n var y = point.y;\n var radius = point.radius;\n // if value is bigger than max\n // use max as value\n var value = Math.min(point.value, max);\n var rectX = x - radius;\n var rectY = y - radius;\n var shadowCtx = this.shadowCtx;\n\n\n\n\n var tpl;\n if (!this._templates[radius]) {\n this._templates[radius] = tpl = _getPointTemplate(radius, blur);\n } else {\n tpl = this._templates[radius];\n }\n // value from minimum / value range\n // => [0, 1]\n shadowCtx.globalAlpha = (value - min) / (max - min);\n\n shadowCtx.drawImage(tpl, rectX, rectY);\n\n // update renderBoundaries\n if (rectX < this._renderBoundaries[0]) {\n this._renderBoundaries[0] = rectX;\n }\n if (rectY < this._renderBoundaries[1]) {\n this._renderBoundaries[1] = rectY;\n }\n if (rectX + 2 * radius > this._renderBoundaries[2]) {\n this._renderBoundaries[2] = rectX + 2 * radius;\n }\n if (rectY + 2 * radius > this._renderBoundaries[3]) {\n this._renderBoundaries[3] = rectY + 2 * radius;\n }\n\n }\n },\n _colorize: function () {\n var x = this._renderBoundaries[0];\n var y = this._renderBoundaries[1];\n var width = this._renderBoundaries[2] - x;\n var height = this._renderBoundaries[3] - y;\n var maxWidth = this._width;\n var maxHeight = this._height;\n var opacity = this._opacity;\n var maxOpacity = this._maxOpacity;\n var minOpacity = this._minOpacity;\n var useGradientOpacity = this._useGradientOpacity;\n\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n if (x + width > maxWidth) {\n width = maxWidth - x;\n }\n if (y + height > maxHeight) {\n height = maxHeight - y;\n }\n\n var img = this.shadowCtx.getImageData(x, y, width, height);\n var imgData = img.data;\n var len = imgData.length;\n var palette = this._palette;\n\n\n for (var i = 3; i < len; i += 4) {\n var alpha = imgData[i];\n var offset = alpha * 4;\n\n\n if (!offset) {\n continue;\n }\n\n var finalAlpha;\n if (opacity > 0) {\n finalAlpha = opacity;\n } else {\n if (alpha < maxOpacity) {\n if (alpha < minOpacity) {\n finalAlpha = minOpacity;\n } else {\n finalAlpha = alpha;\n }\n } else {\n finalAlpha = maxOpacity;\n }\n }\n\n imgData[i - 3] = palette[offset];\n imgData[i - 2] = palette[offset + 1];\n imgData[i - 1] = palette[offset + 2];\n imgData[i] = useGradientOpacity ? palette[offset + 3] : finalAlpha;\n\n }\n\n this.ctx.putImageData(img, x, y);\n\n this._renderBoundaries = [1000, 1000, 0, 0];\n\n },\n getValueAt: function (point) {\n var value;\n var shadowCtx = this.shadowCtx;\n var img = shadowCtx.getImageData(point.x, point.y, 1, 1);\n var data = img.data[3];\n var max = this._max;\n var min = this._min;\n\n value = (Math.abs(max - min) * (data / 255)) >> 0;\n\n return value;\n },\n getDataURL: function () {\n return this.canvas.toDataURL();\n }\n };\n\n\n return Canvas2dRenderer;\n })();\n\n var Renderer = (function RendererClosure() {\n\n var rendererFn = false;\n\n if (HeatmapConfig['defaultRenderer'] === 'canvas2d') {\n rendererFn = Canvas2dRenderer;\n }\n\n return rendererFn;\n })();\n\n\n var Util = {\n merge: function () {\n var merged = {};\n var argsLen = arguments.length;\n for (var i = 0; i < argsLen; i++) {\n var obj = arguments[i]\n for (var key in obj) {\n merged[key] = obj[key];\n }\n }\n return merged;\n }\n };\n // Heatmap Constructor\n var Heatmap = (function HeatmapClosure() {\n\n var Coordinator = (function CoordinatorClosure() {\n\n function Coordinator() {\n this.cStore = {};\n };\n\n Coordinator.prototype = {\n on: function (evtName, callback, scope) {\n var cStore = this.cStore;\n\n if (!cStore[evtName]) {\n cStore[evtName] = [];\n }\n cStore[evtName].push((function (data) {\n return callback.call(scope, data);\n }));\n },\n emit: function (evtName, data) {\n var cStore = this.cStore;\n if (cStore[evtName]) {\n var len = cStore[evtName].length;\n for (var i = 0; i < len; i++) {\n var callback = cStore[evtName][i];\n callback(data);\n }\n }\n }\n };\n\n return Coordinator;\n })();\n\n\n var _connect = function (scope) {\n var renderer = scope._renderer;\n var coordinator = scope._coordinator;\n var store = scope._store;\n\n coordinator.on('renderpartial', renderer.renderPartial, renderer);\n coordinator.on('renderall', renderer.renderAll, renderer);\n coordinator.on('extremachange', function (data) {\n scope._config.onExtremaChange &&\n scope._config.onExtremaChange({\n min: data.min,\n max: data.max,\n gradient: scope._config['gradient'] || scope._config['defaultGradient']\n });\n });\n store.setCoordinator(coordinator);\n };\n\n\n function Heatmap() {\n var config = this._config = Util.merge(HeatmapConfig, arguments[0] || {});\n this._coordinator = new Coordinator();\n if (config['plugin']) {\n var pluginToLoad = config['plugin'];\n if (!HeatmapConfig.plugins[pluginToLoad]) {\n throw new Error('Plugin \\'' + pluginToLoad + '\\' not found. Maybe it was not registered.');\n } else {\n var plugin = HeatmapConfig.plugins[pluginToLoad];\n // set plugin renderer and store\n this._renderer = new plugin.renderer(config);\n this._store = new plugin.store(config);\n }\n } else {\n this._renderer = new Renderer(config);\n this._store = new Store(config);\n }\n _connect(this);\n };\n\n // @TODO:\n // add API documentation\n Heatmap.prototype = {\n addData: function () {\n this._store.addData.apply(this._store, arguments);\n return this;\n },\n removeData: function () {\n this._store.removeData && this._store.removeData.apply(this._store, arguments);\n return this;\n },\n setData: function () {\n this._store.setData.apply(this._store, arguments);\n return this;\n },\n setDataMax: function () {\n this._store.setDataMax.apply(this._store, arguments);\n return this;\n },\n setDataMin: function () {\n this._store.setDataMin.apply(this._store, arguments);\n return this;\n },\n configure: function (config) {\n const oldConfig = this._config\n this._config = Util.merge(this._config, config);\n this._renderer.updateConfig(this._config, oldConfig);\n this._coordinator.emit('renderall', this._store._getInternalData());\n return this;\n },\n repaint: function () {\n this._coordinator.emit('renderall', this._store._getInternalData());\n return this;\n },\n getData: function () {\n return this._store.getData();\n },\n getDataURL: function () {\n return this._renderer.getDataURL();\n },\n getValueAt: function (point) {\n\n if (this._store.getValueAt) {\n return this._store.getValueAt(point);\n } else if (this._renderer.getValueAt) {\n return this._renderer.getValueAt(point);\n } else {\n return null;\n }\n }\n };\n\n return Heatmap;\n\n })();\n\n\n // core\n var heatmapFactory = {\n create: function (config) {\n return new Heatmap(config);\n },\n register: function (pluginKey, plugin) {\n HeatmapConfig.plugins[pluginKey] = plugin;\n }\n };\n\n return heatmapFactory;\n\n\n })()\n\n\n\n\n\n\n /*==============================以上部分为heatmap.js的核心代码,只负责热力图的展现====================================*/\n\n\n /*==============================以下部分为专为百度地图打造的覆盖物===================================================*/\n /**\n * @fileoverview 百度地图的热力图功能,对外开放。\n * 主要基于http://www.patrick-wied.at/static/heatmapjs/index.html 修改而得\n \n * 主入口类是<a href=\"symbols/BMapLib.Heatmap.html\">Heatmap</a>,\n * 基于Baidu Map API 2.0。\n *\n * @author Baidu Map Api Group\n * @version 1.0\n */\n\n /**\n * 热力图的覆盖物\n * @class 热力图的覆盖物\n * 实例化该类后,使用map.addOverlay即可以添加热力图\n * \n * @constructor\n * @param {Json Object} opts 可选的输入参数,非必填项。可输入选项包括:<br />\n * {\"<b>radius</b>\" : {String} 热力图的半径,\n * <br />\"<b>visible</b>\" : {Number} 热力图是否显示,\n * <br />\"<b>gradient</b>\" : {JSON} 热力图的渐变区间,\n * <br />\"<b>opacity</b>\" : {Number} 热力的透明度,\n *\n * @example <b>参考示例:</b><br />\n * var map = new BMap.Map(\"container\");<br />map.centerAndZoom(new BMap.Point(116.404, 39.915), 15);<br />var heatmapOverlay = new BMapLib.HeatmapOverlay({\"radius\":10, \"visible\":true, \"opacity\":70});<br />heatmapOverlay.setDataSet(data);//data是热力图的详细数据\n */\n\n var HeatmapOverlay = function (opts) {\n if (Reflect.getPrototypeOf(HeatmapOverlay.prototype) !== BMap.Overlay.prototype) {\n // 保证让HeatmapOverlay继承BMap.Overlay\n // 根据文档, 修改原型链会降低访问属性的速度, 但这种写法对代码的修改最少, 故采用\n // @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf\n Reflect.setPrototypeOf(HeatmapOverlay.prototype, BMap.Overlay.prototype)\n }\n this.conf = opts;\n this.conf.visible = opts.visible === undefined ? true : opts.visible;\n this.heatmap = null;\n this.latlngs = [];\n this.bounds = null;\n }\n\n HeatmapOverlay.prototype = Object.create(typeof BMap === 'undefined' ? null : BMap.Overlay.prototype);\n\n HeatmapOverlay.prototype.initialize = function (map) {\n\n this._map = map;\n var el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.top = 0;\n el.style.left = 0;\n el.style.border = 0;\n el.style.width = this._map.getSize().width + \"px\";\n el.style.height = this._map.getSize().height + \"px\";\n this.conf.element = el;\n\n\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return el;\n }\n map.getPanes().mapPane.appendChild(el);\n this.conf.valueField = this.conf.valueField || \"count\";\n this.heatmap = heatmapFactory.create(this.conf);\n\n var that = this;\n map.addEventListener('resize', function (e) {\n var size = e.size;\n el.style.width = size.width + \"px\";\n el.style.height = size.height + \"px\";\n that.heatmap._renderer.setDimensions(size.width, size.height);\n that.draw();\n });\n\n this._div = el;\n return el;\n }\n\n HeatmapOverlay.prototype.draw = function () {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n var currentBounds = this._map.getBounds();\n\n if (currentBounds.equals(this.bounds)) {\n return;\n }\n this.bounds = currentBounds;\n\n var ne = this._map.pointToOverlayPixel(currentBounds.getNorthEast()),\n sw = this._map.pointToOverlayPixel(currentBounds.getSouthWest()),\n topY = ne.y,\n leftX = sw.x,\n h = sw.y - ne.y,\n w = ne.x - sw.x;\n\n this.conf.element.style.left = leftX + 'px';\n this.conf.element.style.top = topY + 'px';\n this.conf.element.style.width = w + 'px';\n this.conf.element.style.height = h + 'px';\n //this.heatmap.store.get(\"heatmap\").resize();\n\n if (this.latlngs.length > 0) {\n this.heatmap.removeData();\n\n var len = this.latlngs.length;\n const d = {\n max: this.heatmap._store.getData().max,\n data: []\n };\n\n while (len--) {\n var latlng = this.latlngs[len].latlng;\n\n if (!currentBounds.containsPoint(latlng)) {\n continue;\n }\n\n var divPixel = this._map.pointToOverlayPixel(latlng),\n leftX = this._map.pointToOverlayPixel(currentBounds.getSouthWest()).x,\n topY = this._map.pointToOverlayPixel(currentBounds.getNorthEast()).y,\n screenPixel = new BMap.Pixel(divPixel.x - leftX, divPixel.y - topY);\n var roundedPoint = this.pixelTransform(screenPixel);\n d.data.push({\n x: roundedPoint.x,\n y: roundedPoint.y,\n count: this.latlngs[len].c\n });\n }\n\n if (this.conf.radiusChangeByZoom) {\n this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom());\n }\n this.heatmap.setData(d);\n }\n }\n\n\n //内部使用的坐标转化\n HeatmapOverlay.prototype.pixelTransform = function (p) {\n var w = this.heatmap.width,\n h = this.heatmap.height;\n\n while (p.x < 0) {\n p.x += w;\n }\n\n while (p.x > w) {\n p.x -= w;\n }\n\n while (p.y < 0) {\n p.y += h;\n }\n\n while (p.y > h) {\n p.y -= h;\n }\n\n p.x = (p.x >> 0);\n p.y = (p.y >> 0);\n\n return p;\n }\n\n /**\n * 设置热力图展现的详细数据, 实现之后,即可以立刻展现 \n * @param {Json Object } data\n * {\"<b>max</b>\" : {Number} 权重的最大值,\n * <br />\"<b>data</b>\" : {Array} 坐标详细数据,格式如下 <br/>\n * {\"lng\":116.421969,\"lat\":39.913527,\"count\":3}, 其中<br/>\n * lng lat分别为经纬度, count权重值\n */\n HeatmapOverlay.prototype.setDataSet = function (data) {\n this.data = data;\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n var currentBounds = this._map.getBounds();\n var mapdata = {\n max: data.max,\n data: []\n };\n var d = data.data,\n dlen = d.length;\n\n\n this.latlngs = [];\n this.heatmap.removeData();\n\n if (this.conf.radiusChangeByZoom) {\n this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom());\n }\n\n while (dlen--) {\n var latlng = new BMap.Point(d[dlen].lng, d[dlen].lat);\n this.latlngs.push({\n latlng: latlng,\n c: d[dlen].count\n });\n\n if (!currentBounds.containsPoint(latlng)) {\n continue;\n }\n\n var divPixel = this._map.pointToOverlayPixel(latlng),\n leftX = this._map.pointToOverlayPixel(currentBounds.getSouthWest()).x,\n topY = this._map.pointToOverlayPixel(currentBounds.getNorthEast()).y,\n screenPixel = new BMap.Pixel(divPixel.x - leftX, divPixel.y - topY);\n var point = this.pixelTransform(screenPixel);\n\n mapdata.data.push({\n x: point.x,\n y: point.y,\n count: d[dlen].count\n });\n }\n this.heatmap.setData(mapdata);\n }\n\n /**\n * 添加热力图的详细坐标点\n * @param {Number} lng 经度坐标\n * @param {Number} lat 纬度坐标\n * @param {Number} count 权重\n */\n HeatmapOverlay.prototype.addDataPoint = function (lng, lat, count) {\n\n if (!isSupportCanvas()) {\n return;\n }\n if (this.data && this.data.data) {\n this.data.data.push({\n lng: lng,\n lat: lat,\n count: count\n });\n }\n\n var latlng = new BMap.Point(lng, lat),\n point = this.pixelTransform(this._map.pointToOverlayPixel(latlng));\n\n this.heatmap.store.addDataPoint(point.x, point.y, count);\n this.latlngs.push({\n latlng: latlng,\n c: count\n });\n }\n\n /**\n * 更改热力图的展现或者关闭\n */\n\n HeatmapOverlay.prototype.toggle = function () {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n if (this.conf.visible === true) {\n this.conf.visible = false;\n } else {\n this.conf.visible = true;\n };\n if (this.conf.visible) {\n this.conf.element.style.display = \"block\";\n } else {\n this.conf.element.style.display = \"none\";\n }\n }\n /**\n * 设置热力图展现的配置\n * @param {Json Object} options 可选的输入参数,非必填项。可输入选项包括:<br />\n * {\"<b>radius</b>\" : {String} 热力图的半径,\n * <br />\"<b>visible</b>\" : {Number} 热力图是否显示,\n * <br />\"<b>gradient</b>\" : {JSON} 热力图的渐变区间,\n * <br />\"<b>opacity</b>\" : {Number} 热力的透明度,}\n */\n HeatmapOverlay.prototype.setOptions = function (options) {\n if (!isSupportCanvas()) {//判断是否支持Canvas.\n return;\n }\n for (var key in options) {\n if (key == \"radius\") {\n this.heatmap._store._cfgRadius = options[key];\n }\n }\n this.heatmap.configure(options);\n if (this.data) {\n this.setDataSet(this.data);//重新渲染\n }\n }\n\n\n function isSupportCanvas() {\n var elem = document.createElement('canvas');\n return !!(elem.getContext && elem.getContext('2d'));\n }\n\n return HeatmapOverlay\n})\n","import BHeatMapOverlay from 'bmaplib.heatmap'\nimport type { CoordType, LatLng, WeightedLatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\ntype BHeatMapOverlay = InstanceType<typeof BHeatMapOverlay>\n\n/** 默认半径 */\nconst RADIUS_DEFAULT = 10\n\nexport interface HeatmapOptions {\n data: HeatmapData\n /**\n * 透明度\n *\n * ## 不同效果\n * - google: 正常\n * - baidu: 设置透明度后模糊效果有问题, 感觉是bug\n */\n opacity?: number\n /**\n * 半径\n *\n * ## 默认半径的区别\n * - google: 默认半径是10\n * - baidu: 默认半径是40\n *\n * 这里统一成默认半径{@link RADIUS_DEFAULT}\n */\n radius?: number\n /**\n * ## 不同实现\n * - google: 接收颜色数组, 不能设置插值的位置\n * - baidu: 接收`{.1: 'red', .9: 'green'}`形式的颜色对象, 可以指定插值的位置\n */\n gradient?: Record<number, string>\n maxIntensity?: number\n}\nconst HeatmapOptions = {\n toGoogle: (options: HeatmapOptions, coord: CoordType): google.maps.visualization.HeatmapLayerOptions => ({\n opacity: options.opacity,\n radius: options.radius ?? RADIUS_DEFAULT,\n // key是小数和整数的混合, 故读取出来时不会维持\n gradient: options.gradient && Object.entries(options.gradient).sort(([k1], [k2]) => +k1 - +k2).map(([_, v]) => v),\n maxIntensity: options.maxIntensity,\n data: HeatmapData.toGoogle(options.data, coord),\n }),\n toBaidu: (options: HeatmapOptions, coord: CoordType, dataMax: number | undefined) => ({\n opacity: options.opacity,\n radius: options.radius ?? RADIUS_DEFAULT,\n gradient: options.gradient,\n data: HeatmapData.toBaidu(options.data, coord, dataMax),\n }),\n}\n\nexport type HeatmapData = (LatLng | WeightedLatLng)[]\n\nconst HeatmapData = {\n toGoogle: (data: HeatmapData, coord: CoordType) => data.map(it => 'weight' in it\n ? { weight: it.weight, location: it.position.toGoogle(coord) }\n : it.toGoogle(coord),\n ),\n toBaidu: (data: HeatmapData, coord: CoordType, dataMax: number | undefined) => {\n let max = 1 // baidu一定要传max\n const finalData = data.map(it => {\n let position: LatLng, count: number\n if ('weight' in it) {\n position = it.position.to(coord)\n count = it.weight\n } else {\n position = it.to(coord)\n count = 1\n }\n if (max < count) {\n max = count\n }\n return { lng: position.lng, lat: position.lat, count }\n })\n return { data: finalData, max: dataMax ?? max }\n },\n}\n\nexport abstract class Heatmap {\n abstract inner: google.maps.visualization.HeatmapLayer | BHeatMapOverlay\n abstract map: AbstractMap\n\n /** 只更新data */\n abstract setData(data: HeatmapData): void\n /** 一次性更新所有options */\n abstract setOptions(options: HeatmapOptions): void\n\n /**\n * 从地图上移除\n * 创建之后会被立即添加到地图上, 故只有remove方法\n * */\n abstract remove(): void\n}\n\nexport class GoogleHeatmap extends Heatmap {\n override inner: google.maps.visualization.HeatmapLayer\n constructor(\n public override map: GoogleMap,\n options: HeatmapOptions,\n ) {\n super()\n this.inner = new google.maps.visualization.HeatmapLayer(HeatmapOptions.toGoogle(options, this.map.coordType))\n\n this.inner.setMap(map.innerMap)\n }\n override setData(data: HeatmapData): void {\n this.inner.setData(HeatmapData.toGoogle(data, this.map.coordType))\n }\n override setOptions(options: HeatmapOptions): void {\n this.inner.setOptions(HeatmapOptions.toGoogle(options, this.map.coordType))\n }\n override remove(): void {\n this.inner.setMap(null)\n }\n}\n\nexport class BaiduHeatmap extends Heatmap {\n override inner: BHeatMapOverlay\n /**\n * 当前的最大值\n * 直接读取/修改`inner.data.max`, 实现类似google那种, 可以直接设置最大值的效果\n * */\n private get innerDataMax() {\n return this.inner.data?.max\n }\n private set innerDataMax(v: number | undefined) {\n (this.inner.data ??= {}).max = v\n }\n constructor(\n public override map: BaiduMap,\n options: HeatmapOptions,\n ) {\n super()\n const opts = HeatmapOptions.toBaidu(options, this.map.coordType, options.maxIntensity)\n this.inner = new BHeatMapOverlay(opts)\n // 直接添加到地图上\n map.innerMap.addOverlay(this.inner)\n // 添加到地图上之后, 才能调用setDataSet\n this.inner.setDataSet(opts.data)\n }\n override setData(data: HeatmapData): void {\n this.inner.setDataSet(HeatmapData.toBaidu(data, this.map.coordType, this.innerDataMax))\n }\n override setOptions(options: HeatmapOptions): void {\n const opts = HeatmapOptions.toBaidu(options, this.map.coordType, options.maxIntensity ?? this.innerDataMax)\n if (options.data !== this.inner.data) {\n this.inner.setDataSet(opts.data)\n } else if (options.maxIntensity) {\n // 未修改data, 只修改了maxIntensity, 则可以直接赋值\n this.innerDataMax = options.maxIntensity\n }\n this.inner.setOptions(opts)\n }\n\n override remove(): void {\n this.map.innerMap.removeOverlay(this.inner)\n }\n}\n","import { Strings, isEntryValueDef } from '../../../components'\nimport { CoordType, Location, type LatLng } from '../../lat-lng'\n\nexport type DirectionMode = 'transit' | 'driving' | 'walking'\n\n/** google多支持一种导航模式 */\ntype GoogleDirectionMode = DirectionMode | 'bicycling'\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MapUrlsOptions {\n\n}\n\nexport abstract class MapUrls {\n constructor(\n protected options: MapUrlsOptions,\n ) { }\n /**\n * 导航\n *\n * ## {@link origin}为空时的行为差异\n * - google: 用我的位置当做起点\n * - baidu: 用{@link destination}当作起点\n */\n abstract directions(origin: Location | undefined, destination: Location, mode?: DirectionMode): URL\n\n /**\n * 搜索\n */\n abstract search(location: Location): URL\n}\n\nfunction buildUrl(baseUrl: string | undefined, url: string, params: Record<string, string | undefined>) {\n const result = new URL(url, baseUrl)\n const urlParams = new URLSearchParams(Object.entries(params).filter(isEntryValueDef))\n result.search = '?' + urlParams.toString()\n return result\n}\n\n/** Baidu的src参数, 必须是形如`webapp.baidu.openAPIdemo`的三段格式 */\nfunction generateBaiduSrc() {\n const segments = window.location.hostname.split('.').filter(it => !Strings.isInt(it))\n if (segments.length === 3) {\n return segments.join('.')\n }\n return [...segments, 'tg', 'map', 'urls']\n .slice(0, 3)\n .join('.')\n}\n\n/**\n * @see https://developers.google.com/maps/documentation/urls/get-started\n */\nexport class GoogleMapUrls extends MapUrls {\n static BASE_URL = 'https://www.google.com/maps/'\n\n /** @see https://developers.google.com/maps/documentation/urls/get-started#directions-action */\n override directions(origin: Location | undefined, destination: Location, mode?: GoogleDirectionMode): URL {\n return buildUrl(GoogleMapUrls.BASE_URL, 'dir/', {\n api: '1',\n // {@template google_map_normal_gcj02}\n // google地图的普通地图, 在国内其实上是gcj02坐标, 卫星地图是wgs84坐标, 因为这里打开的是基础地图, 故使用gcj02\n // {@endtemplate}\n origin: Location.toString(origin, CoordType.gcj02),\n destination: Location.toString(destination, CoordType.gcj02),\n travelmode: mode,\n })\n }\n\n /** @see https://developers.google.com/maps/documentation/urls/get-started#search-action */\n override search(location: Location): URL {\n // 示例: https://www.google.com/maps/search/?api=1&query=47.5951518%2C-122.3316393\n return buildUrl(GoogleMapUrls.BASE_URL, 'search/', {\n api: '1',\n // {@macro google_map_normal_gcj02}\n query: Location.toString(location, CoordType.gcj02),\n })\n }\n}\n\n/**\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri\n */\nexport class BaiduMapUrls extends MapUrls {\n static BASE_URL = 'https://api.map.baidu.com/'\n\n /**\n * 导航\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#:~:text=%E6%9C%8D%E5%8A%A1%E5%9C%B0%E5%9D%80-,http%3A//api.map.baidu.com/direction,-//PC%26Webapp%E6%9C%8D%E5%8A%A1\n * */\n override directions(origin: Location | undefined, destination: Location, mode: DirectionMode = 'driving'): URL {\n // 优先以终点坐标系为准\n const coordType = Location.getCoordType(destination) ?? Location.getCoordType(origin) ?? CoordType.bd09\n const destinationStr = Location.toString(destination, coordType)\n // 示例: http://api.map.baidu.com/direction?origin=latlng:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving®ion=西安&output=html&src=webapp.baidu.openAPIdemo\n return buildUrl(BaiduMapUrls.BASE_URL, 'direction', {\n // baidu地图, 一定要有起点, 故这里用终点当起点, 防止导航失败\n origin: Location.toString(origin, coordType) ?? (typeof destination !== 'string'\n ? `name:请选择起点|latlng:${destinationStr}`\n : destinationStr),\n destination: destinationStr,\n // 默认就是bd09\n coord_type: coordType === CoordType.bd09 ? undefined : coordType,\n mode: mode,\n output: 'html',\n region: '中国',\n src: generateBaiduSrc(),\n })\n }\n\n override search(location: Location): URL {\n return typeof location === 'string'\n ? this.geocoderApi(location)\n : this.latlngApi(location)\n }\n\n /**\n * 显示经纬度, {@link markerApi}中途跳转的url, 一定能够定位到\n * */\n latlngApi(location: LatLng): URL {\n // 示例: https://map.baidu.com/?latlng=42.194873,116.491569&title=title&content=content&autoOpen=true&l=\n const position = location.to(CoordType.bd09)\n return new URL(`https://map.baidu.com/?latlng=${position.lat},${position.lng}`)\n }\n\n /**\n * 显示marker点, 由于缓存等因素的存在, 不一定能够定位到点\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#%E5%9B%BE%E5%8C%BA%E5%8A%9F%E8%83%BD\n */\n markerApi(location: LatLng, title: string, content: string): URL {\n return buildUrl(BaiduMapUrls.BASE_URL, 'marker', {\n location: `${location.lat},${location.lng}`,\n coord_type: location.coord === CoordType.bd09 ? undefined : location.coord,\n title,\n content,\n output: 'html',\n src: generateBaiduSrc(),\n })\n }\n\n /**\n * 编码/反编码, 由于缓存等因素的存在, 不一定能够定位到点\n * @see https://lbsyun.baidu.com/faq/api?title=webapi/uri/web#%E5%9B%BE%E5%8C%BA%E5%8A%9F%E8%83%BD:~:text=%E4%B8%8D%E4%BF%9D%E8%AF%81%E6%9C%8D%E5%8A%A1%E3%80%82-,2.1.2%20%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90,-%E8%B0%83%E7%94%A8%E8%AF%A5\n * */\n geocoderApi(location: Location): URL {\n // 示例:\n // http://api.map.baidu.com/geocoder?address=北京市海淀区上地信息路9号奎科科技大厦&output=html&src=webapp.baidu.openAPIdemo\n // http://api.map.baidu.com/geocoder?location=39.990912172420714%2C116.32715863448607&coord_type=gcj02&output=html&src=webapp.baidu.openAPIdemo\n return buildUrl(BaiduMapUrls.BASE_URL, 'geocoder', {\n ...(typeof location === 'string'\n ? {\n address: location,\n }\n : {\n location: `${location.lat},${location.lng}`,\n // 默认就是bd09\n coord_type: location.coord === CoordType.bd09 ? undefined : location.coord,\n }),\n output: 'html',\n src: generateBaiduSrc(),\n })\n }\n}\n","/**\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @name MarkerClusterer for Google Maps v3\n * @author Luke Mahe\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of\n * markers.\n */\n\n/**\n * A Marker Clusterer that clusters markers.\n *\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.<google.maps.Marker>=} opt_markers Optional markers to add to\n * the cluster.\n * @param {Object=} opt_options support the following options:\n * 'gridSize': (number) The grid size of a cluster in pixels.\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\n * cluster.\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\n * cluster is to zoom into it.\n * 'imagePath': (string) The base URL where the images representing\n * clusters will be found. The full URL will be:\n * {imagePath}[1-5].{imageExtension}\n * Default: '../images/m'.\n * 'imageExtension': (string) The suffix for images URL representing\n * clusters will be found. See _imagePath_ for details.\n * Default: 'png'.\n * 'averageCenter': (boolean) Whether the center of each cluster should be\n * the average of all markers in the cluster.\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\n * cluster before the markers are hidden and a count\n * is shown.\n * 'zIndex': (number) the z-index of a cluster.\n * Default: google.maps.Marker.MAX_ZINDEX + 1\n * 'styles': (object) An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition': (string) The position of the backgound x, y.\n * @constructor\n * @extends google.maps.OverlayView\n */\n\nclass MarkerClusterer {\n constructor(map, opt_markers, opt_options) {\n this.extend(MarkerClusterer, google.maps.OverlayView);\n this.map_ = map;\n\n /**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\n this.MARKER_CLUSTER_IMAGE_PATH_ = \"../images/m\";\n\n /**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\n this.MARKER_CLUSTER_IMAGE_EXTENSION_ = \"png\";\n /**\n * @type {Array.<google.maps.Marker>}\n * @private\n */\n this.markers_ = [];\n\n /**\n * @type {Array.<Cluster>}\n */\n this.clusters_ = [];\n\n this.sizes = [53, 56, 66, 78, 90];\n\n /**\n * @private\n */\n this.styles_ = [];\n\n /**\n * @type {boolean}\n * @private\n */\n this.ready_ = false;\n\n var options = opt_options || {};\n\n /**\n * @type {number}\n */\n this.zIndex_ = options[\"zIndex\"] || google.maps.Marker.MAX_ZINDEX + 1;\n\n /**\n * @type {number}\n * @private\n */\n this.gridSize_ = options[\"gridSize\"] || 60;\n\n /**\n * @private\n */\n this.minClusterSize_ = options[\"minimumClusterSize\"] || 2;\n\n /**\n * @type {?number}\n * @private\n */\n this.maxZoom_ = options[\"maxZoom\"] || null;\n\n this.styles_ = options[\"styles\"] || [];\n\n /**\n * @type {string}\n * @private\n */\n this.imagePath_ = options[\"imagePath\"] || this.MARKER_CLUSTER_IMAGE_PATH_;\n\n /**\n * @type {string}\n * @private\n */\n this.imageExtension_ =\n options[\"imageExtension\"] || this.MARKER_CLUSTER_IMAGE_EXTENSION_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.zoomOnClick_ = true;\n\n if (options[\"zoomOnClick\"] != undefined) {\n this.zoomOnClick_ = options[\"zoomOnClick\"];\n }\n\n /**\n * @type {boolean}\n * @private\n */\n this.averageCenter_ = false;\n\n if (options[\"averageCenter\"] != undefined) {\n this.averageCenter_ = options[\"averageCenter\"];\n }\n\n this.setupStyles_();\n\n this.setMap(map);\n\n /**\n * @type {number}\n * @private\n */\n this.prevZoom_ = this.map_.getZoom();\n\n // Add the map event listeners\n var that = this;\n google.maps.event.addListener(this.map_, \"zoom_changed\", function() {\n // Determines map type and prevent illegal zoom levels\n var zoom = that.map_.getZoom();\n var minZoom = that.map_.minZoom || 0;\n var maxZoom = Math.min(\n that.map_.maxZoom || 100,\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom\n );\n zoom = Math.min(Math.max(zoom, minZoom), maxZoom);\n\n if (that.prevZoom_ != zoom) {\n that.prevZoom_ = zoom;\n that.resetViewport();\n }\n });\n\n google.maps.event.addListener(this.map_, \"idle\", function() {\n that.redraw();\n });\n\n // Finally, add the markers\n if (\n opt_markers &&\n (opt_markers.length || Object.keys(opt_markers).length)\n ) {\n this.addMarkers(opt_markers, false);\n }\n }\n\n /**\n * Extends a objects prototype by anothers.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\n extend(obj1, obj2) {\n return function(object) {\n for (var property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }.apply(obj1, [obj2]);\n }\n\n /**\n * Implementaion of the interface method.\n * @ignore\n */\n onAdd() {\n this.setReady_(true);\n }\n\n /**\n * Implementaion of the interface method.\n * @ignore\n */\n draw() {}\n\n /**\n * Sets up the styles object.\n *\n * @private\n */\n setupStyles_() {\n if (this.styles_.length) {\n return;\n }\n\n for (var i = 0, size; (size = this.sizes[i]); i++) {\n this.styles_.push({\n url: this.imagePath_ + (i + 1) + \".\" + this.imageExtension_,\n height: size,\n width: size\n });\n }\n }\n\n /**\n * Fit the map to the bounds of the markers in the clusterer.\n */\n fitMapToMarkers() {\n var markers = this.getMarkers();\n var bounds = new google.maps.LatLngBounds();\n for (var i = 0, marker; (marker = markers[i]); i++) {\n bounds.extend(marker.getPosition());\n }\n\n this.map_.fitBounds(bounds);\n }\n\n /**\n * @param {number} zIndex\n */\n setZIndex(zIndex) {\n this.zIndex_ = zIndex;\n }\n\n /**\n * @return {number}\n */\n getZIndex() {\n return this.zIndex_;\n }\n\n /**\n * Sets the styles.\n *\n * @param {Object} styles The style to set.\n */\n setStyles(styles) {\n this.styles_ = styles;\n }\n\n /**\n * Gets the styles.\n *\n * @return {Object} The styles object.\n */\n getStyles() {\n return this.styles_;\n }\n\n /**\n * Whether zoom on click is set.\n *\n * @return {boolean} True if zoomOnClick_ is set.\n */\n isZoomOnClick() {\n return this.zoomOnClick_;\n }\n\n /**\n * Whether average center is set.\n *\n * @return {boolean} True if averageCenter_ is set.\n */\n isAverageCenter() {\n return this.averageCenter_;\n }\n\n /**\n * Returns the array of markers in the clusterer.\n *\n * @return {Array.<google.maps.Marker>} The markers.\n */\n getMarkers() {\n return this.markers_;\n }\n\n /**\n * Returns the number of markers in the clusterer\n *\n * @return {Number} The number of markers.\n */\n getTotalMarkers() {\n return this.markers_.length;\n }\n\n /**\n * Sets the max zoom for the clusterer.\n *\n * @param {number} maxZoom The max zoom level.\n */\n setMaxZoom(maxZoom) {\n this.maxZoom_ = maxZoom;\n }\n\n /**\n * Gets the max zoom for the clusterer.\n *\n * @return {number} The max zoom level.\n */\n getMaxZoom() {\n return this.maxZoom_;\n }\n\n /**\n * The function for calculating the cluster icon image.\n *\n * @param {Array.<google.maps.Marker>} markers The markers in the clusterer.\n * @param {number} numStyles The number of styles available.\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\n * @private\n */\n calculator_(markers, numStyles) {\n var index = 0;\n var count = markers.length;\n var dv = count;\n while (dv !== 0) {\n dv = parseInt(dv / 10, 10);\n index++;\n }\n\n index = Math.min(index, numStyles);\n return {\n text: count,\n index: index\n };\n }\n\n /**\n * Set the calculator function.\n *\n * @param {function(Array, number)} calculator The function to set as the\n * calculator. The function should return a object properties:\n * 'text' (string) and 'index' (number).\n *\n */\n setCalculator(calculator) {\n this.calculator_ = calculator;\n }\n\n /**\n * Get the calculator function.\n *\n * @return {function(Array, number)} the calculator function.\n */\n getCalculator() {\n return this.calculator_;\n }\n\n /**\n * Add an array of markers to the clusterer.\n *\n * @param {Array.<google.maps.Marker>} markers The markers to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\n addMarkers(markers, opt_nodraw) {\n if (markers.length) {\n for (let i = 0, marker; (marker = markers[i]); i++) {\n this.pushMarkerTo_(marker);\n }\n } else if (Object.keys(markers).length) {\n for (let marker in markers) {\n this.pushMarkerTo_(markers[marker]);\n }\n }\n if (!opt_nodraw) {\n this.redraw();\n }\n }\n\n /**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\n pushMarkerTo_(marker) {\n marker.isAdded = false;\n if (marker[\"draggable\"]) {\n // If the marker is draggable add a listener so we update the clusters on\n // the drag end.\n var that = this;\n google.maps.event.addListener(marker, \"dragend\", function() {\n marker.isAdded = false;\n that.repaint();\n });\n }\n this.markers_.push(marker);\n }\n\n /**\n * Adds a marker to the clusterer and redraws if needed.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\n addMarker(marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw();\n }\n }\n\n /**\n * Removes a marker and returns true if removed, false if not\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n * @private\n */\n removeMarker_(marker) {\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (var i = 0, m; (m = this.markers_[i]); i++) {\n if (m == marker) {\n index = i;\n break;\n }\n }\n }\n\n if (index == -1) {\n // Marker is not in our list of markers.\n return false;\n }\n\n marker.setMap(null);\n\n this.markers_.splice(index, 1);\n\n return true;\n }\n\n /**\n * Remove a marker from the cluster.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n * @return {boolean} True if the marker was removed.\n */\n removeMarker(marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Removes an array of markers from the cluster.\n *\n * @param {Array.<google.maps.Marker>} markers The markers to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n */\n removeMarkers(markers, opt_nodraw) {\n // create a local copy of markers if required\n // (removeMarker_ modifies the getMarkers() array in place)\n var markersCopy = markers === this.getMarkers() ? markers.slice() : markers;\n var removed = false;\n\n for (var i = 0, marker; (marker = markersCopy[i]); i++) {\n var r = this.removeMarker_(marker);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n }\n }\n\n /**\n * Sets the clusterer's ready state.\n *\n * @param {boolean} ready The state.\n * @private\n */\n setReady_(ready) {\n if (!this.ready_) {\n this.ready_ = ready;\n this.createClusters_();\n }\n }\n\n /**\n * Returns the number of clusters in the clusterer.\n *\n * @return {number} The number of clusters.\n */\n getTotalClusters() {\n return this.clusters_.length;\n }\n\n /**\n * Returns the google map that the clusterer is associated with.\n *\n * @return {google.maps.Map} The map.\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Sets the google map that the clusterer is associated with.\n *\n * @param {google.maps.Map} map The map.\n */\n setMap(map) {\n this.map_ = map;\n }\n\n /**\n * Returns the size of the grid.\n *\n * @return {number} The grid size.\n */\n getGridSize() {\n return this.gridSize_;\n }\n\n /**\n * Sets the size of the grid.\n *\n * @param {number} size The grid size.\n */\n setGridSize(size) {\n this.gridSize_ = size;\n }\n\n /**\n * Returns the min cluster size.\n *\n * @return {number} The grid size.\n */\n getMinClusterSize() {\n return this.minClusterSize_;\n }\n\n /**\n * Sets the min cluster size.\n *\n * @param {number} size The grid size.\n */\n setMinClusterSize(size) {\n this.minClusterSize_ = size;\n }\n\n /**\n * Extends a bounds object by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n */\n getExtendedBounds(bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(\n bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng()\n );\n var bl = new google.maps.LatLng(\n bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng()\n );\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n }\n\n /**\n * Determins if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n * @private\n */\n isMarkerInBounds_(marker, bounds) {\n return bounds.contains(marker.getPosition());\n }\n\n /**\n * Clears all clusters and markers from the clusterer.\n */\n clearMarkers() {\n this.resetViewport(true);\n\n // Set the markers a empty array.\n this.markers_ = [];\n }\n\n /**\n * Clears all existing clusters and recreates them.\n * @param {boolean} opt_hide To also hide the marker.\n */\n resetViewport(opt_hide) {\n // Remove all the clusters\n for (let i = 0, cluster; (cluster = this.clusters_[i]); i++) {\n cluster.remove();\n }\n\n // Reset the markers to not be added and to be invisible.\n for (let i = 0, marker; (marker = this.markers_[i]); i++) {\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n\n this.clusters_ = [];\n }\n\n /**\n *\n */\n repaint() {\n var oldClusters = this.clusters_.slice();\n this.clusters_.length = 0;\n this.resetViewport();\n this.redraw();\n\n // Remove the old clusters.\n // Do it in a timeout so the other clusters have been drawn first.\n setTimeout(function() {\n for (var i = 0, cluster; (cluster = oldClusters[i]); i++) {\n cluster.remove();\n }\n }, 0);\n }\n\n /**\n * Redraws the clusters.\n */\n redraw() {\n this.createClusters_();\n }\n\n /**\n * Calculates the distance between two latlng locations in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @private\n */\n distanceBetweenPoints_(p1, p2) {\n if (!p1 || !p2) {\n return 0;\n }\n\n var R = 6371; // Radius of the Earth in km\n var dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180;\n var dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180;\n var a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n }\n\n /**\n * Add a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\n addToClosestCluster_(marker) {\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (var i = 0, cluster; (cluster = this.clusters_[i]); i++) {\n var center = cluster.getCenter();\n if (center) {\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n var newCluster = new Cluster(this);\n newCluster.addMarker(marker);\n this.clusters_.push(newCluster);\n }\n }\n\n /**\n * Creates the clusters.\n *\n * @private\n */\n createClusters_() {\n if (!this.ready_) {\n return;\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n var mapBounds = new google.maps.LatLngBounds(\n this.map_.getBounds().getSouthWest(),\n this.map_.getBounds().getNorthEast()\n );\n var bounds = this.getExtendedBounds(mapBounds);\n\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n}\n\n/**\n * A cluster that contains markers.\n *\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\n * cluster is associated with.\n * @constructor\n * @ignore\n */\nclass Cluster {\n constructor(markerClusterer) {\n this.markerClusterer_ = markerClusterer;\n this.map_ = markerClusterer.getMap();\n this.gridSize_ = markerClusterer.getGridSize();\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\n this.averageCenter_ = markerClusterer.isAverageCenter();\n this.center_ = null;\n this.markers_ = [];\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(\n this,\n markerClusterer.getStyles(),\n markerClusterer.getGridSize()\n );\n }\n\n /**\n * Determins if a marker is already added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker is already added.\n */\n isMarkerAlreadyAdded(marker) {\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; (m = this.markers_[i]); i++) {\n if (m == marker) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Add a marker the cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @return {boolean} True if the marker was added.\n */\n addMarker(marker) {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat =\n (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng =\n (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n var len = this.markers_.length;\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\n // Min cluster size not reached so show the marker.\n marker.setMap(this.map_);\n }\n\n if (len == this.minClusterSize_) {\n // Hide the markers that were showing.\n for (var i = 0; i < len; i++) {\n this.markers_[i].setMap(null);\n }\n }\n\n if (len >= this.minClusterSize_) {\n marker.setMap(null);\n }\n\n this.updateIcon();\n return true;\n }\n\n /**\n * Returns the marker clusterer that the cluster is associated with.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n */\n getMarkerClusterer() {\n return this.markerClusterer_;\n }\n\n /**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n */\n getBounds() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (var i = 0, marker; (marker = markers[i]); i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n }\n\n /**\n * Removes the cluster\n */\n remove() {\n this.clusterIcon_.remove();\n this.markers_.length = 0;\n delete this.markers_;\n }\n\n /**\n * Returns the number of markers in the cluster.\n *\n * @return {number} The number of markers in the cluster.\n */\n getSize() {\n return this.markers_.length;\n }\n\n /**\n * Returns a list of the markers in the cluster.\n *\n * @return {Array.<google.maps.Marker>} The markers in the cluster.\n */\n getMarkers() {\n return this.markers_;\n }\n\n /**\n * Returns the center of the cluster.\n *\n * @return {google.maps.LatLng} The cluster center.\n */\n getCenter() {\n return this.center_;\n }\n\n /**\n * Calculated the extended bounds of the cluster with the grid.\n *\n * @private\n */\n calculateBounds_() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n }\n\n /**\n * Determines if a marker lies in the clusters bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n */\n isMarkerInClusterBounds(marker) {\n return this.bounds_.contains(marker.getPosition());\n }\n\n /**\n * Returns the map that the cluster is associated with.\n *\n * @return {google.maps.Map} The map.\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Updates the cluster icon\n */\n updateIcon() {\n var zoom = this.map_.getZoom();\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz && zoom > mz) {\n // The zoom is greater than our max zoom so show all the markers in cluster.\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\n marker.setMap(this.map_);\n }\n return;\n }\n\n if (this.markers_.length < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.setSums(sums);\n this.clusterIcon_.show();\n }\n}\n\n/**\n * A cluster icon\n *\n * @param {Cluster} cluster The cluster to be associated with.\n * @param {Object} styles An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition: (string) The background postition x, y.\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\n * @constructor\n * @extends google.maps.OverlayView\n * @ignore\n */\nclass ClusterIcon {\n constructor(cluster, styles, opt_padding) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.styles_ = styles;\n this.padding_ = opt_padding || 0;\n this.cluster_ = cluster;\n this.center_ = null;\n this.map_ = cluster.getMap();\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(this.map_);\n }\n\n /**\n * Triggers the clusterclick event and zoom's if the option is set.\n */\n triggerClusterClick() {\n var clusterBounds = this.cluster_.getBounds();\n var markerClusterer = this.cluster_.getMarkerClusterer();\n\n // Trigger the clusterclick event.\n google.maps.event.trigger(\n markerClusterer.map_,\n \"clusterclick\",\n this.cluster_\n );\n\n if (markerClusterer.isZoomOnClick()) {\n // Zoom into the cluster.\n this.map_.fitBounds(clusterBounds);\n this.map_.setCenter(clusterBounds.getCenter());\n }\n }\n\n /**\n * Adding the cluster icon to the dom.\n * @ignore\n */\n onAdd() {\n this.div_ = document.createElement(\"DIV\");\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.innerHTML = this.sums_.text;\n }\n\n var panes = this.getPanes();\n panes.overlayMouseTarget.appendChild(this.div_);\n\n var that = this;\n google.maps.event.addDomListener(this.div_, \"click\", function() {\n that.triggerClusterClick();\n });\n }\n\n /**\n * Returns the position to place the div dending on the latlng.\n *\n * @param {google.maps.LatLng} latlng The position in latlng.\n * @return {google.maps.Point} The position in pixels.\n * @private\n */\n getPosFromLatLng_(latlng) {\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\n pos.x -= parseInt(this.width_ / 2, 10);\n pos.y -= parseInt(this.height_ / 2, 10);\n return pos;\n }\n\n /**\n * Draw the icon.\n * @ignore\n */\n draw() {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + \"px\";\n this.div_.style.left = pos.x + \"px\";\n }\n }\n\n /**\n * Hide the icon.\n */\n hide() {\n if (this.div_) {\n this.div_.style.display = \"none\";\n }\n this.visible_ = false;\n }\n\n /**\n * Position and show the icon.\n */\n show() {\n if (this.div_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.style.display = \"\";\n }\n this.visible_ = true;\n }\n\n /**\n * Remove the icon from the map\n */\n remove() {\n this.setMap(null);\n }\n\n /**\n * Implementation of the onRemove interface.\n * @ignore\n */\n onRemove() {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n }\n\n /**\n * Set the sums of the icon.\n *\n * @param {Object} sums The sums containing:\n * 'text': (string) The text to display in the icon.\n * 'index': (number) The style index of the icon.\n */\n setSums(sums) {\n this.sums_ = sums;\n this.text_ = sums.text;\n this.index_ = sums.index;\n if (this.div_) {\n this.div_.innerHTML = sums.text;\n }\n\n this.useStyle();\n }\n\n /**\n * Sets the icon to the the styles.\n */\n useStyle() {\n var index = Math.max(0, this.sums_.index - 1);\n index = Math.min(this.styles_.length - 1, index);\n var style = this.styles_[index];\n this.url_ = style[\"url\"];\n this.height_ = style[\"height\"];\n this.width_ = style[\"width\"];\n this.textColor_ = style[\"textColor\"];\n this.anchor_ = style[\"anchor\"];\n this.textSize_ = style[\"textSize\"];\n this.backgroundPosition_ = style[\"backgroundPosition\"];\n }\n\n /**\n * Sets the center of the icon.\n *\n * @param {google.maps.LatLng} center The latlng to set as the center.\n */\n setCenter(center) {\n this.center_ = center;\n }\n\n /**\n * Create the css text based on the position of the icon.\n *\n * @param {google.maps.Point} pos The position.\n * @return {string} The css style text.\n */\n createCss(pos) {\n var style = [];\n style.push(\"z-index:\" + this.cluster_.markerClusterer_.getZIndex() + \";\");\n style.push(\"background-image:url(\" + this.url_ + \");\");\n var backgroundPosition = this.backgroundPosition_\n ? this.backgroundPosition_\n : \"0 0\";\n style.push(\"background-position:\" + backgroundPosition + \";\");\n\n if (typeof this.anchor_ === \"object\") {\n if (\n typeof this.anchor_[0] === \"number\" &&\n this.anchor_[0] > 0 &&\n this.anchor_[0] < this.height_\n ) {\n style.push(\n \"height:\" +\n (this.height_ - this.anchor_[0]) +\n \"px; padding-top:\" +\n this.anchor_[0] +\n \"px;\"\n );\n } else {\n style.push(\n \"height:\" + this.height_ + \"px; line-height:\" + this.height_ + \"px;\"\n );\n }\n if (\n typeof this.anchor_[1] === \"number\" &&\n this.anchor_[1] > 0 &&\n this.anchor_[1] < this.width_\n ) {\n style.push(\n \"width:\" +\n (this.width_ - this.anchor_[1]) +\n \"px; padding-left:\" +\n this.anchor_[1] +\n \"px;\"\n );\n } else {\n style.push(\"width:\" + this.width_ + \"px; text-align:center;\");\n }\n } else {\n style.push(\n \"height:\" +\n this.height_ +\n \"px; line-height:\" +\n this.height_ +\n \"px; width:\" +\n this.width_ +\n \"px; text-align:center;\"\n );\n }\n\n var txtColor = this.textColor_ ? this.textColor_ : \"black\";\n var txtSize = this.textSize_ ? this.textSize_ : 11;\n\n style.push(\n \"cursor:pointer; top:\" +\n pos.y +\n \"px; left:\" +\n pos.x +\n \"px; color:\" +\n txtColor +\n \"; position:absolute; font-size:\" +\n txtSize +\n \"px; font-family:Arial,sans-serif; font-weight:bold\"\n );\n return style.join(\"\");\n }\n}\n\nexport default MarkerClusterer;\n","(function (root, factory) { \n if (typeof exports === 'object') { \n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) { \n define(factory); \n } else {\n root.BMapLib = root.BMapLib || {};\n root.BMapLib.TextIconOverlay = root.BMapLib.TextIconOverlay || factory(); \n } \n})(this, function() {\n var T,\n baidu = T = baidu || {version: \"1.3.8\"}; \n var context = {}\n //提出guid,防止在与老版本Tangram混用时\n //在下一行错误的修改context[undefined]\n baidu.guid = \"$BAIDU$\";\n\n //Tangram可能被放在闭包中\n //一些页面级别唯一的属性,需要挂载在context[baidu.guid]上\n context[baidu.guid] = context[baidu.guid] || {};\n\n /** \n * @ignore\n * @namespace baidu.dom 操作dom的方法。\n */\n baidu.dom = baidu.dom || {};\n\n \n /**\n * 从文档中获取指定的DOM元素\n * @name baidu.dom.g\n * @function\n * @grammar baidu.dom.g(id)\n * @param {string|HTMLElement} id 元素的id或DOM元素\n * @shortcut g,T.G\n * @meta standard\n * @see baidu.dom.q\n * \n * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数\n */\n baidu.dom.g = function (id) {\n if ('string' == typeof id || id instanceof String) {\n return document.getElementById(id);\n } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {\n return id;\n }\n return null;\n };\n\n // 声明快捷方法\n baidu.g = baidu.G = baidu.dom.g;\n\n /**\n * 获取目标元素所属的document对象\n * @name baidu.dom.getDocument\n * @function\n * @grammar baidu.dom.getDocument(element)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @meta standard\n * @see baidu.dom.getWindow\n * \n * @returns {HTMLDocument} 目标元素所属的document对象\n */\n baidu.dom.getDocument = function (element) {\n element = baidu.dom.g(element);\n return element.nodeType == 9 ? element : element.ownerDocument || element.document;\n };\n\n /**\n * @ignore\n * @namespace baidu.lang 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。\n */\n baidu.lang = baidu.lang || {};\n\n /**\n * 判断目标参数是否string类型或String对象\n * @name baidu.lang.isString\n * @function\n * @grammar baidu.lang.isString(source)\n * @param {Any} source 目标参数\n * @shortcut isString\n * @meta standard\n * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n * \n * @returns {boolean} 类型判断结果\n */\n baidu.lang.isString = function (source) {\n return '[object String]' == Object.prototype.toString.call(source);\n };\n\n // 声明快捷方法\n baidu.isString = baidu.lang.isString;\n\n /**\n * 从文档中获取指定的DOM元素\n * **内部方法**\n * \n * @param {string|HTMLElement} id 元素的id或DOM元素\n * @meta standard\n * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数\n */\n baidu.dom._g = function (id) {\n if (baidu.lang.isString(id)) {\n return document.getElementById(id);\n }\n return id;\n };\n\n // 声明快捷方法\n baidu._g = baidu.dom._g;\n\n /**\n * @ignore\n * @namespace baidu.browser 判断浏览器类型和特性的属性。\n */\n baidu.browser = baidu.browser || {};\n\n if (/msie (\\d+\\.\\d)/i.test(navigator.userAgent)) {\n //IE 8下,以documentMode为准\n //在百度模板中,可能会有$,防止冲突,将$1 写成 \\x241\n /**\n * 判断是否为ie浏览器\n * @property ie ie版本号\n * @grammar baidu.browser.ie\n * @meta standard\n * @shortcut ie\n * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon \n */\n baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\\x241'];\n }\n\n /**\n * 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)\n *\n * @author berg\n * @name baidu.dom.getComputedStyle\n * @function\n * @grammar baidu.dom.getComputedStyle(element, key)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @param {string} key 要获取的样式名\n *\n * @see baidu.dom.getStyle\n * \n * @returns {string} 目标元素的computed style值\n */\n\n baidu.dom.getComputedStyle = function(element, key){\n element = baidu.dom._g(element);\n var doc = baidu.dom.getDocument(element),\n styles;\n if (doc.defaultView && doc.defaultView.getComputedStyle) {\n styles = doc.defaultView.getComputedStyle(element, null);\n if (styles) {\n return styles[key] || styles.getPropertyValue(key);\n }\n }\n return ''; \n };\n\n /**\n * 提供给setStyle与getStyle使用\n */\n baidu.dom._styleFixer = baidu.dom._styleFixer || {};\n\n /**\n * 提供给setStyle与getStyle使用\n */\n baidu.dom._styleFilter = baidu.dom._styleFilter || [];\n\n /**\n * 为获取和设置样式的过滤器\n * @private\n * @meta standard\n */\n baidu.dom._styleFilter.filter = function (key, value, method) {\n for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {\n if (filter = filter[method]) {\n value = filter(key, value);\n }\n }\n return value;\n };\n\n /**\n * @ignore\n * @namespace baidu.string 操作字符串的方法。\n */\n baidu.string = baidu.string || {};\n\n /**\n * 将目标字符串进行驼峰化处理\n * @name baidu.string.toCamelCase\n * @function\n * @grammar baidu.string.toCamelCase(source)\n * @param {string} source 目标字符串\n * @remark\n * 支持单词以“-_”分隔\n * @meta standard\n * \n * @returns {string} 驼峰化处理后的字符串\n */\n baidu.string.toCamelCase = function (source) {\n //提前判断,提高getStyle等的效率 thanks xianwei\n if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {\n return source;\n }\n return source.replace(/[-_][^-_]/g, function (match) {\n return match.charAt(1).toUpperCase();\n });\n };\n\n /**\n * 获取目标元素的样式值\n * @name baidu.dom.getStyle\n * @function\n * @grammar baidu.dom.getStyle(element, key)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @param {string} key 要获取的样式名\n * @remark\n * \n * 为了精简代码,本模块默认不对任何浏览器返回值进行归一化处理(如使用getStyle时,不同浏览器下可能返回rgb颜色或hex颜色),也不会修复浏览器的bug和差异性(如设置IE的float属性叫styleFloat,firefox则是cssFloat)。<br />\n * baidu.dom._styleFixer和baidu.dom._styleFilter可以为本模块提供支持。<br />\n * 其中_styleFilter能对颜色和px进行归一化处理,_styleFixer能对display,float,opacity,textOverflow的浏览器兼容性bug进行处理。\t\n * @shortcut getStyle\n * @meta standard\n * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle\n * \n * @returns {string} 目标元素的样式值\n */\n baidu.dom.getStyle = function (element, key) {\n var dom = baidu.dom;\n\n element = dom.g(element);\n key = baidu.string.toCamelCase(key);\n //computed style, then cascaded style, then explicitly set style.\n var value = element.style[key] ||\n (element.currentStyle ? element.currentStyle[key] : \"\") || \n dom.getComputedStyle(element, key);\n\n // 在取不到值的时候,用fixer进行修正\n if (!value) {\n var fixer = dom._styleFixer[key];\n if(fixer){\n value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer);\n }\n }\n\n /* 检查结果过滤器 */\n if (fixer = dom._styleFilter) {\n value = fixer.filter(key, value, 'get');\n }\n\n return value;\n };\n\n // 声明快捷方法\n baidu.getStyle = baidu.dom.getStyle;\n\n\n if (/opera\\/(\\d+\\.\\d)/i.test(navigator.userAgent)) {\n /**\n * 判断是否为opera浏览器\n * @property opera opera版本号\n * @grammar baidu.browser.opera\n * @meta standard\n * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome \n */\n baidu.browser.opera = + RegExp['\\x241'];\n }\n\n /**\n * 判断是否为webkit内核\n * @property isWebkit \n * @grammar baidu.browser.isWebkit\n * @meta standard\n * @see baidu.browser.isGecko\n */\n baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);\n\n /**\n * 判断是否为gecko内核\n * @property isGecko \n * @grammar baidu.browser.isGecko\n * @meta standard\n * @see baidu.browser.isWebkit\n */\n baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);\n\n /**\n * 判断是否严格标准的渲染模式\n * @property isStrict \n * @grammar baidu.browser.isStrict\n * @meta standard\n */\n baidu.browser.isStrict = document.compatMode == \"CSS1Compat\";\n\n /**\n * 获取目标元素相对于整个文档左上角的位置\n * @name baidu.dom.getPosition\n * @function\n * @grammar baidu.dom.getPosition(element)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @meta standard\n * \n * @returns {Object} 目标元素的位置,键值为top和left的Object。\n */\n baidu.dom.getPosition = function (element) {\n element = baidu.dom.g(element);\n var doc = baidu.dom.getDocument(element), \n browser = baidu.browser,\n getStyle = baidu.dom.getStyle,\n // Gecko 1.9版本以下用getBoxObjectFor计算位置\n // 但是某些情况下是有bug的\n // 对于这些有bug的情况\n // 使用递归查找的方式\n BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && \n doc.getBoxObjectFor &&\n getStyle(element, 'position') == 'absolute' &&\n (element.style.top === '' || element.style.left === ''),\n pos = {\"left\":0,\"top\":0},\n viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement,\n parent,\n box;\n\n if(element == viewport){\n return pos;\n }\n\n if(element.getBoundingClientRect){ // IE and Gecko 1.9+\n \n //当HTML或者BODY有border width时, 原生的getBoundingClientRect返回值是不符合预期的\n //考虑到通常情况下 HTML和BODY的border只会设成0px,所以忽略该问题.\n box = element.getBoundingClientRect();\n\n pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);\n pos.top = Math.floor(box.top) + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);\n \n // IE会给HTML元素添加一个border,默认是medium(2px)\n // 但是在IE 6 7 的怪异模式下,可以被html { border: 0; } 这条css规则覆盖\n // 在IE7的标准模式下,border永远是2px,这个值通过clientLeft 和 clientTop取得\n // 但是。。。在IE 6 7的怪异模式,如果用户使用css覆盖了默认的medium\n // clientTop和clientLeft不会更新\n pos.left -= doc.documentElement.clientLeft;\n pos.top -= doc.documentElement.clientTop;\n \n var htmlDom = doc.body,\n // 在这里,不使用element.style.borderLeftWidth,只有computedStyle是可信的\n htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')),\n htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth'));\n if(browser.ie && !browser.isStrict){\n pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth;\n pos.top -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth;\n }\n } else { \n // safari/opera/firefox\n parent = element;\n\n do {\n pos.left += parent.offsetLeft;\n pos.top += parent.offsetTop;\n \n // safari里面,如果遍历到了一个fixed的元素,后面的offset都不准了\n if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') {\n pos.left += doc.body.scrollLeft;\n pos.top += doc.body.scrollTop;\n break;\n }\n \n parent = parent.offsetParent;\n } while (parent && parent != element);\n\n // 对body offsetTop的修正\n if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){\n pos.top -= doc.body.offsetTop;\n }\n\n // 计算除了body的scroll\n parent = element.offsetParent;\n while (parent && parent != doc.body) {\n pos.left -= parent.scrollLeft;\n // see https://bugs.opera.com/show_bug.cgi?id=249965\n if (!browser.opera || parent.tagName != 'TR') {\n pos.top -= parent.scrollTop;\n }\n parent = parent.offsetParent;\n }\n }\n\n return pos;\n };\n\n /**\n * @ignore\n * @namespace baidu.event 屏蔽浏览器差异性的事件封装。\n * @property target \t事件的触发元素\n * @property pageX \t\t鼠标事件的鼠标x坐标\n * @property pageY \t\t鼠标事件的鼠标y坐标\n * @property keyCode \t键盘事件的键值\n */\n baidu.event = baidu.event || {};\n\n /**\n * 事件监听器的存储表\n * @private\n * @meta standard\n */\n baidu.event._listeners = baidu.event._listeners || [];\n\n /**\n * 为目标元素添加事件监听器\n * @name baidu.event.on\n * @function\n * @grammar baidu.event.on(element, type, listener)\n * @param {HTMLElement|string|window} element 目标元素或目标元素id\n * @param {string} type 事件类型\n * @param {Function} listener 需要添加的监听器\n * @remark\n * \n 1. 不支持跨浏览器的鼠标滚轮事件监听器添加<br>\n 2. 改方法不为监听器灌入事件对象,以防止跨iframe事件挂载的事件对象获取失败\n\n * @shortcut on\n * @meta standard\n * @see baidu.event.un\n * \n * @returns {HTMLElement|window} 目标元素\n */\n baidu.event.on = function (element, type, listener) {\n type = type.replace(/^on/i, '');\n element = baidu.dom._g(element);\n\n var realListener = function (ev) {\n // 1. 这里不支持EventArgument, 原因是跨frame的事件挂载\n // 2. element是为了修正this\n listener.call(element, ev);\n },\n lis = baidu.event._listeners,\n filter = baidu.event._eventFilter,\n afterFilter,\n realType = type;\n type = type.toLowerCase();\n // filter过滤\n if(filter && filter[type]){\n afterFilter = filter[type](element, type, realListener);\n realType = afterFilter.type;\n realListener = afterFilter.listener;\n }\n\n // 事件监听器挂载\n if (element.addEventListener) {\n element.addEventListener(realType, realListener, false);\n } else if (element.attachEvent) {\n element.attachEvent('on' + realType, realListener);\n }\n\n // 将监听器存储到数组中\n lis[lis.length] = [element, type, listener, realListener, realType];\n return element;\n };\n\n // 声明快捷方法\n baidu.on = baidu.event.on;\n\n /**\n * 返回一个当前页面的唯一标识字符串。\n * @name baidu.lang.guid\n * @function\n * @grammar baidu.lang.guid()\n * @version 1.1.1\n * @meta standard\n * \n * @returns {String} 当前页面的唯一标识字符串\n */\n\n (function(){\n //不直接使用window,可以提高3倍左右性能\n var guid = context[baidu.guid];\n\n baidu.lang.guid = function() {\n return \"TANGRAM__\" + (guid._counter ++).toString(36);\n };\n\n guid._counter = guid._counter || 1;\n })();\n\n /**\n * 所有类的实例的容器\n * key为每个实例的guid\n * @meta standard\n */\n\n context[baidu.guid]._instances = context[baidu.guid]._instances || {};\n\n /**\n * 判断目标参数是否为function或Function实例\n * @name baidu.lang.isFunction\n * @function\n * @grammar baidu.lang.isFunction(source)\n * @param {Any} source 目标参数\n * @version 1.2\n * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n * @meta standard\n * @returns {boolean} 类型判断结果\n */\n baidu.lang.isFunction = function (source) {\n // chrome下,'function' == typeof /a/ 为true.\n return '[object Function]' == Object.prototype.toString.call(source);\n };\n\n /**\n * \n * @ignore\n * @class Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。\n * @name \tbaidu.lang.Class\n * @grammar baidu.lang.Class(guid)\n * @param \t{string}\tguid\t对象的唯一标识\n * @meta standard\n * @remark baidu.lang.Class和它的子类的实例均包含一个全局唯一的标识guid。guid是在构造函数中生成的,因此,继承自baidu.lang.Class的类应该直接或者间接调用它的构造函数。<br>baidu.lang.Class的构造函数中产生guid的方式可以保证guid的唯一性,及每个实例都有一个全局唯一的guid。\n * @meta standard\n * @see baidu.lang.inherits,baidu.lang.Event\n */\n baidu.lang.Class = function(guid) {\n this.guid = guid || baidu.lang.guid();\n context[baidu.guid]._instances[this.guid] = this;\n };\n context[baidu.guid]._instances = context[baidu.guid]._instances || {};\n\n /**\n * 释放对象所持有的资源,主要是自定义事件。\n * @name dispose\n * @grammar obj.dispose()\n */\n baidu.lang.Class.prototype.dispose = function(){\n delete context[baidu.guid]._instances[this.guid];\n\n for(var property in this){\n if (!baidu.lang.isFunction(this[property])) {\n delete this[property];\n }\n }\n this.disposed = true;\n };\n\n /**\n * 重载了默认的toString方法,使得返回信息更加准确一些。\n * @return {string} 对象的String表示形式\n */\n baidu.lang.Class.prototype.toString = function(){\n return \"[object \" + (this._className || \"Object\" ) + \"]\";\n };\n\n /**\n * @ignore\n * @class 自定义的事件对象。\n * @name \tbaidu.lang.Event\n * @grammar baidu.lang.Event(type[, target])\n * @param \t{string} type\t 事件类型名称。为了方便区分事件和一个普通的方法,事件类型名称必须以\"on\"(小写)开头。\n * @param \t{Object} [target]触发事件的对象\n * @meta standard\n * @remark 引入该模块,会自动为Class引入3个事件扩展方法:addEventListener、removeEventListener和dispatchEvent。\n * @meta standard\n * @see baidu.lang.Class\n */\n baidu.lang.Event = function (type, target) {\n this.type = type;\n this.returnValue = true;\n this.target = target || null;\n this.currentTarget = null;\n };\n\n /**\n * 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.addEventListener(type, handler[, key])\n * @param \t{string} type 自定义事件的名称\n * @param \t{Function} handler 自定义事件被触发时应该调用的回调函数\n * @param \t{string} [key]\t\t为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。\n * @remark \t事件类型区分大小写。如果自定义事件名称不是以小写\"on\"开头,该方法会给它加上\"on\"再进行判断,即\"click\"和\"onclick\"会被认为是同一种事件。 \n */\n baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {\n if (!baidu.lang.isFunction(handler)) {\n return;\n }\n\n !this.__listeners && (this.__listeners = {});\n\n var t = this.__listeners, id;\n if (typeof key == \"string\" && key) {\n if (/[^\\w\\-]/.test(key)) {\n throw(\"nonstandard key:\" + key);\n } else {\n handler.hashCode = key; \n id = key;\n }\n }\n type.indexOf(\"on\") != 0 && (type = \"on\" + type);\n\n typeof t[type] != \"object\" && (t[type] = {});\n id = id || baidu.lang.guid();\n handler.hashCode = id;\n t[type][id] = handler;\n };\n\n /**\n * 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.removeEventListener(type, handler)\n * @param {string} type 事件类型\n * @param {Function|string} handler 要移除的事件监听函数或者监听函数的key\n * @remark \t如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。\n */\n baidu.lang.Class.prototype.removeEventListener = function (type, handler) {\n if (typeof handler != \"undefined\") {\n if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode))\n || (! baidu.lang.isString(handler))\n ){\n return;\n }\n }\n\n !this.__listeners && (this.__listeners = {});\n\n type.indexOf(\"on\") != 0 && (type = \"on\" + type);\n\n var t = this.__listeners;\n if (!t[type]) {\n return;\n }\n if (typeof handler != \"undefined\") {\n t[type][handler] && delete t[type][handler];\n } else {\n for(var guid in t[type]){\n delete t[type][guid];\n }\n }\n };\n\n /**\n * 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。\n * @grammar obj.dispatchEvent(event, options)\n * @param {baidu.lang.Event|String} event \tEvent对象,或事件名称(1.1.1起支持)\n * @param {Object} \t\t\t\t\toptions 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)\n * @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br>\n myobj.onMyEvent = function(){}<br>\n myobj.addEventListener(\"onMyEvent\", function(){});\n */\n baidu.lang.Class.prototype.dispatchEvent = function (event, options) {\n if (baidu.lang.isString(event)) {\n event = new baidu.lang.Event(event);\n }\n !this.__listeners && (this.__listeners = {});\n\n // 20100603 添加本方法的第二个参数,将 options extend到event中去传递\n options = options || {};\n for (var i in options) {\n event[i] = options[i];\n }\n\n var i, t = this.__listeners, p = event.type;\n event.target = event.target || this;\n event.currentTarget = this;\n\n p.indexOf(\"on\") != 0 && (p = \"on\" + p);\n\n baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);\n\n if (typeof t[p] == \"object\") {\n for (i in t[p]) {\n t[p][i].apply(this, arguments);\n }\n }\n return event.returnValue;\n };\n\n\n baidu.lang.inherits = function (subClass, superClass, className) {\n var key, proto,\n selfProps = subClass.prototype,\n clazz = new Function();\n\n clazz.prototype = superClass.prototype;\n proto = subClass.prototype = new clazz();\n for (key in selfProps) {\n proto[key] = selfProps[key];\n }\n subClass.prototype.constructor = subClass;\n subClass.superClass = superClass.prototype;\n\n // 类名标识,兼容Class的toString,基本没用\n if (\"string\" == typeof className) {\n proto._className = className;\n }\n };\n // 声明快捷方法\n baidu.inherits = baidu.lang.inherits;\n\n\n /**\n \n * 图片的路径\n\n * @private\n * @type {String}\n \n */\n var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m';\n\n /**\n \n * 图片的后缀名\n\n * @private\n * @type {String}\n \n */\n var _IMAGE_EXTENSION = 'png';\n\n /**\n *@exports TextIconOverlay as BMapLib.TextIconOverlay\n */\n \n /**\n * TextIconOverlay\n * @class 此类表示地图上的一个覆盖物,该覆盖物由文字和图标组成,从Overlay继承。文字通常是数字(0-9)或字母(A-Z ),而文字与图标之间有一定的映射关系。\n * 该覆盖物适用于以下类似的场景:需要在地图上添加一系列覆盖物,这些覆盖物之间用不同的图标和文字来区分,文字可能表示了该覆盖物的某一属性值,根据该文字和一定的映射关系,自动匹配相应颜色和大小的图标。\n *\n * @constructor\n * @param {Point} position 表示一个经纬度坐标位置。\n * @param {string} text 表示该覆盖物显示的文字信息。\n * @param {TextIconOverlayOptions=} options 选项。\n *\n * @typedef {object} TextIconOverlayOptions\n * @property {IconStyle[]=} styles 一组图标风格。\n * @property {number=} zIndex 等同与CSS中的z-index属性\n * \n * @typedef {object} IconStyle\n * @property {string} url 图片的url地址。\n * @property {Size} size 图片的大小。\n * @property {Size=} anchor 图标定位在地图上的位置相对于图标左上角的偏移值,默认偏移值为图标的中心位置。\n * @property {Size=} offset 图片相对于可视区域的偏移值,此功能的作用等同于CSS中的background-position属性。\n * @property {number=} [textSize=10] 文字的大小。\n * @property {string} [textColor='black'] 文字的颜色。\n */\n var TextIconOverlay = function(position, text, options){\n try {\n BMap;\n } catch (e) {\n throw Error('Baidu Map JS API is not ready yet!');\n }\n T.lang.inherits(TextIconOverlay, BMap.Overlay, \"TextIconOverlay\");\n this._position = position;\n this._text = text;\n this._options = options || {};\n this._styles = this._options['styles'] || [];\n /** @type {number | undefined} */\n this._zIndex = this._options['zIndex'];\n (!this._styles.length) && this._setupDefaultStyles(); \n };\n\n\n TextIconOverlay.prototype._setupDefaultStyles = function(){ \n var sizes = [53, 56, 66, 78, 90];\n for(var i = 0, size; size = sizes[i]; i++){\n this._styles.push({\n url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION,\n size: new BMap.Size(size, size)\n });\n }//for循环的简洁写法\n };\n\n /**\n *继承Overlay的intialize方法,自定义覆盖物时必须。\n *@param {Map} map BMap.Map的实例化对象。\n *@return {HTMLElement} 返回覆盖物对应的HTML元素。\n */\n TextIconOverlay.prototype.initialize = function(map){\n this._map = map;\n \n this._domElement = document.createElement('div'); \n this._updateCss(); \n this._updateText();\n this._updatePosition(); \n \n this._bind();\n\n this._map.getPanes().markerMouseTarget.appendChild(this._domElement);\n return this._domElement; \n };\n\n /**\n *继承Overlay的draw方法,自定义覆盖物时必须。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.draw = function(){\n this._map && this._updatePosition();\n };\n \n /**\n *获取该覆盖物上的文字。\n *@return {String} 该覆盖物上的文字。\n */\n TextIconOverlay.prototype.getText = function(){\n return this._text;\n };\n\n /**\n *设置该覆盖物上的文字。\n *@param {String} text 要设置的文字,通常是字母A-Z或数字0-9。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.setText = function(text){\n if(text && (!this._text || (this._text.toString() != text.toString()))){\n this._text = text;\n this._updateText();\n this._updateCss();\n this._updatePosition(); \n }\n };\n\n /**\n *获取该覆盖物的位置。\n *@return {Point} 该覆盖物的经纬度坐标。\n */\n TextIconOverlay.prototype.getPosition = function () {\n return this._position;\n };\n \n /**\n *设置该覆盖物的位置。\n *@param {Point} position 要设置的经纬度坐标。\n *@return 无返回值。\n */\n TextIconOverlay.prototype.setPosition = function (position) {\n if(position && (!this._position || !this._position.equals(position))){\n this._position = position; \n this._updatePosition();\n }\n };\n\n /**\n *由文字信息获取风格数组的对应索引值。\n *内部默认的对应函数为文字转换为数字除以10的结果,比如文字8返回索引0,文字25返回索引2.\n *如果需要自定义映射关系,请覆盖该函数。\n *@param {String} text 文字。\n *@param {Array<IconStyle>} styles 一组图标风格。\n *@return {Number} 对应的索引值。\n */\n TextIconOverlay.prototype.getStyleByText = function(text, styles){\n var count = parseInt(text);\n var index = parseInt(count / 10);\n index = Math.max(0, index);\n index = Math.min(index, styles.length - 1);\n return styles[index]; \n }\n\n /**\n *更新相应的CSS。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updateCss = function(){\n if (!this._domElement) {\n return\n }\n var style = this.getStyleByText(this._text, this._styles);\n this._domElement.style.cssText = this._buildCssText(style);\n };\n\n /**\n *更新覆盖物的显示文字。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updateText = function(){\n if (this._domElement) {\n this._domElement.innerHTML = this._text;\n }\n };\n\n /**\n *调整覆盖物在地图上的位置更新覆盖物的显示文字。\n *@return 无返回值。\n */\n TextIconOverlay.prototype._updatePosition = function(){\n if (this._domElement && this._position) {\n var style = this._domElement.style;\n var pixelPosition= this._map.pointToOverlayPixel(this._position); \n pixelPosition.x -= Math.ceil(parseInt(style.width) / 2);\n pixelPosition.y -= Math.ceil(parseInt(style.height) / 2); \n style.left = pixelPosition.x + \"px\";\n style.top = pixelPosition.y + \"px\";\n }\n };\n \n /**\n * 为该覆盖物的HTML元素构建CSS\n * @param {IconStyle} 一个图标的风格。\n * @return {String} 构建完成的CSSTEXT。\n */\n TextIconOverlay.prototype._buildCssText = function(style) { \n //根据style来确定一些默认值\n var url = style['url'];\n var size = style['size'];\n var anchor = style['anchor'];\n var offset = style['offset'];\n var textColor = style['textColor'] || 'black';\n var textSize = style['textSize'] || 10;\n\n var csstext = [];\n if (this._zIndex) {\n csstext.push('z-index:' + this._zIndex + ';');\n }\n if (T.browser[\"ie\"] < 7) {\n csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +\n 'sizingMethod=scale,src=\"' + url + '\");');\n } else {\n csstext.push('background-image:url(' + url + ');');\n var backgroundPosition = '0 0';\n (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px'); \n csstext.push('background-position:' + backgroundPosition + ';');\n }\n\n if (size instanceof BMap.Size){\n if (anchor instanceof BMap.Size) {\n if (anchor.height > 0 && anchor.height < size.height) {\n csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;');\n }\n if(anchor.width > 0 && anchor.width < size.width){\n csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;'); \n }\n } else {\n csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;');\n csstext.push('width:' + size.width + 'px; text-align:center;');\n }\n }\n \n csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' +\n textSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\n return csstext.join('');\n };\n\n\n /**\n \n * 当鼠标点击该覆盖物时会触发该事件\n\n * @name TextIconOverlay#click\n\n * @event\n\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n \n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n *\n\n */\n\n /**\n\n * 当鼠标进入该覆盖物区域时会触发该事件\n\n * @name TextIconOverlay#mouseover\n\n * @event\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n \n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n * <br />\"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象\n\n * <br />\"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象\n\n *\n\n * @example <b>参考示例:</b><br />\n\n * myTextIconOverlay.addEventListener(\"mouseover\", function(e) { alert(e.point); });\n\n */\n\n /**\n\n * 当鼠标离开该覆盖物区域时会触发该事件\n\n * @name TextIconOverlay#mouseout\n\n * @event\n\n * @param {Event Object} e 回调函数会返回event参数,包括以下返回值:\n\n * <br />\"<b>type</b> : {String} 事件类型\n\n * <br />\"<b>target</b>:{BMapLib.TextIconOverlay} 事件目标\n\n * <br />\"<b>point</b> : {BMap.Point} 最新添加上的节点BMap.Point对象\n\n * <br />\"<b>pixel</b>:{BMap.pixel} 最新添加上的节点BMap.Pixel对象\n\n *\n\n * @example <b>参考示例:</b><br />\n\n * myTextIconOverlay.addEventListener(\"mouseout\", function(e) { alert(e.point); });\n\n */\n\n\n /**\n * 为该覆盖物绑定一系列事件\n * 当前支持click mouseover mouseout\n * @return 无返回值。\n */\n TextIconOverlay.prototype._bind = function(){\n if (!this._domElement){\n return;\n }\n\n var me = this;\n var map = this._map;\n\n var BaseEvent = T.lang.Event;\n function eventExtend(e, be){\n var elem = e.srcElement || e.target;\n var x = e.clientX || e.pageX;\n var y = e.clientY || e.pageY;\n if (e && be && x && y && elem){\n var offset = T.dom.getPosition(map.getContainer());\n be.pixel = new BMap.Pixel(x - offset.left, y - offset.top);\n be.point = map.pixelToPoint(be.pixel);\n }\n return be;\n }//给事件参数增加pixel和point两个值\n\n T.event.on(this._domElement,\"mouseover\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onmouseover\")));\n });\n T.event.on(this._domElement,\"mouseout\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onmouseout\")));\n });\n T.event.on(this._domElement,\"click\", function(e){\n me.dispatchEvent(eventExtend(e, new BaseEvent(\"onclick\")));\n });\n };\n\n return TextIconOverlay;\n});\n","import TextIconOverlay from 'bmaplib.texticonoverlay';\n\n/**\n * 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。\n * @param {BMap.Map} map BMap.Map的实例化对象\n * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象\n * @param {Number} gridSize 要扩大的像素值\n *\n * @return {BMap.Bounds} 返回扩大后的视图范围。\n */\nvar getExtendedBounds = function(map, bounds, gridSize){\n bounds = cutBoundsInRange(bounds);\n var pixelNE = map.pointToPixel(bounds.getNorthEast());\n var pixelSW = map.pointToPixel(bounds.getSouthWest()); \n pixelNE.x += gridSize;\n pixelNE.y -= gridSize;\n pixelSW.x -= gridSize;\n pixelSW.y += gridSize;\n var newNE = map.pixelToPoint(pixelNE);\n var newSW = map.pixelToPoint(pixelSW);\n return new BMap.Bounds(newSW, newNE);\n};\n\n/**\n * 按照百度地图支持的世界范围对bounds进行边界处理\n * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象\n *\n * @return {BMap.Bounds} 返回不越界的视图范围\n */\nvar cutBoundsInRange = function (bounds) {\n var maxX = getRange(bounds.getNorthEast().lng, -180, 180);\n var minX = getRange(bounds.getSouthWest().lng, -180, 180);\n var maxY = getRange(bounds.getNorthEast().lat, -74, 74);\n var minY = getRange(bounds.getSouthWest().lat, -74, 74);\n return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY));\n}; \n\n/**\n * 对单个值进行边界处理。\n * @param {Number} i 要处理的数值\n * @param {Number} min 下边界值\n * @param {Number} max 上边界值\n * \n * @return {Number} 返回不越界的数值\n */\nvar getRange = function (i, mix, max) {\n mix && (i = Math.max(i, mix));\n max && (i = Math.min(i, max));\n return i;\n};\n\n/**\n * 判断给定的对象是否为数组\n * @param {Object} source 要测试的对象\n *\n * @return {Boolean} 如果是数组返回true,否则返回false\n */\nvar isArray = function (source) {\n return '[object Array]' === Object.prototype.toString.call(source);\n};\n\n/**\n * 返回item在source中的索引位置\n * @param {Object} item 要测试的对象\n * @param {Array} source 数组\n *\n * @return {Number} 如果在数组内,返回索引,否则返回-1\n */\nvar indexOf = function(item, source){\n var index = -1;\n if(isArray(source)){\n if (source.indexOf) {\n index = source.indexOf(item);\n } else {\n for (var i = 0, m; m = source[i]; i++) {\n if (m === item) {\n index = i;\n break;\n }\n }\n }\n } \n return index;\n};\n\n/**\n *@exports MarkerClusterer as BMapLib.MarkerClusterer\n */\n\n/**\n * MarkerClusterer\n * @class 用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能\n * @constructor\n * @param {BMap.Map} map 地图的一个实例。\n * @param {MarkerClustererOptions=} options 可选参数\n * \n * @typedef {object} MarkerClustererOptions\n * @property {Marker[]=} markers 要聚合的标记数组\n * @property {number=} [gridSize=60] 聚合计算时网格的像素大小,默认60\n * @property {number=} maxZoom 最大的聚合级别,大于该级别就不进行相应的聚合\n * @property {number=} [minClusterSize=2] 最小的聚合数量,小于该数量的不能成为一个聚合,默认为2\n * @property {boolean=} [isAverageCenter=false] 聚合点的落脚位置是否是所有聚合在内点的平均值,默认为否,落脚在聚合内的第一个点\n * @property {IconStyle[]=} styles 自定义聚合后的图标风格,请参考TextIconOverlay类\n * @property {number=} zIndex 聚合图标的z-index\n */\nvar MarkerClusterer = function(map, options){\n try {\n BMap;\n } catch (e) {\n throw Error('Baidu Map JS API is not ready yet!');\n }\n if (!map){\n return;\n }\n this._map = map;\n this._markers = [];\n this._clusters = [];\n \n var opts = options || {};\n this._zIndex = opts[\"zIndex\"];\n this._gridSize = opts[\"gridSize\"] || 60;\n this._maxZoom = opts[\"maxZoom\"] || 18;\n this._minClusterSize = opts[\"minClusterSize\"] || 2; \n this._isAverageCenter = false;\n if (opts['isAverageCenter'] != undefined) {\n this._isAverageCenter = opts['isAverageCenter'];\n } \n this._styles = opts[\"styles\"] || [];\n\n var that = this;\n this._map.addEventListener(\"zoomend\",function(){\n that._redraw(); \n });\n\n this._map.addEventListener(\"moveend\",function(){\n that._redraw(); \n });\n\n var mkrs = opts[\"markers\"];\n isArray(mkrs) && this.addMarkers(mkrs);\n};\n\n/**\n * 添加要聚合的标记数组。\n * @param {Array<Marker>} markers 要聚合的标记数组\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype.addMarkers = function(markers){\n if (!markers.length) {\n return\n }\n for(var i = 0, len = markers.length; i <len ; i++){\n this._pushMarkerTo(markers[i]);\n }\n this._createClusters(); \n};\n\n/**\n * 把一个标记添加到要聚合的标记数组中\n * @param {BMap.Marker} marker 要添加的标记\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype._pushMarkerTo = function(marker){\n var index = indexOf(marker, this._markers);\n if(index === -1){\n marker.isInCluster = false;\n this._markers.push(marker);//Marker拖放后enableDragging不做变化,忽略\n }\n};\n\n/**\n * 添加一个聚合的标记。\n * @param {BMap.Marker} marker 要聚合的单个标记。\n * @return 无返回值。\n */\nMarkerClusterer.prototype.addMarker = function(marker) {\n this._pushMarkerTo(marker);\n this._createClusters();\n};\n\n/**\n * 根据所给定的标记,创建聚合点\n * @return 无返回值\n */\nMarkerClusterer.prototype._createClusters = function(){\n var mapBounds = this._map.getBounds();\n if (!mapBounds.getCenter()) {\n return\n }\n var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize);\n for(var i = 0, marker; marker = this._markers[i]; i++){\n if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ \n this._addToClosestCluster(marker);\n }\n }\n var len = this._markers.length;\n for (var i = 0; i < len; i++) {\n if(this._clusters[i]){\n this._clusters[i].render();\n }\n } \n};\n\n/**\n * 根据标记的位置,把它添加到最近的聚合中\n * @param {BMap.Marker} marker 要进行聚合的单个标记\n *\n * @return 无返回值。\n */\nMarkerClusterer.prototype._addToClosestCluster = function (marker){\n var distance = 4000000;\n var clusterToAddTo = null;\n var position = marker.getPosition();\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){\n var center = cluster.getCenter();\n if(center){\n var d = this._map.getDistance(center, marker.getPosition());\n if(d < distance){\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){\n clusterToAddTo.addMarker(marker);\n } else {\n var cluster = new Cluster(this);\n cluster.addMarker(marker); \n this._clusters.push(cluster);\n } \n};\n\n/**\n * 清除上一次的聚合的结果\n * @return 无返回值。\n */\nMarkerClusterer.prototype._clearLastClusters = function(){\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){ \n cluster.remove();\n }\n this._clusters = [];//置空Cluster数组\n this._removeMarkersFromCluster();//把Marker的cluster标记设为false\n};\n\n/**\n * 清除某个聚合中的所有标记\n * @return 无返回值\n */\nMarkerClusterer.prototype._removeMarkersFromCluster = function(){\n for(var i = 0, marker; marker = this._markers[i]; i++){\n marker.isInCluster = false;\n }\n};\n\n/**\n * 把所有的标记从地图上清除\n * @return 无返回值\n */\nMarkerClusterer.prototype._removeMarkersFromMap = function(){\n for(var i = 0, marker; marker = this._markers[i]; i++){\n marker.isInCluster = false;\n var label = marker.getLabel();\n this._map.removeOverlay(marker);\n marker.setLabel(label);\n }\n};\n\n/**\n * 删除单个标记\n * @param {BMap.Marker} marker 需要被删除的marker\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype._removeMarker = function(marker) {\n var index = indexOf(marker, this._markers);\n if (index === -1) {\n return false;\n }\n this._map.removeOverlay(marker);\n this._markers.splice(index, 1);\n return true;\n};\n\n/**\n * 删除单个标记\n * @param {BMap.Marker} marker 需要被删除的marker\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype.removeMarker = function(marker) {\n var success = this._removeMarker(marker);\n if (success) {\n this._clearLastClusters();\n this._createClusters();\n }\n return success;\n};\n\n/**\n * 删除一组标记\n * @param {Array<BMap.Marker>} markers 需要被删除的marker数组\n *\n * @return {Boolean} 删除成功返回true,否则返回false\n */\nMarkerClusterer.prototype.removeMarkers = function(markers) {\n var success = false;\n for (var i = 0; i < markers.length; i++) {\n var r = this._removeMarker(markers[i]);\n success = success || r; \n }\n\n if (success) {\n this._clearLastClusters();\n this._createClusters();\n }\n return success;\n};\n\n/**\n * 从地图上彻底清除所有的标记\n * @return 无返回值\n */\nMarkerClusterer.prototype.clearMarkers = function() {\n this._clearLastClusters();\n this._removeMarkersFromMap();\n this._markers = [];\n};\n\n/**\n * 重新生成,比如改变了属性等\n * @return 无返回值\n */\nMarkerClusterer.prototype._redraw = function () {\n this._clearLastClusters();\n this._createClusters();\n};\n\n/**\n * 获取网格大小\n * @return {Number} 网格大小\n */\nMarkerClusterer.prototype.getGridSize = function() {\n return this._gridSize;\n};\n\n/**\n * 设置网格大小\n * @param {Number} size 网格大小\n * @return 无返回值\n */\nMarkerClusterer.prototype.setGridSize = function(size) {\n this._gridSize = size;\n this._redraw();\n};\n\n/**\n * 获取聚合的最大缩放级别。\n * @return {Number} 聚合的最大缩放级别。\n */\nMarkerClusterer.prototype.getMaxZoom = function() {\n return this._maxZoom; \n};\n\n/**\n * 设置聚合的最大缩放级别\n * @param {Number} maxZoom 聚合的最大缩放级别\n * @return 无返回值\n */\nMarkerClusterer.prototype.setMaxZoom = function(maxZoom) {\n this._maxZoom = maxZoom;\n this._redraw();\n};\n\n/**\n * 获取聚合图标的z-index\n * @return {number | undefined}\n */\nMarkerClusterer.prototype.getZIndex = function () {\n return this._zIndex;\n};\n\n/**\n * 设置聚合图标的z-index\n * @param {number} zIndex\n */\nMarkerClusterer.prototype.setZIndex = function (zIndex) {\n if (this._zIndex != zIndex) {\n this.zIndex = zIndex;\n this._redraw();\n }\n};\n\n/**\n * 获取聚合的样式风格集合\n * @return {Array<IconStyle>} 聚合的样式风格集合\n */\nMarkerClusterer.prototype.getStyles = function() {\n return this._styles;\n};\n\n/**\n * 设置聚合的样式风格集合\n * @param {Array<IconStyle>} styles 样式风格数组\n * @return 无返回值\n */\nMarkerClusterer.prototype.setStyles = function(styles) {\n this._styles = styles;\n this._redraw();\n};\n\n/**\n * 获取单个聚合的最小数量。\n * @return {Number} 单个聚合的最小数量。\n */\nMarkerClusterer.prototype.getMinClusterSize = function() {\n return this._minClusterSize;\n};\n\n/**\n * 设置单个聚合的最小数量。\n * @param {Number} size 单个聚合的最小数量。\n * @return 无返回值。\n */\nMarkerClusterer.prototype.setMinClusterSize = function(size) {\n this._minClusterSize = size;\n this._redraw();\n};\n\n/**\n * 获取单个聚合的落脚点是否是聚合内所有标记的平均中心。\n * @return {Boolean} true或false。\n */\nMarkerClusterer.prototype.isAverageCenter = function() {\n return this._isAverageCenter;\n};\n\n/**\n * 获取聚合的Map实例。\n * @return {BMap.Map} Map的示例。\n */\nMarkerClusterer.prototype.getMap = function() {\n return this._map;\n};\n\n/**\n * 获取所有的标记数组。\n * @return {Array<Marker>} 标记数组。\n */\nMarkerClusterer.prototype.getMarkers = function() {\n return this._markers;\n};\n\n/**\n * 获取聚合的总数量。\n * @return {Number} 聚合的总数量。\n */\nMarkerClusterer.prototype.getClustersCount = function() {\n var count = 0;\n for(var i = 0, cluster; cluster = this._clusters[i]; i++){\n cluster.isReal() && count++; \n }\n return count;\n};\n\n/**\n * 用于计算cluster的文本\n * @param {Array<BMap.Marker>} markers cluster的markers\n * @return {String}\n */\nMarkerClusterer.prototype._textCalculator = function(markers){\n return markers.length.toString();\n};\n\n/**\n * 用于计算cluster的styles的索引\n * @param {Array<BMap.Marker>} markers cluster的markers\n * @param {Number} stylesLength styles的总长度\n * @return {Number} styles的索引\n */\nMarkerClusterer.prototype._stylesIndexCalculator = null;/* function(markers, stylesLength){\n return -1;\n}*/\n\n/**\n * 设置计算cluster的文本的计算函数\n * @param {function(Array<BMap.Marker>)} calculator\n */\nMarkerClusterer.prototype.setTextCalculator = function(calculator){\n this._textCalculator = calculator;\n};\n\n/**\n * 设置计算cluster的styles的索引的计算函数\n * @param {function(Array<BMap.Marker>, Number)} calculator\n */\nMarkerClusterer.prototype.setStylesIndexCalculator = function(calculator){\n this._stylesIndexCalculator = calculator;\n};\n\n/**\n * @ignore\n * Cluster\n * @class 表示一个聚合对象,该聚合,包含有N个标记,这N个标记组成的范围,并有予以显示在Map上的TextIconOverlay等。\n * @constructor\n * @param {MarkerClusterer} markerClusterer 一个标记聚合器示例。\n */\nfunction Cluster(markerClusterer){\n var that = this;\n this._markerClusterer = markerClusterer;\n this._map = markerClusterer.getMap();\n this._minClusterSize = markerClusterer.getMinClusterSize();\n this._isAverageCenter = markerClusterer.isAverageCenter();\n this._center = null;//落脚位置\n this._markers = [];//这个Cluster中所包含的markers\n this._gridBounds = null;//以中心点为准,向四边扩大gridSize个像素的范围,也即网格范围\n this._isReal = false; //真的是个聚合\n\n this._clusterMarker = new TextIconOverlay(this._center, this._markers.length, {\n \"styles\": this._markerClusterer.getStyles(),\n zIndex: markerClusterer._zIndex\n });\n this._clusterMarker.getStyleByText = function (text, styles) {\n if (that._markerClusterer._stylesIndexCalculator) {\n var index = that._markerClusterer._stylesIndexCalculator(that._markers, styles.length);\n return styles[index];\n }\n return TextIconOverlay.prototype.getStyleByText.call(this, text, styles);\n };\n //this._map.addOverlay(this._clusterMarker);\n this._clusterMarker.addEventListener && this._clusterMarker.addEventListener(\"click\", function (event) {\n that._map.setViewport(that.getBounds());\n });\n}\n\n/**\n * 向该聚合添加一个标记。\n * @param {Marker} marker 要添加的标记。\n * @return 无返回值。\n */\nCluster.prototype.addMarker = function(marker){\n if(this.isMarkerInCluster(marker)){\n return false;\n }//也可用marker.isInCluster判断,外面判断OK,这里基本不会命中\n\n if (!this._center){\n this._center = marker.getPosition();\n this.updateGridBounds();//\n } else {\n if(this._isAverageCenter){\n var l = this._markers.length + 1;\n var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l;\n var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l;\n this._center = new BMap.Point(lng, lat);\n this.updateGridBounds();\n }//计算新的Center\n }\n\n marker.isInCluster = true;\n this._markers.push(marker);\n\n // var len = this._markers.length;\n // if(len < this._minClusterSize ){ \n // this._map.addOverlay(marker);\n // //this.updateClusterMarker();\n // return true;\n // } else if (len === this._minClusterSize) {\n // for (var i = 0; i < len; i++) {\n // var label = this._markers[i].getLabel();\n // this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);\n // this._markers[i].setLabel(label);\n // }\n \n // } \n // this._map.addOverlay(this._clusterMarker);\n // this._isReal = true;\n // this.updateClusterMarker();\n return true;\n};\n\nCluster.prototype.render = function(){\n var len = this._markers.length;\n \n if (len < this._minClusterSize) {\n for (var i = 0; i < len; i++) {\n this._map.addOverlay(this._markers[i]);\n }\n } else {\n this._map.addOverlay(this._clusterMarker);\n this._isReal = true;\n this.updateClusterMarker();\n }\n};\n\n/**\n * 判断一个标记是否在该聚合中。\n * @param {Marker} marker 要判断的标记。\n * @return {Boolean} true或false。\n */\nCluster.prototype.isMarkerInCluster= function(marker){\n if (this._markers.indexOf) {\n return this._markers.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; m = this._markers[i]; i++) {\n if (m === marker) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * 判断一个标记是否在该聚合网格范围中。\n * @param {Marker} marker 要判断的标记。\n * @return {Boolean} true或false。\n */\nCluster.prototype.isMarkerInClusterBounds = function(marker) {\n return this._gridBounds.containsPoint(marker.getPosition());\n};\n\nCluster.prototype.isReal = function(marker) {\n return this._isReal;\n};\n\n/**\n * 更新该聚合的网格范围。\n * @return 无返回值。\n */\nCluster.prototype.updateGridBounds = function() {\n var bounds = new BMap.Bounds(this._center, this._center);\n this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize());\n};\n\n/**\n * 更新该聚合的显示样式,也即TextIconOverlay。\n * @return 无返回值。\n */\nCluster.prototype.updateClusterMarker = function () {\n if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) {\n this._clusterMarker && this._map.removeOverlay(this._clusterMarker);\n for (var i = 0, marker; marker = this._markers[i]; i++) {\n this._map.addOverlay(marker);\n }\n return;\n }\n\n if (this._markers.length < this._minClusterSize) {\n this._clusterMarker.hide();\n return;\n }\n\n this._clusterMarker.setPosition(this._center);\n \n this._clusterMarker.setText(this._markerClusterer._textCalculator(this._markers));\n};\n\n/**\n * 删除该聚合。\n * @return 无返回值。\n */\nCluster.prototype.remove = function(){\n for (var i = 0, m; m = this._markers[i]; i++) {\n var label = this._markers[i].getLabel();\n this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);\n this._markers[i].setLabel(label);\n }//清除散的标记点\n this._map.removeOverlay(this._clusterMarker);\n this._markers.length = 0;\n delete this._markers;\n};\n\n/**\n * 获取该聚合所包含的所有标记的最小外接矩形的范围。\n * @return {BMap.Bounds} 计算出的范围。\n */\nCluster.prototype.getBounds = function() {\n var bounds = new BMap.Bounds(this._center,this._center);\n for (var i = 0, marker; marker = this._markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n};\n\n/**\n * 获取该聚合的落脚点。\n * @return {BMap.Point} 该聚合的落脚点。\n */\nCluster.prototype.getCenter = function() {\n return this._center;\n};\n\nexport default MarkerClusterer;\n","// cspell: ignore bmaplib, markerclusterer, texticonoverlay\nimport GMarkerClusterer from '@google/markerclusterer'\nimport BMarkerClusterer from 'bmaplib.markerclusterer'\nimport { noop } from '../../../utils/utils'\nimport type { Point, Size } from '../../types'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\nimport type { GoogleMarker, MarkerOverlay } from '../overlay/marker'\n\nexport interface MarkerClustererOptions {\n markers?: MarkerOverlay[]\n gridSize?: number\n maxZoom?: number\n minClusterSize?: number\n averageCenter?: boolean\n styles?: ClusterIconStyle[],\n stylesIndexCalculator?: (markersLength: number, stylesLength: number) => number,\n zIndex?: number,\n}\nexport interface ClusterIconStyle {\n url: string\n size: Size\n anchor?: Point\n offset?: Point\n textColor?: string\n textSize?: number\n}\nnamespace ClusterIconStyle {\n export function toBaidu(style: ClusterIconStyle) {\n return {\n url: style.url,\n size: new BMap.Size(style.size.width, style.size.height),\n anchor: style.anchor && new BMap.Size(style.anchor.x, style.anchor.y),\n offset: style.offset && new BMap.Size(style.offset.x, style.offset.y),\n textColor: style.textColor,\n textSize: style.textSize,\n }\n }\n\n export function toGoogle(style: ClusterIconStyle) {\n return {\n url: style.url,\n width: style.size.width,\n height: style.size.height,\n anchor: style.anchor && [style.anchor.y, style.anchor.x],\n backgroundPosition: style.offset && `${style.offset.x} ${style.offset.y}`,\n textColor: style.textColor,\n textSize: style.textSize,\n }\n }\n\n}\n\n// cSpell:words nodraw\n/**\n * ## GMarkerClusterer 和 BMarkerClusterer 的区别\n *\n * GMarkerClusterer\n * - resetViewport(): 移除\n * - redraw(): 绘制新的\n * - repaint(): 先移除, 再绘制\n * - setXxx(): 只修改值, 不触发repaint()\n * - add/removeMarker/s(): 接收`opt_nodraw`参数, 为true时不触发redraw/repaint()\n * - clearMarkers(): 只有clear才会将marker从map上移除\n *\n * BMarkerClusterer\n * - _clearLastClusters(): 移除\n * - _createClusters(): 绘制新的\n * - _redraw(): 先移除, 再重绘\n * - setXxx(): 修改值, 同时触发_redraw()\n * - add/removeMarker/s(): 每次都触发_redraw/_createClusters()\n * - clearMarkers(): 同GMarkerClusterer\n *\n * H.clustering.Provider(here的点聚合工具类)\n * - 和baidu/google的api有很大不同, 但总体倾向于baidu的实现, 每次修改坐标点都触发重新计算点聚合\n */\nexport abstract class MarkerClusterer {\n abstract inner: any\n constructor(\n public map: AbstractMap,\n ) {\n noop()\n }\n /** baidu/google 拥有相同的函数名 */\n clearMarkers() {\n this.inner.clearMarkers()\n }\n /** @see clearMarkers */\n addMarker(marker: MarkerOverlay) {\n this.inner.addMarker(marker.innerOverlay)\n }\n /** @see clearMarkers */\n removeMarker(marker: MarkerOverlay): boolean {\n return this.inner.removeMarker(marker.innerOverlay)\n }\n /** @see clearMarkers */\n addMarkers(markers: MarkerOverlay[]) {\n this.inner.addMarkers(markers.map(it => it.innerOverlay))\n }\n /** @see clearMarkers */\n removeMarkers(markers: MarkerOverlay[]): boolean {\n return this.inner.removeMarkers(markers.map(it => it.innerOverlay))\n }\n\n abstract recreate(): void\n}\n\nexport class BaiduMarkerClusterer extends MarkerClusterer {\n inner: BMarkerClusterer\n constructor(map: BaiduMap, options: MarkerClustererOptions) {\n super(map)\n // ## webpack:\n // 延时导入, 防止BMap不存在\n // const BMarkerClusterer = require('bmaplib.markerclusterer')\n // ## vite:\n // import导入是异步的, 故无法写在这里, 改成在模块顶部直接导入\n // TODO: 2023/03/16 ipcjs 会不会有初始化时机的问题?\n this.inner = new BMarkerClusterer(map.innerMap, {\n // baidu的构造器中的markers, 会触发重绘, 会导致使用旧的calculator计算cluster\n // markers: options.markers?.map(it => (it as BaiduMarker).innerOverlay),\n gridSize: options.gridSize,\n maxZoom: options.maxZoom,\n minClusterSize: options.minClusterSize,\n isAverageCenter: options.averageCenter,\n styles: options.styles?.map(it => ClusterIconStyle.toBaidu(it)),\n zIndex: options.zIndex,\n })\n const calculator = options.stylesIndexCalculator\n if (calculator) {\n this.inner.setStylesIndexCalculator((markers: any[], stylesLength: number) => {\n return calculator(markers.length, stylesLength)\n })\n }\n // 在设置了calculator后再添加marker\n if (options.markers) {\n this.addMarkers(options.markers)\n }\n }\n override recreate(): void {\n this.inner._redraw()\n }\n}\nexport class GoogleMarkerClusterer extends MarkerClusterer {\n inner: GMarkerClusterer\n constructor(map: GoogleMap, options: MarkerClustererOptions) {\n super(map)\n this.inner = new GMarkerClusterer(\n map.innerMap,\n // google的构造器中的markers,不会触发重绘, 第一次绘制通过监听地图的'idle'事件触发, 可以直接设置\n options.markers?.map(it => (it as GoogleMarker).innerOverlay),\n {\n gridSize: options.gridSize,\n maxZoom: options.maxZoom,\n minimumClusterSize: options.minClusterSize,\n averageCenter: options.averageCenter,\n styles: options.styles?.map(it => ClusterIconStyle.toGoogle(it)),\n zIndex: options.zIndex,\n },\n )\n const calculator = options.stylesIndexCalculator\n if (calculator) {\n this.inner.setCalculator((markers: any[], stylesLength: number) => {\n return {\n text: markers.length,\n // google内部, 取index时, 会`-1`...故我们这里`+1`, 抵消掉它\n index: calculator(markers.length, stylesLength) + 1,\n }\n })\n }\n }\n override recreate(): void {\n this.inner.repaint()\n }\n}\n","import { LatLng, LatLngBounds, Location, noop, throwUnsupported, type AbstractMap } from '../../../components'\nimport { parseGooglePlace } from '../../../utils/google-utils'\nimport type { UnionPlacesService } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\n\nexport interface Place {\n id: string\n position: LatLng\n country: string\n province: string\n city: string\n title: string\n address: string\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PlacesServiceOptions {\n\n}\n\nexport abstract class PlacesService {\n abstract inner: UnionPlacesService\n abstract map: AbstractMap\n constructor(\n ) { noop() }\n\n /** 指定{@link location}搜索, 若不指定, 则默认使用地图的中心点 */\n abstract search(query: string, location?: Location): Promise<Place[]>\n /** 在指定的bounds范围内搜索 */\n abstract searchInBounds(query: string, bounds: LatLngBounds): Promise<Place[]>\n /** 在指定的center+radius范围内搜索 */\n abstract searchNearBy(query: string, center: LatLng, radius: number): Promise<Place[]>\n}\n\nexport class GooglePlacesService extends PlacesService {\n inner: google.maps.places.PlacesService\n constructor(public map: GoogleMap, _options: PlacesServiceOptions) {\n super()\n this.inner = new google.maps.places.PlacesService(map.innerMap)\n }\n override search(query: string, location?: Location): Promise<Place[]> {\n return this.searchImpl(\n query,\n location instanceof LatLng ? location.toGoogle(this.map.coordType) : location ?? this.map.innerMap.getCenter(),\n )\n }\n override searchInBounds(query: string, bounds: LatLngBounds) {\n return this.searchImpl(query, bounds.toGoogle(this.map.coordType))\n }\n override searchNearBy(query: string, center: LatLng, radius: number) {\n return this.searchImpl(query, { center: center.toGoogle(this.map.coordType), radius: radius })\n }\n\n private searchImpl(\n query: string,\n locationBias?: google.maps.LatLng | google.maps.LatLngLiteral |\n google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral |\n google.maps.Circle | google.maps.CircleLiteral | string,\n ): Promise<Place[]> {\n return new Promise((resolve, reject) => {\n this.inner.findPlaceFromQuery({\n query: query,\n fields: [\n 'formatted_address',\n 'geometry',\n 'name',\n 'place_id',\n // 'address_components', // TODO: 2023/04/28 ipcjs 查询请求不支持该字段...\n ],\n locationBias,\n }, (results, status) => {\n switch (status) {\n case google.maps.places.PlacesServiceStatus.ZERO_RESULTS:\n case google.maps.places.PlacesServiceStatus.OK: {\n const places = (results ?? []).map(result => parseGooglePlace(result, this.map))\n resolve(places)\n break\n }\n default:\n reject(new Error(`status: ${status}`))\n break\n }\n })\n })\n }\n}\n\nexport class BaiduPlacesService extends PlacesService {\n private searchRequestMap = new Map<string, { resolve: any, reject: any }>()\n get inner() {\n return this.currentSearch!\n }\n currentSearch: BMap.LocalSearch | undefined\n constructor(public map: BaiduMap, _options: PlacesServiceOptions) {\n super()\n }\n override search(query: string, location?: Location): Promise<Place[]> {\n return this.newSearch(\n location instanceof LatLng ? location.toBaidu(this.map.coordType) : location ?? this.map.innerMap.getCenter(),\n (search) => {\n search.search(query)\n },\n )\n }\n\n override searchInBounds(query: string, bounds: LatLngBounds): Promise<Place[]> {\n return this.newSearch(undefined, (search) => {\n search.searchInBounds(query, bounds.toBaidu(this.map.coordType))\n })\n }\n\n override searchNearBy(query: string, center: LatLng, radius: number): Promise<Place[]> {\n return this.newSearch(undefined, (search) => {\n search.searchNearby(query, center.toBaidu(this.map.coordType), radius)\n })\n }\n\n private newSearch(location: string | BMap.Point | undefined, block: (search: BMap.LocalSearch) => void) {\n return new Promise<Place[]>((resolve, reject) => {\n const search = new BMap.LocalSearch(location ?? this.map.innerMap, {\n onSearchComplete: (result) => {\n if (Array.isArray(result)) {\n throwUnsupported('当前只支持一次搜索一条数据')\n }\n const status = search.getStatus()\n switch (status) {\n case BMAP_STATUS_SUCCESS: {\n // TODO: 2023/04/28 ipcjs 怎么处理分页?\n const places: Place[] = []\n for (let i = 0; i < result.getCurrentNumPois(); i++) {\n const poi = result.getPoi(i)\n places.push({\n id: poi.uid,\n city: poi.city,\n country: '', // 百度地图只支持中国\n position: LatLng.fromBaidu(poi.point, this.map.coordType),\n province: poi.province,\n title: poi.title,\n address: poi.address,\n })\n }\n resolve(places)\n break\n }\n case BMAP_STATUS_UNKNOWN_LOCATION:\n // 和google保持一致, 未找到时直接返回空数组\n resolve([])\n break\n default:\n reject(new Error(`status: ${status}`))\n break\n }\n },\n })\n block(search)\n })\n }\n}\n","import { parseGooglePlace } from '../../../utils/google-utils'\nimport { noop, throwError } from '../../../utils/utils'\nimport type { EventCallback } from '../../../utils/vue-utils'\nimport { addGoogleEventListener, type RemoveEventListenerFunction } from '../../event-target'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\nimport type { Autocomplete } from './autocomplete'\nimport type { Place, PlacesService } from './places-service'\n\nexport interface SearchBoxOptions {\n input: HTMLInputElement,\n}\n\nexport abstract class SearchBox {\n protected onData: EventCallback<Place[]> | undefined\n protected onError: ((e: any) => void) | undefined\n constructor(\n public map: AbstractMap,\n protected input: HTMLInputElement,\n ) { noop() }\n\n /**\n * 设置搜索结果监听\n *\n * @mustCallSuper 子类必须调用一次`super.setSearchListener`, 用来保存{@link onData}和{@link onError}\n * */\n setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n if (this.onData) throwError('setSearchListener只能调用一次')\n this.onData = onData\n this.onError = onError\n return noop\n }\n\n /** 用输入框的内容执行一次搜索 */\n abstract search(): void\n}\n\nexport class GoogleSearchBox extends SearchBox {\n private searchBox: google.maps.places.SearchBox\n constructor(map: GoogleMap, options: SearchBoxOptions) {\n super(map, options.input)\n this.searchBox = new google.maps.places.SearchBox(options.input)\n this.searchBox.bindTo('bounds', map.innerMap)\n }\n\n override setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n super.setSearchListener(onData, onError)\n return addGoogleEventListener(this.searchBox, 'places_changed', () => {\n const places = this.searchBox.getPlaces() // 返回数据不包含address_components字段...\n onData((places ?? []).map(it => parseGooglePlace(it, this.map)))\n })\n }\n\n override search(): void {\n if (!this.input.value) return\n // https://stackoverflow.com/questions/20407045/google-maps-trigger-search-box-on-button-click\n // 1. 聚焦\n google.maps.event.trigger(this.input, 'focus', {})\n // 2. 回车, 执行搜索\n google.maps.event.trigger(this.input, 'keydown', { keyCode: 13 })\n }\n}\nexport class BaiduSearchBox extends SearchBox {\n private autocomplete: Autocomplete\n private placesService: PlacesService\n constructor(map: BaiduMap, options: SearchBoxOptions) {\n super(map, options.input)\n this.autocomplete = map.createAutocomplete({ input: options.input, bindToMap: true })\n this.placesService = map.createPlacesService({})\n }\n\n override setSearchListener(onData: EventCallback<Place[]>, onError?: (e: any) => void): RemoveEventListenerFunction {\n super.setSearchListener(onData, onError)\n return this.autocomplete.addResultListener((result) => {\n this.searchImpl(result.country + result.province + result.city + result.district + result.street + result.streetNumber + result.title)\n })\n }\n\n override search(): void {\n if (!this.input.value) return\n this.searchImpl(this.input.value)\n }\n\n private searchImpl(value: string) {\n this.placesService.search(value)\n .then(this.onData, this.onError)\n }\n}\n","import type * as CSS from 'csstype'\nimport { lateinit } from '../../utils/mapped-types'\nimport type { Tg } from '../event'\nimport type { AbstractEventTargetDelegate } from '../event-target'\nimport type { CoordType, CoordTypeSupplier, LatLng, LatLngBounds } from '../lat-lng'\nimport type { Padding, Point } from '../types'\nimport type { UnionMap } from '../unions'\nimport type { AbstractControl, CustomControl } from './controls/control'\nimport type { MapTypeControl, MapTypeControlOptions } from './controls/map-type.control'\nimport type { ScaleControlOptions } from './controls/scale.control'\nimport type { StreetViewControl, StreetViewControlOptions } from './controls/street-view.control'\nimport type { ZoomControl, ZoomControlOptions } from './controls/zoom.control'\nimport type { Autocomplete, AutocompleteOptions } from './extra/autocomplete'\nimport type { Heatmap, HeatmapOptions } from './extra/heatmap'\nimport type { MapUrls, MapUrlsOptions } from './extra/map-urls'\nimport type { MarkerClusterer, MarkerClustererOptions } from './extra/marker-clusterer'\nimport type { PlacesService, PlacesServiceOptions } from './extra/places-service'\nimport type { SearchBox, SearchBoxOptions } from './extra/search-box'\nimport type { GestureHandlingOptions, MapStyle } from './map-options'\nimport type { BuildInMapTypeId, Layer, MapType, OverlayMapType } from './map-type'\nimport type { CircleOptions, CircleOverlay } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport type { InfoBoxOptions, InfoBoxOverlay } from './overlay/info-box'\nimport type { InfoWindowOptions, InfoWindowOverlay } from './overlay/info-window'\nimport type { LabelOptions, LabelOverlay } from './overlay/label'\nimport type { MarkerOptions, MarkerOverlay } from './overlay/marker'\nimport type { Overlay } from './overlay/overlay'\nimport type { PolygonOptions, PolygonOverlay } from './overlay/polygon'\nimport type { PolylineOptions, PolylineOverlay } from './overlay/polyline'\nimport type { RectangleOptions, RectangleOverlay } from './overlay/rectangle'\n\nexport type AbstractMapEventMap = {\n click: Tg.MouseEvent\n dblclick: Tg.MouseEvent\n /** @deprecated 使用`contextmenu`替代 */\n rightclick: Tg.MouseEvent\n contextmenu: Tg.MouseEvent\n\n dragstart: Tg.Event\n drag: Tg.Event\n dragend: Tg.Event\n\n /**\n * ## 不同行为\n * - baidu: 不会触发\n * - google: 正常触发\n */\n mouseover: Tg.MouseEvent\n /** @see mouseover */\n mouseout: Tg.MouseEvent\n\n mousedown: Tg.MouseEvent\n mousemove: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n\n tilesloaded: Tg.Event\n /**\n * ## 不同实现\n * - baidu: 同时监听movestart & moving & moveend & zoomend事件, 只要地图\"移动\"就会触发\n * - google: 监听center_changed事件, 拖着地图移动时会不断触发, 松手后只触发一次, center的值直接变为地图停止时的最终值...\n */\n 'center-changed': Tg.Event\n /**\n * ## 不同实现\n * - baidu: 监听zoomend事件\n * - google: 监听zoom_changed事件\n */\n 'zoom-changed': Tg.Event\n 'map-type-changed': Tg.Event\n}\n\n/** 预设的几个地图Zoom等级 */\nexport const enum MapZoom {\n /** 世界 */\n WORLD = 1,\n /** 大洲 */\n STATE = 5,\n /** 城市 */\n CITY = 10,\n /** 街道 */\n STREET = 15,\n /** 建筑 */\n BUILDING = 20,\n}\n\n/** 抽象出来的Map类 */\nexport abstract class AbstractMap implements CoordTypeSupplier, Tg.EventTarget {\n private latestInfoWindow: InfoWindowOverlay | undefined\n /** 使用{@link setEventTargetDelegate}初始化 */\n private delegate = lateinit<AbstractEventTargetDelegate>()\n constructor(\n public element: HTMLElement,\n ) {\n if (process.env.NODE_ENV !== 'production') {\n setTimeout(() => {\n if (!this.delegate) {\n console.warn(`${this.constructor.name}继承了AbstractMap, 但未调用setEventTargetDelegate(delegate)`)\n }\n })\n }\n }\n abstract setGestureHandling(gestureHandling: GestureHandlingOptions): void\n\n abstract get innerMap(): UnionMap\n abstract get coordType(): CoordType\n protected setEventTargetDelegate(delegate: AbstractEventTargetDelegate) {\n this.delegate = delegate.setTarget(this)\n }\n /** 使用重载, 规范事件类型 */\n addEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void\n addEventListener(type: string, listener: Tg.EventListener): void\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n /** @see addEventListener */\n removeEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void\n removeEventListener(type: string, listener: Tg.EventListener): void\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n\n /** 最后一次显示的InfoWindow, 不保证当前它仍然是打开状态 */\n getLatestInfoWindow(): InfoWindowOverlay | undefined {\n return this.latestInfoWindow\n }\n /** 仅用于@tg/map内部使用, 外部不要调用 */\n setLatestInfoWindowInternal(infoWindow: InfoWindowOverlay) {\n this.latestInfoWindow = infoWindow\n }\n /** 地图容器内的坐标点到经纬度之间转换 */\n abstract fromContainerPointToLatLng(point: Point): LatLng\n /** @see fromContainerPointToLatLng */\n abstract fromLatLngToContainerPoint(latLng: LatLng): Point\n abstract setDefaultCursor(cursor: CSS.Property.Cursor): void\n /**\n * ## 不同行为\n * - baidu: 禁用拖拽后, 依然可以滚轮缩放\n * - google: 禁用拖拽后, 不能滚轮缩放\n */\n abstract setDraggable(draggable: boolean): void\n /** 启用/禁用双击放大 */\n abstract setDoubleClickZoom(enable: boolean): void\n abstract getCenter(): LatLng\n /**\n * ## {@link setZoom}和{@link setCenter}的调用顺序问题\n * - baidu: 这两个方法调用是区分顺序的, 若先调用`setCenter`再调用`setZoom`, 中心点会出现偏移\n * - google: 不区分顺序\n */\n abstract setCenter(latlng: LatLng): void\n abstract setMinZoom(zoom: number): void\n abstract setMaxZoom(zoom: number): void\n abstract setMapStyle(mapStyle?: MapStyle): void\n /** setMapType的便利版, 只能够用来设置内置地图类型 */\n abstract setBuildInMapTypeId(id: BuildInMapTypeId): void\n abstract setMapType(mapType: MapType): void\n abstract getMapType(): MapType\n abstract addLayer(layer: Layer): void\n abstract removeLayer(layer: Layer): void\n addOverlayMapType(mapType: OverlayMapType): void {\n this.addLayer(mapType)\n }\n removeOverlayMapType(mapType: OverlayMapType): void {\n this.removeLayer(mapType)\n }\n abstract panTo(position: LatLng): void\n abstract panBy(x: number, y: number): void\n abstract fitBounds(bounds: LatLngBounds, padding?: Padding): void\n abstract getBounds(): LatLngBounds\n // Overlay\n abstract addElementOverlay(overlay: ElementOverlay): void\n abstract removeElementOverlay(overlay: ElementOverlay): void\n abstract addOverlay(overlay: Overlay): void\n abstract removeOverlay(overlay: Overlay): void\n abstract createMarker(options: MarkerOptions): MarkerOverlay\n abstract createMarkerClusterer(options: MarkerClustererOptions): MarkerClusterer\n abstract createHeatmap(options: HeatmapOptions): Heatmap\n abstract createAutocomplete(options: AutocompleteOptions): Autocomplete\n abstract createSearchBox(options: SearchBoxOptions): SearchBox\n abstract createPlacesService(options: PlacesServiceOptions): PlacesService\n abstract createMapUrls(options: MapUrlsOptions): MapUrls\n abstract createInfoWindow(options: InfoWindowOptions): InfoWindowOverlay\n abstract createInfoBox(options: InfoBoxOptions): InfoBoxOverlay\n abstract createPolyline(options: PolylineOptions): PolylineOverlay\n abstract createPolygon(options: PolygonOptions): PolygonOverlay\n abstract createRectangle(options: RectangleOptions): RectangleOverlay\n abstract createCircle(options: CircleOptions): CircleOverlay\n abstract createLabel(options: LabelOptions): LabelOverlay\n // Control\n /**\n * ## 不同行为\n * - baidu: 添加的同一个方位的自定义Control会重叠在一起\n * - google: 添加的同一个方位的自定义Control不会重叠, 会平铺开来\n */\n abstract addCustomControl(control: CustomControl): void\n abstract removeCustomControl(control: CustomControl): void\n abstract createMapTypeControl(options: MapTypeControlOptions): MapTypeControl\n abstract createZoomControl(options: ZoomControlOptions): ZoomControl\n abstract createStreetViewControl(options: StreetViewControlOptions): StreetViewControl\n abstract createScaleControl(options: ScaleControlOptions): ZoomControl\n addControl(control: AbstractControl): void {\n control.addTo(this)\n }\n removeControl(control: AbstractControl): void {\n control.removeFrom(this)\n }\n // 同名方法\n getZoom(): number {\n return this.innerMap.getZoom() ?? 0\n }\n /** @see setCenter */\n setZoom(zoom: number): void {\n this.innerMap.setZoom(zoom)\n }\n}\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(val) {\n return val != null && typeof val === 'object' && Array.isArray(val) === false;\n}\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObjectObject(o) {\n return isObject(o) === true\n && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObjectObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (typeof ctor !== 'function') return false;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObjectObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexport default isPlainObject;\n","import isPlainObject from 'is-plain-object'\n\nexport namespace Objects {\n export function fromArray<T>(arr: T[], keySelector: (it: T) => string) {\n return arr.reduce((r, it) => {\n r[keySelector(it)] = it\n return r\n }, {} as { [key: string]: T })\n }\n\n export function fromEntries<V>(entries: [string, V][]) {\n return entries.reduce((r, it) => {\n r[it[0]] = it[1]\n return r\n }, {} as { [k: string]: V })\n }\n\n export function toJsonSafely(value: any) {\n return JSON.stringify(value, (key, value) => {\n if (typeof value === 'object' && Object.getPrototypeOf(value) !== Object.prototype) {\n // 针对非纯对象做特殊处理, 防止stringify中报错\n return value.toString !== Object.prototype.toString\n ? value.toString() // 自定义了toString, 则使用\n : `[object ${Object.getPrototypeOf(value).constructor.name}]` // 否则打印构造器的名字\n }\n return value\n })\n }\n\n /** 删除obj中纯对象上的值为undefined的属性 */\n export function deleteUndefinedPropertyOnPlainObjectDeeply(obj: any) {\n if (isPlainObject(obj)) {\n Object.keys(obj).forEach((key) => {\n if (obj[key] === undefined) {\n delete obj[key]\n } else {\n deleteUndefinedPropertyOnPlainObjectDeeply(obj[key])\n }\n })\n }\n }\n /** 存在则返回, 不存在则新建 */\n export function putIfAbsent<K extends keyof any, V>(\n obj: Record<K, V>,\n key: K,\n ifAbsent: () => Exclude<V, undefined>,\n ) {\n let value = obj[key]\n if (value === undefined) {\n value = ifAbsent()\n obj[key] = value\n }\n return value as Exclude<V, undefined>\n }\n\n /** @see Omit */\n export function omit<T, K extends keyof any>(obj: T, ...keys: K[]): Omit<T, K> {\n const includes = includesMethod(keys)\n\n const result: any = {}\n for (const key in obj) {\n if (!includes(key)) {\n result[key] = obj[key]\n }\n }\n return result\n }\n /** @see Pick */\n export function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n const includes = includesMethod(keys)\n\n const result: any = {}\n for (const key in obj) {\n if (includes(key)) {\n result[key] = obj[key]\n }\n }\n return result\n }\n /**\n * 使用{@link keyPath}读取`obj`的字段\n *\n * @param keyPath `.`分隔的字段名 或 字段名数组\n * @returns 若字段不存在, 则返回`undefined`\n */\n export function get(obj: any, keyPath: string | string[]): any {\n const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath\n let value = obj\n for (const key of keys) {\n if (value == null) {\n return undefined\n }\n value = value[key]\n }\n return value\n }\n export function del(obj: any, keyPath: string | string[]): any {\n const keys = typeof keyPath === 'string' ? keyPath.split('.') : keyPath\n const lastObj = get(obj, keys.slice(0, -1))\n const lastKey = keys[keys.length - 1]\n if (lastObj != null) {\n delete lastObj[lastKey]\n }\n }\n}\n\nfunction includesMethod(keys: any[]) {\n if (keys.length <= 4) {\n return keys.includes.bind(keys)\n } else {\n const keySet = new Set(keys)\n return keySet.has.bind(keySet)\n }\n}\n\n/** 用于替代Vue2中的filter, 直接交给模板使用 */\nexport const stringify = Objects.toJsonSafely\n","import deepmerge from 'deepmerge'\nimport isPlainObject from 'is-plain-object'\nimport { Objects } from '../../utils/objects'\nimport { LatLng } from '../lat-lng'\nimport type { BuildInMapTypeId } from './map-type'\n\nexport const InfoWindowModeValues = ['single', 'multi'] as const\n\nexport type InfoWindowMode = typeof InfoWindowModeValues[number]\n\n/**\n * 完全模仿google的模式, 合并如下配置:\n * - draggable\n * - scrollWheel\n * - doubleClickZoom\n */\nexport enum GestureHandlingOptions {\n /** 默认, 若页面可滚动, 则为cooperative, 否则为greedy */\n auto = 'auto',\n /** 全部设为false */\n none = 'none',\n /** 贪婪, 全部设为true */\n greedy = 'greedy',\n /** 合作, 按住ctrl或者双指才能缩放地图 */\n cooperative = 'cooperative'\n}\n\nexport interface MapOptions {\n /** 中心点 */\n center: LatLng\n /** 缩放等级, 必须是整数 */\n zoom: number\n /**\n * ## 不同行为\n * - baidu: 只支持单窗口\n * - google: 支持单窗口或多窗口, 默认多窗口\n *\n * 要显示多个弹窗, 推荐使用InfoBox替代\n *\n * {@macros info_window_vs_box}\n */\n infoWindowMode?: InfoWindowMode\n gestureHandling?: GestureHandlingOptions\n minZoom?: number\n maxZoom?: number\n mapStyle?: MapStyle\n buildInMapTypeId?: BuildInMapTypeId\n}\n\nexport namespace MapOptions {\n export function create(options?: Partial<MapOptions>): MapOptions {\n // 删掉多余的undefined属性, 防止覆盖默认值\n Objects.deleteUndefinedPropertyOnPlainObjectDeeply(options)\n const defaultOptions = { center: LatLng.ZERO, zoom: 5 }\n\n const mergeOptions: deepmerge.Options = {\n isMergeableObject: isPlainObject,\n }\n return deepmerge(defaultOptions, options || {}, mergeOptions)\n }\n}\n\n/**\n * ## 本地样式编辑器\n * - google: https://mapstyle.withgoogle.com/\n * - baidu: https://lbsyun.baidu.com/apiconsole/custommap\n *\n * ## 关于云端样式\n * - google: mapId只有创建时有效, 之后再更改无效\n * - baidu: styleId无效, 原因未知\n */\nexport interface MapStyle {\n baidu: BMap.MapStyleV2\n google: {\n styles?: google.maps.MapTypeStyle[],\n mapId?: string,\n }\n}\n","import type { Tg } from '../../event'\nimport { BaiduEventTargetDelegate, GoogleEventTargetDelegate, type EventTargetDelegate } from '../../event-target'\nimport type { CoordType } from '../../lat-lng'\nimport type { UnionBaiduOverlay, UnionGoogleOverlay } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { AbstractMap } from '../map'\n\nexport interface OverlayOptions {\n /** @default true */\n visible?: boolean\n}\n\nexport abstract class Overlay<T = unknown> implements Tg.EventTarget {\n constructor(\n public innerOverlay: T,\n /** 用于保存Overlay内部点的坐标, 它的值有可能和map的不同 */\n protected coordType: CoordType,\n ) { }\n protected abstract map: AbstractMap\n\n // 使用方法创建Delegate, 子类复写起来更方便\n protected abstract createDelegate(): EventTargetDelegate\n\n private _delegate: EventTargetDelegate | undefined\n private get delegate(): EventTargetDelegate {\n this._delegate ??= this.createDelegate().setTarget(this)\n return this._delegate\n }\n\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n\n remove() {\n this.map.removeOverlay(this)\n }\n\n abstract isVisible(): boolean\n abstract setVisible(visible: boolean): void\n}\n\nexport class GoogleOverlay<T extends UnionGoogleOverlay = UnionGoogleOverlay> extends Overlay<T> {\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n protected override map: GoogleMap,\n ) {\n super(innerOverlay, coordType)\n }\n\n protected createDelegate(): EventTargetDelegate {\n return new GoogleEventTargetDelegate(this.innerOverlay, this.map)\n }\n\n override isVisible() {\n return this.innerOverlay.getVisible()\n }\n override setVisible(visible: boolean) {\n this.innerOverlay.setVisible(visible)\n }\n}\n\nexport class BaiduOverlay<T extends UnionBaiduOverlay = UnionBaiduOverlay> extends Overlay<T> {\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n protected override map: BaiduMap,\n ) {\n super(innerOverlay, coordType)\n }\n\n protected createDelegate(): EventTargetDelegate {\n return new BaiduEventTargetDelegate(this.innerOverlay, this.map)\n }\n\n /** 仅限内部使用; 设为private时, 生成的d.ts文件中, 方法返回值会变成any, 故改成了public */\n get overlay() {\n // 这几个属性被声明成可选的, 这里将其强转成必选\n return this.innerOverlay as Required<Pick<UnionBaiduOverlay, 'isVisible' | 'show' | 'hide'>>\n }\n\n override isVisible() {\n return this.overlay.isVisible()\n }\n\n override setVisible(visible: boolean) {\n if (visible) {\n this.overlay.show()\n } else {\n this.overlay.hide()\n }\n }\n\n /** 在创建BaiduOverlay时, 设置options.visible, 仅内部使用 */\n visibleOptionInternal(visible: boolean | undefined) {\n if (visible !== undefined) {\n if (!visible) {\n this.setVisible(false)\n }\n }\n return this\n }\n}\n","import type { CoordType } from '../../lat-lng'\nimport type { UnionBaiduShape, UnionGoogleShape } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { SymbolIcon } from './icon'\nimport { BaiduOverlay, GoogleOverlay, type OverlayOptions } from './overlay'\n\nexport interface ShapeOptions extends OverlayOptions {\n clickable?: boolean\n editable?: boolean\n strokeColor?: string\n strokeOpacity?: number\n /**\n * ## 取值范围不同\n * - google: 最大值约为32, 更大的值不影响线宽\n * - baidu: 没有上限\n */\n strokeWeight?: number\n fillColor?: string\n fillOpacity?: number\n}\n\nexport interface Shape {\n isEditable(): boolean\n setEditable(editable: boolean): void\n setStrokeColor(color: string): void\n setStrokeOpacity(opacity: number): void\n setStrokeWeight(weight: number): void\n /** Polyline 没有该方法 */\n setFillColor(color: string): void\n /** @see setFillColor */\n setFillOpacity(opacity: number): void\n}\n\nexport type NotFillableShape = Omit<Shape, 'setFillColor' | 'setFillOpacity'>\n\nexport type NotFillableShapeOptions = Omit<ShapeOptions, 'fillColor' | 'fillOpacity'>\n\nexport abstract class BaiduShape<T extends UnionBaiduShape> extends BaiduOverlay<T> implements Shape {\n /**\n * baidu地图的透明度属性有如下问题:\n * - 在透明度为0时, 无法隐藏掉颜色\n * - 透明度为0.7和0.8时, 在maintain的发布模式下, polyline的线条会不可见 (原因未知, 在tg-map中无法复现)\n * 故统一加个0.001, 规避这些问题...\n */\n static OPACITY_DELTA = 0.001\n constructor(\n innerOverlay: T,\n coordType: CoordType,\n map: BaiduMap,\n protected state: { editable: boolean, symbolIcons?: SymbolIcon[] },\n ) {\n super(innerOverlay, coordType, map)\n }\n isEditable(): boolean {\n return this.state.editable\n }\n setEditable(editable: boolean): void {\n this.state.editable = editable\n editable ? this.innerOverlay.enableEditing() : this.innerOverlay.disableEditing()\n }\n\n setStrokeColor(color: string): void {\n this.innerOverlay.setStrokeColor(color)\n }\n setStrokeOpacity(opacity: number): void {\n this.innerOverlay.setStrokeOpacity(opacity + BaiduShape.OPACITY_DELTA)\n }\n setStrokeWeight(weight: number): void {\n this.innerOverlay.setStrokeWeight(weight)\n }\n setFillColor(color: string): void {\n this.innerOverlay.setFillColor(color)\n }\n setFillOpacity(opacity: number): void {\n this.innerOverlay.setFillOpacity(opacity + BaiduShape.OPACITY_DELTA)\n }\n}\n\nexport abstract class GoogleShape<T extends UnionGoogleShape> extends GoogleOverlay<T> implements Shape {\n isEditable(): boolean {\n return this.innerOverlay.getEditable()\n }\n setEditable(editable: boolean): void {\n this.innerOverlay.setEditable(editable)\n }\n\n setStrokeColor(color: string): void {\n this.innerOverlay.setOptions({ strokeColor: color })\n }\n setStrokeOpacity(opacity: number): void {\n this.innerOverlay.setOptions({ strokeOpacity: opacity })\n }\n setStrokeWeight(weight: number): void {\n this.innerOverlay.setOptions({ strokeWeight: weight })\n }\n setFillColor(color: string): void {\n this.innerOverlay.setOptions({ fillColor: color })\n }\n setFillOpacity(opacity: number): void {\n this.innerOverlay.setOptions({ fillOpacity: opacity })\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type CircleEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n 'radius-changed': Tg.Event,\n 'center-changed': Tg.Event,\n}\n\nexport interface CircleOptions extends ShapeOptions {\n center: LatLng\n radius: number\n}\n\nexport interface Circle extends Tg.EventTargetTyped<Circle, CircleEventMap>, Shape {\n setCenter(center: LatLng): void\n getCenter(): LatLng\n setRadius(radius: number): void\n getRadius(): number\n}\n\nexport type CircleOverlay = Circle & Overlay\n\nexport class BaiduCircle extends BaiduShape<BMap.Circle> implements Circle {\n static create(this: BaiduMap, options: CircleOptions) {\n const coord = this.coordType\n const inner = new BMap.Circle(options.center.toBaidu(coord), options.radius, {\n enableClicking: options.clickable,\n // 详见: {@macros circle.baidu.radius_maybe_zero}\n enableEditing: false, // options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n const circle = new BaiduCircle(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n // {@template circle.baidu.radius_maybe_zero}\n // 在创建inner时直接设置成可编辑状态, 有时会出现半径变成0的情况\n // 改成延后一帧设置, 可以规避该问题\n // {@endtemplate}\n if (circle.state.editable) {\n setTimeout(() => {\n if (circle.state.editable) {\n inner.enableEditing()\n }\n }, 0)\n }\n return circle\n }\n\n private prevCenter: BMap.Point | undefined\n private prevRadius: number | undefined\n private isDoingSetCenter = false\n private isDoingSetRadius = false\n private eventHubDelegate: EventHubEventTargetDelegate<'radius-changed'|'center-changed'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['radius-changed', 'center-changed'],\n onListen: (type) => {\n // 从lineupdate事件中过滤出单个属性的变更的逻辑, 参考: [BaiduPolyShape](file://./polyline.ts#L40)\n if (type === 'radius-changed') {\n this.prevRadius = this.innerOverlay.getRadius()\n this.innerOverlay.addEventListener('lineupdate', this.onRadiusChanged)\n } else {\n this.prevCenter = this.innerOverlay.getCenter()\n this.innerOverlay.addEventListener('lineupdate', this.onCenterChanged)\n }\n },\n onCancel: (type) => {\n this.innerOverlay.removeEventListener('lineupdate', type === 'radius-changed' ? this.onRadiusChanged : this.onCenterChanged)\n },\n }))\n }\n\n private onRadiusChanged = () => {\n const radius = this.innerOverlay.getRadius()\n if (this.prevRadius !== radius) {\n if (!this.isDoingSetRadius) this.eventHubDelegate?.notify({ type: 'radius-changed', target: this })\n this.prevRadius = radius\n }\n }\n private onCenterChanged = () => {\n const center = this.innerOverlay.getCenter()\n if (this.prevCenter !== center) {\n if (!this.isDoingSetCenter) this.eventHubDelegate?.notify({ type: 'center-changed', target: this })\n this.prevCenter = center\n }\n }\n\n private resetEditableTimeoutId : TimeoutId | undefined\n\n setCenter(center: LatLng): void {\n this.coordType = this.map.coordType\n this.isDoingSetCenter = true\n this.innerOverlay.setCenter(center.toBaidu(this.coordType))\n this.isDoingSetCenter = false\n\n if (this.state.editable) {\n // 修改中心点后, 有很大概率会丢失编辑中状态, 原因未知\n // 手动重置一次状态, 保证依然处于编辑中\n clearTimeout(this.resetEditableTimeoutId)\n this.resetEditableTimeoutId = setTimeout(() => {\n if (this.state.editable) {\n this.innerOverlay.disableEditing()\n this.innerOverlay.enableEditing()\n }\n }, 0)\n }\n }\n getCenter(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getCenter(), this.coordType)\n }\n setRadius(radius: number): void {\n this.isDoingSetRadius = true\n this.innerOverlay.setRadius(radius)\n this.isDoingSetRadius = false\n }\n getRadius(): number {\n return this.innerOverlay.getRadius()\n }\n}\nexport class GoogleCircle extends GoogleShape<google.maps.Circle> implements Circle {\n static create(this: GoogleMap, options: CircleOptions) {\n const coord = this.coordType\n const inner = new google.maps.Circle({\n center: options.center.toGoogle(coord),\n radius: options.radius,\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GoogleCircle(inner, coord, this)\n }\n\n setCenter(center: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setCenter(center.toGoogle(this.coordType))\n }\n getCenter(): LatLng {\n return LatLng.fromGoogle(this.innerOverlay.getCenter() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n setRadius(radius: number): void {\n this.innerOverlay.setRadius(radius)\n }\n getRadius(): number {\n return this.innerOverlay.getRadius()\n }\n}\n","/**\n * 3.0版的Overlay是类\n * @see http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html#a3b0\n */\nexport function ensureBaiduV3() {\n if (BMap.OverlayV3) {\n return\n }\n BMap.OverlayV3 = (BMap as any).Overlay\n}\n\nexport const BMapPoints = {\n /** {@link BMap.Point.equals} 无效, 故需要自己写一个 */\n equals(a: BMap.Point, b: BMap.Point) {\n return a.lat === b.lat && a.lng === b.lng\n },\n}\n","export interface Size {\n readonly width: number\n readonly height: number\n}\nexport interface Point {\n readonly x: number\n readonly y: number\n}\nexport namespace Point {\n export const ZERO: Point = { x: 0, y: 0 }\n}\nexport interface Padding {\n top: number\n right: number\n bottom: number\n left: number\n}\n","import { ensureBaiduV3 } from '../../../utils/baidu-utils'\nimport { Point } from '../../types'\nimport './baidu-info-box.scss'\nimport type { BMarker } from './marker'\n\nexport type BaiduInfoBox = InstanceType<ReturnType<typeof createBaiduInfoBoxClass>>\n\nlet BaiduInfoBox: ReturnType<typeof createBaiduInfoBoxClass> | undefined\n\nexport function createBaiduInfoBox(\n content: HTMLElement,\n position?: BMap.Point,\n offset?: Point,\n zIndex?: number,\n maxWidth?: number,\n borderClass?: string,\n) {\n if (!BaiduInfoBox) {\n BaiduInfoBox = createBaiduInfoBoxClass()\n }\n return new BaiduInfoBox(content, position, offset, zIndex, maxWidth, borderClass)\n}\n\n/**\n * {@template info_window_vs_box}\n * baidu自带的InfoWindow有如下问题:\n * 1. 窗体不可自定义, 默认的窗体有点丑\n * 2. 一次只能显示一个\n * 3. 和MarkerClusterer的配合并不好, 重建聚合时会使InfoWindow消失\n *\n * 故重新实现了一个InfoBox, 解决上述问题, 用来替代InfoWindow, 但Info也点问题...:\n * 1. 未实现InfoWindow的autoPan功能\n * {@endtemplate }\n */\n\nfunction createBaiduInfoBoxClass() {\n ensureBaiduV3()\n const POINT_ZERO = new BMap.Point(0, 0)\n return class BaiduInfoBox extends BMap.OverlayV3 {\n // 类表达式不能有私有成员, 故改成public\n public container: HTMLElement\n public border: HTMLElement\n public inner: HTMLElement\n public map: BMap.Map | undefined\n public marker: BMarker | undefined\n constructor(\n public content: HTMLElement,\n public position: BMap.Point = POINT_ZERO,\n public offset: Point = Point.ZERO,\n zIndex?: number,\n maxWidth: number = 654, // google的InfoWindow的默认maxWidth就是654\n borderClass: string = '',\n ) {\n super()\n const rootClass = 'baidu-info-box-container'\n this.container = document.createElement('div')\n this.container.className = rootClass\n this.container.style.position = 'absolute'\n // 模仿google, 阻止地图获取到鼠标相关事件, 让info-box可交互\n const stop = (ev: MouseEvent) => ev.stopPropagation()\n this.container.onclick = stop\n this.container.ondblclick = stop\n this.container.onmousedown = stop\n this.container.onmousemove = stop\n ;(this.container as any).onmousewheel = stop\n\n this.border = document.createElement('div')\n this.border.className = `${rootClass}__border ${borderClass}`\n\n this.inner = document.createElement('div')\n this.inner.className = rootClass + '__inner'\n\n const close = document.createElement('span')\n close.className = rootClass + '__close'\n close.addEventListener('click', () => {\n // cSpell:ignore onclickclose\n // 设计成和InfoWindow的关闭监听同名\n this.close()\n this.dispatchEvent({ type: 'onclickclose' })\n })\n\n this.inner.appendChild(content)\n this.border.appendChild(this.inner)\n this.border.appendChild(close)\n this.container.appendChild(this.border)\n\n if (zIndex) {\n this.setZIndex(zIndex)\n }\n this.setMaxWidth(maxWidth)\n this.onMarkerPositionChanged = this.onMarkerPositionChanged.bind(this)\n }\n\n override initialize(map: BMap.Map) {\n this.map = map\n map.getPanes().floatPane!.appendChild(this.container)\n // console.log('initialize', map)\n return this.container\n }\n\n override draw() {\n if (!this.map) {\n return\n }\n\n const point = this.marker ? this.marker.getPosition() : this.position\n const pixel = this.map.pointToOverlayPixel(point)\n const x = pixel.x + this.offset.x\n const y = pixel.y + this.offset.y\n\n // console.log('draw', this.width, this.height, width, height)\n\n this.container.style.left = `${x}px`\n this.container.style.top = `${y}px`\n }\n\n open(map: BMap.Map, anchor?: BMarker) {\n if (anchor && anchor === this.marker) {\n // 使用相同的marker, 不需要处理\n return\n }\n if (this.marker) {\n this.detachMarker(this.marker)\n }\n // 一定要先设置marker, addOverlay触发的draw方法需要读取marker\n this.marker = anchor\n if (this.marker) {\n this.attachMarker(this.marker)\n }\n\n if (this.isOpen()) {\n // 若已打开, 则只需要刷新\n this.draw()\n } else if (this.marker && !this.marker.getMap()) {\n // marker存在, 且未被添加到map上, 则需要等marker添加后, 再添加\n // @see {BaiduMap}\n } else {\n // 否则添加\n map.addOverlay(this)\n }\n }\n\n attachMarker(marker: BMarker) {\n marker.__info_box__ = this\n marker.addEventListener('dragging', this.onMarkerPositionChanged)\n marker.addEventListener('dragend', this.onMarkerPositionChanged)\n }\n\n detachMarker(marker: BMarker) {\n marker.__info_box__ = undefined\n marker.removeEventListener('dragging', this.onMarkerPositionChanged)\n marker.removeEventListener('dragend', this.onMarkerPositionChanged)\n }\n\n close() {\n if (this.map) {\n this.map.removeOverlay(this)\n if (this.marker) {\n this.detachMarker(this.marker)\n this.marker = undefined\n }\n this.map = undefined\n }\n }\n\n isOpen() {\n return this.map && this.map.getPanes().floatPane === this.container.parentNode\n }\n\n onMarkerPositionChanged() {\n this.draw()\n }\n\n setZIndex(zIndex: number) {\n this.container.style.zIndex = `${zIndex}`\n }\n\n setMaxWidth(maxWidth: number) {\n this.border.style.maxWidth = `${maxWidth}px`\n }\n\n setPosition(position: BMap.Point) {\n if (!this.marker) {\n this.position = position\n this.draw()\n }\n }\n\n getPosition() {\n return this.position\n }\n\n setOffset(offset: Point) {\n this.offset = offset\n this.draw()\n }\n\n getOffset() {\n return this.offset\n }\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { AbstractEventTargetDelegate, BaiduEventTargetDelegate, EventHub, GoogleEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { Point } from '../../types'\nimport type { UnionInfoWindow } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { BaiduMarker, GoogleMarker, Marker } from './marker'\n\n/**\n * ## InfoWindow的初始偏移, 不同实现\n * - baidu: 根据Icon的infoWindowAnchor选项, 确定相对Icon左上角的偏移\n * - google: 根据Marker的anchorPoint选项, 确定相对marker的position的偏移\n *\n * 统一成: InfoWindow的底部中点对齐Marker的position, 需要多少偏移使用offset选项来设置\n */\nexport interface InfoWindowOptions {\n content: string | HTMLElement\n /** @default {LatLng.ZERO} */\n position?: LatLng\n maxWidth?: number\n offset?: Point\n disableAutoPan?: boolean\n}\n\n/**\n * cSpell:words clickclose, statechange\n * ## 打开/关闭InfoWindow的不同行为\n * - google\n * 0. 添加时, 默认不显示\n * 1. close(), 不发送事件\n * 2. 点击x, 发送`closeclick`事件\n * 3. open(), 不发送事件\n * 4. 可以同时打开多个InfoWindow\n * - baidu:\n * 0. 添加时, 默认不显示\n * 1. close(), 发送`close`事件\n * 2. 点击x, 先后发送`clickclose`, `close`事件\n * 3. 点击地图的空白区域, 发送`close`事件\n * 4. open(), 发送`open`事件\n * 5. 同时只能打开一个, 之前的会自动关闭(发送`close`事件)\n * - here(InfoBubble)\n * 0. 添加时, 默认显示, 不发送事件\n * 1. close(), 发送`statechange`事件\n * 2. 点击x, 发送`statechange`事件\n * 3. open(), 发送`statechange`事件\n * 4. 可以同时打开多个InfoBubble\n *\n * 结论: 在baidu以外的地图上模拟open/close事件, 保证行为一致\n */\nexport type InfoWindowEventMap = {\n closeclick: Tg.Event\n /**\n * ## 不同实现\n * baidu: 原生支持open/close事件\n * google: 通过拦截open()/close()/closeclick, 实现open/close事件\n */\n open: Tg.Event\n /** @see open */\n close: Tg.Event\n}\n\n/** 之所以需要这个type, 是为了将event的类型信息合并进去, 通过实现interface的方式似乎做不到这一点, 使用函数重载其实也可以做到 */\nexport type InfoWindowOverlay = InfoWindow & Tg.EventTargetTyped<InfoWindow, InfoWindowEventMap>\n\n/** 在@tg/map中 InfoWindow 不继承 Overlay... */\nexport abstract class InfoWindow implements Tg.EventTarget {\n constructor(\n private delegate: AbstractEventTargetDelegate<UnionInfoWindow>,\n ) {\n this.delegate.setTarget(this)\n }\n addEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.addEventListener(type, listener)\n }\n removeEventListener(type: string, listener: Tg.EventListener): void {\n this.delegate.removeEventListener(type, listener)\n }\n abstract inner: UnionInfoWindow\n /**\n * 若anchor为空, 则添加到地图上\n *\n * ## 不同行为\n * - baidu: 一定要anchor添加到地图上之后, 才能正常打开infoWindow\n * - google: 没有上述限制\n **/\n abstract open(anchor?: Marker): void\n abstract close(): void\n abstract getPosition(): LatLng\n abstract setPosition(position: LatLng): void\n abstract isOpen(): boolean\n}\n\nexport class BaiduInfoWindow extends InfoWindow {\n static create(this: BaiduMap, options: InfoWindowOptions) {\n const position = options.position || LatLng.ZERO\n const inner = new BMap.InfoWindow(options.content, {\n maxWidth: options.maxWidth,\n offset: options.offset && new BMap.Size(options.offset.x, options.offset.y),\n enableAutoPan: !options.disableAutoPan,\n })\n return new BaiduInfoWindow(inner, this, { position: position })\n }\n\n constructor(\n public inner: BMap.InfoWindow,\n private map: BaiduMap,\n private state: { position?: LatLng },\n ) {\n super(new BaiduEventTargetDelegate(inner, map))\n }\n override isOpen() {\n return this.inner.isOpen()\n }\n override open(anchor?: BaiduMarker): void {\n /*\n // baidu 一次只能显示一个InfoWindow, 打开新的前需要关闭老的\n // baidu 内部会处理这个逻辑, 故这些代码可以注释掉\n const latestInfoWindow = this.map.getLatestInfoWindow()\n if (latestInfoWindow && latestInfoWindow !== this) {\n console.log('关闭之前的InfoWindow')\n latestInfoWindow.close()\n }\n */\n if (anchor) {\n anchor.innerOverlay.openInfoWindow(this.inner)\n } else {\n this.map.innerMap.openInfoWindow(this.inner, (this.state.position || LatLng.ZERO).toBaidu(this.map.coordType))\n }\n this.map.setLatestInfoWindowInternal(this)\n }\n override close() {\n // 通过map也可以关闭marker上的InfoWindow\n // 该方法会关闭任何打开的InfoWindow, 在某些情况下, 可能不是当前InfoWindow, 故需要先判断下\n if (this.inner.isOpen()) {\n this.map.innerMap.closeInfoWindow()\n }\n }\n override getPosition(): LatLng {\n // 这个值有可能为空\n const innerPosition: BMap.Point | undefined = this.inner.getPosition()\n return (innerPosition && LatLng.fromBaidu(innerPosition, this.map.coordType)) || this.state.position || LatLng.ZERO\n }\n override setPosition(position: LatLng): void {\n this.state.position = position\n if (this.inner.isOpen()) {\n this.open()\n }\n }\n}\n\nexport class GoogleInfoWindow extends InfoWindow {\n static create(this: GoogleMap, options: InfoWindowOptions) {\n const position = options.position || LatLng.ZERO\n const inner = new google.maps.InfoWindow({\n content: options.content,\n maxWidth: options.maxWidth,\n pixelOffset: options.offset && new google.maps.Size(options.offset.x, options.offset.y),\n position: position.toGoogle(this.coordType),\n disableAutoPan: options.disableAutoPan,\n })\n return new GoogleInfoWindow(inner, this)\n }\n\n private eventHub = new EventHub()\n private isOpened = false\n constructor(\n public inner: google.maps.InfoWindow,\n private map: GoogleMap,\n ) {\n super(new GoogleEventTargetDelegate(inner, map))\n inner.addListener('closeclick', () => {\n this.isOpened = false\n if (this.eventHub.hasListener('close')) {\n this.eventHub.notify({ type: 'close', target: this })\n }\n })\n // map_changed事件和getMap()都没有文档...\n // 当infoWindow从地图上添加/移除时, 都会触发该事件\n // 仅仅用来处理marker移除导致的infoWindow移除\n inner.addListener('map_changed', () => {\n const prev = this.isOpened\n this.isOpened = !!inner.getMap()\n if (prev && !this.isOpened && this.eventHub.hasListener('close')) {\n this.eventHub.notify({ type: 'close', target: this })\n }\n })\n }\n override isOpen() {\n return this.isOpened\n }\n override addEventListener<K extends keyof InfoWindowEventMap>(type: K, listener: (event: InfoWindowEventMap[K]) => void): void {\n if (type === 'open' || type === 'close') {\n this.eventHub.addEventListener(type, listener)\n return\n }\n super.addEventListener(type, listener)\n }\n override removeEventListener<K extends keyof InfoWindowEventMap>(type: K, listener: (event: InfoWindowEventMap[K]) => void): void {\n if (type === 'open' || type === 'close') {\n this.eventHub.removeEventListener(type, listener)\n return\n }\n super.removeEventListener(type, listener)\n }\n override open(anchor?: GoogleMarker): void {\n if (!this.isOpened) {\n if (this.map.mapOptions.infoWindowMode === 'single') {\n // 'single'模式下, 需要关闭之前的InfoWindow\n const prev = this.map.getLatestInfoWindow()\n if (prev) {\n prev.close()\n }\n }\n this.inner.open(this.map.innerMap, anchor?.innerOverlay)\n this.isOpened = true\n this.map.setLatestInfoWindowInternal(this)\n this.eventHub.notify({ type: 'open', target: this })\n }\n }\n override close(): void {\n if (this.isOpened) {\n // 先设为false, 这样, close()过程中触发的map_changed就不会重复触发close事件\n this.isOpened = false\n this.inner.close()\n this.eventHub.notify({ type: 'close', target: this })\n }\n }\n override getPosition(): LatLng {\n return LatLng.fromGoogle(this.inner.getPosition() ?? GoogleConst.LATLNG_ZERO, this.map.coordType)\n }\n override setPosition(position: LatLng): void {\n this.inner.setPosition(position.toGoogle(this.map.coordType))\n }\n}\n","import { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { GoogleEventTargetDelegate } from '../../event-target'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport type { Point } from '../../types'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { createBaiduInfoBox, type BaiduInfoBox } from './baidu-info-box'\nimport { InfoWindow } from './info-window'\nimport type { BaiduMarker, GoogleMarker, Marker } from './marker'\nimport { BaiduOverlay } from './overlay'\n\nexport type InfoBoxEventMap = {\n closeclick: Tg.Event\n}\n\n/**\n * 初始偏移量同{@link InfoWindow}, 底部中点对齐position\n */\nexport interface InfoBoxOptions {\n content: HTMLElement\n position?: LatLng\n offset?: Point\n zIndex?: number\n maxWidth?: number\n borderClass?: string\n}\n\n/** {@macros info_window_vs_box} */\nexport interface InfoBox extends Tg.EventTarget {\n open(anchor?: Marker): void\n close(): void\n getPosition(): LatLng\n setPosition(position: LatLng): void\n setMaxWidth(maxWidth: number): void\n setZIndex(zIndex: number): void\n}\n\n/** 虽然叫\"Overlay\", 但并没有继承Overlay... */\nexport type InfoBoxOverlay = InfoBox & Tg.EventTargetTyped<InfoBox, InfoBoxEventMap>\n\nexport class BaiduInfoBoxOverlay extends BaiduOverlay<BaiduInfoBox> implements InfoBox {\n static create(this: BaiduMap, options: InfoBoxOptions) {\n const coord = this.coordType\n const inner = createBaiduInfoBox(\n options.content,\n options.position?.toBaidu(coord),\n options.offset,\n options.zIndex,\n options.maxWidth,\n options.borderClass,\n )\n return new BaiduInfoBoxOverlay(inner, coord, this)\n }\n\n constructor(\n innerOverlay: BaiduInfoBox,\n coordType: CoordType,\n private baiduMap: BaiduMap,\n ) {\n super(innerOverlay, coordType, baiduMap)\n }\n open(anchor?: BaiduMarker): void {\n this.innerOverlay.open(this.baiduMap.innerMap, anchor?.innerOverlay)\n }\n close(): void {\n this.innerOverlay.close()\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType))\n }\n setMaxWidth(maxWidth: number) {\n this.innerOverlay.setMaxWidth(maxWidth)\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n}\n\nexport class GoogleInfoBoxOverlay extends InfoWindow implements InfoBox {\n static create(this: GoogleMap, options: InfoBoxOptions) {\n const coord = this.coordType\n const inner = new google.maps.InfoWindow({\n content: options.content,\n position: options.position?.toGoogle(coord),\n pixelOffset: options.offset && new google.maps.Size(options.offset.x, options.offset.y),\n zIndex: options.zIndex,\n maxWidth: options.maxWidth,\n })\n const borderClass = options.borderClass\n if (borderClass) {\n inner.addListener('domready', () => {\n const border = options.content.parentElement?.parentElement\n if (border && border.className.includes('gm-style-iw-c') && !border.className.includes(borderClass)) {\n border.className += ` ${borderClass}`\n }\n })\n }\n return new GoogleInfoBoxOverlay(inner, coord, this)\n }\n constructor(\n public inner: google.maps.InfoWindow,\n private coordType: CoordType,\n private map: GoogleMap,\n ) {\n super(new GoogleEventTargetDelegate(inner, map))\n }\n\n open(anchor?: GoogleMarker | undefined): void {\n this.inner.open(this.map.innerMap, anchor?.innerOverlay)\n }\n close(): void {\n this.inner.close()\n }\n getPosition(): LatLng {\n return LatLng.fromGoogle(this.inner.getPosition() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.inner.setPosition(position.toGoogle(this.coordType))\n }\n isOpen(): boolean {\n return this.inner.getMap() != null\n }\n setMaxWidth(maxWidth: number) {\n if (this.isOpen()) {\n // 开启状态, 则需要先关闭, 后打开\n // https://developers.google.com/maps/documentation/javascript/reference/info-window#InfoWindowOptions.maxWidth\n const map = this.inner.getMap()\n const anchor = this.inner.getAnchor()\n this.inner.close()\n this.inner.setOptions({ maxWidth: maxWidth })\n this.inner.open(map, anchor)\n } else {\n this.inner.setOptions({ maxWidth: maxWidth })\n }\n }\n setZIndex(zIndex: number) {\n this.inner.setZIndex(zIndex)\n }\n}\n","import type { StringEnumLike } from './mapped-types'\n\nexport namespace Strings {\n /**\n * 将string转换成字符枚举, 转换失败返回undefined\n * @see {@link import('./vue-utils.ts').stringEnumProp} 由于使用了Object.values(enumObject), 应该避免在enumObject上添加其他属性/方法\n * @deprecated 使用{@link import('./mapped-types.ts').unwrapStringEnumValue}替代\n */\n export function toEnumOrNull<E extends StringEnumLike>(value: string | undefined, enumObject: E): E[keyof E] | undefined {\n if (value === undefined) {\n return undefined\n }\n return Object.values(enumObject).includes(value) ? value as E[keyof E] : undefined\n }\n export function trimIndent(str: string) {\n return str.split('\\n').map(it => it.trim()).join('\\n')\n }\n /** 转换: `FuckYou` -> `fuck-you` */\n export function pascal2kebab(str: string) {\n return str.replace(/([^A-Z]?)([A-Z])/g, (_, a, b) => a ? `${a}-${b.toLowerCase()}` : b.toLowerCase())\n }\n\n /**\n * 简单判断字符串是否表示一个整数\n * - `10` : ✅️\n * - `-10`: ✅️\n * - `+10`: ❌️\n * - `2e2`: ❌️\n * @see https://stackoverflow.com/questions/175739/how-can-i-check-if-a-string-is-a-valid-number\n * */\n export function isInt(str: string) {\n return /^-?\\d+$/.test(str)\n }\n}\n\n/** @see https://github.com/browserify/path-browserify */\nexport const path = {\n /** @see https://nodejs.org/docs/v10.3.0/api/path.html#path_path_basename_path_ext */\n basename(path: string, ext?: string) {\n const normalized = path.endsWith('/') ? path.slice(0, -1) : path\n\n const index = normalized.lastIndexOf('/')\n const filename = index >= 0 ? normalized.substring(index + 1) : normalized\n if (ext && filename.endsWith(ext)) {\n return filename.slice(0, -ext.length)\n }\n return filename\n },\n}\n","import { throwError } from '../../../components'\nimport { assertNever } from '../../../utils/assert'\nimport { ensureBaiduV3 } from '../../../utils/baidu-utils'\nimport { GoogleConst } from '../../../utils/google-utils'\nimport { lateinit } from '../../../utils/mapped-types'\nimport { LatLng } from '../../lat-lng'\nimport { Point } from '../../types'\nimport type { AbstractMap } from '../map'\nimport './element-overlay.scss'\n\nexport enum MapPane {\n map = 'map',\n overlay = 'overlay',\n overlayMouseTarget = 'overlayMouseTarget',\n float = 'float',\n}\nexport namespace MapPanes {\n export function toGoogle(mapPane: MapPane, panes: google.maps.MapPanes): Element {\n switch (mapPane) {\n case MapPane.float:\n return panes.floatPane\n case MapPane.overlayMouseTarget:\n return panes.overlayMouseTarget\n case MapPane.overlay:\n return panes.overlayLayer\n case MapPane.map:\n return panes.mapPane\n default:\n assertNever(mapPane)\n }\n }\n export function toBaidu(mapPane: MapPane, panes: BMap.MapPanes): HTMLElement | undefined {\n switch (mapPane) {\n case MapPane.float:\n return panes.floatPane\n case MapPane.overlayMouseTarget:\n return panes.markerMouseTarget\n case MapPane.overlay:\n return panes.markerPane\n case MapPane.map:\n return panes.mapPane\n default:\n assertNever(mapPane)\n }\n }\n}\n\nexport interface ElementOverlayOptions {\n mapPane: MapPane\n}\n\nexport interface OverlayProjection {\n fromLatLngToOverlayPoint(latLng: LatLng): Point\n fromOverlayPointToLatLng(point: Point): LatLng\n}\n\nexport abstract class ElementOverlay {\n private baidu: BMap.OverlayV3 | undefined\n private google: google.maps.OverlayView | undefined\n private projection: OverlayProjection | undefined\n protected element = lateinit<HTMLElement>()\n private mapPane: MapPane\n constructor(\n public map: AbstractMap,\n options: ElementOverlayOptions,\n ) {\n this.mapPane = options.mapPane\n }\n\n create() {\n this.element = this.onCreate()\n this.element.className += ' element-overlay'\n return this.element\n }\n\n draw() {\n if (this.projection) {\n this.onDraw(this.projection)\n }\n }\n\n protected abstract onCreate(): HTMLElement\n\n protected abstract onDraw(projection: OverlayProjection): void\n\n getProjection(): OverlayProjection | undefined {\n return this.projection\n }\n\n asBaidu() {\n if (!this.baidu) {\n const that = this\n ensureBaiduV3()\n class BaiduElementOverlay extends BMap.OverlayV3 {\n override initialize(map: BMap.Map) {\n const ele = that.create()\n const panes = map.getPanes()\n MapPanes.toBaidu(that.mapPane, panes)?.appendChild(ele)\n return ele\n }\n override draw() {\n that.draw()\n }\n }\n this.baidu = new BaiduElementOverlay()\n const map = that.map.innerMap as BMap.Map\n this.projection = {\n fromLatLngToOverlayPoint(latLng: LatLng): Point {\n return map.pointToOverlayPixel(latLng.toBaidu(that.map.coordType))\n },\n fromOverlayPointToLatLng(point: Point): LatLng {\n return LatLng.fromBaidu(map.overlayPixelToPoint(new BMap.Pixel(point.x, point.y)), that.map.coordType)\n },\n }\n }\n return this.baidu\n }\n\n asGoogle() {\n if (!this.google) {\n const that = this\n class GoogleElementOverlay extends google.maps.OverlayView {\n override onAdd() {\n const element = that.create()\n const panes = this.getPanes() ?? throwError('onAdd回调中一定会有panes')\n MapPanes.toGoogle(that.mapPane, panes).appendChild(element)\n }\n\n override draw() {\n that.draw()\n }\n\n override onRemove() {\n // 根据文档这里应该手动移除, 但实际调用时parentNode却是null...\n // https://developers.google.com/maps/documentation/javascript/customoverlays#remove\n that.element.parentNode?.removeChild(that.element)\n }\n }\n this.google = new GoogleElementOverlay()\n this.projection = {\n fromLatLngToOverlayPoint(latLng: LatLng): Point {\n return that.google!.getProjection().fromLatLngToDivPixel(latLng.toGoogle(that.map.coordType)) ?? Point.ZERO\n },\n fromOverlayPointToLatLng(point: Point): LatLng {\n return LatLng.fromGoogle(that.google!.getProjection().fromDivPixelToLatLng(new google.maps.Point(point.x, point.y)) ?? GoogleConst.LATLNG_ZERO, that.map.coordType)\n },\n }\n }\n return this.google\n }\n}\n","import { throwError, type Nullable } from '../../../components'\r\nimport type { Point } from '../../types'\r\nimport { MapPane, MapPanes } from './element-overlay'\r\n\r\nexport type GoogleLabel = InstanceType<ReturnType<typeof createGoogleLabelClass>>\r\n\r\nlet GoogleLabel: ReturnType<typeof createGoogleLabelClass> | undefined\r\n\r\nexport function createGoogleLabel(\r\n element: HTMLElement,\r\n position: Nullable<google.maps.LatLng>,\r\n offset?: Point,\r\n mapPane?: MapPane,\r\n zIndex?: number,\r\n) {\r\n if (!GoogleLabel) {\r\n GoogleLabel = createGoogleLabelClass()\r\n }\r\n return new GoogleLabel(element, position, offset, mapPane, zIndex)\r\n}\r\n\r\n/** 打开页面时 google.maps.OverlayView 并没有加载, 故需要将GoogleLabel类写到方法中去 */\r\nfunction createGoogleLabelClass() {\r\n return class GoogleLabel extends google.maps.OverlayView {\r\n container: HTMLElement\r\n constructor(\r\n element: HTMLElement,\r\n // 类表达式的私有成员, 会报TS4094错误, 故只能设置为public\r\n public position: Nullable<google.maps.LatLng>,\r\n public offset?: Point,\r\n // 同上, 只能设为public\r\n public _mapPane: MapPane = MapPane.overlayMouseTarget,\r\n zIndex?: number,\r\n ) {\r\n super()\r\n this.container = document.createElement('div')\r\n this.container.className = 'label-container'\r\n this.container.style.position = 'absolute'\r\n if (zIndex) {\r\n this.setZIndex(zIndex)\r\n }\r\n this.container.addEventListener('click', () => {\r\n google.maps.event.trigger(this, 'click')\r\n })\r\n this.setElement(element)\r\n }\r\n setZIndex(zIndex: number) {\r\n this.container.style.zIndex = `${zIndex}`\r\n }\r\n setElement(element: HTMLElement) {\r\n const child = this.container.firstChild\r\n if (child === element) {\r\n return\r\n }\r\n if (child) {\r\n this.container.replaceChild(child, element)\r\n } else {\r\n this.container.appendChild(element)\r\n }\r\n }\r\n\r\n override onAdd(): void {\r\n const panes = this.getPanes() ?? throwError('onAdd回调中一定能够获取panes')\r\n MapPanes.toGoogle(this._mapPane, panes).appendChild(this.container)\r\n }\r\n\r\n override draw(): void {\r\n // 设置了position时才显示\r\n this.container.style.display = this.position ? 'block' : 'none'\r\n if (this.position) {\r\n const projection = this.getProjection()\r\n // 没添加到地图上的时候, 投影会为空\r\n if (projection) {\r\n const pixel = projection.fromLatLngToDivPixel(this.position)\r\n if (pixel) {\r\n this.container.style.left = `${pixel.x + (this.offset?.x ?? 0)}px`\r\n this.container.style.top = `${pixel.y + (this.offset?.y ?? 0)}px`\r\n }\r\n }\r\n }\r\n }\r\n\r\n override onRemove(): void {\r\n this.container.parentNode?.removeChild(this.container)\r\n }\r\n\r\n setPosition(position: Nullable<google.maps.LatLng>) {\r\n this.position = position\r\n this.draw()\r\n }\r\n getPosition(): Nullable<google.maps.LatLng> {\r\n return this.position\r\n }\r\n setOffset(offset: Point) {\r\n this.offset = offset\r\n this.draw()\r\n }\r\n getOffset(): Point | undefined {\r\n return this.offset\r\n }\r\n getVisible(): boolean {\r\n return this.container.style.visibility !== 'hidden'\r\n }\r\n setVisible(visible: boolean): void {\r\n this.container.style.visibility = visible ? 'visible' : 'hidden'\r\n }\r\n }\r\n}\r\n","import { assert } from '../../../utils/assert'\nimport { lateinit } from '../../../utils/mapped-types'\nimport { Strings } from '../../../utils/strings'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport { Point, type Size } from '../../types'\nimport type { UnionBaiduIcon } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { MapPane } from './element-overlay'\nimport { createGoogleLabel, type GoogleLabel } from './google-label'\nimport type { BaiduSymbolIcon } from './icon'\nimport { BaiduOverlay, GoogleOverlay, Overlay } from './overlay'\n\nexport type BaiduLabel = BMap.Label & { __label__?: BaiduLabelOverlay }\n\nexport type LabelEventMap = {\n click: Tg.Event\n}\n\n/**\n * 初始位置, 左上角对齐position\n */\nexport interface LabelOptions {\n content: LabelContent\n position?: LatLng\n offset?: Point\n /**\n * ## 不同行为\n * 当将label添加到marker中时:\n * - baidu: zIndex设置无效, Label的元素的z-index始终为80\n * - google: 依然有效, 但貌似是由于marker元素的opacity:0;的原因, 调整成比marker小的zIndex后, 依然不能位于marker后方...\n * */\n zIndex?: number\n /**\n * ## 不同行为\n * - baidu: 不支持该属性\n * - google: 支持, 默认为{@link MapPane.overlayMouseTarget}\n */\n mapPane?: MapPane\n}\n\n/**\n * ## 不同实现\n * - baidu: 有Label类,\n * - 添加到地图上时, 默认左上角对齐position\n * - 添加到marker中时, 默认左上角对齐marker的icon的左上角\n * - 内容只能是string, string可以是html字符串\n * - google: 没有Label类, 我们用OverlayView实现了一个GoogleLabel\n * - 添加到地图上时, 默认左上角对齐position\n * - 没有添加到marker中的功能\n * - 内容是HTMLElement\n *\n * 针对这些不同, 使用了如下方法使它们行为尽量一致:\n * 1. {@link BaiduLabelOverlay.attachIcon}, 让BaiduLabelOverlay关联icon, 使其添加到地图上时也是左上角对齐position\n * 2. {@link GoogleMarker.setLabel}, 让GoogleMarker关联GoogleLabel, 联动它们的显隐/位置, 使其支持添加到marker中\n * 3. {@link BaiduLabelOverlay.setContentInternal}, 将HTMLElement转成string, 并让BaiduLabelOverlay监听HTMLElement的改变, 由于转换成了string, 故里面的事件监听是无效的, 只能使用{@link LabelEventMap}中的事件\n */\nexport interface Label {\n setContent(content: LabelContent): void\n getPosition(): LatLng\n setPosition(position: LatLng): void\n getOffset(): Point\n setOffset(offset: Point): void\n setZIndex(zIndex: number): void\n}\n\nexport type LabelOverlay = Label & Overlay\n\ntype LabelContent = string | HTMLElement\nnamespace LabelContent {\n export function toString(content: LabelContent) {\n return typeof content === 'string' ? content : content.outerHTML\n }\n export function toElement(content: LabelContent) {\n if (typeof content === 'string') {\n const $div = document.createElement('div')\n $div.innerHTML = content\n return $div\n }\n return content\n }\n}\n\n/** 内容只能是固定不变的 */\nexport class BaiduLabelOverlay extends BaiduOverlay<BaiduLabel> implements Label {\n static create(this: BaiduMap, options: LabelOptions): BaiduLabelOverlay {\n const coord = this.coordType\n const label: BaiduLabel = new BMap.Label(LabelContent.toString(options.content), {\n position: options.position?.toBaidu(coord),\n offset: options.offset && new BMap.Size(options.offset.x, options.offset.y),\n })\n if (options.zIndex) {\n label.setZIndex(options.zIndex)\n }\n // 清除baidu自带的样式\n label.setStyle({\n border: '0px',\n padding: '0px',\n backgroundColor: 'unset',\n })\n const baiduLabel = new BaiduLabelOverlay(label, coord, this, options.content)\n label.__label__ = baiduLabel\n return baiduLabel\n }\n private icon: UnionBaiduIcon | undefined\n private iconAnchor: Size | undefined\n private content = lateinit<LabelContent>()\n private contentObserver: MutationObserver | undefined\n constructor(\n innerOverlay: BaiduLabel,\n coordType: CoordType,\n map: BaiduMap,\n content: LabelContent,\n ) {\n super(innerOverlay, coordType, map)\n this.setContentInternal(content, true)\n }\n private setContentInternal(content: LabelContent, initialize = false) {\n if (this.content === content) {\n return\n }\n if (this.contentObserver) {\n this.contentObserver.disconnect()\n this.contentObserver = undefined\n }\n if (typeof content !== 'string') {\n this.contentObserver = new MutationObserver(() => {\n this.innerOverlay.setContent(content.outerHTML)\n })\n this.contentObserver.observe(content, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n })\n }\n // 初始化时, content已经设置过了, 不需要重复设置\n if (!initialize) {\n this.innerOverlay.setContent(LabelContent.toString(content))\n }\n this.content = content\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType))\n }\n getOffset(): Point {\n const offset = this.innerOverlay.getOffset()\n let deltaX = 0\n let deltaY = 0\n if (this.iconAnchor) {\n deltaX = this.iconAnchor.width\n deltaY = this.iconAnchor.height\n }\n // 获取时要减去icon的anchor\n return { x: offset.width - deltaX, y: offset.height - deltaY }\n }\n setOffset(offset: Point): void {\n let deltaX = 0\n let deltaY = 0\n if (this.iconAnchor) {\n deltaX = this.iconAnchor.width\n deltaY = this.iconAnchor.height\n }\n // 设置时要加上icon的anchor\n this.innerOverlay.setOffset(new BMap.Size(offset.x + deltaX, offset.y + deltaY))\n }\n setContent(content: LabelContent) {\n this.setContentInternal(content)\n }\n\n /**\n * 关联新的Icon, 内部使用的方法\n * @description baidu中Label默认左上角对齐Icon的左上, 我们要将其转换为对齐marker的position\n * */\n attachIcon(icon: BMap.Icon | BaiduSymbolIcon | undefined) {\n let iconAnchor: Size | undefined\n if (icon instanceof BMap.Icon) {\n iconAnchor = icon.anchor\n } else if (icon /* BaiduSymbolIcon */) {\n if (icon.anchor) {\n iconAnchor = icon.anchor\n } else {\n // 第一次添加时icon.anchor不存在, 需要借助baiduLabelOffset来计算实际偏移\n const labelOffset = icon.__icon__?.baiduLabelOffset ?? { x: 0, y: 0 }\n iconAnchor = {\n width: icon.style.anchor.width + labelOffset.x,\n height: icon.style.anchor.height + labelOffset.y,\n }\n // 开发模式下需要检测baiduLabelOffset的值设置的是否正确\n if (process.env.NODE_ENV !== 'production') {\n setTimeout(() => {\n assert(icon.__icon__, `${icon}必须是由'SymbolIcon.toBaidu()'创建的`)\n if (!icon.anchor) {\n console.log('BaiduLabelOverlay.attachIcon', 'Bmap.Symbol.anchor尚未计算完成')\n return\n }\n const x = icon.anchor.width - icon.style.anchor.width\n const y = icon.anchor.height - icon.style.anchor.height\n\n if (labelOffset.x !== x || labelOffset.y !== y) {\n const iconInfo = [\n icon.__icon__.anchor?.x,\n icon.__icon__.anchor?.y,\n icon.__icon__.rotation,\n icon.__icon__.scale,\n icon.__icon__.strokeWeight,\n ].map(it => it ?? '').join(',')\n\n console.warn('BaiduLabelOverlay.attachIcon', icon.__icon__, Strings.trimIndent(`\n 为了保证Label的位置正确, 请将SymbolIcon(${iconInfo})中baiduLabelOffset的值改写成: \n ${JSON.stringify({ x, y })}\n `,\n ))\n }\n }, 1)\n }\n }\n }\n\n const offset = this.innerOverlay.getOffset()\n let x = offset.width\n let y = offset.height\n if (this.iconAnchor) {\n // 减去之前的icon的anchor\n x -= this.iconAnchor.width\n y -= this.iconAnchor.height\n }\n if (iconAnchor) {\n // 加上新的icon的anchor\n x += iconAnchor.width\n y += iconAnchor.height\n }\n this.innerOverlay.setOffset(new BMap.Size(x, y))\n this.icon = icon\n this.iconAnchor = iconAnchor\n }\n}\n\nexport class GoogleLabelOverlay extends GoogleOverlay<GoogleLabel> implements Label {\n static create(this: GoogleMap, options: LabelOptions) {\n const coord = this.coordType\n const label = createGoogleLabel(\n LabelContent.toElement(options.content),\n options.position?.toGoogle(coord),\n options.offset,\n options.mapPane,\n options.zIndex,\n )\n return new GoogleLabelOverlay(label, coord, this)\n }\n setZIndex(zIndex: number) {\n this.innerOverlay.setZIndex(zIndex)\n }\n setContent(content: LabelContent): void {\n this.innerOverlay.setElement(LabelContent.toElement(content))\n }\n getPosition(): LatLng {\n const position = this.innerOverlay.getPosition()\n if (position) {\n return LatLng.fromGoogle(position, this.coordType)\n }\n return LatLng.ZERO\n }\n setPosition(position: LatLng): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toGoogle(this.coordType))\n }\n getOffset(): Point {\n return this.innerOverlay.getOffset() ?? Point.ZERO\n }\n setOffset(offset: Point): void {\n this.innerOverlay.setOffset(offset)\n }\n}\n","/* eslint-disable camelcase */\nimport type { Point, Size } from '../../types'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { BaiduLabelOverlay } from './label'\n\nexport type UnionIcon = Icon | SymbolIcon\n\nexport const UnionIcon = {\n toGoogle: (icon: UnionIcon) => 'url' in icon ? Icon.toGoogle(icon) : SymbolIcon.toGoogle(icon),\n toBaidu: (icon: UnionIcon) => 'url' in icon ? Icon.toBaidu(icon) : SymbolIcon.toBaidu(icon),\n}\n\n/**\n * 图片Icon\n *\n * 字面量形式, 使用起来会简单点, 目前没看出使用class形式的必要🤔\n * */\nexport interface Icon {\n readonly url: string\n /** 显示的图片区域大小 */\n readonly size: Size\n /** 图片的显示区域的原点在图片中的坐标, 默认为(0, 0) */\n readonly origin?: Point\n /** 图片显示到地图上的锚点, 默认为图标的底部中点 */\n readonly anchor?: Point\n /** 缩放后的图片大小, 不传则不缩放 */\n readonly scaledSize?:Size\n}\n\nexport namespace Icon {\n export function toGoogle(icon: Icon): google.maps.Icon {\n return {\n url: icon.url,\n size: new google.maps.Size(icon.size.width, icon.size.height),\n origin: icon.origin && new google.maps.Point(icon.origin.x, icon.origin.y),\n scaledSize: icon.scaledSize && new google.maps.Size(icon.scaledSize.width, icon.scaledSize.height),\n // google的锚点默认就是图标的底部中点\n anchor: icon.anchor && new google.maps.Point(icon.anchor.x, icon.anchor.y),\n }\n }\n\n export function toBaidu(icon: Icon): BMap.Icon {\n return new BMap.Icon(icon.url, new BMap.Size(icon.size.width, icon.size.height), {\n imageOffset: icon.origin && new BMap.Size(-icon.origin.x, -icon.origin.y),\n imageSize: icon.scaledSize && new BMap.Size(icon.scaledSize.width, icon.scaledSize.height),\n // baidu的锚点默认为图标的中心点, 故需要和@tg/map统一, 改成图标的底部中点\n anchor: icon.anchor ? new BMap.Size(icon.anchor.x, icon.anchor.y) : new BMap.Size(icon.size.width / 2, icon.size.height),\n // InfoWindow相对图标左上角的偏移量, 不指定则InfoWindow不会偏移, 直接指到marker的position上\n // infoWindowAnchor: new BMap.Size(0, 0),\n })\n }\n}\n/** 简单的矢量Icon */\nexport interface SymbolIcon {\n readonly path: string | SymbolPath\n readonly anchor?: Point\n readonly fillColor?: string\n /** @default 0, 不显示填充色 */\n readonly fillOpacity?: number\n readonly scale?: number\n readonly rotation?: number\n readonly strokeColor?: string\n /** @default 1, 显示stroke */\n readonly strokeOpacity?: number\n /**\n * 默认等于{@link scale}\n * - google: 可以设为0\n * - baidu: 不能设为0, 为0相当于使用默认值\n */\n readonly strokeWeight?: number\n\n /**\n * baidu地图中Marker的Label的偏移量, 用来保证Label默认对齐到Marker的position\n *\n * 这个值的取值和如下参数相关, 但计算这个值的公式没找到...故只能运行时读取+手动设置:\n * - {@link path}\n * - {@link rotation}\n * - {@link scale}\n * - {@link strokeWeight}\n * - {@link anchor}\n *\n * 详见{@link BaiduLabelOverlay.attachIcon}\n *\n * TODO: 使用矩阵运行时计算偏移量\n */\n readonly baiduLabelOffset?: Point\n}\n\nexport namespace SymbolIcon {\n export function toGoogle(icon: SymbolIcon): google.maps.Symbol {\n return {\n path: typeof icon.path === 'string' ? icon.path : icon.path.google(),\n // TODO: 2023/05/17 ipcjs 检查google和baidu的锚点位置是否相同\n anchor: icon.anchor && new google.maps.Point(icon.anchor.x, icon.anchor.y),\n fillColor: icon.fillColor,\n fillOpacity: icon.fillOpacity,\n scale: icon.scale,\n rotation: icon.rotation,\n strokeColor: icon.strokeColor,\n strokeOpacity: icon.strokeOpacity,\n strokeWeight: icon.strokeWeight,\n }\n }\n\n export function toBaidu(icon: SymbolIcon): BaiduSymbolIcon {\n const baiduIcon: BaiduSymbolIcon = new BMap.Symbol(typeof icon.path === 'string' ? icon.path : icon.path.baidu(), {\n anchor: icon.anchor && new BMap.Size(icon.anchor.x, icon.anchor.y),\n fillColor: icon.fillColor,\n fillOpacity: icon.fillOpacity,\n scale: icon.scale,\n rotation: icon.rotation,\n strokeColor: icon.strokeColor,\n strokeOpacity: icon.strokeOpacity,\n strokeWeight: icon.strokeWeight,\n })\n baiduIcon.__icon__ = icon\n return baiduIcon\n }\n}\n\nexport type BaiduSymbolIcon = BMap.Symbol & {__icon__?: SymbolIcon}\n\nexport interface SymbolPath {\n baidu(): BMap.SymbolShapeType\n google(): google.maps.SymbolPath\n toString(): string\n}\n\n/** 模拟一个SymbolPath的枚举对象 */\nexport const SymbolPath = {\n CIRCLE: { baidu: () => BMap_Symbol_SHAPE_CIRCLE, google: () => google.maps.SymbolPath.CIRCLE },\n BACKWARD_CLOSED_ARROW: { baidu: () => BMap_Symbol_SHAPE_BACKWARD_CLOSED_ARROW, google: () => google.maps.SymbolPath.BACKWARD_CLOSED_ARROW },\n BACKWARD_OPEN_ARROW: { baidu: () => BMap_Symbol_SHAPE_BACKWARD_OPEN_ARROW, google: () => google.maps.SymbolPath.BACKWARD_OPEN_ARROW },\n FORWARD_CLOSED_ARROW: { baidu: () => BMap_Symbol_SHAPE_FORWARD_CLOSED_ARROW, google: () => google.maps.SymbolPath.FORWARD_CLOSED_ARROW },\n FORWARD_OPEN_ARROW: { baidu: () => BMap_Symbol_SHAPE_FORWARD_OPEN_ARROW, google: () => google.maps.SymbolPath.FORWARD_OPEN_ARROW },\n} as const satisfies Record<string, SymbolPath>\n\n/** 矢量Icon序列 */\nexport interface IconSequence {\n /** 矢量Icon */\n icon: SymbolIcon;\n /** @default false */\n fixedRotation?: boolean;\n /**\n * 相对起点的位置, 取值可以是像素或百分比\n * @default 100%\n */\n offset?: string;\n /**\n * 重复显示是的间距, 取值可以是像素或百分比;\n * 若和{@link offset}同时设置, 只有{@link repeat}会生效\n */\n repeat?: string;\n}\n\nexport namespace IconSequence {\n export function toGoogle(value: IconSequence): google.maps.IconSequence {\n return {\n icon: SymbolIcon.toGoogle(value.icon),\n offset: value.offset,\n repeat: value.repeat,\n fixedRotation: value.fixedRotation,\n }\n }\n export function toBaidu(value: IconSequence): BMap.IconSequence {\n return new BMap.IconSequence(\n SymbolIcon.toBaidu(value.icon),\n value.offset,\n value.repeat ?? '',\n value.fixedRotation,\n )\n }\n}\n","import type { Nullable } from '../../../utils/mapped-types'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng } from '../../lat-lng'\nimport type { UnionBaiduIcon, UnionGoogleIcon } from '../../unions'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { BaiduInfoBox } from './baidu-info-box'\nimport { UnionIcon } from './icon'\nimport type { BaiduLabel, BaiduLabelOverlay, GoogleLabelOverlay, LabelOverlay } from './label'\nimport { BaiduOverlay, GoogleOverlay, Overlay, type OverlayOptions } from './overlay'\n\nexport interface MarkerOptions extends OverlayOptions {\n position: LatLng\n /**\n * 执行{@link LatLng.toBaidu}时是否对经纬度进行标准化\n *\n * 因为{@link LatLng.toGoogle}内部是会自动标准化的, 并且LatLng绝大部分情况下是合法的,\n * 所以添加这个参数, 只在使用者认为必要的时候, 执行标准化\n *\n * {@macro latlng_normalize}\n */\n normalizePositionForBaidu?: boolean\n title?: string\n icon?: UnionIcon\n /** @default true */\n clickable?: boolean\n /** @default false */\n draggable?: boolean\n /**\n * 拖拽时是否显示`x`\n * @default true\n * */\n crossOnDrag?: boolean,\n /**\n * ## 不同行为\n * - google: 有`cursor` 属性, 作用是hover时改变cursor\n * - baidu: 有`draggingCursor`属性, 作用是拖动时改变cursor\n * @deprecated 不推荐使用\n */\n cursor?: string\n zIndex?: number\n}\n\n/** 仅仅起到类型声明的作用... */\nexport type MarkerEventMap = {\n click: Tg.MouseEvent\n dblclick: Tg.MouseEvent\n /** @deprecated 使用`contextmenu`替代 */\n rightclick: Tg.MouseEvent\n contextmenu: Tg.MouseEvent\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n dragstart: Tg.MouseEvent\n drag: Tg.MouseEvent\n dragend: Tg.MouseEvent\n}\n\nexport interface Marker extends Tg.EventTargetTyped<Marker, MarkerEventMap> {\n getPosition(): LatLng\n setPosition(position: LatLng): void\n setTitle(title: string): void\n getTitle(): string\n setIcon(icon: UnionIcon): void\n /** 感觉并没有读取Icon的必要, 直接返回内部的Icon, 懒得写包装类_(:3」∠)_ */\n getIcon(): Nullable<UnionGoogleIcon | UnionBaiduIcon>\n /**\n * ## 不同行为\n * - baidu: 不支持设置clickable\n * - google: 支持\n * @deprecated 不推荐使用\n */\n setClickable(enable: boolean): void\n isClickable(): boolean\n setDraggable(enable: boolean): void\n isDraggable(): boolean\n /**\n * ## 不同行为\n * - baidu: 调用该方法无效\n * - google: 有效\n */\n setZIndex(zIndex?: number): void\n getZIndex(): number | undefined\n\n setLabel(label: LabelOverlay | undefined): void\n}\n\nexport type MarkerOverlay = Marker & Overlay\n\nexport type BMarker = BMap.Marker & {\n __info_box__?: BaiduInfoBox\n __create_by_tg__?: boolean\n}\n\nexport class BaiduMarker extends BaiduOverlay<BMarker> implements Marker {\n static create(this: BaiduMap, options: MarkerOptions): BaiduMarker {\n const coordType = this.coordType\n const icon = options.icon\n const opts: BMap.MarkerOptions = {\n title: options.title,\n icon: icon && UnionIcon.toBaidu(icon),\n enableClicking: options.clickable,\n enableDragging: options.draggable,\n // baidu的raiseOnDrag属性, 默认为false, 而我们的options.crossOnDrag默认为true, 故这里需要转换下\n raiseOnDrag: options.crossOnDrag === undefined ? true : options.crossOnDrag,\n draggingCursor: options.cursor,\n }\n\n const marker: BMarker = new BMap.Marker(options.position.toBaidu(coordType, options.normalizePositionForBaidu), opts)\n marker.__create_by_tg__ = true\n if (options.zIndex !== undefined) {\n marker.setZIndex(options.zIndex)\n }\n // clickable默认为true\n const clickable = options.clickable === undefined ? true : options.clickable\n // draggable默认为false\n const draggable = !!options.draggable\n return new BaiduMarker(marker, coordType, this, { clickable, draggable, zIndex: options.zIndex, normalize: options.normalizePositionForBaidu })\n .visibleOptionInternal(options.visible)\n }\n\n constructor(\n innerOverlay: BMap.Marker,\n coordType: CoordType,\n map: BaiduMap,\n /** baidu的Marker不支持读/写clickable等属性, 故只能将创建临时的clickable保存在这个state中 */\n private state: { clickable: boolean, draggable: boolean, zIndex: number | undefined, normalize?: boolean },\n ) {\n super(innerOverlay, coordType, map)\n }\n getPosition(): LatLng {\n return LatLng.fromBaidu(this.innerOverlay.getPosition(), this.coordType)\n }\n setPosition(position: LatLng): void {\n // 为了防止map的coordType改变, 要保存它\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toBaidu(this.coordType, this.state.normalize))\n this.innerOverlay.__info_box__?.onMarkerPositionChanged()\n }\n setTitle(title: string): void {\n this.innerOverlay.setTitle(title)\n }\n getTitle(): string {\n return this.innerOverlay.getTitle()\n }\n setIcon(icon: UnionIcon): void {\n const baiduIcon = UnionIcon.toBaidu(icon)\n this.innerOverlay.setIcon(baiduIcon)\n // Icon改变之后, 需要重新关联到label中\n const label = this.getLabel()\n if (label) {\n label.attachIcon(baiduIcon)\n }\n }\n getIcon(): UnionBaiduIcon {\n return this.innerOverlay.getIcon()\n }\n setClickable(enable: boolean): void {\n // baidu 没有这个方法...这里只能改变下flag\n this.state.clickable = enable\n }\n isClickable(): boolean {\n return this.state.clickable\n }\n setDraggable(enable: boolean): void {\n this.state.draggable = enable\n if (enable) {\n this.innerOverlay.enableDragging()\n } else {\n this.innerOverlay.disableDragging()\n }\n }\n isDraggable(): boolean {\n return this.state.draggable\n }\n setZIndex(zIndex?: number): void {\n this.state.zIndex = zIndex\n this.innerOverlay.setZIndex(zIndex || 0)\n }\n getZIndex(): number | undefined {\n return this.state.zIndex\n }\n\n setLabel(label: BaiduLabelOverlay | undefined): void {\n const prevLabel = this.getLabel()\n if (prevLabel) {\n // 将之前的label关联的icon置为空\n prevLabel.attachIcon(undefined)\n }\n if (label) {\n // 给新的label关联icon\n label.attachIcon(this.innerOverlay.getIcon())\n }\n // 即使设置空值, 貌似也没问题\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n this.innerOverlay.setLabel(label?.innerOverlay!)\n }\n getLabel(): BaiduLabelOverlay | undefined {\n return (this.innerOverlay.getLabel() as BaiduLabel)?.__label__\n }\n}\n\nexport class GoogleMarker extends GoogleOverlay<google.maps.Marker> implements Marker {\n static create(this: GoogleMap, options: MarkerOptions): GoogleMarker {\n const coordType = this.coordType\n const icon = options.icon\n const opts: google.maps.MarkerOptions = {\n position: options.position.toGoogle(coordType),\n title: options.title,\n zIndex: options.zIndex,\n visible: options.visible,\n icon: icon && UnionIcon.toGoogle(icon),\n clickable: options.clickable,\n draggable: options.draggable,\n // google的crossOnDrag和我们的crossOnDrag是匹配的, 不需要转换\n crossOnDrag: options.crossOnDrag,\n cursor: options.cursor,\n // InfoWindow相对marker的position的偏移量, 若不指定, 则偏移到marker的icon的上部中央\n anchorPoint: new google.maps.Point(0, 0),\n }\n return new GoogleMarker(new google.maps.Marker(opts), coordType, this)\n }\n private label: GoogleLabelOverlay | undefined\n private labelPositionListener: google.maps.MapsEventListener | undefined\n private labelVisibleListener: google.maps.MapsEventListener | undefined\n private labelMapChangedListener: google.maps.MapsEventListener | undefined\n getPosition(): LatLng {\n return LatLng.fromGoogle(this.innerOverlay.getPosition()!, this.coordType)\n }\n setPosition(position: LatLng): void {\n // 同上\n this.coordType = this.map.coordType\n this.innerOverlay.setPosition(position.toGoogle(this.coordType))\n }\n setTitle(title: string): void {\n this.innerOverlay.setTitle(title)\n }\n getTitle(): string {\n return this.innerOverlay.getTitle() || ''\n }\n setIcon(icon: UnionIcon): void {\n this.innerOverlay.setIcon(UnionIcon.toGoogle(icon))\n }\n getIcon(): Nullable<UnionGoogleIcon> {\n return this.innerOverlay.getIcon()\n }\n setClickable(flag: boolean): void {\n this.innerOverlay.setClickable(flag)\n }\n isClickable(): boolean {\n return this.innerOverlay.getClickable()\n }\n setDraggable(enable: boolean): void {\n this.innerOverlay.setDraggable(enable)\n }\n isDraggable(): boolean {\n // draggable默认是false, 故可以直接用`!!`转成boolean\n return !!this.innerOverlay.getDraggable()\n }\n setZIndex(zIndex?: number): void {\n this.innerOverlay.setZIndex(zIndex === undefined ? null : zIndex)\n }\n getZIndex(): number | undefined {\n const zIndex = this.innerOverlay.getZIndex()\n return zIndex === null ? undefined : zIndex\n }\n setLabel(label: GoogleLabelOverlay | undefined): void {\n this.label && this.map.removeOverlay(this.label)\n this.labelPositionListener && this.labelPositionListener.remove()\n this.labelVisibleListener && this.labelVisibleListener.remove()\n this.labelMapChangedListener && this.labelMapChangedListener.remove()\n if (label) {\n const positionChanged = () => {\n label.innerOverlay.setPosition(this.innerOverlay.getPosition())\n }\n const visibleChanged = () => {\n label.innerOverlay.setVisible(this.innerOverlay.getVisible())\n }\n const mapChanged = () => {\n // 存在map说明marker已经被添加到地图上, label也要添加进去\n if (this.innerOverlay.getMap()) {\n this.map.addOverlay(label)\n } else {\n this.map.removeOverlay(label)\n }\n }\n mapChanged()\n positionChanged()\n visibleChanged()\n this.label = label\n // map_changed事件在文档中没有写, 但是目前确实有这个事件...\n // https://stackoverflow.com/questions/10866607/markerclustererplus-event-when-marker-is-shown-hidden-in-cluster\n this.labelMapChangedListener = this.innerOverlay.addListener('map_changed', mapChanged)\n this.labelPositionListener = this.innerOverlay.addListener('position_changed', positionChanged)\n this.labelVisibleListener = this.innerOverlay.addListener('visible_changed', visibleChanged)\n } else {\n this.label = undefined\n this.labelPositionListener = undefined\n this.labelVisibleListener = undefined\n this.labelMapChangedListener = undefined\n }\n }\n}\n","import { MVCArrays } from '../../../utils/arrays'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport { IconSequence, type BaiduSymbolIcon } from './icon'\nimport type { BMarker } from './marker'\nimport type { Overlay } from './overlay'\nimport { BaiduShape, GoogleShape, type NotFillableShape, type NotFillableShapeOptions } from './shape'\n\nexport type PolylineEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /**\n * 在`editable`模式下编辑了path的事件\n * 外部调用{@link Polyline#setPath}, 不触发该事件 (之所以这样设计, 是为了避免频繁的进行LatLng<=>地图点对象的相互转换)\n *\n * ## 原理\n * 该事件的实现比较杂, 原始地图并没有等效的事件, 都是通过转换实现的\n * - google: 通过监听path的`insert/remove/set_at`实现\n * - baidu: 通过监听`lineupdate`事件, 然后判断path有没有被修改, 来实现的\n */\n 'path-edited': Tg.Event\n}\n\nexport interface PolylineOptions extends NotFillableShapeOptions {\n path: LatLng[]\n /**\n * ## 不同行为\n * - google: 功能正常\n * - baidu: 百度地图在移除Polyline时, icons不会被移除, 导致错乱, 这里通过复写{@link BaiduPolyline.remove}, 规避了该bug\n */\n icons?: IconSequence[],\n}\n\nexport interface Polyline extends Tg.EventTargetTyped<Polyline, PolylineEventMap>, NotFillableShape {\n getPath(): LatLng[]\n setPath(path: LatLng[]): void\n}\n\nexport type PolylineOverlay = Polyline & Overlay\n\nexport abstract class BaiduPolyShape<T extends BMap.Polyline | BMap.Polygon> extends BaiduShape<T> {\n /** 路径被编辑的事件名 */\n protected abstract pathEditedEventType: string\n\n /** 修改路径, 仅内部使用 */\n protected setPathInternal(path: BMap.Point[]) {\n this.isDoingSetPath = true\n this.innerOverlay.setPath(path)\n this.isDoingSetPath = false\n }\n\n private eventHubDelegate : EventHubEventTargetDelegate | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: [this.pathEditedEventType],\n onListen: () => {\n // 读取内部的path, 方便在`lineupdate`触发后比较有没有变更\n this.prevPath = this.innerOverlay.getPath()\n this.innerOverlay.addEventListener('lineupdate', this.onLineUpdate)\n },\n onCancel: () => {\n this.innerOverlay.removeEventListener('lineupdate', this.onLineUpdate)\n this.prevPath = undefined\n },\n }))\n }\n\n private prevPath: BMap.Point[] | undefined\n private isDoingSetPath = false\n private onLineUpdate = () => {\n const path = this.innerOverlay.getPath()\n // 过滤掉path不变和通过setPath触发事件的情况\n if (path !== this.prevPath) {\n if (!this.isDoingSetPath) {\n this.eventHubDelegate?.notify({\n type: this.pathEditedEventType,\n target: this,\n // [BaiduRectangle.onBoundsChanged](file://./rectangle.ts#L63)中需要读取则两个数据\n originalEvent: {\n prevPath: this.prevPath,\n path: path,\n },\n })\n }\n this.prevPath = path\n }\n }\n}\n\nexport class BaiduPolyline extends BaiduPolyShape<BMap.Polyline> implements Polyline {\n static create(this: BaiduMap, options: PolylineOptions): BaiduPolyline {\n const coordType = this.coordType\n const inner = new BMap.Polyline(options.path.map(it => it.toBaidu(coordType)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n icons: options.icons?.map(IconSequence.toBaidu),\n })\n return new BaiduPolyline(inner, coordType, this, {\n editable: !!options.editable,\n symbolIcons: options.icons?.map(it => it.icon),\n })\n .visibleOptionInternal(options.visible)\n }\n\n protected override pathEditedEventType: string = 'path-edited'\n\n getPath(): LatLng[] {\n return this.innerOverlay.getPath().map(it => LatLng.fromBaidu(it, this.coordType))\n }\n setPath(path: LatLng[]): void {\n this.coordType = this.map.coordType\n this.setPathInternal(path.map(it => it.toBaidu(this.coordType)))\n }\n override remove(): void {\n super.remove()\n // baidu的PolylineOptions.icons实现有bug, 在移除Polyline时, 由Polyline维护的icons不会被移除\n // 这里将可能是Polyline的Icon的Marker过滤出来, 手动移除它们\n if (this.state.symbolIcons?.length) {\n const icons = this.map.innerMap.getOverlays().filter(overlay => {\n if (!(overlay instanceof BMap.Marker)) return false\n\n const marker = overlay as BMarker\n if (marker.__create_by_tg__) return false\n\n const icon = marker.getIcon()\n if (!(icon instanceof BMap.Symbol)) return false\n\n const symbolIcon = icon as BaiduSymbolIcon\n if (!symbolIcon.__icon__) return false\n\n return this.state.symbolIcons?.includes(symbolIcon.__icon__)\n })\n icons.forEach(it => this.map.innerMap.removeOverlay(it))\n }\n }\n}\n\n/**\n * Google地图的网页版不支持Advanced Polyline(纹理/渐变等效果), 详见: https://issuetracker.google.com/issues/267845944\n */\nexport class GooglePolyline extends GoogleShape<google.maps.Polyline> implements Polyline {\n static create(this: GoogleMap, options: PolylineOptions): GooglePolyline {\n const coordType = this.coordType\n const inner = new google.maps.Polyline({\n path: options.path.map(it => it.toGoogle(coordType)),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n visible: options.visible,\n icons: options.icons?.map(IconSequence.toGoogle),\n })\n return new GooglePolyline(inner, coordType, this)\n }\n\n private pathChangedListeners: google.maps.MapsEventListener[] | undefined\n\n private setupPathChangedListeners() {\n const notify = () => this.eventHubDelegate?.notify({ type: 'path-edited', target: this })\n const path = this.innerOverlay.getPath()\n this.pathChangedListeners = MVCArrays.listenChanged(path, notify)\n }\n private clearPathChangedListeners() {\n this.pathChangedListeners?.forEach(it => it.remove())\n this.pathChangedListeners = undefined\n }\n private eventHubDelegate: EventHubEventTargetDelegate<'path-edited'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['path-edited'],\n onListen: () => this.setupPathChangedListeners(),\n onCancel: () => this.clearPathChangedListeners(),\n }))\n }\n\n getPath(): LatLng[] {\n const path: LatLng[] = []\n this.innerOverlay.getPath().forEach(point => {\n path.push(LatLng.fromGoogle(point, this.coordType))\n })\n return path\n }\n setPath(path: LatLng[]): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPath(path.map(it => it.toGoogle(this.coordType)))\n if (this.eventHubDelegate?.hasListener('path-edited')) {\n // 修改path后, 需要重新设置监听\n this.setupPathChangedListeners()\n }\n }\n}\n","import { MVCArrays } from '../../../components'\nimport type { Tg } from '../../event'\nimport { EventHubEventTargetDelegate } from '../../event-target'\nimport { LatLng } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { BaiduPolyShape, type PolylineEventMap } from './polyline'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type PolygonEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /** @see PolylineEventMap `.path-edited` */\n 'paths-edited': Tg.Event\n}\n\nexport interface PolygonOptions extends ShapeOptions {\n paths: LatLng[][]\n}\n\nexport interface Polygon extends Tg.EventTargetTyped<Polygon, PolygonEventMap>, Shape {\n getPaths(): LatLng[][]\n setPaths(paths: LatLng[][]): void\n}\n\nexport type PolygonOverlay = Polygon & Overlay\n\nexport class BaiduPolygon extends BaiduPolyShape<BMap.Polygon> implements Polygon {\n static create(this: BaiduMap, options: PolygonOptions) {\n const coord = this.coordType\n if (options.paths.length > 1) {\n console.warn('baidu不支持多path, 只会显示paths[0]')\n }\n const path = options.paths[0] || []\n const inner = new BMap.Polygon(path.map(it => it.toBaidu(coord)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n return new BaiduPolygon(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n }\n\n protected override pathEditedEventType: string = 'paths-edited'\n\n getPaths(): LatLng[][] {\n return [this.innerOverlay.getPath().map(it => LatLng.fromBaidu(it, this.coordType))]\n }\n setPaths(paths: LatLng[][]): void {\n if (paths.length > 1) {\n console.warn('baidu不支持多path, 只会显示paths[0]')\n }\n this.coordType = this.map.coordType\n this.setPathInternal((paths[0] || []).map(it => it.toBaidu(this.coordType)))\n }\n}\n\nexport class GooglePolygon extends GoogleShape<google.maps.Polygon> implements Polygon {\n static create(this: GoogleMap, options: PolygonOptions) {\n const coord = this.coordType\n const inner = new google.maps.Polygon({\n paths: options.paths.map(it => it.map(it => it.toGoogle(coord))),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GooglePolygon(inner, coord, this)\n }\n\n private pathChangedListeners: google.maps.MapsEventListener[] | undefined\n\n private setupPathChangedListeners() {\n const notify = () => this.eventHubDelegate?.notify({ type: 'paths-edited', target: this })\n const paths = this.innerOverlay.getPaths()\n this.pathChangedListeners = []\n paths.forEach((path) => {\n this.pathChangedListeners!.push(...MVCArrays.listenChanged(path, notify))\n })\n }\n private clearPathChangedListeners() {\n this.pathChangedListeners?.forEach(it => it.remove())\n this.pathChangedListeners = undefined\n }\n\n private eventHubDelegate: EventHubEventTargetDelegate<'paths-edited'> | undefined\n\n protected override createDelegate() {\n return (this.eventHubDelegate = new EventHubEventTargetDelegate(super.createDelegate(), {\n types: ['paths-edited'],\n onListen: () => this.setupPathChangedListeners(),\n onCancel: () => this.clearPathChangedListeners(),\n }))\n }\n\n getPaths(): LatLng[][] {\n const paths = this.innerOverlay.getPaths()\n const pathsLL: LatLng[][] = []\n paths.forEach(path => {\n const pathLL: LatLng[] = []\n pathsLL.push(pathLL)\n path.forEach(point => {\n pathLL.push(LatLng.fromGoogle(point, this.coordType))\n })\n })\n return pathsLL\n }\n setPaths(paths: LatLng[][]): void {\n this.coordType = this.map.coordType\n this.innerOverlay.setPaths(paths.map(it => it.map(it => it.toGoogle(this.coordType))))\n if (this.eventHubDelegate?.hasListener('paths-edited')) {\n // 修改paths后, 需要重新设置监听\n this.setupPathChangedListeners()\n }\n }\n}\n","import { BMapPoints } from '../../../utils/baidu-utils'\nimport { GoogleConst } from '../../../utils/google-utils'\nimport type { Tg } from '../../event'\nimport { CoordType, LatLng, LatLngBounds } from '../../lat-lng'\nimport type { BaiduMap } from '../baidu-map'\nimport type { GoogleMap } from '../google-map'\nimport type { Overlay } from './overlay'\nimport { BaiduPolyShape } from './polyline'\nimport { BaiduShape, GoogleShape, type Shape, type ShapeOptions } from './shape'\n\nexport type RectangleEventMap = {\n click: Tg.Event\n dblclick: Tg.Event\n mousedown: Tg.MouseEvent\n mouseup: Tg.MouseEvent\n mouseout: Tg.MouseEvent\n mouseover: Tg.MouseEvent\n /**\n * - google: 监听[bounds_changed](https://developers.google.com/maps/documentation/javascript/shapes#editable_events)\n * - baidu: 内部使用Polygon并监听`lineupdate`实现\n */\n 'bounds-changed': Tg.Event\n}\n\nexport interface RectangleOptions extends ShapeOptions {\n bounds: LatLngBounds\n}\n\nexport interface Rectangle extends Tg.EventTargetTyped<Rectangle, RectangleEventMap>, Shape {\n getBounds(): LatLngBounds\n setBounds(bounds: LatLngBounds):void\n}\n\n/**\n * 矩形覆盖物\n *\n * - google: 有矩形\n * - baidu: 没有矩形, 使用{@link BMap.Polygon}变相实现\n */\nexport type RectangleOverlay = Rectangle & Overlay\n\nexport class BaiduRectangle extends BaiduPolyShape<BMap.Polygon> implements Rectangle {\n static create(this: BaiduMap, options: RectangleOptions) {\n const coord = this.coordType\n const inner = new BMap.Polygon(options.bounds.toRectArray().map(it => it.toBaidu(coord)), {\n enableClicking: options.clickable,\n enableEditing: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity != null ? options.strokeOpacity + BaiduShape.OPACITY_DELTA : undefined,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity != null ? options.fillOpacity + BaiduShape.OPACITY_DELTA : undefined,\n })\n return new BaiduRectangle(inner, coord, this, { editable: !!options.editable })\n .visibleOptionInternal(options.visible)\n }\n\n constructor(\n innerOverlay: BMap.Polygon,\n coordType: CoordType,\n map: BaiduMap,\n state: { editable: boolean },\n ) {\n super(innerOverlay, coordType, map, state)\n this.addEventListener('bounds-changed', this.onBoundsChanged)\n }\n\n protected override pathEditedEventType: string = 'bounds-changed'\n\n private isDoingUpdateRectangle = false\n private onBoundsChanged = ({ originalEvent }: Tg.Event) => {\n if (this.isDoingUpdateRectangle) {\n // 防止递归\n return\n }\n const prevPath: BMap.Point[] = originalEvent.prevPath ?? []\n const path: BMap.Point[] = originalEvent.path\n // timeout一下, 防止报递归错误\n setTimeout(() => {\n let points: BMap.Point[] = path\n const length = path.length\n if (prevPath.length !== 4) {\n // 之前的点数不为4\n } else if (length > prevPath.length) {\n // 点变多, 取对边的两个点, 和新的点, 构成新的矩形\n for (let i = 0; i < length; i++) {\n if (prevPath[i] == null || !BMapPoints.equals(path[i], prevPath[i])) {\n const lineStart = path[(i - 2 + length) % length] // 取i之前的点时, `+ length`可以防止index变负数\n const beforePoint = path[(i - 1 + length) % length] // 同上\n const point = path[i]\n const afterPoint = path[(i + 1) % length]\n const lineEnd = path[(i + 2) % length]\n\n let newPoint: BMap.Point\n if (beforePoint.lat === afterPoint.lat) {\n // 前后两个点的lat相同, 就使用新的点的lat\n newPoint = new BMap.Point(beforePoint.lng, point.lat)\n } else if (beforePoint.lng === afterPoint.lng) {\n // 前后两个点的lng相同, 就使用新的点的lng\n newPoint = new BMap.Point(point.lng, beforePoint.lat)\n } else {\n newPoint = point\n }\n points = [lineStart, lineEnd, newPoint]\n break\n }\n }\n } else if (length === prevPath.length) {\n // 点不变, 取对角的点, 构成新的矩形\n for (let i = 0; i < length; i++) {\n if (!BMapPoints.equals(path[i], prevPath[i])) {\n points = [\n path[i],\n path[(i + 2) % 4],\n ]\n break\n }\n }\n } else if (length < prevPath.length) {\n // 点变少, 不做特殊处理\n }\n\n // 从points重新创建矩形\n const bounds = LatLngBounds.fromArray(points.map(it => LatLng.fromBaidu(it, this.coordType)))\n if (bounds) {\n this.isDoingUpdateRectangle = true\n // 使用原始的setPath方法, 保证触发`bounds-changed`事件\n this.innerOverlay.setPath(bounds.toRectArray().map(it => it.toBaidu(this.coordType)))\n this.isDoingUpdateRectangle = false\n }\n }, 0)\n }\n\n getBounds(): LatLngBounds {\n return LatLngBounds.fromBaidu(this.innerOverlay.getBounds(), this.coordType)\n }\n setBounds(bounds: LatLngBounds): void {\n const rect = bounds.toRectArray()\n if (this.innerOverlay.getPath().length === rect.length) {\n bounds.toRectArray().forEach((item, index) => {\n // setPositionAt会触发`lineupdate`, 但由于只是path的元素改变了, path本身并没有被替换, 所以不会触发`bounds-changed`\n this.innerOverlay.setPositionAt(index, item.toBaidu(this.coordType))\n })\n } else {\n this.setPathInternal(rect.map(it => it.toBaidu(this.coordType)))\n }\n }\n}\n\nexport class GoogleRectangle extends GoogleShape<google.maps.Rectangle> implements Rectangle {\n static create(this: GoogleMap, options: RectangleOptions) {\n const coord = this.coordType\n const inner = new google.maps.Rectangle({\n bounds: options.bounds.toGoogle(coord),\n clickable: options.clickable,\n editable: options.editable,\n strokeColor: options.strokeColor,\n strokeOpacity: options.strokeOpacity,\n strokeWeight: options.strokeWeight,\n fillColor: options.fillColor,\n fillOpacity: options.fillOpacity,\n visible: options.visible,\n })\n return new GoogleRectangle(inner, coord, this)\n }\n getBounds(): LatLngBounds {\n return LatLngBounds.fromGoogle(this.innerOverlay.getBounds() ?? GoogleConst.BOUNDS_ZERO, this.coordType)\n }\n setBounds(bounds: LatLngBounds): void {\n const value = bounds.toGoogle(this.coordType)\n // `bounds-changed`事件在设置相同的值时也会触发, 故这里需要过滤相同的值\n if (value.equals(this.innerOverlay.getBounds())) {\n return\n }\n this.innerOverlay.setBounds(value)\n }\n}\n","import { assert } from '../../utils/assert'\nimport { Elements } from '../../utils/elements'\nimport { throwError } from '../../utils/utils'\nimport { BaiduEventTargetDelegate } from '../event-target'\nimport { LatLng, LatLngBounds } from '../lat-lng'\nimport type { Padding, Point } from '../types'\nimport { ControlPositionConverter, CustomControl } from './controls/control'\nimport { BaiduMapTypeControl } from './controls/map-type.control'\nimport { BaiduScaleControl } from './controls/scale.control'\nimport { BaiduStreetViewControl } from './controls/street-view.control'\nimport { BaiduZoomControl } from './controls/zoom.control'\nimport { BaiduAutocomplete, type Autocomplete, type AutocompleteOptions } from './extra/autocomplete'\nimport { BaiduHeatmap, type Heatmap, type HeatmapOptions } from './extra/heatmap'\nimport { BaiduMapUrls, type MapUrls, type MapUrlsOptions } from './extra/map-urls'\nimport { BaiduMarkerClusterer, type MarkerClustererOptions } from './extra/marker-clusterer'\nimport { BaiduPlacesService, type PlacesService, type PlacesServiceOptions } from './extra/places-service'\nimport { BaiduSearchBox, type SearchBox, type SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap, type AbstractMapEventMap } from './map'\nimport { GestureHandlingOptions, MapOptions, type MapStyle } from './map-options'\nimport { BuildInMapType, BuildInMapTypeId, MapType, type BaiduMapType, type BuildInMapTypeIdIncludeIncompatible, type Layer } from './map-type'\nimport { BaiduCircle } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport { BaiduInfoBoxOverlay } from './overlay/info-box'\nimport { BaiduInfoWindow } from './overlay/info-window'\nimport { BaiduLabelOverlay } from './overlay/label'\nimport { BaiduMarker, type BMarker } from './overlay/marker'\nimport type { BaiduOverlay } from './overlay/overlay'\nimport { BaiduPolygon } from './overlay/polygon'\nimport { BaiduPolyline } from './overlay/polyline'\nimport { BaiduRectangle } from './overlay/rectangle'\n\n/**\n * 以google地图的zoom为基准, baidu地图的zoom的值比google地图的大1级\n * 所以在setter中需要+1, 在getter中需要-1\n * */\nconst ZOOM_DELTA = 1\n\n// cSpell:ignore BIMT\nexport class BaiduMap extends AbstractMap {\n private buildInMapTypeId2BIMT: Map<BuildInMapTypeIdIncludeIncompatible, BuildInMapType>\n private baiduMapType2BIMT: Map<BaiduMapType, BuildInMapType>\n private map: BMap.Map\n constructor(\n element: HTMLElement,\n mapOptions: MapOptions,\n ) {\n super(element)\n this.buildInMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getId)\n this.baiduMapType2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.asBaiduMapType)\n\n this.map = new BMap.Map(element, {\n minZoom: mapOptions.minZoom && mapOptions.minZoom + ZOOM_DELTA,\n maxZoom: mapOptions.maxZoom && mapOptions.maxZoom + ZOOM_DELTA,\n mapType: mapOptions.buildInMapTypeId && this.buildInMapTypeId2BIMT.get(mapOptions.buildInMapTypeId)?.asBaiduMapType(),\n enableMapClick: false, // 关闭底图点击功能\n })\n this.map.centerAndZoom(mapOptions.center.toBaidu(this.coordType), mapOptions.zoom + ZOOM_DELTA)\n this.setGestureHandling(mapOptions.gestureHandling)\n if (mapOptions.infoWindowMode === 'multi') {\n console.warn('baidu不支持多个InfoWindow, 可能会出现未知问题')\n }\n if (mapOptions.mapStyle) {\n this.map.setMapStyleV2(mapOptions.mapStyle.baidu)\n }\n this.setEventTargetDelegate(new BaiduEventTargetDelegate(this.map, this))\n this.map.addEventListener('addoverlay', (event) => {\n // 将target当作BMarker看待\n const infoBox = (event.target as BMarker).__info_box__\n if (infoBox) {\n console.debug('add:info-box', infoBox)\n this.map.addOverlay(infoBox)\n }\n })\n this.map.addEventListener('removeoverlay', (event) => {\n // 同上\n const infoBox = (event.target as BMarker).__info_box__\n if (infoBox) {\n console.debug('remove:info-box', infoBox)\n this.map.removeOverlay(infoBox)\n }\n })\n }\n override setGestureHandling(gestureHandling: GestureHandlingOptions = GestureHandlingOptions.auto) {\n if (gestureHandling === GestureHandlingOptions.auto) {\n gestureHandling = this.element.parentElement && Elements.isScrollable(this.element.parentElement)\n ? GestureHandlingOptions.cooperative\n : GestureHandlingOptions.greedy\n }\n switch (gestureHandling) {\n case GestureHandlingOptions.cooperative:\n this.map.disableScrollWheelZoom()\n this.map.enableDragging()\n this.map.enableDoubleClickZoom()\n break\n case GestureHandlingOptions.greedy:\n this.map.enableScrollWheelZoom()\n this.map.enableDragging()\n this.map.enableDoubleClickZoom()\n break\n case GestureHandlingOptions.none:\n this.map.disableDragging()\n this.map.disableScrollWheelZoom()\n this.map.disableDoubleClickZoom()\n break\n }\n }\n override get innerMap(): BMap.Map {\n return this.map\n }\n override get coordType() {\n return this.getMapType().getBaiduCoordType()\n }\n override addEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void {\n if (type === 'center-changed') {\n // 一个事件转成三个事件\n super.addEventListener('movestart', listener as any)\n super.addEventListener('moving', listener as any)\n super.addEventListener('moveend', listener as any)\n super.addEventListener('zoomend', listener as any)\n return\n }\n super.addEventListener(type, listener)\n }\n\n override removeEventListener<K extends keyof AbstractMapEventMap>(type: K, listener: (event: AbstractMapEventMap[K]) => void): void {\n if (type === 'center-changed') {\n // 同上\n super.removeEventListener('movestart', listener as any)\n super.removeEventListener('moving', listener as any)\n super.removeEventListener('moveend', listener as any)\n super.removeEventListener('zoomend', listener as any)\n return\n }\n super.removeEventListener(type, listener)\n }\n\n override fromContainerPointToLatLng(point: Point): LatLng {\n return LatLng.fromBaidu(this.innerMap.pixelToPoint(new BMap.Pixel(point.x, point.y)), this.coordType)\n }\n\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n return this.innerMap.pointToPixel(latLng.toBaidu(this.coordType))\n }\n\n override setDefaultCursor(cursor: string): void {\n this.innerMap.setDefaultCursor(cursor)\n }\n\n override setDraggable(draggable: boolean) {\n draggable ? this.innerMap.enableDragging() : this.innerMap.disableDragging()\n }\n\n override setDoubleClickZoom(enable: boolean) {\n if (enable) {\n this.map.enableDoubleClickZoom()\n } else {\n this.map.disableDoubleClickZoom()\n }\n }\n\n override getCenter() {\n return LatLng.fromBaidu(this.map.getCenter(), this.coordType)\n }\n override setCenter(latlng: LatLng) {\n this.map.setCenter(latlng.toBaidu(this.coordType))\n }\n override getZoom(): number {\n return super.getZoom() - ZOOM_DELTA\n }\n override setZoom(zoom: number): void {\n return super.setZoom(zoom + ZOOM_DELTA)\n }\n override setMinZoom(zoom: number): void {\n this.map.setMinZoom(zoom + ZOOM_DELTA)\n }\n override setMaxZoom(zoom: number): void {\n this.map.setMaxZoom(zoom + ZOOM_DELTA)\n }\n override setMapStyle(mapStyle?: MapStyle) {\n this.map.setMapStyleV2(mapStyle?.baidu ?? { styleJson: [] })\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n const mapType = this.buildInMapTypeId2BIMT.get(id)?.asBaiduMapType()\n this.map.setMapType(mapType ?? throwError('理论上来说不可能为空'))\n }\n override setMapType(mapType: MapType) {\n this.map.setMapType(mapType.asBaiduMapType())\n }\n override getMapType(): MapType {\n const mapType: BaiduMapType = this.map.getMapType()\n // 内置的MapType\n const buildInMapType = this.baiduMapType2BIMT.get(mapType)\n if (buildInMapType) {\n return buildInMapType\n }\n // 其他MapType\n return mapType.__baidu_map_type__ ?? throwError('实现asBaiduMapType()时, 忘了给实例设置__baidu_map_type__?')\n }\n override addLayer(layer: Layer) {\n this.map.addTileLayer(layer.asBaiduLayer())\n }\n override removeLayer(layer: Layer) {\n this.map.removeTileLayer(layer.asBaiduLayer())\n }\n override panTo(position: LatLng): void {\n this.map.panTo(position.toBaidu(this.coordType))\n }\n override panBy(x: number, y: number): void {\n this.map.panBy(x, y)\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding): void {\n this.map.setViewport(bounds.toBaiduArray(this.coordType), {\n // enableAnimation: true, // 默认为true\n margins: padding && [padding.top, padding.right, padding.bottom, padding.left],\n })\n }\n override getBounds(): LatLngBounds {\n return LatLngBounds.fromBaidu(this.map.getBounds(), this.coordType)\n }\n override addElementOverlay(overlay: ElementOverlay) {\n this.map.addOverlay(overlay.asBaidu())\n }\n override removeElementOverlay(overlay: ElementOverlay) {\n this.map.removeOverlay(overlay.asBaidu())\n }\n override addOverlay(overlay: BaiduOverlay) {\n this.map.addOverlay(overlay.innerOverlay)\n }\n override removeOverlay(overlay: BaiduOverlay) {\n this.map.removeOverlay(overlay.innerOverlay)\n }\n override addCustomControl(control: CustomControl): void {\n if (!control.inner) {\n const BaiduControl = class extends BMap.Control {\n override defaultAnchor = ControlPositionConverter.getBaidu().toValue(control.position)\n override defaultOffset = new BMap.Size(0, 0)\n override initialize(map: BMap.Map): HTMLElement {\n const element = control.onCreateElement()\n map.getContainer().appendChild(element)\n return element\n }\n }\n control.inner = new BaiduControl()\n this.map.addControl(control.inner)\n }\n }\n override removeCustomControl(control: CustomControl): void {\n if (control.inner) {\n assert(control.inner instanceof BMap.Control, `control.inner(${control.inner})需要是BMap.Control`)\n this.map.removeControl(control.inner)\n }\n }\n override createLabel = BaiduLabelOverlay.create\n override createCircle = BaiduCircle.create\n override createPolygon = BaiduPolygon.create\n override createPolyline = BaiduPolyline.create\n override createRectangle = BaiduRectangle.create\n override createInfoWindow = BaiduInfoWindow.create\n override createInfoBox = BaiduInfoBoxOverlay.create\n override createMarker = BaiduMarker.create\n override createMapTypeControl = BaiduMapTypeControl.create\n override createZoomControl = BaiduZoomControl.create\n override createStreetViewControl = BaiduStreetViewControl.create\n override createScaleControl = BaiduScaleControl.create\n override createMarkerClusterer(options: MarkerClustererOptions): BaiduMarkerClusterer {\n return new BaiduMarkerClusterer(this, options)\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n return new BaiduHeatmap(this, options)\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n return new BaiduAutocomplete(this, options)\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n return new BaiduSearchBox(this, options)\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n return new BaiduPlacesService(this, options)\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n return new BaiduMapUrls(options)\n }\n}\n","import { MVCArrays } from '../../utils/arrays'\nimport { GoogleConst } from '../../utils/google-utils'\nimport { throwError } from '../../utils/utils'\nimport { GoogleEventTargetDelegate } from '../event-target'\nimport { LatLng, LatLngBounds } from '../lat-lng'\nimport { Point, type Padding } from '../types'\nimport { ControlPositionConverter, CustomControl } from './controls/control'\nimport { GoogleMapTypeControl } from './controls/map-type.control'\nimport { GoogleScaleControl } from './controls/scale.control'\nimport { GoogleStreetViewControl } from './controls/street-view.control'\nimport { GoogleZoomControl } from './controls/zoom.control'\nimport { Autocomplete, GoogleAutocomplete, type AutocompleteOptions } from './extra/autocomplete'\nimport { GoogleHeatmap, type Heatmap, type HeatmapOptions } from './extra/heatmap'\nimport { GoogleMapUrls, type MapUrls, type MapUrlsOptions } from './extra/map-urls'\nimport { GoogleMarkerClusterer, type MarkerClustererOptions } from './extra/marker-clusterer'\nimport { GooglePlacesService, type PlacesService, type PlacesServiceOptions } from './extra/places-service'\nimport { GoogleSearchBox, SearchBox, type SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap } from './map'\nimport type { GestureHandlingOptions, MapOptions, MapStyle } from './map-options'\nimport { BuildInMapType, BuildInMapTypeId, MapType, type BuildInMapTypeIdIncludeIncompatible, type GoogleMapType, type Layer, type OverlayMapType } from './map-type'\nimport { GoogleCircle } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport { GoogleInfoBoxOverlay } from './overlay/info-box'\nimport { GoogleInfoWindow } from './overlay/info-window'\nimport { GoogleLabelOverlay } from './overlay/label'\nimport { GoogleMarker } from './overlay/marker'\nimport type { GoogleOverlay } from './overlay/overlay'\nimport { GooglePolygon } from './overlay/polygon'\nimport { GooglePolyline } from './overlay/polyline'\nimport { GoogleRectangle } from './overlay/rectangle'\n// cSpell:ignore BIMT\nexport class GoogleMap extends AbstractMap {\n private buildInMapTypeId2BIMT: Map<BuildInMapTypeIdIncludeIncompatible, BuildInMapType>\n private googleMapTypeId2BIMT: Map</* google.maps.MapTypeId */string, BuildInMapType>\n private map: google.maps.Map\n constructor(\n element: HTMLElement,\n public mapOptions: MapOptions,\n ) {\n super(element)\n this.buildInMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getId)\n this.googleMapTypeId2BIMT = MapType.BUILD_IN_MAP_TYPES.getValueMap(BuildInMapType.prototype.getGoogleMapTypeId)\n\n const initialMapType = mapOptions.buildInMapTypeId && this.buildInMapTypeId2BIMT.get(mapOptions.buildInMapTypeId)\n this.map = new google.maps.Map(element, {\n center: mapOptions.center.toGoogle((initialMapType ?? MapType.NORMAL).getGoogleCoordType()),\n zoom: mapOptions.zoom,\n disableDefaultUI: true,\n gestureHandling: mapOptions.gestureHandling,\n minZoom: mapOptions.minZoom,\n maxZoom: mapOptions.maxZoom,\n styles: mapOptions.mapStyle?.google.styles,\n mapId: mapOptions.mapStyle?.google.mapId,\n mapTypeId: initialMapType?.getGoogleMapTypeId(),\n })\n this.setEventTargetDelegate(new GoogleEventTargetDelegate(this.map, this))\n }\n override setGestureHandling(gestureHandling?: GestureHandlingOptions) {\n this.map.setOptions({\n gestureHandling: gestureHandling,\n })\n }\n get innerMap(): google.maps.Map {\n return this.map\n }\n get coordType() {\n return this.getMapType().getGoogleCoordType()\n }\n\n override fromContainerPointToLatLng(point: Point): LatLng {\n // Google地图的Projection使用的是世界坐标, 需要转换成屏幕内坐标\n // 详见: https://stackoverflow.com/questions/25219346/how-to-convert-from-x-y-screen-coordinates-to-latlng-google-maps\n const projection = this.innerMap.getProjection()\n const bounds = this.innerMap.getBounds()\n if (projection == null || bounds == null) {\n return LatLng.ZERO\n }\n const bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest())\n const topRight = projection.fromLatLngToPoint(bounds.getNorthEast())\n const zoom = this.innerMap.getZoom()\n if (bottomLeft == null || topRight == null || zoom == null) {\n return LatLng.ZERO\n }\n const scale = Math.pow(2, zoom)\n const wordPoint = new google.maps.Point(point.x / scale + bottomLeft.x, point.y / scale + topRight.y)\n return LatLng.fromGoogle(projection.fromPointToLatLng(wordPoint) ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n // 同上\n const projection = this.innerMap.getProjection()\n const bounds = this.innerMap.getBounds()\n if (projection == null || bounds == null) {\n return Point.ZERO\n }\n const bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest())\n const topRight = projection.fromLatLngToPoint(bounds.getNorthEast())\n const zoom = this.innerMap.getZoom()\n if (bottomLeft == null || topRight == null || zoom == null) {\n return Point.ZERO\n }\n const scale = Math.pow(2, zoom)\n const wordPoint = projection.fromLatLngToPoint(latLng.toGoogle(this.coordType))\n if (wordPoint == null) {\n return Point.ZERO\n }\n return { x: (wordPoint.x - bottomLeft.x) * scale, y: (wordPoint.y - topRight.y) * scale }\n }\n\n override setDefaultCursor(cursor: string): void {\n this.innerMap.setOptions({ draggableCursor: cursor })\n }\n\n override setDraggable(draggable: boolean) {\n this.innerMap.setOptions({ draggable })\n }\n\n override setDoubleClickZoom(enable: boolean) {\n this.map.setOptions({ disableDoubleClickZoom: !enable })\n }\n\n override getCenter() {\n return LatLng.fromGoogle(this.map.getCenter() ?? GoogleConst.LATLNG_ZERO, this.coordType)\n }\n override setCenter(latlng: LatLng) {\n this.map.setCenter(latlng.toGoogle(this.coordType))\n }\n override setMinZoom(zoom: number): void {\n this.map.setOptions({ minZoom: zoom })\n }\n override setMaxZoom(zoom: number): void {\n this.map.setOptions({ maxZoom: zoom })\n }\n override setMapStyle(mapStyle?: MapStyle) {\n this.map.setOptions({\n styles: mapStyle?.google.styles,\n mapId: mapStyle?.google.mapId,\n })\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n const mapTypeId = this.buildInMapTypeId2BIMT.get(id)?.getGoogleMapTypeId()\n this.map.setMapTypeId(mapTypeId ?? throwError('理论上来说不可能为空'))\n }\n override setMapType(mapType: MapType) {\n if (mapType instanceof BuildInMapType) {\n // 内置地图没有地图实例, 只需要用id设置就行了\n this.map.setMapTypeId(mapType.getGoogleMapTypeId())\n } else {\n this.map.mapTypes.set(mapType.id, mapType.asGoogleMapType())\n this.map.setMapTypeId(mapType.id)\n }\n }\n override getMapType(): MapType {\n const mapTypeId = this.map.getMapTypeId() ?? google.maps.MapTypeId.ROADMAP\n // 内置的MapType\n const buildInMapType = this.googleMapTypeId2BIMT.get(mapTypeId)\n if (buildInMapType) {\n return buildInMapType\n }\n // 其他MapType\n const mapType: GoogleMapType = this.map.mapTypes.get(mapTypeId)\n return mapType.__google_map_type__ ?? throwError(`实现${mapTypeId}的asGoogleMapType()时, 忘了给实例设置__google_map_type__?`)\n }\n override addOverlayMapType(mapType: OverlayMapType) {\n this.map.overlayMapTypes.push(mapType.asGoogleMapType())\n }\n override removeOverlayMapType(mapType: OverlayMapType) {\n MVCArrays.remove(this.map.overlayMapTypes, mapType.asGoogleMapType())\n }\n override addLayer(layer: Layer): void {\n layer.asGoogleLayer().setMap(this.map)\n }\n override removeLayer(layer: Layer): void {\n layer.asGoogleLayer().setMap(null)\n }\n override panTo(position: LatLng): void {\n this.map.panTo(position.toGoogle(this.coordType))\n }\n override panBy(x: number, y: number): void {\n this.map.panBy(x, y)\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding): void {\n this.map.fitBounds(bounds.toGoogle(this.coordType), padding)\n }\n override getBounds(): LatLngBounds {\n const bounds = this.map.getBounds()\n if (!bounds) {\n return LatLngBounds.EMPTY\n }\n return LatLngBounds.fromGoogle(bounds, this.coordType)\n }\n override addElementOverlay(overlay: ElementOverlay) {\n overlay.asGoogle().setMap(this.map)\n }\n override removeElementOverlay(overlay: ElementOverlay) {\n overlay.asGoogle().setMap(null)\n }\n override addOverlay(overlay: GoogleOverlay) {\n overlay.innerOverlay.setMap(this.map)\n }\n override removeOverlay(overlay: GoogleOverlay) {\n overlay.innerOverlay.setMap(null)\n }\n\n override addCustomControl(control: CustomControl) {\n if (!control.inner) {\n control.inner = control.onCreateElement()\n this.map.controls[ControlPositionConverter.getGoogle().toValue(control.position)].push(control.inner)\n }\n }\n override removeCustomControl(control: CustomControl) {\n if (control.inner) {\n const controlArray = this.map.controls[ControlPositionConverter.getGoogle().toValue(control.position)]\n MVCArrays.remove(controlArray, control.inner)\n }\n }\n override createLabel = GoogleLabelOverlay.create\n override createCircle = GoogleCircle.create\n override createPolygon = GooglePolygon.create\n override createPolyline = GooglePolyline.create\n override createRectangle = GoogleRectangle.create\n override createInfoWindow = GoogleInfoWindow.create\n override createInfoBox = GoogleInfoBoxOverlay.create\n override createMarker = GoogleMarker.create\n override createMapTypeControl = GoogleMapTypeControl.create\n override createZoomControl = GoogleZoomControl.create\n override createStreetViewControl = GoogleStreetViewControl.create\n override createScaleControl = GoogleScaleControl.create\n override createMarkerClusterer(options: MarkerClustererOptions): GoogleMarkerClusterer {\n return new GoogleMarkerClusterer(this, options)\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n return new GoogleHeatmap(this, options)\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n return new GoogleAutocomplete(this, options)\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n return new GoogleSearchBox(this, options)\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n return new GooglePlacesService(this, options)\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n return new GoogleMapUrls(options)\n }\n}\n","/**\n * 最新是3.1版, 但@types/heremaps和以前的项目都用的是3.0版, 故当前先用3.0...\n * TODO: 改成使用3.1版实现\n **/\nexport const HERE_SUPPORTED_VERSIONS = ['3.0'] as const\n\n/**\n * 当前@types/heremaps是v3.0版, 和v3.1版api有区别, 若要使用3.1版, 需要用这个方法来做到类型注解兼容...\n * @see https://developer.here.com/documentation/maps/topics/migration.html\n */\nexport function ensureHereV31() {\n if (H.service.PlatformV31) {\n return\n }\n H.service.PlatformV31 = H.service.Platform as any\n}\n","import deepmerge from 'deepmerge'\nimport { HERE_SUPPORTED_VERSIONS } from '../utils/here-utils'\nimport type { DeepPartial } from '../utils/mapped-types'\nimport { throwError } from '../utils/utils'\n\nexport interface MapConfig {\n key: string\n version: string\n}\n\nexport interface TgMapConfig {\n google: MapConfig & {\n /** @see https://developers.google.com/maps/documentation/javascript/versions */\n version: 'weekly' | 'quarterly' | 'beta' | 'alpha' | '3.49' | '3.50' | '3.51' | '3.52'\n language: string,\n /** @see https://developers.google.com/maps/documentation/javascript/libraries */\n libraries: ('drawing' | 'geometry' | 'journeySharing' | 'localContext' | 'marker' | 'places' | 'visualization')[]\n }\n baidu: MapConfig & {\n /** @see https://lbsyun.baidu.com/index.php?title=jspopular3.0/theupdatelog */\n version: '3.0'\n }\n here: MapConfig & {\n version: typeof HERE_SUPPORTED_VERSIONS[number]\n }\n}\n\nexport type PartialTgMapConfig = DeepPartial<TgMapConfig>\n\nconst defaultConfig: TgMapConfig = {\n baidu: {\n version: '3.0',\n // 在build时会被静态替换, 导致使用者不能无法设置它\n // @see https://cn.vitejs.dev/guide/build.html#library-mode:~:text=%E6%A8%A1%E5%BC%8F%E4%B8%8B%EF%BC%8C%E6%89%80%E6%9C%89-,import.meta.env.*,-%E7%94%A8%E6%B3%95%E5%9C%A8%E6%9E%84\n // @see @vite_process_env_detail\n key: import.meta.env.VITE_APP_DEV_KEY_BAIDU,\n },\n google: {\n version: 'quarterly',\n key: import.meta.env.VITE_APP_DEV_KEY_GOOGLE,\n language: 'en-us',\n libraries: ['places', 'visualization'],\n },\n here: {\n version: HERE_SUPPORTED_VERSIONS[0],\n key: import.meta.env.VITE_APP_DEV_KEY_HERE,\n },\n}\n\nlet tgMapConfig: TgMapConfig | undefined\n\nexport function getTgMapConfig(): TgMapConfig {\n return tgMapConfig || throwError('请先安装: Vue<PartialTgMapConfig>.use(TgMap, {})')\n}\n\nexport function setTgMapConfig(config?: PartialTgMapConfig) {\n if (config != null) {\n tgMapConfig = deepmerge(defaultConfig, config) as TgMapConfig\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n// cSpell:ignore apikey, mapevents\nimport { HERE_SUPPORTED_VERSIONS } from '../../utils/here-utils'\nimport { throwError } from '../../utils/utils'\nimport { CoordType, LatLng, LatLngBounds } from '../lat-lng'\nimport { getTgMapConfig } from '../map-config'\nimport type { Padding, Point } from '../types'\nimport type { CustomControl } from './controls/control'\nimport type { MapTypeControl, MapTypeControlOptions } from './controls/map-type.control'\nimport type { ScaleControlOptions } from './controls/scale.control'\nimport type { StreetViewControl, StreetViewControlOptions } from './controls/street-view.control'\nimport type { ZoomControl, ZoomControlOptions } from './controls/zoom.control'\nimport type { Autocomplete, AutocompleteOptions } from './extra/autocomplete'\nimport type { Heatmap, HeatmapOptions } from './extra/heatmap'\nimport type { MapUrls, MapUrlsOptions } from './extra/map-urls'\nimport type { MarkerClusterer, MarkerClustererOptions } from './extra/marker-clusterer'\nimport type { PlacesService, PlacesServiceOptions } from './extra/places-service'\nimport type { SearchBox, SearchBoxOptions } from './extra/search-box'\nimport { AbstractMap } from './map'\nimport type { GestureHandlingOptions, MapOptions, MapStyle } from './map-options'\nimport type { BuildInMapTypeId, Layer, MapType } from './map-type'\nimport type { CircleOptions, CircleOverlay } from './overlay/circle'\nimport type { ElementOverlay } from './overlay/element-overlay'\nimport type { InfoBoxOptions, InfoBoxOverlay } from './overlay/info-box'\nimport type { InfoWindowOptions, InfoWindowOverlay } from './overlay/info-window'\nimport type { LabelOptions, LabelOverlay } from './overlay/label'\nimport type { MarkerOptions, MarkerOverlay } from './overlay/marker'\nimport type { Overlay } from './overlay/overlay'\nimport type { PolygonOptions, PolygonOverlay } from './overlay/polygon'\nimport type { PolylineOptions, PolylineOverlay } from './overlay/polyline'\nimport type { RectangleOptions, RectangleOverlay } from './overlay/rectangle'\n\nexport class HereMap extends AbstractMap {\n private map: H.Map\n public defaultLayers: H.service.DefaultLayers\n constructor(\n element: HTMLElement,\n public mapOptions: MapOptions,\n ) {\n super(element)\n const config = getTgMapConfig().here\n if (!HERE_SUPPORTED_VERSIONS.includes(config.version)) {\n throwError(`不支持${config.version}, HereMap当前只支持如下版本: ${HERE_SUPPORTED_VERSIONS}`)\n }\n const platform = new H.service.Platform({\n app_id: config.key.split(',')[0],\n app_code: config.key.split(',')[1],\n })\n this.defaultLayers = platform.createDefaultLayers()\n this.map = new H.Map(element, this.defaultLayers.normal.map, {\n zoom: mapOptions.zoom,\n center: mapOptions.center?.toHere(this.coordType),\n })\n const behavior = new H.mapevents.Behavior(new H.mapevents.MapEvents(this.map))\n const ui = H.ui.UI.createDefault(this.map, this.defaultLayers)\n }\n\n override get innerMap(): H.Map {\n return this.map\n }\n\n override get coordType(): CoordType {\n return CoordType.wgs84\n }\n override getCenter(): LatLng {\n return LatLng.fromHere(this.map.getCenter(), this.coordType)\n }\n override setCenter(latlng: LatLng): void {\n this.map.setCenter(latlng.toHere(this.coordType))\n }\n // TODO: 实现其他方法\n override setGestureHandling(gestureHandling: GestureHandlingOptions): void {\n throw new Error('Method not implemented.')\n }\n override fromContainerPointToLatLng(point: Point): LatLng {\n throw new Error('Method not implemented.')\n }\n override fromLatLngToContainerPoint(latLng: LatLng): Point {\n throw new Error('Method not implemented.')\n }\n override setDefaultCursor(cursor: string): void {\n throw new Error('Method not implemented.')\n }\n override setDraggable(draggable: boolean): void {\n throw new Error('Method not implemented.')\n }\n override setDoubleClickZoom(enable: boolean): void {\n throw new Error('Method not implemented.')\n }\n override setMinZoom(zoom: number): void {\n throw new Error('Method not implemented.')\n }\n override setMaxZoom(zoom: number): void {\n throw new Error('Method not implemented.')\n }\n override setMapStyle(mapStyle?: MapStyle): void {\n throw new Error('Method not implemented.')\n }\n override setBuildInMapTypeId(id: BuildInMapTypeId): void {\n throw new Error('Method not implemented.')\n }\n override setMapType(mapType: MapType): void {\n throw new Error('Method not implemented.')\n }\n override getMapType(): MapType {\n throw new Error('Method not implemented.')\n }\n override addLayer(layer: Layer): void {\n throw new Error('Method not implemented.')\n }\n override removeLayer(layer: Layer): void {\n throw new Error('Method not implemented.')\n }\n override panTo(position: LatLng): void {\n throw new Error('Method not implemented.')\n }\n override panBy(x: number, y: number): void {\n throw new Error('Method not implemented.')\n }\n override fitBounds(bounds: LatLngBounds, padding?: Padding | undefined): void {\n throw new Error('Method not implemented.')\n }\n override getBounds(): LatLngBounds {\n throw new Error('Method not implemented.')\n }\n override addElementOverlay(overlay: ElementOverlay): void {\n throw new Error('Method not implemented.')\n }\n override removeElementOverlay(overlay: ElementOverlay): void {\n throw new Error('Method not implemented.')\n }\n override addOverlay(overlay: Overlay<unknown>): void {\n throw new Error('Method not implemented.')\n }\n override removeOverlay(overlay: Overlay<unknown>): void {\n throw new Error('Method not implemented.')\n }\n override createMarker(options: MarkerOptions): MarkerOverlay {\n throw new Error('Method not implemented.')\n }\n override createMarkerClusterer(options: MarkerClustererOptions): MarkerClusterer {\n throw new Error('Method not implemented.')\n }\n override createHeatmap(options: HeatmapOptions): Heatmap {\n throw new Error('Method not implemented.')\n }\n override createAutocomplete(options: AutocompleteOptions): Autocomplete {\n throw new Error('Method not implemented.')\n }\n override createSearchBox(options: SearchBoxOptions): SearchBox {\n throw new Error('Method not implemented.')\n }\n override createPlacesService(options: PlacesServiceOptions): PlacesService {\n throw new Error('Method not implemented.')\n }\n override createMapUrls(options: MapUrlsOptions): MapUrls {\n throw new Error('Method not implemented.')\n }\n override createInfoWindow(options: InfoWindowOptions): InfoWindowOverlay {\n throw new Error('Method not implemented.')\n }\n override createInfoBox(options: InfoBoxOptions): InfoBoxOverlay {\n throw new Error('Method not implemented.')\n }\n override createPolyline(options: PolylineOptions): PolylineOverlay {\n throw new Error('Method not implemented.')\n }\n override createPolygon(options: PolygonOptions): PolygonOverlay {\n throw new Error('Method not implemented.')\n }\n override createRectangle(options: RectangleOptions): RectangleOverlay {\n throw new Error('Method not implemented.')\n }\n override createCircle(options: CircleOptions): CircleOverlay {\n throw new Error('Method not implemented.')\n }\n override createLabel(options: LabelOptions): LabelOverlay {\n throw new Error('Method not implemented.')\n }\n override addCustomControl(control: CustomControl): void {\n throw new Error('Method not implemented.')\n }\n override removeCustomControl(control: CustomControl): void {\n throw new Error('Method not implemented.')\n }\n override createMapTypeControl(options: MapTypeControlOptions): MapTypeControl {\n throw new Error('Method not implemented.')\n }\n override createZoomControl(options: ZoomControlOptions): ZoomControl {\n throw new Error('Method not implemented.')\n }\n override createStreetViewControl(options: StreetViewControlOptions): StreetViewControl {\n throw new Error('Method not implemented.')\n }\n override createScaleControl(options: ScaleControlOptions): ZoomControl {\n throw new Error('Method not implemented.')\n }\n}\n","import { BaiduMap } from './map/baidu-map'\nimport { GoogleMap } from './map/google-map'\nimport { HereMap } from './map/here-map'\nimport type { AbstractMap } from './map/map'\nimport { MapOptions } from './map/map-options'\n\nexport enum TgMapType {\n google = 'google',\n baidu = 'baidu',\n here = 'here',\n}\n\nexport namespace TgMapFactory {\n export function createMap(type: TgMapType, $map: HTMLElement, mapOptions?: Partial<MapOptions>): AbstractMap {\n const options = MapOptions.create(mapOptions)\n switch (type) {\n case TgMapType.google:\n return new GoogleMap($map, options)\n case TgMapType.baidu:\n return new BaiduMap($map, options)\n case TgMapType.here:\n return new HereMap($map, options)\n }\n }\n}\n","// cSpell:ignore mapevents\nimport { assertNever } from '../utils/assert'\nimport { initGoogleMapDynamicLibraryImport } from '../utils/google-utils'\nimport { HERE_SUPPORTED_VERSIONS } from '../utils/here-utils'\nimport { Objects } from '../utils/objects'\nimport { createAsyncSingleton, throwError } from '../utils/utils'\nimport { getTgMapConfig, type TgMapConfig } from './map-config'\nimport { TgMapType } from './map-factory'\n\n/**\n * 使用类型映射的方式`TgMapConfig[T]`, 确定`type`的类型之后, 不会自动推断`config`的类型,\n * 故另外声明了一个联合类型{@link LoadMapOptionsImpl}, 在实现代码中使用它来自动推断类型\n */\ntype LoadMapOptions<T extends TgMapType> = { type: T, config: TgMapConfig[T] }\n\ntype LoadMapOptionsImpl =\n | { type: TgMapType.baidu, config: TgMapConfig[TgMapType.baidu] }\n | { type: TgMapType.google, config: TgMapConfig[TgMapType.google] }\n | { type: TgMapType.here, config: TgMapConfig[TgMapType.here] }\n\nconst cachedMapLoaders: Record<string, () => Promise<unknown>> = {}\n\n/**\n * 加载缓存的地图, 保证一种地图只加载一次\n */\nexport function loadCachedMap(type: TgMapType) {\n const loader = Objects.putIfAbsent(cachedMapLoaders, type, () => {\n return createAsyncSingleton(() => loadMap({ type, config: getTgMapConfig()[type] }))\n })\n return loader()\n}\n\n/** 载入地图库 */\nexport function loadMap<T extends TgMapType>(options: LoadMapOptions<T>): Promise<unknown>\nexport function loadMap({ type, config }: LoadMapOptionsImpl): Promise<unknown> {\n const global = window as any\n const namespace = getMapNamespace(type)\n if (Objects.get(global, namespace)) {\n return Promise.resolve()\n }\n if (type !== TgMapType.here && !config.key) {\n // here目前未完成, 不检查它的key\n throwError(`请先配置${type}地图的key`)\n }\n switch (type) {\n case TgMapType.google:\n if (import.meta.env.VITE_FALSE) {\n // 测试新的动态载入方式\n initGoogleMapDynamicLibraryImport({\n key: config.key,\n v: '3.52',\n // v: config.version,\n })\n return google.maps.importLibrary('core')\n }\n // TODO: 修改语言后, 要重新载入\n return loadJsonp(`https://maps.googleapis.com/maps/api/js?key=${config.key}&language=${config.language}&v=${config.version}&libraries=${config.libraries.join(',')}`)\n\n case TgMapType.baidu:\n return loadJsonp(`https://api.map.baidu.com/api?v=${config.version}&ak=${config.key}`)\n case TgMapType.here:\n // TODO: 改成分模块判断是否载入过\n return loadJs(getHereModuleUrl('core', config.version)) // 要先载入core\n .then(() => Promise.all([ // 其他大多数模块都可以同时载入\n loadJs(getHereModuleUrl('service', config.version)),\n loadJs(getHereModuleUrl('mapevents', config.version)),\n loadJs(getHereModuleUrl('clustering', config.version)),\n loadJs(getHereModuleUrl('ui', config.version)),\n ]))\n .catch(e => {\n // 有可能core载入成功, 其他模块载入失败, 需要删除全局变量, 方便下次从头重新载入\n Objects.del(global, namespace)\n return Promise.reject(e)\n })\n default:\n assertNever(type)\n }\n}\n\n/**\n * 除了如下特例外, 都依赖`core`:\n * - `core`不依赖其他模块\n * - `service-legacy`依赖`core`和`service`\n*/\nfunction getHereModuleUrl(\n name: 'core' | 'core-legacy' | 'service' | 'service-legacy' | 'mapevents' | 'ui' | 'clustering' | 'data',\n version = HERE_SUPPORTED_VERSIONS[0],\n) {\n return `https://js.api.here.com/v3/${version}/mapsjs-${name}.js`\n}\n\nfunction getMapNamespace(type: TgMapType) {\n switch (type) {\n case TgMapType.google:\n return 'google.maps'\n case TgMapType.baidu:\n return 'BMap'\n case TgMapType.here:\n return 'H'\n }\n}\n\nlet callbackId = 0\nexport function loadJsonp(url: string, callbackParamName = 'callback') {\n return new Promise((resolve, reject) => {\n const callbackName = `__callback${callbackId++}`\n ; (window as any)[callbackName] = resolve\n const $script = document.createElement('script')\n $script.src = `${url}&${callbackParamName}=${callbackName}`\n $script.onerror = reject\n document.body.appendChild($script)\n })\n}\n\nexport function loadJs(url: string) {\n return new Promise((resolve, reject) => {\n const $script = document.createElement('script')\n $script.src = url\n $script.onload = resolve\n $script.onerror = reject\n document.body.appendChild($script)\n })\n}\n","import {\n computed,\n createCommentVNode,\n type Component,\n type ComponentOptions,\n type ComponentPublicInstance,\n type ComputedRef,\n type Prop,\n type PropType,\n type Ref,\n type RendererElement,\n type RendererNode,\n type Slots,\n type VNode,\n type WritableComputedOptions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n type reactive,\n} from 'vue'\nimport type { AbstractConstructor, KeysMatching, StringEnumLike, StringEnumValue, Thing } from './mapped-types'\nimport { Strings } from './strings'\nimport { noop } from './utils'\n\n/** 组件选项中的hook名 */\nexport type VueHookName = ExcludeSubtype<\n KeysMatching<OmitStartsWith<RemoveIndex<ComponentOptions>, '_'>, { (): void } | undefined>,\n 'serverPrefetch' | 'emits' | 'computed' | 'extends' | 'methods' | 'call' | undefined\n>\n\nexport type VueHookFunction = (this: ComponentPublicInstance) => void\n\n/**\n * 模仿Vue的计算属性的写法\n * @see ComputedOptions\n */\nexport type Property<T> = T | { (): T } | { get(): T, set?(value: T): void }\n\n/**\n * ## Vue2\n * 和typed()联合使用, 写成: `props: typed<Props<Options>>({...})`, 可以将`Options`作为属性的类型声明,\n * ### 注意\n * 1. 对于`Options`中可选的属性, 漏了VSCode不会报错...要小心\n * 2. `...`中理论上来说只要写Vue的纯js式的类型验证信息(Boolean/Number/String/Object/...)就行了, 并且还有ts的类型检查\n * 3. 对于`Options`中可选的`boolean`属性, 若将类型验证信息写为`Boolean`时, 该属性的默认值并不是`undefined`而是`false`, 这和它的类型声明(`boolean | undefined`)不匹配, 推荐写成`optionalProp(Boolean)`\n * 4. 因为存在上述特殊情况, 推荐使用{@link requiredProp},{@link optionalProp}等快捷方法写类型验证信息, 方法的传入参数直接写Vue的纯js式的类型验证信息, 就行了\n *\n * ## Vue3\n * 需要用`props: {...} satisfies Props<Options>`替代`typed()`, 防止{@link NotNullProp}被Vue看成必选的属性\n * */\nexport type Props<T> = {\n [K in keyof T]-?: T[K] extends {} ? NotNullProp<T[K]> : Prop<Exclude<T[K], undefined>>\n}\n/** 表示一个非空的Prop, `required`为true 或者 设置了`default`的{@link Prop}, 才是非空的Prop */\ntype NotNullProp<T = any, D = T> = { type: PropType<T> } & ({ required: true } | { default: D | (() => D) })\n\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue: E[keyof E]): { type: PropType<StringEnumValue<E>>, default: E[keyof E] }\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E): { type: PropType<StringEnumValue<E>> }\n/**\n * 注意: 由于使用了`Object.values(enumObject)`来获取所有枚举值\n * - 若enumObject为数字枚举, 获取出来的值会同时包含枚举名和枚举值, 故不支持\n * - 若enumObject同时是命名空间名, 获取出来的值会包含命名空间上的方法, 应当避免\n *\n * @param enumObject 枚举对象\n * @param defaultValue 默认值\n * @see https://frontendsociety.com/using-a-typescript-interfaces-and-types-as-a-prop-type-in-vuejs-508ab3f83480\n * */\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue?: E[keyof E]): Prop<StringEnumValue<E>> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: E[keyof E]) => Object.values(enumObject).includes(value),\n }\n}\n\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue: T): { type: PropType<T[][number]>, default: T }\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[]): { type: PropType<T[][number]> }\n/** 使用方法重载, 声明`是否提供defaultValue`和`返回值是否可undefined`的关系_(:3」∠)_ */\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue?: T): Prop<T[][number]> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: T) => values.includes(value),\n }\n}\n\nexport function requiredProp<T>(type: PropType<T>): { type: PropType<T>, required: true } {\n return {\n type: type,\n required: true,\n }\n}\n\nexport function optionalProp<T>(type: PropType<T>, defaultValue: T | (() => T)): { type: PropType<T>, default: T }\nexport function optionalProp<T>(type: PropType<T>): { type: PropType<T> }\nexport function optionalProp<T>(type: PropType<T>, defaultValue?: T | (() => T)): Prop<T> {\n return {\n type: type,\n default: defaultValue,\n }\n}\n\n/**\n * 保存在this上的属性\n * @param defaultValues 属性的默认值\n *\n * @deprecated Vue3中已经不支持`cache: false`的计算属性, 使用setup中返回普通的值替代\n */\nexport function computedSaveOnThis<T>(defaultValues: { [K in keyof T]: T[K] }): { [K in keyof T]: WritableComputedOptions<T[K]> } {\n const accessors: any = {}\n Object.entries(defaultValues).forEach(([key, defaultValue]) => {\n const name = `__${key}`\n accessors[key] = {\n get() {\n const value = this[name]\n return value === undefined ? defaultValue : value\n },\n set(value: any) {\n this[name] = value\n },\n // Vue3已经不支持该属性\n // cache: false\n }\n })\n return accessors\n}\n\n// 这个对象是可以共享的~~\nconst sharedPropertyDefinition: PropertyDescriptor = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop,\n}\n\n/**\n * 模仿Vue的计算属性的写法, 将方法转换成属性\n * @deprecated 在Vue2时用来将provide的方法转换成属性, 方便使用, Vue3中不生效, 故废弃\n */\nexport function createPropertyObject(obj: any): any {\n Object.keys(obj).forEach(key => {\n const value = obj[key]\n let redefined = false\n if (typeof value === 'function') {\n sharedPropertyDefinition.get = value\n sharedPropertyDefinition.set = noop\n redefined = true\n } else if (typeof value === 'object' && typeof value.get === 'function') {\n sharedPropertyDefinition.get = value.get\n sharedPropertyDefinition.set = value.set\n redefined = true\n }\n if (redefined) {\n obj[key] = Object.defineProperty(obj, key, sharedPropertyDefinition)\n }\n })\n return obj\n}\n\n/**\n * 相比{@link createPropertyObject}增加类型信息\n * @see createPropertyObject\n * @deprecated Vue3中没用\n * */\nexport function createPropertyObjectTyped<T>(obj: { [K in keyof T]: Property<T[K]> }): T {\n return createPropertyObject(obj)\n}\n\n/**\n * 创建空节点\n *\n * Vue2中使用`this._e()`创建空节点: https://github.com/vuejs/vue/blob/b6247fc9d7442c50d60ccf366a7cb183a4d02129/src/core/instance/render-helpers/index.js#L28\n *\n * Vue3中等价的实现是{@link createCommentVNode}: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/compat/instance.ts#L162\n */\nexport function createEmptyVNode(): VNode {\n return createCommentVNode()\n}\n/**\n * @see https://github.com/vuejs/vue/blob/43b98fe25151b0b6bacd36f3ee27c5d61add5fdb/packages/weex-vue-framework/factory.js/#L2906\n * */\nexport function callHook(vm: ComponentPublicInstance, hookName: VueHookName) {\n // $options中的每个hook函数被合并成一个数组了\n const hooks: Array<VueHookFunction> | undefined = (vm.$options as any)[hookName]\n if (!hooks) {\n return\n }\n for (const hook of hooks) {\n hook.call(vm)\n }\n}\n\n/**\n * {@link import('./mapped-types.ts').safeAsComponent}\n * @deprecated Vue3已经不能遍历子组件的实例了, 所以这个方法目前没用\n */\nexport function findByComponentType<T extends Component & AbstractConstructor>(\n arr: ComponentPublicInstance[],\n component: T,\n): InstanceType<T> | undefined {\n for (const item of arr) {\n // TO-DO: 2023/03/16 ipcjs 有没有更好的判断组件实例的方式?\n // => 目前没找到\n if (item.$options.name === component.name) {\n return item as InstanceType<T>\n }\n }\n return undefined\n}\n\n/**\n * 通过构造slots内容的方式, 提取出slots中对应{@link component}的VNode, {@link VNode.props}就是当前给组件设置的属性值\n *\n * 注意, 该方法并无法获取到{@link component}的实例\n *\n * @see https://stackoverflow.com/questions/64154002/vue-3-how-to-get-information-about-children\n */\nexport function extractVNodeFromSlotsByComponent<Props>(slots: Slots, component: ComponentOptions<Props>) {\n if (!slots.default) return undefined\n\n const nodeList = slots.default()\n for (const node of nodeList) {\n if ((node?.type as Component).name === component.name) {\n return node as VNode<RendererNode, RendererElement, Props>\n }\n }\n return undefined\n}\n\n/**\n * Vue3中 class/style/未声明的事件/未声明的属性 都会集合到`this.$attrs`中\n * 默认情况下(`inheritAttrs`为true), 将被透传给组件的根节点\n *\n * 而Vue2, `this.$attrs`值包含 未声明的属性, 所有事件放到了`this.$listeners`中\n *\n * 这里模仿Vue2的行为, 从{@link attrs}中拆分出未声明的事件, 方便将他们透传给地图的对象\n * 同时若传入{@link props}, 也会从它里面拆分出 声明的事件类型的属性\n *\n * ## 如何给事件添加类型信息\n *\n * - 声明在`emits`中的事件, 会给emit方法添加类型信息, 但没办法在运行时判断是否有被设置\n * - 声明在`props`中的事件, 不会.................. , 但可以通过读取`this.$props`判断是否被设置\n *\n * 所有我们最终选择用{@link EventProps}在`props`中声明事件, 同时用{@link EventEmits}在`emits`上声明事件的类型,\n * 达到既有类型信息, 又能判断是否存在的效果, 写法如下:\n * ```\n * {\n * props: {...} satisfies EventProps<TgMapEmits>,\n * emits: undefined as any as EventEmits<TgMapEmits>,\n * }\n * ```\n *\n * ## 参考\n * - https://cn.vuejs.org/guide/components/attrs.html#disabling-attribute-inheritance\n * - https://v3-migration.vuejs.org/zh/breaking-changes/listeners-removed.html\n * - https://eslint.vuejs.org/rules/require-explicit-emits.html#options\n */\nexport function splitAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n const listeners: Record<string, unknown> = {}\n const binds: Record<string, unknown> = {}\n const listenerProps: Record<string, unknown> = {}\n Object.keys(attrs).forEach(key => {\n if (key.startsWith('on')) {\n listeners[Strings.pascal2kebab(key.substring(2))] = attrs[key]\n } else {\n binds[key] = attrs[key]\n }\n })\n if (props) {\n Object.keys(props).forEach(key => {\n if (key.startsWith('on')) {\n listenerProps[Strings.pascal2kebab(key.substring(2))] = props[key]\n }\n })\n }\n return {\n /** class/style/未声明的属性 等 */\n binds,\n /** 未声明的事件 */\n listeners,\n /** 声明在`props`中的事件 */\n listenerProps,\n }\n}\n\n/** 响应式的{@link splitAttrs} */\nexport function useSplittedAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n return computed(() => splitAttrs(attrs, props))\n}\n\nexport type EventCallback<E = any> = (event: E) => void\n\n/**\n * 事件类型的属性\n * @see splitAttrs\n * */\nexport type EventProps<Emits> = Emits extends string\n // 转换 简单的String Union, 类型使用Function, 是为了简便, 省得写详细的类型信息\n // eslint-disable-next-line @typescript-eslint/ban-types\n ? { [K in Emits as `on${Capitalize<K>}`]: Prop<Function> }\n // 转换 事件名=>事件类型的映射\n : {\n [K in keyof Emits as K extends string ? `on${Capitalize<K>}` : never]: Prop<EventCallback<Emits[K]>>\n }\n\n/**\n * 用来声明事件的类型信息\n * @see splitAttrs\n * */\nexport type EventEmits<T> = {\n [K in keyof T]: (event: T[K]) => boolean\n}\n\n/** 给事件类型的属性标注类型 */\nexport function eventProp<E = any>(): Prop<EventCallback<E>> {\n return Function as PropType<EventCallback<E>>\n}\n\nexport const useEventLogMethods = () => {\n let prevType: Thing | undefined\n let prevTime: number | undefined\n /**\n * @event 一般来说传{@link Tg.Event}对象, 但传其他对象也不会报错\n */\n function eventLog(event: Thing | null | undefined) {\n console.log(event)\n prevType = event && (event as any).type\n prevTime = Date.now()\n }\n /** @see eventLog */\n function eventLogLess(this: any, event: Thing | null | undefined) {\n if ((event && (event as any).type) !== prevType || Date.now() - (prevTime ?? 0) > 1000) {\n eventLog(event)\n }\n }\n return { eventLog, eventLogLess }\n}\n\n/**\n * 值可能是Ref的对象\n * 可以用来给{@link reactive}的参数做类型约束\n * */\nexport type MaybeWrapRefs<T> = {\n [P in keyof T]: Ref<T[P]> | T[P] | ComputedRef<T[P]>\n}\n","import { defineComponent } from 'vue'\nimport type { AbstractMap } from '../map/map/map'\nimport { callHook, createEmptyVNode } from '../utils/vue-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { useTgMapInner } from './map-hooks'\n\nexport const MIXIN_MAP_NAME = '$map'\nexport const MIXIN_HOOK_CREATE = 'onCreate'\nexport const MIXIN_HOOK_DESTROY = 'onDestroy'\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n /** 混合了MapMixin的Vue才会有该属性 */\n [MIXIN_MAP_NAME]: AbstractMap,\n /** 混合了MapMixin的Vue才会有该属性, 会依次调用onDestroy + onCreate, 你应该在这两个hook中分别实现 移除 和 创建并添加 覆盖物的逻辑 */\n recreate: () => void,\n }\n\n interface ComponentCustomOptions {\n [MIXIN_HOOK_CREATE]?(): void\n [MIXIN_HOOK_DESTROY]?(): void\n }\n}\n\n/** @deprecated 使用{@link useTgMapInner}替代 */\nconst MapMixin = defineComponent({\n inject: [MIXIN_MAP_NAME],\n mounted() {\n // children先执行, parent后执行\n // parent中可以读取到this.$children, 参见: TgMarkerClusterer\n callHook(this, MIXIN_HOOK_CREATE)\n },\n beforeUnmount() {\n // parent先执行, children后执行\n callHook(this, MIXIN_HOOK_DESTROY)\n },\n methods: {\n recreate() {\n callHook(this, MIXIN_HOOK_DESTROY)\n callHook(this, MIXIN_HOOK_CREATE)\n },\n },\n render() {\n return createEmptyVNode()\n },\n})\n\nexport default MapMixin\n","<template>\n <div class=\"tg-map\" v-bind=\"attrs.binds\">\n <div\n ref=\"map\"\n :class=\"{\n 'tg-map__map': true,\n [`tg-map__map--hide-logo-${type}`]: hideLogo,\n }\"\n />\n <div v-if=\"false\" style=\"position:absolute;right:0px;top:0px;\">\n props:{{ propsJson }}\n </div>\n <template v-if=\"map\">\n <slot />\n </template>\n <slot name=\"overlay\" />\n </div>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent, markRaw, watch, type PropType } from 'vue'\nimport { bindEvents } from '../map/event'\nimport { LatLng } from '../map/lat-lng'\nimport { TgMapFactory, TgMapType } from '../map/map-factory'\nimport { loadCachedMap } from '../map/map-loader'\nimport type { AbstractMap, AbstractMapEventMap } from '../map/map/map'\nimport { GestureHandlingOptions, InfoWindowModeValues, type MapOptions, type MapStyle } from '../map/map/map-options'\nimport { BuildInMapTypeId, MapType } from '../map/map/map-type'\nimport { typed, unwrapStringEnumValue, type StringEnumValue, type WrapStringEnumValue } from '../utils/mapped-types'\nimport { Objects } from '../utils/objects'\nimport { eventProp, optionalProp, requiredProp, stringEnumProp, stringUnionPropFromValues, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../utils/vue-utils'\nimport { MIXIN_MAP_NAME } from './map-mixin'\n\ntype TgMapEmits = {\n load: AbstractMap,\n error: any,\n 'update:center': LatLng,\n 'update:current-center': LatLng,\n 'update:zoom': number,\n 'update:map-type': MapType,\n 'update:map-type-id': string,\n 'update:last-center': LatLng,\n}\n\nexport default defineComponent({\n name: 'tg-map',\n provide() {\n return {\n [MIXIN_MAP_NAME]: computed(() => this.map),\n }\n },\n inheritAttrs: false,\n props: {\n /** type没做响应式, 但外部可以把type作为tg-map的key, 让type修改时完全重建tg-map */\n type: stringEnumProp(TgMapType, TgMapType.google),\n /**\n * 当对该属性使用双向绑定时, 改变center将触发update:center又反过来触发center改变, 最终导致无限循环...\n * 当前通过setCenter()时判断center是否有改变来避免该问题, 但为了避免可能存在的问题, 另外设计了如下机制:\n * - :center-sync-delay=\"300\": 延时同步center, 防止center的值更新过快\n * - :current-center.sync=\"currentCenter\": 实时获取center的值\n * - :last-center.sync=\"center\": 获取tg-map销毁时的最后的center的值, 使用这种方式可以做到type切换时保留中心点位置\n * @see AbstractMapEventMap.center-changed\n * */\n center: requiredProp(LatLng),\n /**\n * 同步center的延时\n * @default 300\n * @see center\n */\n centerSyncDelay: optionalProp(Number, 300),\n /**\n * 仅用来获取center的值, 需要设置center的值请使用`center`属性\n * @see center\n * */\n currentCenter: optionalProp(LatLng),\n /**\n * 仅用于获取tg-map销毁时的最后的center的值\n * @see center\n */\n lastCenter: optionalProp(LatLng),\n zoom: requiredProp(Number),\n /**\n * 该属性不会响应式更新, 要让它立即生效, 请参考{@link file://./../views/map/InfoDemo.vue#L3}\n * @see MapOptions.infoWindowMode\n */\n infoWindowMode: stringUnionPropFromValues(InfoWindowModeValues),\n gestureHandling: stringEnumProp(GestureHandlingOptions),\n minZoom: optionalProp(Number),\n maxZoom: optionalProp(Number),\n mapStyle: optionalProp(Object as PropType<MapStyle>),\n mapTypeId: stringEnumProp(BuildInMapTypeId),\n /** 地图类型对象, 优先级比mapTypeId高 */\n mapType: optionalProp(Object),\n hideLogo: optionalProp(Boolean),\n onLoad: eventProp(),\n 'onUpdate:center': eventProp(),\n 'onUpdate:current-center': eventProp(),\n 'onUpdate:last-center': eventProp(),\n 'onUpdate:map-type': eventProp(),\n 'onUpdate:map-type-id': eventProp(),\n 'onUpdate:zoom': eventProp(),\n onError: eventProp(),\n } satisfies Props<WrapStringEnumValue<Omit<MapOptions, 'buildInMapTypeId'>, {\n gestureHandling: typeof GestureHandlingOptions,\n }> & {\n type: StringEnumValue<typeof TgMapType>,\n currentCenter?: LatLng,\n lastCenter?: LatLng,\n centerSyncDelay: number,\n mapTypeId?: StringEnumValue<typeof BuildInMapTypeId>,\n mapType?: MapType\n hideLogo?: boolean\n }> & EventProps<TgMapEmits>,\n /** 声明事件的类型信息, 详见: {@link splitAttrs} */\n emits: undefined as any as EventEmits<AbstractMapEventMap & TgMapEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n centerSyncTimeoutId: undefined as TimeoutId | undefined,\n }\n },\n data() {\n return {\n map: typed<AbstractMap>(),\n isDestroyed: false,\n }\n },\n computed: {\n propsJson() {\n return Objects.toJsonSafely(this.$props)\n },\n },\n watch: {\n gestureHandling(value?: StringEnumValue<typeof GestureHandlingOptions>) {\n if (value) {\n this.map?.setGestureHandling(unwrapStringEnumValue(value, GestureHandlingOptions))\n }\n },\n minZoom(value) {\n this.map?.setMinZoom(value)\n },\n maxZoom(value) {\n this.map?.setMaxZoom(value)\n },\n mapStyle(value?: MapStyle) {\n this.map?.setMapStyle(value)\n },\n mapTypeId(value?: StringEnumValue<typeof BuildInMapTypeId>) {\n if (value) {\n this.map?.setBuildInMapTypeId(unwrapStringEnumValue(value, BuildInMapTypeId))\n }\n },\n mapType(value?: MapType) {\n this.map?.setMapType(value ?? MapType.NORMAL)\n },\n },\n async mounted() {\n // type的值需要局部化, 防止外部修改\n const type = unwrapStringEnumValue(this.type, TgMapType)\n try {\n await loadCachedMap(type)\n } catch (e) {\n this.$emit('error', e)\n return\n }\n if (this.isDestroyed) {\n console.warn(`tg-map(type=${type})已销毁, 不需要继续执行`)\n return\n }\n // options不要直接传this, 因为createMap方法内部会修改options...\n const map = TgMapFactory.createMap(type, this.$refs.map as HTMLElement, /* options: */{\n center: this.center,\n zoom: this.zoom,\n infoWindowMode: this.infoWindowMode,\n gestureHandling: unwrapStringEnumValue(this.gestureHandling, GestureHandlingOptions),\n minZoom: this.minZoom,\n maxZoom: this.maxZoom,\n mapStyle: this.mapStyle,\n buildInMapTypeId: unwrapStringEnumValue(this.mapTypeId, BuildInMapTypeId),\n })\n // map是复杂对象, 不需要转换成响应式对象\n this.map = markRaw(map)\n if (this.mapType) {\n map.setMapType(this.mapType)\n }\n\n // 未声明ready事件, 所以需要从attrs.listeners中查找是否存在\n if ('ready' in this.attrs.listeners) {\n console.error('地图载入完成的事件已经从ready改为了load, 请手动修改')\n }\n bindEvents(this.attrs.listeners, map, /* excludes: */['load'])\n // 需要先发送load(载入完成)事件, 保证外部能够获取到map对象\n this.$emit('load', map)\n\n // Baidu地图的setZoom/Center是区分顺序的, 若同时修改它们, 必须先setZoom再setCenter, 否则中心点会出现偏移\n // Google地图没这个问题\n // 为了规避该问题, 同时监听它们两个, 并按顺序执行set方法\n watch([\n () => this.zoom,\n () => this.center, //\n ], ([zoom, center], [oldZoom, oldCenter]) => {\n if (zoom !== oldZoom) {\n import.meta.env.DEV && console.debug('<tg-map> setZoom', center)\n map.setZoom(zoom)\n }\n if (center !== oldCenter) {\n const currentCenter = map.getCenter()\n if (!currentCenter.equals(center)) {\n import.meta.env.DEV && console.debug('<tg-map> setCenter', center)\n map.setCenter(center)\n }\n }\n })\n\n // 处理v-model(双向绑定)\n if ('update:center' in this.attrs.listenerProps) {\n const updateCenter = () => this.$emit('update:center', map.getCenter())\n map.addEventListener('center-changed', () => {\n if (this.centerSyncDelay > 0) {\n clearTimeout(this.centerSyncTimeoutId)\n this.centerSyncTimeoutId = setTimeout(updateCenter, this.centerSyncDelay)\n } else {\n updateCenter()\n }\n })\n }\n if ('update:current-center' in this.attrs.listenerProps) {\n // 初始值也得emit出去\n this.$emit('update:current-center', this.center)\n map.addEventListener('center-changed', () => {\n this.$emit('update:current-center', map.getCenter())\n })\n }\n if ('update:zoom' in this.attrs.listenerProps) {\n map.addEventListener('zoom-changed', () => {\n this.$emit('update:zoom', map.getZoom())\n })\n }\n const isUpdateMapType = 'update:map-type' in this.attrs.listenerProps\n const isUpdateMapTypeId = 'update:map-type-id' in this.attrs.listenerProps\n if (isUpdateMapType || isUpdateMapTypeId) {\n map.addEventListener('map-type-changed', () => {\n const mapType = map.getMapType()\n isUpdateMapType && this.$emit('update:map-type', mapType)\n isUpdateMapTypeId && this.$emit('update:map-type-id', mapType.id)\n })\n }\n },\n unmounted() {\n this.isDestroyed = true\n if (this.map) {\n if ('update:last-center' in this.attrs.listenerProps) {\n this.$emit('update:last-center', this.map.getCenter())\n }\n if ('update:center' in this.attrs.listenerProps) {\n clearTimeout(this.centerSyncTimeoutId)\n // 最终的值一定要更新出去, 保证切换地图时center的位置能够保持\n this.$emit('update:center', this.map.getCenter())\n }\n }\n },\n methods: {\n },\n})\n</script>\n\n<style lang=\"scss\">\n.tg-map {\n height: 100%;\n position: relative;\n\n &__map {\n width: 100%;\n height: 100%;\n\n &--hide-logo-google {\n .gm-style {\n // 隐藏logo\n a[target=\"_blank\"]:has(>div>img) {\n display: none !important;\n }\n\n // 隐藏右下角的Keyboard shortcuts/Terms of Use等\n &>div:last-child>div:last-child>div {\n display: none;\n }\n }\n }\n\n &--hide-logo-baidu {\n // 隐藏logo\n div.anchorBL>a[target=\"_blank\"]>img {\n display: none;\n }\n\n // 隐藏左下角的版权信息\n div.BMap_cpyCtrl {\n display: none;\n }\n }\n }\n}\n</style>\n","/* 将字符串或数字转换成尺寸字符串 */\nexport function dimen(value: string | number | null | undefined): string | undefined {\n if (value == null) {\n return undefined\n }\n let num: number\n if (typeof value === 'string') {\n num = +value // 使用+, 让字符转数字\n if (Number.isNaN(num)) {\n return value\n }\n } else {\n num = value\n }\n return `${num}px`\n}\n","<template>\n <div :class=\"$options.name\" :style=\"{ left: dimen(left), top:dimen(topValue), right:dimen(right), bottom:dimen(bottom)}\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { dimen } from '../utils/formatter'\n/** TgMap上的Widget, 只是对绝对布局进行简单的封装 */\nexport default defineComponent({\n name: 'tg-map-widget',\n props: {\n left: {\n type: [Number, String],\n default: null,\n },\n top: {\n type: [Number, String],\n default: null,\n },\n right: {\n type: [Number, String],\n default: null,\n },\n bottom: {\n type: [Number, String],\n default: null,\n },\n },\n computed: {\n topValue() {\n // 防止默认看不到组件\n return this.top == null && this.bottom == null ? 0 : this.top\n },\n },\n methods: {\n dimen,\n },\n})\n</script>\n<style lang=\"scss\">\n.tg-map-widget {\n position: absolute;\n}\n</style>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { unwrapStringEnumValue, lateinit, safeAsComponent, type StringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport { ControlPosition, CustomControl } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nimport { TgMap } from '..'\nexport default defineComponent({\n name: 'tg-custom-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<{\n position: StringEnumValue<typeof ControlPosition>\n }>,\n setup() {\n return {\n control: lateinit<CustomControl>(),\n }\n },\n watch: {\n position() {\n this.recreate()\n },\n },\n onCreate() {\n if (!safeAsComponent(this.$parent, TgMap)) {\n console.warn('请将tg-custom-control放到tg-map中')\n }\n const { $el } = this\n const C = class extends CustomControl {\n onCreateElement() {\n return $el as HTMLElement\n }\n }\n this.control = new C(unwrapStringEnumValue(this.position, ControlPosition))\n this.$map.addCustomControl(this.control)\n },\n onDestroy() {\n this.$map.removeCustomControl(this.control)\n },\n})\n</script>\n<style lang=\"scss\">\n// 当作为tg-map的直接child时不显示\n.tg-map > .tg-custom-control {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { type MapTypeControlOptions, MapTypeControlType, type MapTypeControl } from '../../map/map/controls/map-type.control'\nimport { unwrapStringEnumValue, lateinit, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp, optionalProp } from '../../utils/vue-utils'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n name: 'tg-map-type-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.TOP_LEFT),\n type: stringEnumProp(MapTypeControlType),\n mapTypes: optionalProp(Array as any),\n } satisfies Props<WrapStringEnumValue<MapTypeControlOptions, {\n position: typeof ControlPosition,\n type: typeof MapTypeControlType\n }>>,\n setup() {\n return {\n control: lateinit<MapTypeControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n type() {\n this.recreate()\n },\n mapTypes: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n },\n onCreate() {\n this.control = this.$map.createMapTypeControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { lateinit, type WrapStringEnumValue, unwrapStringEnumValue } from '../../utils/mapped-types'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport MapMixin from '../map-mixin'\nimport type { ScaleControlOptions, ScaleControl } from '../../map/map/controls/scale.control'\nexport default defineComponent({\n name: 'tg-scale-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.BOTTOM_RIGHT),\n } satisfies Props<WrapStringEnumValue<ScaleControlOptions, {\n position: typeof ControlPosition\n }>>,\n setup() {\n return {\n control: lateinit<ScaleControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n },\n onCreate() {\n this.control = this.$map.createScaleControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","import { getCurrentInstance } from 'vue'\nimport { path } from './strings'\n\n/** 获取当前组件的名字 */\nexport function useComponentName(): string | undefined {\n const type = getCurrentInstance()?.type\n let name = type?.name ?? type?.__name\n if (!name) {\n const file = type?.__file\n if (file) {\n name = path.basename(file, '.vue')\n }\n }\n return name\n}\n","import { inject, onBeforeUnmount, onMounted, type Ref } from 'vue'\nimport { MIXIN_HOOK_CREATE, throwError, type AbstractMap } from '.'\nimport { useComponentName } from '../utils/hooks'\nimport { MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\n/** 作为Vue3下, `MapMixin`的替代 */\nexport function useTgMapInner() {\n const mapRef = inject<Ref<AbstractMap | undefined>>(MIXIN_MAP_NAME)\n let onCreate:VoidFunction|undefined\n let onDestroy:VoidFunction|undefined\n if (mapRef == null) throwError(`<${useComponentName() || 'unknown'}>必须作为<tg-map>的子代组件`)\n\n return {\n mapRef,\n /** 读取map对象, 只要放在<tg-map>里面的组件(除#overlay插槽外)都能够立即读取到map对象 */\n get map() {\n return mapRef.value ?? throwError('map尚未初始化')\n },\n /** 地图元素创建回调 */\n [MIXIN_HOOK_CREATE](hook: VoidFunction) {\n onMounted(hook)\n if (onCreate) throwError(`${MIXIN_HOOK_CREATE}只能调用一次`)\n onCreate = hook\n },\n /** 地图元素销毁回调 */\n [MIXIN_HOOK_DESTROY](hook: VoidFunction) {\n onBeforeUnmount(hook)\n if (onDestroy) throwError(`${MIXIN_HOOK_DESTROY}只能调用一次`)\n onDestroy = hook\n },\n /** 重新创建地图元素 */\n recreate() {\n onDestroy?.()\n onCreate?.()\n },\n }\n}\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport type { StreetViewControl, StreetViewControlOptions } from '../../map/map/controls/street-view.control'\nimport { lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n/**\n * 街景控件, 当前只有google支持\n * */\nexport default defineComponent({\n name: 'tg-street-view-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<StreetViewControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<StreetViewControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner()\n\n onCreate(() => {\n control = map.createStreetViewControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { ControlPosition } from '../../map/map/controls/control'\nimport type { ZoomControl, ZoomControlOptions } from '../../map/map/controls/zoom.control'\nimport { lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\nexport default defineComponent({\n name: 'tg-zoom-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<ZoomControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<ZoomControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner()\n\n onCreate(() => {\n control = map.createZoomControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, watch } from 'vue'\nimport { Heatmap, type HeatmapOptions } from '../../map/map/extra/heatmap'\nimport { lateinit } from '../../utils/mapped-types'\nimport { createEmptyVNode, optionalProp, requiredProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n name: 'tg-heatmap',\n props: {\n maxIntensity: optionalProp(Number),\n gradient: optionalProp(Object),\n opacity: optionalProp(Number),\n radius: optionalProp(Number),\n data: requiredProp(Array as any),\n } satisfies Props<HeatmapOptions>,\n setup(props) {\n const { map, onCreate, onDestroy } = useTgMapInner()\n let heatmap = lateinit<Heatmap>()\n\n onCreate(() => {\n heatmap = map.createHeatmap(props)\n })\n onDestroy(() => {\n heatmap.remove()\n })\n\n watch(() => props.data, (v) => heatmap.setData(v))\n watch(\n [() => props.maxIntensity, () => props.gradient, () => props.opacity, () => props.radius],\n () => heatmap.setOptions(props),\n )\n\n return createEmptyVNode\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nimport type { MarkerClusterer, MarkerClustererOptions } from '../../map/map/extra/marker-clusterer'\nimport { typed, lateinit } from '../../utils/mapped-types'\nimport { type Props, optionalProp } from '../../utils/vue-utils'\nimport type { MarkerOverlay } from '../../map/map/overlay/marker'\nimport { Arrays } from '../../utils/arrays'\nconst TgMarkerClusterer = defineComponent({\n name: 'tg-marker-clusterer',\n mixins: [MapMixin],\n // markers从this.$children中读取, 故需要省略(Omit)\n props: {\n gridSize: optionalProp(Number),\n maxZoom: optionalProp(Number),\n minClusterSize: optionalProp(Number),\n averageCenter: optionalProp(Boolean),\n styles: optionalProp(Array as any),\n stylesIndexCalculator: optionalProp(Function as any),\n zIndex: optionalProp(Number),\n } satisfies Props<Omit<MarkerClustererOptions, 'markers'>>,\n setup() {\n return {\n clusterer: lateinit<MarkerClusterer>(),\n markers: typed<MarkerOverlay[]>([]),\n }\n },\n watch: {\n gridSize() {\n this.recreate()\n },\n maxZoom() {\n this.recreate()\n },\n minClusterSize() {\n this.recreate()\n },\n averageCenter() {\n this.recreate()\n },\n styles: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n stylesIndexCalculator() {\n this.recreate()\n },\n zIndex() {\n this.recreate()\n },\n },\n onCreate() {\n // console.log('TgMarkerClusterer.onCreate', this.markers)\n this.clusterer = this.$map.createMarkerClusterer(this)\n },\n onDestroy() {\n this.clusterer.clearMarkers()\n },\n methods: {\n /** TgMarker有可能在该组件未初始化之前调用, 需要通过该方法判断 */\n isInitiated(): boolean {\n return this.clusterer != null\n },\n onAddMarker(marker: MarkerOverlay) {\n this.markers.push(marker)\n if (this.isInitiated()) {\n // TODO: 优化大量marker时的添加移除逻辑\n this.clusterer.addMarker(marker)\n }\n },\n onRemoveMarker(marker: MarkerOverlay) {\n if (this.isInitiated()) {\n this.clusterer.removeMarker(marker)\n }\n Arrays.remove(this.markers, marker)\n },\n },\n})\n/** TgMarkerClusterer作为构造器, 创建的Vue实例类型 */\ntype TgMarkerClusterer = InstanceType<typeof TgMarkerClusterer>\nexport default TgMarkerClusterer\n</script>\n","<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { lateinit } from '../../utils/mapped-types'\nimport MapMixin from '../map-mixin'\nimport { TrafficLayer } from '../../map/map/map-type'\nexport default defineComponent({\n name: 'tg-traffic-layer',\n mixins: [MapMixin],\n // 请直接使用v-if来控制它的显隐\n // 没有属性时, 写`{}`类型推断会有问题, 故注释掉\n // props: {} satisfies Props<{}>,\n setup() {\n return {\n layer: lateinit<TrafficLayer>(),\n }\n },\n watch: {\n\n },\n onCreate() {\n this.layer = new TrafficLayer()\n this.$map.addLayer(this.layer)\n },\n onDestroy() {\n this.$map.removeLayer(this.layer)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { CircleEventMap, CircleOptions, CircleOverlay } from '../../map/map/overlay/circle'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgCircleEmits = {\n 'update:center': LatLng,\n 'update:radius': number,\n}\nexport default defineComponent({\n name: 'tg-circle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n center: requiredProp(LatLng),\n radius: requiredProp(Number),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:center': eventProp(),\n 'onUpdate:radius': eventProp(),\n } satisfies Props<CircleOptions> & EventProps<TgCircleEmits>,\n emits: undefined as any as EventEmits<CircleEventMap & TgCircleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<CircleOverlay>(),\n emittedRadius: undefined as number | undefined,\n emittedCenter: undefined as LatLng | undefined,\n }\n },\n watch: {\n center(value) {\n if (this.emittedCenter != null) {\n const center = this.emittedCenter\n this.emittedCenter = undefined\n if (center === toRaw(value)) {\n // 防止emit出的center被设置回来\n return\n }\n }\n this.overlay.setCenter(value)\n },\n radius(value) {\n if (this.emittedRadius != null) {\n const radius = this.emittedRadius\n this.emittedRadius = undefined\n if (radius === value) {\n // 防止emit出的radius被设置回来\n return\n }\n }\n this.overlay.setRadius(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createCircle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:center' in this.attrs.listenerProps) {\n this.overlay.addEventListener('center-changed', () => {\n this.$emit('update:center', this.emittedCenter = this.overlay.getCenter())\n })\n }\n if ('update:radius' in this.attrs.listenerProps) {\n this.overlay.addEventListener('radius-changed', () => {\n this.$emit('update:radius', this.emittedRadius = this.overlay.getRadius())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"$attrs\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nimport { type Props, requiredProp, stringEnumProp } from '../../utils/vue-utils'\nimport { lateinit, type WrapStringEnumValue, unwrapStringEnumValue } from '../../utils/mapped-types'\nimport { LatLng } from '../../map/lat-lng'\nimport { type ElementOverlayOptions, MapPane, ElementOverlay, type OverlayProjection } from '../../map/map/overlay/element-overlay'\nimport type { AbstractMap } from '../../map/map/map'\n\n/** ElementOverlay的简单实现 */\nclass SimpleElementOverlay extends ElementOverlay {\n constructor(\n map: AbstractMap,\n options: ElementOverlayOptions,\n public content: HTMLElement,\n private position: LatLng,\n ) {\n super(map, options)\n }\n protected onCreate(): HTMLElement {\n return this.content\n }\n protected onDraw(projection: OverlayProjection): void {\n const point = projection.fromLatLngToOverlayPoint(this.position)\n this.content.style.left = point.x + 'px'\n this.content.style.top = point.y + 'px'\n }\n setPosition(position: LatLng) {\n this.position = position\n this.draw()\n }\n}\n\nconst TgElementOverlay = defineComponent({\n name: 'tg-element-overlay',\n mixins: [MapMixin],\n props: {\n mapPane: stringEnumProp(MapPane, MapPane.overlayMouseTarget),\n position: requiredProp(LatLng),\n } satisfies Props<WrapStringEnumValue<ElementOverlayOptions, {\n mapPane: typeof MapPane,\n }> & {position: LatLng}>,\n setup() {\n return {\n overlay: lateinit<SimpleElementOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n },\n onCreate() {\n this.overlay = new SimpleElementOverlay(this.$map, unwrapStringEnumValue(this), this.content(), this.position)\n this.$map.addElementOverlay(this.overlay)\n },\n onDestroy() {\n this.$map.removeElementOverlay(this.overlay)\n },\n})\ntype TgElementOverlay = InstanceType<typeof TgElementOverlay>\nexport default TgElementOverlay\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-element-overlay {\n display: none;\n}\n.tg-map__map .tg-element-overlay {\n display: block;\n}\n</style>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { UnionIcon } from '../../map/map/overlay/icon'\nimport { BaiduMarker, type MarkerEventMap, type MarkerOptions, type MarkerOverlay } from '../../map/map/overlay/marker'\nimport { lateinit, safeAsComponent, typed } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport TgMarkerClusterer from '../extra/TgMarkerClusterer.vue'\nimport MapMixin from '../map-mixin'\nimport type TgInfoBox from './TgInfoBox.vue'\nimport type TgInfoWindow from './TgInfoWindow.vue'\nimport type TgLabel from './TgLabel.vue'\n\ntype TgMarkerEmits = {\n 'update:position': LatLng,\n}\n\nconst TgMarker = defineComponent({\n name: 'tg-marker',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n position: requiredProp(LatLng),\n title: optionalProp(String),\n icon: optionalProp(Object as PropType<UnionIcon>),\n clickable: optionalProp(Boolean),\n draggable: optionalProp(Boolean),\n crossOnDrag: optionalProp(Boolean),\n cursor: optionalProp(String),\n zIndex: optionalProp(Number),\n visible: optionalProp(Boolean),\n normalizePositionForBaidu: optionalProp(Boolean),\n /**\n * 是否自动添加到TgMarkerClusterer中去\n * @default true\n */\n autoAddToClusterer: optionalProp(Boolean, true),\n 'onUpdate:position': eventProp(),\n } satisfies Props<MarkerOptions & {\n autoAddToClusterer?: boolean\n }> & EventProps<TgMarkerEmits>,\n emits: undefined as any as EventEmits<MarkerEventMap & TgMarkerEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n marker: lateinit<MarkerOverlay>(),\n label: typed<TgLabel>(),\n info: typed<TgInfo>(),\n emittedPosition: undefined as LatLng | undefined,\n autoAddToClustererWhenCreate: props.autoAddToClusterer,\n }\n },\n watch: {\n position(value: LatLng) {\n if (this.emittedPosition != null) {\n const position = this.emittedPosition\n this.emittedPosition = undefined\n if (position === toRaw(value)) {\n // 防止emit出的值被设置回来\n return\n }\n }\n this.marker.setPosition(value)\n },\n title(value: string) {\n this.marker.setTitle(value)\n },\n icon(value?: UnionIcon) {\n if (value) {\n this.marker.setIcon(value)\n } else {\n this.recreate()\n }\n },\n clickable(value: boolean) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // baidu不支持setClickable(), 故只能recreate()\n } else {\n this.marker.setClickable(value)\n }\n },\n draggable(value: boolean) {\n this.marker.setDraggable(value)\n },\n crossOnDrag() {\n this.recreate()\n },\n cursor() {\n this.recreate()\n },\n zIndex(value?: number) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // 当前版本, baidu调用setZIndex()无效\n } else {\n this.marker.setZIndex(value)\n }\n },\n visible(value: boolean) {\n this.marker.setVisible(value)\n },\n normalizePositionForBaidu() {\n this.recreate()\n },\n autoAddToClusterer() {\n this.recreate()\n },\n },\n onCreate() {\n // 结构化类型, this包含MarkerOptions的所有属性, 故可以直接传进去\n this.marker = this.$map.createMarker(this)\n if (this.label) {\n this.marker.setLabel(this.label.overlay)\n }\n\n if (this.$clusterer() && this.autoAddToClusterer) {\n this.$clusterer()!.onAddMarker(this.marker)\n } else {\n this.$map.addOverlay(this.marker)\n }\n // 保存创建时autoAddToClusterer的值, 销毁时需要使用它\n this.autoAddToClustererWhenCreate = this.autoAddToClusterer\n\n // baidu, 只有marker被添加到地图之后, 才能在它上面打开infoWindow\n // infoBox似乎没有这个限制, 但目前不区分infoWindow和infoBox, 故统一放在这里处理\n if (this.info) {\n this.info.show && this.info.overlay.open(this.marker)\n }\n\n bindEvents(this.attrs.listeners, this.marker)\n\n if ('update:position' in this.attrs.listenerProps) {\n this.marker.addEventListener('dragend', (event) => {\n this.$emit('update:position', this.emittedPosition = event.position)\n })\n }\n },\n onDestroy() {\n if (this.$clusterer() && this.autoAddToClustererWhenCreate) {\n this.$clusterer()!.onRemoveMarker(this.marker)\n } else {\n this.$map.removeOverlay(this.marker)\n }\n },\n methods: {\n $clusterer(): TgMarkerClusterer | undefined {\n return safeAsComponent(this.$parent, TgMarkerClusterer)\n },\n onAddLabel(label: TgLabel) {\n this.label = label\n // onAdd方法可能在创建this.marker前调用, 需要判断下\n if (this.marker) {\n this.marker.setLabel(label.overlay)\n }\n },\n onRemoveLabel(_label: TgLabel) {\n this.marker.setLabel(undefined)\n this.label = undefined\n },\n onAddInfo(info: TgInfo) {\n this.info = info\n // @see {@link onAddLabel}\n if (this.marker) {\n info.show && info.overlay.open(this.marker)\n }\n },\n onRemoveInfo(info: TgInfo) {\n info.overlay.close()\n this.info = undefined\n },\n onInfoShowChanged(info: TgInfo, isShow: boolean) {\n isShow ? info.overlay.open(this.marker) : info.overlay.close()\n },\n },\n})\ntype TgMarker = InstanceType<typeof TgMarker>\nexport default TgMarker\n\nexport type TgInfo = TgInfoWindow | TgInfoBox\n\nexport type TgMarkerPublicInstance = {\n marker: MarkerOverlay\n\n onAddInfo(info: TgInfo): void\n onRemoveInfo(info: TgInfo): void\n onInfoShowChanged(info: TgInfo, isShow: boolean): void\n\n onAddLabel(label: TgLabel): void\n onRemoveLabel(label: TgLabel): void\n}\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { InfoBoxOptions, InfoBoxOverlay } from '../../map/map/overlay/info-box'\nimport type { MarkerOverlay } from '../../map/map/overlay/marker'\nimport { findAncestorComponentByType, lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\ntype TgInfoBoxEmits = {\n 'update:show': boolean\n}\nconst TgInfoBox = defineComponent({\n name: 'tg-info-box',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n maxWidth: optionalProp(Number),\n borderClass: optionalProp(String),\n zIndex: optionalProp(Number),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoBoxOptions, 'content'> & {\n show: boolean\n }> & EventProps<TgInfoBoxEmits>,\n emits: undefined as any as EventEmits<TgInfoBoxEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoBoxOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n offset() {\n this.recreate()\n },\n maxWidth(value) {\n this.overlay.setMaxWidth(value)\n },\n borderClass() {\n this.recreate()\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoBox(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n if ('update:show' in this.attrs.listenerProps) {\n this.overlay.addEventListener('closeclick', () => {\n this.$emit('update:show', false)\n })\n }\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n methods: {\n getOptions(): InfoBoxOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n maxWidth: this.maxWidth,\n borderClass: this.borderClass,\n }\n },\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n open(marker?: MarkerOverlay) {\n this.overlay.open(marker)\n },\n close() {\n this.overlay.close()\n },\n },\n})\ntype TgInfoBox = InstanceType<typeof TgInfoBox>\nexport default TgInfoBox\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-info-box {\n display: none;\n}\n\n.tg-map__map .tg-info-box {\n display: block;\n}\n</style>\n","<template>\n <div v-show=\"show\" :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { InfoWindowEventMap, InfoWindowOptions, InfoWindowOverlay } from '../../map/map/overlay/info-window'\nimport { findAncestorComponentByType, lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\ntype TgInfoWindowEmits= {\n 'update:show': boolean\n}\nconst TgInfoWindow = defineComponent({\n name: 'tg-info-window',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n maxWidth: optionalProp(Number),\n offset: optionalProp(Object),\n disableAutoPan: optionalProp(Boolean),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoWindowOptions, 'content'> & {show: boolean}> & EventProps<TgInfoWindowEmits>,\n emits: undefined as any as EventEmits<InfoWindowEventMap & TgInfoWindowEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoWindowOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n maxWidth() {\n this.recreate()\n },\n offset() {\n this.recreate()\n },\n disableAutoPan() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): InfoWindowOptions {\n return {\n content: this.content(),\n position: this.position,\n maxWidth: this.maxWidth,\n offset: this.offset,\n disableAutoPan: this.disableAutoPan,\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoWindow(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n // 监听open/close\n this.overlay.addEventListener('open', () => {\n this.$emit('update:show', true)\n })\n this.overlay.addEventListener('close', () => {\n this.$emit('update:show', false)\n })\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n})\ntype TgInfoWindow = InstanceType<typeof TgInfoWindow>\nexport default TgInfoWindow\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport { MapPane } from '../../map/map/overlay/element-overlay'\nimport type { LabelEventMap, LabelOptions, LabelOverlay } from '../../map/map/overlay/label'\nimport type { Marker } from '../../map/map/overlay/marker'\nimport { findAncestorComponentByType, lateinit, unwrapStringEnumValue, type WrapStringEnumValue } from '../../utils/mapped-types'\nimport { optionalProp, stringEnumProp, useSplittedAttrs, type EventEmits, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\nconst TgLabel = defineComponent({\n name: 'tg-label',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n zIndex: optionalProp(Number),\n mapPane: stringEnumProp(MapPane),\n } satisfies Props<WrapStringEnumValue<\n Omit<LabelOptions, 'content'>,\n { mapPane: typeof MapPane }\n >>,\n emits: undefined as any as EventEmits<LabelEventMap>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs),\n overlay: lateinit<LabelOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n offset(value) {\n this.overlay.setOffset(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n marker(): Marker | undefined {\n return this.$marker()?.marker\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): LabelOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n mapPane: unwrapStringEnumValue(this.mapPane, MapPane),\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createLabel(this.getOptions())\n // 若父节点为marker, 则交由marker管理\n if (this.$marker()) {\n this.$marker()!.onAddLabel(this)\n } else {\n this.$map.addOverlay(this.overlay)\n }\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveLabel(this)\n } else {\n this.$map.removeOverlay(this.overlay)\n }\n },\n})\ntype TgLabel = InstanceType<typeof TgLabel>\nexport default TgLabel\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-label {\n display: none;\n}\n.tg-map__map .tg-label {\n display: block;\n}\n</style>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport type { LatLng } from '../../map/lat-lng'\nimport type { PolygonEventMap, PolygonOptions, PolygonOverlay } from '../../map/map/overlay/polygon'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgPolygonEmits = {\n 'update:paths': LatLng[][],\n}\nexport default defineComponent({\n name: 'tg-polygon',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n paths: requiredProp(Array as PropType<LatLng[][]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:paths': eventProp(),\n } satisfies Props<PolygonOptions> & EventProps<TgPolygonEmits>,\n emits: undefined as any as EventEmits<PolygonEventMap & TgPolygonEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolygonOverlay>(),\n emittedPaths: undefined as LatLng[][] | undefined,\n }\n },\n watch: {\n paths: {\n handler(value: LatLng[][]) {\n if (this.emittedPaths != null) {\n const paths = this.emittedPaths\n this.emittedPaths = undefined\n // 由于paths数组绝大多数时候长度都是1, 故这里可以浅层比较它\n if (paths.length === value.length && paths.every((v, i) => v === toRaw(value[i]))) {\n // 防止emit出的paths被设置回来\n return\n }\n }\n this.overlay.setPaths(value)\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolygon(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:paths' in this.attrs.listenerProps) {\n this.overlay.addEventListener('paths-edited', () => {\n this.$emit('update:paths', this.emittedPaths = this.overlay.getPaths())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport { LatLng } from '../../map/lat-lng'\nimport type { IconSequence } from '../../map/map/overlay/icon'\nimport type { PolylineEventMap, PolylineOptions, PolylineOverlay } from '../../map/map/overlay/polyline'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolylineEmits = {\n 'update:path': LatLng[],\n}\nexport default defineComponent({\n name: 'tg-polyline',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n path: requiredProp(Array as PropType<LatLng[]>),\n icons: optionalProp(Array as PropType<IconSequence[]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n 'onUpdate:path': eventProp(),\n } satisfies Props<PolylineOptions> & EventProps<TgPolylineEmits>,\n emits: undefined as any as EventEmits<PolylineEventMap & TgPolylineEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolylineOverlay>(),\n emittedPath: undefined as LatLng[] | undefined,\n }\n },\n watch: {\n path: {\n handler(value) {\n if (this.emittedPath != null) {\n const path = this.emittedPath\n this.emittedPath = undefined\n if (path === toRaw(value)) {\n // 防止emit出的path又被设置回去, 导致Google地图移动点后的撤销功能无效\n return\n }\n }\n this.overlay.setPath(value)\n },\n deep: true,\n },\n icons: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolyline(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n\n if ('update:path' in this.attrs.listenerProps) {\n this.overlay.addEventListener('path-edited', () => {\n this.$emit('update:path', this.emittedPath = this.overlay.getPath())\n })\n }\n },\n onDestroy() {\n this.overlay.remove()\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\nimport { bindEvents } from '../../map/event'\nimport type { LatLngBounds } from '../../map/lat-lng'\nimport type { RectangleEventMap, RectangleOptions, RectangleOverlay } from '../../map/map/overlay/rectangle'\nimport { lateinit } from '../../utils/mapped-types'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgRectangleEmits = {\n 'update:bounds': LatLngBounds,\n}\nexport default defineComponent({\n name: 'tg-rectangle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n bounds: requiredProp(Object as PropType<LatLngBounds>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:bounds': eventProp(),\n } satisfies Props<RectangleOptions> & EventProps<TgRectangleEmits>,\n emits: undefined as any as EventEmits<RectangleEventMap & TgRectangleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<RectangleOverlay>(),\n emittedBounds: undefined as LatLngBounds | undefined,\n }\n },\n watch: {\n bounds(value: LatLngBounds) {\n if (this.emittedBounds != null) {\n const bounds = this.emittedBounds\n this.emittedBounds = undefined\n // bounds很大可能会被重新创建, 故需要严格比较相等\n if (bounds.equals(value)) {\n // 防止emit出的值又被设置回来\n return\n }\n }\n this.overlay.setBounds(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createRectangle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if ('update:bounds' in this.attrs.listenerProps) {\n this.overlay.addEventListener('bounds-changed', () => {\n this.$emit('update:bounds', this.emittedBounds = this.overlay.getBounds())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","import { defineComponent, type App } from 'vue'\nimport { useComponentName } from './hooks'\nimport { noop } from './utils'\nimport type { VueHookName } from './vue-utils'\n\nconst DEFAULT_EXCLUDE_HOOK_NAMES: VueHookName[] = ['beforeUpdate', 'updated']\n\nexport interface LifecycleLogOptions {\n /** @default /^[A-Z]/ 匹配大写字母开头的组件名 */\n nameRegex?: RegExp\n /** @default true 开启log */\n enable?: boolean,\n /** @default 除 updated, beforeUpdate 外的所有hook */\n hookNames?: VueHookName[]\n}\n\nconst LifecycleLogPlugin = {\n install(app: App, options: LifecycleLogOptions = {}) {\n if (options.enable !== false) {\n const lifecycleLogMixin = defineComponent({\n beforeCreate() {\n const componentName = useComponentName() ?? ''\n const matched = (options.nameRegex || /^[A-Z]/).test(componentName)\n const __life = matched\n ? (hookName: VueHookName) => {\n if (options.hookNames) {\n if (options.hookNames.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n } else if (!DEFAULT_EXCLUDE_HOOK_NAMES.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n }\n : noop\n // `beforeCreate`触发在data/props/methods等组件状态初始化之前, 所以若`__life`方法直接在methods中实现, 在这里是调用不到的(\n __life('beforeCreate')\n ; (this as any).__life_impl = __life\n },\n created() {\n this.__life('created')\n },\n beforeMount() {\n this.__life('beforeMount')\n },\n mounted() {\n this.__life('mounted')\n },\n beforeUpdate() {\n this.__life('beforeUpdate')\n },\n updated() {\n this.__life('updated')\n },\n beforeUnmount() {\n this.__life('beforeUnmount')\n },\n unmounted() {\n this.__life('unmounted')\n },\n methods: {\n __life(hookName: VueHookName) {\n (this as any).__life_impl(hookName)\n },\n },\n onCreate() {\n this.__life('onCreate')\n },\n onDestroy() {\n this.__life('onDestroy')\n },\n })\n app.mixin(lifecycleLogMixin as any)\n }\n },\n}\nexport default LifecycleLogPlugin\n","import type { LatLngLiteral } from '../components'\n\nconst EARTH_RADIUS = 6378137.0\n\n/**\n * 度换成弧度\n *\n * @param d 度\n * @return 弧度\n */\nfunction getRad(d: number) {\n return (d * Math.PI) / 180.0\n}\n/**\n * 弧度换成度\n *\n * @param x 弧度\n * @return 度\n */\nfunction getDeg(x: number) {\n return (x * 180) / Math.PI\n}\n\n/**\n * 球面两点之间距离(米)\n * @param p1\n * @param p2\n */\nfunction getDistance(p1: LatLngLiteral, p2: LatLngLiteral) {\n if (p1.lat === p2.lat && p1.lng === p2.lng) {\n return 0\n }\n\n const f = getRad((p1.lat + p2.lat) / 2)\n const g = getRad((p1.lat - p2.lat) / 2)\n const l = getRad((p1.lng - p2.lng) / 2)\n let sg = Math.sin(g)\n let sl = Math.sin(l)\n let sf = Math.sin(f)\n\n const a = EARTH_RADIUS\n const fl = 1 / 298.257\n\n sg = sg * sg\n sl = sl * sl\n sf = sf * sf\n\n const s = sg * (1 - sl) + (1 - sf) * sl\n const c = (1 - sg) * (1 - sl) + sf * sl\n\n const w = Math.atan(Math.sqrt(s / c))\n const r = Math.sqrt(s * c) / w\n const d = 2 * w * a\n const h1 = (3 * r - 1) / 2 / c\n const h2 = (3 * r + 1) / 2 / s\n\n return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))\n}\n\n/**\n * 已知一点经纬度,方位角,距离求另一点\n * @param pt 点\n * @param angle 角度\n * @param dist 距离\n */\nexport function getDestination(pt: LatLngLiteral, angle: number, dist: number): LatLngLiteral {\n const a = 6378137\n const b = 6356752.3142\n const f = 1 / 298.257223563\n\n const alpha1 = getRad(angle)\n const sinAlpha1 = Math.sin(alpha1)\n const cosAlpha1 = Math.cos(alpha1)\n\n const tanU1 = (1 - f) * Math.tan(getRad(pt.lat))\n const cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1)\n const sinU1 = tanU1 * cosU1\n const sigma1 = Math.atan2(tanU1, cosAlpha1)\n const sinAlpha = cosU1 * sinAlpha1\n const cosSqAlpha = 1 - sinAlpha * sinAlpha\n const uSq = (cosSqAlpha * (a * a - b * b)) / (b * b)\n const A = 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)))\n const B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)))\n\n let cos2SigmaM = 0\n let sinSigma = 0\n let cosSigma = 0\n let sigma = dist / (b * A)\n let sigmaP = 2 * Math.PI\n while (Math.abs(sigma - sigmaP) > 1e-12) {\n cos2SigmaM = Math.cos(2 * sigma1 + sigma)\n sinSigma = Math.sin(sigma)\n cosSigma = Math.cos(sigma)\n const deltaSigma =\n B *\n sinSigma *\n (cos2SigmaM +\n (B / 4) *\n (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -\n (B / 6) * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)))\n sigmaP = sigma\n sigma = dist / (b * A) + deltaSigma\n }\n\n const tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1\n const lat2 = Math.atan2(\n sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,\n (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp),\n )\n const lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1)\n const C = (f / 16) * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))\n const L =\n lambda -\n (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)))\n\n // var revAz = Math.atan2(sinAlpha, -tmp) // final bearing\n\n const destination = { lng: pt.lng + getDeg(L), lat: getDeg(lat2) }\n\n return destination\n}\n\n/** 球面工具 */\nexport const SphericalUtils = {\n getDistance,\n getDestination,\n}\n","// 将自定义的声明文件\"导出\", 防止依赖@tg/map的工程报错\n// TODO: 2023/03/23 ipcjs 这个类型导出现在有问题...\n// eslint-disable-next-line @typescript-eslint/triple-slash-reference\n/// <reference path=\"../map/dts/index.d.ts\"/>\nimport type { App, Component } from 'vue'\nimport { getTgMapConfig, setTgMapConfig, type PartialTgMapConfig, type TgMapConfig } from '../map/map-config'\nimport LifecycleLogPlugin, { type LifecycleLogOptions } from '../utils/lifecycle-log'\nimport { throwError } from '../utils/utils'\nimport MapMixin, { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\nconst TgMapPlugin = {\n install(app: App, config?: PartialTgMapConfig) {\n setTgMapConfig(config)\n // Vue3中提倡在需要用的地方导入组件, 对tree-shrink更友好\n if (import.meta.env.VITE_FALSE) {\n // 注册所有Tg开头的Vue\n // ## webpack:\n // const views = require.context('./', true, /Tg.*\\.vue$/)\n // ## vite:\n const views = import.meta.glob('./**/Tg*.vue', { eager: true, import: 'default' })\n Object.keys(views).forEach(key => {\n const TgVue = views[key] as Component\n app.component(TgVue.name ?? throwError(`Tg开头的组件必须设置name: ${key}`), TgVue)\n })\n }\n\n const strategies = app.config.optionMergeStrategies\n // Vue3中必须自己写合并策略: https://github.com/vuejs/core/issues/861\n strategies[MIXIN_HOOK_CREATE] = strategies[MIXIN_HOOK_DESTROY] = (to, from) => {\n // 依照Vue2的风格, 将方法合并成数组\n // 参考:\n // - Vue3兼容模式: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/componentOptions.ts#L1065\n // - Vue2: https://github.com/vuejs/vue/blob/a9ca2d85193e435e668ba25ace481bfb176b0c6e/src/core/util/options.ts#L154\n return to\n ? [...new Set([].concat(to as any, from as any))]\n : Array.isArray(from)\n ? from\n : [from]\n }\n },\n}\n\n/* 导出变量, 外部应该只使用从这里导出的变量 */\nexport default TgMapPlugin\n// 导出map和utils目录\nexport { type Tg } from '../map/event'\nexport * from '../map/lat-lng'\nexport * from '../map/map-factory'\nexport { loadCachedMap } from '../map/map-loader'\nexport * from '../map/map/controls/control'\nexport * from '../map/map/controls/map-type.control'\nexport * from '../map/map/controls/scale.control'\nexport * from '../map/map/controls/street-view.control'\nexport * from '../map/map/controls/zoom.control'\nexport * from '../map/map/extra/autocomplete'\nexport * from '../map/map/extra/heatmap'\nexport * from '../map/map/extra/map-urls'\nexport * from '../map/map/extra/marker-clusterer'\nexport * from '../map/map/extra/places-service'\nexport * from '../map/map/extra/search-box'\nexport * from '../map/map/map'\nexport * from '../map/map/map-options'\nexport * from '../map/map/map-type'\nexport * from '../map/map/overlay/circle'\nexport * from '../map/map/overlay/element-overlay'\nexport * from '../map/map/overlay/icon'\nexport * from '../map/map/overlay/info-box'\nexport * from '../map/map/overlay/info-window'\nexport * from '../map/map/overlay/marker'\nexport * from '../map/map/overlay/overlay'\nexport * from '../map/map/overlay/polygon'\nexport * from '../map/map/overlay/polyline'\nexport * from '../map/map/overlay/rectangle'\nexport * from '../map/types'\nexport * from '../utils/arrays'\nexport * from '../utils/assert'\nexport * from '../utils/mapped-types'\nexport { Objects } from '../utils/objects'\nexport * from '../utils/spherical-utils'\nexport * from '../utils/strings'\nexport * from '../utils/utils'\nexport * from '../utils/values'\nexport * from '../utils/vue-utils'\n// 导出vue文件\nexport { default as TgMap } from './TgMap.vue'\nexport { default as TgMapWidget } from './TgMapWidget.vue'\nexport { default as TgCustomControl } from './controls/TgCustomControl.vue'\nexport { default as TgMapTypeControl } from './controls/TgMapTypeControl.vue'\nexport { default as TgScaleControl } from './controls/TgScaleControl.vue'\nexport { default as TgStreetViewControl } from './controls/TgStreetViewControl.vue'\nexport { default as TgZoomControl } from './controls/TgZoomControl.vue'\nexport { default as TgHeatmap } from './extra/TgHeatmap.vue'\nexport { default as TgMarkerClusterer } from './extra/TgMarkerClusterer.vue'\nexport { default as TgTrafficLayer } from './layers/TgTrafficLayer.vue'\nexport * from './map-hooks'\nexport { default as TgCircle } from './overlays/TgCircle.vue'\nexport { default as TgElementOverlay } from './overlays/TgElementOverlay.vue'\nexport { default as TgInfoBox } from './overlays/TgInfoBox.vue'\nexport { default as TgInfoWindow } from './overlays/TgInfoWindow.vue'\nexport { default as TgLabel } from './overlays/TgLabel.vue'\nexport { default as TgMarker } from './overlays/TgMarker.vue'\nexport { default as TgPolygon } from './overlays/TgPolygon.vue'\nexport { default as TgPolyline } from './overlays/TgPolyline.vue'\nexport { default as TgRectangle } from './overlays/TgRectangle.vue'\nexport {\n LifecycleLogPlugin,\n MIXIN_HOOK_CREATE,\n MIXIN_HOOK_DESTROY,\n MIXIN_MAP_NAME,\n MapMixin,\n getTgMapConfig,\n setTgMapConfig,\n type LifecycleLogOptions,\n type PartialTgMapConfig,\n type TgMapConfig,\n}\n// END\n"],"names":["bindEvents","listeners","target","excludes","eventName","eventListenerId","generateNextEventListenerId","generateEventKey","type","listener","root","factory","module","this","x_PI","PI","a","ee","Rectangle","lng1","lat1","lng2","lat2","lon","lat","region","exclude","isInChina","i","j","bd09togcj02","bd_lon","bd_lat","x","y","z","theta","gg_lng","gg_lat","gcj02tobd09","lng","bd_lng","wgs84togcj02","transform","gcj02towgs84","out","dlat","transformlat","dlng","transformlng","radlat","magic","sqrtmagic","mglat","mglng","ret","gcj02","assert","condition","msg","assertNever","lateinit","typed","t","isInstanceOf","obj","constructor","safeAs","isComponentByType","instance","component","safeAsComponent","findAncestorComponentByType","startInstance","endComponent","unwrapStringEnumValue","value","throwError","throwUnsupported","todo","debug","noop","args","isDef","v","isEntryValueDef","entry","createAsyncSingleton","creator","promise","CoordType","COORD_TYPE_DEFAULT","_LatLng","coord","normalizedLat","point","latlng","coordType","normalize","targetCoord","coordtransform","other","LatLng","__publicField","_LatLngBounds","sw","ne","minLng","maxLng","positions","builder","bounds","position","LatLngBounds","Builder","start","end","exports","Location","toString","place","ll","getCoordType","Elements","isScrollable","ele","Arrays","equals","b","remove","arr","item","index","findByType","includesTyped","at","isNotEmpty","MVCArrays","indexOf","length","listenChanged","path","handler","addGoogleEventListener","addBaiduEventListener","addHtmlEventListener","options","addTgEventListener","AbstractEventTargetDelegate","inner","coordTypeSupplier","EventHubEventTargetDelegate","delegate","EventHub","event","_GoogleEventTargetDelegate","key","removable","ev","GoogleEventTargetDelegate","_BaiduEventTargetDelegate","actualListener","BaiduEventTargetDelegate","it","KeyValue","keys","values","FastFindValues","maxSize4Debug","keySelector","valueMap","CachedValue","ControlPosition","ControlPositionConverter","baiduKeyValue","googleKeyValue","controlPositionValues","getBaidu","getGoogle","CustomControl","AbstractControl","EmptyControl","visible","_map","BaiduControl","map","GoogleControl","_type","BuildInMapTypeId","BuildInMapType","id","baidu","google","googleCoordType","ImageMapType","layer","tileCoord","zoom","halfTileRange","baiduMapType","googleMapType","TrafficLayer","MapType","MapTypeControlType","MAP_TYPES_DEFAULT","BaiduMapTypeControl","mapTypes","type2baidu","_GoogleMapTypeControl","mapType","GoogleMapTypeControl","BaiduScaleControl","GoogleScaleControl","BaiduStreetViewControl","GoogleStreetViewControl","BaiduZoomControl","GoogleZoomControl","initGoogleMapDynamicLibraryImport","script","arg","googleTitle","googleName","importMethod","callbackId","dom","global","googleMaps","libraries","url","loader","resolve","reject","_a","library","rest","_LATLNG_ZERO","_BOUNDS_ZERO","GoogleConst","parseGoogleAddressComponents","addressComponents","outResult","parseGooglePlace","fields","Autocomplete","GoogleAutocomplete","result","BaiduAutocomplete","onBoundsChanged","confirmEventTimestamp","removeOnConfirm","removeOnKeyup","heatmapFactory","HeatmapConfig","Store","config","defaultRadius","dataPoint","forceRender","radi","store","max","min","radius","unorganizedData","data","dataArr","dataLen","organisedEntry","dataPoints","pointsLen","coordinator","Canvas2dRenderer","_getColorPalette","gradientConfig","paletteCanvas","paletteCtx","gradient","_getPointTemplate","blurFactor","tplCanvas","tplCtx","_prepareData","renderData","xValues","xValuesLen","xValue","yValues","yValuesLen","yValue","container","shadowCanvas","canvas","computed","oldConfig","width","height","blur","rectX","rectY","shadowCtx","tpl","maxWidth","maxHeight","opacity","maxOpacity","minOpacity","useGradientOpacity","img","imgData","len","palette","alpha","offset","finalAlpha","Renderer","rendererFn","Util","merged","argsLen","Heatmap","Coordinator","evtName","callback","scope","cStore","_connect","renderer","pluginToLoad","plugin","pluginKey","HeatmapOverlay","opts","el","isSupportCanvas","that","e","size","currentBounds","topY","leftX","h","w","d","divPixel","screenPixel","roundedPoint","p","mapdata","dlen","count","elem","RADIUS_DEFAULT","HeatmapOptions","k1","k2","_","HeatmapData","dataMax","GoogleHeatmap","BaiduHeatmap","BHeatMapOverlay","MapUrls","buildUrl","baseUrl","params","urlParams","generateBaiduSrc","segments","Strings","_GoogleMapUrls","origin","destination","mode","location","GoogleMapUrls","_BaiduMapUrls","destinationStr","title","content","BaiduMapUrls","MarkerClusterer$2","MarkerClusterer","opt_markers","opt_options","minZoom","maxZoom","obj1","obj2","object","property","markers","marker","zIndex","styles","numStyles","dv","calculator","opt_nodraw","m","removed","markersCopy","r","ready","projection","tr","bl","trPix","blPix","opt_hide","cluster","oldClusters","p1","p2","R","dLat","dLon","c","distance","clusterToAddTo","center","newCluster","Cluster","mapBounds","Cluster$1","markerClusterer","ClusterIcon","l","mz","sums","opt_padding","clusterBounds","pos","panes","style","backgroundPosition","txtColor","txtSize","T","context","element","source","doc","method","filters","filter","match","fixer","browser","getStyle","viewport","parent","box","htmlDom","htmlBorderLeftWidth","htmlBorderTopWidth","realListener","lis","afterFilter","realType","guid","subClass","superClass","className","proto","selfProps","clazz","_IMAGE_PATH","_IMAGE_EXTENSION","TextIconOverlay","text","sizes","pixelPosition","anchor","textColor","textSize","csstext","me","BaseEvent","eventExtend","be","getExtendedBounds","gridSize","cutBoundsInRange","pixelNE","pixelSW","newNE","newSW","maxX","getRange","minX","maxY","minY","mix","isArray","mkrs","extendedBounds","label","success","ClusterIconStyle","toBaidu","toGoogle","BaiduMarkerClusterer","BMarkerClusterer","stylesLength","GoogleMarkerClusterer","GMarkerClusterer","_b","PlacesService","GooglePlacesService","_options","query","locationBias","results","status","places","BaiduPlacesService","search","block","poi","SearchBox","input","onData","onError","GoogleSearchBox","BaiduSearchBox","MapZoom","AbstractMap","infoWindow","control","isMergeableObject","isNonNullObject","isSpecial","stringValue","isReactElement","canUseSymbol","REACT_ELEMENT_TYPE","emptyTarget","val","cloneUnlessOtherwiseSpecified","deepmerge","defaultArrayMerge","getMergeFunction","customMerge","getEnumerableOwnPropertySymbols","symbol","getKeys","propertyIsOnObject","propertyIsUnsafe","mergeObject","sourceIsArray","targetIsArray","sourceAndTargetTypesMatch","array","prev","next","deepmerge_1","cjs","isObject","isObjectObject","o","isPlainObject","ctor","prot","Objects","fromArray","fromEntries","entries","toJsonSafely","deleteUndefinedPropertyOnPlainObjectDeeply","putIfAbsent","ifAbsent","omit","includes","includesMethod","pick","get","keyPath","del","lastObj","lastKey","keySet","InfoWindowModeValues","GestureHandlingOptions","MapOptions","create","defaultOptions","Overlay","innerOverlay","GoogleOverlay","BaiduOverlay","_BaiduShape","state","editable","color","weight","BaiduShape","GoogleShape","BaiduCircle","circle","GoogleCircle","ensureBaiduV3","BMapPoints","Point","BaiduInfoBox","createBaiduInfoBox","borderClass","createBaiduInfoBoxClass","POINT_ZERO","rootClass","stop","close","pixel","InfoWindow","BaiduInfoWindow","innerPosition","GoogleInfoWindow","BaiduInfoBoxOverlay","baiduMap","GoogleInfoBoxOverlay","border","toEnumOrNull","enumObject","trimIndent","str","pascal2kebab","isInt","ext","normalized","filename","MapPane","MapPanes","mapPane","ElementOverlay","BaiduElementOverlay","latLng","GoogleElementOverlay","GoogleLabel","createGoogleLabel","createGoogleLabelClass","_mapPane","child","LabelContent","toElement","$div","BaiduLabelOverlay","baiduLabel","initialize","deltaX","deltaY","icon","iconAnchor","labelOffset","iconInfo","GoogleLabelOverlay","UnionIcon","Icon","SymbolIcon","baiduIcon","SymbolPath","IconSequence","BaiduMarker","clickable","draggable","enable","prevLabel","GoogleMarker","flag","positionChanged","visibleChanged","mapChanged","BaiduPolyShape","BaiduPolyline","overlay","symbolIcon","GooglePolyline","notify","BaiduPolygon","paths","GooglePolygon","pathsLL","pathLL","BaiduRectangle","originalEvent","prevPath","points","lineStart","beforePoint","afterPoint","lineEnd","newPoint","rect","GoogleRectangle","ZOOM_DELTA","BaiduMap","mapOptions","infoBox","gestureHandling","cursor","mapStyle","buildInMapType","padding","GoogleMap","initialMapType","bottomLeft","topRight","scale","wordPoint","mapTypeId","controlArray","HERE_SUPPORTED_VERSIONS","defaultConfig","tgMapConfig","getTgMapConfig","setTgMapConfig","HereMap","platform","TgMapType","TgMapFactory","createMap","$map","cachedMapLoaders","loadCachedMap","loadMap","namespace","getMapNamespace","loadJsonp","loadJs","getHereModuleUrl","name","version","callbackParamName","callbackName","$script","stringEnumProp","defaultValue","stringUnionPropFromValues","requiredProp","optionalProp","computedSaveOnThis","defaultValues","accessors","sharedPropertyDefinition","createPropertyObject","redefined","createPropertyObjectTyped","createEmptyVNode","createCommentVNode","callHook","vm","hookName","hooks","hook","findByComponentType","extractVNodeFromSlotsByComponent","slots","nodeList","node","splitAttrs","attrs","props","binds","listenerProps","useSplittedAttrs","eventProp","useEventLogMethods","prevType","prevTime","eventLog","eventLogLess","MIXIN_MAP_NAME","MIXIN_HOOK_CREATE","MIXIN_HOOK_DESTROY","MapMixin","defineComponent","_sfc_main$c","markRaw","watch","oldZoom","oldCenter","updateCenter","isUpdateMapType","isUpdateMapTypeId","_sfc_render","_ctx","_cache","$props","$setup","$data","$options","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_createCommentVNode","_renderSlot","dimen","num","_sfc_main$b","_normalizeClass","_normalizeStyle","_sfc_main$a","TgMap","$el","C","_sfc_main$9","_sfc_main$8","useComponentName","getCurrentInstance","file","useTgMapInner","mapRef","inject","onCreate","onDestroy","onMounted","onBeforeUnmount","_sfc_main$7","_sfc_main$6","_sfc_main$5","heatmap","TgMarkerClusterer","_sfc_main$4","_sfc_main$3","toRaw","SimpleElementOverlay","TgElementOverlay","TgMarker","_label","info","isShow","TgInfoBox","TgInfoWindow","_withDirectives","TgLabel","_sfc_main$2","_sfc_main$1","_sfc_main","DEFAULT_EXCLUDE_HOOK_NAMES","LifecycleLogPlugin","app","lifecycleLogMixin","componentName","__life","EARTH_RADIUS","getRad","getDeg","getDistance","f","g","sg","sl","sf","fl","s","h1","h2","getDestination","pt","angle","dist","alpha1","sinAlpha1","cosAlpha1","tanU1","cosU1","sinU1","sigma1","sinAlpha","cosSqAlpha","uSq","A","B","cos2SigmaM","sinSigma","cosSigma","sigma","sigmaP","deltaSigma","tmp","lambda","L","SphericalUtils","TgMapPlugin","views","TgVue","strategies","to","from"],"mappings":"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","x_google_ignoreList":[1,18,21,22,23,28,29]}
|