smap-leaflet 0.0.0-stage → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smap-leaflet.cjs","sources":["../src/plugins/chinese-tms-providers.ts","../src/plugins/coord-transform.ts","../src/plugins/map-correction.ts","../src/plugins/canvas-redraw-guard.ts","../src/plugins/tile-layer-nogap.ts","../src/core/cluster.ts","../src/core/layer.ts","../src/core/control.ts","../src/core/service.ts","../src/core/context-menu.ts","../src/utils/location.ts","../src/core/export.ts","../src/core/sketch/geometry.ts","../src/core/sketch/text.ts","../src/core/sketch/drawers.ts","../src/core/sketch/hint.ts","../src/core/draw-kit.ts","../../../node_modules/mitt/dist/mitt.mjs","../src/utils/emitter.ts","../src/SMap.ts","../src/utils/load-assets.ts","../src/core/sketch/editors.ts","../src/core/sketch/snap.ts","../src/core/draw.ts","../src/core/measure/base.ts","../src/core/measure/polyline.ts","../src/core/measure/area.ts","../src/core/measure/polygon.ts","../src/core/measure/circle.ts","../src/core/measure/rectangle.ts"],"sourcesContent":["/**\n * Chinese Tile Map Service Providers for Leaflet\n * Supports: TianDiTu, GaoDe, Google, Geoq, OSM, Baidu, Tencent, Mapbox\n */\nimport * as L from 'leaflet'\nimport type { CoordType, TileProviderDefinition } from '../types'\n\n// Baidu CRS (requires proj4leaflet)\nconst LWithProj = L as typeof L & { Proj?: { CRS: new (...args: any[]) => L.CRS } }\nif (LWithProj.Proj) {\n ;(L.CRS as any).Baidu = new LWithProj.Proj.CRS(\n 'EPSG:900913',\n '+proj=merc +a=6378206 +b=6356584.314245179 +lat_ts=0.0 +lon_0=0.0 +x_0=0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs',\n {\n resolutions: (() => {\n const level = 19\n const res: number[] = []\n res[0] = Math.pow(2, 18)\n for (let i = 1; i < level; i++) {\n res[i] = Math.pow(2, 18 - i)\n }\n return res\n })(),\n origin: [0, 0],\n bounds: L.bounds([20037508.342789244, 0], [0, 20037508.342789244]),\n },\n )\n}\n\n/** Provider definitions: Provider.MapName.MapType -> URL template */\nexport const providers: Record<string, any> = {\n TianDiTu: {\n Normal: {\n Map: 'https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk={key}',\n Annotion: 'https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk={key}',\n },\n Satellite: {\n Map: 'https://t{s}.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk={key}',\n Annotion: 'https://t{s}.tianditu.gov.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}&tk={key}',\n },\n Terrain: {\n Map: 'https://t{s}.tianditu.gov.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}&tk={key}',\n Annotion: 'https://t{s}.tianditu.gov.cn/DataServer?T=cta_w&X={x}&Y={y}&L={z}&tk={key}',\n },\n Subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],\n },\n\n GaoDe: {\n Normal: {\n Map: 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',\n },\n Satellite: {\n Map: 'https://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',\n Annotion: 'https://webst0{s}.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}',\n },\n Brief: {\n Map: 'https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',\n },\n Subdomains: ['1', '2', '3', '4'],\n },\n\n Google: {\n Normal: {\n Map: 'https://www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}',\n },\n Satellite: {\n Map: 'https://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}',\n Annotion: 'https://www.google.cn/maps/vt?lyrs=y@189&gl=cn&x={x}&y={y}&z={z}',\n },\n Subdomains: [] as string[],\n },\n\n Geoq: {\n Normal: {\n Map: 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}',\n PurplishBlue:\n 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}',\n Gray: 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}',\n Warm: 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}',\n },\n Theme: {\n Hydro:\n 'https://thematic.geoq.cn/arcgis/rest/services/ThematicMaps/WorldHydroMap/MapServer/tile/{z}/{y}/{x}',\n },\n Subdomains: [] as string[],\n },\n\n OSM: {\n Normal: {\n Map: 'https://{s}.tile.osm.org/{z}/{x}/{y}.png',\n },\n Subdomains: ['a', 'b', 'c'],\n },\n\n Baidu: {\n Normal: {\n Map: 'https://online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&p=1',\n },\n Satellite: {\n Map: 'https://shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46',\n Annotion: 'https://online{s}.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=sl&v=020',\n },\n Subdomains: '0123456789'.split(''),\n tms: true,\n },\n\n BaiduV3: {\n Normal: {\n Map: 'https://maponline{s}.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=2&udt=&from=jsapi3_0',\n },\n Subdomains: '012'.split(''),\n tms: true,\n },\n\n Tencent: {\n Normal: {\n Map: 'https://rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={-y}&type=vector&styleid=3',\n },\n Satellite: {\n Map: 'https://p{s}.map.gtimg.com/sateTiles/{z}/{sx}/{sy}/{x}_{-y}.jpg',\n },\n Terrain: {\n Map: 'https://p{s}.map.gtimg.com/demTiles/{z}/{sx}/{sy}/{x}_{-y}.jpg',\n },\n Subdomains: '0123'.split(''),\n },\n\n Mapbox: {\n Satellite: {\n Map: 'https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.webp?access_token={key}',\n },\n Subdomains: ['0'],\n },\n}\n\n/** Map provider name to coordinate type */\nconst COORD_TYPE_MAP: Record<string, CoordType> = {\n GaoDe: 'gcj02',\n Geoq: 'gcj02',\n Google: 'gcj02',\n Tencent: 'gcj02',\n Baidu: 'bd09',\n BaiduV3: 'bd09',\n}\n\nexport function getCoordType(providerName: string): CoordType {\n return COORD_TYPE_MAP[providerName] || 'wgs84'\n}\n\n/** Every tile type shipped with the library (kept in sync with `providers` by a test) */\nexport const BUILTIN_TILE_TYPES = [\n 'TianDiTu.Normal.Map',\n 'TianDiTu.Normal.Annotion',\n 'TianDiTu.Satellite.Map',\n 'TianDiTu.Satellite.Annotion',\n 'TianDiTu.Terrain.Map',\n 'TianDiTu.Terrain.Annotion',\n 'GaoDe.Normal.Map',\n 'GaoDe.Satellite.Map',\n 'GaoDe.Satellite.Annotion',\n 'GaoDe.Brief.Map',\n 'Google.Normal.Map',\n 'Google.Satellite.Map',\n 'Google.Satellite.Annotion',\n 'Geoq.Normal.Map',\n 'Geoq.Normal.PurplishBlue',\n 'Geoq.Normal.Gray',\n 'Geoq.Normal.Warm',\n 'Geoq.Theme.Hydro',\n 'OSM.Normal.Map',\n 'Baidu.Normal.Map',\n 'Baidu.Satellite.Map',\n 'Baidu.Satellite.Annotion',\n 'BaiduV3.Normal.Map',\n 'Tencent.Normal.Map',\n 'Tencent.Satellite.Map',\n 'Tencent.Terrain.Map',\n 'Mapbox.Satellite.Map',\n] as const\n\nconst RESERVED_GROUP_NAMES = ['Subdomains', 'tms', 'key']\n\n/**\n * Register a custom tile provider (or override a built-in one).\n * Its layers are then addressable as `\"<name>.<group>.<type>\"`.\n *\n * @example\n * ```ts\n * registerProvider('Intranet', {\n * layers: { Satellite: { Map: 'https://tiles.example.com/{z}/{x}/{y}.png' } },\n * coordType: 'gcj02',\n * })\n * smap.setTileLayer('Intranet.Satellite.Map')\n * ```\n */\nexport function registerProvider(name: string, definition: TileProviderDefinition): void {\n if (!name || name.includes('.')) {\n throw new Error(`Invalid tile provider name: \"${name}\"`)\n }\n for (const group of Object.keys(definition.layers)) {\n if (group.includes('.') || RESERVED_GROUP_NAMES.includes(group)) {\n throw new Error(`Invalid tile group name: \"${group}\"`)\n }\n }\n\n providers[name] = {\n ...definition.layers,\n Subdomains: definition.subdomains ?? [],\n ...(definition.tms ? { tms: true } : {}),\n ...(definition.key ? { key: definition.key } : {}),\n }\n\n if (definition.coordType && definition.coordType !== 'wgs84') {\n COORD_TYPE_MAP[name] = definition.coordType\n } else {\n delete COORD_TYPE_MAP[name]\n }\n}\n\n/** List every tile type currently available, including registered ones */\nexport function getTileTypes(): string[] {\n const types: string[] = []\n for (const [provider, groups] of Object.entries(providers)) {\n for (const [group, layers] of Object.entries(groups as Record<string, unknown>)) {\n if (RESERVED_GROUP_NAMES.includes(group) || typeof layers !== 'object' || !layers) continue\n for (const type of Object.keys(layers)) {\n types.push(`${provider}.${group}.${type}`)\n }\n }\n }\n return types\n}\n\n/**\n * Create a china tile layer from type string like \"GaoDe.Normal.Map\"\n */\nexport function createChinaTileLayer(\n type: string,\n options: { key?: string; zIndex?: number; [k: string]: any } = {},\n): L.TileLayer {\n const parts = type.split('.')\n const providerName = parts[0]\n const mapName = parts[1]\n const mapType = parts[2]\n\n const provider = providers[providerName]\n if (!provider?.[mapName]?.[mapType]) {\n throw new Error(`Unknown tile provider: ${type}`)\n }\n\n const url: string = provider[mapName][mapType]\n const tileOptions: Record<string, any> = {\n subdomains: provider.Subdomains || [],\n ...options,\n key: options.key || provider.key || '',\n corrdType: getCoordType(providerName),\n }\n\n if (provider.tms) {\n tileOptions.tms = true\n }\n\n const ChinaTileLayer = L.TileLayer.extend({\n getTileUrl(coords: L.Coords) {\n const data: Record<string, any> = {\n s: (this as any)._getSubdomain(coords),\n x: coords.x,\n y: coords.y,\n z: (this as any)._getZoomForUrl(),\n }\n if ((this as any)._map && !(this as any)._map.options.crs.infinite) {\n const invertedY = (this as any)._globalTileRange.max.y - coords.y\n if ((this as any).options.tms) {\n data['y'] = invertedY\n }\n data['-y'] = invertedY\n }\n data.sx = data.x >> 4\n data.sy = ((1 << data.z) - data.y) >> 4\n\n return L.Util.template((this as any)._url, L.Util.extend(data, (this as any).options))\n },\n }) as any\n\n return new ChinaTileLayer(url, tileOptions) as L.TileLayer\n}\n","/**\n * Coordinate system conversion utilities\n * Supports: WGS-84, GCJ-02 (火星坐标), BD-09 (百度坐标)\n */\n\n// eslint-disable-next-line no-loss-of-precision -- 算法公开常量,按原文保留完整位数\nconst PI = 3.1415926535897932384626\nconst A = 6378245.0\n// eslint-disable-next-line no-loss-of-precision -- 算法公开常量,按原文保留完整位数\nconst EE = 0.00669342162296594323\nconst X_PI = (PI * 3000.0) / 180.0\n\nexport interface Coord {\n lng: number\n lat: number\n}\n\nfunction transformLat(x: number, y: number): number {\n let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))\n ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0\n ret += ((20.0 * Math.sin(y * PI) + 40.0 * Math.sin((y / 3.0) * PI)) * 2.0) / 3.0\n ret += ((160.0 * Math.sin((y / 12.0) * PI) + 320 * Math.sin((y * PI) / 30.0)) * 2.0) / 3.0\n return ret\n}\n\nfunction transformLng(x: number, y: number): number {\n let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))\n ret += ((20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0) / 3.0\n ret += ((20.0 * Math.sin(x * PI) + 40.0 * Math.sin((x / 3.0) * PI)) * 2.0) / 3.0\n ret += ((150.0 * Math.sin((x / 12.0) * PI) + 300.0 * Math.sin((x / 30.0) * PI)) * 2.0) / 3.0\n return ret\n}\n\nfunction outOfChina(lat: number, lng: number): boolean {\n return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271\n}\n\nfunction transformGcj(lng: number, lat: number): Coord {\n let dLat = transformLat(lng - 105.0, lat - 35.0)\n let dLng = transformLng(lng - 105.0, lat - 35.0)\n const radLat = (lat / 180.0) * PI\n let magic = Math.sin(radLat)\n magic = 1 - EE * magic * magic\n const 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 return { lat: lat + dLat, lng: lng + dLng }\n}\n\n/** WGS-84 → GCJ-02 */\nexport function wgs84ToGcj02(lng: number, lat: number): Coord {\n if (outOfChina(lat, lng)) return { lng, lat }\n return transformGcj(lng, lat)\n}\n\n/** GCJ-02 → WGS-84 */\nexport function gcj02ToWgs84(lng: number, lat: number): Coord {\n if (outOfChina(lat, lng)) return { lng, lat }\n const coord = transformGcj(lng, lat)\n return { lng: lng * 2 - coord.lng, lat: lat * 2 - coord.lat }\n}\n\n/** GCJ-02 → BD-09 */\nexport function gcj02ToBd09(lng: number, lat: number): Coord {\n const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * X_PI)\n const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * X_PI)\n return { lng: z * Math.cos(theta) + 0.0065, lat: z * Math.sin(theta) + 0.006 }\n}\n\n/** BD-09 → GCJ-02 */\nexport function bd09ToGcj02(lng: number, lat: number): Coord {\n const x = lng - 0.0065\n const y = lat - 0.006\n const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI)\n const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI)\n return { lng: z * Math.cos(theta), lat: z * Math.sin(theta) }\n}\n\n/** WGS-84 → BD-09 */\nexport function wgs84ToBd09(lng: number, lat: number): Coord {\n const gcj = wgs84ToGcj02(lng, lat)\n return gcj02ToBd09(gcj.lng, gcj.lat)\n}\n\n/** BD-09 → WGS-84 */\nexport function bd09ToWgs84(lng: number, lat: number): Coord {\n const gcj = bd09ToGcj02(lng, lat)\n return gcj02ToWgs84(gcj.lng, gcj.lat)\n}\n\ntype CoordSystem = 'wgs84' | 'gcj02' | 'bd09'\n\nconst CONVERTERS: Record<string, (lng: number, lat: number) => Coord> = {\n 'wgs84>gcj02': wgs84ToGcj02,\n 'gcj02>wgs84': gcj02ToWgs84,\n 'gcj02>bd09': gcj02ToBd09,\n 'bd09>gcj02': bd09ToGcj02,\n 'wgs84>bd09': wgs84ToBd09,\n 'bd09>wgs84': bd09ToWgs84,\n}\n\n/** Convert one coordinate between any two of WGS-84, GCJ-02 and BD-09 */\nexport function transformCoord(\n lng: number,\n lat: number,\n from: CoordSystem,\n to: CoordSystem,\n): Coord {\n if (from === to) return { lng, lat }\n const convert = CONVERTERS[`${from}>${to}`]\n if (!convert) {\n throw new Error(`Unsupported coordinate conversion: ${from} → ${to}`)\n }\n return convert(lng, lat)\n}\n\n/**\n * Convert every coordinate in a GeoJSON object. Returns a deep copy; the input is not modified.\n * Typical use: data received in GCJ-02 or BD-09 → WGS-84 before putting it on the map.\n */\nexport function transformGeoJSON<T>(geojson: T, from: CoordSystem, to: CoordSystem): T {\n const copy = JSON.parse(JSON.stringify(geojson))\n if (from === to) return copy\n\n const convertPositions = (value: any): any => {\n if (!Array.isArray(value)) return value\n if (typeof value[0] === 'number') {\n const { lng, lat } = transformCoord(value[0], value[1], from, to)\n // Keep altitude and any further members untouched\n return [lng, lat, ...value.slice(2)]\n }\n return value.map(convertPositions)\n }\n\n const visit = (node: any) => {\n if (!node || typeof node !== 'object') return\n switch (node.type) {\n case 'FeatureCollection':\n node.features?.forEach(visit)\n break\n case 'Feature':\n visit(node.geometry)\n break\n case 'GeometryCollection':\n node.geometries?.forEach(visit)\n break\n default:\n if (node.coordinates) node.coordinates = convertPositions(node.coordinates)\n }\n // A bounding box is no longer valid after the shift\n delete node.bbox\n }\n visit(copy)\n return copy\n}\n","/**\n * Map coordinate correction for Chinese tile providers\n * Automatically converts WGS-84 to GCJ-02 or BD-09 based on tile layer corrdType\n */\nimport * as L from 'leaflet'\nimport { wgs84ToGcj02, wgs84ToBd09 } from './coord-transform'\n\nexport function installMapCorrection(): void {\n const GridLayerProto = L.GridLayer.prototype as any\n\n GridLayerProto._setZoomTransform = function (level: any, _center: L.LatLng, zoom: number) {\n let center: any = _center\n if (center && this.options) {\n if (this.options.corrdType === 'gcj02') {\n center = wgs84ToGcj02(_center.lng, _center.lat)\n } else if (this.options.corrdType === 'bd09') {\n center = wgs84ToBd09(_center.lng, _center.lat)\n }\n }\n\n const scale = this._map.getZoomScale(zoom, level.zoom)\n const translate = level.origin\n .multiplyBy(scale)\n .subtract(this._map._getNewPixelOrigin(center, zoom))\n .round()\n\n if (L.Browser.any3d) {\n L.DomUtil.setTransform(level.el, translate, scale)\n } else {\n L.DomUtil.setPosition(level.el, translate)\n }\n }\n\n GridLayerProto._getTiledPixelBounds = function (_center: L.LatLng) {\n let center: any = _center\n if (center && this.options) {\n if (this.options.corrdType === 'gcj02') {\n center = wgs84ToGcj02(_center.lng, _center.lat)\n } else if (this.options.corrdType === 'bd09') {\n center = wgs84ToBd09(_center.lng, _center.lat)\n }\n }\n\n const map = this._map\n const mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom()\n const scale = map.getZoomScale(mapZoom, this._tileZoom)\n const pixelCenter = map.project(center, this._tileZoom).floor()\n const halfSize = map.getSize().divideBy(scale * 2)\n\n return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize))\n }\n}\n","/**\n * Guard against a Leaflet canvas renderer redrawing after it was removed.\n *\n * `L.Canvas` schedules redraws on the next animation frame and cancels the pending\n * one when it is removed. But a redraw that runs directly (on every map `update`)\n * forgets the id of the frame still pending, so that frame can no longer be\n * cancelled. If the map is removed before it fires, it runs against a renderer\n * without a drawing context and throws\n * \"Cannot read properties of undefined (reading 'clearRect')\".\n * Typical trigger: destroying a map that has vector layers while it is still animating.\n */\nimport * as L from 'leaflet'\n\nexport function installCanvasRedrawGuard(): void {\n const proto = L.Canvas.prototype as any\n const redraw = proto._redraw\n proto._redraw = function (this: any) {\n if (!this._ctx) {\n this._redrawRequest = null\n return\n }\n redraw.call(this)\n }\n}\n","/**\n * TileLayer NoGap fix - adds 1px to tile size and removes border to prevent gaps between tiles.\n * Uses MutationObserver to catch all tiles including dynamically loaded ones.\n */\nimport * as L from 'leaflet'\n\nfunction patchTile(tile: HTMLElement): void {\n if (tile.dataset.nogap) return\n tile.dataset.nogap = '1'\n tile.style.border = 'none'\n}\n\nfunction patchAllTiles(container: HTMLElement): void {\n container.querySelectorAll<HTMLElement>('.leaflet-tile').forEach(patchTile)\n}\n\nexport function installTileLayerNoGap(): void {\n // Monkey-patch _initTile for early patching\n const originalInitTile = (L.GridLayer.prototype as any)._initTile\n ;(L.GridLayer.prototype as any)._initTile = function (tile: HTMLElement) {\n originalInitTile.call(this, tile)\n tile.style.border = 'none'\n tile.dataset.nogap = '1'\n }\n}\n\n/**\n * Observe a map container for new tiles and patch them.\n * Call this after map creation for guaranteed coverage.\n */\nexport function observeTileNoGap(mapContainer: HTMLElement): MutationObserver {\n // Patch existing tiles\n patchAllTiles(mapContainer)\n\n // Watch for new tiles\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement) {\n if (node.classList.contains('leaflet-tile')) {\n patchTile(node)\n } else {\n node.querySelectorAll<HTMLElement>('.leaflet-tile').forEach(patchTile)\n }\n }\n }\n }\n })\n\n observer.observe(mapContainer, { childList: true, subtree: true })\n return observer\n}\n","import * as L from 'leaflet'\nimport type { ClusterOptions, PointInput } from '../types'\n\ninterface Item<T> {\n point: T\n latlng: L.LatLng\n}\n\ninterface Bucket<T> {\n items: Item<T>[]\n lat: number\n lng: number\n}\n\nfunction countText(count: number): string {\n if (count >= 10000) return `${Math.round(count / 1000)}k`\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`\n return String(count)\n}\n\nfunction clusterIcon(count: number): L.DivIcon {\n const tier = count < 10 ? 's' : count < 100 ? 'm' : 'l'\n const size = { s: 32, m: 38, l: 46 }[tier]\n return L.divIcon({\n className: `smap-cluster smap-cluster--${tier}`,\n html: `<span>${countText(count)}</span>`,\n iconSize: [size, size],\n })\n}\n\n/**\n * Points that merge into counted bubbles when they would overlap.\n *\n * Clustering is a grid over the current zoom level: points falling into the same\n * cell become one bubble at their average position. It is recomputed for the\n * visible area on every move, which keeps it cheap for tens of thousands of points.\n */\nexport class ClusterLayer<T extends PointInput = PointInput> extends L.FeatureGroup {\n private items: Item<T>[] = []\n private clusterOptions: ClusterOptions<T>\n private canvas: { renderer?: L.Renderer }\n\n constructor(\n points: T[],\n options: ClusterOptions<T> = {},\n canvas: { renderer?: L.Renderer } = {},\n ) {\n super()\n this.clusterOptions = options\n this.canvas = canvas\n this.items = this.index(points)\n }\n\n /** Replace the data */\n setPoints(points: T[]): this {\n this.items = this.index(points)\n this.refresh()\n return this\n }\n\n /** Bounds of all points, not just the ones currently drawn */\n getBounds(): L.LatLngBounds {\n return L.latLngBounds(this.items.map((item) => item.latlng))\n }\n\n onAdd(map: L.Map): this {\n super.onAdd(map)\n map.on('zoomend moveend', this.refresh, this)\n this.refresh()\n return this\n }\n\n onRemove(map: L.Map): this {\n map.off('zoomend moveend', this.refresh, this)\n return super.onRemove(map)\n }\n\n private index(points: T[]): Item<T>[] {\n return points.map((point) => ({ point, latlng: L.latLng(point as L.LatLngExpression) }))\n }\n\n private refresh(): void {\n const map = (this as any)._map as L.Map | undefined\n if (!map) return\n this.clearLayers()\n\n const zoom = map.getZoom()\n const options = this.clusterOptions\n const cell = options.clusterRadius ?? 60\n const clustering = zoom < (options.disableClusteringAtZoom ?? Infinity)\n // A margin, so bubbles do not pop in at the very edge while panning\n const view = map.getBounds().pad(0.2)\n\n const buckets = new Map<string, Bucket<T>>()\n this.items.forEach((item, index) => {\n if (!view.contains(item.latlng)) return\n let key = `#${index}`\n if (clustering) {\n const px = map.project(item.latlng, zoom)\n key = `${Math.floor(px.x / cell)}:${Math.floor(px.y / cell)}`\n }\n let bucket = buckets.get(key)\n if (!bucket) buckets.set(key, (bucket = { items: [], lat: 0, lng: 0 }))\n bucket.items.push(item)\n bucket.lat += item.latlng.lat\n bucket.lng += item.latlng.lng\n })\n\n for (const bucket of buckets.values()) {\n const count = bucket.items.length\n this.addLayer(\n count === 1\n ? this.pointMarker(bucket.items[0])\n : this.clusterMarker(bucket, L.latLng(bucket.lat / count, bucket.lng / count)),\n )\n }\n }\n\n private pointMarker({ point, latlng }: Item<T>): L.Layer {\n const { style, tooltip, onClick } = this.clusterOptions\n const marker = L.circleMarker(latlng, {\n radius: this.clusterOptions.radius ?? 5,\n weight: 1,\n color: '#fff',\n fillColor: '#1f6feb',\n fillOpacity: 0.9,\n interactive: !!(tooltip || onClick),\n ...(typeof style === 'function' ? style(point, 0) : style),\n ...this.canvas,\n })\n if (tooltip) marker.bindTooltip(() => tooltip(point))\n if (onClick) marker.on('click', (e) => onClick(point, e))\n return marker\n }\n\n private clusterMarker(bucket: Bucket<T>, center: L.LatLng): L.Layer {\n const marker = L.marker(center, { icon: clusterIcon(bucket.items.length), keyboard: false })\n marker.on('click', (e) => {\n const points = bucket.items.map((item) => item.point)\n if (this.clusterOptions.onClusterClick) {\n this.clusterOptions.onClusterClick(points, e)\n return\n }\n // Default: zoom in until the bubble breaks apart\n const map = (this as any)._map as L.Map\n map.fitBounds(L.latLngBounds(bucket.items.map((item) => item.latlng)), {\n padding: [48, 48],\n maxZoom: map.getMaxZoom(),\n })\n })\n return marker\n }\n}\n","import * as L from 'leaflet'\nimport { ClusterLayer } from './cluster'\nimport type {\n ClusterOptions,\n MaskOptions,\n PointInput,\n PointLayerOptions,\n WFSOptions,\n WMSOptions,\n} from '../types'\n\n/** Ring that covers the whole world, used as the outside of a mask */\nconst WORLD_RING: L.LatLngTuple[] = [\n [-90, -360],\n [90, -360],\n [90, 360],\n [-90, 360],\n]\n\n/** Outer ring of every polygon found in a GeoJSON object, as [lat, lng] */\nfunction outerRings(geojson: any): L.LatLngTuple[][] {\n const rings: L.LatLngTuple[][] = []\n const push = (ring: number[][]) => rings.push(ring.map(([lng, lat]) => [lat, lng]))\n\n const visit = (node: any) => {\n switch (node?.type) {\n case 'FeatureCollection':\n node.features.forEach(visit)\n break\n case 'Feature':\n visit(node.geometry)\n break\n case 'GeometryCollection':\n node.geometries.forEach(visit)\n break\n case 'Polygon':\n push(node.coordinates[0])\n break\n case 'MultiPolygon':\n node.coordinates.forEach((polygon: number[][][]) => push(polygon[0]))\n break\n }\n }\n visit(geojson)\n return rings\n}\n\nexport class LayerManager {\n private map: L.Map\n private registry = new Map<string, L.Layer>()\n private ownCanvas: L.Canvas | null = null\n private listeners: (() => void)[] = []\n\n constructor(map: L.Map) {\n this.map = map\n }\n\n // ============ Registry ============\n\n /** Be told when a layer is registered, removed, shown or hidden */\n onChange(listener: () => void): void {\n this.listeners.push(listener)\n }\n\n private changed(): void {\n this.listeners.forEach((listener) => listener())\n }\n\n /**\n * Put a layer under management and add it to the map.\n * An existing layer with the same id is removed first.\n */\n add<T extends L.Layer>(id: string, layer: T, options: { visible?: boolean } = {}): T {\n this.remove(id)\n this.registry.set(id, layer)\n if (options.visible !== false) {\n layer.addTo(this.map)\n }\n this.changed()\n return layer\n }\n\n get<T extends L.Layer = L.Layer>(id: string): T | undefined {\n return this.registry.get(id) as T | undefined\n }\n\n has(id: string): boolean {\n return this.registry.has(id)\n }\n\n /** Ids of all managed layers, in insertion order */\n ids(): string[] {\n return [...this.registry.keys()]\n }\n\n isVisible(id: string): boolean {\n const layer = this.registry.get(id)\n return !!layer && this.map.hasLayer(layer)\n }\n\n /** Show a managed layer. Returns false when the id is unknown */\n show(id: string): boolean {\n const layer = this.registry.get(id)\n if (!layer) return false\n layer.addTo(this.map)\n this.changed()\n return true\n }\n\n /** Hide a managed layer without forgetting it. Returns false when the id is unknown */\n hide(id: string): boolean {\n const layer = this.registry.get(id)\n if (!layer) return false\n layer.remove()\n this.changed()\n return true\n }\n\n /** Flip (or set) visibility. Returns the resulting visibility */\n toggle(id: string, visible?: boolean): boolean {\n const next = visible ?? !this.isVisible(id)\n return next ? this.show(id) : (this.hide(id), false)\n }\n\n /** Remove a managed layer from the map and forget it. Returns false when the id is unknown */\n remove(id: string): boolean {\n const layer = this.registry.get(id)\n if (!layer) return false\n layer.remove()\n this.registry.delete(id)\n this.changed()\n return true\n }\n\n /** Remove every managed layer */\n clear(): void {\n for (const layer of this.registry.values()) {\n layer.remove()\n }\n this.registry.clear()\n this.changed()\n }\n\n /** Release everything, including the shared canvas. Called by `smap.destroy()` */\n destroy(): void {\n this.clear()\n this.listeners = []\n this.ownCanvas?.remove()\n this.ownCanvas = null\n }\n\n /**\n * Renderer option for vector layers created here.\n *\n * Everything must end up on ONE canvas: Leaflet stacks a full-size <canvas> per\n * renderer and only the top one receives mouse events, and a renderer is never\n * removed from the map when its layers are. So: reuse the map's own canvas when\n * it has one (`preferCanvas`, the default), otherwise share a single canvas.\n */\n private canvas(): { renderer?: L.Renderer } {\n if (this.map.options.preferCanvas) return {}\n this.ownCanvas ??= L.canvas({ padding: 0.5 })\n return { renderer: this.ownCanvas }\n }\n\n private place<T extends L.Layer>(layer: T, id?: string): T {\n return id ? this.add(id, layer) : layer.addTo(this.map)\n }\n\n // ============ WFS / GeoJSON ============\n\n /**\n * Fetch GeoJSON from a GeoServer WFS endpoint\n */\n async loadWFS(options: WFSOptions): Promise<any> {\n const params = new URLSearchParams({\n service: 'WFS',\n version: '1.1.0',\n request: 'GetFeature',\n typeName: options.layer,\n outputFormat: options.outputFormat || 'application/json',\n })\n\n // Merge extra params\n for (const [key, value] of Object.entries(options)) {\n if (!['url', 'layer', 'style', 'outputFormat', 'id'].includes(key) && value != null) {\n params.set(key, String(value))\n }\n }\n\n const url = `${options.url}?${params.toString()}`\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`WFS request failed: ${response.status} ${response.statusText}`)\n }\n return response.json()\n }\n\n /**\n * Create a GeoJSON layer from data with optional styling\n */\n createGeoJsonLayer(data: GeoJSON.GeoJsonObject, style?: L.PathOptions): L.GeoJSON {\n return L.geoJSON(data, {\n style: style ? { ...style, ...this.canvas() } : undefined,\n })\n }\n\n /**\n * Load WFS data and add to map as a GeoJSON layer\n */\n async addWFS(options: WFSOptions): Promise<L.GeoJSON> {\n const data = await this.loadWFS(options)\n return this.place(this.createGeoJsonLayer(data, options.style), options.id)\n }\n\n // ============ WMS ============\n\n /**\n * Create a WMS tile layer\n */\n createWMS(options: WMSOptions): L.TileLayer.WMS {\n // `id` is ours; everything else in `rest` is sent to the server as a WMS parameter\n const { url, layer, id: _id, ...rest } = options\n return L.tileLayer.wms(url, {\n layers: layer,\n format: rest.format || 'image/png',\n transparent: rest.transparent !== false,\n crs: rest.crs || L.CRS.EPSG4326,\n ...rest,\n })\n }\n\n /**\n * Create a WMS tile layer and add to map\n */\n addWMS(options: WMSOptions): L.TileLayer.WMS {\n return this.place(this.createWMS(options), options.id)\n }\n\n // ============ Mask ============\n\n /**\n * Build a mask that dims everything outside the given polygon(s).\n * `getBounds()` of the result is the bounds of the highlighted region.\n */\n createMask(geojson: GeoJSON.GeoJsonObject, options: MaskOptions = {}): L.FeatureGroup {\n const rings = outerRings(geojson)\n if (!rings.length) {\n throw new Error('createMask() needs a GeoJSON Polygon or MultiPolygon')\n }\n\n // One polygon: the world as the outside, each region as a hole\n const shade = L.polygon([WORLD_RING, ...rings], {\n stroke: false,\n fillColor: options.fillColor ?? '#000',\n fillOpacity: options.fillOpacity ?? 0.5,\n interactive: false,\n })\n const layers: L.Layer[] = [shade]\n\n if (options.outline !== false) {\n layers.push(\n L.polyline(\n rings.map((ring) => [...ring, ring[0]]),\n { color: options.color ?? '#3388ff', weight: options.weight ?? 2, interactive: false },\n ),\n )\n }\n\n const group = L.featureGroup(layers)\n const bounds = L.latLngBounds(rings.flat())\n group.getBounds = () => bounds\n return group\n }\n\n /**\n * Add a mask to the map. By default the view is fitted to the region.\n */\n addMask(geojson: GeoJSON.GeoJsonObject, options: MaskOptions = {}): L.FeatureGroup {\n const mask = this.createMask(geojson, options)\n\n if (options.restrict) {\n // Give the bounds back when the mask goes away, or the map stays locked\n const previous = this.map.options.maxBounds\n mask.once('remove', () => this.map.setMaxBounds(previous as L.LatLngBoundsExpression))\n this.map.setMaxBounds(mask.getBounds())\n }\n\n this.place(mask, options.id)\n if (options.fit !== false) {\n this.map.fitBounds(mask.getBounds())\n }\n return mask\n }\n\n // ============ Points ============\n\n /**\n * Build a layer of many points, drawn on canvas.\n * Suitable for tens of thousands of points, where one marker per point would be too slow.\n */\n createPointLayer<T extends PointInput>(\n points: T[],\n options: PointLayerOptions<T> = {},\n ): L.FeatureGroup {\n const canvas = this.canvas()\n const { style, tooltip, onClick } = options\n const interactive = !!(tooltip || onClick)\n const group = L.featureGroup()\n\n points.forEach((point, index) => {\n const marker = L.circleMarker(L.latLng(point as L.LatLngExpression), {\n radius: options.radius ?? 4,\n weight: 1,\n color: '#fff',\n fillColor: '#3388ff',\n fillOpacity: 0.9,\n interactive,\n ...(typeof style === 'function' ? style(point, index) : style),\n ...canvas,\n })\n if (tooltip) marker.bindTooltip(() => tooltip(point))\n if (onClick) marker.on('click', (e) => onClick(point, e))\n group.addLayer(marker)\n })\n\n return group\n }\n\n /**\n * Add a layer of many points to the map\n */\n addPoints<T extends PointInput>(points: T[], options: PointLayerOptions<T> = {}): L.FeatureGroup {\n return this.place(this.createPointLayer(points, options), options.id)\n }\n\n // ============ Clusters ============\n\n /**\n * Build a layer of points that merge into counted bubbles when zoomed out.\n * Use it when there are too many points to tell apart at low zoom.\n */\n createCluster<T extends PointInput>(\n points: T[],\n options: ClusterOptions<T> = {},\n ): ClusterLayer<T> {\n return new ClusterLayer(points, options, this.canvas())\n }\n\n /**\n * Add a clustered point layer to the map\n */\n addCluster<T extends PointInput>(points: T[], options: ClusterOptions<T> = {}): ClusterLayer<T> {\n return this.place(this.createCluster(points, options), options.id)\n }\n}\n","import * as L from 'leaflet'\nimport type { LayerManager } from './layer'\nimport type {\n AttributionOptions,\n ControlOptions,\n ControlType,\n LayersControlOptions,\n OverlaysControlOptions,\n TileType,\n} from '../types'\n\n/** What the base-map switcher needs from the map it belongs to */\nexport interface TileHost {\n setTileLayer(type: TileType | TileType[]): unknown\n getTileType(): TileType[]\n onTileChange(handler: () => void): void\n}\n\nconst sameTypes = (a: TileType[], b: TileType[]) =>\n a.length === b.length && a.every((type, i) => type === b[i])\n\nexport class ControlManager {\n private map: L.Map\n private host?: TileHost\n private controls = new Map<string, L.Control>()\n private layers?: LayerManager\n private refreshLayers: (() => void) | null = null\n private refreshOverlays: (() => void) | null = null\n\n constructor(map: L.Map, host?: TileHost, layers?: LayerManager) {\n this.map = map\n this.host = host\n this.layers = layers\n host?.onTileChange(() => this.refreshLayers?.())\n layers?.onChange(() => this.refreshOverlays?.())\n }\n\n /**\n * Add a control by type. Adding the same type again replaces the previous one.\n */\n add(type: 'layers', options: LayersControlOptions): L.Control\n add(type: 'overlays', options?: OverlaysControlOptions): L.Control\n add(\n type: 'attribution' | 'zoom' | 'scale',\n options?: ControlOptions & AttributionOptions,\n ): L.Control\n add(type: ControlType, options?: any): L.Control {\n this.remove(type)\n\n let control: L.Control\n\n switch (type) {\n case 'attribution': {\n const attrControl = L.control.attribution({ prefix: options?.prefix ?? '' })\n attrControl.addAttribution(\n options?.content ?? 'smap-leaflet &copy; <a href=\"https://github.com\">SMap</a>',\n )\n control = attrControl\n break\n }\n case 'zoom': {\n control = L.control.zoom({\n position: options?.position ?? 'topright',\n ...options,\n })\n break\n }\n case 'scale': {\n control = L.control.scale({\n position: options?.position ?? 'bottomleft',\n ...options,\n })\n break\n }\n case 'layers': {\n control = this.createLayersControl(options)\n break\n }\n case 'overlays': {\n control = this.createOverlaysControl(options ?? {})\n break\n }\n default:\n throw new Error(`Unknown control type: ${type}`)\n }\n\n control.addTo(this.map)\n this.controls.set(type, control)\n return control\n }\n\n /** Base-map switcher: one button per entry, the current one highlighted */\n private createLayersControl(options: LayersControlOptions): L.Control {\n const host = this.host\n if (!host) {\n throw new Error('The \"layers\" control is only available through smap.control')\n }\n if (!options?.options?.length) {\n throw new Error('The \"layers\" control needs a non-empty `options` list')\n }\n\n const entries = options.options.map((entry) => ({\n label: entry.label,\n types: Array.isArray(entry.tileType) ? entry.tileType : [entry.tileType],\n }))\n\n const control = new L.Control({ position: options.position ?? 'topright' })\n control.onAdd = () => {\n const container = L.DomUtil.create('div', 'smap-layers leaflet-bar')\n container.setAttribute('role', 'group')\n L.DomEvent.disableClickPropagation(container)\n L.DomEvent.disableScrollPropagation(container)\n\n const buttons = entries.map((entry) => {\n const button = L.DomUtil.create('button', 'smap-layers-item', container)\n button.type = 'button'\n button.textContent = entry.label\n button.addEventListener('click', () => host.setTileLayer(entry.types))\n return button\n })\n\n this.refreshLayers = () => {\n const current = host.getTileType()\n buttons.forEach((button, i) => {\n const active = sameTypes(entries[i].types, current)\n button.classList.toggle('is-active', active)\n button.setAttribute('aria-pressed', String(active))\n })\n }\n this.refreshLayers()\n return container\n }\n control.onRemove = () => {\n this.refreshLayers = null\n }\n return control\n }\n\n /** Switches for the layers registered in `smap.layer` */\n private createOverlaysControl(options: OverlaysControlOptions): L.Control {\n const layers = this.layers\n if (!layers) {\n throw new Error('The \"overlays\" control is only available through smap.control')\n }\n\n const control = new L.Control({ position: options.position ?? 'topright' })\n control.onAdd = () => {\n const container = L.DomUtil.create('div', 'smap-overlays leaflet-bar')\n L.DomEvent.disableClickPropagation(container)\n L.DomEvent.disableScrollPropagation(container)\n\n if (options.title) {\n L.DomUtil.create('div', 'smap-overlays-title', container).textContent = options.title\n }\n const list = L.DomUtil.create('div', 'smap-overlays-list', container)\n\n this.refreshOverlays = () => {\n list.textContent = ''\n const items = options.items ?? layers.ids().map((id) => ({ id, label: id }))\n for (const item of items) {\n const row = L.DomUtil.create('label', 'smap-overlays-item', list)\n const box = L.DomUtil.create('input', '', row)\n box.type = 'checkbox'\n box.checked = layers.isVisible(item.id)\n // Listed but not registered (yet): shown, but nothing to switch\n box.disabled = !layers.has(item.id)\n box.addEventListener('change', () => layers.toggle(item.id, box.checked))\n L.DomUtil.create('span', '', row).textContent = item.label\n }\n container.classList.toggle('is-empty', !items.length)\n }\n this.refreshOverlays()\n return container\n }\n control.onRemove = () => {\n this.refreshOverlays = null\n }\n return control\n }\n\n /**\n * Remove a control by type\n */\n remove(type: string): void {\n const control = this.controls.get(type)\n if (control) {\n control.remove()\n this.controls.delete(type)\n }\n }\n\n /**\n * Remove all managed controls\n */\n removeAll(): void {\n for (const [, control] of this.controls) {\n control.remove()\n }\n this.controls.clear()\n }\n}\n","import type * as L from 'leaflet'\nimport type {\n SearchParams,\n GeocodeParams,\n ReverseGeocodeParams,\n AdministrativeParams,\n TdtSearchResult,\n TdtGeocodeResult,\n TdtReverseGeocodeResult,\n TdtAdministrativeResult,\n TdtIpLocationResult,\n} from '../types'\n\nconst BASE_API = 'https://api.tianditu.gov.cn'\n\nexport interface ServiceContext {\n /** Map whose current view scopes `search()` */\n map?: L.Map\n /** Default TianDiTu key, used when a call does not pass `tk` */\n key?: string | (() => string | undefined)\n}\n\n/**\n * TianDiTu web services.\n *\n * `smap.service` is bound to its map and to `tdtKey`, so calls need neither.\n * A standalone `new ServiceClient()` must be given `tk` (and, for `search`,\n * a map or `mapBound` + `level`) on every call.\n */\nexport class ServiceClient {\n private context: ServiceContext\n\n constructor(context: ServiceContext = {}) {\n this.context = context\n }\n\n /**\n * POI keyword search within the map's current view\n */\n search(params: SearchParams): Promise<TdtSearchResult>\n /** @deprecated Pass only `params`; `smap.service` already knows its map */\n search(map: L.Map, params: SearchParams): Promise<TdtSearchResult>\n async search(mapOrParams: L.Map | SearchParams, maybeParams?: SearchParams) {\n const params = (maybeParams ?? mapOrParams) as SearchParams\n const map = maybeParams ? (mapOrParams as L.Map) : this.context.map\n\n let { level, mapBound } = params\n if (map) {\n const bounds = map.getBounds()\n level ??= map.getZoom()\n mapBound ??= [bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth()].join(\n ',',\n )\n }\n if (level == null || !mapBound) {\n throw new Error('search() needs a map, or both `level` and `mapBound`')\n }\n\n const postStr = JSON.stringify({\n level,\n mapBound,\n queryType: params.queryType ?? 1,\n start: params.start ?? 0,\n count: params.count ?? 10,\n keyWord: params.keyword,\n })\n\n return this.request<TdtSearchResult>(`${BASE_API}/v2/search`, {\n postStr,\n type: 'query',\n tk: this.resolveKey(params.tk),\n })\n }\n\n /**\n * Geocoding: address → coordinates\n */\n async geocode(params: GeocodeParams): Promise<TdtGeocodeResult> {\n const { tk, ...query } = params\n return this.request(`${BASE_API}/geocoder`, {\n ds: JSON.stringify(query),\n tk: this.resolveKey(tk),\n })\n }\n\n /**\n * Reverse geocoding: coordinates → address\n */\n async reverseGeocode(params: ReverseGeocodeParams): Promise<TdtReverseGeocodeResult> {\n const { tk, ...query } = params\n return this.request(`${BASE_API}/geocoder`, {\n type: 'geocode',\n postStr: JSON.stringify({ ...query, ver: query.ver ?? 1 }),\n tk: this.resolveKey(tk),\n })\n }\n\n /**\n * Administrative district query (TianDiTu v2 API)\n */\n async getAdministrative(params: AdministrativeParams): Promise<TdtAdministrativeResult> {\n const keyword = params.keyword ?? params.searchWord\n if (!keyword) {\n throw new Error('getAdministrative() needs a `keyword`')\n }\n return this.request(`${BASE_API}/v2/administrative`, {\n keyword,\n childLevel: String(params.childLevel ?? 0),\n extensions: String(params.extensions ?? false),\n tk: this.resolveKey(params.tk),\n })\n }\n\n /**\n * Get location by IP (no key required)\n */\n async getLocationByIp(): Promise<TdtIpLocationResult> {\n const response = await fetch('https://map.tianditu.gov.cn/data/getCityName')\n if (!response.ok) {\n throw new Error(`IP location request failed: ${response.status}`)\n }\n return response.json()\n }\n\n private resolveKey(tk?: string): string {\n const fallback = this.context.key\n const key = tk || (typeof fallback === 'function' ? fallback() : fallback)\n if (!key) {\n throw new Error('TianDiTu key is missing: pass `tk`, or set `tdtKey` on the map')\n }\n return key\n }\n\n private async request<T>(url: string, params: Record<string, string>): Promise<T> {\n const searchParams = new URLSearchParams(params)\n const fullUrl = `${url}?${searchParams.toString()}`\n\n const response = await fetch(fullUrl)\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText}`)\n }\n return response.json()\n }\n}\n","import * as L from 'leaflet'\nimport type { ContextMenuContext, ContextMenuItem, ContextMenuItems } from '../types'\n\n/**\n * Right-click menus for the map and for individual layers.\n */\nexport class ContextMenu {\n private map: L.Map\n private mapItems: ContextMenuItems | null = null\n private bound = new Map<L.Layer, (e: L.LeafletMouseEvent) => void>()\n private el: HTMLElement | null = null\n\n constructor(map: L.Map) {\n this.map = map\n this.map.on('click movestart zoomstart resize', this.hide, this)\n document.addEventListener('pointerdown', this.onPointerDown, true)\n document.addEventListener('keydown', this.onKeyDown)\n }\n\n /** Set the menu shown when right-clicking the map itself. Pass null to remove it */\n setItems(items: ContextMenuItems | null): void {\n // Only listen while there is a menu: a `contextmenu` listener on the map\n // suppresses the browser's own menu.\n this.map.off('contextmenu', this.onMapContextMenu, this)\n this.mapItems = items\n if (items) {\n this.map.on('contextmenu', this.onMapContextMenu, this)\n }\n }\n\n /** Give a layer its own menu. Returns a function that removes it again */\n bind(layer: L.Layer, items: ContextMenuItems): () => void {\n this.unbind(layer)\n const handler = (e: L.LeafletMouseEvent) => {\n // Keep the map's own menu from opening on top of this one\n L.DomEvent.stopPropagation(e as any)\n e.originalEvent?.preventDefault()\n this.open(items, { latlng: e.latlng, containerPoint: e.containerPoint, layer })\n }\n layer.on('contextmenu', handler as L.LeafletEventHandlerFn)\n this.bound.set(layer, handler)\n return () => this.unbind(layer)\n }\n\n unbind(layer: L.Layer): void {\n const handler = this.bound.get(layer)\n if (handler) {\n layer.off('contextmenu', handler as L.LeafletEventHandlerFn)\n this.bound.delete(layer)\n }\n }\n\n /** Close the menu if it is open */\n hide(): void {\n this.el?.remove()\n this.el = null\n }\n\n destroy(): void {\n this.hide()\n this.setItems(null)\n for (const layer of [...this.bound.keys()]) {\n this.unbind(layer)\n }\n this.map.off('click movestart zoomstart resize', this.hide, this)\n document.removeEventListener('pointerdown', this.onPointerDown, true)\n document.removeEventListener('keydown', this.onKeyDown)\n }\n\n private onMapContextMenu(e: L.LeafletMouseEvent): void {\n if (this.mapItems) {\n this.open(this.mapItems, { latlng: e.latlng, containerPoint: e.containerPoint })\n }\n }\n\n private onPointerDown = (e: Event) => {\n if (this.el && !this.el.contains(e.target as Node)) this.hide()\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this.hide()\n }\n\n private open(source: ContextMenuItems, at: Omit<ContextMenuContext, 'map'>): void {\n this.hide()\n const context: ContextMenuContext = { ...at, map: this.map }\n const items = typeof source === 'function' ? source(context) : source\n if (!items.length) return\n\n const el = L.DomUtil.create('div', 'smap-contextmenu')\n el.setAttribute('role', 'menu')\n L.DomEvent.disableClickPropagation(el)\n L.DomEvent.disableScrollPropagation(el)\n el.addEventListener('contextmenu', (e) => e.preventDefault())\n\n items.forEach((item) => el.appendChild(this.renderItem(item, context)))\n\n const container = this.map.getContainer()\n container.appendChild(el)\n this.el = el\n\n // Keep the menu inside the map\n const left = Math.max(0, Math.min(at.containerPoint.x, container.clientWidth - el.offsetWidth))\n const top = Math.max(0, Math.min(at.containerPoint.y, container.clientHeight - el.offsetHeight))\n el.style.left = `${left}px`\n el.style.top = `${top}px`\n }\n\n private renderItem(item: ContextMenuItem, context: ContextMenuContext): HTMLElement {\n if (item === '-') {\n const separator = L.DomUtil.create('div', 'smap-contextmenu-separator')\n separator.setAttribute('role', 'separator')\n return separator\n }\n\n const button = L.DomUtil.create('button', 'smap-contextmenu-item')\n button.type = 'button'\n button.setAttribute('role', 'menuitem')\n button.textContent = item.text\n button.disabled = !!item.disabled\n if (item.danger) button.classList.add('is-danger')\n button.addEventListener('click', () => {\n this.hide()\n item.onClick?.(context)\n })\n return button\n }\n}\n","import type { LocationOptions, LocationResult } from '../types'\n\nconst DEFAULT_OPTIONS: LocationOptions = {\n timeout: 3000,\n enableHighAccuracy: false,\n}\n\n/**\n * HTML5 Geolocation API wrapper\n */\nexport function getLocation(options?: LocationOptions): Promise<LocationResult> {\n const { timeout, enableHighAccuracy } = { ...DEFAULT_OPTIONS, ...options }\n\n return new Promise((resolve, reject) => {\n if (!navigator.geolocation) {\n reject(new Error('浏览器不支持 HTML5 定位'))\n return\n }\n\n // Declared first: an implementation may call back before watchPosition returns\n let id = -1\n id = navigator.geolocation.watchPosition(\n (position) => {\n navigator.geolocation.clearWatch(id)\n const { latitude, longitude, accuracy } = position.coords\n resolve({ latitude, longitude, accuracy })\n },\n (error) => {\n navigator.geolocation.clearWatch(id)\n const messages: Record<number, string> = {\n [error.PERMISSION_DENIED]: '定位权限被拒绝',\n [error.POSITION_UNAVAILABLE]: '位置信息不可用',\n [error.TIMEOUT]: '定位超时',\n }\n reject(new Error(messages[error.code] || '定位未知错误'))\n },\n { enableHighAccuracy, timeout, maximumAge: 0 },\n )\n })\n}\n","import * as L from 'leaflet'\nimport type { ExportImageOptions } from '../types'\n\n/**\n * Load an image in a way that lets a canvas read it back.\n * Tiles on the map were loaded without CORS, so they have to be fetched again.\n */\nfunction loadForCanvas(src: string): Promise<HTMLImageElement> {\n const attempt = (url: string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image()\n image.crossOrigin = 'anonymous'\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error(src))\n image.src = url\n })\n // The browser may answer from its cache with the earlier, non-CORS response;\n // a throwaway parameter forces a fresh request.\n return attempt(src).catch(() =>\n attempt(`${src}${src.includes('?') ? '&' : '?'}_cors=${Date.now()}`),\n )\n}\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host\n } catch {\n return url\n }\n}\n\n/** The library's own HTML elements that are simple enough to redraw on a canvas */\nconst OWN_ELEMENTS = ['.smap-measure-label', '.smap-cluster', '.smap-draw-marker']\n/** Parts of them that belong to the screen only */\nconst SCREEN_ONLY = '.smap-measure-remove'\n\nfunction isTransparent(color: string): boolean {\n return !color || color === 'transparent' || /,\\s*0\\)$|\\/\\s*0\\)$/.test(color)\n}\n\nfunction roundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n radius: number,\n): void {\n const r = Math.max(0, Math.min(radius, w / 2, h / 2))\n ctx.beginPath()\n ctx.moveTo(x + r, y)\n ctx.arcTo(x + w, y, x + w, y + h, r)\n ctx.arcTo(x + w, y + h, x, y + h, r)\n ctx.arcTo(x, y + h, x, y, r)\n ctx.arcTo(x, y, x + w, y, r)\n ctx.closePath()\n}\n\n/**\n * Redraw a simple HTML element: its box (background, border, rounded corners) and\n * its text, then its children. Enough for labels and badges; it is not a general\n * HTML renderer — no shadows, images, pseudo-elements or wrapped text.\n */\nfunction paintElement(ctx: CanvasRenderingContext2D, el: Element, origin: DOMRect): void {\n const style = getComputedStyle(el)\n if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) {\n return\n }\n const rect = el.getBoundingClientRect()\n const x = rect.left - origin.left\n const y = rect.top - origin.top\n if (rect.width > 0 && rect.height > 0) {\n const corner = style.borderTopLeftRadius\n const radius = corner.endsWith('%')\n ? (Math.min(rect.width, rect.height) * parseFloat(corner)) / 100\n : parseFloat(corner) || 0\n\n if (!isTransparent(style.backgroundColor)) {\n roundedRect(ctx, x, y, rect.width, rect.height, radius)\n ctx.fillStyle = style.backgroundColor\n ctx.fill()\n }\n const border = parseFloat(style.borderTopWidth) || 0\n if (border > 0 && style.borderTopStyle !== 'none' && !isTransparent(style.borderTopColor)) {\n roundedRect(\n ctx,\n x + border / 2,\n y + border / 2,\n rect.width - border,\n rect.height - border,\n radius - border / 2,\n )\n ctx.lineWidth = border\n ctx.strokeStyle = style.borderTopColor\n ctx.stroke()\n }\n }\n\n for (const node of el.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim()\n if (!text) continue\n const range = document.createRange()\n range.selectNodeContents(node)\n const box = range.getBoundingClientRect()\n ctx.font = `${style.fontStyle} ${style.fontWeight} ${style.fontSize} ${style.fontFamily}`\n ctx.fillStyle = style.color\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(\n text,\n box.left - origin.left + box.width / 2,\n box.top - origin.top + box.height / 2,\n )\n } else if (node instanceof Element && !node.matches(SCREEN_ONLY)) {\n paintElement(ctx, node, origin)\n }\n }\n}\n\n/** Resolve once every tile layer has finished loading, or after `timeout` ms */\nfunction tilesReady(map: L.Map, timeout: number): Promise<void> {\n const pending: Promise<void>[] = []\n map.eachLayer((layer) => {\n if (layer instanceof L.GridLayer && layer.isLoading()) {\n pending.push(new Promise((resolve) => layer.once('load', () => resolve())))\n }\n })\n if (!pending.length) return Promise.resolve()\n return Promise.race([\n Promise.all(pending).then(() => undefined),\n new Promise<void>((resolve) => setTimeout(resolve, timeout)),\n ])\n}\n\n/** Stacking order of an element inside the map: its own z-index, else its parents' */\nfunction zIndexOf(el: Element, root: Element): number {\n for (let node: Element | null = el; node && node !== root; node = node.parentElement) {\n const z = Number((node as HTMLElement).style.zIndex)\n if (z) return z\n }\n return 0\n}\n\n/**\n * Render the map as it is currently shown into an image.\n *\n * Included: base map tiles; everything drawn by a vector renderer (lines, polygons,\n * circles, point layers); and the library's own labels and badges — measurement\n * labels, cluster bubbles, drawn markers — plus any simple elements named in\n * `include`. Not included: other HTML — custom marker icons, popups, tooltips, controls.\n */\nexport async function exportMapImage(map: L.Map, options: ExportImageOptions = {}): Promise<Blob> {\n // Exporting half-loaded tiles would give a patchy or blank picture\n await tilesReady(map, options.timeout ?? 8000)\n\n const container = map.getContainer()\n const origin = container.getBoundingClientRect()\n const size = map.getSize()\n const scale = options.scale ?? Math.min(window.devicePixelRatio || 1, 2)\n\n const canvas = document.createElement('canvas')\n canvas.width = Math.round(size.x * scale)\n canvas.height = Math.round(size.y * scale)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('Canvas is not available in this environment')\n ctx.scale(scale, scale)\n ctx.fillStyle = options.background ?? '#ffffff'\n ctx.fillRect(0, 0, size.x, size.y)\n\n const place = (el: Element) => {\n const rect = el.getBoundingClientRect()\n return { x: rect.left - origin.left, y: rect.top - origin.top, w: rect.width, h: rect.height }\n }\n const visible = (box: { x: number; y: number; w: number; h: number }) =>\n box.w > 0 &&\n box.h > 0 &&\n box.x < size.x &&\n box.y < size.y &&\n box.x + box.w > 0 &&\n box.y + box.h > 0\n\n // ---- Tiles, bottom layer first\n const tiles = [...container.querySelectorAll<HTMLImageElement>('img.leaflet-tile-loaded')]\n .map((img, order) => ({ img, order, box: place(img), z: zIndexOf(img, container) }))\n .filter((tile) => visible(tile.box))\n .sort((a, b) => a.z - b.z || a.order - b.order)\n\n const loaded = await Promise.all(\n tiles.map((tile) =>\n loadForCanvas(tile.img.src).catch(() => {\n throw new Error(\n `Cannot export the map: tiles from ${hostOf(tile.img.src)} do not allow cross-origin reading`,\n )\n }),\n ),\n )\n tiles.forEach(({ img, box }, i) => {\n // The layer's own opacity only. A tile's opacity is its fade-in animation, which\n // stands still while the page is not being rendered (a background tab).\n const layer = img.closest<HTMLElement>('.leaflet-layer')\n ctx.globalAlpha = Number(layer?.style.opacity || 1)\n ctx.drawImage(loaded[i], box.x, box.y, box.w, box.h)\n })\n ctx.globalAlpha = 1\n\n // Leaflet's canvas renderer repaints on the next animation frame, and there may\n // be no next frame for a while (again: a background tab). Paint what is pending now.\n map.eachLayer((layer) => {\n const renderer = layer as any\n if (layer instanceof L.Canvas && renderer._redrawRequest) renderer._redraw()\n })\n\n // ---- Vector renderers: canvases as they are, SVGs through an image\n for (const el of container.querySelectorAll<HTMLCanvasElement | SVGSVGElement>(\n '.leaflet-pane > canvas, .leaflet-pane > svg',\n )) {\n const box = place(el)\n if (!visible(box)) continue\n if (el instanceof HTMLCanvasElement) {\n ctx.drawImage(el, box.x, box.y, box.w, box.h)\n } else {\n const xml = new XMLSerializer().serializeToString(el)\n const url = URL.createObjectURL(new Blob([xml], { type: 'image/svg+xml' }))\n try {\n ctx.drawImage(await loadForCanvas(url), box.x, box.y, box.w, box.h)\n } finally {\n URL.revokeObjectURL(url)\n }\n }\n }\n\n // ---- Labels and badges, in document order so later ones end up on top\n const selectors = [...(options.labels === false ? [] : OWN_ELEMENTS), ...(options.include ?? [])]\n if (selectors.length) {\n for (const el of container.querySelectorAll(selectors.join(','))) {\n // An element nested in another matched one is painted with its parent\n if (el.parentElement?.closest(selectors.join(','))) continue\n if (!visible(place(el))) continue\n paintElement(ctx, el, origin)\n }\n }\n\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('Failed to encode the image'))),\n options.type ?? 'image/png',\n options.quality,\n )\n })\n}\n\n/** Offer a blob to the user as a file download */\nexport function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n link.click()\n // Give the browser a moment to start the download before the URL goes away\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n}\n","import type * as L from 'leaflet'\n\nconst EARTH_RADIUS = 6378137\nconst DEG = Math.PI / 180\n\n/** Area of a ring on the sphere, in square metres */\nexport function geodesicArea(latlngs: L.LatLng[]): number {\n const n = latlngs.length\n if (n < 3) return 0\n let area = 0\n for (let i = 0; i < n; i++) {\n const a = latlngs[i]\n const b = latlngs[(i + 1) % n]\n area += (b.lng - a.lng) * DEG * (2 + Math.sin(a.lat * DEG) + Math.sin(b.lat * DEG))\n }\n return Math.abs((area * EARTH_RADIUS * EARTH_RADIUS) / 2)\n}\n\n/** Length of a path in metres */\nexport function pathLength(latlngs: L.LatLng[]): number {\n let distance = 0\n for (let i = 1; i < latlngs.length; i++) {\n distance += latlngs[i - 1].distanceTo(latlngs[i])\n }\n return distance\n}\n\nexport type LengthUnit = 'auto' | 'm' | 'km'\nexport type AreaUnit = 'auto' | 'm2' | 'km2' | 'ha' | 'mu'\n\n/** Square metres in one mu (亩) */\nconst MU = 2000 / 3\n\n/** `auto` picks metres or kilometres by size */\nexport function formatLength(meters: number, unit: LengthUnit = 'auto'): string {\n if (unit === 'km' || (unit === 'auto' && meters >= 1000)) {\n return `${(meters / 1000).toFixed(2)} km`\n }\n return `${meters.toFixed(1)} m`\n}\n\n/** `auto` picks m² or km² by size; `ha` is hectares (公顷), `mu` is 亩 */\nexport function formatArea(sqMeters: number, unit: AreaUnit = 'auto'): string {\n switch (unit) {\n case 'ha':\n return `${(sqMeters / 1e4).toFixed(2)} 公顷`\n case 'mu':\n return `${(sqMeters / MU).toFixed(2)} 亩`\n case 'km2':\n return `${(sqMeters / 1e6).toFixed(2)} km²`\n case 'm2':\n return `${sqMeters.toFixed(1)} m²`\n default:\n return sqMeters >= 1e6 ? `${(sqMeters / 1e6).toFixed(2)} km²` : `${sqMeters.toFixed(1)} m²`\n }\n}\n","/**\n * Texts shown next to the cursor while drawing and editing.\n * Assign to the fields to translate or reword them.\n */\nexport const sketchText = {\n marker: {\n start: '单击地图放置标记',\n },\n polyline: {\n start: '单击开始绘制线',\n next: '单击继续绘制',\n finish: '再次单击最后一个点完成',\n },\n polygon: {\n start: '单击开始绘制多边形',\n next: '单击继续绘制',\n finish: '单击第一个点闭合',\n },\n rectangle: {\n start: '按住拖动绘制矩形,或单击确定第一个角',\n finish: '松开完成,或再次单击确定对角',\n },\n circle: {\n start: '按住拖动绘制圆,或单击确定圆心',\n finish: '松开完成,或再次单击确定半径',\n radius: '半径',\n },\n /** {n} is replaced by the number of points required */\n tooFewPoints: '至少需要 {n} 个点',\n cancel: '按 Esc 取消',\n edit: '拖动圆点调整形状;单击顶点可删除',\n}\n","/**\n * Drawing interactions, one class per kind of shape.\n *\n * A drawer listens to the map, shows a preview, and hands over a finished Leaflet\n * layer. It knows nothing about tools, results or events — that is DrawSession's job.\n */\nimport * as L from 'leaflet'\nimport { formatLength } from './geometry'\nimport type { Hint } from './hint'\nimport { sketchText } from './text'\n\nexport type SketchType = 'marker' | 'polyline' | 'polygon' | 'rectangle' | 'circle'\n\nexport interface SketchOptions {\n /** Style of lines and areas */\n shapeOptions?: L.PathOptions\n /** Icon of a drawn marker */\n markerIcon?: L.Icon | L.DivIcon\n /** Icon of the vertices shown while drawing a line or polygon */\n vertexIcon?: L.Icon | L.DivIcon\n /** Adjusts a position to nearby geometry; returns the input when nothing is close */\n snap?: (latlng: L.LatLng) => L.LatLng\n}\n\nexport interface DrawerHost {\n map: L.Map\n options: SketchOptions\n hint: Hint\n /** The shape is done */\n finish(layer: L.Layer): void\n /** A vertex was added to a line / polygon */\n vertex(latlngs: L.LatLng[]): void\n}\n\n/** Clicking this close (px) to a vertex counts as clicking the vertex */\nconst SNAP = 8\n/** Moving less than this (px) between press and release is a click, not a drag */\nconst DRAG_THRESHOLD = 6\n\nexport function vertexIcon(\n kind: 'vertex' | 'mid' | 'move' | 'resize' | 'snap' = 'vertex',\n): L.DivIcon {\n return L.divIcon({\n className: `smap-vertex smap-vertex--${kind}`,\n iconSize: [14, 14],\n iconAnchor: [7, 7],\n })\n}\n\nexport abstract class Drawer {\n protected host: DrawerHost\n protected map: L.Map\n /** Preview layers; removed as one when drawing ends */\n protected scratch: L.FeatureGroup\n /** Ring shown where the cursor has snapped to */\n private snapMark: L.Marker | null = null\n\n constructor(host: DrawerHost) {\n this.host = host\n this.map = host.map\n this.scratch = L.featureGroup()\n }\n\n enable(): void {\n this.scratch.addTo(this.map)\n this.map.getContainer().classList.add('smap-drawing')\n this.map.on('mousemove', this.trackHint, this)\n this.start()\n }\n\n disable(): void {\n this.stop()\n this.map.off('mousemove', this.trackHint, this)\n this.map.getContainer().classList.remove('smap-drawing')\n this.scratch.remove()\n }\n\n /** Start listening */\n protected abstract start(): void\n /** Stop listening and undo anything changed on the map */\n protected abstract stop(): void\n\n protected get shape(): L.PathOptions {\n return this.host.options.shapeOptions ?? {}\n }\n\n /** Style of the not-yet-committed part of a shape */\n protected get ghost(): L.PathOptions {\n return { ...this.shape, dashArray: '4 6', opacity: 0.75, interactive: false }\n }\n\n /** The position an event stands for: snapped to nearby geometry when there is some */\n protected resolve(e: L.LeafletMouseEvent): L.LatLng {\n const snapped = this.host.options.snap?.(e.latlng) ?? e.latlng\n this.markSnap(snapped !== e.latlng ? snapped : null)\n return snapped\n }\n\n private markSnap(latlng: L.LatLng | null): void {\n if (!latlng) {\n this.snapMark?.remove()\n this.snapMark = null\n } else if (this.snapMark) {\n this.snapMark.setLatLng(latlng)\n } else {\n this.snapMark = L.marker(latlng, {\n icon: vertexIcon('snap'),\n interactive: false,\n keyboard: false,\n }).addTo(this.scratch)\n }\n }\n\n private trackHint(e: L.LeafletMouseEvent): void {\n this.host.hint.move(e.containerPoint)\n // Show where a click would land before it happens\n if (this.host.options.snap) this.resolve(e)\n }\n}\n\n// ============ Marker ============\n\nexport class MarkerDrawer extends Drawer {\n protected start(): void {\n this.host.hint.set(sketchText.marker.start, sketchText.cancel)\n this.map.on('click', this.onClick, this)\n }\n\n protected stop(): void {\n this.map.off('click', this.onClick, this)\n }\n\n private onClick(e: L.LeafletMouseEvent): void {\n const icon = this.host.options.markerIcon\n this.host.finish(L.marker(this.resolve(e), icon ? { icon } : {}))\n }\n}\n\n// ============ Line and polygon: one click per vertex ============\n\nexport class PathDrawer extends Drawer {\n private closed: boolean\n private points: L.LatLng[] = []\n private line!: L.Polyline\n private guide!: L.Polyline\n private fill: L.Polygon | null = null\n private handles = L.layerGroup()\n private hadDoubleClickZoom = false\n\n constructor(host: DrawerHost, closed: boolean) {\n super(host)\n this.closed = closed\n }\n\n private get text() {\n return this.closed ? sketchText.polygon : sketchText.polyline\n }\n\n /** Fewest points that make a shape */\n private get min(): number {\n return this.closed ? 3 : 2\n }\n\n protected start(): void {\n this.line = L.polyline([], { ...this.shape, fill: false, interactive: false })\n this.guide = L.polyline([], { ...this.ghost, fill: false })\n this.scratch.addLayer(this.line).addLayer(this.guide).addLayer(this.handles)\n if (this.closed) {\n this.fill = L.polygon([], { ...this.shape, stroke: false, interactive: false })\n this.scratch.addLayer(this.fill)\n }\n\n // A double click must end the shape, not zoom the map\n this.hadDoubleClickZoom = this.map.doubleClickZoom.enabled()\n this.map.doubleClickZoom.disable()\n\n this.map.on('click', this.onClick, this)\n this.map.on('mousemove', this.onMove, this)\n document.addEventListener('keydown', this.onKey)\n this.host.hint.set(this.text.start, sketchText.cancel)\n }\n\n protected stop(): void {\n this.map.off('click', this.onClick, this)\n this.map.off('mousemove', this.onMove, this)\n document.removeEventListener('keydown', this.onKey)\n if (this.hadDoubleClickZoom) this.map.doubleClickZoom.enable()\n }\n\n private near(point: L.Point, latlng: L.LatLng): boolean {\n return this.map.latLngToContainerPoint(latlng).distanceTo(point) <= SNAP\n }\n\n private onClick(e: L.LeafletMouseEvent): void {\n const { points } = this\n const latlng = this.resolve(e)\n // On a vertex: within reach of it, or snapped onto the very same position\n // (snapping can pull a slightly-off click onto geometry lying under the vertex)\n const hits = (vertex: L.LatLng) => this.near(e.containerPoint, vertex) || latlng.equals(vertex)\n\n if (points.length) {\n // The second click of a double click lands on the vertex just placed\n if (hits(points[points.length - 1])) return this.tryFinish()\n if (this.closed && hits(points[0])) return this.tryFinish()\n }\n this.add(latlng)\n }\n\n private add(latlng: L.LatLng): void {\n this.points.push(latlng)\n this.redraw()\n this.host.vertex([...this.points])\n }\n\n private undo(): void {\n if (!this.points.length) return\n this.points.pop()\n this.guide.setLatLngs([])\n this.redraw()\n this.host.vertex([...this.points])\n }\n\n private tryFinish(): void {\n if (this.points.length < this.min) {\n this.host.hint.set(sketchText.tooFewPoints.replace('{n}', String(this.min)), '', true)\n return\n }\n const options = { ...this.shape }\n this.host.finish(\n this.closed ? L.polygon(this.points, options) : L.polyline(this.points, options),\n )\n }\n\n private redraw(): void {\n const { points } = this\n this.line.setLatLngs(points)\n\n this.handles.clearLayers()\n const icon = this.host.options.vertexIcon ?? vertexIcon()\n points.forEach((latlng, i) => {\n const isFirst = i === 0\n const isLast = i === points.length - 1\n const handle = L.marker(latlng, {\n icon,\n // Only the vertices that end the shape react to the mouse\n interactive: isLast || (this.closed && isFirst),\n keyboard: false,\n })\n if (isLast || (this.closed && isFirst)) handle.on('click', () => this.tryFinish())\n this.handles.addLayer(handle)\n })\n\n if (!points.length) this.host.hint.set(this.text.start, sketchText.cancel)\n else if (points.length < this.min) this.host.hint.set(this.text.next, sketchText.cancel)\n else this.host.hint.set(this.text.next, this.text.finish)\n }\n\n private onMove(e: L.LeafletMouseEvent): void {\n const { points } = this\n if (!points.length) return\n const last = points[points.length - 1]\n const to = this.resolve(e)\n // For a polygon the guide also shows the closing edge\n this.guide.setLatLngs(this.closed && points.length > 1 ? [last, to, points[0]] : [last, to])\n this.fill?.setLatLngs([...points, to])\n }\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === 'Enter') this.tryFinish()\n else if (e.key === 'Backspace') this.undo()\n }\n}\n\n// ============ Rectangle and circle: press-drag-release, or click twice ============\n\nabstract class TwoPointDrawer extends Drawer {\n protected origin: L.LatLng | null = null\n private originPoint: L.Point | null = null\n /** The button is down since the origin was set */\n private pressing = false\n private dragged = false\n /** The click that set the origin has been seen; the next click finishes */\n private armed = false\n private hadDragging = false\n\n protected abstract get text(): { start: string; finish: string }\n /** Create the preview once the origin is known */\n protected abstract begin(origin: L.LatLng): void\n /** Update the preview */\n protected abstract update(origin: L.LatLng, to: L.LatLng): void\n /** The finished layer, or null if it has no size yet */\n protected abstract build(origin: L.LatLng, to: L.LatLng): L.Layer | null\n\n protected start(): void {\n // Dragging has to draw, not pan\n this.hadDragging = this.map.dragging.enabled()\n this.map.dragging.disable()\n\n this.map.on('mousedown', this.onDown, this)\n this.map.on('mousemove', this.onMove, this)\n this.map.on('mouseup', this.onUp, this)\n this.map.on('click', this.onClick, this)\n this.host.hint.set(this.text.start, sketchText.cancel)\n }\n\n protected stop(): void {\n this.map.off('mousedown', this.onDown, this)\n this.map.off('mousemove', this.onMove, this)\n this.map.off('mouseup', this.onUp, this)\n this.map.off('click', this.onClick, this)\n if (this.hadDragging) this.map.dragging.enable()\n }\n\n private setOrigin(e: L.LeafletMouseEvent): void {\n this.origin = this.resolve(e)\n this.originPoint = e.containerPoint\n this.begin(this.origin)\n this.host.hint.set(this.text.finish, sketchText.cancel)\n }\n\n private onDown(e: L.LeafletMouseEvent): void {\n if (this.origin) return\n this.setOrigin(e)\n this.pressing = true\n this.dragged = false\n }\n\n private onMove(e: L.LeafletMouseEvent): void {\n if (!this.origin) return\n this.update(this.origin, this.resolve(e))\n if (this.pressing && this.originPoint!.distanceTo(e.containerPoint) > DRAG_THRESHOLD) {\n this.dragged = true\n }\n }\n\n private onUp(e: L.LeafletMouseEvent): void {\n const wasDrag = this.pressing && this.dragged\n this.pressing = false\n if (wasDrag) this.complete(this.resolve(e))\n }\n\n private onClick(e: L.LeafletMouseEvent): void {\n if (!this.origin) {\n // No press was seen first: a tap on a touch screen\n this.setOrigin(e)\n this.armed = true\n } else if (!this.armed) {\n // The click that belongs to the press which set the origin\n this.armed = true\n } else {\n this.complete(this.resolve(e))\n }\n }\n\n private complete(to: L.LatLng): void {\n const layer = this.build(this.origin!, to)\n if (layer) this.host.finish(layer)\n }\n}\n\nexport class RectangleDrawer extends TwoPointDrawer {\n private preview: L.Rectangle | null = null\n\n protected get text() {\n return sketchText.rectangle\n }\n\n protected begin(origin: L.LatLng): void {\n this.preview = L.rectangle(L.latLngBounds(origin, origin), {\n ...this.shape,\n interactive: false,\n })\n this.scratch.addLayer(this.preview)\n }\n\n protected update(origin: L.LatLng, to: L.LatLng): void {\n this.preview?.setBounds(L.latLngBounds(origin, to))\n }\n\n protected build(origin: L.LatLng, to: L.LatLng): L.Layer | null {\n if (origin.lat === to.lat || origin.lng === to.lng) return null\n return L.rectangle(L.latLngBounds(origin, to), { ...this.shape })\n }\n}\n\nexport class CircleDrawer extends TwoPointDrawer {\n private preview: L.Circle | null = null\n\n protected get text() {\n return sketchText.circle\n }\n\n protected begin(origin: L.LatLng): void {\n this.preview = L.circle(origin, { ...this.shape, radius: 0, interactive: false })\n this.scratch.addLayer(this.preview)\n }\n\n protected update(origin: L.LatLng, to: L.LatLng): void {\n const radius = origin.distanceTo(to)\n this.preview?.setRadius(radius)\n this.host.hint.set(this.text.finish, `${sketchText.circle.radius} ${formatLength(radius)}`)\n }\n\n protected build(origin: L.LatLng, to: L.LatLng): L.Layer | null {\n const radius = origin.distanceTo(to)\n if (!(radius > 0)) return null\n return L.circle(origin, { ...this.shape, radius })\n }\n}\n\nexport function createDrawer(type: SketchType, host: DrawerHost): Drawer {\n switch (type) {\n case 'marker':\n return new MarkerDrawer(host)\n case 'polyline':\n return new PathDrawer(host, false)\n case 'polygon':\n return new PathDrawer(host, true)\n case 'rectangle':\n return new RectangleDrawer(host)\n case 'circle':\n return new CircleDrawer(host)\n default:\n throw new Error(`Unknown draw type: ${type}`)\n }\n}\n","import * as L from 'leaflet'\n\n/** The little bubble that follows the cursor and says what to do next */\nexport class Hint {\n private el: HTMLElement\n private main: HTMLElement\n private sub: HTMLElement\n\n constructor(map: L.Map) {\n this.el = L.DomUtil.create('div', 'smap-draw-hint', map.getContainer())\n this.main = L.DomUtil.create('div', 'smap-draw-hint-main', this.el)\n this.sub = L.DomUtil.create('div', 'smap-draw-hint-sub', this.el)\n // Nothing to point at until the cursor has been seen (never, on touch screens)\n this.el.style.display = 'none'\n }\n\n set(text: string, sub = '', error = false): void {\n this.main.textContent = text\n this.sub.textContent = sub\n this.sub.style.display = sub ? '' : 'none'\n this.el.classList.toggle('is-error', error)\n }\n\n move(point: L.Point): void {\n this.el.style.display = ''\n this.el.style.transform = `translate(${Math.round(point.x) + 16}px, ${Math.round(point.y) + 16}px)`\n }\n\n remove(): void {\n this.el.remove()\n }\n}\n","/**\n * What measure and draw tools share: one drawing at a time on a map.\n */\nimport type * as L from 'leaflet'\nimport { createDrawer } from './sketch/drawers'\nimport type { Drawer, SketchOptions, SketchType } from './sketch/drawers'\nimport { Hint } from './sketch/hint'\n\nexport type { SketchOptions, SketchType }\n\n/** Colour shared by the default look of measure and draw tools */\nexport const DEFAULT_ACCENT = '#1f6feb'\n\n/**\n * Vertex handles and hints are styled in CSS through `--smap-accent`.\n * Point it at the colour of the tool that is about to draw, so they match its lines.\n */\nexport function applyAccent(map: L.Map, color: string | undefined): void {\n map.getContainer().style.setProperty('--smap-accent', color || DEFAULT_ACCENT)\n}\n\n/**\n * @deprecated Drawing no longer depends on leaflet-draw; there is nothing to load.\n * Kept so existing `await loadLeafletDraw()` / `Tool.preload()` calls keep working.\n */\nexport function loadLeafletDraw(): Promise<void> {\n return Promise.resolve()\n}\n\nexport interface DrawSessionHooks<T extends SketchType> {\n /** The shape was finished. Called before `stop` */\n created(layer: L.Layer, type: T): void\n /** A vertex was added to (or removed from) the line / polygon being drawn */\n vertex?(latlngs: L.LatLng[], type: T): void\n /** Drawing ended: finished, cancelled by the caller, or cancelled with Esc */\n stop(type: T, completed: boolean): void\n}\n\n/** Only one drawing can listen to a map's clicks at a time */\nconst activeSessions = new WeakMap<L.Map, DrawSession<any>>()\n\n/**\n * Draws one shape at a time.\n *\n * Each tool owns a session. Starting a drawing cancels whichever other drawing is\n * running on the same map, so several measure and draw tools can share a map.\n */\nexport class DrawSession<T extends SketchType> {\n private map: L.Map\n private hooks: DrawSessionHooks<T>\n private drawer: Drawer | null = null\n private hint: Hint | null = null\n private type: T | null = null\n\n constructor(map: L.Map, hooks: DrawSessionHooks<T>) {\n this.map = map\n this.hooks = hooks\n }\n\n /** Type being drawn, or null when idle */\n get active(): T | null {\n return this.type\n }\n\n /** Start drawing. A drawing already in progress on this map is cancelled first */\n start(type: T, options: SketchOptions, accent?: string): void {\n activeSessions.get(this.map)?.cancel()\n\n applyAccent(this.map, accent)\n const hint = new Hint(this.map)\n this.hint = hint\n this.type = type\n this.drawer = createDrawer(type, {\n map: this.map,\n options,\n hint,\n finish: (layer) => this.end(true, layer),\n vertex: (latlngs) => this.hooks.vertex?.(latlngs, type),\n })\n activeSessions.set(this.map, this)\n document.addEventListener('keydown', this.onKey)\n this.drawer.enable()\n }\n\n /** Abandon the drawing in progress */\n cancel(): void {\n this.end(false)\n }\n\n destroy(): void {\n this.cancel()\n }\n\n private end(completed: boolean, layer?: L.Layer): void {\n const { type, drawer } = this\n if (!type || !drawer) return\n\n // Idle before the hooks run, so a hook may start the next drawing\n this.type = null\n this.drawer = null\n drawer.disable()\n this.hint?.remove()\n this.hint = null\n document.removeEventListener('keydown', this.onKey)\n if (activeSessions.get(this.map) === this) activeSessions.delete(this.map)\n\n if (completed && layer) this.hooks.created(layer, type)\n this.hooks.stop(type, completed)\n }\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this.cancel()\n }\n}\n","export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","import mitt, { type Emitter } from 'mitt'\n\nexport type EventMap = Record<string, any>\n\nexport function createEmitter<T extends EventMap = EventMap>(): Emitter<T> {\n return mitt<T>()\n}\n","import * as L from 'leaflet'\nimport 'leaflet/dist/leaflet.css'\nimport 'proj4'\nimport 'proj4leaflet'\n\nimport type {\n SMapOptions,\n TileType,\n MeasureOptions,\n MeasureType,\n MeasureTool,\n SMapEvents,\n DrawOptions,\n ExportImageOptions,\n LocateOptions,\n LocateResult,\n} from './types'\n\nimport {\n createChinaTileLayer,\n installCanvasRedrawGuard,\n installMapCorrection,\n installTileLayerNoGap,\n observeTileNoGap,\n} from './plugins'\nimport { LayerManager } from './core/layer'\nimport { ControlManager } from './core/control'\nimport { ServiceClient } from './core/service'\nimport { ContextMenu } from './core/context-menu'\nimport type { DrawTool } from './core/draw'\nimport { getLocation } from './utils/location'\nimport { downloadBlob, exportMapImage } from './core/export'\nimport { loadLeafletDraw } from './core/draw-kit'\nimport { createEmitter } from './utils/emitter'\nimport './style/index.scss'\n\n// Install plugins once\nlet pluginsInstalled = false\nfunction ensurePlugins() {\n if (pluginsInstalled) return\n installMapCorrection()\n installTileLayerNoGap()\n installCanvasRedrawGuard()\n pluginsInstalled = true\n}\n\n/**\n * Main map class — supports multi-instance, fully typed API\n *\n * @example\n * ```ts\n * const map = new SMap('#map', {\n * tileType: ['TianDiTu.Normal.Map', 'TianDiTu.Normal.Annotion'],\n * center: [31.82, 117.23],\n * zoom: 12,\n * tdtKey: 'your-key',\n * })\n * ```\n */\nexport class SMap {\n /** The underlying Leaflet map instance */\n readonly instance: L.Map\n\n /** Layer management (registry, WFS/WMS, mask, points) */\n readonly layer: LayerManager\n\n /** Control management (zoom, scale, attribution, base-map switcher) */\n readonly control: ControlManager\n\n /** TianDiTu web services (search, geocode, etc.) */\n readonly service: ServiceClient\n\n /** Right-click menus for the map and for layers */\n readonly contextMenu: ContextMenu\n\n private tileLayers: L.TileLayer[] = []\n private tileTypes: TileType[] = []\n private tileChangeHandlers: (() => void)[] = []\n private drawTools = new Set<DrawTool>()\n private locationLayer: L.Layer | null = null\n private measureTools = new Set<MeasureTool>()\n private sharedMeasures = new Map<MeasureType, Promise<MeasureTool>>()\n private emitter = createEmitter<SMapEvents>()\n private options: SMapOptions\n private tileObserver: MutationObserver | null = null\n private destroyed = false\n\n constructor(container: string | HTMLElement, options: SMapOptions = {}) {\n ensurePlugins()\n\n this.options = options\n\n // Resolve container\n const el =\n typeof container === 'string'\n ? container.startsWith('#')\n ? container.slice(1)\n : container\n : container\n\n // Create leaflet map\n const { tileType, tdtKey, mapboxToken, container: _, ...leafletOptions } = options\n\n this.instance = L.map(el as any, {\n attributionControl: false,\n zoomControl: false,\n center: options.center,\n zoom: options.zoom ?? 12,\n minZoom: options.minZoom,\n maxZoom: options.maxZoom,\n maxNativeZoom: options.maxNativeZoom as number | undefined,\n preferCanvas: options.preferCanvas ?? true,\n ...leafletOptions,\n })\n\n // Sub-modules — all scoped to this instance\n this.layer = new LayerManager(this.instance)\n this.control = new ControlManager(\n this.instance,\n {\n setTileLayer: (type) => this.setTileLayer(type),\n getTileType: () => this.getTileType(),\n onTileChange: (handler) => this.tileChangeHandlers.push(handler),\n },\n this.layer,\n )\n this.contextMenu = new ContextMenu(this.instance)\n this.service = new ServiceClient({\n map: this.instance,\n key: () => this.options.tdtKey,\n })\n\n // Auto-add tile layers if specified\n if (tileType) {\n this.setTileLayer(tileType)\n }\n\n // Observe tiles for NoGap fix (MutationObserver approach for guaranteed coverage)\n this.tileObserver = observeTileNoGap(this.instance.getContainer())\n\n // Defer: listeners can only be attached after the constructor returns,\n // so emit on a microtask to let `new SMap(...).on('loaded', fn)` work.\n queueMicrotask(() => {\n if (this.destroyed) return\n this.emitter.emit('loaded', this.instance)\n if (this.tileLayers.length) {\n this.emitter.emit('tileLoaded', this.tileLayers)\n }\n })\n }\n\n // ============ Tile Layer ============\n\n /**\n * Replace current tile layers with new type(s)\n */\n setTileLayer(type: TileType | TileType[]): L.TileLayer[] {\n const types = Array.isArray(type) ? type : [type]\n // Build first: an unknown type throws here and leaves the current base map untouched\n const next = types.map((t, index) =>\n createChinaTileLayer(t, { ...this.resolveKey(t), zIndex: index }),\n )\n\n this.tileLayers.forEach((tl) => tl.remove())\n next.forEach((tl) => tl.addTo(this.instance))\n this.tileLayers = next\n this.tileTypes = [...types]\n\n this.notifyTileChange()\n this.emitter.emit('tileLoaded', this.tileLayers)\n return this.tileLayers\n }\n\n /**\n * Add additional tile layer(s) without removing existing ones\n */\n addTileLayer(type: TileType | TileType[]): L.TileLayer[] {\n const types = Array.isArray(type) ? type : [type]\n const added = types.map((t, index) =>\n createChinaTileLayer(t, {\n ...this.resolveKey(t),\n zIndex: this.tileLayers.length + index,\n }),\n )\n added.forEach((tl) => tl.addTo(this.instance))\n this.tileLayers.push(...added)\n this.tileTypes.push(...types)\n this.notifyTileChange()\n return added\n }\n\n private notifyTileChange(): void {\n this.tileChangeHandlers.forEach((handler) => handler())\n }\n\n /**\n * Pick the credential that belongs to the tile provider\n * (TianDiTu → tdtKey, Mapbox → mapboxToken, others → provider default)\n */\n private resolveKey(type: TileType): { key?: string } {\n const provider = type.split('.')[0]\n const key =\n provider === 'Mapbox'\n ? this.options.mapboxToken\n : provider === 'TianDiTu'\n ? this.options.tdtKey\n : undefined\n return key ? { key } : {}\n }\n\n /**\n * Remove all tile layers\n */\n clearTileLayers(): void {\n this.tileLayers.forEach((tl) => tl.remove())\n this.tileLayers = []\n this.tileTypes = []\n this.notifyTileChange()\n }\n\n /**\n * Types of the current tile layers, bottom first\n */\n getTileType(): TileType[] {\n return [...this.tileTypes]\n }\n\n /**\n * Get current tile layers\n */\n getTileLayers(): L.TileLayer[] {\n return [...this.tileLayers]\n }\n\n // ============ Measure ============\n\n /**\n * Create a new measure tool.\n *\n * Every call creates another tool; keep the one you get and reuse it, or call\n * its `destroy()` when done. For one shared tool per type use `getMeasure()`.\n */\n async createMeasure(type: MeasureType, options?: MeasureOptions): Promise<MeasureTool> {\n await loadLeafletDraw()\n const classes = await import('./core/measure')\n const Tool = {\n polyline: classes.PolylineMeasure,\n polygon: classes.PolygonMeasure,\n circle: classes.CircleMeasure,\n rectangle: classes.RectangleMeasure,\n }[type]\n if (!Tool) throw new Error(`Unknown measure type: ${type}`)\n\n const tool: MeasureTool = new Tool(this.instance, options)\n tool.on('start', (info) => this.emitter.emit('measure:start', info))\n tool.on('stop', (info) => this.emitter.emit('measure:stop', info))\n tool.on('created', (result) => this.emitter.emit('measure:created', result))\n tool.on('removed', (info) => this.emitter.emit('measure:removed', info))\n tool.on('updating', (result) => this.emitter.emit('measure:updating', result))\n tool.on('updated', (result) => this.emitter.emit('measure:updated', result))\n // A tool destroyed by its owner must not linger here\n tool.on('destroyed', () => this.measureTools.delete(tool))\n\n this.measureTools.add(tool)\n return tool\n }\n\n /**\n * The map's shared measure tool of a type, created on first use.\n * `options` only apply when it is created.\n */\n getMeasure(type: MeasureType, options?: MeasureOptions): Promise<MeasureTool> {\n let shared = this.sharedMeasures.get(type)\n if (!shared) {\n shared = this.createMeasure(type, options).then((tool) => {\n tool.on('destroyed', () => this.sharedMeasures.delete(type))\n return tool\n })\n // A failed load must not be cached\n shared.catch(() => this.sharedMeasures.delete(type))\n this.sharedMeasures.set(type, shared)\n }\n return shared\n }\n\n /**\n * Destroy all measure tools\n */\n clearMeasures(): void {\n for (const tool of [...this.measureTools]) {\n tool.destroy()\n }\n this.measureTools.clear()\n this.sharedMeasures.clear()\n }\n\n // ============ Draw ============\n\n /**\n * Create a tool for drawing and editing shapes (loads leaflet-draw on first call)\n */\n async createDraw(options?: DrawOptions): Promise<DrawTool> {\n await loadLeafletDraw()\n const { DrawTool } = await import('./core/draw')\n const tool = new DrawTool(this.instance, options)\n this.drawTools.add(tool)\n return tool\n }\n\n // ============ Location ============\n\n /**\n * Locate the user with the browser's geolocation, show the position and move there.\n * Rejects when permission is denied or the position is unavailable.\n */\n async locate(options: LocateOptions = {}): Promise<LocateResult> {\n const position = await getLocation(options)\n const latlng = L.latLng(position.latitude, position.longitude)\n if (this.destroyed) return { ...position, latlng }\n\n this.clearLocation()\n if (options.marker !== false) {\n this.locationLayer = L.featureGroup([\n L.circle(latlng, {\n radius: position.accuracy,\n weight: 1,\n color: '#2a7fff',\n fillOpacity: 0.12,\n interactive: false,\n }),\n L.circleMarker(latlng, {\n radius: 6,\n weight: 2,\n color: '#fff',\n fillColor: '#2a7fff',\n fillOpacity: 1,\n interactive: false,\n }),\n ]).addTo(this.instance)\n }\n if (options.setView !== false) {\n this.instance.setView(latlng, options.zoom ?? Math.max(this.instance.getZoom(), 16))\n }\n return { ...position, latlng }\n }\n\n /** Remove the position shown by `locate()` */\n clearLocation(): void {\n this.locationLayer?.remove()\n this.locationLayer = null\n }\n\n // ============ Export ============\n\n /**\n * The map as currently shown, as an image.\n *\n * Contains the base map, vector shapes (lines, areas, circles, point layers) and\n * the library's own labels: measurement labels, cluster bubbles, drawn markers.\n * Other HTML — custom marker icons, popups, controls — is not part of it unless\n * named in `include`. Rejects if a tile server forbids cross-origin reading.\n */\n exportImage(options?: ExportImageOptions): Promise<Blob> {\n return exportMapImage(this.instance, options)\n }\n\n /** Export the map and save it as a file */\n async downloadImage(filename = 'map.png', options?: ExportImageOptions): Promise<void> {\n downloadBlob(await this.exportImage(options), filename)\n }\n\n // ============ View ============\n\n /**\n * Fit map to bounds of a layer\n */\n fitToLayer(layer: L.Layer): void {\n if ('getBounds' in layer && typeof (layer as any).getBounds === 'function') {\n this.instance.fitBounds((layer as any).getBounds())\n }\n }\n\n /**\n * Set map view\n */\n setView(center: [number, number], zoom?: number): void {\n this.instance.setView(center, zoom)\n }\n\n // ============ Events ============\n\n on<K extends keyof SMapEvents>(type: K, handler: (event: SMapEvents[K]) => void): void {\n this.emitter.on(type, handler as any)\n }\n\n off<K extends keyof SMapEvents>(type: K, handler: (event: SMapEvents[K]) => void): void {\n this.emitter.off(type, handler as any)\n }\n\n // ============ Lifecycle ============\n\n /**\n * Destroy the map instance and clean up all resources\n */\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.clearMeasures()\n this.drawTools.forEach((tool) => tool.destroy())\n this.drawTools.clear()\n this.clearLocation()\n this.contextMenu.destroy()\n this.layer.destroy()\n this.tileChangeHandlers = []\n this.control.removeAll()\n this.clearTileLayers()\n this.emitter.all.clear()\n this.tileObserver?.disconnect()\n this.tileObserver = null\n\n // End any running animation and take everything off the map before Leaflet\n // removes the renderers, so nothing is left asking a dead renderer to redraw.\n // (A frame that slips through anyway is absorbed by installCanvasRedrawGuard.)\n this.instance.stop()\n this.instance.eachLayer((layer) => {\n if (!(layer instanceof L.Renderer)) layer.remove()\n })\n this.instance.remove()\n }\n}\n","const loadedScripts = new Set<string>()\nconst loadedStyles = new Set<string>()\n\n/**\n * Dynamically load an external script. Deduplicates by URL.\n */\nexport function loadScript(src: string): Promise<void> {\n if (loadedScripts.has(src)) return Promise.resolve()\n\n return new Promise((resolve, reject) => {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.src = src\n script.onload = () => {\n loadedScripts.add(src)\n resolve()\n }\n script.onerror = () => reject(new Error(`Failed to load script: ${src}`))\n document.head.appendChild(script)\n })\n}\n\n/**\n * Dynamically load an external stylesheet. Deduplicates by URL.\n */\nexport function loadStyle(href: string): void {\n if (loadedStyles.has(href)) return\n\n const link = document.createElement('link')\n link.type = 'text/css'\n link.rel = 'stylesheet'\n link.href = href\n document.head.appendChild(link)\n loadedStyles.add(href)\n}\n","/**\n * Editing: draggable handles on existing shapes.\n *\n * One small editor class per kind of layer. Each can put its handles on the map,\n * capture and restore the shape's state (for undo and for discarding), and tell\n * whether the shape was changed.\n */\nimport * as L from 'leaflet'\nimport { vertexIcon } from './drawers'\nimport type { Snapper } from './snap'\n\ntype Kind = 'vertex' | 'mid' | 'move' | 'resize'\n\nfunction handle(latlng: L.LatLngExpression, kind: Kind): L.Marker {\n return L.marker(latlng, {\n icon: vertexIcon(kind),\n draggable: true,\n keyboard: false,\n // Above the shapes and the app's own markers\n zIndexOffset: 1000,\n })\n}\n\nabstract class LayerEditor {\n changed = false\n /** Called on every change, while a handle is still being dragged */\n onChange: (() => void) | null = null\n /** Called right before a gesture changes the shape, so the state can be saved for undo */\n onBegin: (() => void) | null = null\n /** Adjusts a dragged position to nearby geometry */\n snap: ((latlng: L.LatLng) => L.LatLng) | null = null\n\n protected map: L.Map\n protected handles = L.layerGroup()\n protected enabled = false\n private initial: unknown\n\n constructor(map: L.Map) {\n this.map = map\n }\n\n enable(): void {\n this.initial = this.capture()\n this.enabled = true\n this.handles.addTo(this.map)\n this.build()\n }\n\n disable(): void {\n this.enabled = false\n this.handles.remove()\n this.handles.clearLayers()\n this.cleanup()\n }\n\n /** Put the shape back as it was when editing started */\n revert(): void {\n this.restore(this.initial)\n }\n\n /** The shape's current geometry, as a value that `restore` accepts */\n abstract capture(): unknown\n /** Set the shape to a captured geometry and move the handles accordingly */\n abstract restore(state: unknown): void\n /** Create the handles */\n protected abstract build(): void\n /** Undo what `build` did to the layer itself */\n protected cleanup(): void {}\n\n /** Recreate the handles after the shape changed under them */\n protected refresh(): void {\n if (!this.enabled) return\n this.handles.clearLayers()\n this.build()\n }\n\n protected begin(): void {\n this.onBegin?.()\n }\n\n protected touch(): void {\n this.changed = true\n this.onChange?.()\n }\n\n /** Where a dragged handle should count as being; moves the handle there if it snapped */\n protected position(marker: L.Marker): L.LatLng {\n const latlng = marker.getLatLng()\n const snapped = this.snap ? this.snap(latlng) : latlng\n if (snapped !== latlng) marker.setLatLng(snapped)\n return snapped\n }\n}\n\n// ---------- Marker: drag the marker itself ----------\n\nclass MarkerEditor extends LayerEditor {\n private layer: L.Marker\n private wasDraggable = false\n\n constructor(map: L.Map, layer: L.Marker) {\n super(map)\n this.layer = layer\n }\n\n capture(): L.LatLng {\n return this.layer.getLatLng()\n }\n\n restore(state: unknown): void {\n this.layer.setLatLng(state as L.LatLng)\n }\n\n protected build(): void {\n const { dragging } = this.layer\n this.wasDraggable = !!dragging?.enabled()\n dragging?.enable()\n this.layer.on('dragstart', this.begin, this)\n this.layer.on('drag dragend', this.touch, this)\n this.layer.getElement()?.classList.add('smap-marker-editing')\n }\n\n protected cleanup(): void {\n if (!this.wasDraggable) this.layer.dragging?.disable()\n this.layer.off('dragstart', this.begin, this)\n this.layer.off('drag dragend', this.touch, this)\n this.layer.getElement()?.classList.remove('smap-marker-editing')\n }\n}\n\n// ---------- Line and polygon: a handle per vertex, a faint one per edge ----------\n\ntype Nested = L.LatLng | Nested[]\n\nfunction clone(latlngs: Nested): Nested {\n return Array.isArray(latlngs) ? latlngs.map(clone) : L.latLng(latlngs.lat, latlngs.lng)\n}\n\n/** The innermost arrays: one per line, or per ring of a polygon */\nfunction rings(latlngs: Nested[]): L.LatLng[][] {\n return Array.isArray(latlngs[0])\n ? (latlngs as Nested[][]).flatMap(rings)\n : [latlngs as L.LatLng[]]\n}\n\nclass PathEditor extends LayerEditor {\n private layer: L.Polyline\n private closed: boolean\n /** Our own copy of the coordinates; edited in place, then handed to the layer */\n private current: Nested[]\n private originalDash: string | number[] | undefined\n\n constructor(map: L.Map, layer: L.Polyline) {\n super(map)\n this.layer = layer\n this.closed = layer instanceof L.Polygon\n this.current = clone(layer.getLatLngs() as Nested) as Nested[]\n this.originalDash = layer.options.dashArray\n }\n\n private get min(): number {\n return this.closed ? 3 : 2\n }\n\n capture(): Nested {\n return clone(this.current)\n }\n\n restore(state: unknown): void {\n this.current = clone(state as Nested) as Nested[]\n this.layer.setLatLngs(this.current as L.LatLngExpression[])\n this.refresh()\n }\n\n private apply(): void {\n this.layer.setLatLngs(this.current as L.LatLngExpression[])\n this.touch()\n }\n\n enable(): void {\n super.enable()\n this.layer.setStyle({ dashArray: '6 6' })\n }\n\n protected cleanup(): void {\n this.layer.setStyle({ dashArray: this.originalDash as string })\n }\n\n protected build(): void {\n for (const ring of rings(this.current)) {\n ring.forEach((latlng, i) => this.addVertex(ring, i, latlng))\n const edges = this.closed ? ring.length : ring.length - 1\n for (let i = 0; i < edges; i++) this.addMidpoint(ring, i)\n }\n }\n\n private addVertex(ring: L.LatLng[], index: number, latlng: L.LatLng): void {\n const marker = handle(latlng, 'vertex')\n let dragged = false\n marker.on('dragstart', () => {\n dragged = true\n this.begin()\n })\n marker.on('drag', () => {\n ring[index] = this.position(marker)\n this.apply()\n })\n // Midpoints depend on the vertices around them\n marker.on('dragend', () => this.refresh())\n marker.on('click', () => {\n // Leaflet also fires click at the end of a drag\n if (dragged) return void (dragged = false)\n if (ring.length <= this.min) return\n this.begin()\n ring.splice(index, 1)\n this.apply()\n this.refresh()\n })\n this.handles.addLayer(marker)\n }\n\n private addMidpoint(ring: L.LatLng[], index: number): void {\n const a = ring[index]\n const b = ring[(index + 1) % ring.length]\n const marker = handle([(a.lat + b.lat) / 2, (a.lng + b.lng) / 2], 'mid')\n // Dragging the middle of an edge splits it: the handle becomes a new vertex\n marker.on('dragstart', () => {\n this.begin()\n ring.splice(index + 1, 0, marker.getLatLng())\n })\n marker.on('drag', () => {\n ring[index + 1] = this.position(marker)\n this.apply()\n })\n marker.on('dragend', () => this.refresh())\n this.handles.addLayer(marker)\n }\n}\n\n// ---------- Rectangle: four corners and a handle to move it ----------\n\nclass RectangleEditor extends LayerEditor {\n private layer: L.Rectangle\n\n constructor(map: L.Map, layer: L.Rectangle) {\n super(map)\n this.layer = layer\n }\n\n capture(): L.LatLngBounds {\n const bounds = this.layer.getBounds()\n return L.latLngBounds(bounds.getSouthWest(), bounds.getNorthEast())\n }\n\n restore(state: unknown): void {\n this.layer.setBounds(state as L.LatLngBounds)\n this.refresh()\n }\n\n protected build(): void {\n const bounds = this.layer.getBounds()\n const corners = [\n bounds.getSouthWest(),\n bounds.getNorthWest(),\n bounds.getNorthEast(),\n bounds.getSouthEast(),\n ]\n\n corners.forEach((corner, i) => {\n const opposite = corners[(i + 2) % 4]\n const marker = handle(corner, 'resize')\n marker.on('dragstart', this.begin, this)\n marker.on('drag', () => {\n this.layer.setBounds(L.latLngBounds(this.position(marker), opposite))\n this.touch()\n })\n marker.on('dragend', () => this.refresh())\n this.handles.addLayer(marker)\n })\n\n const mover = handle(bounds.getCenter(), 'move')\n mover.on('dragstart', this.begin, this)\n mover.on('drag', () => {\n const from = this.layer.getBounds().getCenter()\n const to = mover.getLatLng()\n const dLat = to.lat - from.lat\n const dLng = to.lng - from.lng\n const b = this.layer.getBounds()\n this.layer.setBounds(\n L.latLngBounds(\n [b.getSouth() + dLat, b.getWest() + dLng],\n [b.getNorth() + dLat, b.getEast() + dLng],\n ),\n )\n this.touch()\n })\n mover.on('dragend', () => this.refresh())\n this.handles.addLayer(mover)\n }\n}\n\n// ---------- Circle: centre to move, a handle on the edge to resize ----------\n\nclass CircleEditor extends LayerEditor {\n private layer: L.Circle\n\n constructor(map: L.Map, layer: L.Circle) {\n super(map)\n this.layer = layer\n }\n\n capture(): { center: L.LatLng; radius: number } {\n return { center: this.layer.getLatLng(), radius: this.layer.getRadius() }\n }\n\n restore(state: unknown): void {\n const { center, radius } = state as { center: L.LatLng; radius: number }\n this.layer.setLatLng(center)\n this.layer.setRadius(radius)\n this.refresh()\n }\n\n /** The point due east of the centre, on the circle */\n private edge(): L.LatLng {\n const center = this.layer.getLatLng()\n return L.latLng(center.lat, this.layer.getBounds().getEast())\n }\n\n protected build(): void {\n const mover = handle(this.layer.getLatLng(), 'move')\n const resizer = handle(this.edge(), 'resize')\n\n mover.on('dragstart', this.begin, this)\n mover.on('drag', () => {\n this.layer.setLatLng(this.position(mover))\n resizer.setLatLng(this.edge())\n this.touch()\n })\n resizer.on('dragstart', this.begin, this)\n resizer.on('drag', () => {\n this.layer.setRadius(this.layer.getLatLng().distanceTo(this.position(resizer)))\n this.touch()\n })\n // The radius can be dragged in any direction; park the handle back on the east side\n resizer.on('dragend', () => resizer.setLatLng(this.edge()))\n\n this.handles.addLayer(mover).addLayer(resizer)\n }\n}\n\nfunction editorFor(map: L.Map, layer: L.Layer): LayerEditor | null {\n // Order matters: Rectangle extends Polygon extends Polyline; Circle extends CircleMarker\n if (layer instanceof L.Rectangle) return new RectangleEditor(map, layer)\n if (layer instanceof L.Polyline) return new PathEditor(map, layer)\n if (layer instanceof L.Circle) return new CircleEditor(map, layer)\n if (layer instanceof L.Marker) return new MarkerEditor(map, layer)\n return null\n}\n\nexport interface ShapeEditorOptions {\n /** Called with the layer on every change, including mid-drag and after an undo */\n onChange?: (layer: L.Layer) => void\n /** Snap dragged handles to nearby geometry */\n snap?: Snapper | null\n}\n\ninterface HistoryEntry {\n editor: LayerEditor\n layer: L.Layer\n state: unknown\n}\n\n/**\n * Makes every shape of a group editable at once, with undo.\n */\nexport class ShapeEditor {\n private map: L.Map\n private editors = new Map<L.Layer, LayerEditor>()\n private history: HistoryEntry[] = []\n private onChange?: (layer: L.Layer) => void\n\n constructor(map: L.Map, layers: L.Layer[], options: ShapeEditorOptions = {}) {\n this.map = map\n this.onChange = options.onChange\n const { snap } = options\n\n for (const layer of layers) {\n const editor = editorFor(map, layer)\n if (!editor) continue\n editor.onChange = () => this.onChange?.(layer)\n // One history entry per gesture: the state right before it\n editor.onBegin = () => this.history.push({ editor, layer, state: editor.capture() })\n // A shape must not snap to itself\n if (snap) editor.snap = (latlng) => snap(latlng, layer)\n this.editors.set(layer, editor)\n }\n }\n\n enable(): void {\n this.map.getContainer().classList.add('smap-editing')\n this.editors.forEach((editor) => editor.enable())\n document.addEventListener('keydown', this.onKey)\n }\n\n /** Layers that were changed */\n changed(): L.Layer[] {\n return [...this.editors].filter(([, editor]) => editor.changed).map(([layer]) => layer)\n }\n\n get canUndo(): boolean {\n return this.history.length > 0\n }\n\n /** Take back the last drag, insertion or deletion. Returns false when there is none */\n undo(): boolean {\n const entry = this.history.pop()\n if (!entry) return false\n entry.editor.restore(entry.state)\n // Back at the starting state once nothing of this shape is left in the history\n entry.editor.changed = this.history.some((other) => other.editor === entry.editor)\n this.onChange?.(entry.layer)\n return true\n }\n\n /** Undo every change */\n revert(): void {\n this.editors.forEach((editor) => {\n if (editor.changed) editor.revert()\n })\n this.history = []\n }\n\n disable(): void {\n document.removeEventListener('keydown', this.onKey)\n this.editors.forEach((editor) => editor.disable())\n this.map.getContainer().classList.remove('smap-editing')\n }\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== 'z' || !(e.ctrlKey || e.metaKey) || e.shiftKey) return\n // Leave the browser's own undo alone while the user is typing somewhere\n const target = e.target as HTMLElement | null\n if (target?.closest?.('input, textarea, [contenteditable]')) return\n if (this.undo()) e.preventDefault()\n }\n}\n","import * as L from 'leaflet'\n\nexport interface SnapOptions {\n /** How close (pixels) the cursor has to be. Default 12 */\n distance?: number\n /** Other layers to snap to, besides the tool's own shapes */\n layers?: L.Layer[] | (() => L.Layer[])\n}\n\n/** Returns the position to use: the nearest vertex or edge if one is close, else the input */\nexport type Snapper = (latlng: L.LatLng, exclude?: L.Layer) => L.LatLng\n\ninterface Geometry {\n vertices: L.LatLng[]\n /** Consecutive pairs are edges */\n paths: L.LatLng[][]\n}\n\ntype Nested = L.LatLng | Nested[]\n\nfunction collect(layer: L.Layer, exclude: L.Layer | undefined, out: Geometry): void {\n if (layer === exclude) return\n\n if (layer instanceof L.Polyline) {\n const closed = layer instanceof L.Polygon\n const walk = (latlngs: Nested[]) => {\n if (Array.isArray(latlngs[0])) return (latlngs as Nested[][]).forEach(walk)\n const ring = latlngs as L.LatLng[]\n out.vertices.push(...ring)\n out.paths.push(closed && ring.length ? [...ring, ring[0]] : ring)\n }\n walk(layer.getLatLngs() as Nested[])\n } else if (layer instanceof L.CircleMarker || layer instanceof L.Marker) {\n // A circle offers its centre\n out.vertices.push(layer.getLatLng())\n } else if (layer instanceof L.LayerGroup) {\n layer.eachLayer((child) => collect(child, exclude, out))\n }\n}\n\n/**\n * Snapping to the vertices and edges of other shapes.\n * A vertex wins over an edge: corners are what people aim for.\n */\nexport function createSnapper(map: L.Map, sources: () => L.Layer[], distance = 12): Snapper {\n return (latlng, exclude) => {\n const geometry: Geometry = { vertices: [], paths: [] }\n for (const layer of sources()) collect(layer, exclude, geometry)\n\n // map.project gives unrounded pixels at the current zoom. The container-point\n // helpers round to whole pixels, which is too coarse for landing exactly on an edge.\n const cursor = map.project(latlng)\n let best: L.LatLng | null = null\n let bestDistance = distance\n\n for (const vertex of geometry.vertices) {\n const d = map.project(vertex).distanceTo(cursor)\n if (d <= bestDistance) {\n best = vertex\n bestDistance = d\n }\n }\n if (best) return L.latLng(best.lat, best.lng)\n\n let onEdge: L.Point | null = null\n for (const path of geometry.paths) {\n for (let i = 1; i < path.length; i++) {\n const closest = L.LineUtil.closestPointOnSegment(\n cursor,\n map.project(path[i - 1]),\n map.project(path[i]),\n )\n const d = closest.distanceTo(cursor)\n if (d <= bestDistance) {\n onEdge = closest\n bestDistance = d\n }\n }\n }\n return onEdge ? map.unproject(onEdge) : latlng\n }\n}\n\n/** Build a snapper from a tool's `snap` option, or null when snapping is off */\nexport function snapperFor(\n map: L.Map,\n option: boolean | SnapOptions | undefined,\n own: () => L.Layer[],\n): Snapper | null {\n if (!option) return null\n const { distance, layers } = option === true ? ({} as SnapOptions) : option\n const extra = () => (typeof layers === 'function' ? layers() : (layers ?? []))\n return createSnapper(map, () => [...own(), ...extra()], distance)\n}\n","import * as L from 'leaflet'\nimport type { DrawEvents, DrawOptions, DrawType } from '../types'\nimport { createEmitter } from '../utils/emitter'\nimport { applyAccent, DEFAULT_ACCENT, DrawSession, loadLeafletDraw } from './draw-kit'\nimport { ShapeEditor } from './sketch/editors'\nimport { snapperFor } from './sketch/snap'\nimport type { Snapper } from './sketch/snap'\n\nconst DEFAULT_SHAPE_OPTIONS: L.PathOptions = {\n color: DEFAULT_ACCENT,\n weight: 3,\n lineCap: 'round',\n lineJoin: 'round',\n fillOpacity: 0.15,\n}\n\nfunction defaultMarkerIcon(): L.DivIcon {\n return L.divIcon({ className: 'smap-draw-marker', iconSize: [16, 16], iconAnchor: [8, 8] })\n}\n\n/**\n * Draw, edit and export shapes. Create it with `smap.createDraw()`.\n */\nexport class DrawTool {\n /** Everything drawn or loaded lives in this group */\n readonly group: L.FeatureGroup\n\n private map: L.Map\n private options: DrawOptions\n private emitter = createEmitter<DrawEvents>()\n private session: DrawSession<DrawType>\n private editor: ShapeEditor | null = null\n private snapper: Snapper | null\n\n /** @deprecated Nothing needs loading any more. Kept so existing calls keep working */\n static preload(): Promise<void> {\n return loadLeafletDraw()\n }\n\n constructor(map: L.Map, options: DrawOptions = {}) {\n this.map = map\n this.options = options\n this.group = L.featureGroup().addTo(map)\n this.snapper = snapperFor(map, options.snap, () => this.getLayers())\n\n this.session = new DrawSession<DrawType>(map, {\n created: (layer, type) => {\n this.group.addLayer(layer)\n this.emitter.emit('created', { layer, type })\n this.emitChange()\n },\n stop: (type) => this.emitter.emit('drawstop', { type }),\n })\n }\n\n // ============ Drawing ============\n\n /** Shape currently being drawn, or null */\n get drawing(): DrawType | null {\n return this.session.active\n }\n\n /** Start drawing one shape. Drawing ends by itself when the shape is finished */\n draw(type: DrawType): void {\n this.finishEdit(true)\n const shapeOptions = this.shapeOptions()\n const { snapper } = this\n this.session.start(\n type,\n {\n shapeOptions,\n markerIcon: this.markerIcon(),\n snap: snapper ? (latlng) => snapper(latlng) : undefined,\n },\n shapeOptions.color,\n )\n this.emitter.emit('drawstart', { type })\n }\n\n /** Abandon the shape being drawn */\n cancel(): void {\n this.session.cancel()\n }\n\n // ============ Editing ============\n\n /** True while shapes can be dragged and reshaped */\n get editing(): boolean {\n return !!this.editor\n }\n\n /** Make every shape editable: drag vertices, move markers, resize rectangles and circles */\n startEdit(): void {\n if (this.editor) return\n this.cancel()\n applyAccent(this.map, this.shapeOptions().color)\n this.editor = new ShapeEditor(this.map, this.getLayers(), {\n snap: this.snapper,\n onChange: (layer) => this.emitter.emit('editing', { layer }),\n })\n this.editor.enable()\n }\n\n /** True when there is a change to take back in edit mode */\n get canUndo(): boolean {\n return this.editor?.canUndo ?? false\n }\n\n /** Take back the last change made in edit mode (also Ctrl/Cmd+Z). Returns false when there is none */\n undo(): boolean {\n return this.editor?.undo() ?? false\n }\n\n /** Leave edit mode, keeping (`save = true`) or discarding the changes */\n finishEdit(save = true): void {\n const editor = this.editor\n if (!editor) return\n this.editor = null\n\n const changed = save ? editor.changed() : []\n if (!save) editor.revert()\n editor.disable()\n\n if (changed.length) {\n this.emitter.emit('edited', { layers: changed })\n this.emitChange()\n }\n }\n\n // ============ Content ============\n\n getLayers(): L.Layer[] {\n return this.group.getLayers()\n }\n\n /** Remove one shape */\n remove(layer: L.Layer): void {\n if (!this.group.hasLayer(layer)) return\n this.group.removeLayer(layer)\n this.emitter.emit('removed', { layers: [layer] })\n this.emitChange()\n }\n\n /** Remove every shape */\n clear(): void {\n const layers = this.getLayers()\n if (!layers.length) return\n this.finishEdit(false)\n this.group.clearLayers()\n this.emitter.emit('removed', { layers })\n this.emitChange()\n }\n\n /**\n * Export everything as GeoJSON (WGS-84).\n * A circle becomes a Point with `properties.radius` in metres.\n */\n toGeoJSON(): GeoJSON.FeatureCollection {\n const features = this.getLayers().map((layer: any) => {\n const feature = layer.toGeoJSON() as GeoJSON.Feature\n if (layer instanceof L.Circle) {\n feature.properties = { ...feature.properties, radius: layer.getRadius() }\n }\n return feature\n })\n return { type: 'FeatureCollection', features }\n }\n\n /**\n * Load shapes from GeoJSON so they can be shown and edited.\n * A Point with `properties.radius` becomes a circle.\n */\n load(geojson: GeoJSON.GeoJsonObject, options: { replace?: boolean } = {}): void {\n this.finishEdit(false)\n if (options.replace !== false) {\n this.group.clearLayers()\n }\n\n const parsed = L.geoJSON(geojson, {\n style: () => this.shapeOptions(),\n pointToLayer: (feature, latlng) => {\n const radius = Number(feature.properties?.radius)\n return radius > 0\n ? L.circle(latlng, { ...this.shapeOptions(), radius })\n : L.marker(latlng, { icon: this.markerIcon() })\n },\n })\n parsed.eachLayer((layer) => this.group.addLayer(layer))\n this.emitChange()\n }\n\n // ============ Events / lifecycle ============\n\n on<K extends keyof DrawEvents>(type: K, handler: (event: DrawEvents[K]) => void): void {\n this.emitter.on(type, handler as any)\n }\n\n off<K extends keyof DrawEvents>(type: K, handler: (event: DrawEvents[K]) => void): void {\n this.emitter.off(type, handler as any)\n }\n\n destroy(): void {\n this.session.destroy()\n this.finishEdit(false)\n this.emitter.all.clear()\n this.group.remove()\n }\n\n private emitChange(): void {\n this.emitter.emit('change', this.toGeoJSON())\n }\n\n private shapeOptions(): L.PathOptions {\n return { ...DEFAULT_SHAPE_OPTIONS, ...this.options.shapeOptions }\n }\n\n private markerIcon(): L.Icon | L.DivIcon {\n return this.options.markerIcon ?? defaultMarkerIcon()\n }\n}\n","import * as L from 'leaflet'\n\nimport type {\n MeasureEvents,\n MeasureLabel,\n MeasureOptions,\n MeasureResult,\n MeasureTool,\n MeasureType,\n} from '../../types'\nimport { createEmitter } from '../../utils/emitter'\nimport { DEFAULT_ACCENT, DrawSession, loadLeafletDraw } from '../draw-kit'\nimport { ShapeEditor } from '../sketch/editors'\nimport { formatArea, formatLength, pathLength } from '../sketch/geometry'\nimport { snapperFor } from '../sketch/snap'\nimport type { Snapper } from '../sketch/snap'\n\nconst DEFAULT_SHAPE_OPTIONS: L.PathOptions = {\n stroke: true,\n color: DEFAULT_ACCENT,\n weight: 3,\n opacity: 1,\n lineCap: 'round',\n lineJoin: 'round',\n fillOpacity: 0.12,\n}\n\nlet idCounter = 0\nfunction generateId(): string {\n return `measure_${++idCounter}_${Date.now()}`\n}\n\n/** What a tool works out from a finished shape */\nexport type MeasureGeometry = Omit<MeasureResult, 'id' | 'type' | 'layer'>\n\n/** A label to put on the map */\nexport interface LabelSpec {\n latlng: L.LatLng\n html: string\n}\n\n/** One finished measurement and what it put on the map */\ninterface Entry {\n result: MeasureResult\n labels: L.FeatureGroup\n}\n\n/**\n * Base class of the measure tools.\n *\n * It owns the whole lifecycle — drawing, labels, results, events, cleanup. A\n * concrete tool only says how to read numbers off a shape and how to word them.\n */\nexport abstract class BaseMeasureTool implements MeasureTool {\n protected map: L.Map\n protected options: MeasureOptions\n /** Holds the finished shapes */\n protected layerGroup: L.FeatureGroup\n\n private entries = new Map<string, Entry>()\n /** Labels of the drawing in progress */\n private draft: L.FeatureGroup | null = null\n private session: DrawSession<MeasureType>\n private emitter = createEmitter<MeasureEvents>()\n private clickHandler: (e: MouseEvent) => void\n private editor: ShapeEditor | null = null\n private snapper: Snapper | null\n private destroyed = false\n\n /** @deprecated Nothing needs loading any more. Kept so existing calls keep working */\n static preload(): Promise<void> {\n return loadLeafletDraw()\n }\n\n constructor(map: L.Map, options: MeasureOptions = {}) {\n this.map = map\n // A copy: setOptions() must not write into the caller's object\n this.options = { ...options }\n this.layerGroup = L.featureGroup().addTo(map)\n // Later measurements can snap to the earlier ones\n this.snapper = snapperFor(map, options.snap, () => this.layerGroup.getLayers())\n\n this.session = new DrawSession<MeasureType>(map, {\n created: (layer) => this.handleCreated(layer),\n vertex: (latlngs) => this.handleVertex(latlngs),\n stop: (type, completed) => {\n this.setDraft(null)\n this.emitter.emit('stop', { type, completed })\n },\n })\n\n // One delegated listener serves the × button of every result label\n this.clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target.classList?.contains('smap-measure-remove')) {\n const id = target.dataset.measureId\n if (id) this.remove(id)\n }\n }\n map.getContainer().addEventListener('click', this.clickHandler)\n }\n\n // ============ What a concrete tool provides ============\n\n /** Which shape this tool draws */\n protected abstract readonly drawType: MeasureType\n\n /** Read the measurement off a finished shape */\n protected abstract measure(layer: any): MeasureGeometry\n\n /** Where the result label goes */\n protected abstract anchor(result: MeasureResult): L.LatLng\n\n /** Default wording of a label */\n protected abstract defaultText(label: MeasureLabel): string\n\n /** What the deprecated `valueFormatter` option receives for this tool */\n protected abstract legacyValue(label: MeasureLabel): number | L.LatLng[]\n\n /** Labels to show while drawing; only the distance tool has any */\n protected draftLabels(_latlngs: L.LatLng[]): LabelSpec[] {\n return []\n }\n\n /** Labels of a finished measurement. By default just the result label */\n protected resultLabels(result: MeasureResult): LabelSpec[] {\n return [{ latlng: this.anchor(result), html: this.resultHtml(result) }]\n }\n\n // ============ Public API ============\n\n get type(): MeasureType {\n return this.drawType\n }\n\n get measuring(): boolean {\n return this.session.active !== null\n }\n\n enable(): void {\n this.finishEdit(true)\n const shapeOptions = this.getShapeOptions()\n const { snapper } = this\n this.session.start(\n this.drawType,\n {\n shapeOptions,\n vertexIcon: this.options.icon,\n snap: snapper ? (latlng) => snapper(latlng) : undefined,\n },\n shapeOptions.color,\n )\n this.emitter.emit('start', { type: this.drawType })\n }\n\n disable(): void {\n // The drawing ends by itself when the shape is finished; this cancels one in progress\n this.session.cancel()\n }\n\n // ============ Editing ============\n\n get editing(): boolean {\n return !!this.editor\n }\n\n startEdit(): void {\n if (this.editor) return\n this.disable()\n const byLayer = new Map([...this.entries.values()].map((entry) => [entry.result.layer, entry]))\n this.editor = new ShapeEditor(this.map, [...byLayer.keys()], {\n snap: this.snapper,\n onChange: (layer) => {\n const entry = byLayer.get(layer)\n if (!entry) return\n this.refresh(entry)\n this.emitter.emit('updating', entry.result)\n },\n })\n this.editor.enable()\n }\n\n undo(): boolean {\n return this.editor?.undo() ?? false\n }\n\n finishEdit(save = true): void {\n const editor = this.editor\n if (!editor) return\n this.editor = null\n\n const changed = editor.changed()\n if (!save) editor.revert()\n editor.disable()\n\n for (const entry of this.entries.values()) {\n if (!changed.includes(entry.result.layer)) continue\n // Reverted shapes need their old numbers and labels back as well\n this.refresh(entry)\n if (save) this.emitter.emit('updated', entry.result)\n }\n }\n\n /** Read the numbers off the shape again and redraw its labels */\n private refresh(entry: Entry): void {\n // In place: the result object handed out earlier stays the current one\n Object.assign(entry.result, this.measure(entry.result.layer))\n entry.labels.remove()\n entry.labels = this.renderLabels(this.options.showMarker ? this.resultLabels(entry.result) : [])\n }\n\n setOptions(options: Partial<MeasureOptions>): void {\n Object.assign(this.options, options)\n for (const entry of this.entries.values()) this.refresh(entry)\n }\n\n getResults(): MeasureResult[] {\n return [...this.entries.values()].map((entry) => entry.result)\n }\n\n remove(id: string): void {\n const entry = this.entries.get(id)\n if (!entry) return\n // The editor holds handles on this shape\n this.finishEdit(true)\n entry.labels.remove()\n this.layerGroup.removeLayer(entry.result.layer)\n this.entries.delete(id)\n this.emitter.emit('removed', { id, type: this.drawType })\n }\n\n clearAll(): void {\n for (const id of [...this.entries.keys()]) {\n this.remove(id)\n }\n }\n\n on<K extends keyof MeasureEvents>(type: K, handler: (event: MeasureEvents[K]) => void): void {\n this.emitter.on(type, handler as any)\n }\n\n off<K extends keyof MeasureEvents>(type: K, handler: (event: MeasureEvents[K]) => void): void {\n this.emitter.off(type, handler as any)\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.session.destroy()\n this.finishEdit(false)\n this.setDraft(null)\n this.clearAll()\n this.layerGroup.remove()\n this.map.getContainer().removeEventListener('click', this.clickHandler)\n this.emitter.emit('destroyed', { type: this.drawType })\n this.emitter.all.clear()\n }\n\n // ============ Drawing ============\n\n private handleVertex(latlngs: L.LatLng[]): void {\n if (!this.options.showMarker) return\n const labels = this.draftLabels(latlngs)\n if (labels.length) this.setDraft(this.renderLabels(labels))\n }\n\n private handleCreated(layer: L.Layer): void {\n const id = generateId()\n this.layerGroup.addLayer(layer)\n\n const result: MeasureResult = { id, type: this.drawType, layer, ...this.measure(layer) }\n // The final labels are built from the finished shape, not carried over from the draft\n this.setDraft(null)\n const labels = this.renderLabels(this.options.showMarker ? this.resultLabels(result) : [])\n\n this.entries.set(id, { result, labels })\n this.emitter.emit('created', result)\n }\n\n private setDraft(group: L.FeatureGroup | null): void {\n this.draft?.remove()\n this.draft = group\n }\n\n /** Put labels on the map. A label is a permanent tooltip on an invisible marker */\n private renderLabels(specs: LabelSpec[]): L.FeatureGroup {\n const group = L.featureGroup()\n for (const { latlng, html } of specs) {\n L.marker(latlng, { icon: L.divIcon({ className: 'measure-div-icon' }), interactive: false })\n .bindTooltip(html, {\n permanent: true,\n direction: 'right',\n offset: [6, 0],\n className: 'measure-tooltip',\n })\n .addTo(group)\n }\n return group.addTo(this.map)\n }\n\n // ============ Helpers for concrete tools ============\n\n protected getShapeOptions(): L.PathOptions {\n return { ...DEFAULT_SHAPE_OPTIONS, ...this.options.shapeOptions }\n }\n\n /** Text of a label: `formatLabel`, else the deprecated `valueFormatter`, else the default */\n protected text(label: MeasureLabel, legacyPrefix = ''): string {\n if (this.options.formatLabel) return this.options.formatLabel(label)\n if (this.options.valueFormatter) {\n return legacyPrefix + this.options.valueFormatter(this.legacyValue(label))\n }\n return this.defaultText(label)\n }\n\n /** Plain label, used for intermediate values */\n protected labelHtml(content: string): string {\n return `<div class=\"smap-measure-label\" style=\"${this.accentStyle()}\">${content}</div>`\n }\n\n /** Emphasised label of a finished measurement, with the button that removes it */\n protected resultHtml(result: MeasureResult, legacyPrefix = ''): string {\n const { id: _id, layer: _layer, ...rest } = result\n const content = this.text({ ...rest, partial: false }, legacyPrefix)\n const removeBtn = `<button type=\"button\" class=\"smap-measure-remove\" data-measure-id=\"${result.id}\" title=\"删除\" aria-label=\"删除\">×</button>`\n return `<div class=\"smap-measure-label smap-measure-label--result\" style=\"${this.accentStyle()}\"><span>${content}</span>${removeBtn}</div>`\n }\n\n /** Labels take the colour of this tool's lines */\n private accentStyle(): string {\n return `--smap-accent:${this.getShapeOptions().color || DEFAULT_ACCENT}`\n }\n\n protected formatLength(meters: number): string {\n return formatLength(meters, this.options.lengthUnit)\n }\n\n protected formatArea(sqMeters: number): string {\n return formatArea(sqMeters, this.options.areaUnit)\n }\n\n /** Length of a path in metres */\n protected pathLength(latlngs: L.LatLng[]): number {\n return pathLength(latlngs)\n }\n}\n","import type * as L from 'leaflet'\nimport type { MeasureLabel, MeasureResult } from '../../types'\nimport { BaseMeasureTool } from './base'\nimport type { LabelSpec, MeasureGeometry } from './base'\n\n/** Distance along a line, with the running total shown at each vertex */\nexport class PolylineMeasure extends BaseMeasureTool {\n protected readonly drawType = 'polyline'\n\n protected measure(layer: L.Polyline): MeasureGeometry {\n const latlngs = layer.getLatLngs() as L.LatLng[]\n return { latlngs, distance: this.pathLength(latlngs) }\n }\n\n protected anchor(result: MeasureResult): L.LatLng {\n return result.latlngs[result.latlngs.length - 1]\n }\n\n protected defaultText(label: MeasureLabel): string {\n const length = this.formatLength(label.distance ?? 0)\n return label.partial ? length : `共 ${length}`\n }\n\n protected legacyValue(label: MeasureLabel): number {\n return label.distance ?? 0\n }\n\n protected draftLabels(latlngs: L.LatLng[]): LabelSpec[] {\n return this.nodeLabels(latlngs)\n }\n\n protected resultLabels(result: MeasureResult): LabelSpec[] {\n // Every vertex but the last keeps its running total; the last one carries the result\n return [\n ...this.nodeLabels(result.latlngs.slice(0, -1)),\n // The deprecated formatter only returned the number, so it keeps its \"共\" prefix\n { latlng: this.anchor(result), html: this.resultHtml(result, '共 ') },\n ]\n }\n\n /** \"起点\" on the first vertex, the distance so far on the others */\n private nodeLabels(latlngs: L.LatLng[]): LabelSpec[] {\n return latlngs.map((latlng, i) => {\n if (i === 0) return { latlng, html: this.labelHtml('起点') }\n const soFar = latlngs.slice(0, i + 1)\n const text = this.text({\n type: 'polyline',\n latlngs: soFar,\n distance: this.pathLength(soFar),\n partial: true,\n })\n return { latlng, html: this.labelHtml(text) }\n })\n }\n}\n","import type * as L from 'leaflet'\nimport type { MeasureLabel, MeasureResult } from '../../types'\nimport { geodesicArea, pathLength } from '../sketch/geometry'\nimport { BaseMeasureTool } from './base'\nimport type { MeasureGeometry } from './base'\n\n/** Shared by the tools that measure the area of a ring: polygon and rectangle */\nexport abstract class RingAreaMeasure extends BaseMeasureTool {\n protected measure(layer: L.Polygon): MeasureGeometry {\n const latlngs = layer.getLatLngs()[0] as L.LatLng[]\n return {\n latlngs,\n area: geodesicArea(latlngs),\n perimeter: latlngs.length ? pathLength([...latlngs, latlngs[0]]) : 0,\n }\n }\n\n protected anchor(result: MeasureResult): L.LatLng {\n return result.latlngs[0]\n }\n\n protected defaultText(label: MeasureLabel): string {\n return this.formatArea(label.area ?? 0)\n }\n\n protected legacyValue(label: MeasureLabel): L.LatLng[] {\n return label.latlngs\n }\n}\n","import { RingAreaMeasure } from './area'\n\nexport class PolygonMeasure extends RingAreaMeasure {\n protected readonly drawType = 'polygon'\n}\n","import type * as L from 'leaflet'\nimport type { MeasureLabel, MeasureResult } from '../../types'\nimport { BaseMeasureTool } from './base'\nimport type { MeasureGeometry } from './base'\n\nexport class CircleMeasure extends BaseMeasureTool {\n protected readonly drawType = 'circle'\n\n protected measure(layer: L.Circle): MeasureGeometry {\n const radius = layer.getRadius()\n const center = layer.getLatLng()\n return {\n latlngs: [center],\n center,\n radius,\n area: Math.PI * radius * radius,\n perimeter: 2 * Math.PI * radius,\n }\n }\n\n protected anchor(result: MeasureResult): L.LatLng {\n return result.center ?? result.latlngs[0]\n }\n\n protected defaultText(label: MeasureLabel): string {\n return this.formatArea(label.area ?? 0)\n }\n\n protected legacyValue(label: MeasureLabel): number {\n return label.radius ?? 0\n }\n}\n","import { RingAreaMeasure } from './area'\n\nexport class RectangleMeasure extends RingAreaMeasure {\n protected readonly drawType = 'rectangle'\n}\n"],"names":["LWithProj","L","res","i","providers","COORD_TYPE_MAP","getCoordType","providerName","BUILTIN_TILE_TYPES","RESERVED_GROUP_NAMES","registerProvider","name","definition","group","getTileTypes","types","provider","groups","layers","type","createChinaTileLayer","options","parts","mapName","mapType","_a","url","tileOptions","ChinaTileLayer","coords","data","invertedY","PI","A","EE","X_PI","transformLat","x","y","ret","transformLng","outOfChina","lat","lng","transformGcj","dLat","dLng","radLat","magic","sqrtMagic","wgs84ToGcj02","gcj02ToWgs84","coord","gcj02ToBd09","z","theta","bd09ToGcj02","wgs84ToBd09","gcj","bd09ToWgs84","CONVERTERS","transformCoord","from","to","convert","transformGeoJSON","geojson","copy","convertPositions","value","visit","node","_b","installMapCorrection","GridLayerProto","level","_center","zoom","center","scale","translate","map","mapZoom","pixelCenter","halfSize","installCanvasRedrawGuard","proto","redraw","patchTile","tile","patchAllTiles","container","installTileLayerNoGap","originalInitTile","observeTileNoGap","mapContainer","observer","mutations","mutation","countText","count","clusterIcon","tier","size","ClusterLayer","points","canvas","item","point","cell","clustering","view","buckets","index","key","px","bucket","latlng","style","tooltip","onClick","marker","e","WORLD_RING","outerRings","rings","push","ring","polygon","LayerManager","listener","id","layer","visible","params","response","_id","rest","bounds","mask","previous","interactive","sameTypes","a","b","ControlManager","host","control","attrControl","entries","entry","buttons","button","current","active","list","items","row","box","BASE_API","ServiceClient","context","mapOrParams","maybeParams","mapBound","postStr","tk","query","keyword","fallback","searchParams","fullUrl","ContextMenu","handler","source","at","el","left","top","separator","DEFAULT_OPTIONS","getLocation","timeout","enableHighAccuracy","resolve","reject","position","latitude","longitude","accuracy","error","messages","loadForCanvas","src","attempt","image","hostOf","OWN_ELEMENTS","SCREEN_ONLY","isTransparent","color","roundedRect","ctx","w","h","radius","r","paintElement","origin","rect","corner","border","text","range","tilesReady","pending","zIndexOf","root","exportMapImage","place","tiles","img","order","loaded","renderer","xml","selectors","blob","downloadBlob","filename","link","EARTH_RADIUS","DEG","geodesicArea","latlngs","n","area","pathLength","distance","MU","formatLength","meters","unit","formatArea","sqMeters","sketchText","SNAP","DRAG_THRESHOLD","vertexIcon","kind","Drawer","snapped","MarkerDrawer","icon","PathDrawer","closed","hits","vertex","isFirst","isLast","handle","last","TwoPointDrawer","wasDrag","RectangleDrawer","CircleDrawer","createDrawer","Hint","sub","DEFAULT_ACCENT","applyAccent","loadLeafletDraw","activeSessions","DrawSession","hooks","accent","hint","completed","drawer","mitt","createEmitter","pluginsInstalled","ensurePlugins","SMap","tileType","tdtKey","mapboxToken","_","leafletOptions","next","t","tl","added","classes","Tool","tool","info","result","shared","DrawTool","draw","loadedScripts","loadedStyles","loadScript","script","loadStyle","href","LayerEditor","MarkerEditor","state","dragging","clone","PathEditor","edges","dragged","RectangleEditor","corners","opposite","mover","CircleEditor","resizer","editorFor","ShapeEditor","target","snap","editor","other","collect","exclude","out","walk","child","createSnapper","sources","geometry","cursor","best","bestDistance","d","onEdge","path","closest","snapperFor","option","own","extra","DEFAULT_SHAPE_OPTIONS","defaultMarkerIcon","shapeOptions","snapper","save","changed","feature","idCounter","generateId","BaseMeasureTool","_latlngs","byLayer","labels","specs","html","label","legacyPrefix","content","_layer","removeBtn","PolylineMeasure","length","soFar","RingAreaMeasure","PolygonMeasure","CircleMeasure","RectangleMeasure"],"mappings":"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","x_google_ignoreList":[17]}