diff --git a/FarmmapsApi/Services/GeneralService.cs b/FarmmapsApi/Services/GeneralService.cs index d1556b1..4e1f9b0 100644 --- a/FarmmapsApi/Services/GeneralService.cs +++ b/FarmmapsApi/Services/GeneralService.cs @@ -107,26 +107,27 @@ namespace FarmmapsApi.Services } // Create taskmap based on width, height and direction - public async Task CreateTaskmap(Item tiffItem, string cellWidth, string cellHeight, string startPoint, string endPoint = null, string angle = null) + public async Task CreateTaskmap(Item cropfieldItem, Item tiffItem, string cellWidth, string cellHeight, string startPoint, string endPoint = null, string angle = null) { var taskmapRequest = new TaskRequest { TaskType = TASKMAP_TASK }; taskmapRequest.attributes["inputCode"] = tiffItem.Code; + taskmapRequest.attributes["operation"] = "shape"; // Currently onlye "shape" supported, if ISOXML is supported this should be an input taskmapRequest.attributes["cellWidth"] = cellWidth; //metres taskmapRequest.attributes["cellHeight"] = cellHeight; //metres taskmapRequest.attributes["startPoint"] = startPoint; // Coordinates WGS84 if (angle == null) taskmapRequest.attributes["endPoint"] = endPoint; // Coordinates WGS84 if (endPoint == null) taskmapRequest.attributes["angle"] = angle; // degrees between 0.0 and 360.0 - string itemTaskCode = await _farmmapsApiService.QueueTaskAsync(tiffItem.Code, taskmapRequest); + string itemTaskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, taskmapRequest); await PollTask(TimeSpan.FromSeconds(5), async (tokenSource) => { - var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(tiffItem.Code, itemTaskCode); + var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, itemTaskCode); _logger.LogInformation($"Waiting on conversion to Taskmap; status: {itemTaskStatus.State}"); if (itemTaskStatus.IsFinished) tokenSource.Cancel(); }); - var itemTask = await _farmmapsApiService.GetTaskStatusAsync(tiffItem.Code, itemTaskCode); + var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, itemTaskCode); if (itemTask.State == ItemTaskState.Error) { _logger.LogError($"Something went wrong with task execution: {itemTask.Message}"); diff --git a/FarmmapsNbs/InputData-NBS.json b/FarmmapsNbs/InputData-NBS.json new file mode 100644 index 0000000..3fdad59 --- /dev/null +++ b/FarmmapsNbs/InputData-NBS.json @@ -0,0 +1,40 @@ +[ + { + "UseCreatedCropfield": false, + "storeStatistics": false, + "file": "20210127_WDVI_plus03.tif", + "inputVariable": "wdvi", + //"InputLayerName": "Band 1", + "outputFileName": "2021.02.15.Hapreet_Singh_0127-wdvi03_2", + "plantingDate": "2020-04-15", + "measurementDate": "2020-06-27", + "potatoPurposeType": "consumption", + "targetYield": 27, + "fieldName": "Mahindra-Hapreet-Singh", + "geometryJson": { + "type": "Polygon", + "coordinates": [ + [ + [ 75.929090780177305, 31.639314978348551 ], + [ 75.931353489378182, 31.639409065494881 ], + [ 75.931432810729120, 31.638956841735819 ], + [ 75.929072617175663, 31.638879365370279 ], + [ 75.929090780177305, 31.639314978348551 ] + ] + ] + }, + "GenerateTaskmap": true, + "CellWidth": "3", + "CellHeight": "10", + "StartPoint": { + "type": "Point", + "coordinates": [ 75.931432810729120, 31.638956841735819 ] + }, + "EndPoint": { + "type": "Point", + "coordinates": [ 75.929072617175663, 31.638879365370279 ] + } // if no angle + + //"Angle": "317.0" // if no endpoint + } + ] \ No newline at end of file diff --git a/FarmmapsNbs/Models/NitrogenInput.cs b/FarmmapsNbs/Models/NitrogenInput.cs index 7d29e6e..61326ea 100644 --- a/FarmmapsNbs/Models/NitrogenInput.cs +++ b/FarmmapsNbs/Models/NitrogenInput.cs @@ -5,6 +5,7 @@ namespace FarmmapsNbs.Models { public class NitrogenInput { + public bool UseCreatedCropfield { get; set; } public string File { get; set; } public string InputVariable { get; set; } public string OutputFileName { get; set; } @@ -16,6 +17,12 @@ namespace FarmmapsNbs.Models public string InputLayerName { get; set; } public string fieldName{ get; set; } public bool storeSatelliteStatistics { get; set; } + public bool GenerateTaskmap { get; set; } + public string CellWidth { get; set; } + public string CellHeight { get; set; } + public JObject StartPoint { get; set; } + public JObject EndPoint { get; set; } + public string Angle { get; set; } } diff --git a/FarmmapsNbs/NbsApplication.cs b/FarmmapsNbs/NbsApplication.cs index 7a74696..109843c 100644 --- a/FarmmapsNbs/NbsApplication.cs +++ b/FarmmapsNbs/NbsApplication.cs @@ -37,7 +37,7 @@ namespace FarmmapsNbs public async Task RunAsync() { - var nitrogenInputJson = File.ReadAllText("NitrogenInput.json"); + var nitrogenInputJson = File.ReadAllText("InputData-NBS.json"); //NitrogenInput.json List nitrogenInputs = JsonConvert.DeserializeObject>(nitrogenInputJson); if (!Directory.Exists(DownloadFolder)) @@ -64,7 +64,7 @@ namespace FarmmapsNbs { // !!specify if you are using an already created cropfield: - bool useCreatedCropfield = true; + bool useCreatedCropfield = input. UseCreatedCropfield; var plantingDate = input.PlantingDate; var FieldName = input.fieldName; bool StoreStatistics = input.storeSatelliteStatistics; @@ -274,13 +274,25 @@ namespace FarmmapsNbs _logger.LogError("Could not find item for uploaded data"); return; } - _logger.LogInformation($"Converting geotiff to shape"); - var taskmap = await _generalService.GeotiffToShape(tiffItem); - if (taskmap == null) { + + //_logger.LogInformation($"Converting geotiff to shape"); + //var taskmap = await _generalService.GeotiffToShape(tiffItem); + //if (taskmap == null) { + // _logger.LogError("Something went wrong with geotiff to shape transformation"); + // return; + //} + + //ApplicationMap (GEOTIFF) To Taskmap + _logger.LogInformation($"Converting geotiff to taskmap"); + var taskmap = await _generalService.CreateTaskmap(cropfieldItem, tiffItem, input.CellWidth, input.CellHeight, input.StartPoint.ToString(Formatting.None), + input.EndPoint.ToString(Formatting.None), input.Angle); + if (taskmap == null) + { _logger.LogError("Something went wrong with geotiff to shape transformation"); return; } + _logger.LogInformation("Downloading taskmap"); await _farmmapsApiService.DownloadItemAsync(taskmap.Code, Path.Combine(DownloadFolder, $"{input.OutputFileName}.taskmap.zip")); diff --git a/FarmmapsZonering/Data/VRApoten_appliancemap_20210215_vraPoten_SampleData_CovertArea.tif b/FarmmapsZonering/Data/VRApoten_appliancemap_20210215_vraPoten_SampleData_CovertArea.tif new file mode 100644 index 0000000..3fe1332 Binary files /dev/null and b/FarmmapsZonering/Data/VRApoten_appliancemap_20210215_vraPoten_SampleData_CovertArea.tif differ diff --git a/FarmmapsZonering/FarmmapsZonering.csproj b/FarmmapsZonering/FarmmapsZonering.csproj index b9ae3fa..b1927c2 100644 --- a/FarmmapsZonering/FarmmapsZonering.csproj +++ b/FarmmapsZonering/FarmmapsZonering.csproj @@ -23,5 +23,9 @@ + + + + diff --git a/FarmmapsZonering/Services/ZoneringService.cs b/FarmmapsZonering/Services/ZoneringService.cs index d379122..c6d717e 100644 --- a/FarmmapsZonering/Services/ZoneringService.cs +++ b/FarmmapsZonering/Services/ZoneringService.cs @@ -49,13 +49,11 @@ namespace FarmmapsZonering.Services return null; } - var itemName = $"VRAZonering"; - 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())); - i => - i.Name.ToLower().Contains(itemName.ToLower())); + var applianceMapItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, + GEOTIFF_PROCESSED_ITEMTYPE, output.Name, + i => i.Updated >= itemTask.Finished.GetValueOrDefault(DateTime.UtcNow) && + i.Name.ToLower().Contains(output.Name.ToLower())); + if (applianceMapItem == null) { _logger.LogError("Could not find the VRAZonering geotiff child item under cropfield"); diff --git a/FarmmapsZonering/ZoneringApplication.cs b/FarmmapsZonering/ZoneringApplication.cs index d53fd46..862f62a 100644 --- a/FarmmapsZonering/ZoneringApplication.cs +++ b/FarmmapsZonering/ZoneringApplication.cs @@ -73,7 +73,7 @@ namespace FarmmapsZonering return; } - bool useCreatedCropfield = true; + bool useCreatedCropfield = false; bool GetWatBal = input.GetWatBal; bool getVanDerSat = input.GetVanDerSat; bool StoreVanDerSatStatistics = input.storeVanDerSatStatistics; @@ -91,7 +91,7 @@ namespace FarmmapsZonering } Item cropfieldItem; - if (string.IsNullOrEmpty(_settings.CropfieldItemCode) || input.CreateNewCropfield == true) + if (input.CreateNewCropfield == true) // || string.IsNullOrEmpty(_settings.CropfieldItemCode) ## CHECK IT!! { _logger.LogInformation("Creating cropfield"); @@ -103,8 +103,8 @@ namespace FarmmapsZonering _settings.CropfieldItemCode = cropfieldItem.Code; SaveSettings(settingsfile); - cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDrive.Code, "Cropfield VRA Zonering", 2020, - @"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 5.670991253771027, 52.796788997702613 ], [ 5.671526456638633, 52.797291618546666 ], [ 5.671275936147413, 52.797422436717852 ], [ 5.671959173850738, 52.798269302728798 ], [ 5.670649634919365, 52.798778791408822 ], [ 5.671503682048522, 52.799591206957416 ], [ 5.675159003761311, 52.798193567415474 ], [ 5.673029579585948, 52.796024727480535 ], [ 5.670991253771027, 52.796788997702613 ] ] ] }"); + //cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDrive.Code, "Cropfield VRA Zonering", 2020, + // @"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 5.670991253771027, 52.796788997702613 ], [ 5.671526456638633, 52.797291618546666 ], [ 5.671275936147413, 52.797422436717852 ], [ 5.671959173850738, 52.798269302728798 ], [ 5.670649634919365, 52.798778791408822 ], [ 5.671503682048522, 52.799591206957416 ], [ 5.675159003761311, 52.798193567415474 ], [ 5.673029579585948, 52.796024727480535 ], [ 5.670991253771027, 52.796788997702613 ] ] ] }"); _settings.CropfieldItemCode = cropfieldItem.Code; SaveSettings(settingsfile); } @@ -147,19 +147,24 @@ namespace FarmmapsZonering var inputOneItem = await _generalService.UploadDataAsync(uploadedRoot, GEOTIFF_PROCESSED_ITEMTYPE, Path.Combine("Data", $"{input.InputItemOne}"), Path.GetFileNameWithoutExtension($"{input.InputItemOne}")); - if (inputOneItem == null) { + if (inputOneItem == null) + { _logger.LogError("Could not find item for uploaded data"); return; } - - var inputTwoItem = await _generalService.UploadDataAsync(uploadedRoot, GEOTIFF_PROCESSED_ITEMTYPE, - Path.Combine("Data", $"{input.InputItemTwo}"), Path.GetFileNameWithoutExtension($"{input.InputItemTwo}")); - if (inputTwoItem == null) { - _logger.LogError("Could not find item for uploaded data"); - return; - } + //var inputTwoItem = await _generalService.UploadDataAsync(uploadedRoot, GEOTIFF_PROCESSED_ITEMTYPE, + // Path.Combine("Data", $"{input.InputItemTwo}"), Path.GetFileNameWithoutExtension($"{input.InputItemTwo}")); + + //if (inputTwoItem == null) + //{ + // _logger.LogError("Could not find item for uploaded data"); + // return; + //} + + //var inputOneItem = input.InputItemOne; + //var inputTwoItem = input.InputItemTwo; var outputItem = await _zoneringService.CreateApplicationMapAsync(cropfieldItem, input.Formula, new Output() { @@ -172,12 +177,14 @@ namespace FarmmapsZonering { ItemCode = inputOneItem.Code, LayerName = inputOneItem.Data["layers"][0]["name"].ToString() - }, - new InputParameter() - { - ItemCode = inputOneItem.Code, - LayerName = inputOneItem.Data["layers"][0]["name"].ToString() - }); + } + //, + //new InputParameter() + //{ + // //ItemCode = inputOneItem.Code, + // //LayerName = inputOneItem.Data["layers"][0]["name"].ToString() + //} + );; _logger.LogInformation("Downloading output"); diff --git a/FarmmapsZonering/ZoneringInput.json b/FarmmapsZonering/ZoneringInput.json index dc23cc3..984289f 100644 --- a/FarmmapsZonering/ZoneringInput.json +++ b/FarmmapsZonering/ZoneringInput.json @@ -1,71 +1,101 @@ [ - //Formule kan meerdere inputs aan - // Met blokhaken en een nummer specificeer je een input: - //[0], [10]. etc... - // Aan de hand van de volgorde van input wordt momenteel bepaald welk nummer bij welk input hoort. - //[0] is dus de eerst tiff opgegeven.Als het goed is maakt het nummer nu niks uit, dus als er 2 inputs zijn en in de formule staan[0] en[10] dan zal die nog steeds werken. - //De volgorde van de tiff kun je verslepen, bij de formule inputs kun je de input van het ene[0] slot naar het andere slepen[10] - //Functies: abs, min en max - //Constanten: pi en e + //Formule kan meerdere inputs aan + // Met blokhaken en een nummer specificeer je een input: + //[0], [10]. etc... + // Aan de hand van de volgorde van input wordt momenteel bepaald welk nummer bij welk input hoort. + //[0] is dus de eerst tiff opgegeven.Als het goed is maakt het nummer nu niks uit, dus als er 2 inputs zijn en in de formule staan[0] en[10] dan zal die nog steeds werken. + //De volgorde van de tiff kun je verslepen, bij de formule inputs kun je de input van het ene[0] slot naar het andere slepen[10] + //Functies: abs, min en max + //Constanten: pi en e - //if ([0] -[1])/ ([0] +[1]) < 0 then 0 - //else if ([0] -[1])/ ([0] +[1]) > 1 then 1 - //else ([0] -[1]) / ([0] +[1]) + //if ([0] -[1])/ ([0] +[1]) < 0 then 0 + //else if ([0] -[1])/ ([0] +[1]) > 1 then 1 + //else ([0] -[1]) / ([0] +[1]) - //{ - // "InputItemOne": "20201106_Sentinel2_L2A_B04.tiff", - // "InputItemTwo": "20201106_Sentinel2_L2A_B08.tiff", - // "Formula": "([1]-[0])/([1]+[0])", - // "CreatedLayerName": "Biomassa", - // "CalculatedQuantity": "NDVI", - // "CalculatedUnit": "ndviValue", + //{ + // "InputItemOne": "20201106_Sentinel2_L2A_B04.tiff", + // "InputItemTwo": "20201106_Sentinel2_L2A_B08.tiff", + // "Formula": "([1]-[0])/([1]+[0])", + // "CreatedLayerName": "Biomassa", + // "CalculatedQuantity": "NDVI", + // "CalculatedUnit": "ndviValue", - // "OutputFileName": "FullField_NDVI", - // "CropFieldName": "FullField", - // "CreateNewCropfield": false, - // "CropYear": 2020, - // "geometryJson": { - // "type": "Polygon", - // "coordinates": [ + // "OutputFileName": "FullField_NDVI", + // "CropFieldName": "FullField", + // "CreateNewCropfield": false, + // "CropYear": 2020, + // "geometryJson": { + // "type": "Polygon", + // "coordinates": [ - // [ - // [ 4.9593709, 52.8014339 ], - // [ 4.9675488, 52.7943149 ], - // [ 4.9735195, 52.7968665 ], - // [ 4.9667833, 52.8030414 ], - // [ 4.9593709, 52.8014339 ] - // ] + // [ + // [ 4.9593709, 52.8014339 ], + // [ 4.9675488, 52.7943149 ], + // [ 4.9735195, 52.7968665 ], + // [ 4.9667833, 52.8030414 ], + // [ 4.9593709, 52.8014339 ] + // ] - // ] - // }, - { - "InputItemOne": "data_9001.tif", - "InputItemTwo": "data_times_two_4326.tiff", - "Formula": "if [0] >= 1.28 then [1] else 0", - "CreatedLayerName": "Biomassa", - "CalculatedQuantity": "NDVI", - "CalculatedUnit": "ndviValue", - "OutputFileName": "Zoning", - "CropFieldName": "Data_whole", - "UseShadow": false, - "GetWatBal": false, - "GetVanDerSat": true, - "storeVanDerSatStatistics": true, - "CropYear": 2020, - "geometryJson": { - "type": "Polygon", - "coordinates": [ - [ - [ 5.66886041703652044, 52.52929999060298627 ], - [ 5.6716230923214912, 52.52946316399909676 ], - [ 5.67185376229668581, 52.5280565894154563 ], - [ 5.66903207841337231, 52.52790646510525363 ], - [ 5.66886041703652044, 52.52929999060298627 ] - ] - ] + // ] + // } + //, + //{ + // "InputItemOne": "data_9001.tif", + // "InputItemTwo": "data_times_two_4326.tiff", + // "Formula": "if [0] >= 1.28 then [1] else 0", + // "CreatedLayerName": "Biomassa", + // "CalculatedQuantity": "NDVI", + // "CalculatedUnit": "ndviValue", + // "OutputFileName": "Zoning", + // "CropFieldName": "Data_whole", + // "UseShadow": false, + // "GetWatBal": false, + // "GetVanDerSat": false, + // "storeVanDerSatStatistics": false, + // "CropYear": 2020, + // "geometryJson": { + // "type": "Polygon", + // "coordinates": [ + // [ + // [ 5.66886041703652044, 52.52929999060298627 ], + // [ 5.6716230923214912, 52.52946316399909676 ], + // [ 5.67185376229668581, 52.5280565894154563 ], + // [ 5.66903207841337231, 52.52790646510525363 ], + // [ 5.66886041703652044, 52.52929999060298627 ] + // ] + // ] + // } + //}, + { + "InputItemOne": "VRApoten_appliancemap_20210215_vraPoten_SampleData_CovertArea.tif", + //"InputItemTwo": "", + "Formula": "((100/[0])/0.75)", + "LayerName": "CountPerAreaConversion", + "CalculatedQuantity": "CountPerArea", + "CalculatedUnit": "#/m2", + "OutputFileName": "CountPerAreaConversionOutput", + "CropFieldName": "ZoningCpA", + "CreateNewCropfield": true, + "UseShadow": false, + "GetWatBal": false, + "GetVanDerSat": false, + "storeVanDerSatStatistics": false, + "CropYear": 2020, + "geometryJson": { + "type": "Polygon", + "coordinates": [ + [ + [ 5.66886041703652044, 52.52929999060298627 ], + [ 5.6716230923214912, 52.52946316399909676 ], + [ 5.67185376229668581, 52.5280565894154563 ], + [ 5.66903207841337231, 52.52790646510525363 ], + [ 5.66886041703652044, 52.52929999060298627 ] + ] + ] + + } } - } - + ]