Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsCommunityBlog
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

Back to skills

Hmos Map Kit Mass Point Overlay

ASecurity

在地图上绘制海量点图层,支持批量展示坐标点数据,数据量从几十个至十万个点,适用于POI展示、位置标记、数据可视化场景

2 stars
0 votes
0 copies
0 views
Added 9/22/2026
developmenttypescriptgitapi

Works with

cliapi

Security Analysis

A100/100

Scanned 9/22/2026

Install to Claude Code

$npx -y skills add IsKenKenYa/skills --skill hmos-map-kit-mass-point-overlay --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hmos Map Kit Mass Point Overlay?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Hmos Map Kit Mass Point Overlay
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iskenkenya-hmos-map-kit-mass-point-overlay/badge)](https://www.skillsdirectory.com/skills/iskenkenya-hmos-map-kit-mass-point-overlay)

More formats (shields.io, HTML) on the badges page.

Download Zip
Files
SUB_SKILL.md
---
name: hmos-map-kit-mass-point-overlay
description: 在地图上绘制海量点图层,支持批量展示坐标点数据,数据量从几十个至十万个点,适用于POI展示、位置标记、数据可视化场景
---

# 海量点图层技能

## 功能描述

本技能用于在HarmonyOS地图组件上绘制海量点图层,批量展示坐标点数据。海量点图层功能从API版本6.0.0(20)开始支持,能够高效处理从几十个点到十万个点的数据量级,提供流畅的渲染性能和交互体验。

**核心能力**:
- 批量添加大量坐标点标记
- 自定义点图标样式
- 支持点击事件监听
- 动态更新点数据
- 高性能渲染优化

**技术特点**:
- 异步API调用(Promise模式)
- Stage模型约束
- 支持自定义图标资源
- 支持图标锚点调整
- 支持可见性控制

## 使用场景

### 触发词
- "添加海量点"
- "绘制海量点图层"
- "批量标记地图点位"
- "添加大量POI标记"
- "地图数据可视化"
- "Map Kit 海量点"

### 能做
- 在地图上添加大量坐标点标记(建议数量<100000)
- 自定义海量点图标样式
- 监听海量点点击事件
- 动态更新海量点数据列表
- 控制海量点的可见性
- 设置图标锚点位置
- 删除海量点图层

### 绝不做
- 不支持添加超过100000个点(性能限制)
- 不支持单个点的样式差异化(统一图标)
- 不支持点的拖拽功能
- 不支持点的信息窗口显示
- 不适用于少量标记场景(建议使用Marker)

### 补充
- 建议图标文件存放在resources/rawfile目录
- 图标格式支持jpg、jpeg、png、gif、webp、svg
- 使用资源相对路径格式传入icon参数
- 点击事件通过MapEventManager监听
- 需在地图初始化回调中调用相关API

## 调用规范和规则

### 输入约束
- **点数量限制**:建议数据量小于100000条
- **坐标范围**:latitude [-90, 90], longitude [-180, 180]
- **itemId要求**:每个点必须有唯一标识符
- **图标格式**:支持jpg、jpeg、png、gif、webp、svg
- **图标路径**:必须使用resources/rawfile相对路径
- **锚点范围**:anchorU/anchorV取值范围[0, 1]

### 执行约束
- **API调用频次**:无明确限制,建议合理控制更新频率
- **异步调用**:必须使用Promise异步模式
- **初始化时机**:必须在地图初始化回调中调用
- **内存管理**:大量数据时注意内存占用

### 内容约束
- **禁止操作**:不支持单个点的独立样式设置
- **禁止路径**:图标路径不支持绝对路径
- **禁止坐标系**:不支持其他坐标系(必须WGS84)
- **数据要求**:items数组不能为空

### 降级约束
- **数量超限**:超过100000条数据时,建议分批添加或使用聚合方案
- **图标加载失败**:使用默认图标或提示用户检查资源路径
- **内存不足**:减少数据量或分批次添加
- **操作失败**:检查错误码并重试,必要时降级使用Marker方案

## 调用流程和步骤

### 步骤1:准备阶段

**前置校验**:
1. 确认API版本>=6.0.0(20)
2. 检查地图组件已初始化完成
3. 准备海量点数据列表
4. 确认图标资源文件已放置在resources/rawfile目录

**参数准备**:
```typescript
// 导入必要模块
import { mapCommon, map, MapComponent } from '@kit.MapKit';
import { AsyncCallback } from '@kit.BasicServicesKit';

// 准备海量点数据
let items: mapCommon.MassPointItem[] = [];
for (let i = 0; i < 1000; i++) {
  items.push({
    itemId: 'point_' + i,           // 唯一标识符
    position: {
      latitude: 32.11111 + Math.random() * 1 - 0.5,
      longitude: 118.11111 + Math.random() * 1 - 0.5
    },
    title: 'Point ' + i,             // 标题(可选)
    snippet: 'Description ' + i      // 内容(可选)
  });
}

// 准备海量点参数
let params: mapCommon.MassPointOverlayParams = {
  id: 'mass_points_layer_1',        // 海量点图层唯一标识
  items: items,                      // 海量点列表
  icon: 'icon/maps_blue_dot.png',    // 图标相对路径
  anchorU: 0.5,                      // 水平锚点(可选)
  anchorV: 0.5                       // 垂直锚点(可选)
};
```

### 步骤2:调用API添加海量点

**示例代码**:
```typescript
@Entry
@Component
struct MapMassPointDemo {
  private TAG = 'MapMassPointDemo';
  private mapOptions?: mapCommon.MapOptions;
  private mapController?: map.MapComponentController;
  private callback?: AsyncCallback<map.MapComponentController>;
  private massPointOverlay?: map.MassPointOverlay;

  aboutToAppear(): void {
    // 地图初始化参数
    this.mapOptions = {
      position: {
        target: {
          latitude: 32.11111,
          longitude: 118.11111
        },
        zoom: 9
      },
      scaleControlsEnabled: true
    };

    // 地图初始化回调
    this.callback = async (err, mapController) => {
      if (!err) {
        this.mapController = mapController;
        try {
          // 添加海量点图层
          this.massPointOverlay = await this.mapController?.addMassPointOverlay(params);
          console.info(this.TAG, 'Mass point overlay added successfully');
        } catch (e) {
          console.error(this.TAG, `Failed to add mass point overlay: code:${e.code}, message:${e.message}`);
        }
      } else {
        console.error(this.TAG, `Map initialization failed: code:${err.code}, message:${err.message}`);
      }
    };
  }

  build() {
    Stack() {
      Column() {
        MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback })
          .width('100%')
          .height('100%');
      }.width('100%')
    }.height('100%')
  }
}
```

### 步骤3:监听海量点点击事件

**事件监听代码**:
```typescript
// 初始化地图事件管理器
let mapEventManager = this.mapController?.getEventManager();

// 定义点击回调
let massCallback: map.MassPointOverlayCallback = (overlay, item) => {
  console.info(`MassPointOverlay clicked: overlayId=${overlay.getId()}, itemId=${item.itemId}, title=${item.title}`);
  // 处理点击事件,如显示详情、导航等
  hilog.info(0x0000, this.TAG, `Clicked point: ${JSON.stringify(item)}`);
};

// 启动海量点点击事件监听
mapEventManager?.on('massPointOverlayClick', massCallback);

// 停止海量点点击事件监听(传入指定callback)
mapEventManager?.off('massPointOverlayClick', massCallback);

// 停止所有海量点点击事件监听(无需传入callback)
mapEventManager?.off('massPointOverlayClick');
```

### 步骤4:更新海量点数据

**动态更新代码**:
```typescript
// 更新海量点列表
function updateMassPoints(newItems: mapCommon.MassPointItem[]): void {
  try {
    this.massPointOverlay?.setItems(newItems);
    console.info(this.TAG, 'Mass points updated successfully');
  } catch (e) {
    console.error(this.TAG, `Failed to update mass points: ${e.message}`);
  }
}

// 示例:更新部分点数据
let newItems: mapCommon.MassPointItem[] = [
  {
    itemId: 'point_1',
    position: { latitude: 32.5, longitude: 118.5 },
    title: 'Updated Point 1',
    snippet: 'New description'
  },
  {
    itemId: 'point_2',
    position: { latitude: 32.6, longitude: 118.6 }
  }
];
updateMassPoints(newItems);
```

### 步骤5:控制海量点可见性

**可见性控制代码**:
```typescript
// 设置海量点可见
this.massPointOverlay?.setVisible(true);

// 设置海量点不可见
this.massPointOverlay?.setVisible(false);

// 获取当前可见状态
let isVisible: boolean = this.massPointOverlay?.isVisible() ?? false;
console.info(this.TAG, `Mass point overlay visibility: ${isVisible}`);
```

### 步骤6:删除海量点图层

**删除操作代码**:
```typescript
// 删除海量点图层
function removeMassPointOverlay(): void {
  try {
    this.massPointOverlay?.remove();
    this.massPointOverlay = undefined;
    console.info(this.TAG, 'Mass point overlay removed successfully');
  } catch (e) {
    console.error(this.TAG, `Failed to remove mass point overlay: ${e.message}`);
  }
}
```

### 步骤7:错误处理

**错误处理代码**:
```typescript
try {
  this.massPointOverlay = await this.mapController?.addMassPointOverlay(params);
} catch (error) {
  switch (error.code) {
    case 1002601001:
      console.error('The object to be operated does not exist');
      // 检查地图控制器是否已初始化
      break;
    case 401:
      console.error('Invalid input parameter');
      // 检查参数格式是否正确
      break;
    default:
      console.error(`Unknown error: code=${error.code}, message=${error.message}`);
      // 记录错误日志并重试
  }
}
```

### 步骤8:降级处理

**降级方案代码**:
```typescript
async function addMassPointsWithFallback(items: mapCommon.MassPointItem[]): void {
  try {
    // 尝试使用海量点图层
    if (items.length <= 100000) {
      let params: mapCommon.MassPointOverlayParams = {
        id: 'mass_points',
        items: items,
        icon: 'icon/maps_blue_dot.png'
      };
      this.massPointOverlay = await this.mapController?.addMassPointOverlay(params);
    } else {
      // 数据量过大,分批次添加
      console.warn('Too many points, using batch mode');
      const batchSize = 10000;
      for (let i = 0; i < items.length; i += batchSize) {
        const batch = items.slice(i, i + batchSize);
        // 使用Marker方案处理每个批次
        for (let item of batch) {
          await this.mapController?.addMarker({
            position: item.position,
            title: item.title
          });
        }
      }
    }
  } catch (error) {
    console.error('Mass point overlay failed, fallback to Marker');
    // 降级使用Marker方案
    for (let item of items) {
      try {
        await this.mapController?.addMarker({
          position: item.position,
          title: item.title
        });
      } catch (e) {
        console.error(`Failed to add marker for item ${item.itemId}`);
      }
    }
  }
}
```

## 错误码说明

| 错误码 | 说明 | 解决方法 |
|-------|------|---------|
| 1002601001 | 操作的对象不存在 | 检查地图控制器是否已初始化,确保在地图初始化回调中调用API |
| 401 | 输入参数无效 | 检查参数格式:确保itemId唯一、坐标范围正确、items数组不为空 |
| 其他错误 | 未知错误 | 查看错误信息详情,检查网络连接和权限配置 |

## 编译和修复问题

### 依赖声明
```json
{
  "dependencies": {
    "@kit.MapKit": "API 6.0.0(20)+",
    "@kit.BasicServicesKit": "API 4.1.0(11)+"
  }
}
```

### 环境要求
- **HarmonyOS API版本**:最低6.0.0(20)
- **开发环境**:DevEco Studio 3.0+
- **目标设备**:支持HarmonyOS的手机、平板
- **模型约束**:仅支持Stage模型

### 常见编译问题

**问题1:找不到MapKit模块**
```
Error: Cannot find module '@kit.MapKit'
```
**解决方法**:
- 检查项目API版本配置,确保>=6.0.0(20)
- 在build-profile.json5中配置正确的compileSdkVersion
- 重新同步项目依赖

**问题2:图标资源找不到**
```
Error: Icon resource not found: icon/maps_blue_dot.png
```
**解决方法**:
- 确认图标文件已放置在resources/rawfile目录
- 检查icon参数使用相对路径(不带resources/rawfile前缀)
- 确认图标文件格式正确(jpg、jpeg、png、gif、webp、svg)

**问题3:地图初始化失败**
```
Error: Map controller is undefined
```
**解决方法**:
- 确保在地图初始化回调中调用API
- 检查MapComponent组件是否正确配置
- 确认地图服务权限已配置

## 常见问题与解决方法

### Q1:海量点显示不出来
**原因**:图标资源路径错误或地图未初始化完成
**解决方法**:
- 检查图标文件路径是否正确
- 确保在地图初始化回调中调用addMassPointOverlay
- 检查items数据是否为空数组
- 验证API版本是否>=6.0.0(20)

### Q2:点击事件不响应
**原因**:事件监听未正确配置
**解决方法**:
- 确保已调用mapEventManager.on('massPointOverlayClick', callback)
- 检查回调函数定义是否正确
- 确认海量点图层已成功添加

### Q3:数据量过大导致性能问题
**原因**:超过建议的数据量限制
**解决方法**:
- 控制数据量在100000条以内
- 使用分批添加策略
- 考虑使用聚合方案(如Marker聚合)
- 优化图标尺寸和分辨率

### Q4:如何更新单个点的位置
**原因**:海量点不支持单个点的独立更新
**解决方法**:
- 使用setItems方法更新整个点列表
- 维护点数据的映射关系,通过itemId管理
- 考虑使用Marker方案处理需要频繁更新的点

### Q5:图标锚点设置不生效
**原因**:anchorU/anchorV参数范围错误
**解决方法**:
- 确认锚点取值范围[0, 1]
- anchorU=0.5表示图标中心,0表示左边缘,1表示右边缘
- anchorV=0.5表示图标中心,0表示顶部,1表示底部

## 输出结果报告

执行完成后输出以下信息:

```json
{
  "status": "success",
  "operation": "addMassPointOverlay",
  "overlayId": "mass_points_layer_1",
  "pointCount": 1000,
  "iconPath": "icon/maps_blue_dot.png",
  "clickEventEnabled": true,
  "visibility": true,
  "apiUsed": [
    "mapCommon.MassPointOverlayParams",
    "mapCommon.MassPointItem",
    "map.MapComponentController.addMassPointOverlay",
    "map.MassPointOverlay.getId",
    "map.MassPointOverlay.setItems",
    "map.MassPointOverlay.setVisible",
    "map.MassPointOverlay.isVisible",
    "map.MassPointOverlay.remove",
    "map.MapEventManager.on",
    "map.MapEventManager.off"
  ]
}
```

## 参考文档

- [API开发指南 - 海量点图层](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/map-mass-point)
- [API参考 - MassPointOverlayParams](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/map-common)
- [API参考 - addMassPointOverlay](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/map-map-mapcomponentcontroller)
- [API参考 - MassPointOverlay](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/map-map-masspointoverlay)

## 完整示例代码

- [ArkTS完整示例 - 海量点图层](assets/map_mass_point_overlay_example.ets)
- [图标资源示例](assets/icon/maps_blue_dot.png)
- [配置文件示例](assets/map_config.json)

## 测试用例

### 正向测试用例
- [添加少量海量点测试](tests/test_add_small_amount_mass_points.ets):测试添加10-100个海量点
- [添加中等数量海量点测试](tests/test_add_medium_amount_mass_points.ets):测试添加1000-10000个海量点
- [添加大量海量点测试](tests/test_add_large_amount_mass_points.ets):测试添加50000个海量点
- [点击事件监听测试](tests/test_mass_point_click_event.ets):测试海量点点击事件响应
- [动态更新数据测试](tests/test_update_mass_points.ets):测试动态更新海量点列表

### 边界测试用例
- [最大数据量测试](tests/test_max_point_limit.ets):测试添加100000个海量点(边界值)
- [坐标边界测试](tests/test_coordinate_boundary.ets):测试坐标范围边界值
- [锚点边界测试](tests/test_anchor_boundary.ets):测试anchorU/anchorV边界值[0, 1]

### 异常测试用例
- [空数据列表测试](tests/test_empty_items.ets):测试items为空数组的错误处理
- [无效图标路径测试](tests/test_invalid_icon_path.ets):测试图标路径不存在的情况
- [无效坐标测试](tests/test_invalid_coordinate.ets):测试超出范围的坐标值
- [超大数据量测试](tests/test_exceed_max_limit.ets):测试超过100000个点的降级处理
- [未初始化地图测试](tests/test_uninitialized_map.ets):测试地图未初始化时的错误处理

Attribution

IsKenKenYaIsKenKenYa
View sourceMore from IsKenKenYa →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Browser Extension Developer

Use this skill when developing or maintaining browser extension code in the `browser/` directory, including Chrome/Firefox/Edge compatibility, content scripts, background scripts, or i18n updates.

284072 votes

Seo Optimizer

SEO optimization with keyword analysis, readability assessment, technical validation, content quality. Use for search rankings, blog posts, content audits, or encountering keyword density, readability scores, meta tags, schema markup errors.

2192 votes

Google Official Seo Guide

Official Google SEO guide covering search optimization, best practices, Search Console, crawling, indexing, and improving website search visibility based on official Google documentation

1862 votes

Tanstack Start

Build a full-stack TanStack Start app on Cloudflare Workers from scratch — SSR, file-based routing, server functions, D1+Drizzle, better-auth, Tailwind v4+shadcn/ui. Use whenever the user mentions TanStack Start, asks to scaffold a full-stack Cloudflare app with SSR, wants an SSR dashboard, or asks for a React 19 + Cloudflare Workers app with file-based routing and server functions — even if they don't name TanStack Start specifically. No template repo — Claude generates every file fresh per ...

9881 votes

Pentest

PTES-aligned adversarial security audit for backend, frontend, and mobile applications. Produces a CVSS-scored Hacker Report with verified PoCs and phased remediation.

5491 votes
View all in development →