/geotiff-server

WIP

Primary LanguageJavaScriptMIT LicenseMIT

geotiff-server

A node.js server that generate tiles from cloud-optimised geotiff's designed for use with a serverless function provider like AWS Lambda.

The general idea

  • A simple slippy-map tile server based on NodeJS and express.js
  • Configurable 'providers' to handle interactions with datastores such as the landsat on AWS
  • An endpoint for rgb tiles allowing different band combinations
  • An endpoint for calculated indices such as NDVI
  • An endpoint for getting metadata

RGB endpoint

Param Description Mandatory
sceneID A unique id for a geotiff in a datastore true
provider A name of a datastore to search false (defaults to landsat-pds on AWS)
rgbBands Which bands to use as the RGB false
pMin The lower percentile value to clip values to (can be retrieved via the metadata endpoint) false
pMax The upper percentile value to clip values to (can be retrieved via the metadata endpoint) false

Example

http://localhost:5000/tiles/1829/1100/11.jpg?
    sceneId=LC80990692014143LGN00


// A more complicated example
http://localhost:5000/tiles/{x}/{y}/{z}.jpeg?
    sceneId=S2A_OPER_MSI_ARD_TL_EPAE_20190828T022125_A021835_T54KWC_N02.08
    &provider=DEA
    &pMin=630
    &pMax=2646 

Calculated endpoint

Param Description Mandatory
sceneID A unique id for a geotiff in a datastore true
provider A name of a datastore to search false (defaults to landsat-pds on AWS)
ratio A band calculation to apply (eg (b3-b5)/(b3+b5)) true
style A style to use for colouring the image (valid options currently are 'NDWI', 'NDVI') false

Example

http://localhost:5000/tiles/calculate/1829/1100/11.jpg?
   sceneId=LC80990692014143LGN00
   &ratio=(b3-b5)/(b3+b5)  <---- although ensure the ratio is urlEncoded
   &style=NDWI

Metadata endpoint

Param Description Mandatory
sceneID A unique id for a geotiff in a datastore true
provider A name of a datastore to search false (defaults to landsat-pds on AWS)
bands A comma seperated lists of bands to retrieve information for false

Example

http://localhost:5000/metadata?
   sceneId=S2A_OPER_MSI_ARD_TL_EPAE_20190828T022125_A021835_T54KWC_N02.08
   &provider=DEA
   &bands=b1,b2

=> [
    {
        "bandName": "b1",
        "stats": {
            "percentiles": [584,1058],
            "min": 327,
            "max": 1517,
            "stdDeviation": 115.71190214142455
        }
    },
    {
        "bandName": "b2",
        "stats": {
            "percentiles": [630, 1320],
            "min": 265,
            "max": 3348,
            "stdDeviation": 163.80461720104134
        }
    }
]

Why?

  • Cloud Optimised GeoTIFFs are awesome and I wanted to learn more about them.

Haven't you heard of rio-tiler/landsat-tiler?

  • Yep it's very awesome, it's what inspired this project
  • The downsides I ran into were
    • it requires Docker (which doesn't work very nicely on Windows)
    • It relies on rasterio, which relies on GDAL, and consequently the build was very large (hence why it's using the docker setup to try and streamline some of the build processes)

Roadmap

  • More colour ramps and investigate sending styles to chromajs from the client side
  • Investigate symbolising by classes for the calculate endpoint (eg -1 to -0.5, -0.5 to 0, 0 to 0.5, 0.5 to 1)
  • Implement error handling
  • Switch to png's instead of jpgs to allow transparency