{"id":"0a9d0edf-1747-42e3-bade-75f1f2dabab3","entityType":"agent","slug":"clawhub-unknown-baidu-map-jsapi-gl","name":"Baidu Map JSAPI GL（百度地图官方 WebGL SKills）","canonicalUrl":"https://www.xpersona.co/agent/clawhub-unknown-baidu-map-jsapi-gl","canonicalPath":"/agent/clawhub-unknown-baidu-map-jsapi-gl","generatedAt":"2026-10-11T20:56:12.443Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":null},"description":"百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Skill: Baidu Map JSAPI GL（百度地图官方 WebGL SKills） Summary: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-05-12T03:01:17.946Z | user Version 1.0.2 of baidu-map-jsapi-gl - No file changes detected in this release. - Version number updated from 1.0.1 to 1.0.2 with no changes to functionality or docume","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install unknown:baidu-map-jsapi-gl","sourceUrl":"https://clawhub.ai/unknown/baidu-map-jsapi-gl","homepage":"https://clawhub.ai/unknown/skills/baidu-map-jsapi-gl","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/unknown/baidu-map-jsapi-gl","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/unknown/skills/baidu-map-jsapi-gl","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Skill: Baidu Map JSAPI GL（百度地图官方 WebGL S"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":null},"stars":null,"forks":null,"downloads":1014,"packageName":null,"latestVersion":"1.0.2","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:56:47.803Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T17:56:47.815Z","lastCrawledAt":"2026-10-11T17:56:47.803Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T17:56:47.803Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.2","createdAt":"2026-05-12T03:01:17.946Z","changelog":"Version 1.0.2 of baidu-map-jsapi-gl - No file changes detected in this release. - Version number updated from 1.0.1 to 1.0.2 with no changes to functionality or documentation.","fileCount":27,"zipByteSize":46393},{"version":"1.0.1","createdAt":"2026-04-03T10:36:09.915Z","changelog":"- 更新技能名称为 bmap-jsapi-gl，更加贴合技能内容与用途 - 优化技能描述，突出高性能 3D 地图应用一站式开发能力 - 版本号升级为 1.0.1 - 其余文档结构与内容保持一致","fileCount":26,"zipByteSize":44582},{"version":"1.0.0","createdAt":"2026-03-31T02:26:40.511Z","changelog":"Initial release of bmap-jsapi-gl skill. - Provides a development guide for Baidu Map JSAPI GL (WebGL) integration. - Includes module references for map initialization, overlays, events, styles, layer services, and route planning. - Offers quick links to code examples, API usage, and essential documentation for rapid development and debugging. - Highlights AK (API Key) requirements and instructions for obtaining a new key if missing or invalid.","fileCount":26,"zipByteSize":44618}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install unknown:baidu-map-jsapi-gl","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:56:12.441Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-unknown-baidu-map-jsapi-gl/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":null},"readme":"Skill: Baidu Map JSAPI GL（百度地图官方 WebGL SKills）\n\nSummary: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。\n\nTags: latest:1.0.2\n\nVersion history:\n\nv1.0.2 | 2026-05-12T03:01:17.946Z | user\n\nVersion 1.0.2 of baidu-map-jsapi-gl\n\n- No file changes detected in this release.\n- Version number updated from 1.0.1 to 1.0.2 with no changes to functionality or documentation.\n\nv1.0.1 | 2026-04-03T10:36:09.915Z | user\n\n- 更新技能名称为 bmap-jsapi-gl，更加贴合技能内容与用途\n- 优化技能描述，突出高性能 3D 地图应用一站式开发能力\n- 版本号升级为 1.0.1\n- 其余文档结构与内容保持一致\n\nv1.0.0 | 2026-03-31T02:26:40.511Z | user\n\nInitial release of bmap-jsapi-gl skill.\n\n- Provides a development guide for Baidu Map JSAPI GL (WebGL) integration.\n- Includes module references for map initialization, overlays, events, styles, layer services, and route planning.\n- Offers quick links to code examples, API usage, and essential documentation for rapid development and debugging.\n- Highlights AK (API Key) requirements and instructions for obtaining a new key if missing or invalid.\n\nArchive index:\n\nArchive v1.0.2: 27 files, 46393 bytes\n\nFiles: references/base-classes.md (4598b), references/circle.md (3485b), references/constants.md (859b), references/convertor.md (2514b), references/custom-overlay.md (4401b), references/driving-route.md (3255b), references/geocoder.md (3733b), references/get-ak.md (2513b), references/info-window.md (4375b), references/local-search.md (4884b), references/map-events.md (6932b), references/map-init.md (6713b), references/map-style.md (7331b), references/marker.md (3600b), references/mvt-layer.md (3379b), references/overlay-common.md (1539b), references/overlay-events.md (2843b), references/polygon.md (5429b), references/polyline.md (4440b), references/riding-route.md (586b), references/route-common.md (6716b), references/transit-route.md (5527b), references/walking-route.md (858b), references/xyz-layer.md (3253b), skill-card.md (3487b), SKILL.md (3877b), _meta.json (137b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: bmap-jsapi-gl\ndescription: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。\nlicense: MIT\nversion: 1.0.1\nmetadata:\n  openclaw:\n    requires:\n      env: BMAP_JSAPI_KEY\n    primaryEnv: BMAP_JSAPI_KEY\n---\n\n# JSAPI GL 开发指南\n\n百度地图 JSAPI WebGL 版本开发指南。包含地图初始化、覆盖物、事件、图层等核心模块的 API 说明和代码示例，旨在帮助开发者快速集成百度地图并遵循正确的使用方式。\n\n## 何时适用\n\n在以下场景中参考这些指南：\n\n- 创建新的地图页面或组件\n- 在地图上添加标注、折线、多边形等覆盖物\n- 处理地图交互事件（点击、拖拽、缩放等）\n- 配置地图样式或切换图层\n- 调试地图渲染或性能问题\n\n\n## 快速参考\n\n### 0. 基础概念\n\n- `references/base-classes.md` - 基础类：Point、Bounds、Size、Pixel、Icon\n- `references/constants.md` - 通用常量：搜索状态码、POI 类型\n\n### 1. 地图\n\n- `references/map-init.md` - 地图初始化：资源引入、创建实例、配置选项、交互与视图控制\n\n### 2. 地图覆盖物\n\n- `references/overlay-common.md` - 覆盖物通用操作：添加/移除、显示/隐藏、批量清除\n- `references/marker.md` - 点标记：构造参数、位置/图标/旋转/置顶/拖拽方法\n- `references/polyline.md` - 折线：构造参数、线条样式、坐标操作、编辑模式\n- `references/polygon.md` - 多边形：构造参数、边框/填充样式、带孔多边形、编辑模式\n- `references/circle.md` - 圆形：构造参数、中心点/半径、样式设置、编辑模式\n- `references/custom-overlay.md` - 自定义覆盖物：DOM 创建、属性传递、事件绑定、旋转控制\n- `references/info-window.md` - 信息窗口：构造参数、内容/尺寸设置、最大化、与 Marker 配合使用\n\n### 3. 事件\n\n- `references/map-events.md` - 地图事件：绑定方式、交互事件、视图变化事件、生命周期事件\n- `references/overlay-events.md` - 覆盖物事件：通用事件、拖拽事件、矢量图形事件\n\n### 4. 地图样式\n\n- `references/map-style.md` - 个性化地图：自定义地图外观（颜色、显隐），实现深色主题、简洁地图等效果\n\n### 5. 图层服务\n\n- `references/xyz-layer.md` - 第三方图层：加载 XYZ/TMS/WMS/WMTS 标准瓦片\n- `references/mvt-layer.md` - 矢量瓦片：加载 MVT/PBF 格式瓦片，支持样式表达式、特征交互、状态管理\n\n### 6. 路径规划\n\n- `references/route-common.md` - 通用配置：构造参数、渲染选项、回调函数、数据结构、状态常量\n  - `references/driving-route.md` - 驾车：策略枚举、途经点、路况、收费、拖拽\n  - `references/walking-route.md` - 步行：转向类型、拖拽\n  - `references/riding-route.md` - 骑行：骑行搜索\n  - `references/transit-route.md` - 公交：市内/跨城策略、交通方式、换乘\n\n### 7. 其他LBS服务\n\n- `references/local-search.md` - 本地检索：普通/范围/周边检索、结果处理、翻页、POI 数据结构\n- `references/geocoder.md` - 地理编码：正地理编码（地址→坐标）、逆地理编码（坐标→地址）\n- `references/convertor.md` - 坐标转换：GPS/高德/谷歌坐标转百度坐标\n\n## 如何使用\n\n请阅读各个参考文件以获取详细说明和代码示例:\n\n```\nreferences/map-init.md\n```\n\n每个参考文件包含：\n\n- 功能简要说明\n- 完整代码示例及解释\n- API 参数说明和注意事项\n\n## 注意事项\n\n- `references/get-ak.md` - 获取密钥（AK）：当用户无 AK 或 AK 失效时，引导用户前往控制台申请浏览器端类型的 AK\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn778b6bf766ym71fdvrc5yvg98319rv\",\n  \"slug\": \"baidu-map-jsapi-gl\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1778554877946\n}\n\nFile v1.0.2:references/base-classes.md\n\n# 基础类\n\n## Point 坐标点\n\n表示地理坐标点（经纬度）。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Point(lng, lat)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `equals(other)` | boolean | 判断两个坐标点是否相等 |\n\n### 示例\n\n```javascript\n// 创建坐标点（BD09 经纬度坐标系）\nvar point = new BMapGL.Point(116.404, 39.915);\n\n// 获取坐标值\nconsole.log(point.lng);  // 116.404\nconsole.log(point.lat);  // 39.915\n\n// 比较两个点\nvar point2 = new BMapGL.Point(116.404, 39.915);\nconsole.log(point.equals(point2));  // true\n```\n\n### 坐标系说明\n\n百度地图 API 使用 **BD09** 坐标系（百度坐标系）。如果数据是其他坐标系（如 WGS84、GCJ02），需要先进行坐标转换。\n\n## Bounds 地理范围\n\n表示地理矩形区域。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Bounds(sw, ne)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| sw | Point | 西南角坐标 |\n| ne | Point | 东北角坐标 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `getSouthWest()` | Point | 获取西南角坐标 |\n| `getNorthEast()` | Point | 获取东北角坐标 |\n| `getCenter()` | Point | 获取中心点坐标 |\n| `containsPoint(point)` | boolean | 判断点是否在范围内 |\n| `extend(point)` | void | 扩展范围以包含指定点 |\n\n### 示例\n\n```javascript\n// 创建地理范围\nvar sw = new BMapGL.Point(116.3, 39.8);\nvar ne = new BMapGL.Point(116.5, 40.0);\nvar bounds = new BMapGL.Bounds(sw, ne);\n\n// 获取中心点\nvar center = bounds.getCenter();\n\n// 判断点是否在范围内\nvar point = new BMapGL.Point(116.4, 39.9);\nconsole.log(bounds.containsPoint(point));  // true\n\n// 获取当前地图视野范围\nvar mapBounds = map.getBounds();\n```\n\n## Size 尺寸\n\n表示像素尺寸。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Size(width, height)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度（像素） |\n| height | number | 高度（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度 |\n| height | number | 高度 |\n\n### 示例\n\n```javascript\n// 创建尺寸\nvar size = new BMapGL.Size(100, 80);\n\n// 获取地图容器尺寸\nvar containerSize = map.getContainerSize();\nconsole.log(containerSize.width, containerSize.height);\n```\n\n## Pixel 像素坐标\n\n表示像素坐标点。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Pixel(x, y)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标（像素） |\n| y | number | Y 坐标（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标 |\n| y | number | Y 坐标 |\n\n### 示例\n\n```javascript\n// 在事件对象中获取像素坐标\nmap.addEventListener('click', function(e) {\n    console.log('像素坐标:', e.pixel.x, e.pixel.y);\n    console.log('经纬度:', e.latlng.lng, e.latlng.lat);\n});\n\n// 像素坐标与经纬度转换\nvar point = map.pixelToPoint(new BMapGL.Pixel(100, 100));\nvar pixel = map.pointToPixel(new BMapGL.Point(116.404, 39.915));\n```\n\n## Icon 图标\n\n表示标注覆盖物所使用的图标。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Icon(image, size, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| image | string/Canvas/Image | - | 图片 URL 或 DOM |\n| size | Size | - | 显示尺寸 |\n| options.anchor | Size | 图标中心 | 定位点偏移 |\n| options.imageOffset | Size | `new Size(0, 0)` | 图片偏移 (雪碧图) |\n| options.imageSize | Size | 原始尺寸 | 图片尺寸 (2x 图需设置) |\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `setImageUrl(url)` | 设置图片 URL |\n| `setSize(size)` | 设置显示尺寸 |\n| `setAnchor(anchor)` | 设置定位点偏移 |\n| `setImageOffset(offset)` | 设置图片偏移 |\n| `setImageSize(size)` | 设置图片尺寸 |\n\n### 示例\n\n```javascript\n// 基础用法\nvar icon = new BMapGL.Icon(\n    'marker.png',\n    new BMapGL.Size(24, 32),\n    { anchor: new BMapGL.Size(12, 32) }  // 底部中心为定位点\n);\n\n// 雪碧图\nvar icon = new BMapGL.Icon(\n    'sprites.png',\n    new BMapGL.Size(24, 24),\n    {\n        anchor: new BMapGL.Size(12, 24),\n        imageOffset: new BMapGL.Size(-48, 0)  // 第三个图标\n    }\n);\n\n// 用于 Marker\nvar marker = new BMapGL.Marker(point, { icon: icon });\n```\n\nFile v1.0.2:references/circle.md\n\n# Circle 圆形\n\n## 快速开始\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nvar circle = new BMapGL.Circle(center, 1000, {\n    strokeColor: '#3366FF',\n    strokeWeight: 2,\n    fillColor: '#3366FF',\n    fillOpacity: 0.3\n});\nmap.addOverlay(circle);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Circle(center, radius, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| center | Point | - | 圆心坐标 (必需) |\n| radius | number | - | 半径，单位：米 (必需) |\n| options | Object | - | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| strokeColor | string | `'#000'` | 边框颜色，支持 '#xxxxxx'、'red'、'rgb(?,?,?)' |\n| strokeWeight | number | `2` | 边框宽度，单位像素 |\n| strokeOpacity | number | `1` | 边框透明度，取值范围 0-1 |\n| strokeStyle | string | `'solid'` | 边框样式：'solid'(实线)、'dashed'(虚线)、'dotted'(点线) |\n| fillColor | string | `'#fff'` | 填充颜色 |\n| fillOpacity | number | `0.6` | 填充透明度，取值范围 0-1 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableEditing | boolean | `false` | 是否开启可编辑模式 |\n| zIndex | number | `0` | 层级 |\n\n## 方法\n\n### 中心点\n\n```javascript\n// 设置圆心\ncircle.setCenter(new BMapGL.Point(116.410, 39.920));\n\n// 获取圆心\nvar center = circle.getCenter();  // 返回 Point\n```\n\n### 半径\n\n```javascript\n// 设置半径（单位：米）\ncircle.setRadius(2000);\n\n// 获取半径\nvar radius = circle.getRadius();  // 返回 number\n```\n\n### 边框样式\n\n```javascript\n// 颜色\ncircle.setStrokeColor('#FF0000');\nvar color = circle.getStrokeColor();\n\n// 宽度\ncircle.setStrokeWeight(3);\nvar weight = circle.getStrokeWeight();\n\n// 透明度\ncircle.setStrokeOpacity(0.8);\nvar opacity = circle.getStrokeOpacity();\n\n// 线型\ncircle.setStrokeStyle('dashed');\nvar style = circle.getStrokeStyle();\n```\n\n### 填充样式\n\n```javascript\n// 填充颜色\ncircle.setFillColor('#00FF00');\nvar fillColor = circle.getFillColor();\n\n// 填充透明度\ncircle.setFillOpacity(0.5);\nvar fillOpacity = circle.getFillOpacity();\n```\n\n### 几何信息\n\n```javascript\n// 获取圆形的地理范围（外接矩形）\nvar bounds = circle.getBounds();  // 返回 Bounds\n\n// 获取近似圆周长（墨卡托单位，非实际距离），返回的是近似圆的多边形边界点连线长度，不是数学圆周长 2πr\nvar length = circle.getLength();\n\n// 获取近似圆的边界路径点\nvar path = circle.getPath();  // 返回 Array<Point>，约40个点\n```\n\n### 显示隐藏\n\n```javascript\ncircle.show();   // 显示\ncircle.hide();   // 隐藏\n```\n\n### 编辑\n\n编辑模式下有两个控制点：\n- 中心点：拖拽移动圆形\n- 圆周点：拖拽改变半径\n\n```javascript\ncircle.enableEditing();   // 开启编辑模式\ncircle.disableEditing();  // 关闭编辑模式\n```\n\n### 批量配置\n\n```javascript\ncircle.setOptions({\n    strokeColor: '#FF6600',\n    fillColor: '#FF6600',\n    fillOpacity: 0.4\n});\n```\n\n## 常见场景\n\n### 可编辑圆形\n\n```javascript\nvar circle = new BMapGL.Circle(center, 1000, {\n    enableEditing: true\n});\n\nmap.addOverlay(circle);\n\n// 监听编辑完成事件\ncircle.addEventListener('lineupdate', function(e) {\n    var overlay = e.overlay;\n    console.log('新圆心:', overlay.getCenter());\n    console.log('新半径:', overlay.getRadius(), '米');\n});\n```\n\nFile v1.0.2:references/constants.md\n\n# 通用常量\n\n## 搜索状态常量\n\n所有 LBS 服务（LocalSearch、Geocoder、路径规划等）共用的状态码。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_STATUS_SUCCESS | 0 | 检索成功 |\n| BMAP_STATUS_CITY_LIST | 1 | 返回城市列表（需选择城市后重新检索） |\n| BMAP_STATUS_UNKNOWN_LOCATION | 2 | 位置未知 |\n| BMAP_STATUS_UNKNOWN_ROUTE | 3 | 路线未知/无法规划 |\n| BMAP_STATUS_INVALID_KEY | 4 | 非法密钥 |\n| BMAP_STATUS_INVALID_REQUEST | 5 | 非法请求 |\n| BMAP_STATUS_PERMISSION_DENIED | 6 | 没有权限 |\n| BMAP_STATUS_SERVICE_UNAVAILABLE | 7 | 服务不可用 |\n| BMAP_STATUS_TIMEOUT | 8 | 超时 |\n\n## POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\nFile v1.0.2:references/convertor.md\n\n# Convertor 坐标转换\n\n用于将其他坐标系（GPS、高德、谷歌等）转换为百度坐标系。\n\n## 快速开始\n\n```javascript\nvar convertor = new BMapGL.Convertor();\nvar points = [new BMapGL.Point(116.32715863448607, 39.990912172420714)];\n\nconvertor.translate(points, COORDINATES_WGS84, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        map.addOverlay(new BMapGL.Marker(data.points[0]));\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Convertor()\n```\n\n无参数。\n\n## 方法\n\n### translate\n\n将坐标从源坐标系转换为目标坐标系。\n\n```javascript\nconvertor.translate(points, from, to, callback)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| points | Array\\<Point\\> | - | 待转换的坐标数组 |\n| from | number | 1 | 源坐标系类型 |\n| to | number | 5 | 目标坐标系类型（仅支持 5 或 6） |\n| callback | function | - | 转换完成回调 |\n\n**回调参数：**\n\n```javascript\ncallback(data)\n```\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| status | number | 状态码，0 表示成功 |\n| points | Array\\<Point\\> | 转换后的坐标数组（成功时） |\n\n## 坐标系常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| COORDINATES_WGS84 | 1 | GPS 坐标 |\n| COORDINATES_WGS84_MC | 2 | GPS 米制坐标 |\n| COORDINATES_GCJ02 | 3 | 高德、谷歌、腾讯坐标（火星坐标系） |\n| COORDINATES_GCJ02_MC | 4 | GCJ02 米制坐标 |\n| COORDINATES_BD09 | 5 | 百度经纬度坐标 |\n| COORDINATES_BD09_MC | 6 | 百度米制坐标 |\n| COORDINATES_MAPBAR | 7 | Mapbar 坐标 |\n| COORDINATES_51 | 8 | 51 地图坐标 |\n\n**限制：** 目标坐标系（to）仅支持 `COORDINATES_BD09`(5) 和 `COORDINATES_BD09_MC`(6)。\n\n## 示例\n\n### 批量转换\n\n```javascript\nvar points = [\n    new BMapGL.Point(116.397428, 39.90923),\n    new BMapGL.Point(116.407428, 39.91923),\n    new BMapGL.Point(116.417428, 39.92923)\n];\n\nvar convertor = new BMapGL.Convertor();\nconvertor.translate(points, COORDINATES_GCJ02, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        data.points.forEach(function(point, index) {\n            map.addOverlay(new BMapGL.Marker(point));\n        });\n    }\n});\n```\n\n## 注意事项\n\n1. 百度地图使用 BD09 坐标系，直接使用 GPS 或其他地图坐标会产生偏移\n2. 转换为异步操作，结果通过回调返回\n3. 转换失败时 `data.status` 非 0，`data.points` 不存在\n4. 常量定义在全局 `window` 对象上，可直接使用\n\nFile v1.0.2:references/custom-overlay.md\n\n# CustomOverlay 自定义覆盖物\n\n用于在地图上添加自定义 HTML DOM 元素的覆盖物，可以实现信息卡片、自定义标注等复杂展示效果。\n\n## 快速开始\n\n```javascript\n// 定义 DOM 创建函数\nfunction createDOM() {\n    var div = document.createElement('div');\n    div.style.cssText = 'background:#fff; padding:10px; border-radius:4px;';\n    div.innerHTML = '<h4>故宫博物院</h4><p>建于1420年</p>';\n    return div;\n}\n\n// 创建自定义覆盖物\nvar customOverlay = new BMapGL.CustomOverlay(createDOM, {\n    point: new BMapGL.Point(116.403, 39.924)\n});\n\nmap.addOverlay(customOverlay);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.CustomOverlay(createDom, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| createDom | Function | 创建 DOM 的回调函数，返回 HTMLElement (必需) |\n| options | Object | 配置参数 |\n\n### createDom 函数\n\n创建 DOM 元素的回调函数。函数内部 `this` 指向覆盖物实例，可通过 `this.properties` 访问自定义属性。\n\n```javascript\nfunction createDOM() {\n    var div = document.createElement('div');\n    // 访问自定义属性\n    div.textContent = this.properties.title;\n    return div;\n}\n```\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| point | Point | - | 覆盖物坐标位置 (必需) |\n| offsetX | number | `0` | X 轴像素偏移量，正值向右 |\n| offsetY | number | `0` | Y 轴像素偏移量，正值向下 |\n| anchors | Array | `[0.5, 1]` | 锚点，范围 [0,1]，[0,0] 为左上角，[0.5,1] 为底部居中 |\n| minZoom | number | `3` | 最小显示缩放级别 |\n| maxZoom | number | `21` | 最大显示缩放级别 |\n| zIndex | number | `0` | CSS z-index 层级 |\n| visible | boolean | `true` | 初始是否可见 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableDraggingMap | boolean | `false` | 在覆盖物上是否允许拖拽地图 |\n| properties | Object | `{}` | 自定义属性，可在 createDom 中通过 this.properties 访问 |\n| fixBottom | boolean | `false` | 是否固定在 DOM 底部对齐 |\n\n### 高级选项\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| useTranslate | boolean | `false` | 使用 CSS translate3d 定位，性能更好 |\n| nextTick | boolean | `false` | 异步渲染，解决 div 自适应宽度问题 |\n| rotationInit | number | `0` | 初始旋转角度（度） |\n| rotationFlip | boolean | `false` | 旋转时是否允许翻转 |\n| autoFollowHeadingChanged | boolean | `false` | 是否跟随地图旋转自动调整角度 |\n| synUpdate | boolean | `false` | 是否同步更新（监听地图 ondraw 事件） |\n\n## 方法\n\n### 位置\n\n```javascript\ncustomOverlay.setPoint(new BMapGL.Point(116.404, 39.915));\nvar pos = customOverlay.getPoint();  // 返回 Point\n```\n\n### 属性\n\n获取或更新自定义属性。`setProperties` 采用**增量合并**方式（Object.assign），新属性会与原有属性合并，而非整体替换。更新后会触发 DOM 重建。\n\n```javascript\n// 获取属性\nvar props = customOverlay.getProperties();\n\n// 更新属性（增量合并，会重新调用 createDom）\ncustomOverlay.setProperties({\n    title: '新标题',\n    content: '新内容'\n});\n// 原有的其他属性（如 imgSrc）会保留\n```\n\n### 旋转\n\n```javascript\ncustomOverlay.setRotation(45);  // 设置旋转角度\nvar angle = customOverlay.getRotation();  // 获取当前角度\n```\n\n## 事件\n\n支持的事件类型：`click`、`mouseover`、`mouseout`\n\n```javascript\ncustomOverlay.addEventListener('click', function(e) {\n    console.log('点击位置:', e.latLng);  // 地理坐标\n    console.log('像素位置:', e.pixel);   // 屏幕像素坐标\n});\n```\n\n## 常见场景\n\n### 信息卡片\n\n```javascript\nfunction createInfoCard() {\n    var div = document.createElement('div');\n    div.className = 'info-card';\n    div.innerHTML = `\n        <img src=\"${this.properties.imgSrc}\" />\n        <h4>${this.properties.title}</h4>\n        <p>${this.properties.desc}</p>\n    `;\n    return div;\n}\n\nvar infoCard = new BMapGL.CustomOverlay(createInfoCard, {\n    point: new BMapGL.Point(116.403, 39.924),\n    offsetY: -10,\n    properties: {\n        title: '故宫博物院',\n        desc: '中国明清两代的皇家宫殿',\n        imgSrc: 'gugong.jpg'\n    }\n});\n\nmap.addOverlay(infoCard);\n```\n\nFile v1.0.2:references/driving-route.md\n\n# DrivingRoute 驾车路线规划\n\n用于规划两点之间的驾车路线，支持途经点、多种策略选择和路况信息显示。\n\n## 快速开始\n\n```javascript\nvar driving = new BMapGL.DrivingRoute(map, {\n    policy: BMAP_DRIVING_POLICY_AVOID_CONGESTION,\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (driving.getStatus() === BMAP_STATUS_SUCCESS) {\n            var plan = results.getPlan(0);\n            console.log('距离：' + plan.getDistance());\n            console.log('耗时：' + plan.getDuration());\n        }\n    }\n});\n\nvar start = new BMapGL.Point(116.33, 39.90);\nvar end = new BMapGL.Point(116.61, 40.08);\ndriving.search(start, end);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.DrivingRoute(location, options)\n```\n\n驾车继承使用通用配置，详见 [route-common.md](./route-common.md)。\n\n### 驾车专有配置\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| policy | number | `0` | 驾车策略，详见下方策略枚举 |\n| alternatives | number | `0` | 返回的备选路线数量 |\n| enableTraffic | boolean | `false` | 是否启用路况信息 |\n\n### renderOptions 扩展配置\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| enableDragging | boolean | 是否启用路线拖拽功能 |\n| lineLayerStyle.strokeTextureUrl | string | 线纹理 URL |\n| lineLayerStyle.lineLayerColor.color | string | 线颜色（十六进制） |\n| lineLayerStyle.lineLayerColor.opacity | number | 线透明度（0-1） |\n\n## 驾车策略枚举\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_DRIVING_POLICY_DEFAULT | 0 | 默认策略 |\n| BMAP_DRIVING_POLICY_DESTANCE | 2 | 最短距离 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS | 3 | 避开高速 |\n| BMAP_DRIVING_POLICY_FIRST_HIGHWAYS | 4 | 优先高速 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION | 5 | 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_PAY | 6 | 避开收费 |\n| BMAP_DRIVING_POLICY_HIGHWAYS_AVOID_CONGESTION | 7 | 高速优先 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION | 8 | 避开高速 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION_PAY | 9 | 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION_PAY | 10 | 避开高速 + 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_PAY | 11 | 避开高速 + 避开收费 |\n\n## 途经点搜索\n\n驾车路线支持设置最多 10 个途经点：\n\n```javascript\ndriving.search(start, end, {\n    waypoints: [\n        new BMapGL.Point(116.42, 39.92),\n        new BMapGL.Point(116.45, 39.91)\n    ]\n});\n```\n\n## 路况状态常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_TRAFFICE_STATUS_NONE | 0 | 无路况信息 |\n| BMAP_TRAFFICE_STATUS_NORMAL | 1 | 畅通 |\n| BMAP_TRAFFICE_STATUS_SLOW | 2 | 缓行 |\n| BMAP_TRAFFICE_STATUS_JAM | 3 | 拥堵 |\n\n## 注意事项\n\n1. **不支持 String 类型**：start/end 只能使用 Point 或 LocalResultPoi，不支持地址字符串\n2. **途经点**：仅驾车支持，最多 10 个\n3. **路线拖拽**：仅驾车支持 `enableDragging`\n4. `getRouteType()` 返回 `BMAP_ROUTE_TYPE_DRIVING`（3）\n5. **收费信息**：`getToll()`、`getTollDistance()` 仅 TruckRoute（货车）支持，普通驾车不支持\n\nFile v1.0.2:references/geocoder.md\n\n# Geocoder 地理编码\n\n用于地址与坐标的相互转换：正地理编码（地址 → 坐标）和逆地理编码（坐标 → 地址）。\n\n## 快速开始\n\n```javascript\nvar myGeo = new BMapGL.Geocoder();\n\n// 正地理编码：地址 → 坐标\nmyGeo.getPoint('北京市海淀区上地十街10号', function(point) {\n    if (point) {\n        map.centerAndZoom(point, 16);\n        map.addOverlay(new BMapGL.Marker(point));\n    }\n}, '北京市');\n\n// 逆地理编码：坐标 → 地址\nmyGeo.getLocation(new BMapGL.Point(116.404, 39.915), function(result) {\n    if (result) {\n        console.log(result.address);\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Geocoder(options)\n```\n\n## 方法\n\n### getPoint 正地理编码\n\n将地址解析为坐标。\n\n```javascript\ngeocoder.getPoint(address, callback, city)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| address | string | 地址字符串 |\n| callback | function | 回调函数 |\n| city | string | 城市名称，可选，默认全国范围检索 |\n\n**回调参数：**\n\n```javascript\ncallback(point, detailInfo)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point \\| null | 解析成功返回坐标，失败返回 null |\n| detailInfo | object | 详细信息对象 |\n\n**detailInfo 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| city | string | 城市名称 |\n| citycode | string | 城市代码 |\n| address | string | 规范化后的地址 |\n| precise | number | 精确性：0=精确，1=前向匹配 |\n| confidence | number | 置信度（0-100） |\n| level | string | 地址级别：地址、街道、地区、城市、省份、国家 |\n\n### getLocation 逆地理编码\n\n将坐标解析为地址。\n\n```javascript\ngeocoder.getLocation(point, callback, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 坐标点 |\n| callback | function | 回调函数，参数为 GeocoderResult 或 null |\n| options | object | 可选配置 |\n\n**options 配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| poiRadius | number | 100 | 周边 POI 搜索半径（米） |\n| numPois | number | 10 | 返回的 POI 个数 |\n\n## GeocoderResult 结果对象\n\n逆地理编码返回的结果对象。\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 查询点坐标 |\n| address | string | 完整地址描述 |\n| addressComponents | object | 地址组成部分 |\n| surroundingPois | Array | 周边 POI 数组 |\n| business | string | 商业区信息 |\n\n**addressComponents 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| province | string | 省份 |\n| city | string | 城市 |\n| district | string | 区县 |\n| street | string | 街道名称 |\n| streetNumber | string | 街道号码 |\n\n**surroundingPois 数组元素：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| title | string | POI 名称 |\n| uid | string | POI 唯一标识 |\n| point | Point | POI 坐标 |\n| address | string | POI 地址 |\n| city | string | POI 所在城市 |\n| phoneNumber | string | 电话 |\n| postcode | string | 邮编 |\n| type | number | POI 类型（BMAP_POI_TYPE_NORMAL） |\n| tags | Array | 分类标签数组 |\n\n## 语言常量\n\nGeocoder 仅支持中英文，其他语言会回退为中文。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAPGL_LANGUAGE_ZH | 'zh' | 中文（简体）**默认** |\n| BMAPGL_LANGUAGE_EN | 'en' | 英语 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 正地理编码指定 city 参数可提高解析准确性和速度\n2. 逆地理编码的 poiRadius 过大会影响响应速度\n3. 解析失败时 callback 的 point 参数为 null\n4. 返回坐标为 BD09 坐标系\n\nFile v1.0.2:references/get-ak.md\n\n# 获取密钥（AK）\n\n百度地图 JSAPI 需要使用 AK（Access Key）进行鉴权。使用任何地图功能前，必须先申请 AK。\n\n## 当用户无 AK 或 AK 失效时\n\n如果用户尚未拥有 AK，或者现有 AK 已失效（如被禁用、配额用尽、白名单不匹配等），请提示用户按照以下流程获取或更新 AK：\n\n> 您需要一个有效的百度地图 AK 才能使用 JSAPI。请前往 [百度地图开放平台控制台](https://lbsyun.baidu.com/apiconsole/key) 创建或管理您的应用密钥。\n\n## 申请流程\n\n1. **进入控制台**：登录 [百度地图开放平台](https://lbsyun.baidu.com/)，点击页面上方的 **控制台**，然后在左侧边栏点击 **应用管理** → **我的应用** → **创建应用**。\n\n2. **填写应用信息**：\n   - **应用名称**：自定义名称\n   - **应用类型**：JS API 必须选择 **浏览器端**\n   - **启用服务**：默认全部勾选，可按需调整\n   - **请求校验方式**：根据实际需求选择（IP 白名单 / Referer 白名单）\n   - **白名单**：填写允许调用的域名或 IP（开发阶段可填写 `*`）\n\n3. **提交并复制 AK**：创建完成后，在应用列表中复制 AK 即可使用。\n\n## 注意事项\n\n- **应用类型必须匹配**：JS API 只支持 **浏览器端** 类型的 AK，移动端需创建 Android/iOS SDK 类型，服务端需创建服务端类型。\n- **权限配置**：每个 AK 可对应不同的基础服务权限，请确保所需服务已勾选启用。\n- **配额监控**：可在控制台查看每个 AK 的配额使用量，避免因配额耗尽导致服务不可用。\n- **白名单安全**：生产环境请务必配置准确的白名单，避免使用 `*` 通配符。\n\n## AK 无效排查\n\n当地图加载失败或控制台提示 AK 相关错误时，请先确认以下几点：\n\n1. **AK 是否为浏览器端类型**：JS API 只支持浏览器端类型的 AK，使用服务端或移动端类型的 AK 会导致鉴权失败。\n2. **AK 是否正确填写**：检查 script 标签中的 `ak` 参数是否完整、无多余空格。\n3. **AK 是否仍然有效**：前往 [控制台](https://lbsyun.baidu.com/apiconsole/key) 确认 AK 状态正常、未被禁用或删除。\n\n如确认 AK 无误仍无法使用，建议在控制台重新创建一个浏览器端类型的 AK。\n\n## 在代码中使用 AK\n\n```html\n<!-- 将 YOUR_AK 替换为您申请的密钥 -->\n<script src=\"//api.map.baidu.com/api?v=1.0&type=webgl&ak=YOUR_AK\"></script>\n```\n\nFile v1.0.2:references/info-window.md\n\n# InfoWindow 信息窗口\n\n信息窗口用于在地图上显示详细信息，通常配合 Marker 使用。地图上同时只能打开一个信息窗口。\n\n## 快速开始\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('这是内容', {\n    width: 250,\n    height: 100,\n    title: '标题'\n});\n\nvar point = new BMapGL.Point(116.404, 39.915);\nmap.openInfoWindow(infoWindow, point);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.InfoWindow(content, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| content | string \\| HTMLElement | 信息窗口内容，支持 HTML 片段或 DOM 元素 |\n| options | Object | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| width | number | `0` | 宽度（220-730px），0 表示自适应 |\n| height | number | `0` | 高度（60-650px），0 表示自适应 |\n| maxWidth | number | `600` | 最大化时的宽度（220-730px） |\n| title | string | `''` | 标题，支持 HTML 片段 |\n| offset | Size | `new Size(0, 0)` | 底部尖角相对于锚点的像素偏移 |\n| enableMaximize | boolean | `false` | 是否显示最大化按钮 |\n| enableAutoPan | boolean | `true` | 是否自动平移地图使窗口完全可见 |\n| enableCloseOnClick | boolean | `true` | 点击地图时是否关闭窗口 |\n| maxContent | string | `''` | 最大化时显示的内容 |\n| margin | Array | `[10, 10, 40, 10]` | 与地图边界的边距 [上, 右, 下, 左] |\n\n## 方法\n\n### 内容\n\n```javascript\ninfoWindow.setContent('<div>新内容</div>');\ninfoWindow.setContent(document.getElementById('content'));  // DOM 元素\nvar content = infoWindow.getContent();\n\ninfoWindow.setTitle('新标题');\nvar title = infoWindow.getTitle();\n\ninfoWindow.setMaxContent('<div>最大化内容</div>');  // 需启用 enableMaximize\n```\n\n### 尺寸\n\n```javascript\ninfoWindow.setWidth(300);     // 220-730px，0 为自适应\ninfoWindow.setHeight(200);    // 60-650px，0 为自适应\ninfoWindow.setMaxWidth(500);  // 最大化时的宽度\n```\n\n### 显示控制\n\n```javascript\n// 打开 - 通过 map 或 marker\nmap.openInfoWindow(infoWindow, point);\nmarker.openInfoWindow(infoWindow);\n\n// 关闭\ninfoWindow.close();\nmap.closeInfoWindow();\nmarker.closeInfoWindow();\n\n// 状态查询\nvar isOpen = infoWindow.isOpen();\n\n// 重绘（内容变化后调用）\ninfoWindow.redraw();\n```\n\n### 最大化\n\n```javascript\ninfoWindow.enableMaximize();   // 显示最大化按钮\ninfoWindow.disableMaximize();  // 隐藏最大化按钮\ninfoWindow.maximize();         // 最大化\ninfoWindow.restore();          // 还原\n```\n\n### 自动平移\n\n打开窗口时自动平移地图，确保窗口完全可见。\n\n```javascript\ninfoWindow.enableAutoPan();   // 启用\ninfoWindow.disableAutoPan();  // 禁用\n```\n\n### 点击关闭\n\n```javascript\ninfoWindow.enableCloseOnClick();   // 点击地图关闭窗口\ninfoWindow.disableCloseOnClick();  // 禁用\n```\n## 事件\n\n```javascript\ninfoWindow.addEventListener('open', function(e) {\n    console.log('窗口打开', e.point);\n});\n\ninfoWindow.addEventListener('close', function(e) {\n    console.log('窗口关闭', e.point);\n});\n\ninfoWindow.addEventListener('clickclose', function() {\n    console.log('点击关闭按钮');\n});\n\ninfoWindow.addEventListener('maximize', function() {\n    console.log('窗口最大化');\n});\n\ninfoWindow.addEventListener('restore', function() {\n    console.log('窗口还原');\n});\n```\n\n\n## 常见场景\n\n### 带最大化功能\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('简要内容', {\n    width: 250,\n    height: 100,\n    title: '详情',\n    enableMaximize: true,\n    maxWidth: 500,\n    maxContent: '<div>这里是更详细的内容...</div>'\n});\n\nmap.openInfoWindow(infoWindow, point);\n```\n\n### 阻止关闭\n\n通过 `onClosing` 回调返回 `false` 可阻止窗口关闭。\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('内容', {\n    width: 200,\n    onClosing: function() {\n        if (!confirm('确定关闭？')) {\n            return false;  // 阻止关闭\n        }\n        return true;\n    }\n});\n```\n\n\n## 注意事项\n\n1. **单例限制**：地图上同时只能打开一个信息窗口，打开新窗口会自动关闭之前的\n2. **尺寸范围**：宽度 220-730px，高度 60-650px，超出范围会被限制\n3. **内存管理**：不再使用的信息窗口应调用 `dispose()` 释放资源\n\nFile v1.0.2:references/local-search.md\n\n# LocalSearch 本地检索\n\n用于 POI 检索，支持普通检索、范围检索和周边检索。\n\n## 快速开始\n\n```javascript\nvar local = new BMapGL.LocalSearch(map, {\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (local.getStatus() === BMAP_STATUS_SUCCESS) {\n            for (var i = 0; i < results.getCurrentNumPois(); i++) {\n                console.log(results.getPoi(i).title);\n            }\n        }\n    }\n});\nlocal.search('餐厅');\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.LocalSearch(location, options)\n```\n\n### location 参数\n\n| 类型 | 说明 |\n|------|------|\n| Map | 地图实例，以当前视野为检索范围 |\n| Point | 坐标点，以所在城市为范围 |\n| String | 城市名称，如 `\"北京市\"` |\n| Number | 城市代码（如北京 131、上海 289） |\n\n### options 配置\n\n通用配置（renderOptions、回调函数、language）参见 [route-common.md](./route-common.md)。\n\n**LocalSearch 专有配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| pageCapacity | number | `10` | 每页结果数（1-100） |\n| pageNum | number | `0` | 初始页码 |\n\n**renderOptions 扩展：**\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| selectFirstResult | boolean | 是否自动选中第一个结果 |\n\n## 检索方法\n\n### 普通检索\n\n```javascript\nlocal.search(keyword)\n```\n\n在构造函数指定的区域内检索，支持多关键字（最多 10 个）。\n\n```javascript\n// 单关键字\nlocal.search('银行');\n\n// 多关键字\nlocal.search(['银行', '酒店']);\n```\n\n### 范围检索\n\n```javascript\nlocal.searchInBounds(keyword, bounds)\n```\n\n在指定矩形范围内检索。\n\n```javascript\nvar bounds = new BMapGL.Bounds(\n    new BMapGL.Point(116.30, 39.85),\n    new BMapGL.Point(116.50, 39.95)\n);\nlocal.searchInBounds('餐厅', bounds);\n```\n\n### 周边检索\n\n```javascript\nlocal.searchNearby(keyword, center, radius)\n```\n\n以指定点为圆心、指定半径范围内检索。\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nlocal.searchNearby('超市', center, 1000);  // 半径 1000 米\n```\n\n## 实例方法\n\n| 方法 | 说明 |\n|------|------|\n| getResults() | 获取结果（多关键字返回数组） |\n| getStatus() | 获取状态码 |\n| clearResults() | 清除结果 |\n| gotoPage(num) | 跳转到指定页 |\n| setPageCapacity(num) / getPageCapacity() | 设置/获取每页结果数 |\n| setPageNum(num) / getPageNum() | 设置/获取页码 |\n| setLocation(loc) | 设置检索区域 |\n| enableAutoViewport() / disableAutoViewport() | 启用/禁用自动调整视野 |\n| enableFirstResultSelection() / disableFirstResultSelection() | 启用/禁用自动选中首个结果 |\n\n## LocalResult 结果对象\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| getPoi(index) | Object | 获取第 index 个 POI（坐标已转换） |\n| getNumPois() | number | 结果总数 |\n| getCurrentNumPois() | number | 当前页结果数 |\n| getNumPages() | number | 总页数 |\n| getPageIndex() | number | 当前页索引 |\n| getCenter() | Point | 获取周边检索中心点（坐标已转换） |\n| getBounds() | Bounds | 获取范围检索的范围（坐标已转换） |\n| getCityList() | Array | 获取城市列表（跨城检索时） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| keyword | string | 检索关键字 |\n| city | string | 结果所在城市 |\n| province | string | 结果所在省份 |\n| center | Point | 周边检索的中心点（原始坐标） |\n| radius | number | 周边检索的半径 |\n| bounds | Bounds | 范围检索的范围（原始坐标） |\n| viewport | Bounds | 地图最佳视野 |\n| moreResultsUrl | string | 更多结果 URL |\n| suggestions | Array | 搜索建议列表 |\n\n## POI 对象\n\n基础属性参见 [LocalResultPoi](./route-common.md#localresultpoi-结果点信息)。LocalSearch 返回的 POI 包含以下扩展属性：\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| phoneNumber | string | 电话 |\n| detailUrl | string | 百度地图详情页 URL |\n| type | number | 类型，见下方常量 |\n| isAccurate | boolean | 是否精确定位 |\n\n### POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 多关键字最多 10 个，结果返回 LocalResult 数组\n2. 周边检索半径最大 100000 米，默认 2000 米\n3. 状态码为 `BMAP_STATUS_CITY_LIST` 时需通过 `getCityList()` 选择城市后重新检索\n4. **坐标转换**：使用 `getPoi()`、`getCenter()`、`getBounds()` 方法获取的坐标会自动转换为当前地图坐标系；直接访问 `center`、`bounds` 属性则是原始 BD09 坐标\n\nArchive v1.0.1: 26 files, 44582 bytes\n\nFiles: references/base-classes.md (4598b), references/circle.md (3485b), references/constants.md (859b), references/convertor.md (2514b), references/custom-overlay.md (4401b), references/driving-route.md (3255b), references/geocoder.md (3733b), references/get-ak.md (2513b), references/info-window.md (4375b), references/local-search.md (4884b), references/map-events.md (6932b), references/map-init.md (6713b), references/map-style.md (7331b), references/marker.md (3600b), references/mvt-layer.md (3379b), references/overlay-common.md (1539b), references/overlay-events.md (2843b), references/polygon.md (5429b), references/polyline.md (4440b), references/riding-route.md (586b), references/route-common.md (6716b), references/transit-route.md (5527b), references/walking-route.md (858b), references/xyz-layer.md (3253b), SKILL.md (3877b), _meta.json (137b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: bmap-jsapi-gl\ndescription: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。\nlicense: MIT\nversion: 1.0.1\nmetadata:\n  openclaw:\n    requires:\n      env: BMAP_JSAPI_KEY\n    primaryEnv: BMAP_JSAPI_KEY\n---\n\n# JSAPI GL 开发指南\n\n百度地图 JSAPI WebGL 版本开发指南。包含地图初始化、覆盖物、事件、图层等核心模块的 API 说明和代码示例，旨在帮助开发者快速集成百度地图并遵循正确的使用方式。\n\n## 何时适用\n\n在以下场景中参考这些指南：\n\n- 创建新的地图页面或组件\n- 在地图上添加标注、折线、多边形等覆盖物\n- 处理地图交互事件（点击、拖拽、缩放等）\n- 配置地图样式或切换图层\n- 调试地图渲染或性能问题\n\n\n## 快速参考\n\n### 0. 基础概念\n\n- `references/base-classes.md` - 基础类：Point、Bounds、Size、Pixel、Icon\n- `references/constants.md` - 通用常量：搜索状态码、POI 类型\n\n### 1. 地图\n\n- `references/map-init.md` - 地图初始化：资源引入、创建实例、配置选项、交互与视图控制\n\n### 2. 地图覆盖物\n\n- `references/overlay-common.md` - 覆盖物通用操作：添加/移除、显示/隐藏、批量清除\n- `references/marker.md` - 点标记：构造参数、位置/图标/旋转/置顶/拖拽方法\n- `references/polyline.md` - 折线：构造参数、线条样式、坐标操作、编辑模式\n- `references/polygon.md` - 多边形：构造参数、边框/填充样式、带孔多边形、编辑模式\n- `references/circle.md` - 圆形：构造参数、中心点/半径、样式设置、编辑模式\n- `references/custom-overlay.md` - 自定义覆盖物：DOM 创建、属性传递、事件绑定、旋转控制\n- `references/info-window.md` - 信息窗口：构造参数、内容/尺寸设置、最大化、与 Marker 配合使用\n\n### 3. 事件\n\n- `references/map-events.md` - 地图事件：绑定方式、交互事件、视图变化事件、生命周期事件\n- `references/overlay-events.md` - 覆盖物事件：通用事件、拖拽事件、矢量图形事件\n\n### 4. 地图样式\n\n- `references/map-style.md` - 个性化地图：自定义地图外观（颜色、显隐），实现深色主题、简洁地图等效果\n\n### 5. 图层服务\n\n- `references/xyz-layer.md` - 第三方图层：加载 XYZ/TMS/WMS/WMTS 标准瓦片\n- `references/mvt-layer.md` - 矢量瓦片：加载 MVT/PBF 格式瓦片，支持样式表达式、特征交互、状态管理\n\n### 6. 路径规划\n\n- `references/route-common.md` - 通用配置：构造参数、渲染选项、回调函数、数据结构、状态常量\n  - `references/driving-route.md` - 驾车：策略枚举、途经点、路况、收费、拖拽\n  - `references/walking-route.md` - 步行：转向类型、拖拽\n  - `references/riding-route.md` - 骑行：骑行搜索\n  - `references/transit-route.md` - 公交：市内/跨城策略、交通方式、换乘\n\n### 7. 其他LBS服务\n\n- `references/local-search.md` - 本地检索：普通/范围/周边检索、结果处理、翻页、POI 数据结构\n- `references/geocoder.md` - 地理编码：正地理编码（地址→坐标）、逆地理编码（坐标→地址）\n- `references/convertor.md` - 坐标转换：GPS/高德/谷歌坐标转百度坐标\n\n## 如何使用\n\n请阅读各个参考文件以获取详细说明和代码示例:\n\n```\nreferences/map-init.md\n```\n\n每个参考文件包含：\n\n- 功能简要说明\n- 完整代码示例及解释\n- API 参数说明和注意事项\n\n## 注意事项\n\n- `references/get-ak.md` - 获取密钥（AK）：当用户无 AK 或 AK 失效时，引导用户前往控制台申请浏览器端类型的 AK\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn778b6bf766ym71fdvrc5yvg98319rv\",\n  \"slug\": \"baidu-map-jsapi-gl\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1775212569915\n}\n\nFile v1.0.1:references/base-classes.md\n\n# 基础类\n\n## Point 坐标点\n\n表示地理坐标点（经纬度）。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Point(lng, lat)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `equals(other)` | boolean | 判断两个坐标点是否相等 |\n\n### 示例\n\n```javascript\n// 创建坐标点（BD09 经纬度坐标系）\nvar point = new BMapGL.Point(116.404, 39.915);\n\n// 获取坐标值\nconsole.log(point.lng);  // 116.404\nconsole.log(point.lat);  // 39.915\n\n// 比较两个点\nvar point2 = new BMapGL.Point(116.404, 39.915);\nconsole.log(point.equals(point2));  // true\n```\n\n### 坐标系说明\n\n百度地图 API 使用 **BD09** 坐标系（百度坐标系）。如果数据是其他坐标系（如 WGS84、GCJ02），需要先进行坐标转换。\n\n## Bounds 地理范围\n\n表示地理矩形区域。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Bounds(sw, ne)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| sw | Point | 西南角坐标 |\n| ne | Point | 东北角坐标 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `getSouthWest()` | Point | 获取西南角坐标 |\n| `getNorthEast()` | Point | 获取东北角坐标 |\n| `getCenter()` | Point | 获取中心点坐标 |\n| `containsPoint(point)` | boolean | 判断点是否在范围内 |\n| `extend(point)` | void | 扩展范围以包含指定点 |\n\n### 示例\n\n```javascript\n// 创建地理范围\nvar sw = new BMapGL.Point(116.3, 39.8);\nvar ne = new BMapGL.Point(116.5, 40.0);\nvar bounds = new BMapGL.Bounds(sw, ne);\n\n// 获取中心点\nvar center = bounds.getCenter();\n\n// 判断点是否在范围内\nvar point = new BMapGL.Point(116.4, 39.9);\nconsole.log(bounds.containsPoint(point));  // true\n\n// 获取当前地图视野范围\nvar mapBounds = map.getBounds();\n```\n\n## Size 尺寸\n\n表示像素尺寸。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Size(width, height)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度（像素） |\n| height | number | 高度（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度 |\n| height | number | 高度 |\n\n### 示例\n\n```javascript\n// 创建尺寸\nvar size = new BMapGL.Size(100, 80);\n\n// 获取地图容器尺寸\nvar containerSize = map.getContainerSize();\nconsole.log(containerSize.width, containerSize.height);\n```\n\n## Pixel 像素坐标\n\n表示像素坐标点。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Pixel(x, y)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标（像素） |\n| y | number | Y 坐标（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标 |\n| y | number | Y 坐标 |\n\n### 示例\n\n```javascript\n// 在事件对象中获取像素坐标\nmap.addEventListener('click', function(e) {\n    console.log('像素坐标:', e.pixel.x, e.pixel.y);\n    console.log('经纬度:', e.latlng.lng, e.latlng.lat);\n});\n\n// 像素坐标与经纬度转换\nvar point = map.pixelToPoint(new BMapGL.Pixel(100, 100));\nvar pixel = map.pointToPixel(new BMapGL.Point(116.404, 39.915));\n```\n\n## Icon 图标\n\n表示标注覆盖物所使用的图标。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Icon(image, size, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| image | string/Canvas/Image | - | 图片 URL 或 DOM |\n| size | Size | - | 显示尺寸 |\n| options.anchor | Size | 图标中心 | 定位点偏移 |\n| options.imageOffset | Size | `new Size(0, 0)` | 图片偏移 (雪碧图) |\n| options.imageSize | Size | 原始尺寸 | 图片尺寸 (2x 图需设置) |\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `setImageUrl(url)` | 设置图片 URL |\n| `setSize(size)` | 设置显示尺寸 |\n| `setAnchor(anchor)` | 设置定位点偏移 |\n| `setImageOffset(offset)` | 设置图片偏移 |\n| `setImageSize(size)` | 设置图片尺寸 |\n\n### 示例\n\n```javascript\n// 基础用法\nvar icon = new BMapGL.Icon(\n    'marker.png',\n    new BMapGL.Size(24, 32),\n    { anchor: new BMapGL.Size(12, 32) }  // 底部中心为定位点\n);\n\n// 雪碧图\nvar icon = new BMapGL.Icon(\n    'sprites.png',\n    new BMapGL.Size(24, 24),\n    {\n        anchor: new BMapGL.Size(12, 24),\n        imageOffset: new BMapGL.Size(-48, 0)  // 第三个图标\n    }\n);\n\n// 用于 Marker\nvar marker = new BMapGL.Marker(point, { icon: icon });\n```\n\nFile v1.0.1:references/circle.md\n\n# Circle 圆形\n\n## 快速开始\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nvar circle = new BMapGL.Circle(center, 1000, {\n    strokeColor: '#3366FF',\n    strokeWeight: 2,\n    fillColor: '#3366FF',\n    fillOpacity: 0.3\n});\nmap.addOverlay(circle);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Circle(center, radius, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| center | Point | - | 圆心坐标 (必需) |\n| radius | number | - | 半径，单位：米 (必需) |\n| options | Object | - | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| strokeColor | string | `'#000'` | 边框颜色，支持 '#xxxxxx'、'red'、'rgb(?,?,?)' |\n| strokeWeight | number | `2` | 边框宽度，单位像素 |\n| strokeOpacity | number | `1` | 边框透明度，取值范围 0-1 |\n| strokeStyle | string | `'solid'` | 边框样式：'solid'(实线)、'dashed'(虚线)、'dotted'(点线) |\n| fillColor | string | `'#fff'` | 填充颜色 |\n| fillOpacity | number | `0.6` | 填充透明度，取值范围 0-1 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableEditing | boolean | `false` | 是否开启可编辑模式 |\n| zIndex | number | `0` | 层级 |\n\n## 方法\n\n### 中心点\n\n```javascript\n// 设置圆心\ncircle.setCenter(new BMapGL.Point(116.410, 39.920));\n\n// 获取圆心\nvar center = circle.getCenter();  // 返回 Point\n```\n\n### 半径\n\n```javascript\n// 设置半径（单位：米）\ncircle.setRadius(2000);\n\n// 获取半径\nvar radius = circle.getRadius();  // 返回 number\n```\n\n### 边框样式\n\n```javascript\n// 颜色\ncircle.setStrokeColor('#FF0000');\nvar color = circle.getStrokeColor();\n\n// 宽度\ncircle.setStrokeWeight(3);\nvar weight = circle.getStrokeWeight();\n\n// 透明度\ncircle.setStrokeOpacity(0.8);\nvar opacity = circle.getStrokeOpacity();\n\n// 线型\ncircle.setStrokeStyle('dashed');\nvar style = circle.getStrokeStyle();\n```\n\n### 填充样式\n\n```javascript\n// 填充颜色\ncircle.setFillColor('#00FF00');\nvar fillColor = circle.getFillColor();\n\n// 填充透明度\ncircle.setFillOpacity(0.5);\nvar fillOpacity = circle.getFillOpacity();\n```\n\n### 几何信息\n\n```javascript\n// 获取圆形的地理范围（外接矩形）\nvar bounds = circle.getBounds();  // 返回 Bounds\n\n// 获取近似圆周长（墨卡托单位，非实际距离），返回的是近似圆的多边形边界点连线长度，不是数学圆周长 2πr\nvar length = circle.getLength();\n\n// 获取近似圆的边界路径点\nvar path = circle.getPath();  // 返回 Array<Point>，约40个点\n```\n\n### 显示隐藏\n\n```javascript\ncircle.show();   // 显示\ncircle.hide();   // 隐藏\n```\n\n### 编辑\n\n编辑模式下有两个控制点：\n- 中心点：拖拽移动圆形\n- 圆周点：拖拽改变半径\n\n```javascript\ncircle.enableEditing();   // 开启编辑模式\ncircle.disableEditing();  // 关闭编辑模式\n```\n\n### 批量配置\n\n```javascript\ncircle.setOptions({\n    strokeColor: '#FF6600',\n    fillColor: '#FF6600',\n    fillOpacity: 0.4\n});\n```\n\n## 常见场景\n\n### 可编辑圆形\n\n```javascript\nvar circle = new BMapGL.Circle(center, 1000, {\n    enableEditing: true\n});\n\nmap.addOverlay(circle);\n\n// 监听编辑完成事件\ncircle.addEventListener('lineupdate', function(e) {\n    var overlay = e.overlay;\n    console.log('新圆心:', overlay.getCenter());\n    console.log('新半径:', overlay.getRadius(), '米');\n});\n```\n\nFile v1.0.1:references/constants.md\n\n# 通用常量\n\n## 搜索状态常量\n\n所有 LBS 服务（LocalSearch、Geocoder、路径规划等）共用的状态码。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_STATUS_SUCCESS | 0 | 检索成功 |\n| BMAP_STATUS_CITY_LIST | 1 | 返回城市列表（需选择城市后重新检索） |\n| BMAP_STATUS_UNKNOWN_LOCATION | 2 | 位置未知 |\n| BMAP_STATUS_UNKNOWN_ROUTE | 3 | 路线未知/无法规划 |\n| BMAP_STATUS_INVALID_KEY | 4 | 非法密钥 |\n| BMAP_STATUS_INVALID_REQUEST | 5 | 非法请求 |\n| BMAP_STATUS_PERMISSION_DENIED | 6 | 没有权限 |\n| BMAP_STATUS_SERVICE_UNAVAILABLE | 7 | 服务不可用 |\n| BMAP_STATUS_TIMEOUT | 8 | 超时 |\n\n## POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\nFile v1.0.1:references/convertor.md\n\n# Convertor 坐标转换\n\n用于将其他坐标系（GPS、高德、谷歌等）转换为百度坐标系。\n\n## 快速开始\n\n```javascript\nvar convertor = new BMapGL.Convertor();\nvar points = [new BMapGL.Point(116.32715863448607, 39.990912172420714)];\n\nconvertor.translate(points, COORDINATES_WGS84, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        map.addOverlay(new BMapGL.Marker(data.points[0]));\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Convertor()\n```\n\n无参数。\n\n## 方法\n\n### translate\n\n将坐标从源坐标系转换为目标坐标系。\n\n```javascript\nconvertor.translate(points, from, to, callback)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| points | Array\\<Point\\> | - | 待转换的坐标数组 |\n| from | number | 1 | 源坐标系类型 |\n| to | number | 5 | 目标坐标系类型（仅支持 5 或 6） |\n| callback | function | - | 转换完成回调 |\n\n**回调参数：**\n\n```javascript\ncallback(data)\n```\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| status | number | 状态码，0 表示成功 |\n| points | Array\\<Point\\> | 转换后的坐标数组（成功时） |\n\n## 坐标系常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| COORDINATES_WGS84 | 1 | GPS 坐标 |\n| COORDINATES_WGS84_MC | 2 | GPS 米制坐标 |\n| COORDINATES_GCJ02 | 3 | 高德、谷歌、腾讯坐标（火星坐标系） |\n| COORDINATES_GCJ02_MC | 4 | GCJ02 米制坐标 |\n| COORDINATES_BD09 | 5 | 百度经纬度坐标 |\n| COORDINATES_BD09_MC | 6 | 百度米制坐标 |\n| COORDINATES_MAPBAR | 7 | Mapbar 坐标 |\n| COORDINATES_51 | 8 | 51 地图坐标 |\n\n**限制：** 目标坐标系（to）仅支持 `COORDINATES_BD09`(5) 和 `COORDINATES_BD09_MC`(6)。\n\n## 示例\n\n### 批量转换\n\n```javascript\nvar points = [\n    new BMapGL.Point(116.397428, 39.90923),\n    new BMapGL.Point(116.407428, 39.91923),\n    new BMapGL.Point(116.417428, 39.92923)\n];\n\nvar convertor = new BMapGL.Convertor();\nconvertor.translate(points, COORDINATES_GCJ02, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        data.points.forEach(function(point, index) {\n            map.addOverlay(new BMapGL.Marker(point));\n        });\n    }\n});\n```\n\n## 注意事项\n\n1. 百度地图使用 BD09 坐标系，直接使用 GPS 或其他地图坐标会产生偏移\n2. 转换为异步操作，结果通过回调返回\n3. 转换失败时 `data.status` 非 0，`data.points` 不存在\n4. 常量定义在全局 `window` 对象上，可直接使用\n\nFile v1.0.1:references/custom-overlay.md\n\n# CustomOverlay 自定义覆盖物\n\n用于在地图上添加自定义 HTML DOM 元素的覆盖物，可以实现信息卡片、自定义标注等复杂展示效果。\n\n## 快速开始\n\n```javascript\n// 定义 DOM 创建函数\nfunction createDOM() {\n    var div = document.createElement('div');\n    div.style.cssText = 'background:#fff; padding:10px; border-radius:4px;';\n    div.innerHTML = '<h4>故宫博物院</h4><p>建于1420年</p>';\n    return div;\n}\n\n// 创建自定义覆盖物\nvar customOverlay = new BMapGL.CustomOverlay(createDOM, {\n    point: new BMapGL.Point(116.403, 39.924)\n});\n\nmap.addOverlay(customOverlay);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.CustomOverlay(createDom, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| createDom | Function | 创建 DOM 的回调函数，返回 HTMLElement (必需) |\n| options | Object | 配置参数 |\n\n### createDom 函数\n\n创建 DOM 元素的回调函数。函数内部 `this` 指向覆盖物实例，可通过 `this.properties` 访问自定义属性。\n\n```javascript\nfunction createDOM() {\n    var div = document.createElement('div');\n    // 访问自定义属性\n    div.textContent = this.properties.title;\n    return div;\n}\n```\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| point | Point | - | 覆盖物坐标位置 (必需) |\n| offsetX | number | `0` | X 轴像素偏移量，正值向右 |\n| offsetY | number | `0` | Y 轴像素偏移量，正值向下 |\n| anchors | Array | `[0.5, 1]` | 锚点，范围 [0,1]，[0,0] 为左上角，[0.5,1] 为底部居中 |\n| minZoom | number | `3` | 最小显示缩放级别 |\n| maxZoom | number | `21` | 最大显示缩放级别 |\n| zIndex | number | `0` | CSS z-index 层级 |\n| visible | boolean | `true` | 初始是否可见 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableDraggingMap | boolean | `false` | 在覆盖物上是否允许拖拽地图 |\n| properties | Object | `{}` | 自定义属性，可在 createDom 中通过 this.properties 访问 |\n| fixBottom | boolean | `false` | 是否固定在 DOM 底部对齐 |\n\n### 高级选项\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| useTranslate | boolean | `false` | 使用 CSS translate3d 定位，性能更好 |\n| nextTick | boolean | `false` | 异步渲染，解决 div 自适应宽度问题 |\n| rotationInit | number | `0` | 初始旋转角度（度） |\n| rotationFlip | boolean | `false` | 旋转时是否允许翻转 |\n| autoFollowHeadingChanged | boolean | `false` | 是否跟随地图旋转自动调整角度 |\n| synUpdate | boolean | `false` | 是否同步更新（监听地图 ondraw 事件） |\n\n## 方法\n\n### 位置\n\n```javascript\ncustomOverlay.setPoint(new BMapGL.Point(116.404, 39.915));\nvar pos = customOverlay.getPoint();  // 返回 Point\n```\n\n### 属性\n\n获取或更新自定义属性。`setProperties` 采用**增量合并**方式（Object.assign），新属性会与原有属性合并，而非整体替换。更新后会触发 DOM 重建。\n\n```javascript\n// 获取属性\nvar props = customOverlay.getProperties();\n\n// 更新属性（增量合并，会重新调用 createDom）\ncustomOverlay.setProperties({\n    title: '新标题',\n    content: '新内容'\n});\n// 原有的其他属性（如 imgSrc）会保留\n```\n\n### 旋转\n\n```javascript\ncustomOverlay.setRotation(45);  // 设置旋转角度\nvar angle = customOverlay.getRotation();  // 获取当前角度\n```\n\n## 事件\n\n支持的事件类型：`click`、`mouseover`、`mouseout`\n\n```javascript\ncustomOverlay.addEventListener('click', function(e) {\n    console.log('点击位置:', e.latLng);  // 地理坐标\n    console.log('像素位置:', e.pixel);   // 屏幕像素坐标\n});\n```\n\n## 常见场景\n\n### 信息卡片\n\n```javascript\nfunction createInfoCard() {\n    var div = document.createElement('div');\n    div.className = 'info-card';\n    div.innerHTML = `\n        <img src=\"${this.properties.imgSrc}\" />\n        <h4>${this.properties.title}</h4>\n        <p>${this.properties.desc}</p>\n    `;\n    return div;\n}\n\nvar infoCard = new BMapGL.CustomOverlay(createInfoCard, {\n    point: new BMapGL.Point(116.403, 39.924),\n    offsetY: -10,\n    properties: {\n        title: '故宫博物院',\n        desc: '中国明清两代的皇家宫殿',\n        imgSrc: 'gugong.jpg'\n    }\n});\n\nmap.addOverlay(infoCard);\n```\n\nFile v1.0.1:references/driving-route.md\n\n# DrivingRoute 驾车路线规划\n\n用于规划两点之间的驾车路线，支持途经点、多种策略选择和路况信息显示。\n\n## 快速开始\n\n```javascript\nvar driving = new BMapGL.DrivingRoute(map, {\n    policy: BMAP_DRIVING_POLICY_AVOID_CONGESTION,\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (driving.getStatus() === BMAP_STATUS_SUCCESS) {\n            var plan = results.getPlan(0);\n            console.log('距离：' + plan.getDistance());\n            console.log('耗时：' + plan.getDuration());\n        }\n    }\n});\n\nvar start = new BMapGL.Point(116.33, 39.90);\nvar end = new BMapGL.Point(116.61, 40.08);\ndriving.search(start, end);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.DrivingRoute(location, options)\n```\n\n驾车继承使用通用配置，详见 [route-common.md](./route-common.md)。\n\n### 驾车专有配置\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| policy | number | `0` | 驾车策略，详见下方策略枚举 |\n| alternatives | number | `0` | 返回的备选路线数量 |\n| enableTraffic | boolean | `false` | 是否启用路况信息 |\n\n### renderOptions 扩展配置\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| enableDragging | boolean | 是否启用路线拖拽功能 |\n| lineLayerStyle.strokeTextureUrl | string | 线纹理 URL |\n| lineLayerStyle.lineLayerColor.color | string | 线颜色（十六进制） |\n| lineLayerStyle.lineLayerColor.opacity | number | 线透明度（0-1） |\n\n## 驾车策略枚举\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_DRIVING_POLICY_DEFAULT | 0 | 默认策略 |\n| BMAP_DRIVING_POLICY_DESTANCE | 2 | 最短距离 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS | 3 | 避开高速 |\n| BMAP_DRIVING_POLICY_FIRST_HIGHWAYS | 4 | 优先高速 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION | 5 | 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_PAY | 6 | 避开收费 |\n| BMAP_DRIVING_POLICY_HIGHWAYS_AVOID_CONGESTION | 7 | 高速优先 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION | 8 | 避开高速 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION_PAY | 9 | 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION_PAY | 10 | 避开高速 + 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_PAY | 11 | 避开高速 + 避开收费 |\n\n## 途经点搜索\n\n驾车路线支持设置最多 10 个途经点：\n\n```javascript\ndriving.search(start, end, {\n    waypoints: [\n        new BMapGL.Point(116.42, 39.92),\n        new BMapGL.Point(116.45, 39.91)\n    ]\n});\n```\n\n## 路况状态常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_TRAFFICE_STATUS_NONE | 0 | 无路况信息 |\n| BMAP_TRAFFICE_STATUS_NORMAL | 1 | 畅通 |\n| BMAP_TRAFFICE_STATUS_SLOW | 2 | 缓行 |\n| BMAP_TRAFFICE_STATUS_JAM | 3 | 拥堵 |\n\n## 注意事项\n\n1. **不支持 String 类型**：start/end 只能使用 Point 或 LocalResultPoi，不支持地址字符串\n2. **途经点**：仅驾车支持，最多 10 个\n3. **路线拖拽**：仅驾车支持 `enableDragging`\n4. `getRouteType()` 返回 `BMAP_ROUTE_TYPE_DRIVING`（3）\n5. **收费信息**：`getToll()`、`getTollDistance()` 仅 TruckRoute（货车）支持，普通驾车不支持\n\nFile v1.0.1:references/geocoder.md\n\n# Geocoder 地理编码\n\n用于地址与坐标的相互转换：正地理编码（地址 → 坐标）和逆地理编码（坐标 → 地址）。\n\n## 快速开始\n\n```javascript\nvar myGeo = new BMapGL.Geocoder();\n\n// 正地理编码：地址 → 坐标\nmyGeo.getPoint('北京市海淀区上地十街10号', function(point) {\n    if (point) {\n        map.centerAndZoom(point, 16);\n        map.addOverlay(new BMapGL.Marker(point));\n    }\n}, '北京市');\n\n// 逆地理编码：坐标 → 地址\nmyGeo.getLocation(new BMapGL.Point(116.404, 39.915), function(result) {\n    if (result) {\n        console.log(result.address);\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Geocoder(options)\n```\n\n## 方法\n\n### getPoint 正地理编码\n\n将地址解析为坐标。\n\n```javascript\ngeocoder.getPoint(address, callback, city)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| address | string | 地址字符串 |\n| callback | function | 回调函数 |\n| city | string | 城市名称，可选，默认全国范围检索 |\n\n**回调参数：**\n\n```javascript\ncallback(point, detailInfo)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point \\| null | 解析成功返回坐标，失败返回 null |\n| detailInfo | object | 详细信息对象 |\n\n**detailInfo 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| city | string | 城市名称 |\n| citycode | string | 城市代码 |\n| address | string | 规范化后的地址 |\n| precise | number | 精确性：0=精确，1=前向匹配 |\n| confidence | number | 置信度（0-100） |\n| level | string | 地址级别：地址、街道、地区、城市、省份、国家 |\n\n### getLocation 逆地理编码\n\n将坐标解析为地址。\n\n```javascript\ngeocoder.getLocation(point, callback, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 坐标点 |\n| callback | function | 回调函数，参数为 GeocoderResult 或 null |\n| options | object | 可选配置 |\n\n**options 配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| poiRadius | number | 100 | 周边 POI 搜索半径（米） |\n| numPois | number | 10 | 返回的 POI 个数 |\n\n## GeocoderResult 结果对象\n\n逆地理编码返回的结果对象。\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 查询点坐标 |\n| address | string | 完整地址描述 |\n| addressComponents | object | 地址组成部分 |\n| surroundingPois | Array | 周边 POI 数组 |\n| business | string | 商业区信息 |\n\n**addressComponents 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| province | string | 省份 |\n| city | string | 城市 |\n| district | string | 区县 |\n| street | string | 街道名称 |\n| streetNumber | string | 街道号码 |\n\n**surroundingPois 数组元素：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| title | string | POI 名称 |\n| uid | string | POI 唯一标识 |\n| point | Point | POI 坐标 |\n| address | string | POI 地址 |\n| city | string | POI 所在城市 |\n| phoneNumber | string | 电话 |\n| postcode | string | 邮编 |\n| type | number | POI 类型（BMAP_POI_TYPE_NORMAL） |\n| tags | Array | 分类标签数组 |\n\n## 语言常量\n\nGeocoder 仅支持中英文，其他语言会回退为中文。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAPGL_LANGUAGE_ZH | 'zh' | 中文（简体）**默认** |\n| BMAPGL_LANGUAGE_EN | 'en' | 英语 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 正地理编码指定 city 参数可提高解析准确性和速度\n2. 逆地理编码的 poiRadius 过大会影响响应速度\n3. 解析失败时 callback 的 point 参数为 null\n4. 返回坐标为 BD09 坐标系\n\nFile v1.0.1:references/get-ak.md\n\n# 获取密钥（AK）\n\n百度地图 JSAPI 需要使用 AK（Access Key）进行鉴权。使用任何地图功能前，必须先申请 AK。\n\n## 当用户无 AK 或 AK 失效时\n\n如果用户尚未拥有 AK，或者现有 AK 已失效（如被禁用、配额用尽、白名单不匹配等），请提示用户按照以下流程获取或更新 AK：\n\n> 您需要一个有效的百度地图 AK 才能使用 JSAPI。请前往 [百度地图开放平台控制台](https://lbsyun.baidu.com/apiconsole/key) 创建或管理您的应用密钥。\n\n## 申请流程\n\n1. **进入控制台**：登录 [百度地图开放平台](https://lbsyun.baidu.com/)，点击页面上方的 **控制台**，然后在左侧边栏点击 **应用管理** → **我的应用** → **创建应用**。\n\n2. **填写应用信息**：\n   - **应用名称**：自定义名称\n   - **应用类型**：JS API 必须选择 **浏览器端**\n   - **启用服务**：默认全部勾选，可按需调整\n   - **请求校验方式**：根据实际需求选择（IP 白名单 / Referer 白名单）\n   - **白名单**：填写允许调用的域名或 IP（开发阶段可填写 `*`）\n\n3. **提交并复制 AK**：创建完成后，在应用列表中复制 AK 即可使用。\n\n## 注意事项\n\n- **应用类型必须匹配**：JS API 只支持 **浏览器端** 类型的 AK，移动端需创建 Android/iOS SDK 类型，服务端需创建服务端类型。\n- **权限配置**：每个 AK 可对应不同的基础服务权限，请确保所需服务已勾选启用。\n- **配额监控**：可在控制台查看每个 AK 的配额使用量，避免因配额耗尽导致服务不可用。\n- **白名单安全**：生产环境请务必配置准确的白名单，避免使用 `*` 通配符。\n\n## AK 无效排查\n\n当地图加载失败或控制台提示 AK 相关错误时，请先确认以下几点：\n\n1. **AK 是否为浏览器端类型**：JS API 只支持浏览器端类型的 AK，使用服务端或移动端类型的 AK 会导致鉴权失败。\n2. **AK 是否正确填写**：检查 script 标签中的 `ak` 参数是否完整、无多余空格。\n3. **AK 是否仍然有效**：前往 [控制台](https://lbsyun.baidu.com/apiconsole/key) 确认 AK 状态正常、未被禁用或删除。\n\n如确认 AK 无误仍无法使用，建议在控制台重新创建一个浏览器端类型的 AK。\n\n## 在代码中使用 AK\n\n```html\n<!-- 将 YOUR_AK 替换为您申请的密钥 -->\n<script src=\"//api.map.baidu.com/api?v=1.0&type=webgl&ak=YOUR_AK\"></script>\n```\n\nFile v1.0.1:references/info-window.md\n\n# InfoWindow 信息窗口\n\n信息窗口用于在地图上显示详细信息，通常配合 Marker 使用。地图上同时只能打开一个信息窗口。\n\n## 快速开始\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('这是内容', {\n    width: 250,\n    height: 100,\n    title: '标题'\n});\n\nvar point = new BMapGL.Point(116.404, 39.915);\nmap.openInfoWindow(infoWindow, point);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.InfoWindow(content, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| content | string \\| HTMLElement | 信息窗口内容，支持 HTML 片段或 DOM 元素 |\n| options | Object | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| width | number | `0` | 宽度（220-730px），0 表示自适应 |\n| height | number | `0` | 高度（60-650px），0 表示自适应 |\n| maxWidth | number | `600` | 最大化时的宽度（220-730px） |\n| title | string | `''` | 标题，支持 HTML 片段 |\n| offset | Size | `new Size(0, 0)` | 底部尖角相对于锚点的像素偏移 |\n| enableMaximize | boolean | `false` | 是否显示最大化按钮 |\n| enableAutoPan | boolean | `true` | 是否自动平移地图使窗口完全可见 |\n| enableCloseOnClick | boolean | `true` | 点击地图时是否关闭窗口 |\n| maxContent | string | `''` | 最大化时显示的内容 |\n| margin | Array | `[10, 10, 40, 10]` | 与地图边界的边距 [上, 右, 下, 左] |\n\n## 方法\n\n### 内容\n\n```javascript\ninfoWindow.setContent('<div>新内容</div>');\ninfoWindow.setContent(document.getElementById('content'));  // DOM 元素\nvar content = infoWindow.getContent();\n\ninfoWindow.setTitle('新标题');\nvar title = infoWindow.getTitle();\n\ninfoWindow.setMaxContent('<div>最大化内容</div>');  // 需启用 enableMaximize\n```\n\n### 尺寸\n\n```javascript\ninfoWindow.setWidth(300);     // 220-730px，0 为自适应\ninfoWindow.setHeight(200);    // 60-650px，0 为自适应\ninfoWindow.setMaxWidth(500);  // 最大化时的宽度\n```\n\n### 显示控制\n\n```javascript\n// 打开 - 通过 map 或 marker\nmap.openInfoWindow(infoWindow, point);\nmarker.openInfoWindow(infoWindow);\n\n// 关闭\ninfoWindow.close();\nmap.closeInfoWindow();\nmarker.closeInfoWindow();\n\n// 状态查询\nvar isOpen = infoWindow.isOpen();\n\n// 重绘（内容变化后调用）\ninfoWindow.redraw();\n```\n\n### 最大化\n\n```javascript\ninfoWindow.enableMaximize();   // 显示最大化按钮\ninfoWindow.disableMaximize();  // 隐藏最大化按钮\ninfoWindow.maximize();         // 最大化\ninfoWindow.restore();          // 还原\n```\n\n### 自动平移\n\n打开窗口时自动平移地图，确保窗口完全可见。\n\n```javascript\ninfoWindow.enableAutoPan();   // 启用\ninfoWindow.disableAutoPan();  // 禁用\n```\n\n### 点击关闭\n\n```javascript\ninfoWindow.enableCloseOnClick();   // 点击地图关闭窗口\ninfoWindow.disableCloseOnClick();  // 禁用\n```\n## 事件\n\n```javascript\ninfoWindow.addEventListener('open', function(e) {\n    console.log('窗口打开', e.point);\n});\n\ninfoWindow.addEventListener('close', function(e) {\n    console.log('窗口关闭', e.point);\n});\n\ninfoWindow.addEventListener('clickclose', function() {\n    console.log('点击关闭按钮');\n});\n\ninfoWindow.addEventListener('maximize', function() {\n    console.log('窗口最大化');\n});\n\ninfoWindow.addEventListener('restore', function() {\n    console.log('窗口还原');\n});\n```\n\n\n## 常见场景\n\n### 带最大化功能\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('简要内容', {\n    width: 250,\n    height: 100,\n    title: '详情',\n    enableMaximize: true,\n    maxWidth: 500,\n    maxContent: '<div>这里是更详细的内容...</div>'\n});\n\nmap.openInfoWindow(infoWindow, point);\n```\n\n### 阻止关闭\n\n通过 `onClosing` 回调返回 `false` 可阻止窗口关闭。\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('内容', {\n    width: 200,\n    onClosing: function() {\n        if (!confirm('确定关闭？')) {\n            return false;  // 阻止关闭\n        }\n        return true;\n    }\n});\n```\n\n\n## 注意事项\n\n1. **单例限制**：地图上同时只能打开一个信息窗口，打开新窗口会自动关闭之前的\n2. **尺寸范围**：宽度 220-730px，高度 60-650px，超出范围会被限制\n3. **内存管理**：不再使用的信息窗口应调用 `dispose()` 释放资源\n\nFile v1.0.1:references/local-search.md\n\n# LocalSearch 本地检索\n\n用于 POI 检索，支持普通检索、范围检索和周边检索。\n\n## 快速开始\n\n```javascript\nvar local = new BMapGL.LocalSearch(map, {\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (local.getStatus() === BMAP_STATUS_SUCCESS) {\n            for (var i = 0; i < results.getCurrentNumPois(); i++) {\n                console.log(results.getPoi(i).title);\n            }\n        }\n    }\n});\nlocal.search('餐厅');\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.LocalSearch(location, options)\n```\n\n### location 参数\n\n| 类型 | 说明 |\n|------|------|\n| Map | 地图实例，以当前视野为检索范围 |\n| Point | 坐标点，以所在城市为范围 |\n| String | 城市名称，如 `\"北京市\"` |\n| Number | 城市代码（如北京 131、上海 289） |\n\n### options 配置\n\n通用配置（renderOptions、回调函数、language）参见 [route-common.md](./route-common.md)。\n\n**LocalSearch 专有配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| pageCapacity | number | `10` | 每页结果数（1-100） |\n| pageNum | number | `0` | 初始页码 |\n\n**renderOptions 扩展：**\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| selectFirstResult | boolean | 是否自动选中第一个结果 |\n\n## 检索方法\n\n### 普通检索\n\n```javascript\nlocal.search(keyword)\n```\n\n在构造函数指定的区域内检索，支持多关键字（最多 10 个）。\n\n```javascript\n// 单关键字\nlocal.search('银行');\n\n// 多关键字\nlocal.search(['银行', '酒店']);\n```\n\n### 范围检索\n\n```javascript\nlocal.searchInBounds(keyword, bounds)\n```\n\n在指定矩形范围内检索。\n\n```javascript\nvar bounds = new BMapGL.Bounds(\n    new BMapGL.Point(116.30, 39.85),\n    new BMapGL.Point(116.50, 39.95)\n);\nlocal.searchInBounds('餐厅', bounds);\n```\n\n### 周边检索\n\n```javascript\nlocal.searchNearby(keyword, center, radius)\n```\n\n以指定点为圆心、指定半径范围内检索。\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nlocal.searchNearby('超市', center, 1000);  // 半径 1000 米\n```\n\n## 实例方法\n\n| 方法 | 说明 |\n|------|------|\n| getResults() | 获取结果（多关键字返回数组） |\n| getStatus() | 获取状态码 |\n| clearResults() | 清除结果 |\n| gotoPage(num) | 跳转到指定页 |\n| setPageCapacity(num) / getPageCapacity() | 设置/获取每页结果数 |\n| setPageNum(num) / getPageNum() | 设置/获取页码 |\n| setLocation(loc) | 设置检索区域 |\n| enableAutoViewport() / disableAutoViewport() | 启用/禁用自动调整视野 |\n| enableFirstResultSelection() / disableFirstResultSelection() | 启用/禁用自动选中首个结果 |\n\n## LocalResult 结果对象\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| getPoi(index) | Object | 获取第 index 个 POI（坐标已转换） |\n| getNumPois() | number | 结果总数 |\n| getCurrentNumPois() | number | 当前页结果数 |\n| getNumPages() | number | 总页数 |\n| getPageIndex() | number | 当前页索引 |\n| getCenter() | Point | 获取周边检索中心点（坐标已转换） |\n| getBounds() | Bounds | 获取范围检索的范围（坐标已转换） |\n| getCityList() | Array | 获取城市列表（跨城检索时） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| keyword | string | 检索关键字 |\n| city | string | 结果所在城市 |\n| province | string | 结果所在省份 |\n| center | Point | 周边检索的中心点（原始坐标） |\n| radius | number | 周边检索的半径 |\n| bounds | Bounds | 范围检索的范围（原始坐标） |\n| viewport | Bounds | 地图最佳视野 |\n| moreResultsUrl | string | 更多结果 URL |\n| suggestions | Array | 搜索建议列表 |\n\n## POI 对象\n\n基础属性参见 [LocalResultPoi](./route-common.md#localresultpoi-结果点信息)。LocalSearch 返回的 POI 包含以下扩展属性：\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| phoneNumber | string | 电话 |\n| detailUrl | string | 百度地图详情页 URL |\n| type | number | 类型，见下方常量 |\n| isAccurate | boolean | 是否精确定位 |\n\n### POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 多关键字最多 10 个，结果返回 LocalResult 数组\n2. 周边检索半径最大 100000 米，默认 2000 米\n3. 状态码为 `BMAP_STATUS_CITY_LIST` 时需通过 `getCityList()` 选择城市后重新检索\n4. **坐标转换**：使用 `getPoi()`、`getCenter()`、`getBounds()` 方法获取的坐标会自动转换为当前地图坐标系；直接访问 `center`、`bounds` 属性则是原始 BD09 坐标\n\nArchive v1.0.0: 26 files, 44618 bytes\n\nFiles: references/base-classes.md (4598b), references/circle.md (3485b), references/constants.md (859b), references/convertor.md (2514b), references/custom-overlay.md (4401b), references/driving-route.md (3255b), references/geocoder.md (3733b), references/get-ak.md (2513b), references/info-window.md (4375b), references/local-search.md (4884b), references/map-events.md (6932b), references/map-init.md (6713b), references/map-style.md (7331b), references/marker.md (3600b), references/mvt-layer.md (3379b), references/overlay-common.md (1539b), references/overlay-events.md (2843b), references/polygon.md (5429b), references/polyline.md (4440b), references/riding-route.md (586b), references/route-common.md (6716b), references/transit-route.md (5527b), references/walking-route.md (858b), references/xyz-layer.md (3253b), SKILL.md (3944b), _meta.json (137b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: bmap-jsapi-gl\ndescription: 百度地图 JSAPI WebGL (BMapGL) 开发指南。在编写、审查或调试使用百度地图 API的代码时应运用此技能。适用于涉及地图初始化、覆盖物渲染、图层管理、事件处理、控件交互或性能优化的任务。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。\nlicense: MIT\nversion: 1.0.0\nmetadata:\n  openclaw:\n    requires:\n      env: BMAP_JSAPI_KEY\n    primaryEnv: BMAP_JSAPI_KEY\n---\n\n# JSAPI GL 开发指南\n\n百度地图 JSAPI WebGL 版本开发指南。包含地图初始化、覆盖物、事件、图层等核心模块的 API 说明和代码示例，旨在帮助开发者快速集成百度地图并遵循正确的使用方式。\n\n## 何时适用\n\n在以下场景中参考这些指南：\n\n- 创建新的地图页面或组件\n- 在地图上添加标注、折线、多边形等覆盖物\n- 处理地图交互事件（点击、拖拽、缩放等）\n- 配置地图样式或切换图层\n- 调试地图渲染或性能问题\n\n\n## 快速参考\n\n### 0. 基础概念\n\n- `references/base-classes.md` - 基础类：Point、Bounds、Size、Pixel、Icon\n- `references/constants.md` - 通用常量：搜索状态码、POI 类型\n\n### 1. 地图\n\n- `references/map-init.md` - 地图初始化：资源引入、创建实例、配置选项、交互与视图控制\n\n### 2. 地图覆盖物\n\n- `references/overlay-common.md` - 覆盖物通用操作：添加/移除、显示/隐藏、批量清除\n- `references/marker.md` - 点标记：构造参数、位置/图标/旋转/置顶/拖拽方法\n- `references/polyline.md` - 折线：构造参数、线条样式、坐标操作、编辑模式\n- `references/polygon.md` - 多边形：构造参数、边框/填充样式、带孔多边形、编辑模式\n- `references/circle.md` - 圆形：构造参数、中心点/半径、样式设置、编辑模式\n- `references/custom-overlay.md` - 自定义覆盖物：DOM 创建、属性传递、事件绑定、旋转控制\n- `references/info-window.md` - 信息窗口：构造参数、内容/尺寸设置、最大化、与 Marker 配合使用\n\n### 3. 事件\n\n- `references/map-events.md` - 地图事件：绑定方式、交互事件、视图变化事件、生命周期事件\n- `references/overlay-events.md` - 覆盖物事件：通用事件、拖拽事件、矢量图形事件\n\n### 4. 地图样式\n\n- `references/map-style.md` - 个性化地图：自定义地图外观（颜色、显隐），实现深色主题、简洁地图等效果\n\n### 5. 图层服务\n\n- `references/xyz-layer.md` - 第三方图层：加载 XYZ/TMS/WMS/WMTS 标准瓦片\n- `references/mvt-layer.md` - 矢量瓦片：加载 MVT/PBF 格式瓦片，支持样式表达式、特征交互、状态管理\n\n### 6. 路径规划\n\n- `references/route-common.md` - 通用配置：构造参数、渲染选项、回调函数、数据结构、状态常量\n  - `references/driving-route.md` - 驾车：策略枚举、途经点、路况、收费、拖拽\n  - `references/walking-route.md` - 步行：转向类型、拖拽\n  - `references/riding-route.md` - 骑行：骑行搜索\n  - `references/transit-route.md` - 公交：市内/跨城策略、交通方式、换乘\n\n### 7. 其他LBS服务\n\n- `references/local-search.md` - 本地检索：普通/范围/周边检索、结果处理、翻页、POI 数据结构\n- `references/geocoder.md` - 地理编码：正地理编码（地址→坐标）、逆地理编码（坐标→地址）\n- `references/convertor.md` - 坐标转换：GPS/高德/谷歌坐标转百度坐标\n\n## 如何使用\n\n请阅读各个参考文件以获取详细说明和代码示例:\n\n```\nreferences/map-init.md\n```\n\n每个参考文件包含：\n\n- 功能简要说明\n- 完整代码示例及解释\n- API 参数说明和注意事项\n\n## 注意事项\n\n- `references/get-ak.md` - 获取密钥（AK）：当用户无 AK 或 AK 失效时，引导用户前往控制台申请浏览器端类型的 AK\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn778b6bf766ym71fdvrc5yvg98319rv\",\n  \"slug\": \"baidu-map-jsapi-gl\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1774924000511\n}\n\nFile v1.0.0:references/base-classes.md\n\n# 基础类\n\n## Point 坐标点\n\n表示地理坐标点（经纬度）。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Point(lng, lat)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `equals(other)` | boolean | 判断两个坐标点是否相等 |\n\n### 示例\n\n```javascript\n// 创建坐标点（BD09 经纬度坐标系）\nvar point = new BMapGL.Point(116.404, 39.915);\n\n// 获取坐标值\nconsole.log(point.lng);  // 116.404\nconsole.log(point.lat);  // 39.915\n\n// 比较两个点\nvar point2 = new BMapGL.Point(116.404, 39.915);\nconsole.log(point.equals(point2));  // true\n```\n\n### 坐标系说明\n\n百度地图 API 使用 **BD09** 坐标系（百度坐标系）。如果数据是其他坐标系（如 WGS84、GCJ02），需要先进行坐标转换。\n\n## Bounds 地理范围\n\n表示地理矩形区域。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Bounds(sw, ne)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| sw | Point | 西南角坐标 |\n| ne | Point | 东北角坐标 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `getSouthWest()` | Point | 获取西南角坐标 |\n| `getNorthEast()` | Point | 获取东北角坐标 |\n| `getCenter()` | Point | 获取中心点坐标 |\n| `containsPoint(point)` | boolean | 判断点是否在范围内 |\n| `extend(point)` | void | 扩展范围以包含指定点 |\n\n### 示例\n\n```javascript\n// 创建地理范围\nvar sw = new BMapGL.Point(116.3, 39.8);\nvar ne = new BMapGL.Point(116.5, 40.0);\nvar bounds = new BMapGL.Bounds(sw, ne);\n\n// 获取中心点\nvar center = bounds.getCenter();\n\n// 判断点是否在范围内\nvar point = new BMapGL.Point(116.4, 39.9);\nconsole.log(bounds.containsPoint(point));  // true\n\n// 获取当前地图视野范围\nvar mapBounds = map.getBounds();\n```\n\n## Size 尺寸\n\n表示像素尺寸。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Size(width, height)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度（像素） |\n| height | number | 高度（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度 |\n| height | number | 高度 |\n\n### 示例\n\n```javascript\n// 创建尺寸\nvar size = new BMapGL.Size(100, 80);\n\n// 获取地图容器尺寸\nvar containerSize = map.getContainerSize();\nconsole.log(containerSize.width, containerSize.height);\n```\n\n## Pixel 像素坐标\n\n表示像素坐标点。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Pixel(x, y)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标（像素） |\n| y | number | Y 坐标（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标 |\n| y | number | Y 坐标 |\n\n### 示例\n\n```javascript\n// 在事件对象中获取像素坐标\nmap.addEventListener('click', function(e) {\n    console.log('像素坐标:', e.pixel.x, e.pixel.y);\n    console.log('经纬度:', e.latlng.lng, e.latlng.lat);\n});\n\n// 像素坐标与经纬度转换\nvar point = map.pixelToPoint(new BMapGL.Pixel(100, 100));\nvar pixel = map.pointToPixel(new BMapGL.Point(116.404, 39.915));\n```\n\n## Icon 图标\n\n表示标注覆盖物所使用的图标。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Icon(image, size, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| image | string/Canvas/Image | - | 图片 URL 或 DOM |\n| size | Size | - | 显示尺寸 |\n| options.anchor | Size | 图标中心 | 定位点偏移 |\n| options.imageOffset | Size | `new Size(0, 0)` | 图片偏移 (雪碧图) |\n| options.imageSize | Size | 原始尺寸 | 图片尺寸 (2x 图需设置) |\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `setImageUrl(url)` | 设置图片 URL |\n| `setSize(size)` | 设置显示尺寸 |\n| `setAnchor(anchor)` | 设置定位点偏移 |\n| `setImageOffset(offset)` | 设置图片偏移 |\n| `setImageSize(size)` | 设置图片尺寸 |\n\n### 示例\n\n```javascript\n// 基础用法\nvar icon = new BMapGL.Icon(\n    'marker.png',\n    new BMapGL.Size(24, 32),\n    { anchor: new BMapGL.Size(12, 32) }  // 底部中心为定位点\n);\n\n// 雪碧图\nvar icon = new BMapGL.Icon(\n    'sprites.png',\n    new BMapGL.Size(24, 24),\n    {\n        anchor: new BMapGL.Size(12, 24),\n        imageOffset: new BMapGL.Size(-48, 0)  // 第三个图标\n    }\n);\n\n// 用于 Marker\nvar marker = new BMapGL.Marker(point, { icon: icon });\n```\n\nFile v1.0.0:references/circle.md\n\n# Circle 圆形\n\n## 快速开始\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nvar circle = new BMapGL.Circle(center, 1000, {\n    strokeColor: '#3366FF',\n    strokeWeight: 2,\n    fillColor: '#3366FF',\n    fillOpacity: 0.3\n});\nmap.addOverlay(circle);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Circle(center, radius, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| center | Point | - | 圆心坐标 (必需) |\n| radius | number | - | 半径，单位：米 (必需) |\n| options | Object | - | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| strokeColor | string | `'#000'` | 边框颜色，支持 '#xxxxxx'、'red'、'rgb(?,?,?)' |\n| strokeWeight | number | `2` | 边框宽度，单位像素 |\n| strokeOpacity | number | `1` | 边框透明度，取值范围 0-1 |\n| strokeStyle | string | `'solid'` | 边框样式：'solid'(实线)、'dashed'(虚线)、'dotted'(点线) |\n| fillColor | string | `'#fff'` | 填充颜色 |\n| fillOpacity | number | `0.6` | 填充透明度，取值范围 0-1 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableEditing | boolean | `false` | 是否开启可编辑模式 |\n| zIndex | number | `0` | 层级 |\n\n## 方法\n\n### 中心点\n\n```javascript\n// 设置圆心\ncircle.setCenter(new BMapGL.Point(116.410, 39.920));\n\n// 获取圆心\nvar center = circle.getCenter();  // 返回 Point\n```\n\n### 半径\n\n```javascript\n// 设置半径（单位：米）\ncircle.setRadius(2000);\n\n// 获取半径\nvar radius = circle.getRadius();  // 返回 number\n```\n\n### 边框样式\n\n```javascript\n// 颜色\ncircle.setStrokeColor('#FF0000');\nvar color = circle.getStrokeColor();\n\n// 宽度\ncircle.setStrokeWeight(3);\nvar weight = circle.getStrokeWeight();\n\n// 透明度\ncircle.setStrokeOpacity(0.8);\nvar opacity = circle.getStrokeOpacity();\n\n// 线型\ncircle.setStrokeStyle('dashed');\nvar style = circle.getStrokeStyle();\n```\n\n### 填充样式\n\n```javascript\n// 填充颜色\ncircle.setFillColor('#00FF00');\nvar fillColor = circle.getFillColor();\n\n// 填充透明度\ncircle.setFillOpacity(0.5);\nvar fillOpacity = circle.getFillOpacity();\n```\n\n### 几何信息\n\n```javascript\n// 获取圆形的地理范围（外接矩形）\nvar bounds = circle.getBounds();  // 返回 Bounds\n\n// 获取近似圆周长（墨卡托单位，非实际距离），返回的是近似圆的多边形边界点连线长度，不是数学圆周长 2πr\nvar length = circle.getLength();\n\n// 获取近似圆的边界路径点\nvar path = circle.getPath();  // 返回 Array<Point>，约40个点\n```\n\n### 显示隐藏\n\n```javascript\ncircle.show();   // 显示\ncircle.hide();   // 隐藏\n```\n\n### 编辑\n\n编辑模式下有两个控制点：\n- 中心点：拖拽移动圆形\n- 圆周点：拖拽改变半径\n\n```javascript\ncircle.enableEditing();   // 开启编辑模式\ncircle.disableEditing();  // 关闭编辑模式\n```\n\n### 批量配置\n\n```javascript\ncircle.setOptions({\n    strokeColor: '#FF6600',\n    fillColor: '#FF6600',\n    fillOpacity: 0.4\n});\n```\n\n## 常见场景\n\n### 可编辑圆形\n\n```javascript\nvar circle = new BMapGL.Circle(center, 1000, {\n    enableEditing: true\n});\n\nmap.addOverlay(circle);\n\n// 监听编辑完成事件\ncircle.addEventListener('lineupdate', function(e) {\n    var overlay = e.overlay;\n    console.log('新圆心:', overlay.getCenter());\n    console.log('新半径:', overlay.getRadius(), '米');\n});\n```\n\nFile v1.0.0:references/constants.md\n\n# 通用常量\n\n## 搜索状态常量\n\n所有 LBS 服务（LocalSearch、Geocoder、路径规划等）共用的状态码。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_STATUS_SUCCESS | 0 | 检索成功 |\n| BMAP_STATUS_CITY_LIST | 1 | 返回城市列表（需选择城市后重新检索） |\n| BMAP_STATUS_UNKNOWN_LOCATION | 2 | 位置未知 |\n| BMAP_STATUS_UNKNOWN_ROUTE | 3 | 路线未知/无法规划 |\n| BMAP_STATUS_INVALID_KEY | 4 | 非法密钥 |\n| BMAP_STATUS_INVALID_REQUEST | 5 | 非法请求 |\n| BMAP_STATUS_PERMISSION_DENIED | 6 | 没有权限 |\n| BMAP_STATUS_SERVICE_UNAVAILABLE | 7 | 服务不可用 |\n| BMAP_STATUS_TIMEOUT | 8 | 超时 |\n\n## POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\nFile v1.0.0:references/convertor.md\n\n# Convertor 坐标转换\n\n用于将其他坐标系（GPS、高德、谷歌等）转换为百度坐标系。\n\n## 快速开始\n\n```javascript\nvar convertor = new BMapGL.Convertor();\nvar points = [new BMapGL.Point(116.32715863448607, 39.990912172420714)];\n\nconvertor.translate(points, COORDINATES_WGS84, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        map.addOverlay(new BMapGL.Marker(data.points[0]));\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Convertor()\n```\n\n无参数。\n\n## 方法\n\n### translate\n\n将坐标从源坐标系转换为目标坐标系。\n\n```javascript\nconvertor.translate(points, from, to, callback)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| points | Array\\<Point\\> | - | 待转换的坐标数组 |\n| from | number | 1 | 源坐标系类型 |\n| to | number | 5 | 目标坐标系类型（仅支持 5 或 6） |\n| callback | function | - | 转换完成回调 |\n\n**回调参数：**\n\n```javascript\ncallback(data)\n```\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| status | number | 状态码，0 表示成功 |\n| points | Array\\<Point\\> | 转换后的坐标数组（成功时） |\n\n## 坐标系常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| COORDINATES_WGS84 | 1 | GPS 坐标 |\n| COORDINATES_WGS84_MC | 2 | GPS 米制坐标 |\n| COORDINATES_GCJ02 | 3 | 高德、谷歌、腾讯坐标（火星坐标系） |\n| COORDINATES_GCJ02_MC | 4 | GCJ02 米制坐标 |\n| COORDINATES_BD09 | 5 | 百度经纬度坐标 |\n| COORDINATES_BD09_MC | 6 | 百度米制坐标 |\n| COORDINATES_MAPBAR | 7 | Mapbar 坐标 |\n| COORDINATES_51 | 8 | 51 地图坐标 |\n\n**限制：** 目标坐标系（to）仅支持 `COORDINATES_BD09`(5) 和 `COORDINATES_BD09_MC`(6)。\n\n## 示例\n\n### 批量转换\n\n```javascript\nvar points = [\n    new BMapGL.Point(116.397428, 39.90923),\n    new BMapGL.Point(116.407428, 39.91923),\n    new BMapGL.Point(116.417428, 39.92923)\n];\n\nvar convertor = new BMapGL.Convertor();\nconvertor.translate(points, COORDINATES_GCJ02, COORDINATES_BD09, function(data) {\n    if (data.status === 0) {\n        data.points.forEach(function(point, index) {\n            map.addOverlay(new BMapGL.Marker(point));\n        });\n    }\n});\n```\n\n## 注意事项\n\n1. 百度地图使用 BD09 坐标系，直接使用 GPS 或其他地图坐标会产生偏移\n2. 转换为异步操作，结果通过回调返回\n3. 转换失败时 `data.status` 非 0，`data.points` 不存在\n4. 常量定义在全局 `window` 对象上，可直接使用\n\nFile v1.0.0:references/custom-overlay.md\n\n# CustomOverlay 自定义覆盖物\n\n用于在地图上添加自定义 HTML DOM 元素的覆盖物，可以实现信息卡片、自定义标注等复杂展示效果。\n\n## 快速开始\n\n```javascript\n// 定义 DOM 创建函数\nfunction createDOM() {\n    var div = document.createElement('div');\n    div.style.cssText = 'background:#fff; padding:10px; border-radius:4px;';\n    div.innerHTML = '<h4>故宫博物院</h4><p>建于1420年</p>';\n    return div;\n}\n\n// 创建自定义覆盖物\nvar customOverlay = new BMapGL.CustomOverlay(createDOM, {\n    point: new BMapGL.Point(116.403, 39.924)\n});\n\nmap.addOverlay(customOverlay);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.CustomOverlay(createDom, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| createDom | Function | 创建 DOM 的回调函数，返回 HTMLElement (必需) |\n| options | Object | 配置参数 |\n\n### createDom 函数\n\n创建 DOM 元素的回调函数。函数内部 `this` 指向覆盖物实例，可通过 `this.properties` 访问自定义属性。\n\n```javascript\nfunction createDOM() {\n    var div = document.createElement('div');\n    // 访问自定义属性\n    div.textContent = this.properties.title;\n    return div;\n}\n```\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| point | Point | - | 覆盖物坐标位置 (必需) |\n| offsetX | number | `0` | X 轴像素偏移量，正值向右 |\n| offsetY | number | `0` | Y 轴像素偏移量，正值向下 |\n| anchors | Array | `[0.5, 1]` | 锚点，范围 [0,1]，[0,0] 为左上角，[0.5,1] 为底部居中 |\n| minZoom | number | `3` | 最小显示缩放级别 |\n| maxZoom | number | `21` | 最大显示缩放级别 |\n| zIndex | number | `0` | CSS z-index 层级 |\n| visible | boolean | `true` | 初始是否可见 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableDraggingMap | boolean | `false` | 在覆盖物上是否允许拖拽地图 |\n| properties | Object | `{}` | 自定义属性，可在 createDom 中通过 this.properties 访问 |\n| fixBottom | boolean | `false` | 是否固定在 DOM 底部对齐 |\n\n### 高级选项\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| useTranslate | boolean | `false` | 使用 CSS translate3d 定位，性能更好 |\n| nextTick | boolean | `false` | 异步渲染，解决 div 自适应宽度问题 |\n| rotationInit | number | `0` | 初始旋转角度（度） |\n| rotationFlip | boolean | `false` | 旋转时是否允许翻转 |\n| autoFollowHeadingChanged | boolean | `false` | 是否跟随地图旋转自动调整角度 |\n| synUpdate | boolean | `false` | 是否同步更新（监听地图 ondraw 事件） |\n\n## 方法\n\n### 位置\n\n```javascript\ncustomOverlay.setPoint(new BMapGL.Point(116.404, 39.915));\nvar pos = customOverlay.getPoint();  // 返回 Point\n```\n\n### 属性\n\n获取或更新自定义属性。`setProperties` 采用**增量合并**方式（Object.assign），新属性会与原有属性合并，而非整体替换。更新后会触发 DOM 重建。\n\n```javascript\n// 获取属性\nvar props = customOverlay.getProperties();\n\n// 更新属性（增量合并，会重新调用 createDom）\ncustomOverlay.setProperties({\n    title: '新标题',\n    content: '新内容'\n});\n// 原有的其他属性（如 imgSrc）会保留\n```\n\n### 旋转\n\n```javascript\ncustomOverlay.setRotation(45);  // 设置旋转角度\nvar angle = customOverlay.getRotation();  // 获取当前角度\n```\n\n## 事件\n\n支持的事件类型：`click`、`mouseover`、`mouseout`\n\n```javascript\ncustomOverlay.addEventListener('click', function(e) {\n    console.log('点击位置:', e.latLng);  // 地理坐标\n    console.log('像素位置:', e.pixel);   // 屏幕像素坐标\n});\n```\n\n## 常见场景\n\n### 信息卡片\n\n```javascript\nfunction createInfoCard() {\n    var div = document.createElement('div');\n    div.className = 'info-card';\n    div.innerHTML = `\n        <img src=\"${this.properties.imgSrc}\" />\n        <h4>${this.properties.title}</h4>\n        <p>${this.properties.desc}</p>\n    `;\n    return div;\n}\n\nvar infoCard = new BMapGL.CustomOverlay(createInfoCard, {\n    point: new BMapGL.Point(116.403, 39.924),\n    offsetY: -10,\n    properties: {\n        title: '故宫博物院',\n        desc: '中国明清两代的皇家宫殿',\n        imgSrc: 'gugong.jpg'\n    }\n});\n\nmap.addOverlay(infoCard);\n```\n\nFile v1.0.0:references/driving-route.md\n\n# DrivingRoute 驾车路线规划\n\n用于规划两点之间的驾车路线，支持途经点、多种策略选择和路况信息显示。\n\n## 快速开始\n\n```javascript\nvar driving = new BMapGL.DrivingRoute(map, {\n    policy: BMAP_DRIVING_POLICY_AVOID_CONGESTION,\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (driving.getStatus() === BMAP_STATUS_SUCCESS) {\n            var plan = results.getPlan(0);\n            console.log('距离：' + plan.getDistance());\n            console.log('耗时：' + plan.getDuration());\n        }\n    }\n});\n\nvar start = new BMapGL.Point(116.33, 39.90);\nvar end = new BMapGL.Point(116.61, 40.08);\ndriving.search(start, end);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.DrivingRoute(location, options)\n```\n\n驾车继承使用通用配置，详见 [route-common.md](./route-common.md)。\n\n### 驾车专有配置\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| policy | number | `0` | 驾车策略，详见下方策略枚举 |\n| alternatives | number | `0` | 返回的备选路线数量 |\n| enableTraffic | boolean | `false` | 是否启用路况信息 |\n\n### renderOptions 扩展配置\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| enableDragging | boolean | 是否启用路线拖拽功能 |\n| lineLayerStyle.strokeTextureUrl | string | 线纹理 URL |\n| lineLayerStyle.lineLayerColor.color | string | 线颜色（十六进制） |\n| lineLayerStyle.lineLayerColor.opacity | number | 线透明度（0-1） |\n\n## 驾车策略枚举\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_DRIVING_POLICY_DEFAULT | 0 | 默认策略 |\n| BMAP_DRIVING_POLICY_DESTANCE | 2 | 最短距离 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS | 3 | 避开高速 |\n| BMAP_DRIVING_POLICY_FIRST_HIGHWAYS | 4 | 优先高速 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION | 5 | 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_PAY | 6 | 避开收费 |\n| BMAP_DRIVING_POLICY_HIGHWAYS_AVOID_CONGESTION | 7 | 高速优先 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION | 8 | 避开高速 + 避开拥堵 |\n| BMAP_DRIVING_POLICY_AVOID_CONGESTION_PAY | 9 | 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_CONGESTION_PAY | 10 | 避开高速 + 避开拥堵 + 避开收费 |\n| BMAP_DRIVING_POLICY_AVOID_HIGHWAYS_PAY | 11 | 避开高速 + 避开收费 |\n\n## 途经点搜索\n\n驾车路线支持设置最多 10 个途经点：\n\n```javascript\ndriving.search(start, end, {\n    waypoints: [\n        new BMapGL.Point(116.42, 39.92),\n        new BMapGL.Point(116.45, 39.91)\n    ]\n});\n```\n\n## 路况状态常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_TRAFFICE_STATUS_NONE | 0 | 无路况信息 |\n| BMAP_TRAFFICE_STATUS_NORMAL | 1 | 畅通 |\n| BMAP_TRAFFICE_STATUS_SLOW | 2 | 缓行 |\n| BMAP_TRAFFICE_STATUS_JAM | 3 | 拥堵 |\n\n## 注意事项\n\n1. **不支持 String 类型**：start/end 只能使用 Point 或 LocalResultPoi，不支持地址字符串\n2. **途经点**：仅驾车支持，最多 10 个\n3. **路线拖拽**：仅驾车支持 `enableDragging`\n4. `getRouteType()` 返回 `BMAP_ROUTE_TYPE_DRIVING`（3）\n5. **收费信息**：`getToll()`、`getTollDistance()` 仅 TruckRoute（货车）支持，普通驾车不支持\n\nFile v1.0.0:references/geocoder.md\n\n# Geocoder 地理编码\n\n用于地址与坐标的相互转换：正地理编码（地址 → 坐标）和逆地理编码（坐标 → 地址）。\n\n## 快速开始\n\n```javascript\nvar myGeo = new BMapGL.Geocoder();\n\n// 正地理编码：地址 → 坐标\nmyGeo.getPoint('北京市海淀区上地十街10号', function(point) {\n    if (point) {\n        map.centerAndZoom(point, 16);\n        map.addOverlay(new BMapGL.Marker(point));\n    }\n}, '北京市');\n\n// 逆地理编码：坐标 → 地址\nmyGeo.getLocation(new BMapGL.Point(116.404, 39.915), function(result) {\n    if (result) {\n        console.log(result.address);\n    }\n});\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Geocoder(options)\n```\n\n## 方法\n\n### getPoint 正地理编码\n\n将地址解析为坐标。\n\n```javascript\ngeocoder.getPoint(address, callback, city)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| address | string | 地址字符串 |\n| callback | function | 回调函数 |\n| city | string | 城市名称，可选，默认全国范围检索 |\n\n**回调参数：**\n\n```javascript\ncallback(point, detailInfo)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point \\| null | 解析成功返回坐标，失败返回 null |\n| detailInfo | object | 详细信息对象 |\n\n**detailInfo 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| city | string | 城市名称 |\n| citycode | string | 城市代码 |\n| address | string | 规范化后的地址 |\n| precise | number | 精确性：0=精确，1=前向匹配 |\n| confidence | number | 置信度（0-100） |\n| level | string | 地址级别：地址、街道、地区、城市、省份、国家 |\n\n### getLocation 逆地理编码\n\n将坐标解析为地址。\n\n```javascript\ngeocoder.getLocation(point, callback, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 坐标点 |\n| callback | function | 回调函数，参数为 GeocoderResult 或 null |\n| options | object | 可选配置 |\n\n**options 配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| poiRadius | number | 100 | 周边 POI 搜索半径（米） |\n| numPois | number | 10 | 返回的 POI 个数 |\n\n## GeocoderResult 结果对象\n\n逆地理编码返回的结果对象。\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| point | Point | 查询点坐标 |\n| address | string | 完整地址描述 |\n| addressComponents | object | 地址组成部分 |\n| surroundingPois | Array | 周边 POI 数组 |\n| business | string | 商业区信息 |\n\n**addressComponents 结构：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| province | string | 省份 |\n| city | string | 城市 |\n| district | string | 区县 |\n| street | string | 街道名称 |\n| streetNumber | string | 街道号码 |\n\n**surroundingPois 数组元素：**\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| title | string | POI 名称 |\n| uid | string | POI 唯一标识 |\n| point | Point | POI 坐标 |\n| address | string | POI 地址 |\n| city | string | POI 所在城市 |\n| phoneNumber | string | 电话 |\n| postcode | string | 邮编 |\n| type | number | POI 类型（BMAP_POI_TYPE_NORMAL） |\n| tags | Array | 分类标签数组 |\n\n## 语言常量\n\nGeocoder 仅支持中英文，其他语言会回退为中文。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAPGL_LANGUAGE_ZH | 'zh' | 中文（简体）**默认** |\n| BMAPGL_LANGUAGE_EN | 'en' | 英语 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 正地理编码指定 city 参数可提高解析准确性和速度\n2. 逆地理编码的 poiRadius 过大会影响响应速度\n3. 解析失败时 callback 的 point 参数为 null\n4. 返回坐标为 BD09 坐标系\n\nFile v1.0.0:references/get-ak.md\n\n# 获取密钥（AK）\n\n百度地图 JSAPI 需要使用 AK（Access Key）进行鉴权。使用任何地图功能前，必须先申请 AK。\n\n## 当用户无 AK 或 AK 失效时\n\n如果用户尚未拥有 AK，或者现有 AK 已失效（如被禁用、配额用尽、白名单不匹配等），请提示用户按照以下流程获取或更新 AK：\n\n> 您需要一个有效的百度地图 AK 才能使用 JSAPI。请前往 [百度地图开放平台控制台](https://lbsyun.baidu.com/apiconsole/key) 创建或管理您的应用密钥。\n\n## 申请流程\n\n1. **进入控制台**：登录 [百度地图开放平台](https://lbsyun.baidu.com/)，点击页面上方的 **控制台**，然后在左侧边栏点击 **应用管理** → **我的应用** → **创建应用**。\n\n2. **填写应用信息**：\n   - **应用名称**：自定义名称\n   - **应用类型**：JS API 必须选择 **浏览器端**\n   - **启用服务**：默认全部勾选，可按需调整\n   - **请求校验方式**：根据实际需求选择（IP 白名单 / Referer 白名单）\n   - **白名单**：填写允许调用的域名或 IP（开发阶段可填写 `*`）\n\n3. **提交并复制 AK**：创建完成后，在应用列表中复制 AK 即可使用。\n\n## 注意事项\n\n- **应用类型必须匹配**：JS API 只支持 **浏览器端** 类型的 AK，移动端需创建 Android/iOS SDK 类型，服务端需创建服务端类型。\n- **权限配置**：每个 AK 可对应不同的基础服务权限，请确保所需服务已勾选启用。\n- **配额监控**：可在控制台查看每个 AK 的配额使用量，避免因配额耗尽导致服务不可用。\n- **白名单安全**：生产环境请务必配置准确的白名单，避免使用 `*` 通配符。\n\n## AK 无效排查\n\n当地图加载失败或控制台提示 AK 相关错误时，请先确认以下几点：\n\n1. **AK 是否为浏览器端类型**：JS API 只支持浏览器端类型的 AK，使用服务端或移动端类型的 AK 会导致鉴权失败。\n2. **AK 是否正确填写**：检查 script 标签中的 `ak` 参数是否完整、无多余空格。\n3. **AK 是否仍然有效**：前往 [控制台](https://lbsyun.baidu.com/apiconsole/key) 确认 AK 状态正常、未被禁用或删除。\n\n如确认 AK 无误仍无法使用，建议在控制台重新创建一个浏览器端类型的 AK。\n\n## 在代码中使用 AK\n\n```html\n<!-- 将 YOUR_AK 替换为您申请的密钥 -->\n<script src=\"//api.map.baidu.com/api?v=1.0&type=webgl&ak=YOUR_AK\"></script>\n```\n\nFile v1.0.0:references/info-window.md\n\n# InfoWindow 信息窗口\n\n信息窗口用于在地图上显示详细信息，通常配合 Marker 使用。地图上同时只能打开一个信息窗口。\n\n## 快速开始\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('这是内容', {\n    width: 250,\n    height: 100,\n    title: '标题'\n});\n\nvar point = new BMapGL.Point(116.404, 39.915);\nmap.openInfoWindow(infoWindow, point);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.InfoWindow(content, options)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| content | string \\| HTMLElement | 信息窗口内容，支持 HTML 片段或 DOM 元素 |\n| options | Object | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| width | number | `0` | 宽度（220-730px），0 表示自适应 |\n| height | number | `0` | 高度（60-650px），0 表示自适应 |\n| maxWidth | number | `600` | 最大化时的宽度（220-730px） |\n| title | string | `''` | 标题，支持 HTML 片段 |\n| offset | Size | `new Size(0, 0)` | 底部尖角相对于锚点的像素偏移 |\n| enableMaximize | boolean | `false` | 是否显示最大化按钮 |\n| enableAutoPan | boolean | `true` | 是否自动平移地图使窗口完全可见 |\n| enableCloseOnClick | boolean | `true` | 点击地图时是否关闭窗口 |\n| maxContent | string | `''` | 最大化时显示的内容 |\n| margin | Array | `[10, 10, 40, 10]` | 与地图边界的边距 [上, 右, 下, 左] |\n\n## 方法\n\n### 内容\n\n```javascript\ninfoWindow.setContent('<div>新内容</div>');\ninfoWindow.setContent(document.getElementById('content'));  // DOM 元素\nvar content = infoWindow.getContent();\n\ninfoWindow.setTitle('新标题');\nvar title = infoWindow.getTitle();\n\ninfoWindow.setMaxContent('<div>最大化内容</div>');  // 需启用 enableMaximize\n```\n\n### 尺寸\n\n```javascript\ninfoWindow.setWidth(300);     // 220-730px，0 为自适应\ninfoWindow.setHeight(200);    // 60-650px，0 为自适应\ninfoWindow.setMaxWidth(500);  // 最大化时的宽度\n```\n\n### 显示控制\n\n```javascript\n// 打开 - 通过 map 或 marker\nmap.openInfoWindow(infoWindow, point);\nmarker.openInfoWindow(infoWindow);\n\n// 关闭\ninfoWindow.close();\nmap.closeInfoWindow();\nmarker.closeInfoWindow();\n\n// 状态查询\nvar isOpen = infoWindow.isOpen();\n\n// 重绘（内容变化后调用）\ninfoWindow.redraw();\n```\n\n### 最大化\n\n```javascript\ninfoWindow.enableMaximize();   // 显示最大化按钮\ninfoWindow.disableMaximize();  // 隐藏最大化按钮\ninfoWindow.maximize();         // 最大化\ninfoWindow.restore();          // 还原\n```\n\n### 自动平移\n\n打开窗口时自动平移地图，确保窗口完全可见。\n\n```javascript\ninfoWindow.enableAutoPan();   // 启用\ninfoWindow.disableAutoPan();  // 禁用\n```\n\n### 点击关闭\n\n```javascript\ninfoWindow.enableCloseOnClick();   // 点击地图关闭窗口\ninfoWindow.disableCloseOnClick();  // 禁用\n```\n## 事件\n\n```javascript\ninfoWindow.addEventListener('open', function(e) {\n    console.log('窗口打开', e.point);\n});\n\ninfoWindow.addEventListener('close', function(e) {\n    console.log('窗口关闭', e.point);\n});\n\ninfoWindow.addEventListener('clickclose', function() {\n    console.log('点击关闭按钮');\n});\n\ninfoWindow.addEventListener('maximize', function() {\n    console.log('窗口最大化');\n});\n\ninfoWindow.addEventListener('restore', function() {\n    console.log('窗口还原');\n});\n```\n\n\n## 常见场景\n\n### 带最大化功能\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('简要内容', {\n    width: 250,\n    height: 100,\n    title: '详情',\n    enableMaximize: true,\n    maxWidth: 500,\n    maxContent: '<div>这里是更详细的内容...</div>'\n});\n\nmap.openInfoWindow(infoWindow, point);\n```\n\n### 阻止关闭\n\n通过 `onClosing` 回调返回 `false` 可阻止窗口关闭。\n\n```javascript\nvar infoWindow = new BMapGL.InfoWindow('内容', {\n    width: 200,\n    onClosing: function() {\n        if (!confirm('确定关闭？')) {\n            return false;  // 阻止关闭\n        }\n        return true;\n    }\n});\n```\n\n\n## 注意事项\n\n1. **单例限制**：地图上同时只能打开一个信息窗口，打开新窗口会自动关闭之前的\n2. **尺寸范围**：宽度 220-730px，高度 60-650px，超出范围会被限制\n3. **内存管理**：不再使用的信息窗口应调用 `dispose()` 释放资源\n\nFile v1.0.0:references/local-search.md\n\n# LocalSearch 本地检索\n\n用于 POI 检索，支持普通检索、范围检索和周边检索。\n\n## 快速开始\n\n```javascript\nvar local = new BMapGL.LocalSearch(map, {\n    renderOptions: { map: map, autoViewport: true },\n    onSearchComplete: function(results) {\n        if (local.getStatus() === BMAP_STATUS_SUCCESS) {\n            for (var i = 0; i < results.getCurrentNumPois(); i++) {\n                console.log(results.getPoi(i).title);\n            }\n        }\n    }\n});\nlocal.search('餐厅');\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.LocalSearch(location, options)\n```\n\n### location 参数\n\n| 类型 | 说明 |\n|------|------|\n| Map | 地图实例，以当前视野为检索范围 |\n| Point | 坐标点，以所在城市为范围 |\n| String | 城市名称，如 `\"北京市\"` |\n| Number | 城市代码（如北京 131、上海 289） |\n\n### options 配置\n\n通用配置（renderOptions、回调函数、language）参见 [route-common.md](./route-common.md)。\n\n**LocalSearch 专有配置：**\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| pageCapacity | number | `10` | 每页结果数（1-100） |\n| pageNum | number | `0` | 初始页码 |\n\n**renderOptions 扩展：**\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| selectFirstResult | boolean | 是否自动选中第一个结果 |\n\n## 检索方法\n\n### 普通检索\n\n```javascript\nlocal.search(keyword)\n```\n\n在构造函数指定的区域内检索，支持多关键字（最多 10 个）。\n\n```javascript\n// 单关键字\nlocal.search('银行');\n\n// 多关键字\nlocal.search(['银行', '酒店']);\n```\n\n### 范围检索\n\n```javascript\nlocal.searchInBounds(keyword, bounds)\n```\n\n在指定矩形范围内检索。\n\n```javascript\nvar bounds = new BMapGL.Bounds(\n    new BMapGL.Point(116.30, 39.85),\n    new BMapGL.Point(116.50, 39.95)\n);\nlocal.searchInBounds('餐厅', bounds);\n```\n\n### 周边检索\n\n```javascript\nlocal.searchNearby(keyword, center, radius)\n```\n\n以指定点为圆心、指定半径范围内检索。\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nlocal.searchNearby('超市', center, 1000);  // 半径 1000 米\n```\n\n## 实例方法\n\n| 方法 | 说明 |\n|------|------|\n| getResults() | 获取结果（多关键字返回数组） |\n| getStatus() | 获取状态码 |\n| clearResults() | 清除结果 |\n| gotoPage(num) | 跳转到指定页 |\n| setPageCapacity(num) / getPageCapacity() | 设置/获取每页结果数 |\n| setPageNum(num) / getPageNum() | 设置/获取页码 |\n| setLocation(loc) | 设置检索区域 |\n| enableAutoViewport() / disableAutoViewport() | 启用/禁用自动调整视野 |\n| enableFirstResultSelection() / disableFirstResultSelection() | 启用/禁用自动选中首个结果 |\n\n## LocalResult 结果对象\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| getPoi(index) | Object | 获取第 index 个 POI（坐标已转换） |\n| getNumPois() | number | 结果总数 |\n| getCurrentNumPois() | number | 当前页结果数 |\n| getNumPages() | number | 总页数 |\n| getPageIndex() | number | 当前页索引 |\n| getCenter() | Point | 获取周边检索中心点（坐标已转换） |\n| getBounds() | Bounds | 获取范围检索的范围（坐标已转换） |\n| getCityList() | Array | 获取城市列表（跨城检索时） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| keyword | string | 检索关键字 |\n| city | string | 结果所在城市 |\n| province | string | 结果所在省份 |\n| center | Point | 周边检索的中心点（原始坐标） |\n| radius | number | 周边检索的半径 |\n| bounds | Bounds | 范围检索的范围（原始坐标） |\n| viewport | Bounds | 地图最佳视野 |\n| moreResultsUrl | string | 更多结果 URL |\n| suggestions | Array | 搜索建议列表 |\n\n## POI 对象\n\n基础属性参见 [LocalResultPoi](./route-common.md#localresultpoi-结果点信息)。LocalSearch 返回的 POI 包含以下扩展属性：\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| phoneNumber | string | 电话 |\n| detailUrl | string | 百度地图详情页 URL |\n| type | number | 类型，见下方常量 |\n| isAccurate | boolean | 是否精确定位 |\n\n### POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |\n\n## 状态常量\n\n参见 [constants.md](./constants.md)。\n\n## 注意事项\n\n1. 多关键字最多 10 个，结果返回 LocalResult 数组\n2. 周边检索半径最大 100000 米，默认 2000 米\n3. 状态码为 `BMAP_STATUS_CITY_LIST` 时需通过 `getCityList()` 选择城市后重新检索\n4. **坐标转换**：使用 `getPoi()`、`getCenter()`、`getBounds()` 方法获取的坐标会自动转换为当前地图坐标系；直接访问 `center`、`bounds` 属性则是原始 BD09 坐标","readmeExcerpt":"Skill: Baidu Map JSAPI GL（百度地图官方 WebGL SKills） Summary: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-05-12T03:01:17.946Z | user Version 1.0.2 of baidu-map-jsapi-gl - No file changes detected in this release. - Version number updated from 1.0.1 to 1.0.2 with no changes to functionality or docume","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"references/map-init.md"},{"language":"javascript","snippet":"new BMapGL.Point(lng, lat)"},{"language":"javascript","snippet":"// 创建坐标点（BD09 经纬度坐标系）\nvar point = new BMapGL.Point(116.404, 39.915);\n\n// 获取坐标值\nconsole.log(point.lng);  // 116.404\nconsole.log(point.lat);  // 39.915\n\n// 比较两个点\nvar point2 = new BMapGL.Point(116.404, 39.915);\nconsole.log(point.equals(point2));  // true"},{"language":"javascript","snippet":"new BMapGL.Bounds(sw, ne)"},{"language":"javascript","snippet":"// 创建地理范围\nvar sw = new BMapGL.Point(116.3, 39.8);\nvar ne = new BMapGL.Point(116.5, 40.0);\nvar bounds = new BMapGL.Bounds(sw, ne);\n\n// 获取中心点\nvar center = bounds.getCenter();\n\n// 判断点是否在范围内\nvar point = new BMapGL.Point(116.4, 39.9);\nconsole.log(bounds.containsPoint(point));  // true\n\n// 获取当前地图视野范围\nvar mapBounds = map.getBounds();"},{"language":"javascript","snippet":"new BMapGL.Size(width, height)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: bmap-jsapi-gl\ndescription: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。\nlicense: MIT\nversion: 1.0.1\nmetadata:\n  openclaw:\n    requires:\n      env: BMAP_JSAPI_KEY\n    primaryEnv: BMAP_JSAPI_KEY\n---\n\n# JSAPI GL 开发指南\n\n百度地图 JSAPI WebGL 版本开发指南。包含地图初始化、覆盖物、事件、图层等核心模块的 API 说明和代码示例，旨在帮助开发者快速集成百度地图并遵循正确的使用方式。\n\n## 何时适用\n\n在以下场景中参考这些指南：\n\n- 创建新的地图页面或组件\n- 在地图上添加标注、折线、多边形等覆盖物\n- 处理地图交互事件（点击、拖拽、缩放等）\n- 配置地图样式或切换图层\n- 调试地图渲染或性能问题\n\n\n## 快速参考\n\n### 0. 基础概念\n\n- `references/base-classes.md` - 基础类：Point、Bounds、Size、Pixel、Icon\n- `references/constants.md` - 通用常量：搜索状态码、POI 类型\n\n### 1. 地图\n\n- `references/map-init.md` - 地图初始化：资源引入、创建实例、配置选项、交互与视图控制\n\n### 2. 地图覆盖物\n\n- `references/overlay-common.md` - 覆盖物通用操作：添加/移除、显示/隐藏、批量清除\n- `references/marker.md` - 点标记：构造参数、位置/图标/旋转/置顶/拖拽方法\n- `references/polyline.md` - 折线：构造参数、线条样式、坐标操作、编辑模式\n- `references/polygon.md` - 多边形：构造参数、边框/填充样式、带孔多边形、编辑模式\n- `references/circle.md` - 圆形：构造参数、中心点/半径、样式设置、编辑模式\n- `references/custom-overlay.md` - 自定义覆盖物：DOM 创建、属性传递、事件绑定、旋转控制\n- `references/info-window.md` - 信息窗口：构造参数、内容/尺寸设置、最大化、与 Marker 配合使用\n\n### 3. 事件\n\n- `references/map-events.md` - 地图事件：绑定方式、交互事件、视图变化事件、生命周期事件\n- `references/overlay-events.md` - 覆盖物事件：通用事件、拖拽事件、矢量图形事件\n\n### 4. 地图样式\n\n- `references/map-style.md` - 个性化地图：自定义地图外观（颜色、显隐），实现深色主题、简洁地图等效果\n\n### 5. 图层服务\n\n- `references/xyz-layer.md` - 第三方图层：加载 XYZ/TMS/WMS/WMTS 标准瓦片\n- `references/mvt-layer.md` - 矢量瓦片：加载 MVT/PBF 格式瓦片，支持样式表达式、特征交互、状态管理\n\n### 6. 路径规划\n\n- `references/route-common.md` - 通用配置：构造参数、渲染选项、回调函数、数据结构、状态常量\n  - `references/driving-route.md` - 驾车：策略枚举、途经点、路况、收费、拖拽\n  - `references/walking-route.md` - 步行：转向类型、拖拽\n  - `references/riding-route.md` - 骑行：骑行搜索\n  - `references/transit-route.md` - 公交：市内/跨城策略、交通方式、换乘\n\n### 7. 其他LBS服务\n\n- `references/local-search.md` - 本地检索：普通/范围/周边检索、结果处理、翻页、POI 数据结构\n- `references/geocoder.md` - 地理编码：正地理编码（地址→坐标）、逆地理编码（坐标→地址）\n- `references/convertor.md` - 坐标转换：GPS/高德/谷歌坐标转百度坐标\n\n## 如何使用\n\n请阅读各个参考文件以获取详细说明和代码示例:\n\n```\nreferences/map-init.md\n```\n\n每个参考文件包含：\n\n- 功能简要说明\n- 完整代码示例及解释\n- API 参数说明和注意事项\n\n## 注意事项\n\n- `references/get-ak.md` - 获取密钥（AK）：当用户无 AK 或 AK 失效时，引导用户前往控制台申请浏览器端类型的 AK"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn778b6bf766ym71fdvrc5yvg98319rv\",\n  \"slug\": \"baidu-map-jsapi-gl\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1778554877946\n}"},{"path":"references/base-classes.md","content":"# 基础类\n\n## Point 坐标点\n\n表示地理坐标点（经纬度）。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Point(lng, lat)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| lng | number | 经度 |\n| lat | number | 纬度 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `equals(other)` | boolean | 判断两个坐标点是否相等 |\n\n### 示例\n\n```javascript\n// 创建坐标点（BD09 经纬度坐标系）\nvar point = new BMapGL.Point(116.404, 39.915);\n\n// 获取坐标值\nconsole.log(point.lng);  // 116.404\nconsole.log(point.lat);  // 39.915\n\n// 比较两个点\nvar point2 = new BMapGL.Point(116.404, 39.915);\nconsole.log(point.equals(point2));  // true\n```\n\n### 坐标系说明\n\n百度地图 API 使用 **BD09** 坐标系（百度坐标系）。如果数据是其他坐标系（如 WGS84、GCJ02），需要先进行坐标转换。\n\n## Bounds 地理范围\n\n表示地理矩形区域。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Bounds(sw, ne)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| sw | Point | 西南角坐标 |\n| ne | Point | 东北角坐标 |\n\n### 方法\n\n| 方法 | 返回值 | 说明 |\n|------|--------|------|\n| `getSouthWest()` | Point | 获取西南角坐标 |\n| `getNorthEast()` | Point | 获取东北角坐标 |\n| `getCenter()` | Point | 获取中心点坐标 |\n| `containsPoint(point)` | boolean | 判断点是否在范围内 |\n| `extend(point)` | void | 扩展范围以包含指定点 |\n\n### 示例\n\n```javascript\n// 创建地理范围\nvar sw = new BMapGL.Point(116.3, 39.8);\nvar ne = new BMapGL.Point(116.5, 40.0);\nvar bounds = new BMapGL.Bounds(sw, ne);\n\n// 获取中心点\nvar center = bounds.getCenter();\n\n// 判断点是否在范围内\nvar point = new BMapGL.Point(116.4, 39.9);\nconsole.log(bounds.containsPoint(point));  // true\n\n// 获取当前地图视野范围\nvar mapBounds = map.getBounds();\n```\n\n## Size 尺寸\n\n表示像素尺寸。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Size(width, height)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度（像素） |\n| height | number | 高度（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| width | number | 宽度 |\n| height | number | 高度 |\n\n### 示例\n\n```javascript\n// 创建尺寸\nvar size = new BMapGL.Size(100, 80);\n\n// 获取地图容器尺寸\nvar containerSize = map.getContainerSize();\nconsole.log(containerSize.width, containerSize.height);\n```\n\n## Pixel 像素坐标\n\n表示像素坐标点。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Pixel(x, y)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标（像素） |\n| y | number | Y 坐标（像素） |\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| x | number | X 坐标 |\n| y | number | Y 坐标 |\n\n### 示例\n\n```javascript\n// 在事件对象中获取像素坐标\nmap.addEventListener('click', function(e) {\n    console.log('像素坐标:', e.pixel.x, e.pixel.y);\n    console.log('经纬度:', e.latlng.lng, e.latlng.lat);\n});\n\n// 像素坐标与经纬度转换\nvar point = map.pixelToPoint(new BMapGL.Pixel(100, 100));\nvar pixel = map.pointToPixel(new BMapGL.Point(116.404, 39.915));\n```\n\n## Icon 图标\n\n表示标注覆盖物所使用的图标。\n\n### 构造函数\n\n```javascript\nnew BMapGL.Icon(image, size, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| image | string/Canvas/Image | - | 图片 URL 或 DOM |\n| size | Size | - | 显示尺寸 |\n| options.anchor | Size | 图标中心 | 定位点偏移 |\n| options.imageOffset | Size | `new Size(0, 0)` | 图片偏移 (雪碧图) |\n| options.imageSize | Size | 原始尺寸 | 图片尺寸 (2x 图需设置) |\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `setImageUrl(ur"},{"path":"references/circle.md","content":"# Circle 圆形\n\n## 快速开始\n\n```javascript\nvar center = new BMapGL.Point(116.404, 39.915);\nvar circle = new BMapGL.Circle(center, 1000, {\n    strokeColor: '#3366FF',\n    strokeWeight: 2,\n    fillColor: '#3366FF',\n    fillOpacity: 0.3\n});\nmap.addOverlay(circle);\n```\n\n## 构造函数\n\n```javascript\nnew BMapGL.Circle(center, radius, options)\n```\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| center | Point | - | 圆心坐标 (必需) |\n| radius | number | - | 半径，单位：米 (必需) |\n| options | Object | - | 配置参数 |\n\n### options 参数\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| strokeColor | string | `'#000'` | 边框颜色，支持 '#xxxxxx'、'red'、'rgb(?,?,?)' |\n| strokeWeight | number | `2` | 边框宽度，单位像素 |\n| strokeOpacity | number | `1` | 边框透明度，取值范围 0-1 |\n| strokeStyle | string | `'solid'` | 边框样式：'solid'(实线)、'dashed'(虚线)、'dotted'(点线) |\n| fillColor | string | `'#fff'` | 填充颜色 |\n| fillOpacity | number | `0.6` | 填充透明度，取值范围 0-1 |\n| enableMassClear | boolean | `true` | 调用 map.clearOverlays() 时是否被清除 |\n| enableEditing | boolean | `false` | 是否开启可编辑模式 |\n| zIndex | number | `0` | 层级 |\n\n## 方法\n\n### 中心点\n\n```javascript\n// 设置圆心\ncircle.setCenter(new BMapGL.Point(116.410, 39.920));\n\n// 获取圆心\nvar center = circle.getCenter();  // 返回 Point\n```\n\n### 半径\n\n```javascript\n// 设置半径（单位：米）\ncircle.setRadius(2000);\n\n// 获取半径\nvar radius = circle.getRadius();  // 返回 number\n```\n\n### 边框样式\n\n```javascript\n// 颜色\ncircle.setStrokeColor('#FF0000');\nvar color = circle.getStrokeColor();\n\n// 宽度\ncircle.setStrokeWeight(3);\nvar weight = circle.getStrokeWeight();\n\n// 透明度\ncircle.setStrokeOpacity(0.8);\nvar opacity = circle.getStrokeOpacity();\n\n// 线型\ncircle.setStrokeStyle('dashed');\nvar style = circle.getStrokeStyle();\n```\n\n### 填充样式\n\n```javascript\n// 填充颜色\ncircle.setFillColor('#00FF00');\nvar fillColor = circle.getFillColor();\n\n// 填充透明度\ncircle.setFillOpacity(0.5);\nvar fillOpacity = circle.getFillOpacity();\n```\n\n### 几何信息\n\n```javascript\n// 获取圆形的地理范围（外接矩形）\nvar bounds = circle.getBounds();  // 返回 Bounds\n\n// 获取近似圆周长（墨卡托单位，非实际距离），返回的是近似圆的多边形边界点连线长度，不是数学圆周长 2πr\nvar length = circle.getLength();\n\n// 获取近似圆的边界路径点\nvar path = circle.getPath();  // 返回 Array<Point>，约40个点\n```\n\n### 显示隐藏\n\n```javascript\ncircle.show();   // 显示\ncircle.hide();   // 隐藏\n```\n\n### 编辑\n\n编辑模式下有两个控制点：\n- 中心点：拖拽移动圆形\n- 圆周点：拖拽改变半径\n\n```javascript\ncircle.enableEditing();   // 开启编辑模式\ncircle.disableEditing();  // 关闭编辑模式\n```\n\n### 批量配置\n\n```javascript\ncircle.setOptions({\n    strokeColor: '#FF6600',\n    fillColor: '#FF6600',\n    fillOpacity: 0.4\n});\n```\n\n## 常见场景\n\n### 可编辑圆形\n\n```javascript\nvar circle = new BMapGL.Circle(center, 1000, {\n    enableEditing: true\n});\n\nmap.addOverlay(circle);\n\n// 监听编辑完成事件\ncircle.addEventListener('lineupdate', function(e) {\n    var overlay = e.overlay;\n    console.log('新圆心:', overlay.getCenter());\n    console.log('新半径:', overlay.getRadius(), '米');\n});\n```"},{"path":"references/constants.md","content":"# 通用常量\n\n## 搜索状态常量\n\n所有 LBS 服务（LocalSearch、Geocoder、路径规划等）共用的状态码。\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_STATUS_SUCCESS | 0 | 检索成功 |\n| BMAP_STATUS_CITY_LIST | 1 | 返回城市列表（需选择城市后重新检索） |\n| BMAP_STATUS_UNKNOWN_LOCATION | 2 | 位置未知 |\n| BMAP_STATUS_UNKNOWN_ROUTE | 3 | 路线未知/无法规划 |\n| BMAP_STATUS_INVALID_KEY | 4 | 非法密钥 |\n| BMAP_STATUS_INVALID_REQUEST | 5 | 非法请求 |\n| BMAP_STATUS_PERMISSION_DENIED | 6 | 没有权限 |\n| BMAP_STATUS_SERVICE_UNAVAILABLE | 7 | 服务不可用 |\n| BMAP_STATUS_TIMEOUT | 8 | 超时 |\n\n## POI 类型常量\n\n| 常量 | 值 | 说明 |\n|------|-----|------|\n| BMAP_POI_TYPE_NORMAL | 0 | 普通 POI |\n| BMAP_POI_TYPE_BUSSTOP | 1 | 公交站 |\n| BMAP_POI_TYPE_SUBSTOP | 2 | 地铁站 |"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Skill: Baidu Map JSAPI GL（百度地图官方 WebGL SKills） Summary: 百度地图 JSAPI WebGL (BMapGL)完整开发指南，覆盖地图初始化、覆盖物、图层、事件、样式、性能优化的任务，一站式开发高性能 3D 地图应用。当用户提及 BMapGL、百度地图、jsapi-gl或相关地图开发需求时自动触发。 Tags: latest:1.0.2 Version history: v1.0.2 | 2026-05-12T03:01:17.946Z | user Version 1.0.2 of baidu-map-jsapi-gl - No file changes detected in this release. - Version number updated from 1.0.1 to 1.0.2 with no changes to functionality or docume","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":810,"uniquenessScore":52,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:56:47.815Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:56:12.443Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}