@maplat/core

中文文档
1.2.0发布于 2026/11/02Apache-2.0TypeScriptES Module构建来源已验证

Maplat is the cool Historical Map/Illustrated Map Viewer API. It can transform each map coordinates with nonlinear but homeomorphic projection and makes possible that the maps can collaborate with GPS/accurate maps, without distorting original maps.

原始使用文档
文档目录18 节
  1. About MaplatCore
  2. Key Features
  3. Quick Start
  4. Install
  5. Minimal usage
  6. CDN (jsDelivr)
  7. POI specification ( setting.pois )
  8. Attribution and licensing ( attr / dataAttr )
  9. Excluding a map from the tile cache ( noCache )
  10. Lifecycle
  11. API reference
  12. Development
  13. Prerequisites
  14. Peer Dependencies
  15. Ecosystem
  16. Sister repositories
  17. Links
  18. License

MaplatCore

CI License

About MaplatCore

MaplatCore is the core library of the Maplat Historical Map / Illustrated Map Viewer. It transforms each map's coordinates with a nonlinear but homeomorphic projection, so maps can collaborate with GPS and accurate maps without distorting the original map image. The end-user viewer built on top of it is Maplat; the data authoring tool is MaplatEditor.

MaplatCore is open-source under the Apache License 2.0 (from version 0.13.2).

Read this document in Japanese / 日本語で読む

Key Features

  • Historical map / illustrated map viewer API with nonlinear but homeomorphic coordinate transformation
  • GPS / accurate map collaboration without distorting the original map image
  • Pluggable base maps (OpenLayers-based; optional Mapbox GL JS / MapLibre GL JS for vector tiles)
  • Event-driven POI / line / layer management
  • Open-source (Apache 2.0 from version 0.13.2) — part of the Maplat ecosystem

Quick Start

Current release: 1.2.0. This block is the only place in this repository that carries a release version (ADR-0012); everything outside it is written against the 1.0 release. npm: @maplat/core npm

Install

# pnpm (recommended)
pnpm add @maplat/core

# npm
npm install @maplat/core

Minimal usage

import { MaplatApp } from '@maplat/core';
import 'ol/ol.css'; // REQUIRED: OpenLayers CSS

const option = {
  startFrom: 'gsi',
};

MaplatApp.createObject(option).then((app) => {
  console.log('Maplat initialized', app);
});

CDN (jsDelivr)

For usage directly in the browser without a bundler, you must load OpenLayers before loading MaplatCore.

<!-- OpenLayers -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@10/ol.css">
<script src="https://cdn.jsdelivr.net/npm/ol@10/dist/ol.js"></script>

<!-- MaplatCore -->
<script src="https://cdn.jsdelivr.net/npm/@maplat/[email protected]/dist/maplat_core.umd.js"></script>

<div id="map_div"></div>
<script>
  var option = {
    startFrom: 'gsi',
    div: 'map_div',
  };
  MaplatApp.createObject(option).then(function (app) {
    console.log('Maplat initialized', app);
  });
</script>

Note: Make sure to use the latest compatible versions.

POI specification (setting.pois)

The pois field of a map/app setting accepts several historical forms. All existing forms continue to work unchanged (backward compatible). A new layer ref (wrapper) form is added to let the app override per-layer presentation (hide / title / icon / selectedIcon) without editing the layer's FeatureCollection.

FormShapeBehaviour
URL string"pois/x.geojson"fetched and normalised (legacy)
Inline FC{ type: "FeatureCollection", ... }normalised in place (legacy)
FC array[FC, FC, ...]each FC becomes a layer keyed by id (legacy)
POI object array[{lng, lat, name}, ...]single main layer (legacy)
Old layer dict{ "<key>": <cluster>, ... }each value normalised (legacy)
Layer ref (wrapper) — array element{ layer: <URL|FC>, hide?, title?, icon?, selectedIcon? }layer is resolved/fetched, the FC is normalised, then the overrides are merged onto the resulting cluster
Layer ref — whole pois{ layer: <URL|FC>, hide?, title?, icon?, selectedIcon? } with at least one override keysame merge, keyed by the FC id. Without an override key the object is treated as the old layer dict form (key "layer") for backward compatibility

