Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time



Create a highly customizable serverless tile server for CBERS-4 AWS Public Dataset. This project is based on rio-tiler python library.

CBERS-4 data on AWS

Hosted since late 2017, CBERS-4 data on AWS offers an alternative to cbers and Sentinel data (

China–Brazil Earth Resources Satellite 4 (CBERS-4), also known as Ziyuan I-04 or Ziyuan 1E, is a remote sensing satellite intended for operation as part of the China–Brazil Earth Resources Satellite programme between the China Centre for Resources Satellite Data and Application and Brazil's National Institute for Space Research. The fifth CBERS satellite to fly, it was successfully launched on 7 December 2014. It replaces CBERS-3 which was lost in a launch failure in December 2013.



  • AWS Account
  • Docker
  • node + npm

Create the package

# Build Amazon linux AMI docker container + Install Python modules + create package
git clone
cd cbers-tiler/
make all

Deploy to AWS

One of the easiest way to Build and Deploy a Lambda function is to use Serverless toolkit. We took care of the building part with docker so we will just ask Serverless to only upload our package file to AWS S3, to setup AWS Lambda and AWS API Gateway.

#configure serverless (
npm install
sls deploy

sls deploy

🎉 You should be all set there.

Use it: cbers-viewer

cbers-tiler + Mapbox GL + Satellite API

The viewer/ directory contains a UI example to use with your new Lambda cbers tiler endpoint. It combine the power of mapbox-gl and the nice developmentseed sat-api to create a simple and fast cbers-viewer.

To be able to run it, edit those two lines in viewer/js/app.js

// viewer/js/app.js
3  mapboxgl.accessToken = '{YOUR-MAPBOX-TOKEN}';
4  const cbers_tiler_url = "{YOUR-API-GATEWAY-URL}";


  1. One AWS ƛ call to get min/max percent cut value for all the bands and bounds

Path: /cbers/metdata/{cbers scene id}


  • sceneid: CBERS product id


  • pmin: Histogram cut minimum value in percent (default: 2)
  • pmax: Histogram cut maximum value in percent (default: 98)

Output: (dict)

  • bounds: (minX, minY, maxX, maxY) (list)
  • sceneid: scene id (string)
  • rgbMinMax: Min/Max DN values for the linear rescaling (dict)

Example: <api-gateway-url>/cbers/metadata/CBERS_4_MUX_20170915_166_105_L4?pmin=5&pmax=95

  1. Parallel AWS ƛ calls (one per mercator tile) to retrieve corresponding cbers data

Path: /cbers/tiles/{cbers scene id}/{z}/{x}/{y}.{ext}


  • sceneid: CBERS product id
  • x: Mercator tile X index
  • y: Mercator tile Y index
  • z: Mercator tile ZOOM level
  • ext: Image format to return ("jpg" or "png")


  • rgb: Bands index for the RGB combination (default: (4, 3, 2))
  • histo: - delimited rgb histogram min/max (default: 0,16000-0,16000-0,16000 )
  • tile: Output image size (default: 256)


  • base64 encoded image PNG or JPEG (string)


  • <api-gateway-url>/cbers/tiles/CBERS_4_MUX_20170915_166_105_L4/8/71/102.png
  • <api-gateway-url>/cbers/tiles/CBERS_4_MUX_20170915_166_105_L4/8/71/102.png?rgb=5,4,3&histo=100,3000-130,2700-500,4500&tile=1024

Live Demo: