交互式已访问国家地图可让旅行者在世界地图上选择国家,将其标记为已访问或计划访问,保存状态并在之后继续使用。它与带城市图钉的旅行地图不同,主要几何对象是国家边界:每个国家都是与稳定标识符和用户状态关联的 Polygon 或 MultiPolygon。可靠的实现还要定义哪些实体算作国家、记录边界来源、确保小国也能被选择,并将旅行数据与地图样式分开。
下文涵盖数据架构、国家标识符、边界政策、MapLibre 渲染、持久化、无障碍、隐私、与 Studio 的衔接以及常见错误。相关产品信息请参阅 Kaleidr Studio。基于地点图钉的地图请参阅如何创建带图钉的世界旅行地图,绘制大量地点请参阅在地图上绘制地点。
已访问国家地图要点
- 使用多边形而非图钉: 国家追踪使用边界,城市记忆使用点。
- 分离数据集: 共享几何通过稳定 ID 与个性化旅行状态连接。
- 计数是一项政策: 符合条件的国家总数是产品规则,并非要素数量。
- 状态优先于样式: 先存储
visited/want_to_visit,再选择颜色。- 谨慎衔接: 轻量追踪器可以引导用户创建更丰富的 Studio 地图,但不要夸大功能。

什么是交互式已访问国家地图?
这是一幅让国家充当交互式地理对象而非静态背景的世界地图。用户通常可以选择国家,将其标记为已访问或加入愿望清单,按名称搜索,查看持续更新的数量或百分比,保存进度并分享概要。核心模型由国家几何、稳定国家 ID 和用户旅行状态组成。围绕该模型的产品决策很重要:国家边界具有政治敏感性,总数取决于计数政策,详细的未来旅行历史也可能属于隐私。
| 体验 | 主要几何 | 最适合 |
|---|---|---|
| 已访问国家地图 | 国家多边形 | 国家追踪、全球进度、愿望清单 |
| 带图钉的旅行地图 | 点 | 城市、地标、酒店、餐厅、回忆 |
| 路线地图 | 线 + 点 | 公路旅行、行程、旅途 |
| 旅行日志地图 | 点 + 内容 | 笔记、照片、日期、故事 |
国家追踪器回答旅行者去过哪些国家,图钉地图回答其去过哪些具体地点。优秀的旅行产品可以同时支持二者,而不必把它们强行塞进一幅过载的地图。
应如何存储国家几何与旅行状态?
最清晰的架构会将地理参考数据与个性化旅行状态分开。边界数据保存稳定标识符、显示名称、Polygon 或 MultiPolygon 几何、可选区域或大洲、数据集版本,以及按产品计数政策确定的资格。用户状态只保存旅行者拥有的值,如 JP: visited 或 IS: want_to_visit。地图设计可以改变,旅行历史不应改变。不要只用颜色编码业务状态;应先存储语义状态,再由渲染器决定使用紫色、青绿色、图案还是轮廓。
国家名称会因语言、缩写、标点、命名惯例、官方变更和音译而变化,因此不适合作为数据库键。ISO 3166 被广泛用于标准化国家代码,ISO 3166 维护机构负责维护已分配的代码集(ISO 3166)。请记录哪个标识符具有权威性——ISO alpha-2、alpha-3 或边界提供方的要素 ID——并保留地理要素与用户状态之间的映射。
GeoJSON 同时支持 Polygon 和 MultiPolygon;RFC 7946 定义了其结构,并使用经度在前的坐标顺序(RFC 7946)。许多国家因领土包含彼此分离的岛屿或区域而需要 MultiPolygon。坐标顺序详情请参阅使用纬度和经度搜索位置。

边界数据集和国家计数如何运作?
已访问国家追踪器需要维护良好的国家几何来源。Natural Earth 发布 1:10m、1:50m 和 1:110m 比例尺的公有领域地图数据,包括 Admin 0 国家数据集;其文档区分国家、主权、地图单元、子单元、争议地区及可选地理视角(Admin 0 — Countries)。边界文件并不是所有国家的通用定义。联合国会员国列表是一种可选参考集,但旅行产品可能以不同方式处理观察员国、领土、属地、构成国或争议实体(UN Member States)。不要默认把 GeoJSON 要素数当作世界国家数。应在每个要素上明确资格,并对计数政策进行版本管理,使进度百分比始终可以解释。
国家边界可能反映政治争议和不同地理视角。面向消费者的旅行地图不应暗示其界面解决了这些争议。请记录边界来源、数据集版本、计数政策版本及领土处理方式,并添加中立声明,例如“边界和国家数量遵循本地图使用的地理数据集和计数政策”。不要用图像模型或语言模型生成国家边界,应使用持续维护的地理空间数据。

