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 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.

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 del proveedor de la imagen de la capa.
  • operation: código de la operación.
  • date: fecha con 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

Plantillas de escalas personalizadas

GET /api/layers/scale_template

Retorna las plantillas de las escalas personalizadas del usuario.

Ejemplo completo de Respuesta:

{
"scale_templates": [
{
"palette": "cb-RdYlGn",
"range_min": 0.17,
"type_distribution": "quantiles",
"template_name": "personalizada 1",
"cant_intervals": 5,
"scale_template_id": 1102,
"hierarchy": [
"Imágenes"
],
"colors_scale": {
"colors": [
[
215,
25,
28
],
[
253,
174,
97
],
[
255,
255,
191
],
[
166,
217,
106
],
[
26,
150,
65
]
],
"scale": [
0.41747474747474717,
0.4669696969696966,
0.502323232323232,
0.5588888888888889
]
},
"layer_name": "Sentinel2",
"range_max": 0.87,
"operation": "ndvi1"
},
{
"palette": "cb-Spectral",
"range_min": -652.07,
"type_distribution": "equidistant",
"template_name": "ls_personalizada_1",
"cant_intervals": 3,
"scale_template_id": 1139,
"hierarchy": [
"Actividades",
"Prescripciones"
],
"colors_scale": {
"colors": [
[
153,
213,
148
],
[
255,
255,
191
],
[
252,
141,
89
]
],
"scale": [
-434.3799999999992,
-210.09333333333186
]
},
"layer_name": "Urea",
"range_max": 1,
"operation": "Urea"
},
],
"code": "RETRIEVED_SCALE_TEMPLETES"
}

Imágenes disponibles

Se puede consultar las imágenes disponibles desde la API Dates

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 este proveedor de imágenes son:

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

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

Generar capa raster a partir de interpolación de puntos por "kriging"

En muchas ocasiones contamos con datos obtenidos en diferentes puntos del lote. En ese caso, resulta más fácil visualizar la información en formato de capa raster en vez de puntos aislados.

Afortunadamente se pueden interpolar los puntos a través de kriging para generar una capa raster a partir de estos puntos.

Para lograrlo, se debe enviar en la configuración de la capa deseada, que se encuentra dentro del objeto de configuración, el parámetro "interpolation_type" con el valor "kriging".

Ejemplo del json enviado en el body del endpoint /raster:

{
redis_id: "ABCD1234",
lote_id: "123456",
date: "2022-12-13 00:00:00",
data: {
capa1: {
id_layer: 419,
interpolation_type: "kriging",
mean: 12.34,
min: 6,
max: 34.56,
meta: {
numerador_media: "kg",
denominador_media: "ha",
}
}
}
}

Tipos de capas

idnombre
1ndvi1
2ndvip1
3gndvi1
4gndvip1
5rinde
6rgb1
7rgbp1
8altimetria
9siembra
10herbicida
11fungicida
12insecticida
13fertilizante
14enmienda
15profundidad_suelo
17Densidad_20
22margen_bruto
24ndvi0.8
25vigor planta
26tcari/osavi
27NDRE
29RGB0.8
31Sentinel2
32Planet
34aplicación
35humedad
36Electroconductividad_70
37Electroconductividad_150
39siembra_vel_avance
40siembra_var
41siembra_fecha
42rinde_hum
43rinde_vel_avance
44rinde_fecha
45MO_20
46MO_30
47MO_40
48MO_50
49MO_60
50MO_70
51MO_80
52MO_90
53MO_100
54MO_110
55MO_120
56MO_130
57MO_140
58MO_150
59N_20
60N_30
61N_40
62N_50
63N_60
64N_70
65N_80
66N_90
67N_100
68N_110
69N_120
70N_130
71N_140
72N_150
73P_20
74P_30
75P_40
76P_50
77P_60
78P_70
79P_80
80P_90
81P_100
82P_110
83P_120
84P_130
85P_140
86P_150
87K_20
88K_30
89K_40
90K_50
91K_60
92K_70
93K_80
94K_90
95K_100
96K_110
97K_120
98K_130
99K_140
100K_150
101S_20
102S_30
103S_40
104S_50
105S_60
106S_70
107S_80
108S_90
109S_100
110S_110
111S_120
112S_130
113S_140
114S_150
115PH_20
116PH_30
117PH_40
118PH_50
119PH_60
120PH_70
121PH_80
122PH_90
123PH_100
124PH_110
125PH_120
126PH_130
127PH_140
128PH_150
129Ca_20
130Ca_30
131Ca_40
132Ca_50
133Ca_60
134Ca_70
135Ca_80
136Ca_90
137Ca_100
138Ca_110
139Ca_120
140Ca_130
141Ca_140
142Ca_150
143Mg_20
144Mg_30
145Mg_40
146Mg_50
147Mg_60
148Mg_70
149Mg_80
150Mg_90
151Mg_100
152Mg_110
153Mg_120
154Mg_130
155Mg_140
156Mg_150
157Na_20
158Na_30
159Na_40
160Na_50
161Na_60
162Na_70
163Na_80
164Na_90
165Na_100
166Na_110
167Na_120
168Na_130
169Na_140
170Na_150
171Electroconductividad_30
172Electroconductividad_40
173Electroconductividad_60
174Electroconductividad_90
175Electroconductividad_100
176Electroconductividad_120
177Electroconductividad_130
178Electroconductividad_140
179Arena_20
180Arena_30
181Arena_40
182Arena_50
183Arena_60
184Arena_70
185Arena_80
186Arena_90
187Arena_100
188Arena_110
189Arena_120
190Arena_130
191Arena_140
192Arena_150
193Arcilla_20
194Arcilla_30
195Arcilla_40
196Arcilla_50
197Arcilla_60
198Arcilla_70
199Arcilla_80
200Arcilla_90
201Arcilla_100
202Arcilla_110
203Arcilla_120
204Arcilla_130
205Arcilla_140
206Arcilla_150
207Limo_20
208Limo_30
209Limo_40
210Limo_50
211Limo_60
212Limo_70
213Limo_80
214Limo_90
215Limo_100
216Limo_110
217Limo_120
218Limo_130
219Limo_140
220Limo_150
221Densidad_30
222Densidad_40
223Densidad_50
224Densidad_60
225Densidad_70
226Densidad_80
227Densidad_90
228Densidad_100
229Densidad_110
230Densidad_120
231Densidad_130
232Densidad_140
233Densidad_150
234aplicación_fecha
235aplicación_hum
236aplicación_presion
237aplicación_temp
238aplicación_vel_avance
239costo
240ingreso
390Electroconductividad_20
391Electroconductividad_50
392Electroconductividad_80
393Electroconductividad_110