Added create applicationmap.
fixed to flow.
This commit is contained in:
		| @@ -1,3 +1,4 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| @@ -7,7 +8,7 @@ using FarmmapsApi.Services; | ||||
| using FarmmapsHaulmkilling.Models; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Newtonsoft.Json; | ||||
|  | ||||
| using Newtonsoft.Json.Linq; | ||||
| using static FarmmapsApiSamples.Constants; | ||||
|  | ||||
| namespace FarmmapsHaulmkilling | ||||
| @@ -59,7 +60,7 @@ namespace FarmmapsHaulmkilling | ||||
|             } | ||||
|  | ||||
|             var agents = await _haulmkillingService.GetHaulmkillingAgents(); | ||||
|             if (agents == null) | ||||
|             if (agents == null || agents.Count == 0) | ||||
|             { | ||||
|                 _logger.LogError("No valid agents found for haulmkilling"); | ||||
|                 return; | ||||
| @@ -81,7 +82,7 @@ namespace FarmmapsHaulmkilling | ||||
|             } | ||||
|  | ||||
|             ItemTaskStatus taskStatus; | ||||
|             if (!string.IsNullOrEmpty(_settings.SatelliteTaskCode)) | ||||
|             if (string.IsNullOrEmpty(_settings.SatelliteTaskCode)) | ||||
|             { | ||||
|                 _logger.LogInformation("Gathering satellite information for cropfield, this might take a while!"); | ||||
|                 taskStatus = await _generalService.RunAndWaitForTask(cropfieldItem, SATELLITE_TASK, null, 20); | ||||
| @@ -102,29 +103,48 @@ namespace FarmmapsHaulmkilling | ||||
|             } | ||||
|  | ||||
|             // find ndvi or wdvi satellite data geotiffs | ||||
|             var temporalITem = await _generalService.FindChildItemAsync(cropfieldItem.Code, TEMPORAL_ITEMTYPE, | ||||
|             var temporalItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, TEMPORAL_ITEMTYPE, | ||||
|                 "Cropfield VRA Haulmkilling, Satellite", item => item.SourceTask == SATELLITE_TASK &&  | ||||
|                                                                  taskStatus.Finished >= item.Created &&  | ||||
|                                                                  taskStatus.Finished <= item.Created.Value.AddHours(1)); | ||||
|              | ||||
|             if (temporalITem == null) | ||||
|             if (temporalItem == null) | ||||
|             { | ||||
|                 _logger.LogError($"Temporal item not found"); | ||||
|                 _logger.LogError("Temporal item not found"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             var satelliteTiffs = await _farmmapsApiService.GetItemChildrenAsync(temporalITem.Code); | ||||
|             var satelliteTiffs = await _farmmapsApiService.GetItemChildrenAsync(temporalItem.Code); | ||||
|             var firstSatelliteItem = satelliteTiffs.FirstOrDefault(); | ||||
|  | ||||
|             if (firstSatelliteItem == null) | ||||
|             { | ||||
|                 _logger.LogError($"Satellite item not found"); | ||||
|                 _logger.LogError("Satellite item not found"); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             // create haulmkilling application map | ||||
|             // must be ndvi or wdvi | ||||
|             var inputType = (firstSatelliteItem.Data["layers"] as JArray)?[0]["name"].ToString(); | ||||
|             if (string.IsNullOrEmpty(inputType)) | ||||
|             { | ||||
|                 _logger.LogError("Could not get the input type name from the satellite item"); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             // download application map | ||||
|             var selectedAgent = agents[0]; | ||||
|             var selectedOption = selectedAgent.SupportedOptions[0]; | ||||
|              | ||||
|             _logger.LogInformation("Calculating application map"); | ||||
|             var applianceMapItem = await _haulmkillingService.CalculateApplicationMapAsync(cropfieldItem,  | ||||
|                 firstSatelliteItem, inputType, selectedAgent.Name, selectedOption); | ||||
|             if (applianceMapItem == null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             _logger.LogInformation("Downloading application map"); | ||||
|             await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, Path.Combine(DownloadFolder,  | ||||
|                 $"{applianceMapItem.Name}_{Guid.NewGuid():N}.zip")); | ||||
|         } | ||||
|  | ||||
|         private void LoadSettings() | ||||
|   | ||||
| @@ -1,9 +1,13 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using FarmmapsApi.Models; | ||||
| using FarmmapsApi.Services; | ||||
| using FarmmapsHaulmkilling.Models; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using static FarmmapsApi.Extensions; | ||||
| using static FarmmapsApiSamples.Constants; | ||||
|  | ||||
| namespace FarmmapsHaulmkilling | ||||
| { | ||||
| @@ -21,6 +25,10 @@ namespace FarmmapsHaulmkilling | ||||
|             _generalService = generalService; | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         /// Gets the list of available haulmkilling agents | ||||
|         /// </summary> | ||||
|         /// <returns>List of haulmkilling agents</returns> | ||||
|         public async Task<List<HaulmkillingAgent>> GetHaulmkillingAgents() | ||||
|         { | ||||
|             var itemType = "vnd.farmmaps.package.vra.haulmkilling"; | ||||
| @@ -32,5 +40,57 @@ namespace FarmmapsHaulmkilling | ||||
|  | ||||
|             return item.Data.ContainsKey("agents") ? item.Data["agents"].ToObject<List<HaulmkillingAgent>>() : null; | ||||
|         } | ||||
|          | ||||
|         /// <summary> | ||||
|         /// Creates an haulmkilling application map | ||||
|         /// </summary> | ||||
|         /// <param name="cropfieldItem">The context cropfield item to use</param> | ||||
|         /// <param name="inputItem">The geotiff item to use</param> | ||||
|         /// <param name="inputType">WDVI or NDVI</param> | ||||
|         /// <param name="agentName">One of the available agents</param> | ||||
|         /// <param name="selectedOption">One of the available options</param> | ||||
|         /// <returns>Haulmkilling application map item</returns> | ||||
|         public async Task<Item> CalculateApplicationMapAsync(Item cropfieldItem, Item inputItem, string inputType, | ||||
|             string agentName, string selectedOption) | ||||
|         { | ||||
|             var taskRequest = new TaskRequest() | ||||
|             { | ||||
|                 TaskType = "vnd.farmmaps.task.vrahaulmkilling" | ||||
|             }; | ||||
|             taskRequest.attributes["inputCode"] = inputItem.Code; | ||||
|             taskRequest.attributes["inputType"] = inputType; | ||||
|             taskRequest.attributes["agentName"] = agentName; | ||||
|             taskRequest.attributes["selectedOption"] = selectedOption; | ||||
|  | ||||
|             var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, taskRequest); | ||||
|             await PollTask(TimeSpan.FromSeconds(3), async (tokenSource) => | ||||
|             { | ||||
|                 _logger.LogInformation("Checking vrahaulmkilling task status"); | ||||
|                 var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); | ||||
|                 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 = $"VRAHaulmkilling {agentName}"; | ||||
|             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 VRAHaulmkilling geotiff child item under cropfield"); | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             return applianceMapItem; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -144,14 +144,14 @@ namespace FarmmapsHerbicide | ||||
|             } | ||||
|              | ||||
|             // create appliance map | ||||
|             _logger.LogInformation("Calculating appliance map"); | ||||
|             _logger.LogInformation("Calculating application map"); | ||||
|             var applianceMapItem = await _herbicideService.CalculateApplicationMapAsync(cropfieldItem, _liberatorTarweAgent, tiffInputItem, tiffInputExtraItem); | ||||
|             if (applianceMapItem == null) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             _logger.LogInformation("Downloading appliance map"); | ||||
|             _logger.LogInformation("Downloading application map"); | ||||
|             await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, Path.Combine(DownloadFolder,  | ||||
|                 $"{applianceMapItem.Name}_{Guid.NewGuid():N}.zip")); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user