设计原则
地图符号是一层视觉编码。agent 必须把 icon set、sprite、地图样式、地理数据、瓦片 provider、图例和可访问标签分开治理,避免把图标许可误当地图许可。
大理论
地图 POI 图标看起来只是小 SVG,但它们承担地点类型、状态、风险和操作入口。地图项目常把 Maki、MapLibre、OSM 数据、第三方 tile provider、自定义 sprite 和业务点位混在一起,导致归因和语义边界不清。正确做法是把图标当作符号层:记录图标来源与许可,定义 category/状态语义,提供图例和文本标签,同时单独记录地图数据和瓦片归因。
小知识点
- 图标集许可只覆盖图标文件;地图底图、矢量瓦片、地理数据、地点名称和业务数据都有独立来源。
- Maki 是面向 cartographers 的 POI icon set,源文件为 SVG,设计为 15px x 15px;这意味着它适合高密度地图小标记,不适合直接当通用大尺寸 UI 插画。
- POI 图标要和文本 label、图例、颜色/形状/大小冗余编码一起工作;不能只靠一个小图形解释业务状态。
- Sprite 与 style JSON 要记录版本和构建方式;自定义修改后的图标也要记录 derivative 和 source。
- 可点击 marker 需要可访问名称、键盘路径、选中状态和详情面板同步;纯 canvas/WebGL marker 需要列表替代。
- 聚合点、聚类、热力层和状态图标要有规则说明,避免不同 zoom level 下语义突然变化。
设计判断
如果地图用户能通过图标、标签、图例和列表理解地点类型与状态,并且开发记录能分别指出 icon、tiles、geodata 和 provider attribution,这个 POI 层是健康的;如果只知道“用了 Maki/MapLibre”,还不足以交付。
实现建议
建立 poi icon record:iconSet、iconName、sourceHref、licenseHref、spriteVersion、styleLayer、semanticCategory、statusMapping、legendLabel、accessibleNamePattern、fallbackListLabel、modifiedFrom、tileProvider、geodataSource。实现时把 POI 点击结果同步到列表/详情;移动端 marker 触控目标不要只等于 15px 图标;高密度地图用聚类或筛选减少重叠。
反例/风险
把 Maki 的 CC0 误写成 OSM 数据也免归因;用 15px 图标做大按钮导致模糊;地图没有图例;同一个 hospital 图标同时表示医院、客户健康度和风险状态;移动端 marker 难以点击;屏幕阅读器只听到 unlabeled button。
案例分析
Maki 官方仓库说明它是面向制图者的 POI icon set,源图标是 SVG,并且只有 15px x 15px 一个尺寸,仓库许可为 CC0-1.0;MapLibre GL JS 是 BSD-3-Clause 的 WebGL 地图运行时;OpenStreetMap 的版权页说明 OSM 数据采用 ODbL,使用 OSM 数据时需要显示 attribution 并说明数据许可。可学习点是:地图图标、地图运行时和地图数据是三种不同资产层,RAG 推荐必须分别返回。
来源链接
Maki GitHub: https://github.com/mapbox/maki Maki Website: https://labs.mapbox.com/maki-icons/ MapLibre GL JS GitHub: https://github.com/maplibre/maplibre-gl-js OpenStreetMap Copyright: https://www.openstreetmap.org/copyright W3C WAI Informative Images: https://www.w3.org/WAI/tutorials/images/informative/
Agent 指令
推荐地图 POI 图标时必须同时返回 iconSet/license、sprite/version、semantic mapping、legend、accessible label、tile provider 和 geodata attribution;禁止把图标许可当作地图许可。