如何渲染和更新国家选择?
简单的国家追踪器会把国家 GeoJSON 加载到地图源,绘制填充图层,处理选择,更新用户状态存储,重新设置要素样式,并刷新进度和国家列表。MapLibre GL JS 可以使用 fill 图层渲染 GeoJSON 多边形(添加 GeoJSON 多边形)。优先更改应用状态:切换状态、持久化旅行状态、更新受影响要素的样式,再重新计算统计信息。避免每次点击都重建整个国家数据集。产品需要时可支持多于两个状态:已访问、想去和未访问可覆盖多数追踪需求。
import maplibregl from "maplibre-gl";
const visited = new Set(["JPN", "FRA", "CAN"]);
const map = new maplibregl.Map({
container: "map",
style: "https://demotiles.maplibre.org/style.json",
center: [10, 20],
zoom: 1.2
});
map.on("load", async () => {
const countries = await (await fetch("/data/countries.geojson")).json();
countries.features = countries.features.map((feature) => ({
...feature,
properties: {
...feature.properties,
visit_status: visited.has(feature.properties.iso_a3)
? "visited"
: "not_visited"
}
}));
map.addSource("countries", { type: "geojson", data: countries });
map.addLayer({
id: "countries-fill",
type: "fill",
source: "countries",
paint: {
"fill-color": [
"match",
["get", "visit_status"],
"visited", "#6f5bd3",
"want_to_visit", "#72c4c9",
"#d8d8d8"
],
"fill-opacity": 0.65
}
});
});
实现前请确认所选数据集的实际属性架构。请使用设计系统中的无障碍颜色,而不是上面的示例值。
持久化、无障碍与隐私应如何设计?
匿名体验可以把选择保存在本地应用状态和同一设备的浏览器存储中。登录体验则在设备间同步经过授权的后端旅行资料。地图渲染器负责显示状态,不应成为身份或持久化系统。请把地理政策元数据与已保存资料一起进行版本管理,避免日后的数据集更新悄然改写历史进度。
添加与地图同步且可搜索的国家列表,确保小国在移动设备上仍可选择。提供键盘可操作控件、清晰的焦点,并确保状态不只通过颜色传达。默认应优先分享粗粒度快照——已访问数量和公开国家集合——而不是导出确切旅行日期、酒店、路线、当前位置或未来计划。愿望清单和计划旅行属于敏感信息;只有用户明确选择时才公开未来目的地。
AI 可以帮助组织类别、在选择国家后建议更密集的城市图层或优化样式,但用户选择始终是权威旅行历史。不要根据模型知识编造访问过的国家。
Kaleidr Studio 在其中扮演什么角色?
轻量追踪器可以先满足搜索意图,再引导用户创建更丰富的地图。Kaleidr Studio 目前支持提示词优先的自定义交互地图创建,包括数据驱动地图、主题区域、标记、图层、视觉样式、发布和嵌入。公开 Studio 页面目前没有记录带自动用户级国家状态持久化、内置国家计数器或专用“已访问/愿望清单”切换模式的追踪器;在相关能力实现并形成文档前,不应将其描述为现有 Studio 功能。推荐路径是:交互式国家追踪器 → 保存或分享 → 转换为更丰富的旅行地图 → 在 Studio 中优化并发布。为提高性能,请使用泛化的世界几何,保持用户状态负载很小,仅在用户请求时加载城市或地点详情。
![]()
团队应避免哪些错误?
| 错误 | 后果 | 更好的方法 |
|---|---|---|
| 使用国家名称作为主键 | 本地化会破坏状态 | 使用稳定标识符 |
| 把填充颜色当作旅行数据 | 主题变化会破坏逻辑 | 单独存储语义状态 |
| 把 GeoJSON 要素当作国家计数 | 领土会扭曲总数 | 定义资格政策 |
| 硬编码通用国家总数 | 假设变得不可见 | 发布计数政策 |
| 忽略边界视角 | 地图显得具有政治权威性 | 记录来源和政策 |
| 使用图钉而非国家多边形 | 无法满足国家级意图 | 让国家区域可交互 |
| 让小国无法选择 | 移动端和无障碍体验受损 | 添加搜索和同步列表 |
| 首次点击前强制注册 | 用户获取阻力增加 | 适当时先允许本地状态 |
| 默认分享精确旅行历史 | 隐私风险增加 | 仅分享用户预期的粗粒度状态 |
| 把 AI 当作旅行历史真相 | 用户状态可能被编造 | 以用户选择为权威 |
最终结论
只有忽略那些使其可靠的决策时,交互式已访问国家地图在技术上才显得简单。核心实现由国家边界、稳定 ID、用户旅行状态、交互式填充图层和已保存进度组成。更难的是产品问题:什么算国家、地图遵循哪个边界数据集、如何处理领土和争议地区、状态是否跨设备保持、哪些内容公开分享,以及国家级地图能否发展为更丰富的地点级旅行地图。对旅行者而言,最佳体验从其搜索任务开始——点击国家并看到地图立即更新。当用户需要超越国家进度的地点、区域、图层、样式和发布能力时,可以再通过 Kaleidr Studio 创建更丰富的地图。
使用 Kaleidr Studio 创建更丰富的旅行地图
将国家、城市、地点和旅行想法转化为可自定义的交互式地图。准备好从国家选择扩展到更丰富的自制旅行地图时,在 Kaleidr Studio 中开始创建。
常见问题
什么是交互式已访问国家地图?
它是一幅允许用户选择国家并保存其旅行状态的世界地图,通常包括已访问、想去和未访问。
它与带图钉的旅行地图有何区别?
已访问国家地图突出国家边界;图钉地图标记具体城市、地标、酒店、餐厅或其他地点。
需要哪些地图数据?
需要国家边界几何(通常为 Polygon 或 MultiPolygon 要素)、稳定的国家标识符,以及独立的用户旅行状态记录。
可以使用 GeoJSON 表示国家边界吗?
可以。GeoJSON 支持 Polygon 和 MultiPolygon,广泛用于 Web 地图。
应存储哪种国家代码?
ISO 3166 alpha-2 或 alpha-3 是常见选择。请一致使用稳定标识符,并记录它们与所选边界数据集的映射。
地图应统计多少个国家?
没有所有旅行产品都必须采用的统一分母。请定义追踪器是否仅统计特定参考集、是否包括观察员国或领土,或采用其他文档化政策。
为什么不同应用显示的总数不同?
它们可能采用不同的国家定义、边界数据集,或对领土与争议地区的不同处理方式。
应如何处理争议边界?
使用持续维护的地理数据集,记录其视角或边界政策,并避免暗示旅行应用解决了政治争议。
地图可以在没有账户的情况下工作吗?
可以。浏览器本地存储可在同一设备上保留选择。账户有助于跨设备同步、备份或持久分享。
Kaleidr Studio 可以创建旅行地图吗?
可以。它目前支持基于提示词的自定义交互地图,以及主题区域、标记、图层、视觉样式、发布和嵌入。公开 Studio 页面目前未记录专用的用户级已访问国家计数器或国家切换追踪器。
参考资料
- 国际标准化组织。ISO 3166 — 国家代码。访问日期:2026年8月16日。https://www.iso.org/iso-3166-country-codes.html
- 互联网工程任务组。RFC 7946:GeoJSON 格式。2016。https://datatracker.ietf.org/doc/html/rfc7946
- Kaleidr。使用 AI 地图制作工具创建自定义地图。访问日期:2026年8月16日。https://kaleidr.com/studio
- Kaleidr。使用 Kaleidr 构建。开发者文档。访问日期:2026年8月16日。https://docs.kaleidr.com/
- MapLibre。添加 GeoJSON 多边形。MapLibre GL JS 文档。访问日期:2026年8月16日。https://maplibre.org/maplibre-gl-js/docs/examples/add-a-geojson-polygon/
- Natural Earth。Admin 0 — Countries。版本 5.1.1。访问日期:2026年8月16日。https://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-countries/
- 联合国。会员国。访问日期:2026年8月16日。https://www.un.org/en/about-us/member-states
@misc{iso_3166_country_codes,
title = {ISO 3166 -- Country Codes},
author = {{International Organization for Standardization}},
note = {Accessed 16 August 2026},
url = {https://www.iso.org/iso-3166-country-codes.html}
}
@misc{rfc7946,
title = {RFC 7946: The GeoJSON Format},
author = {Butler, Howard and Daly, Martin and Doyle, Allan and Gillies, Sean and Hagen, Stefan and Schaub, Tim},
year = {2016},
publisher = {Internet Engineering Task Force},
url = {https://datatracker.ietf.org/doc/html/rfc7946}
}
@misc{natural_earth_admin0,
title = {Admin 0 -- Countries},
author = {{Natural Earth}},
note = {Version 5.1.1; accessed 16 August 2026},
url = {https://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-countries/}
}
@misc{un_member_states,
title = {Member States},
author = {{United Nations}},
note = {Accessed 16 August 2026},
url = {https://www.un.org/en/about-us/member-states}
}
@misc{maplibre_geojson_polygon,
title = {Add a GeoJSON Polygon},
author = {{MapLibre}},
note = {MapLibre GL JS documentation; accessed 16 August 2026},
url = {https://maplibre.org/maplibre-gl-js/docs/examples/add-a-geojson-polygon/}
}
@misc{kaleidr_studio_2026_08_16,
title = {Create Custom Maps with AI Map Maker},
author = {{Kaleidr}},
note = {Accessed 16 August 2026},
url = {https://kaleidr.com/studio}
}
@misc{kaleidr_docs_2026_08_16,
title = {Build with Kaleidr},
author = {{Kaleidr}},
note = {Developer documentation; accessed 16 August 2026},
url = {https://docs.kaleidr.com/}
}