Metadados Geo-Arrays

Documentos JSON

O serviço WTSS é baseado num documento de metadados da seguinte forma:

{
  "arrays": [
    { "name": "mod09q1",
      "description": "Surface Reflectance 8-Day L3 Global 250m",
      "detail": "https://lpdaac.usgs.gov/products/modis_products_table/mod09q1",
      "dimensions": [
        { "name": "col_id",
          "description": "column",
          "min_idx": 0,
          "max_idx": 172799,
          "pos": 0
        },
        { "name": "row_id",
          "description": "row",
          "min_idx": 0,
          "max_idx": 86399,
          "pos": 1
        },
        { "name": "time_id",
          "description": "time",
          "min_idx": 0,
          "max_idx": 1024,
          "pos": 2
        }
      ],
      "attributes": [
        { "name": "red",
          "description": "250m Surface Reflectance Band 1 (620-670 nm)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -100, "max": 16000 },
          "scale_factor": 0.0001,
          "missing_value": -28672
        },
        { "name": "nir",
          "description": "250m Surface Reflectance Band 2 (841-876 nm)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -100, "max": 16000 },
          "scale_factor": 0.0001,
          "missing_value": -28672
        },
        { "name": "quality",
          "description": "250m Reflectance Band Quality",
          "datatype": "16-bit unsigned integer",
          "valid_range": { "min": 0, "max": 32767 },
          "scale_factor": 1,
          "missing_value": 65535
        }
      ],
      "geo_extent": {
        "spatial": {
          "extent": {
            "xmin": -20015109.35400599,
            "ymin": -10007554.676994,
            "xmax": 20015109.35400599,
            "ymax": 10007554.676994
          },
          "resolution": {
            "x": 231.65635826395825,
            "y": 231.65635826374995
          },
          "crs": "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs "
        },
        "temporal": {
          "interval": {
            "start": "2000-02-18",
            "end": "2014-08-13"
          },
          "resolution": 8,
          "unit": "day"
        }
      }
    },
    { "name": "mod13q1",
      "description": "Vegetation Indices 16-Day L3 Global 250m",
      "detail": "https://lpdaac.usgs.gov/products/modis_products_table/mod13q1",
      "dimensions": [
        { "name": "col_id",
          "description": "column",
          "min_idx": 0,
          "max_idx": 172799,
          "pos": 0
        },
        { "name": "row_id",
          "description": "row",
          "min_idx": 0,
          "max_idx": 86399,
          "pos": 1
        },
        { "name": "time_id",
          "description": "time",
          "min_idx": 0,
          "max_idx": 1024,
          "pos": 2
        }
      ],
      "attributes": [
        { "name": "ndvi",
          "description": "250m 16 days NDVI",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -2000, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -3000
        },
        { "name": "evi",
          "description": "250m 16 days EVI",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -2000, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -3000
        },
        { "name": "quality",
          "description": "250m 16 days VI Quality detailed QA",
          "datatype": "16-bit unsigned integer",
          "valid_range": { "min": 0, "max": 65534 },
          "scale_factor": 1,
          "missing_value": 65535
        },
        { "name": "red",
          "description": "250m 16 days red reflectance (Band 1)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -1000
        },
        { "name": "nir",
          "description": "250m 16 days NIR reflectance (Band 2)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -1000
        },
        { "name": "blue",
          "description": "250m 16 days blue reflectance (Band 3)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -1000
        },
        { "name": "mir",
          "description": "250m 16 days MIR reflectance (Band 7)",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 10000 },
          "scale_factor": 0.0001,
          "missing_value": -1000
        },
        { "name": "view_zenith",
          "description": "250m 16 days view zenith angle",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -9000, "max": 9000 },
          "scale_factor": 0.01,
          "missing_value": -10000
        },
        { "name": "sun_zenith",
          "description": "250m 16 days sun zenith angle",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -9000, "max": 9000 },
          "scale_factor": 0.01,
          "missing_value": -10000
        },
        { "name": "azimuth",
          "description": "250m 16 days relative azimuth angle', , , 0.1, -4000",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": -3600, "max": 3600 },
          "scale_factor": 0.1,
          "missing_value": -4000
        },
        { "name": "day",
          "description": "250m 16 days composite day of the year",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 1, "max": 366 },
          "scale_factor": 1,
          "missing_value": -1
        },
        { "name": "reliability",
          "description": "250m 16 days pixel reliability summary QA",
          "datatype": "8-bit signed integer",
          "valid_range": { "min": 0, "max": 3 },
          "scale_factor": 1,
          "missing_value": -1
        }
      ],
      "geo_extent": {
        "spatial": {
          "extent": {
            "xmin": -20015109.35400599,
            "ymin": -10007554.676994,
            "xmax": 20015109.35400599,
            "ymax": 10007554.676994
          },
          "resolution": {
            "x": 231.65635826395825,
            "y": 231.65635826374995
          },
          "crs": "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs "
        },
        "temporal": {
          "interval": {
            "start": "2000-02-18",
            "end": "2014-08-13"
          },
          "resolution": 16,
          "unit": "day"
        }
      }
    },
    { "name": "mcd43a4",
      "description": "Nadir BRDF-Adjusted Reflectance 16-Day L3 Global 500m",
      "detail": "https://lpdaac.usgs.gov/products/modis_products_table/mcd43a4",
      "dimensions": [
        { "name": "col_id",
          "description": "column",
          "min_idx": 0,
          "max_idx": 86399,
          "pos": 0
        },
        { "name": "row_id",
          "description": "row",
          "min_idx": 0,
          "max_idx": 43199,
          "pos": 1
        },
        { "name": "time_id",
          "description": "time",
          "min_idx": 0,
          "max_idx": 1024,
          "pos": 2
        }
      ],
      "attributes": [
        { "name": "b1",
          "description": "Nadir_Reflectance_Band1",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b2",
          "description": "Nadir_Reflectance_Band2",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b3",
          "description": "Nadir_Reflectance_Band3",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b4",
          "description": "Nadir_Reflectance_Band4",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b5",
          "description": "Nadir_Reflectance_Band5",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b6",
          "description": "Nadir_Reflectance_Band6",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        },
        { "name": "b7",
          "description": "Nadir_Reflectance_Band7",
          "datatype": "16-bit signed integer",
          "valid_range": { "min": 0, "max": 32766 },
          "scale_factor": 0.0001,
          "missing_value": 32767
        }
      ],
      "geo_extent": {
        "spatial": {
          "extent": {
            "xmin": -20015109.35400599,
            "ymin": -10007554.676994,
            "xmax": 20015109.35400599,
            "ymax": 10007554.676994
          },
          "resolution": {
            "x": 500,
            "y": 500
          },
          "crs": "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs "
        },
        "temporal": {
          "interval": {
            "start": "2000-02-18",
            "end": "2014-08-13"
          },
          "resolution": 16,
          "unit": "day"
        }
      }
    }
  ]
}

