using System; using System.Globalization; using System.Threading.Tasks; using FarmmapsApi.Models; using FarmmapsApi.Services; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using static FarmmapsApi.Extensions; using static FarmmapsApiSamples.Constants; namespace FarmmapsVRApoten { public class PotenServiceAVR { private readonly ILogger _logger; private readonly FarmmapsApiService _farmmapsApiService; private readonly GeneralService _generalService; public PotenServiceAVR(ILogger logger, FarmmapsApiService farmmapsApiService, GeneralService generalService) { _logger = logger; _farmmapsApiService = farmmapsApiService; _generalService = generalService; } public async Task CalculateApplicationMapAsync(Item cropfieldItem, Item inputItem, string meanDensity, string variation) { var potenApplicationMapRequest = new TaskRequest() { TaskType = VRAPLANTING_TASK }; if (inputItem != null) { potenApplicationMapRequest.attributes["inputCode"] = inputItem.Code; } potenApplicationMapRequest.attributes["meanDensity"] = meanDensity; potenApplicationMapRequest.attributes["variation"] = variation; var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, potenApplicationMapRequest); _logger.LogInformation($"itemTaskCode: {taskCode}"); _logger.LogInformation($"potenTaskmapRequest: {potenApplicationMapRequest}"); _logger.LogInformation($"potenTaskmapRequest type: {potenApplicationMapRequest.TaskType}"); _logger.LogInformation($"cropfieldItemCode: {cropfieldItem.Code}"); await PollTask(TimeSpan.FromSeconds(5), async (tokenSource) => { var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); _logger.LogInformation($"Waiting on calculation of application map; Status: {itemTaskStatus.State}"); if (itemTaskStatus.IsFinished) tokenSource.Cancel(); }); var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); if (itemTask.State == ItemTaskState.Error) { _logger.LogError($"Something went wrong with task execution: {itemTask.Message}"); return null; } var itemName = $"VRAPoten"; var applianceMapItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, GEOTIFF_PROCESSED_ITEMTYPE, itemName, i => i.Updated >= itemTask.Finished.GetValueOrDefault(DateTime.UtcNow) && i.Name.ToLower().Contains(itemName.ToLower())); if (applianceMapItem == null) { _logger.LogError("Could not find the VRAPoten geotiff child item under cropfield"); return null; } return applianceMapItem; } // Extra task making use of the zonering task to convert the planting distance in cm to number of seeds per m2 !!! mind the hardcoded values !!! public async Task ConvertToCountPerAreaTroughZonering(Item cropfieldItem, Item geotiffItem, string rijBreedte_m) { var zoneringTaskRequest = new TaskRequest() { TaskType = VRAZONERING_TASK }; zoneringTaskRequest.attributes["formula"] = $"((100/[0])/{rijBreedte_m})"; zoneringTaskRequest.attributes["output"] = "{\"Name\":\"CountPerAreaConversion\",\"Quantity\":\"CountPerArea\",\"Unit\":\"#/m2\"}"; zoneringTaskRequest.attributes["inputs"] = $"[{{\"ItemCode\":\"{geotiffItem.Code}\",\"LayerName\":\"Appliancemap\"}}]"; var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, zoneringTaskRequest); await PollTask(TimeSpan.FromSeconds(5), async (tokenSource) => { var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); _logger.LogInformation($"Waiting on convertion to Count per area through zoneringTast; Status: {itemTaskStatus.State}"); if (itemTaskStatus.IsFinished) tokenSource.Cancel(); }); var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); if (itemTask.State == ItemTaskState.Error) { _logger.LogError($"Something went wrong with task execution: {itemTask.Message}"); return null; } var applianceMapItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, GEOTIFF_PROCESSED_ITEMTYPE, "CountPerAreaConversion", i => i.Updated >= itemTask.Finished.GetValueOrDefault(DateTime.UtcNow) && i.Name.ToLower().Contains("CountPerAreaConversion".ToLower())); if (applianceMapItem == null) { _logger.LogError("Could not find the converted to count per area geotiff child item under cropfield"); return null; } return applianceMapItem; } } }