====== 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?