A high-performance, modular Java ecosystem for cloud-native geospatial data.
This project is made possible through the collaboration and support of the following organizations and individuals.
A supporter is anyone who contributes to the project in any way, through code, ideas, time, or funding, while a sponsor specifically contributes financially. The current sponsors list is maintained in SPONSORS.md.
The complete list of individual supporters, including repository contributors and other supporters, is maintained in SUPPORTERS.md.
Tileverse is a collection of loosely coupled Java libraries designed to solve the challenges of modern, cloud-centric geospatial applications. It provides the foundational blocks—efficient I/O, standardized tiling schemes, and robust format parsers—needed to build tile servers, ETL pipelines, and analytical tools.
Unlike monolithic GIS frameworks, Tileverse modules are designed to be composable. Pick exactly what you need: just the I/O layer for reading COGs from S3, just the math library for tile grid calculations, or the full stack for serving PMTiles.
| Module | Description | Key Capabilities |
|---|---|---|
| Storage | Unified I/O | Abstract byte-range access across S3, Azure, GCS, HTTP, and local files. Includes an in-memory range cache and region-scoped block alignment as decorators. Range readers live under io.tileverse.storage. |
| PMTiles | Archive Format | Read support for the PMTiles v3 specification. Leverages RangeReader for cloud-optimized random access. |
| Versatiles | Archive Format | Read support for VersaTiles 2 containers. Leverages RangeReader for cloud-optimized random access. |
| Vector Tiles | Data Encoding | High-performance encoding and decoding of Mapbox Vector Tiles (MVT) to/from JTS Geometries using Protocol Buffers. |
| Tile Matrix Set | Spatial Logic | Implementation of the OGC Tile Matrix Set standard. Handles coordinate transforms, bounding box logic, and tile pyramid definitions. |
Tileverse is available on Maven Central. We recommend using the Bill of Materials (BOM) to align versions across modules.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.tileverse</groupId>
<artifactId>tileverse-bom</artifactId>
<version>2.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- I/O Layer -->
<dependency>
<groupId>io.tileverse.storage</groupId>
<artifactId>tileverse-storage-all</artifactId>
</dependency>
<!-- Format Support -->
<dependency>
<groupId>io.tileverse.pmtiles</groupId>
<artifactId>tileverse-pmtiles</artifactId>
</dependency>
</dependencies>dependencies {
implementation platform('io.tileverse:tileverse-bom:2.1.0')
implementation 'io.tileverse.storage:tileverse-storage-all'
implementation 'io.tileverse.pmtiles:tileverse-pmtiles'
}This example demonstrates how the modules compose to solve a real-world problem: reading a specific map tile from an S3 bucket without downloading the entire archive.
import io.tileverse.pmtiles.PMTilesReader;
import io.tileverse.storage.RangeReader;
import io.tileverse.storage.Storage;
import io.tileverse.storage.StorageFactory;
import io.tileverse.storage.cache.CachingRangeReader;
import io.tileverse.tiling.pyramid.TileIndex;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.Properties;
// 1. Open the bucket, get a RangeReader for the archive, cache its reads
Properties props = new Properties();
props.setProperty("storage.s3.region", "us-east-1");
try (Storage storage = StorageFactory.open(URI.create("s3://my-bucket/"), props);
RangeReader s3Source = storage.openRangeReader("maps/planet.pmtiles");
RangeReader cachedSource = CachingRangeReader.of(s3Source);
// 2. Initialize the Format Reader; it block-aligns its own header and directory reads
PMTilesReader reader = new PMTilesReader(cachedSource)) {
// 3. Fetch a specific tile (z=0, x=0, y=0)
Optional<ByteBuffer> tile = reader.getTile(TileIndex.zxy(0, 0, 0));
tile.ifPresent(buffer -> {
System.out.println("Found tile: " + buffer.remaining() + " bytes");
// Pass 'buffer' to VectorTileCodec to decode...
});
}The libraries are designed to work together but remain independent. PMTiles orchestrates the others, while Storage, VectorTiles, and TileMatrixSet are standalone utilities.
graph TD
App[Your Application]
subgraph "Core I/O"
ST[Storage]
end
subgraph "Formats & Codecs"
VT[Vector Tiles]
PMT[PMTiles]
end
subgraph "Spatial Logic"
TMS[Tile Matrix Set]
end
App --> ST
App --> VT
App --> PMT
App --> TMS
PMT -.-> ST
PMT -.-> VT
PMT -.-> TMS
Complete documentation is available at tileverse.io.
- Developer Guide: Building, testing, and contributing.
- Storage Guide: Backends, caching, and authentication.
- Javadoc: API reference.
This is a standard Maven project wrapped with a Makefile for convenience.
- Java 21+ is required for building (runtime support starts at Java 17).
- Docker is required for running integration tests.
make help # Show all commands
make # Build and test everything
make test # Run unit & integration tests
make format # Fix code style (Spotless)Released under the Apache License 2.0.
Copyright © 2025 Multiversio LLC.
