Saltar al contenido principal

Capas

Se cuenta con una API para obtener las imágenes disponibles y otra para obtener la imagen en distintos formatos/configuraciones.

Para identificar una imagen es necesario (field_id, layer_name, date, operation).

  • field_id: id del lote
  • date: fecha de la imagen
  • layer_name: nombre de la capa
  • operation: oepración a realizar sobre la capa.

Por ejemplo: Para el lote 1500, tomar la capa Sentinel2 de la fecha 2020-11-20T00:00:00Z y realizar la operación ndvi1 sobre ella.

APIs

Dates

GET /api/layers/dates/v3?field_id=<FIELD_ID>

Respuesta:

Un objeto con tipos de capas. Cada tipo tiene un array con las operaciones posibles, y otro con las fechas disponibles. Cada operación se puede aplicar sobre cada una de las fechas del array.

{
'code': 0,
'layers': {
"layer_name1": {
"operations": [{...}, {...}],
"dates": [{...}, {...}],
},
"layer_name2": {
"operations": [{...}, {...}],
"dates": [{...}, {...}],
}
}
}

Cada elemento de operations posee:

  • operation: es el código de la operación para identificar la misma ante los servidores
  • name: es un agrupador para mostrar al usuario. Permite agrupar operaciones de distintos tipos de capas que hacen lo mismo. Ej: NDVI de Sentinel y Planet

Cada elemento de dates posee:

  • date: fecha en el formato con el cual se debe enviar al backend
  • min: el minimo valor de la capa
  • max: el máximo valor de la capa
  • cada tipo de capa puede tener propiedades extras. Por Ej
    • Sentinel2:
      • cloudy: bool si tiene nubes

Los elementos de dates se encuentran ordenados por fecha, empezando por el más reciente.

Ejemplo completo de Respuesta:

"layers": {
"ndvip1": {
"operations": [
{
"operation": "ndvip1",
"name": "NDVI"
}
],
"dates": [
{
"date": "2018-06-09T15:36:06Z",
"max": 65535,
"min": 36811.2
},
{
"date": "2018-06-01T15:36:02Z",
"max": 65535,
"min": 25619.5
},
{
"date": "2018-05-24T15:35:23Z",
"max": 65535,
"min": 40151.7
}
]
},
"Sentinel2": {
"operations": [
{
"operation": "ndvi1",
"name": "NDVI"
},
{
"operation": "gndvi1",
"name": "GNDVI"
},
{
"operation": "rgb1",
"name": "Visible"
},
{
"operation": "msavi2",
"name": "MSAVI2"
},
{
"operation": "ndre",
"name": "NDRE"
}
],
"dates": [
{
"date": "2020-06-10T00:00:00Z",
"max": 0.49,
"cloudy": true,
"min": -0.32
},
{
"date": "2020-06-05T00:00:00Z",
"max": 0.8,
"cloudy": false,
"min": -0.2
},
{
"date": "2020-05-31T00:00:00Z",
"max": 0.85,
"cloudy": false,
"min": 0.1
}
]
},
"siembra": {
"operations": [
{
"operation": "siembra",
"name": "siembra"
}
],
"dates": [
{
"date": "2019-12-13T15:15:38Z",
"max": 552257.969844542,
"metadata": {
"info": {
"cropSeason": "2019",
"cropName": "SOYBEANS"
}
},
"min": 358382.068724971
}
]
}

}

Geoserver

GET /api/geoserver/v2

Parámetros en la URL:

  • field_id: ID del lote.
  • layer_name: nombre de la capa.
  • operation: código de la operación.
  • date: formato: YYYY-MM-DDTHH:mm:ssZ
  • format:
    • image/png: PNG como RGBA.
    • image/tiff: GeoTiff.
    • image/encoded: PNG como RGB. Se envían los datos en 16bits donde los primeros 8bits se encuentran en la primer capa del PNG (R) y los segundos 8bits en la segunda (G). La tercer capa (B) posee todos ceros.

      Este parámetro es opcional. Si no se incluye, el default es "image/png"

  • epsg: Número de EPSG para reproyectar la imagen.

    Este parámetro es opcional. Si no se incluye, el default depende del tipo de capa

  • bbox:
    • Coordenadas del Bounding Box de la imagen deseada para reproyectar. Las coordenadas deben estar separadas por coma en el orden: xmin,ymin,xmax,ymax. Además deben estar en el EPSG de la imagen final. (Se recomienda utilizar el parámetro EPSG) .

      Este parámetro es opcional. Si no se incluye, la imagen final corresponde al BoundingBox del lote con un buffer de 2 pixels. Si se incluye, es obligatorio incluir también width y height

  • width: Número pixeles del ancho de la imagen final.

    Este parámetro es opcional. Si se incluye, es obligatorio incluir también bbox y height

  • height: Número pixeles del alto de la imagen final.

    Este parámetro es opcional. Si se incluye, es obligatorio incluir también bbox y width

  • transparent:
    • true: se aplica un máscara sobre la imagen para eliminar los pixeles fuera del lote.
      • en caso de PNG, los pixeles de alpha se setean en 0 (transparente).
      • en caso de TIFF, los pixeles se setean en NODATA.
    • false: no se aplica la máscara.

      Este parámetro es opcional. Si no se incluye, el default es false

