| Crates.io | versatiles_node |
| lib.rs | versatiles_node |
| version | 3.0.1-rc.2 |
| created_at | 2025-12-29 15:54:37.820242+00 |
| updated_at | 2025-12-29 15:59:47.620672+00 |
| description | Node.js bindings for VersaTiles |
| homepage | |
| repository | https://github.com/versatiles-org/versatiles-rs |
| max_upload_size | |
| id | 2010775 |
| size | 426,070 |
Node.js bindings for VersaTiles - convert, serve, and process map tiles in various formats.
npm install @versatiles/versatiles-rs
# or
yarn add @versatiles/versatiles-rs
Pre-built binaries are available for:
const { convertTiles } = require('@versatiles/versatiles-rs');
await convertTiles('input.mbtiles', 'output.versatiles', {
minZoom: 0,
maxZoom: 14,
bbox: [-180, -85, 180, 85],
compress: 'gzip',
});
const { TileServer } = require('@versatiles/versatiles-rs');
const server = new TileServer({ port: 8080 });
await server.addTileSource('osm', 'tiles.mbtiles');
await server.start();
console.log(`Server running at http://localhost:${await server.port}`);
const { ContainerReader } = require('@versatiles/versatiles-rs');
const reader = await ContainerReader.open('tiles.mbtiles');
// Get a single tile
const tile = await reader.getTile(5, 16, 10);
if (tile) {
console.log('Tile size:', tile.length, 'bytes');
}
// Get metadata
const tileJSON = JSON.parse(await reader.tileJSON);
console.log('Format:', tileJSON.tile_format);
const params = await reader.parameters;
console.log('Zoom levels:', params.minZoom, '-', params.maxZoom);
const { probeTiles } = require('@versatiles/versatiles-rs');
const info = await probeTiles('tiles.mbtiles');
console.log('Container:', info.containerName);
console.log('Source:', info.sourceName);
console.log('Format:', info.parameters.tileFormat);
console.log('Compression:', info.parameters.tileCompression);
const { TileCoord } = require('@versatiles/versatiles-rs');
// Geographic to tile coordinates
const coord = TileCoord.fromGeo(13.4, 52.5, 10);
console.log(`Tile: z=${coord.z}, x=${coord.x}, y=${coord.y}`);
// Tile to geographic coordinates
const tile = new TileCoord(10, 550, 335);
const [lon, lat] = tile.toGeo();
console.log(`Location: ${lon}, ${lat}`);
// Get bounding box
const bbox = tile.toGeoBbox();
console.log('BBox:', bbox); // [west, south, east, north]
convertTiles(input, output, options?)Convert tiles from one format to another.
Parameters:
input (string): Input file path (.versatiles, .mbtiles, .pmtiles, .tar, directory)output (string): Output file pathoptions (object, optional):
minZoom (number): Minimum zoom levelmaxZoom (number): Maximum zoom levelbbox (array): Bounding box [west, south, east, north]bboxBorder (number): Border around bbox in tilescompress (string): Compression "gzip", "brotli", or "uncompressed"flipY (boolean): Flip tiles verticallyswapXy (boolean): Swap x and y coordinatesReturns: Promise<void>
probeTiles(path, depth?)Inspect a tile container.
Parameters:
path (string): Container file pathdepth (string, optional): Probe depth - currently not implementedReturns: Promise<ProbeResult>
interface ProbeResult {
sourceName: string;
containerName: string;
tileJson: string;
parameters: ReaderParameters;
}
class ContainerReaderContainerReader.open(path)Open a tile container.
Parameters:
path (string): File path or URLReturns: Promise<ContainerReader>
reader.getTile(z, x, y)Get a single tile.
Parameters:
z (number): Zoom levelx (number): Tile columny (number): Tile rowReturns: Promise<Buffer | null>
reader.tileJSONGet TileJSON metadata (getter).
Returns: Promise<string>
reader.parametersGet reader parameters (getter).
Returns: Promise<ReaderParameters>
interface ReaderParameters {
tileFormat: string;
tileCompression: string;
minZoom: number;
maxZoom: number;
}
reader.sourceNameGet source name (getter).
Returns: Promise<string>
reader.containerNameGet container type (getter).
Returns: Promise<string>
reader.convertTo(output, options?)Convert this container to another format.
Parameters:
output (string): Output file pathoptions (ConvertOptions, optional): Same as convertTilesReturns: Promise<void>
reader.probe(depth?)Probe container details.
Parameters:
depth (string, optional): Probe depthReturns: Promise<ProbeResult>
class TileServernew TileServer(options?)Create a new tile server.
Parameters:
options (object, optional):
ip (string): IP address to bind (default: "0.0.0.0")port (number): Port number (default: 8080)minimalRecompression (boolean): Use minimal recompressionserver.addTileSource(name, path)Add a tile source.
Parameters:
name (string): Source name (URL will be /tiles/{name}/...)path (string): Container file pathReturns: Promise<void>
server.addStaticSource(path, urlPrefix?)Add static file source.
Parameters:
path (string): Directory or .tar fileurlPrefix (string, optional): URL prefix (default: "/")Returns: Promise<void>
server.start()Start the HTTP server.
Returns: Promise<void>
server.stop()Stop the HTTP server.
Returns: Promise<void>
server.portGet server port (getter).
Returns: Promise<number>
class TileCoordnew TileCoord(z, x, y)Create a tile coordinate.
Parameters:
z (number): Zoom levelx (number): Columny (number): RowTileCoord.fromGeo(lon, lat, z)Create from geographic coordinates (static).
Parameters:
lon (number): Longitudelat (number): Latitudez (number): Zoom levelReturns: TileCoord
coord.toGeo()Convert to geographic coordinates.
Returns: [number, number] - [lon, lat]
coord.toGeoBbox()Get geographic bounding box.
Returns: [number, number, number, number] - [west, south, east, north]
coord.toJson()Get JSON representation.
Returns: string
coord.z (number): Zoom levelcoord.x (number): Columncoord.y (number): Row.versatiles) - Native format.mbtiles) - SQLite-based format.pmtiles) - Cloud-optimized format.tar) - Archive formatSee the examples directory for more usage examples:
# Install dependencies
npm install
# Build debug version
npm run build:debug
# Build release version
npm run build
# Run tests
npm test
MIT License - see LICENSE for details.
Contributions are welcome! Please see the main versatiles-rs repository for contribution guidelines.