/sentinel2-search-api

Simple API to query Sentinel-2 data by MRGS on AWS

Primary LanguageRubyMIT LicenseMIT

Sentinel-2 MGRS Tile Search API

Simple Ruby on Rails based API to query Sentinel-2 data by MGRS on AWS. Data imported daily from AWS with the sentinel2_aws gem.

Live version is deployed at https://sentinel2.satgateway.com

Tile Preview Viewer implementing this API: sentinel2-search-viewer

Setup

Prerequisites: Ruby, Bundler, Ruby on Rails, PostgreSQL, PostGIS, and Redis

Clone project, copy database and secrets example configs and set them up.

cp config/database.example.yml config/database.yml
cp config/secrets.example.yml config/secrets.yml

Install gems, setup database, run migrations, and seed database

bundle install
createdb sentinel2-search-api_development
psql sentinel2-search-api_development
CREATE SCHEMA postgis;
CREATE EXTENSION postgis WITH SCHEMA postgis;
\q
rails db:migrate
rails import_mgrs_grids

Running Project

Start server

bundle exec rails server

Start sidekiq (requires redis server to be running)

bundle exec sidekiq

Import product and tile data by date

SentinelWorker.perform_async("2017-12-14")

Import product and tile data by date range

(Date.new(2017, 12, 1)..Date.new(2017, 12, 31)).each do |date|
  date_str = date.strftime("%Y-%m-%d")
  SentinelWorker.perform_async(date_str)
end

Scheduled Daily Imports

Add scheduled calls to SentinelWorker in config/schedule.rb.

Tile API Examples

  • mgrs parameter format is utm_zone + latitude_band + grid_square
  • start_date and end_date parameter formats are YYYY-MM-DD

Get all tiles for 36RUU

http://localhost:3000/api/v1/tiles?mgrs=36RUU

Get all tiles for 36RUU with date >= 2017-01-01

http://localhost:3000/api/v1/tiles?mgrs=36RUU&start_date=2017-01-01

Get all tiles for 36RUU with date <= 2017-10-15

http://localhost:3000/api/v1/tiles?mgrs=36RUU&end_date=2017-10-15

Get all tiles for 36RUU between 2017-01-01 and 2017-10-15

http://localhost:3000/api/v1/tiles?mgrs=36RUU&start_date=2017-01-01&end_date=2017-10-15

Get all tiles for 36RUU with <= 50% cloud coverage

http://localhost:3000/api/v1/tiles?mgrs=36RUU&cloud_max=50

Get all tiles for 36RUU with >= 10% data coverage

http://localhost:3000/api/v1/tiles?mgrs=36RUU&data_min=10

Tile API Response Format

[
  {
    "mgrs_grid_name": "36RUU",
    "utm_zone": 36,
    "latitude_band": "R",
    "grid_square": "UU",
    "path": "tiles/36/R/UU/2018/1/7/0",
    "date": "2018-01-07",
    "timestamp": "2018-01-07T08:49:36.450Z",
    "epsg": "32636",
    "product_name": "S2B_MSIL1C_20180107T084329_N0206_R064_T36RUU_20180107T110727",
    "product_path": "products/2018/1/7/S2B_MSIL1C_20180107T084329_N0206_R064_T36RUU_20180107T110727",
    "data_coverage_percentage": "17.6",
    "cloudy_pixel_percentage": "0.0",
    "thumbnail": "https://sentinel-s2-l1c.s3.amazonaws.com/tiles/36/R/UU/2018/1/7/0/preview.jpg"
  },
]

MGRS API Example

Find MGRS tile identifier for a given latitude and longitude

http://localhost:3000/api/v1/mgrs_grids/closest?latitude=29.979235&longitude=31.134202

MGRS API Response Format

{
  "name": "36RUU",
  "utm_zone": "36",
  "latitude_band": "R",
  "grid_square": "UU",
  "latitude": 31.4893138415,
  "longitude": 30.2278496385,
  "epsg": "32636"
}