はじめに
chiitilerをライブラリとして使えるようにしたという話。npm install chiitiler
で使えるよ。
背景
https://spatialty-io.github.io/chiitiler-demo/?stylename=gsi-std#10.35/42.9456/141.4065/-30.4/60
こちらで公開しているタイルサーバーを運用している訳だが、直近まではchiitilerをマイクロサービスとして動かし、前段にBFFのような層を配置するような作りだった。これは、chiitilerは直接外部に晒せるようなサーバーではないためである(指定したURLのデータをダウンロードさせられてしまうので、悪意あるリクエストに完全に脆弱)。ただ、どちらもLambdaで動かしている都合上、無駄にリクエスト数・実行時間が発生することになる。
BFF層でもHonoでサーバーを書いているので、この二重構造は明らかに無駄である。なので、chiitilerの本質部分ーMapLibre Styleのレンダリングを行う関数をexposeすることにした。
使い方
import {
getRenderedBboxBuffer,
getRenderedTileBuffer,
ChiitilerCache
} from 'chiitiler';
const s3Cache = ChiitilerCache.s3Cache({
bucket: 'chiitiler',
region: 'ap-northeast-1',
endpoint: null,
});
// credentials are loaded from environment variables: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
const tileBuf = await getRenderedTileBuffer({
stylejson: 'https://example.com/style.json', // or StyleSpecification object
z: 0,
x: 0,
y: 0,
tileSize: 512,
ext: 'webp', // png, webp, jpg
cache: s3Cache,
quality: 80,
margin: 0,
});
const bboxBuf = await getRenderedBboxBuffer({
stylejson: 'file://path/to/style.json', // or StyleSpecification object
bbox: [123.4, 34.5, 124.5, 35.6],
size: 1024,
cache: s3Cache,
ext: 'webp',
quality: 80,
});
// return value is Buffer - binary of each image
キャッシュはs3Cacheのほか、fileCache、memoryCache、noneCacheとある。ドキュメントはイマイチ整備されていない。
ただし、MapLibre Nativeはランタイムの依存モジュールが結構重たいので、注意が必要である。