/lambda-tiler

AWS Lambda + rio-tiler to serve tiles from any web hosted files

Primary LanguagePythonBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

lambda-tiler

CircleCI codecov

AWS Lambda + rio-tiler to serve tiles from any web hosted files

image_preview

lambda-tiler is a simple serverless (AWS Lambda function) application that serves Map Tiles dynamically created from COGs hosted remotely (s3, http, ...)

Deploy

Requirement

  • AWS Account
  • Docker (+ docker-compose)
  • node + npm (serverless)

Create the package

# Build Amazon linux AMI docker container + Install Python modules + create package
$ git clone https://github.com/vincentsarago/lambda-tiler.git
$ cd lambda-tiler/

$ docker-compose build
$ docker-compose run --rm package

# Tests
$ docker-compose run --rm tests

Note: Docker image from https://github.com/RemotePixel/amazonlinux-gdal

Deploy to AWS

#configure serverless (https://serverless.com/framework/docs/providers/aws/guide/credentials/)
npm install
sls deploy

API

Viewer

/viewer - GET

A web viewer that allows you to pan & zoom the COG.

Inputs:

  • url (required, str): mosaic id
  • kwargs (optional): Other querystring parameters will be forwarded to the tile url.

Outputs:

  • html (text/html)

$ curl {your-endpoint}/viewer?url=https://any-file.on/the-internet.tif

TileJSON (2.1.0)

/tilejson.json - GET

Inputs:

  • url (required): mosaic definition url
  • tile_format (optional, str): output tile format (default: "png")
  • kwargs (in querytring): Other querystring parameters will be forwarded to the tile url

Outputs:

  • tileJSON (application/json)

$ curl https://{endpoint-url}/tilejson.json?url=https://any-file.on/the-internet.tif

{
    "bounds": [...],      
    "center": [lon, lat], 
    "minzoom": 18,        
    "maxzoom": 22,        
    "name": "the-internet.tif",
    "tilejson": "2.1.0",  
    "tiles": [...] ,      
}

Bounds

Inputs:

  • url (required): mosaic definition url

Outputs:

  • metadata (application/json)

$ curl https://{endpoint-url}/bounds?url=https://any-file.on/the-internet.tif

{
  "url": "https://any-file.on/the-internet.tif", 
  "bounds": [...]
}

Metadata

/metadata - GET

Inputs:

  • url (required, str): dataset url
  • pmin (optional, str): min percentile (default: 2).
  • pmax (optional, str): max percentile (default: 98).
  • nodata (optional, str): Custom nodata value if not preset in dataset.
  • indexes (optional, str): dataset band indexes
  • overview_level (optional, str): Select the overview level to fetch for statistic calculation
  • max_size (optional, str): Maximum size of dataset to retrieve for overview level automatic calculation
  • histogram_bins (optional, str, default:20): number of equal-width histogram bins
  • histogram_range (optional, str): histogram min/max

Outputs:

  • metadata (application/json)

$ curl https://{endpoint-url}/metadata?url=s3://url=https://any-file.on/the-internet.tif

{
    "address": "s3://myfile.tif",
    "bbox": [...],
    "band_descriptions": [(1, "red"), (2, "green"), (3, "blue"), (4, "nir")],
    "statistics": {
        "1": {
            "pc": [38, 147],
            "min": 20,
            "max": 180,
            "std": 28.123562304138662,
            "histogram": [
                [...],
                [...]
            ]
        },
        ...
    }
}

Tiles

/tiles/{z}/{x}/{y} - GET

/tiles/{z}/{x}/{y}.{ext} - GET

/tiles/{z}/{x}/{y}@{scale}x - GET

/tiles/{z}/{x}/{y}@{scale}x.{ext} - GET

Inputs:

  • z: Mercator tile zoom value
  • x: Mercator tile x value
  • y: Mercator tile y value
  • ext: image format (e.g jpg)
  • scale (optional, int): tile scale (default: 1)
  • url (required, str): dataset url
  • indexes (optional, str): dataset band indexes (default: dataset indexes)
  • expr (optional, str): dataset expression
  • nodata (optional, str): Custom nodata value if not preset in dataset (default: None)
  • rescale (optional, str): min/max for data rescaling (default: None)
  • color_formula (optional, str): rio-color formula (default: None)
  • color_map (optional, str): rio-tiler colormap (default: None)

Outputs:

  • image body (image/jpeg)

$ curl {your-endpoint}/tiles/7/10/10.png?url=https://any-file.on/the-internet.tif

Note:

  • expr and indexes cannot be passed used together
  • if no ext passed, lambda-tiler will choose the best format (jpg or png) depending on mask (use png for tile with nodata)

Example

A web viewer that allows you to pan & zoom on a sample tiff.

Inputs: None

Outputs:

  • html (text/html)

$ curl {your-endpoint}/example