undefined が返ります。getIconTableHeader() は各アイコンの矩形座標を含む情報を返します。import * as GIA from '@ntj/gaia';
const canvas = map.getIconTableImage();
if (canvas) {
document.body.appendChild(canvas);
}
const header = map.getIconTableHeader();
if (header) {
console.log('アイコン一覧:', header);
}
import * as GIA from '@ntj/gaia';
const MINI_CANVAS_WIDTH = 200;
function searchIconName(x: number, y: number, iconHeader: GIA.types.AnnotationIconHeader): string | undefined {
for (const [name, position] of Object.entries(iconHeader.mapping)) {
const p = position as {x: number; y: number};
if (p.x === x && p.y === y) {
return name;
}
}
return undefined;
}
function copyToMiniCanvas(iconTable: HTMLCanvasElement, iconHeader: GIA.types.AnnotationIconHeader): HTMLCanvasElement {
const canvas = document.createElement('canvas');
const {iconWidth, iconHeight, chainX, chainY} = iconHeader;
const sourceWidth = iconWidth * chainX * 2;
const sourceHeight = iconHeight * chainY * 2;
const destinationWidth = MINI_CANVAS_WIDTH;
const destinationHeight = (sourceHeight * destinationWidth) / sourceWidth;
canvas.width = destinationWidth;
canvas.height = destinationHeight;
const context = canvas.getContext('2d');
if (context) {
context.drawImage(iconTable, 0, 0, destinationWidth, destinationHeight);
}
return canvas;
}
const iconTable = map.getIconTableImage();
const iconHeader = map.getIconTableHeader();
if (!iconTable || !iconHeader) {
throw new Error('アイコンテーブルが未ロードです');
}
const miniCanvas = copyToMiniCanvas(iconTable, iconHeader);
let hoveredName: string | undefined;
miniCanvas.addEventListener('mousemove', (event) => {
const {offsetX, offsetY} = event;
const x = Math.floor((iconHeader.chainX * offsetX) / MINI_CANVAS_WIDTH);
const y = Math.floor((iconHeader.chainY * offsetY) / miniCanvas.height);
hoveredName = searchIconName(x, y, iconHeader);
miniCanvas.title = hoveredName ? `${hoveredName},(x,y)=(${x},${y})` : '';
});
miniCanvas.addEventListener('click', async () => {
if (!hoveredName) {
return;
}
await navigator.clipboard.writeText(hoveredName);
console.log('copied:', hoveredName);
});
document.body.appendChild(miniCanvas);
アイコンテーブルの画像(Canvas)とヘッダー情報を取得する — 詳細な使用例
GLMarker 等で使用するアイコンが格納されたアイコンテーブル(テクスチャアトラス)を Canvas 要素として取得します。デバッグ・プレビュー・スクリーンショット出力に使います。
getIconTableHeader()のmappingを使うと、アイコン名と(x, y)の対応を逆引きできます。getIconTableImage()HTMLCanvasElementで取得getIconTableHeader()IconTableHeader)を取得