Table of Contents
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?