PostgreSQL

Atualmente, o script Python modis2scidb-loader, responsável por orquestrar a carga de dados no SciDB, preenche um conjunto de tabelas num banco de dados PostgreSQL a partir dos dados MODIS.

Os seguintes arrays estão sendo considerados: Além disso, para cada conjunto de dados MODIS temos a seguinte definição de arrays:

CREATE ARRAY mcd43a4
<b1:int16, b2:int16, b3:int16, b4:int16, b5:int16, b6:int16, b7:int16>
col_id=21600:35999,600,0, row_id=16800:35999,600,0, time_id=0:*,1,0];
CREATE ARRAY mod09q1
<red:int16, nir:int16, quality:uint16>
[col_id=43200:71999,600,0,row_id=33600:71999,600,0,time_id=0:*,1,0]
CREATE ARRAY mod13q1
<ndvi:int16, evi:int16, quality:uint16,
 red:int16, nir:int16, blue:int16, mir:int16,
 view_zenith:int16, sun_zenith:int16, azimuth:int16,
 DAY:int16, reliability:int8>
[col_id=43200:71999,600,0, row_id=33600:71999,600,0, time_id=0:*,1,0]

O esquema das tabelas é mostrado abaixo:

Tabela: geo_time_unit
Colunas Tipo Modificador
unit_id INTEGER PRIMARY KEY
name VARCHAR UNIQUE
Tabela: geo_array
Colunas Tipo Modificador
array_id INTEGER SERIAL PRIMARY KEY
name VARCHAR UNIQUE NOT NULL
description VARCHAR
detail VARCHAR
crs VARCHAR NOT NULL
x_dim_name VARCHAR NOT NULL
x_min NUMERIC
x_max NUMERIC
x_resolution NUMERIC
y_dim_name VARCHAR
y_min NUMERIC
y_max NUMERIC
y_resolution NUMERIC
t_dim_name VARCHAR
t_min TIMESTAMP
t_max TIMESTAMP
t_resolution NUMERIC
t_unit_id INTEGER NOT NULL
Tabela: geo_array_attributes
Colunas Tipo Modificador
array_id INTEGER NOT NULL
attribute_id INTEGER SERIAL PRIMARY KEY
name VARCHAR NOT NULL
description VARCHAR NOT NULL
range_min NUMERIC NOT NULL
range_max NUMERIC NOT NULL
scale NUMERIC NOT NULL DEFAULT 1.0
missing_value NUMERIC NOT NULL
Tabela: geo_array_timeline
Colunas Tipo Modificador
array_id INTEGER PRIMARY KEY
time_point INTEGER PRIMARY KEY
date TIMESTAMP NOT NULL
Tabela: geo_array_data_files
Colunas Tipo Modificador
file_id INTEGER SERIAL PRIMARY KEY
array_id INTEGER NOT NULL
time_point INTEGER NOT NULL
data_file VARCHAR NOT NULL
start_load_time TIMESTAMP DEFAULT NULL
end_load_time TIMESTAMP DEFAULT NULL