Override semantics:

  • Only the four override keys are honoured. Unknown keys are dropped with a console.warn (no throw, forward-compatible).
  • hide: true (boolean true only) sets cluster.hide = true. hide:false / non-boolean values are ignored (the data-side value is kept).
  • title (non-empty string, or a non-empty localized object) maps to cluster.name.
  • icon / selectedIcon (non-empty string only) map to cluster.icon / cluster.selectedIcon.
  • Override wins over FeatureCollection.properties of the same name.
  • Internal cluster keys (pois / id / namespaceID / __nextId) cannot be overwritten from a wrapper (they are not override keys).
  • The input object is not mutated.

See src/normalize_pois.ts (isPoiLayerRef, PoiLayerRef) for the programmatic surface.

Attribution and licensing (attr / dataAttr)

Map metadata carries attribution and licensing as two independent pairs: one for the map image itself, and one for the data (control points, POIs, and other derived data). Keeping them apart matters because a scanned map sheet and the georeferencing data built on top of it usually come from different rights holders.

FieldTypeMeaning
attrstring or { <lang>: string }Map image attribution — who the map image is credited to
dataAttrstring or { <lang>: string }Data attribution — who the data is credited to
licensestringMap image license
dataLicensestringData license
licenseNotestring or { <lang>: string }Free-form supplement to license
dataLicenseNotestring or { <lang>: string }Free-form supplement to dataLicense

attr / dataAttr accept a localized object so that a credit line can differ per viewer language; license / dataLicense are plain strings. They are not enumerations — the library stores and renders whatever string it is given. In practice two conventional values are used:

  • "ODbL" — ODbL (Open Database License)
  • "Custom" — Custom license, with the actual terms written into licenseNote / dataLicenseNote

The bundled base maps in src/source_ex.ts show both conventions: OpenStreetMap is declared as attr: "©︎ OpenStreetMap contributors" with license: "Custom" and dataLicense: "ODbL", while the GSI base map uses "Custom" for both and spells the terms out in licenseNote.

Choosing these values in a UI is the authoring tool's concern (MaplatEditor); MaplatCore only defines what the fields mean and renders the resulting credit.

Excluding a map from the tile cache (noCache)

When MaplatApp is started with enableCache: true (a MaplatApp option), every tile map is registered with the Service Worker tile cache (Weiwudi). A map whose setting has noCache: true is not registered, so its tiles are always fetched from the network and getMapCacheEnable(mapID) returns false for it. Without the key, or with noCache: false, the map is cached as before.

  • Write it as a JSON boolean. Only true excludes the map; a string such as "true" is not treated as true.
  • It can be written in two places: the map master (maps/<mapID>.json) and the element of sources in the app setting. When both have it, the app element wins (e.g. noCache: false in the app element cancels noCache: true in the map master).
  • A source written as a string (a bundled base map such as "osm" or "gsi") cannot carry noCache. Write it in object form instead: { "mapID": "osm", "noCache": true }.
  • Tiles that were already cached are not deleted by setting noCache. Once a map is excluded it is no longer registered, so clearMapTileCacheAsync(mapID) has nothing to act on for it; clear the cache with clearMapTileCacheAsync(mapID) before turning noCache on.

Lifecycle

  • See docs/ui-core-lifecycle.md for lifecycle phases and uiHooks (this document lives in the Maplat viewer repository; the lifecycle is shared with @maplat/ui).

API reference

Development

Setup

Clone the repository and install dependencies.

git clone https://github.com/code4history/MaplatCore.git
cd MaplatCore
pnpm install

Development Server

Start the development server with hot reload.

pnpm dev

Build

pnpm build        # Build npm package (dist/)
pnpm build:demo   # Build demo application (dist-demo/)

Test

