diff --git a/FarmmapsApi/Services/GeneralService.cs b/FarmmapsApi/Services/GeneralService.cs index 8a8405f..679b2d9 100644 --- a/FarmmapsApi/Services/GeneralService.cs +++ b/FarmmapsApi/Services/GeneralService.cs @@ -17,8 +17,6 @@ namespace FarmmapsApi.Services private readonly ILogger _logger; private readonly FarmmapsApiService _farmmapsApiService; - private readonly string _downloadFolder = "Downloads"; - public GeneralService(ILogger logger, FarmmapsApiService farmmapsApiService) { _logger = logger; diff --git a/FarmmapsNbs/FarmmapsNbs.csproj b/FarmmapsNbs/FarmmapsNbs.csproj index 630bed0..05c7803 100644 --- a/FarmmapsNbs/FarmmapsNbs.csproj +++ b/FarmmapsNbs/FarmmapsNbs.csproj @@ -12,6 +12,9 @@ Always + + Always + diff --git a/FarmmapsNbs/Models/NitrogenInput.cs b/FarmmapsNbs/Models/NitrogenInput.cs new file mode 100644 index 0000000..1e6288f --- /dev/null +++ b/FarmmapsNbs/Models/NitrogenInput.cs @@ -0,0 +1,16 @@ +using System; +using Newtonsoft.Json.Linq; + +namespace FarmmapsNbs.Models +{ + public class NitrogenInput + { + public string IsariaZipFile { get; set; } + public string OutputFileName { get; set; } + public DateTime PlantingDate { get; set; } + public DateTime MeasurementDate { get; set; } + public string PotatoPurposeType { get; set; } + public int TargetYield { get; set; } + public JObject GeometryJson { get; set; } + } +} \ No newline at end of file diff --git a/FarmmapsNbs/NbsApplication.cs b/FarmmapsNbs/NbsApplication.cs index ba5bc21..9d20dc6 100644 --- a/FarmmapsNbs/NbsApplication.cs +++ b/FarmmapsNbs/NbsApplication.cs @@ -1,10 +1,14 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using FarmmapsApi; +using FarmmapsApi.Models; using FarmmapsApi.Services; +using FarmmapsNbs.Models; using Microsoft.Extensions.Logging; +using Newtonsoft.Json; namespace FarmmapsNbs { @@ -28,79 +32,92 @@ namespace FarmmapsNbs public async Task RunAsync() { - try + var nitrogenInputJson = File.ReadAllText("NitrogenInput.json"); + List nitrogenInputs = JsonConvert.DeserializeObject>(nitrogenInputJson); + + if (!Directory.Exists(DownloadFolder)) + Directory.CreateDirectory(DownloadFolder); + + // !! this call is needed the first time an api is called with a fresh clientid and secret !! + await _farmmapsApiService.GetCurrentUserCodeAsync(); + var roots = await _farmmapsApiService.GetCurrentUserRootsAsync(); + + foreach (var input in nitrogenInputs) { - // !! this call is needed the first time an api is called with a fresh clientid and secret !! - await _farmmapsApiService.GetCurrentUserCodeAsync(); - var roots = await _farmmapsApiService.GetCurrentUserRootsAsync(); - - if (!Directory.Exists(DownloadFolder)) - Directory.CreateDirectory(DownloadFolder); - - var plantingDate = new DateTime(DateTime.UtcNow.Year, 2, 1); - var measurementDate = plantingDate.AddMonths(5); - - var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded"); - if (uploadedRoot == null) + try { - _logger.LogError("Could not find a needed root item"); - return; + await Process(roots, input); } - - var myDriveRoot = roots.SingleOrDefault(r => r.Name == "My drive"); - if (myDriveRoot == null) + catch (Exception ex) { - _logger.LogError("Could not find a needed root item"); - return; + _logger.LogError(ex.Message); } - - var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDriveRoot.Code, "VRA NBS cropfield", 2020, - @"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 3.40843828875524, 50.638966444680605 ], [ 3.408953272886064, 50.639197789621612 ], [ 3.409242951459603, 50.639469958681836 ], [ 3.409328782148028, 50.639612846807708 ], [ 3.409457528180712, 50.639789755314411 ], [ 3.409639918393741, 50.640014292074966 ], [ 3.409833037442765, 50.640211611372706 ], [ 3.410069071836049, 50.640395321698435 ], [ 3.410380208081761, 50.640572227259661 ], [ 3.410605513638958, 50.640715112034222 ], [ 3.411925160474145, 50.641177783561204 ], [ 3.411935889310142, 50.640728720085136 ], [ 3.412590348309737, 50.63948356709389 ], [ 3.413244807309242, 50.638224772339846 ], [ 3.413400375432099, 50.637901562841307 ], [ 3.413539850300779, 50.637449065809889 ], [ 3.413475477284437, 50.637418445552932 ], [ 3.40999396998362, 50.637449065810451 ], [ 3.409940325803365, 50.638102293212661 ], [ 3.409575545377398, 50.638483338338325 ], [ 3.409060561246574, 50.638707881340494 ], [ 3.40843828875524, 50.638966444680605 ] ] ] }"); - - var dataPath = Path.Combine("Data", "Scan_1_20190605.zip"); - var isariaShapeItem = - await _generalService.UploadZipWithShapeAsync(uploadedRoot, dataPath, "Scan_1_20190605"); - if (isariaShapeItem == null) - { - _logger.LogError("Could not find isaria shape item"); - return; - } - - _logger.LogInformation($"Converting shape to geotiff"); - var isariaGeotiffItem = await _generalService.ShapeToGeotiff(isariaShapeItem); - if (isariaGeotiffItem == null) - { - _logger.LogError("Something went wrong with isaria shape to geotiff transformation"); - return; - } - - _logger.LogInformation($"Calculating targetN with targetYield: {60}"); - var targetNItem = await _nitrogenService.CreateTargetNItem(cropfieldItem); - var targetN = await _nitrogenService.CalculateTargetN(cropfieldItem, targetNItem, plantingDate, measurementDate, - "consumption", "irmi", 60); - _logger.LogInformation($"TargetN: {targetN}"); - - _logger.LogInformation("Calculating uptake map"); - var uptakeMapItem = - await _nitrogenService.CalculateUptakeMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate); - - _logger.LogInformation("Downloading uptake map"); - await _farmmapsApiService.DownloadItemAsync(uptakeMapItem.Code, - Path.Combine(DownloadFolder, $"{uptakeMapItem.Name}.zip")); - - _logger.LogInformation("Calculating appliance map"); - var applianceMapItem = - await _nitrogenService.CalculateApplicationMap(cropfieldItem, isariaGeotiffItem, plantingDate, measurementDate, - "irmi", targetN); - - _logger.LogInformation("Downloading appliance map"); - await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, - Path.Combine(DownloadFolder, $"{applianceMapItem.Name}.zip")); } - catch (Exception ex) + } + + private async Task Process(List roots, NitrogenInput input) + { + var plantingDate = input.PlantingDate; + var measurementDate = input.MeasurementDate; + + var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded"); + if (uploadedRoot == null) { - _logger.LogError(ex.Message); + _logger.LogError("Could not find a needed root item"); + return; } + + var myDriveRoot = roots.SingleOrDefault(r => r.Name == "My drive"); + if (myDriveRoot == null) + { + _logger.LogError("Could not find a needed root item"); + return; + } + + var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDriveRoot.Code, + $"VRA NBS cropfield {input.OutputFileName}", DateTime.Now.Year, input.GeometryJson.ToString(Formatting.None)); + + var dataPath = Path.Combine("Data", input.IsariaZipFile); + var isariaShapeItem = + await _generalService.UploadZipWithShapeAsync(uploadedRoot, dataPath, Path.GetFileNameWithoutExtension(input.IsariaZipFile)); + if (isariaShapeItem == null) + { + _logger.LogError("Could not find isaria shape item"); + return; + } + + _logger.LogInformation($"Converting shape to geotiff"); + var isariaGeotiffItem = await _generalService.ShapeToGeotiff(isariaShapeItem); + if (isariaGeotiffItem == null) + { + _logger.LogError("Something went wrong with isaria shape to geotiff transformation"); + return; + } + + _logger.LogInformation($"Calculating targetN with targetYield: {input.TargetYield}"); + var targetNItem = await _nitrogenService.CreateTargetNItem(cropfieldItem); + var targetN = await _nitrogenService.CalculateTargetN(cropfieldItem, targetNItem, plantingDate, + measurementDate, input.PotatoPurposeType, "irmi", input.TargetYield); + _logger.LogInformation($"TargetN: {targetN}"); + + _logger.LogInformation("Calculating uptake map"); + var uptakeMapItem = + await _nitrogenService.CalculateUptakeMap(cropfieldItem, isariaGeotiffItem, plantingDate, + measurementDate); + + _logger.LogInformation("Downloading uptake map"); + await _farmmapsApiService.DownloadItemAsync(uptakeMapItem.Code, + Path.Combine(DownloadFolder, $"{uptakeMapItem.Name}.zip")); + + _logger.LogInformation("Calculating appliance map"); + var applianceMapItem = + await _nitrogenService.CalculateApplicationMap(cropfieldItem, isariaGeotiffItem, plantingDate, + measurementDate, + "irmi", targetN); + + _logger.LogInformation("Downloading appliance map"); + await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, + Path.Combine(DownloadFolder, $"{applianceMapItem.Name}.zip")); } } } \ No newline at end of file diff --git a/FarmmapsNbs/NitrogenInput.json b/FarmmapsNbs/NitrogenInput.json new file mode 100644 index 0000000..f272013 --- /dev/null +++ b/FarmmapsNbs/NitrogenInput.json @@ -0,0 +1,11 @@ +[ + { + "isariaZipFile": "Scan_1_20190605.zip", + "outputFileName": "vranbs1", + "plantingDate": "2019-04-18", + "measurementDate": "2019-06-05", + "potatoPurposeType": "consumption", + "targetYield": 45, + "geometryJson": { "type": "Polygon", "coordinates": [ [ [ 3.40843828875524, 50.638966444680605 ], [ 3.408953272886064, 50.639197789621612 ], [ 3.409242951459603, 50.639469958681836 ], [ 3.409328782148028, 50.639612846807708 ], [ 3.409457528180712, 50.639789755314411 ], [ 3.409639918393741, 50.640014292074966 ], [ 3.409833037442765, 50.640211611372706 ], [ 3.410069071836049, 50.640395321698435 ], [ 3.410380208081761, 50.640572227259661 ], [ 3.410605513638958, 50.640715112034222 ], [ 3.411925160474145, 50.641177783561204 ], [ 3.411935889310142, 50.640728720085136 ], [ 3.412590348309737, 50.63948356709389 ], [ 3.413244807309242, 50.638224772339846 ], [ 3.413400375432099, 50.637901562841307 ], [ 3.413539850300779, 50.637449065809889 ], [ 3.413475477284437, 50.637418445552932 ], [ 3.40999396998362, 50.637449065810451 ], [ 3.409940325803365, 50.638102293212661 ], [ 3.409575545377398, 50.638483338338325 ], [ 3.409060561246574, 50.638707881340494 ], [ 3.40843828875524, 50.638966444680605 ] ] ] } + } +] \ No newline at end of file