Tipos de capas

Sentinel2

Si no se solicita una reproyección, la resolución de estas imágenes es de 10x10 metros en la proyección WGS84/UTM.

Cada imagen posee 2 pixeles de margen alrededor del perímetro del lote.

Las operaciones disponibles sobre esta capa son:

  • ndvi1: NDVI
  • gndvi1: GNDVI
  • rgb1: RGB
  • msavi2: MSAVI2
  • ndre: NDRE

objeto de /dates/v3

Cada objeto del array dates de la API /dates/v3 posee:

  • date: string, la fecha de la imagen
  • min: float, el ndvi medio mínimo dentro del perímetro del lote
  • max: float, el ndvi medio máximo dentro del perímetro del lote
  • cloudy: bool, indica si dentro del perímetro del lote hay al menos un 5% de pixeles de nubes. Esto según la clasificación indicada por Sentinel.

imágenes tiff

Para las operaciones ndvi1, gndvi1, msavi2 y ndre se entrega un GeoTiff de una única banda. Cada pixel es el valor del índice indicado por la operación en float32. El valor NODATA de las mismas es nan.

En el caso de rgb1, se entrega un GeoTiff de 3 bandas donde cada pixel es un Byte (uint8). El valor NODATA de las mismas es 0.

Alta de Capas

Este proceso tiene 2 pasos:

  • En el primero, se sube el archivo para que la API lo analice y entregue la info del mismo. Los datos quedan cacheados.
  • En el segundo, a partir de esta info, el usuario indica columna, unidad y otros datos; y llama a un segundo endpoint que procesa el archivo y crea la capa.

Subir archivos

POST /files
Body (Form):
file: zip con los archivos
  • Formatos posibles: csv, xlsx, txt, shp(con los asociados)

    • Ejemplo CSV:

          lat;lon;variable_1;var_2
      40.35715828;-89.92172667;35010;25
      40.35715828;-89.92172375;35010;15
      40.35715825;-89.92172082;35005;10
    • Ejemplo XLSX / XLS:

      latlonvariable_1var_2
      40,35715828-89,921726673501025
      40,35715828-89,921723753501015
      40,35715825-89,921720823500510
  • Geometrías válidas: {"Point", "Polygon", "MultiPolygon"}

  • Posibles respuestas

    • 400 -
    { "error_code": "ERROR_ARCHIVO" }
    • 200 -

    {"data":
    {"not_found": True,
    "lote": `WKT DEL ARCHIVO`}
    }

    significa que el archivo no coincide ningún lote del usuario.

    • 200 -

    {"data": {
    "redis_id": redis_id,
    "lote_id": lote_id,
    "columns": [lista de columnas],
    "stats": ,
    "histograms": ,
    }}


Procesar archivos

POST /raster
Body (json):
redis_id: HASH de la api anterior
date: fecha de captura de la capa formato "YYYY-MM-DD HH:MM:SS"
data: objeto de configuración
lote_id: id del lote

El objeto de configuración se arma de la siguiente manera:

  • por cada key que se envíe se creará una capa
  • cada key es el nombre de la columna sobre la cual se quiere armar la capa
  • cada value es un objeto que tiene la configuración para la nueva capa:
    • id_layer: id del tipo_capa de la capa a crear
    • mean: (float o null) nueva media
    • min: (float o null) valor minimo para clip (outliers)
    • max: (float o null) valor maximo para clip (outliers)
    • meta:
      • numerador_media: unidad del numerador
      • denominador_media: unidad del denominador

Tipos de capas

GET /layers/types?for=nuevas_capas