s2-tilejson
## About
TileJSON is a mostly [backwards-compatible](https://github.com/mapbox/tilejson-spec) open standard for representing map tile metadata.
## Install
```bash
# NPM
npm install s2-tilejson
# PNPM
pnpm add s2-tilejson
# Yarn
yarn add s2-tilejson
# Bun
bun add s2-tilejson
```
## Usage
```ts
import { MetadataBuilder } from 's2-tilejson'
import type { Metadata, Shape, LayerMetaData, BBox } from 's2-tilejson'
const metaBuilder = new MetadataBuilder()
// on initial use be sure to update basic metadata:
metaBuilder.setName('OSM')
metaBuilder.setDescription('A free editable map of the whole world.')
metaBuilder.setVersion('1.0.0')
metaBuilder.setScheme('fzxy') // 'fzxy' | 'tfzxy' | 'xyz' | 'txyz' | 'tms'
metaBuilder.setType('vector') // 'vector' | 'json' | 'raster' | 'raster-dem' | 'sensor' | 'markers'
metaBuilder.setEncoding('none') // 'gz' | 'br' | 'none'
metaBuilder.addAttribution('OpenStreetMap', 'https://www.openstreetmap.org/copyright/')
// Vector Specific: add layers based on how you want to parse data from a source:
metaBuilder.addLayer('water_lines', {
minzoom: 0,
maxzoom: 13,
drawTypes: [2],
shape: {
class: 'string',
offset: 'f64',
info: {
name: 'string',
value: 'i64'
}
} as Shape,
m_shape: null
} as LayerMetaData)
// as you build tiles, add the tiles metadata:
const lonLatBoundsForTile: BBox = [-180, -90, 180, 90]
// WM:
metaBuilder.addTileWM(zoom, x, y, lonLatBoundsForTile)
// S2:
metaBuilder.addTileS2(face, zoom, x, y, lonLatBoundsForTile)
// finally to get the resulting metadata:
const metadata: Metadata = metaBuilder.commit()
```
### Creating and Validating your Shapes
Shapes define the type of data that can be stored in the vector tile. They are explained in the [specification](https://github.com/Open-S2/open-vector-tile/tree/master/vector-tile-spec/1.0.0#44-shapes).
If you'd like to validate the shape, feel free to use the [Ajv](https://github.com/epoberezkin/ajv) library.
```ts
import Ajv from 'ajv';
import { ShapeSchema } from 's2-tilejson'; // Path to the schema
import type { Shape } from 's2-tilejson';
const ajv = new Ajv();
const validate = ajv.compile(ShapeSchema);
const shape: Shape = {
a: 'i64',
b: ['string'],
c: {
d: 'f64',
e: 'bool',
f: 'null',
g: 'f32',
h: {
i: 'u64',
},
},
};
validate(shape); // true
```
---
## Development
### Requirements
For Typescript, install via bun:
```bash
bun i
```
If you need to install bun, please refer to the [bun installation guide](https://bun.sh/guide/installation).
You need the tool `tarpaulin` to generate the coverage report. Install it using the following command:
```bash
cargo install cargo-tarpaulin
```
The `bacon coverage` tool is used to generate the coverage report. To utilize the [pycobertura](https://pypi.org/project/pycobertura/) package for a prettier coverage report, install it using the following command:
```bash
pip install pycobertura
```
### Running Tests
To run the tests, use the following command:
```bash
# TYPESCRIPT
## basic test
bun run test
## live testing
bun run test:dev
# RUST
## basic test
cargo test
# live testing
bacon test
```
### Generating Coverage Report
To generate the coverage report, use the following command:
```bash
cargo tarpaulin
# bacon
bacon coverage # or type `l` inside the tool
```