O script geo_array.sql mostrado abaixo faz a criação do esquema acima:

DROP TABLE IF EXISTS geo_time_unit CASCADE;
DROP TABLE IF EXISTS geo_array CASCADE;
DROP TABLE IF EXISTS geo_array_attributes CASCADE;
DROP TABLE IF EXISTS geo_array_timeline CASCADE;
DROP TABLE IF EXISTS geo_array_data_files CASCADE;
 
CREATE TABLE geo_time_unit (
  unit_id SERIAL PRIMARY KEY,
  name VARCHAR UNIQUE
);
 
CREATE TABLE geo_array (
  array_id SERIAL PRIMARY KEY,
  name VARCHAR UNIQUE NOT NULL,
  description VARCHAR,
  detail VARCHAR,
  crs VARCHAR NOT NULL,
  x_dim_name VARCHAR NOT NULL,
  x_min NUMERIC,
  x_max NUMERIC,
  x_resolution NUMERIC,
  y_dim_name VARCHAR,
  y_min NUMERIC,
  y_max NUMERIC,
  y_resolution NUMERIC,
  t_dim_name VARCHAR,
  t_min TIMESTAMP,
  t_max TIMESTAMP,
  t_resolution NUMERIC,
  t_unit_id INTEGER NOT NULL
);
 
CREATE TABLE geo_array_attributes (
  array_id INTEGER NOT NULL,
  attribute_id SERIAL PRIMARY KEY,
  name VARCHAR NOT NULL,
  description VARCHAR NOT NULL,
  range_min NUMERIC NOT NULL,
  range_max NUMERIC NOT NULL,
  scale NUMERIC NOT NULL DEFAULT 1.0,
  missing_value NUMERIC NOT NULL
);
 
CREATE TABLE geo_array_timeline (
  array_id INTEGER,
  time_point INTEGER NOT NULL,
  DATE TIMESTAMP NOT NULL,
  PRIMARY KEY(array_id, time_point)
);
 
CREATE TABLE geo_array_data_files (
  file_id SERIAL PRIMARY KEY,
  array_id INTEGER NOT NULL,
  time_point INTEGER NOT NULL,
  data_file VARCHAR NOT NULL,
  start_load_time TIMESTAMP DEFAULT NULL,
  end_load_time TIMESTAMP DEFAULT NULL
);
 
ALTER TABLE geo_array ADD CONSTRAINT fk_geo_array_t_unit_id FOREIGN KEY(t_unit_id) REFERENCES geo_time_unit(unit_id);
ALTER TABLE geo_array_attributes ADD CONSTRAINT fk_geo_array_attributes_array_id FOREIGN KEY(array_id) REFERENCES geo_array(array_id);
ALTER TABLE geo_array_timeline ADD CONSTRAINT fk_geo_array_timeline_array_id FOREIGN KEY(array_id) REFERENCES geo_array(array_id);
ALTER TABLE geo_array_data_files ADD CONSTRAINT fk_geo_array_data_files FOREIGN KEY(array_id, time_point) REFERENCES geo_array_timeline(array_id, time_point);
 
INSERT INTO geo_time_unit (name) VALUES('day'), ('month'), ('year');

Para cada conjunto de dados, temos um script SQL para registro das informações geoespaciais:

INSERT INTO geo_array (name, description, detail, crs,
                       x_dim_name, x_min, x_max, x_resolution,
                       y_dim_name, y_min, y_max, y_resolution,
                       t_dim_name, t_min, t_max, t_resolution, t_unit_id)
     VALUES ('mod09q1', 'Surface Reflectance 8-Day L3 Global 250m',
             'https://lpdaac.usgs.gov/products/modis_products_table/mod09q1',
             '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs ',
             'col_id', 43200, 71999, 231.65635826395825,
             'row_id', 33600, 71999, 231.65635826374995,
             'time_id', '2000-02-18', '2014-08-13', 8, 1);
 
 
INSERT INTO geo_array_attributes (array_id, name, description, range_min, range_max, scale, missing_value)
     VALUES (2, 'red', '250m Surface Reflectance Band 1 (620–670 nm)', -100, 16000, 0.0001, -28672), 
            (2, 'nir', '250m Surface Reflectance Band 2 (841–876 nm)', -100, 16000, 0.0001, -28672),
            (2, 'quality', '250m Reflectance Band Quality', 0, 32766, 1.0, 65535);

Considerações

  • Precisamos definir o modelo de metadados para os arrays que representem overviews (níveis da pirâmide). Já está em desenvolvimento um script Python que realiza a criação de overviews para os arrays (Overview Builder).
  • Arrays com metadados? Qual o esquema desses arrays?
  • Criação de biblioteca Python com acesso aos metadados para atender os serviços WTSS, WMS e WCS?