pnpm test         # Run unit tests (Vitest)
pnpm typecheck    # Run type checks (TypeScript)
pnpm lint         # Run linter and formatter (ESLint/Prettier)
pnpm run test:e2e # Run E2E tests (Playwright)

Prerequisites

Node.js follows the GitHub Actions test.yml matrix; pnpm follows the engines field in package.json (ADR-0012: release-dependent).

  • Node.js: v22 or v24 (tested via GitHub Actions)
  • pnpm: >=9.0.0 (required; package.json enforces pnpm)

Peer Dependencies

MaplatCore depends on the following libraries as peer dependencies. You must install them manually.

  • OpenLayers (ol) — ^9.0.0 || ^10.0.0 (required; peer dependency of MaplatCore and Maplat @maplat/ui)
pnpm add ol

If you use Vector Tiles, you may also need Mapbox GL JS or MapLibre GL JS:

  • mapbox-gl: ^2.0.0 || ^3.0.0 (optional)
  • maplibre-gl: ^5.0.0 || ^6.0.0 (optional)

Ecosystem

MaplatCore is part of the Maplat ecosystem by Code for History. See the full ecosystem map (8 repositories + product/corporate sites):

📖 Ecosystem Map — (the diagram is currently kept in a private planning repository; the Sister repositories table below is the public substitute)

Sister repositories

RepositoryLicensenpmRole
MaplatApache 2.0@maplat/uiMain viewer
MaplatCoreApache 2.0@maplat/coreCore library
MaplatTinApache 2.0@maplat/tinTIN conversion
MaplatTransformApache 2.0@maplat/transformCoordinate transform
MaplatEditorApache 2.0—Data authoring tool (desktop)
ChuciMIT@c4h/chuciMultimedia swiper & viewer Web Components
QuyuanMIT@c4h/quyuanGeoJSON template engine + multimedia viewer Web Components
WeiwudiMIT@c4h/weiwudiService Worker for tile cache

MaplatEditor is the data authoring tool used to create the maps and POIs that the viewers above render. The Maplat ecosystem is end-to-end: author with MaplatEditor, serve with any of the viewer libraries.

AudienceLinkPurpose
Project info / features / caseshttps://www.maplat.jp/en/Product site
Sponsor / business inquiryhttps://www.nayuta-inc.co.jp/en/Corporate site (Nayuta, Inc.)

ADR-0013: Apache-licensed repositories (this one) link to both sites. MIT-licensed sister repos (Weiwudi / Quyuan / Chuci) carry no Nayuta link.

License

Apache License 2.0 — see LICENSE.

Copyright 2019-2026 Kohei Otsuka, Code for History / Nayuta, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Patent notice: The Maplat coordinate-transform technology is patented in Japan (Patent No. 6684776).

Past versions: Versions before 0.13.2 were distributed under the Maplat Limited License 1.1. The license restoration to Apache 2.0 takes effect from version 1.0.0-rc1 onward. Earlier versions available on npmjs.com remain under their original limited-license terms.

版本与发布记录

@maplat/core 共发布 53 个版本,首次发布于 2019/09/15;过去 12 个月发布了 19 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.2.0latest2026/11/021 天前
1.2.0-rc.1next2026/10/268 天前
1.1.02026/10/0529 天前
1.1.0-rc.12026/09/281 个月前
1.0.02026/08/252 个月前
1.0.0-rc1rc2026/08/072 个月前

关于 @maplat/core 的常见问题

@maplat/core 是什么?

Maplat是一个很酷的历史地图/图解地图查看器API。 它可以用非线性但同纯投影变换每个地图坐标,使地图可以与GPS/精确地图协作,而不会扭曲原始地图。

如何安装 @maplat/core?

在项目目录运行 npm install @maplat/core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:ol(^9.0.0 || ^10.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@maplat/core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@maplat/core 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@maplat/core 可以商用吗?

@maplat/core 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@maplat/core 还在维护吗?

最新版本 1.2.0 发布于 2026/11/02(1 天前);至今共发布 53 个版本,其中过去 12 个月发布了 19 个;首次发布于 2019/09/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。