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 lotedate
: fecha de la imagenlayer_name
: nombre de la capaoperation
: 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 servidoresname
: 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 imagenmin
: float, el ndvi medio mínimo dentro del perímetro del lotemax
: float, el ndvi medio máximo dentro del perímetro del lotecloudy
: 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:ssZformat
:- 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
- 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) .
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
: NDVIgndvi1
: GNDVIrgb1
: RGBmsavi2
: MSAVI2ndre
: 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:
lat lon variable_1 var_2 40,35715828 -89,92172667 35010 25 40,35715828 -89,92172375 35010 15 40,35715825 -89,92172082 35005 10
-
Geometrías válidas: 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 deltipo_capa
de la capa a crearmean
: (float o null) nueva mediamin
: (float o null) valor minimo para clip (outliers)max
: (float o null) valor maximo para clip (outliers)meta
:numerador_media
: unidad del numeradordenominador_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
GET api/sampling/analysis_variable/layer_type
Respuesta:
Un objeto que incluye:
code
:String
, indica el resultado de la petición.data
:Object
, contiene las profundidades disponibles con las capas correspondientes a cada profundidad. Por cada una de ellas obtenemos el nombre de la capa y el nombre de la operación.
{
"code": "ok",
"data": {
"0-20": {
"CIC": {
"operation": "CIC_20",
"layer_name": "CIC_20"
},
"Na": {
"operation": "Na_20",
"layer_name": "Na_20"
}
},
"20-40": {
"CIC": {
"operation": "CIC_40",
"layer_name": "CIC_40"
},
"Na": {
"operation": "Na_40",
"layer_name": "Na_40"
}
}
}
}
A continuación se enlistan todas las capas disponibles con sus respectivos ids:
id | nombre |
---|---|
1 | ndvi1 |
2 | ndvip1 |
3 | gndvi1 |
4 | gndvip1 |
5 | rinde |
6 | rgb1 |
7 | rgbp1 |
8 | altimetria |
9 | siembra |
10 | herbicida |
11 | fungicida |
12 | insecticida |
13 | fertilizante |
14 | enmienda |
15 | profundidad_suelo |
17 | Densidad_20 |
22 | margen_bruto |
24 | ndvi0.8 |
25 | vigor planta |
26 | tcari/osavi |
27 | NDRE |
29 | RGB0.8 |
31 | Sentinel2 |
32 | Planet |
34 | aplicación |
35 | humedad |
36 | Electroconductividad_70 |
37 | Electroconductividad_150 |
39 | siembra_vel_avance |
40 | siembra_var |
41 | siembra_fecha |
42 | rinde_hum |
43 | rinde_vel_avance |
44 | rinde_fecha |
45 | MO_20 |
46 | MO_30 |
47 | MO_40 |
48 | MO_50 |
49 | MO_60 |
50 | MO_70 |
51 | MO_80 |
52 | MO_90 |
53 | MO_100 |
54 | MO_110 |
55 | MO_120 |
56 | MO_130 |
57 | MO_140 |
58 | MO_150 |
59 | N_20 |
60 | N_30 |
61 | N_40 |
62 | N_50 |
63 | N_60 |
64 | N_70 |
65 | N_80 |
66 | N_90 |
67 | N_100 |
68 | N_110 |
69 | N_120 |
70 | N_130 |
71 | N_140 |
72 | N_150 |
73 | P_20 |
74 | P_30 |
75 | P_40 |
76 | P_50 |
77 | P_60 |
78 | P_70 |
79 | P_80 |
80 | P_90 |
81 | P_100 |
82 | P_110 |
83 | P_120 |
84 | P_130 |
85 | P_140 |
86 | P_150 |
87 | K_20 |
88 | K_30 |
89 | K_40 |
90 | K_50 |
91 | K_60 |
92 | K_70 |
93 | K_80 |
94 | K_90 |
95 | K_100 |
96 | K_110 |
97 | K_120 |
98 | K_130 |
99 | K_140 |
100 | K_150 |
101 | S_20 |
102 | S_30 |
103 | S_40 |
104 | S_50 |
105 | S_60 |
106 | S_70 |
107 | S_80 |
108 | S_90 |
109 | S_100 |
110 | S_110 |
111 | S_120 |
112 | S_130 |
113 | S_140 |
114 | S_150 |
115 | PH_20 |
116 | PH_30 |
117 | PH_40 |
118 | PH_50 |
119 | PH_60 |
120 | PH_70 |
121 | PH_80 |
122 | PH_90 |
123 | PH_100 |
124 | PH_110 |
125 | PH_120 |
126 | PH_130 |
127 | PH_140 |
128 | PH_150 |
129 | Ca_20 |
130 | Ca_30 |
131 | Ca_40 |
132 | Ca_50 |
133 | Ca_60 |
134 | Ca_70 |
135 | Ca_80 |
136 | Ca_90 |
137 | Ca_100 |
138 | Ca_110 |
139 | Ca_120 |
140 | Ca_130 |
141 | Ca_140 |
142 | Ca_150 |
143 | Mg_20 |
144 | Mg_30 |
145 | Mg_40 |
146 | Mg_50 |
147 | Mg_60 |
148 | Mg_70 |
149 | Mg_80 |
150 | Mg_90 |
151 | Mg_100 |
152 | Mg_110 |
153 | Mg_120 |
154 | Mg_130 |
155 | Mg_140 |
156 | Mg_150 |
157 | Na_20 |
158 | Na_30 |
159 | Na_40 |
160 | Na_50 |
161 | Na_60 |
162 | Na_70 |
163 | Na_80 |
164 | Na_90 |
165 | Na_100 |
166 | Na_110 |
167 | Na_120 |
168 | Na_130 |
169 | Na_140 |
170 | Na_150 |
171 | Electroconductividad_30 |
172 | Electroconductividad_40 |
173 | Electroconductividad_60 |
174 | Electroconductividad_90 |
175 | Electroconductividad_100 |
176 | Electroconductividad_120 |
177 | Electroconductividad_130 |
178 | Electroconductividad_140 |
179 | Arena_20 |
180 | Arena_30 |
181 | Arena_40 |
182 | Arena_50 |
183 | Arena_60 |
184 | Arena_70 |
185 | Arena_80 |
186 | Arena_90 |
187 | Arena_100 |
188 | Arena_110 |
189 | Arena_120 |
190 | Arena_130 |
191 | Arena_140 |
192 | Arena_150 |
193 | Arcilla_20 |
194 | Arcilla_30 |
195 | Arcilla_40 |
196 | Arcilla_50 |
197 | Arcilla_60 |
198 | Arcilla_70 |
199 | Arcilla_80 |
200 | Arcilla_90 |
201 | Arcilla_100 |
202 | Arcilla_110 |
203 | Arcilla_120 |
204 | Arcilla_130 |
205 | Arcilla_140 |
206 | Arcilla_150 |
207 | Limo_20 |
208 | Limo_30 |
209 | Limo_40 |
210 | Limo_50 |
211 | Limo_60 |
212 | Limo_70 |
213 | Limo_80 |
214 | Limo_90 |
215 | Limo_100 |
216 | Limo_110 |
217 | Limo_120 |
218 | Limo_130 |
219 | Limo_140 |
220 | Limo_150 |
221 | Densidad_30 |
222 | Densidad_40 |
223 | Densidad_50 |
224 | Densidad_60 |
225 | Densidad_70 |
226 | Densidad_80 |
227 | Densidad_90 |
228 | Densidad_100 |
229 | Densidad_110 |
230 | Densidad_120 |
231 | Densidad_130 |
232 | Densidad_140 |
233 | Densidad_150 |
234 | aplicación_fecha |
235 | aplicación_hum |
236 | aplicación_presion |
237 | aplicación_temp |
238 | aplicación_vel_avance |
239 | costo |
240 | ingreso |
390 | Electroconductividad_20 |
391 | Electroconductividad_50 |
392 | Electroconductividad_80 |
393 | Electroconductividad_110 |