====== 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 **[[https://github.com/e-sensing/modis2scidb-loader|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
col_id=21600:35999,600,0, row_id=16800:35999,600,0, time_id=0:*,1,0];
CREATE ARRAY mod09q1
[col_id=43200:71999,600,0,row_id=33600:71999,600,0,time_id=0:*,1,0]
CREATE ARRAY mod13q1
[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 ([[https://github.com/e-sensing/overview-builder|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?