From c02b232837f59d01852f246274d00476506a7e0b Mon Sep 17 00:00:00 2001 From: Riepma Date: Fri, 12 Feb 2021 17:10:25 +0100 Subject: [PATCH 1/3] Added Taskmap sample code to potenAPI --- FarmmapsApi/Services/GeneralService.cs | 48 ++++++++++++++++++++- FarmmapsPoten/FarmmapsPoten.csproj | 3 -- FarmmapsPoten/Models/PotenInput.cs | 13 +++++- FarmmapsPoten/PotenApplication.cs | 35 +++++++++++++-- FarmmapsPoten/PotenInput.json | 59 +++++++++++++++++--------- FarmmapsPoten/PotenService.cs | 46 +++++++++++++++++++- 6 files changed, 170 insertions(+), 34 deletions(-) diff --git a/FarmmapsApi/Services/GeneralService.cs b/FarmmapsApi/Services/GeneralService.cs index 6bb9c76..d1556b1 100644 --- a/FarmmapsApi/Services/GeneralService.cs +++ b/FarmmapsApi/Services/GeneralService.cs @@ -38,7 +38,7 @@ namespace FarmmapsApi.Services } public async Task UploadDataAsync(UserRoot root, string itemType, string filePath, string itemName) { - var startUpload = DateTime.UtcNow; + var startUpload = DateTime.UtcNow.AddSeconds(-3); var result = await _farmmapsApiService.UploadFile(filePath, root.Code, progress => _logger.LogInformation($"Status: {progress.Status} - BytesSent: {progress.BytesSent}")); @@ -74,6 +74,10 @@ namespace FarmmapsApi.Services public async Task GeotiffToShape(Item tiffItem) { var taskmapRequest = new TaskRequest { TaskType = TASKMAP_TASK }; + + taskmapRequest.attributes["cellWidth"] = "3"; + taskmapRequest.attributes["cellHeight"] = "1"; + taskmapRequest.attributes["angle"] = "0"; string itemTaskCode = await _farmmapsApiService.QueueTaskAsync(tiffItem.Code, taskmapRequest); @@ -92,7 +96,7 @@ namespace FarmmapsApi.Services //the taskmap is a child of the input tiff var itemName = "Taskmap"; - var taskMapItem = await FindChildItemAsync(tiffItem.Code, + var taskMapItem = await FindChildItemAsync(tiffItem.ParentCode, SHAPE_PROCESSED_ITEMTYPE, itemName); if (taskMapItem == null) { _logger.LogError("Could not find the shape taskmap as a child item under the input"); @@ -102,6 +106,46 @@ namespace FarmmapsApi.Services return taskMapItem; } + // 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) + { + var taskmapRequest = new TaskRequest { TaskType = TASKMAP_TASK }; + taskmapRequest.attributes["inputCode"] = tiffItem.Code; + 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); + + await PollTask(TimeSpan.FromSeconds(5), async (tokenSource) => { + var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(tiffItem.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); + if (itemTask.State == ItemTaskState.Error) + { + _logger.LogError($"Something went wrong with task execution: {itemTask.Message}"); + return null; + } + + //the taskmap is a child of the input tiff + var itemName = "Taskmap"; + var taskMapItem = await FindChildItemAsync(tiffItem.ParentCode, + SHAPE_PROCESSED_ITEMTYPE, itemName); + if (taskMapItem == null) + { + _logger.LogError("Could not find the shape taskmap as a child item under the input"); + return null; + } + + return taskMapItem; + } + public async Task RunAndWaitForTask(Item subjectItem, string taskIdentifier, Action configureCallback = null, int retrySeconds = 3) { diff --git a/FarmmapsPoten/FarmmapsPoten.csproj b/FarmmapsPoten/FarmmapsPoten.csproj index 1ff2fe3..f76d9da 100644 --- a/FarmmapsPoten/FarmmapsPoten.csproj +++ b/FarmmapsPoten/FarmmapsPoten.csproj @@ -12,9 +12,6 @@ Always - - PreserveNewest - diff --git a/FarmmapsPoten/Models/PotenInput.cs b/FarmmapsPoten/Models/PotenInput.cs index 3bb03be..dc97b6b 100644 --- a/FarmmapsPoten/Models/PotenInput.cs +++ b/FarmmapsPoten/Models/PotenInput.cs @@ -5,14 +5,23 @@ namespace FarmmapsPoten.Models { public class PotenInput { - public bool UseShadow { get; set; } - public string File { get; set; } public string OutputFileName { get; set; } public string FieldName { get; set; } public int PlantingYear { get; set; } public string MeanDensity { get; set; } public string Variation { get; set; } + public bool UseShadow { get; set; } + public bool ConvertToCountPerArea { get; set; } + public float Rijbreedte_m { get; set; } public JObject GeometryJson { 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; } + } } \ No newline at end of file diff --git a/FarmmapsPoten/PotenApplication.cs b/FarmmapsPoten/PotenApplication.cs index 42a4ac3..b3dad38 100644 --- a/FarmmapsPoten/PotenApplication.cs +++ b/FarmmapsPoten/PotenApplication.cs @@ -58,6 +58,8 @@ namespace FarmmapsVRApoten var variation = input.Variation; var fieldName = input.FieldName; bool useShadow = input.UseShadow; + bool convertToCountPerArea = input.ConvertToCountPerArea; + float rijBreedte_m = input.Rijbreedte_m; var myDrive = roots.SingleOrDefault(r => r.Name == "My drive"); if (myDrive == null) { @@ -94,7 +96,8 @@ namespace FarmmapsVRApoten //Calculating AHN map _logger.LogInformation("retreiving AHN map for field"); var AHNItem = await _generalService.RunAhnTask(cropfieldItem); - if (AHNItem == null) { + if (AHNItem == null) + { _logger.LogError("Something went wrong while obtaining the AHN map"); return; } @@ -160,6 +163,8 @@ namespace FarmmapsVRApoten Path.Combine(DownloadFolder, $"VRApoten_inputGeotiff_{input.OutputFileName}.zip")); } + + // create appliance map _logger.LogInformation("Calculating application map"); @@ -180,13 +185,35 @@ namespace FarmmapsVRApoten ? "Download application map completed." : "Something went wrong while downloading."); - _logger.LogInformation($"Converting geotiff to shape"); - var taskmap = await _generalService.GeotiffToShape(applianceMapItem); - if (taskmap == null) { + + // if convertToCountPerArea == True, than recalculate pootafstand in cm to # of poters/m2 from the geotiffItem with the use of the zoneringsTask + if (convertToCountPerArea) + { + applianceMapItem = + await _potenService.ConvertToCountPerAreaTroughZonering(cropfieldItem, applianceMapItem, input.Rijbreedte_m); + + } + + + //GEOTIFF TO Taskmap + _logger.LogInformation($"Converting geotiff to taskmap"); + var taskmap = await _generalService.CreateTaskmap(applianceMapItem, 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; } + + ////GEOTIFF TO SHAPE + //_logger.LogInformation($"Converting geotiff to shape"); + //var geotiffToShapeItem= await _generalService.GeotiffToShape(applianceMapItem); + //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, $"VRApoten_taskmap_{input.OutputFileName}.zip")); diff --git a/FarmmapsPoten/PotenInput.json b/FarmmapsPoten/PotenInput.json index e67acba..7fb8b26 100644 --- a/FarmmapsPoten/PotenInput.json +++ b/FarmmapsPoten/PotenInput.json @@ -1,24 +1,41 @@ [ - { - "File": "PlantingSampleDataLutum.zip", - //"File": "Lutum_SampleDataPlanting.zip", - "OutputFileName": "vraPoten_SampleData", - "FieldName": "lutum", - "PlantingYear": 2020, - "MeanDensity": "30", - "Variation": "20", - "UseShadow": false, - "geometryJson": { - "type": "Polygon", - "coordinates": [ - [ - [ 5.66886041703652044, 52.52929999060298627 ], - [ 5.6716230923214912, 52.52946316399909676 ], - [ 5.67185376229668581, 52.5280565894154563 ], - [ 5.66903207841337231, 52.52790646510525363 ], - [ 5.66886041703652044, 52.52929999060298627 ] - ] - ] + { + "File": "PlantingSampleDataLutum.zip", + //"File": "Lutum_SampleDataPlanting.zip", + "OutputFileName": "20210212_vraPoten_SampleData_TASKMAP_ENDPOINT", + "FieldName": "lutum", + "PlantingYear": 2020, + "MeanDensity": "30", + "Variation": "20", + "UseShadow": false, + "ConvertToCountPerArea": false, + "Rijbreedte_m": 0.75, + "geometryJson": { + "type": "Polygon", + "coordinates": [ + [ + [ 5.66886041703652044, 52.52929999060298627 ], + [ 5.6716230923214912, 52.52946316399909676 ], + [ 5.67185376229668581, 52.5280565894154563 ], + [ 5.66903207841337231, 52.52790646510525363 ], + [ 5.66886041703652044, 52.52929999060298627 ] + ] + ] + }, + + "GenerateTaskmap": true, + "CellWidth": "3", + "CellHeight": "10", + "StartPoint": { + "type": "Point", + "coordinates": [ 5.66886041703652044, 52.52929999060298627 ] + }, + "EndPoint": { + "type": "Point", + "coordinates": [ 5.6716230923214912, 52.52946316399909676 ] + } // if no angle + + //"Angle": "317.0" // if no endpoint } - } + ] diff --git a/FarmmapsPoten/PotenService.cs b/FarmmapsPoten/PotenService.cs index 7a839c2..c77f393 100644 --- a/FarmmapsPoten/PotenService.cs +++ b/FarmmapsPoten/PotenService.cs @@ -82,10 +82,52 @@ namespace FarmmapsVRApoten return applianceMapItem; - } + } - } + // Extra task making use of the zonering task to convert the planting distance in cm to number of seeds per m2 + public async Task ConvertToCountPerAreaTroughZonering(Item cropfieldItem, Item geotiffItem, float rijBreedte_m) + { + var zoneringTaskRequest = new TaskRequest() { TaskType = VRAZONERING_TASK }; + zoneringTaskRequest.attributes["formula"] = $"((100/[0])/{rijBreedte_m.ToString()})"; + zoneringTaskRequest.attributes["output"] = "{\"Name\":\"CountPerAreaConversion\",\"Quantity\":\"CountPerArea\",\"Unit\":\"#/m2\"}"; + zoneringTaskRequest.attributes["inputs"] = $"{{\"ItemCode\":{geotiffItem.Code},\"LayerName\":null\"}}"; + + 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 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())); + if (applianceMapItem == null) + { + _logger.LogError("Could not find the converted to count per area geotiff child item under cropfield"); + return null; + } + + return applianceMapItem; + } + + + } } From 101b683daa9751d4b363ab569be7575c8ba49cd5 Mon Sep 17 00:00:00 2001 From: Riepma Date: Mon, 15 Feb 2021 17:06:09 +0100 Subject: [PATCH 2/3] Update zonering to find the right output files Added taskmap creator to NBS --- FarmmapsApi/Services/GeneralService.cs | 9 +- FarmmapsNbs/InputData-NBS.json | 40 +++++ FarmmapsNbs/Models/NitrogenInput.cs | 7 + FarmmapsNbs/NbsApplication.cs | 22 ++- ...0210215_vraPoten_SampleData_CovertArea.tif | Bin 0 -> 142584 bytes FarmmapsZonering/FarmmapsZonering.csproj | 4 + FarmmapsZonering/Services/ZoneringService.cs | 12 +- FarmmapsZonering/ZoneringApplication.cs | 43 ++--- FarmmapsZonering/ZoneringInput.json | 152 +++++++++++------- 9 files changed, 194 insertions(+), 95 deletions(-) create mode 100644 FarmmapsNbs/InputData-NBS.json create mode 100644 FarmmapsZonering/Data/VRApoten_appliancemap_20210215_vraPoten_SampleData_CovertArea.tif 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 0000000000000000000000000000000000000000..3fe1332555fde7e6ace21e74e92baab6a57aa61b GIT binary patch literal 142584 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 + + + + 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 ] + ] + ] + + } } - } - + ] From 3ad594d83fe1cf1114914e9d1d8bb315f4b0247a Mon Sep 17 00:00:00 2001 From: Riepma Date: Tue, 16 Feb 2021 09:46:50 +0100 Subject: [PATCH 3/3] Created separate project for areaConversion VRA poten Updated VRA poten sample code --- FarmmapsPoten/FarmmapsPoten.csproj | 3 + FarmmapsPoten/Models/PotenInput.cs | 3 +- FarmmapsPoten/PotenApplication.cs | 27 +- FarmmapsPoten/PotenInput.json | 5 +- FarmmapsPoten/PotenService.cs | 59 +--- .../Data/PlantingSampleDataLutum.json | 302 ++++++++++++++++++ .../Data/PlantingSampleDataLutum.zip | Bin 0 -> 5865 bytes .../FarmmapsPoten_AVRapi.csproj | 24 ++ FarmmapsPoten_AVRapi/Models/PotenInputAVR.cs | 27 ++ FarmmapsPoten_AVRapi/PotenApplicationAVR.cs | 228 +++++++++++++ FarmmapsPoten_AVRapi/PotenInputAVR.json | 41 +++ FarmmapsPoten_AVRapi/PotenServiceAVR.cs | 120 +++++++ FarmmapsPoten_AVRapi/Program.cs | 23 ++ FarmmapsPoten_AVRapi/appsettings.json | 10 + 14 files changed, 783 insertions(+), 89 deletions(-) create mode 100644 FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.json create mode 100644 FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.zip create mode 100644 FarmmapsPoten_AVRapi/FarmmapsPoten_AVRapi.csproj create mode 100644 FarmmapsPoten_AVRapi/Models/PotenInputAVR.cs create mode 100644 FarmmapsPoten_AVRapi/PotenApplicationAVR.cs create mode 100644 FarmmapsPoten_AVRapi/PotenInputAVR.json create mode 100644 FarmmapsPoten_AVRapi/PotenServiceAVR.cs create mode 100644 FarmmapsPoten_AVRapi/Program.cs create mode 100644 FarmmapsPoten_AVRapi/appsettings.json diff --git a/FarmmapsPoten/FarmmapsPoten.csproj b/FarmmapsPoten/FarmmapsPoten.csproj index f76d9da..fd6dc18 100644 --- a/FarmmapsPoten/FarmmapsPoten.csproj +++ b/FarmmapsPoten/FarmmapsPoten.csproj @@ -12,6 +12,9 @@ Always + + PreserveNewest + diff --git a/FarmmapsPoten/Models/PotenInput.cs b/FarmmapsPoten/Models/PotenInput.cs index dc97b6b..52bda2d 100644 --- a/FarmmapsPoten/Models/PotenInput.cs +++ b/FarmmapsPoten/Models/PotenInput.cs @@ -5,6 +5,7 @@ namespace FarmmapsPoten.Models { public class PotenInput { + public string File { get; set; } public string OutputFileName { get; set; } public string FieldName { get; set; } @@ -12,8 +13,6 @@ namespace FarmmapsPoten.Models public string MeanDensity { get; set; } public string Variation { get; set; } public bool UseShadow { get; set; } - public bool ConvertToCountPerArea { get; set; } - public float Rijbreedte_m { get; set; } public JObject GeometryJson { get; set; } public bool GenerateTaskmap { get; set; } diff --git a/FarmmapsPoten/PotenApplication.cs b/FarmmapsPoten/PotenApplication.cs index b3dad38..637b9c3 100644 --- a/FarmmapsPoten/PotenApplication.cs +++ b/FarmmapsPoten/PotenApplication.cs @@ -58,8 +58,6 @@ namespace FarmmapsVRApoten var variation = input.Variation; var fieldName = input.FieldName; bool useShadow = input.UseShadow; - bool convertToCountPerArea = input.ConvertToCountPerArea; - float rijBreedte_m = input.Rijbreedte_m; var myDrive = roots.SingleOrDefault(r => r.Name == "My drive"); if (myDrive == null) { @@ -93,18 +91,6 @@ namespace FarmmapsVRApoten Path.Combine(DownloadFolder, $"{input.OutputFileName}.shadow.zip")); } - //Calculating AHN map - _logger.LogInformation("retreiving AHN map for field"); - var AHNItem = await _generalService.RunAhnTask(cropfieldItem); - if (AHNItem == null) - { - _logger.LogError("Something went wrong while obtaining the AHN map"); - return; - } - _logger.LogInformation("Downloading AHN map"); - await _farmmapsApiService.DownloadItemAsync(AHNItem.Code, - Path.Combine(DownloadFolder, $"{input.OutputFileName}_AHN.zip")); - _logger.LogInformation("Looking for local data to use"); var localDataAvailable = input.File; @@ -185,23 +171,14 @@ namespace FarmmapsVRApoten ? "Download application map completed." : "Something went wrong while downloading."); - - // if convertToCountPerArea == True, than recalculate pootafstand in cm to # of poters/m2 from the geotiffItem with the use of the zoneringsTask - if (convertToCountPerArea) - { - applianceMapItem = - await _potenService.ConvertToCountPerAreaTroughZonering(cropfieldItem, applianceMapItem, input.Rijbreedte_m); - - } - //GEOTIFF TO Taskmap _logger.LogInformation($"Converting geotiff to taskmap"); - var taskmap = await _generalService.CreateTaskmap(applianceMapItem, input.CellWidth, input.CellHeight, input.StartPoint.ToString(Formatting.None), + var taskmap = await _generalService.CreateTaskmap(cropfieldItem, applianceMapItem, 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"); + _logger.LogError("Something went wrong with geotiff to taskmap transformation"); return; } diff --git a/FarmmapsPoten/PotenInput.json b/FarmmapsPoten/PotenInput.json index 7fb8b26..70691fd 100644 --- a/FarmmapsPoten/PotenInput.json +++ b/FarmmapsPoten/PotenInput.json @@ -1,15 +1,12 @@ [ { "File": "PlantingSampleDataLutum.zip", - //"File": "Lutum_SampleDataPlanting.zip", - "OutputFileName": "20210212_vraPoten_SampleData_TASKMAP_ENDPOINT", + "OutputFileName": "20210216_vraPoten_SampleData", "FieldName": "lutum", "PlantingYear": 2020, "MeanDensity": "30", "Variation": "20", "UseShadow": false, - "ConvertToCountPerArea": false, - "Rijbreedte_m": 0.75, "geometryJson": { "type": "Polygon", "coordinates": [ diff --git a/FarmmapsPoten/PotenService.cs b/FarmmapsPoten/PotenService.cs index c77f393..02acda9 100644 --- a/FarmmapsPoten/PotenService.cs +++ b/FarmmapsPoten/PotenService.cs @@ -25,24 +25,13 @@ namespace FarmmapsVRApoten _generalService = generalService; } - public async Task CalculateApplicationMapAsync(Item cropfieldItem, Item inputItem,string meanDensity, string variation) + 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); - //await PollTask(TimeSpan.FromSeconds(3), async (tokenSource) => - //{ - // _logger.LogInformation("Checking VRAPoten task status"); - // var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); - // // Code - // if (itemTaskStatus.IsFinished) - // tokenSource.Cancel(); - //}); - - var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, potenApplicationMapRequest); _logger.LogInformation($"itemTaskCode: {taskCode}"); @@ -50,8 +39,6 @@ namespace FarmmapsVRApoten _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}"); @@ -60,7 +47,6 @@ namespace FarmmapsVRApoten }); - var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); if (itemTask.State == ItemTaskState.Error) { @@ -84,49 +70,6 @@ namespace FarmmapsVRApoten } - - // Extra task making use of the zonering task to convert the planting distance in cm to number of seeds per m2 - public async Task ConvertToCountPerAreaTroughZonering(Item cropfieldItem, Item geotiffItem, float rijBreedte_m) - { - var zoneringTaskRequest = new TaskRequest() { TaskType = VRAZONERING_TASK }; - zoneringTaskRequest.attributes["formula"] = $"((100/[0])/{rijBreedte_m.ToString()})"; - zoneringTaskRequest.attributes["output"] = "{\"Name\":\"CountPerAreaConversion\",\"Quantity\":\"CountPerArea\",\"Unit\":\"#/m2\"}"; - zoneringTaskRequest.attributes["inputs"] = $"{{\"ItemCode\":{geotiffItem.Code},\"LayerName\":null\"}}"; - - 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 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())); - if (applianceMapItem == null) - { - _logger.LogError("Could not find the converted to count per area geotiff child item under cropfield"); - return null; - } - - return applianceMapItem; - } - - } } diff --git a/FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.json b/FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.json new file mode 100644 index 0000000..7414170 --- /dev/null +++ b/FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.json @@ -0,0 +1,302 @@ +{ +"type": "FeatureCollection", +"name": "PlantingSampleDataLutum", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669006678383711, 52.529290221274948 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669006104248043, 52.529200349555097 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669005530115061, 52.529110477833399 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669004955984766, 52.529020606109889 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669004381857157, 52.528930734384545 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669003807732236, 52.528840862657354 ] } }, +{ "type": "Feature", "properties": { "lutum": 12 }, "geometry": { "type": "Point", "coordinates": [ 5.66900323361, 52.528750990928309 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669002659490453, 52.528661119197444 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669002085373592, 52.528571247464789 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669001511259415, 52.528481375730252 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669000937147927, 52.528391503993873 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669000363039124, 52.52830163225569 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669154039708354, 52.529289871032709 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669153465272641, 52.529199999313761 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669152890839613, 52.529110127592965 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669152316409275, 52.529020255870378 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669151741981626, 52.528930384145944 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669151167556664, 52.528840512419642 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.66915059313439, 52.528750640691563 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669150018714802, 52.528660768961629 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669149444297904, 52.528570897229841 ] } }, +{ "type": "Feature", "properties": { "lutum": 13 }, "geometry": { "type": "Point", "coordinates": [ 5.669148869883696, 52.528481025496269 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669148295472175, 52.528391153760822 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.66914772106334, 52.528301282023527 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669147146657193, 52.528211410284435 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669146572253736, 52.528121538543502 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669145997852967, 52.528031666800764 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669145423454884, 52.527941795056144 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669301401030309, 52.529289520607428 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.66930082629455, 52.52919964888941 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669300251561478, 52.529109777169573 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669299676831097, 52.529019905447882 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669299102103404, 52.528930033724393 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669298527378404, 52.528840161999021 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669297952656091, 52.528750290271873 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669297377936467, 52.528660418542835 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669296803219534, 52.528570546811963 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669296228505289, 52.528480675079251 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669295653793735, 52.528390803344763 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669295079084868, 52.52830093160842 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669294504378692, 52.528211059870216 ] } }, +{ "type": "Feature", "properties": { "lutum": 14 }, "geometry": { "type": "Point", "coordinates": [ 5.669293929675204, 52.528121188130193 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669293354974407, 52.528031316388351 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669292780276298, 52.527941444644689 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669448762349575, 52.529289169999203 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669448187313771, 52.529199298282116 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669447612280653, 52.529109426563181 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669447037250229, 52.529019554842385 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669446462222496, 52.52892968311982 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669445887197454, 52.528839811395386 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669445312175103, 52.528749939669105 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669444737155444, 52.528660067941011 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669444162138473, 52.528570196211071 ] } }, +{ "type": "Feature", "properties": { "lutum": 15 }, "geometry": { "type": "Point", "coordinates": [ 5.669443587124193, 52.528480324479311 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669443012112604, 52.528390452745711 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669442437103707, 52.528300581010306 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669441862097501, 52.528210709273012 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669441287093983, 52.52812083753394 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669440712093158, 52.528030965793008 ] } }, +{ "type": "Feature", "properties": { "lutum": 16 }, "geometry": { "type": "Point", "coordinates": [ 5.669440137095023, 52.527941094050242 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669596123666151, 52.529288819207963 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.6695955483303, 52.5291989474918 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669594972997138, 52.529109075773768 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669594397666672, 52.529019204053945 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669593822338896, 52.52892933233224 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669593247013813, 52.528839460608751 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669592671691423, 52.528749588883372 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669592096371725, 52.528659717156224 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.66959152105472, 52.528569845427207 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669590945740404, 52.528479973696371 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669590370428786, 52.528390101963666 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669589795119855, 52.528300230229171 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669589219813616, 52.528210358492849 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669588644510072, 52.528120486754638 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669588069209219, 52.52803061501465 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.669587493911057, 52.527940743272772 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669743484980033, 52.52928846823373 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.669742909344135, 52.529198596518491 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669742333710931, 52.529108724801389 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669741758080422, 52.529018853082476 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669741182452603, 52.528928981361695 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669740606827482, 52.528839109639122 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.669740031205053, 52.528749237914688 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.669739455585318, 52.528659366188421 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669738879968274, 52.528569494460349 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669738304353925, 52.528479622730416 ] } }, +{ "type": "Feature", "properties": { "lutum": 17 }, "geometry": { "type": "Point", "coordinates": [ 5.66973772874227, 52.528389750998656 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.66973715313331, 52.528299879265084 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669736577527043, 52.528210007529651 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669736001923469, 52.528120135792392 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669735426322587, 52.528030264053307 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669890846291222, 52.529288117076518 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.669890270355278, 52.529198245362174 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.669889694422031, 52.529108373646018 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669889118491477, 52.529018501928007 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.669888542563618, 52.528928630208178 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.669887966638455, 52.528838758486494 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.669887390715987, 52.528748886762969 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.669886814796213, 52.528659015037654 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669886238879136, 52.528569143310477 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669885662964753, 52.528479271581489 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669885087053065, 52.528389399850646 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669884511144072, 52.528299528117998 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.669883935237774, 52.528209656383481 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.66988335933417, 52.528119784647131 ] } }, +{ "type": "Feature", "properties": { "lutum": 18 }, "geometry": { "type": "Point", "coordinates": [ 5.669882783433263, 52.528029912908977 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670038207599717, 52.529287765736285 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.670037631363726, 52.529197894022879 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670037055130432, 52.529108022307639 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670036478899838, 52.529018150590574 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.670035902671936, 52.528928278871632 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.670035326446734, 52.528838407150914 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670034750224229, 52.528748535428306 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670034174004417, 52.528658663703865 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670033597787302, 52.528568791977627 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670033021572887, 52.528478920249526 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670032445361164, 52.528389048519642 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670031869152139, 52.528299176787897 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670031292945811, 52.528209305054318 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670030716742176, 52.528119433318885 ] } }, +{ "type": "Feature", "properties": { "lutum": 19 }, "geometry": { "type": "Point", "coordinates": [ 5.670030140541242, 52.52802956158164 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670186145444245, 52.529377285923772 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670185568905514, 52.52928741421308 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670184992369477, 52.52919754250059 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670184415836139, 52.529107670786267 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670183839305502, 52.529017799070111 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670183262777561, 52.528927927352115 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670182686252317, 52.528838055632299 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670182109729772, 52.528748183910643 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.670181533209922, 52.52865831218714 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670180956692772, 52.528568440461825 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670180380178322, 52.528478568734663 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670179803666567, 52.52838869700566 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670179227157511, 52.528298825274803 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670178650651151, 52.528208953542183 ] } }, +{ "type": "Feature", "properties": { "lutum": 20 }, "geometry": { "type": "Point", "coordinates": [ 5.67017807414749, 52.528119081807688 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670177497646527, 52.528029210071367 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670333507047393, 52.529376934216629 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670332930208612, 52.529287062506896 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670332353372531, 52.529197190795308 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670331776539151, 52.52910731908193 ] } }, +{ "type": "Feature", "properties": { "lutum": 21 }, "geometry": { "type": "Point", "coordinates": [ 5.670331199708469, 52.529017447366684 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670330622880485, 52.528927575649611 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670330046055202, 52.528837703930698 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670329469232617, 52.528747832209973 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670328892412731, 52.528657960487401 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670328315595544, 52.528568088762988 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.67032773878106, 52.528478217036756 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670327161969271, 52.528388345308677 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670326585160184, 52.528298473578765 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670326008353794, 52.52820860184702 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670325431550103, 52.528118730113469 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670324854749113, 52.528028858378079 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.67048086864784, 52.529376582326506 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670480291509012, 52.529286710617704 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670479714372884, 52.529196838907055 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670479137239461, 52.529106967194558 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670478560108735, 52.529017095480263 ] } }, +{ "type": "Feature", "properties": { "lutum": 22 }, "geometry": { "type": "Point", "coordinates": [ 5.670477982980711, 52.5289272237641 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670477405855387, 52.528837352046096 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670476828732764, 52.528747480326295 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.67047625161284, 52.528657608604661 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670475674495618, 52.528567736881193 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670475097381098, 52.528477865155843 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670474520269277, 52.528387993428701 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670473943160156, 52.528298121699713 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670473366053738, 52.52820824996892 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670472788950019, 52.528118378236279 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670472211849, 52.528028506501805 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670628230245586, 52.529376230253412 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670627652806711, 52.529286358545527 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670627075370538, 52.529196486835779 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670626497937069, 52.529106615124242 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670625920506301, 52.52901674341085 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670625343078235, 52.528926871695603 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670624765652872, 52.528836999978552 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670624188230208, 52.528747128259667 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670623610810248, 52.528657256538921 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670623033392991, 52.528567384816377 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670622455978436, 52.528477513091964 ] } }, +{ "type": "Feature", "properties": { "lutum": 23 }, "geometry": { "type": "Point", "coordinates": [ 5.670621878566583, 52.528387641365747 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670621301157429, 52.52829776963771 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.67062072375098, 52.528207897907812 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670620146347232, 52.528118026176088 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670619568946186, 52.528028154442524 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670775591840631, 52.529375877997303 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670775014101707, 52.529286006290334 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670774436365489, 52.529196134581525 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670773858631976, 52.529106262870911 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670773280901165, 52.52901639115845 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670772703173058, 52.52892651944412 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670772125447654, 52.528836647727985 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.670771547724952, 52.528746776010017 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670770970004954, 52.528656904290216 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670770392287662, 52.528567032568581 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670769814573072, 52.528477160845142 ] } }, +{ "type": "Feature", "properties": { "lutum": 24 }, "geometry": { "type": "Point", "coordinates": [ 5.670769236861187, 52.528387289119834 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670768659152, 52.528297417392693 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670768081445522, 52.528207545663754 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670767503741745, 52.528117673932925 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670766926040671, 52.528027802200249 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.67092295343297, 52.529375525558216 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.670922375394001, 52.52928565385217 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.670921797357738, 52.529195782144292 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.670921219324179, 52.529105910434581 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.670920641293326, 52.529016038723007 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670920063265176, 52.528926167009637 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.670919485239732, 52.528836295294447 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670918907216992, 52.52874642357736 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670918329196958, 52.528656551858511 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670917751179629, 52.528566680137807 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.670917173165005, 52.52847680841527 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670916595153083, 52.528386936690872 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.67091601714387, 52.528297064964669 ] } }, +{ "type": "Feature", "properties": { "lutum": 25 }, "geometry": { "type": "Point", "coordinates": [ 5.670915439137358, 52.528207193236646 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.670914861133554, 52.528117321506784 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.670914283132454, 52.528027449775095 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671070315022605, 52.529375172936099 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671069736683591, 52.529285301230992 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671069158347279, 52.529195429524037 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.671068580013677, 52.529105557815264 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671068001682782, 52.529015686104621 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671067423354591, 52.52892581439216 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671066845029107, 52.528835942677908 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.67106626670633, 52.528746070961773 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.671065688386258, 52.528656199243834 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671065110068891, 52.528566327524032 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.671064531754232, 52.528476455802441 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.67106395344228, 52.528386584078959 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.671063375133032, 52.528296712353679 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671062796826493, 52.528206840626574 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671062218522659, 52.528116968897628 ] } }, +{ "type": "Feature", "properties": { "lutum": 26 }, "geometry": { "type": "Point", "coordinates": [ 5.671061640221531, 52.528027097166849 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671217676609535, 52.529374820131018 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671217097970472, 52.52928494842682 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671216519334117, 52.529195076720818 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671215940700469, 52.529105205012932 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.67121536206953, 52.529015333303256 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671214783441298, 52.52892546159174 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671214204815774, 52.528835589878348 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.67121362619296, 52.528745718163179 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.671213047572849, 52.528655846446135 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671212468955447, 52.528565974727286 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671211890340752, 52.528476103006554 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671211311728769, 52.52838623128406 ] } }, +{ "type": "Feature", "properties": { "lutum": 27 }, "geometry": { "type": "Point", "coordinates": [ 5.67121073311949, 52.528296359559697 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671210154512919, 52.528206487833543 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671209575909057, 52.528116616105528 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671208997307901, 52.528026744375651 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671365038193755, 52.529374467142929 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671364459254646, 52.529284595439655 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671363880318245, 52.529194723734562 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671363301384553, 52.529104852027658 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671362722453573, 52.529014980318877 ] } }, +{ "type": "Feature", "properties": { "lutum": 28 }, "geometry": { "type": "Point", "coordinates": [ 5.671362143525299, 52.528925108608256 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671361564599734, 52.528835236895866 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671360985676879, 52.528745365181578 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671360406756732, 52.528655493465472 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671359827839296, 52.528565621747525 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671359248924568, 52.528475750027788 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671358670012548, 52.528385878306167 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671358091103239, 52.528296006582757 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671357512196637, 52.528206134857442 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671356933292747, 52.528116263130357 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671512399775269, 52.529374113971883 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671511820536112, 52.529284242269519 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671511241299665, 52.529194370565364 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.67151066206593, 52.52910449885934 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671510082834905, 52.529014627151504 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.67150950360659, 52.528924755441842 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671508924380984, 52.528834883730326 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671508345158092, 52.528745012016955 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671507765937908, 52.528655140301815 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671507186720435, 52.528565268584806 ] } }, +{ "type": "Feature", "properties": { "lutum": 33 }, "geometry": { "type": "Point", "coordinates": [ 5.671506607505673, 52.528475396865979 ] } }, +{ "type": "Feature", "properties": { "lutum": 33 }, "geometry": { "type": "Point", "coordinates": [ 5.671506028293621, 52.528385525145282 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.67150544908428, 52.528295653422774 ] } }, +{ "type": "Feature", "properties": { "lutum": 29 }, "geometry": { "type": "Point", "coordinates": [ 5.671504869877649, 52.52820578169846 ] } }, +{ "type": "Feature", "properties": { "lutum": 33 }, "geometry": { "type": "Point", "coordinates": [ 5.671504290673729, 52.528115909972264 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671658602278375, 52.52919401721315 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671658022744594, 52.529104145508029 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.671657443213525, 52.529014273801138 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.67165686368517, 52.528924402092414 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671656284159525, 52.52883453038185 ] } }, +{ "type": "Feature", "properties": { "lutum": 34 }, "geometry": { "type": "Point", "coordinates": [ 5.671655704636593, 52.528744658669403 ] } }, +{ "type": "Feature", "properties": { "lutum": 34 }, "geometry": { "type": "Point", "coordinates": [ 5.671655125116374, 52.528654786955173 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671654545598865, 52.528564915239095 ] } }, +{ "type": "Feature", "properties": { "lutum": 31 }, "geometry": { "type": "Point", "coordinates": [ 5.671653966084067, 52.528475043521155 ] } }, +{ "type": "Feature", "properties": { "lutum": 30 }, "geometry": { "type": "Point", "coordinates": [ 5.671653386571983, 52.528385171801425 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.67165280706261, 52.528295300079861 ] } }, +{ "type": "Feature", "properties": { "lutum": 32 }, "geometry": { "type": "Point", "coordinates": [ 5.67165222755595, 52.528205428356415 ] } }, +{ "type": "Feature", "properties": { "lutum": 33 }, "geometry": { "type": "Point", "coordinates": [ 5.671651648051999, 52.528115556631185 ] } }, +{ "type": "Feature", "properties": { "lutum": 34 }, "geometry": { "type": "Point", "coordinates": [ 5.671800165038228, 52.528294946553906 ] } }, +{ "type": "Feature", "properties": { "lutum": 33 }, "geometry": { "type": "Point", "coordinates": [ 5.671799585231536, 52.528205074831419 ] } }, +{ "type": "Feature", "properties": { "lutum": 34 }, "geometry": { "type": "Point", "coordinates": [ 5.671799005427561, 52.528115203107113 ] } } +] +} diff --git a/FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.zip b/FarmmapsPoten_AVRapi/Data/PlantingSampleDataLutum.zip new file mode 100644 index 0000000000000000000000000000000000000000..2c83115cb64bab668290cae81db59ccfceafedec GIT binary patch literal 5865 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 L2ZfRr{x$m_igikE literal 0 HcmV?d00001 diff --git a/FarmmapsPoten_AVRapi/FarmmapsPoten_AVRapi.csproj b/FarmmapsPoten_AVRapi/FarmmapsPoten_AVRapi.csproj new file mode 100644 index 0000000..edb3d3c --- /dev/null +++ b/FarmmapsPoten_AVRapi/FarmmapsPoten_AVRapi.csproj @@ -0,0 +1,24 @@ + + + + Exe + netcoreapp3.1 + + + + + Always + + + Always + + + PreserveNewest + + + + + + + + diff --git a/FarmmapsPoten_AVRapi/Models/PotenInputAVR.cs b/FarmmapsPoten_AVRapi/Models/PotenInputAVR.cs new file mode 100644 index 0000000..0bb2876 --- /dev/null +++ b/FarmmapsPoten_AVRapi/Models/PotenInputAVR.cs @@ -0,0 +1,27 @@ +using System; +using Newtonsoft.Json.Linq; + +namespace FarmmapsPoten_AVRapi.Models +{ + public class PotenInputAVR + { + public string File { get; set; } + public string OutputFileName { get; set; } + public string FieldName { get; set; } + public int PlantingYear { get; set; } + public string MeanDensity { get; set; } + public string Variation { get; set; } + public bool UseShadow { get; set; } + public bool ConvertToCountPerArea { get; set; } + public string Rijbreedte_m { get; set; } + public JObject GeometryJson { 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; } + + } +} \ No newline at end of file diff --git a/FarmmapsPoten_AVRapi/PotenApplicationAVR.cs b/FarmmapsPoten_AVRapi/PotenApplicationAVR.cs new file mode 100644 index 0000000..295ad21 --- /dev/null +++ b/FarmmapsPoten_AVRapi/PotenApplicationAVR.cs @@ -0,0 +1,228 @@ +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 FarmmapsPoten_AVRapi.Models; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using static FarmmapsApiSamples.Constants; + + +namespace FarmmapsVRApoten +{ + public class PotenApplicationAVR : IApplication + { + private const string DownloadFolder = "Downloads"; + + private readonly ILogger _logger; + private readonly FarmmapsApiService _farmmapsApiService; + private readonly PotenServiceAVR _potenService; + private readonly GeneralService _generalService; + + + public PotenApplicationAVR(ILogger logger, FarmmapsApiService farmmapsApiService, + GeneralService generalService, PotenServiceAVR potenService) + { + _logger = logger; + _farmmapsApiService = farmmapsApiService; + _generalService = generalService; + _potenService = potenService; + } + + public async Task RunAsync() + { + // read field data from separate json file + var VRAPotenInputJson = File.ReadAllText("PotenInputAVR.json"); + List potenInputs = JsonConvert.DeserializeObject>(VRAPotenInputJson); + + + 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 potenInputs) + { + try + { + await Process(roots, input); + } + catch (Exception ex) + { + _logger.LogError(ex.Message); + } + } + } + + private async Task Process(List roots, PotenInputAVR input) + { + var meanDensity = input.MeanDensity; + var variation = input.Variation; + var fieldName = input.FieldName; + bool useShadow = input.UseShadow; + bool convertToCountPerArea = input.ConvertToCountPerArea; + string rijBreedte_m = input.Rijbreedte_m; + + var myDrive = roots.SingleOrDefault(r => r.Name == "My drive"); + if (myDrive == null) + { + _logger.LogError("Could not find a needed root item"); + return; + } + + var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded"); + if (uploadedRoot == null) + { + _logger.LogError("Could not find a needed root item"); + return; + } + + _logger.LogInformation("Creating cropfield"); + + var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDrive.Code, + $"VRA Poten cropfield {input.OutputFileName}", input.PlantingYear, + input.GeometryJson.ToString(Formatting.None)); + + //Calculating shadow map + if (useShadow) + { + _logger.LogInformation("Calculate shadow map for field"); + var shadowItem = await _generalService.RunShadowTask(cropfieldItem); + if (shadowItem == null) + { + _logger.LogError("Something went wrong while obtaining the shadow map"); + return; + } + + _logger.LogInformation("Downloading shadow map"); + await _farmmapsApiService.DownloadItemAsync(shadowItem.Code, + Path.Combine(DownloadFolder, $"{input.OutputFileName}.shadow.zip")); + } + + _logger.LogInformation("Looking for local data to use"); + var localDataAvailable = input.File; + var geotiffItem = (Item)null; + + + if (String.IsNullOrEmpty(localDataAvailable)) + { + _logger.LogInformation("Could not find item for uploaded data, using BOFEK"); + + //Retreiving BOFEK + _logger.LogInformation("Get BOFEK for field"); + var bofekItem = await _generalService.RunBofekTask(cropfieldItem); + if (bofekItem == null) + { + _logger.LogError("Something went wrong while obtaining the BOFEK data"); + return; + } + + _logger.LogInformation("Downloading Bofek map"); + await _farmmapsApiService.DownloadItemAsync(bofekItem.Code, + Path.Combine(DownloadFolder, $"{input.OutputFileName}.BOFEK.zip")); + } + else if (input.File.Contains(".tif") || input.File.Contains(".geotiff")) + { + _logger.LogInformation("input = tiff data"); + var dataPath = Path.Combine("Data", input.File); + geotiffItem = await _generalService.UploadDataAsync(uploadedRoot, GEOTIFF_PROCESSED_ITEMTYPE, dataPath, + Path.GetFileNameWithoutExtension(input.File)); + + if (geotiffItem == null) + { + _logger.LogError("Could not find item for uploaded data"); + return; + } + } + else + { + var isGeoJson = input.File.Contains("json"); + var dataPath = Path.Combine("Data", input.File); + var shapeItem = isGeoJson + ? await _generalService.UploadDataAsync(uploadedRoot, SHAPE_PROCESSED_ITEMTYPE, dataPath, + Path.GetFileNameWithoutExtension(input.File)) + : await _generalService.UploadZipWithShapeAsync(uploadedRoot, dataPath, + Path.GetFileNameWithoutExtension(input.File)); + + if (shapeItem == null) + { + _logger.LogError("Something went wrong while searching for the shape file"); + return; + } + + // transform shape to geotiff as VRA poten only supports tiff input item + _logger.LogInformation($"Converting shape to geotiff"); + + geotiffItem = await _generalService.ShapeToGeotiff(shapeItem); + if (geotiffItem == null) + { + _logger.LogError("Something went wrong with shape to geotiff transformation"); + return; + } + + _logger.LogInformation("Downloading geotiff file"); + await _farmmapsApiService.DownloadItemAsync(geotiffItem.Code, + Path.Combine(DownloadFolder, $"VRApoten_inputGeotiff_{input.OutputFileName}.zip")); + } + + + + // create appliance map + _logger.LogInformation("Calculating application map"); + + // INPUT IS NEEDED as GEOTIFF + var applianceMapItem = + await _potenService.CalculateApplicationMapAsync(cropfieldItem, geotiffItem, meanDensity, variation); + + if (applianceMapItem == null) + { + return; + } + + _logger.LogInformation("Downloading application map"); + await _farmmapsApiService.DownloadItemAsync(applianceMapItem.Code, + Path.Combine(DownloadFolder, $"VRApoten_appliancemap_{input.OutputFileName}.zip")); + + string finalOutput = Path.Combine(DownloadFolder, $"VRApoten_appliancemap_{input.OutputFileName}.zip"); + _logger.LogInformation(File.Exists(finalOutput) + ? "Download application map completed." + : "Something went wrong while downloading."); + + + // if convertToCountPerArea == True, than recalculate pootafstand in cm to # of poters/m2 from the geotiffItem with the use of the zoneringsTask + if (convertToCountPerArea) + { + applianceMapItem = + await _potenService.ConvertToCountPerAreaTroughZonering(cropfieldItem, applianceMapItem, input.Rijbreedte_m); + + } + + + //Appliancemap (GEOTIFF) TO Taskmap + if (input.GenerateTaskmap == true) + { + _logger.LogInformation($"Converting geotiff to taskmap"); + var taskmap = await _generalService.CreateTaskmap(cropfieldItem, applianceMapItem, 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, $"VRApoten_taskmap_{input.OutputFileName}.zip")); + } + + + } + } +} \ No newline at end of file diff --git a/FarmmapsPoten_AVRapi/PotenInputAVR.json b/FarmmapsPoten_AVRapi/PotenInputAVR.json new file mode 100644 index 0000000..757844a --- /dev/null +++ b/FarmmapsPoten_AVRapi/PotenInputAVR.json @@ -0,0 +1,41 @@ +[ + { + "File": "PlantingSampleDataLutum.zip", + "OutputFileName": "20210216_SampleData_CovertArea", + "FieldName": "lutum", + "PlantingYear": 2021, + "MeanDensity": "30", + "Variation": "20", + "UseShadow": false, + "ConvertToCountPerArea": true, + "Rijbreedte_m": "0.75", //as string + "geometryJson": { + "type": "Polygon", + "coordinates": [ + [ + [ 5.66886041703652044, 52.52929999060298627 ], + [ 5.6716230923214912, 52.52946316399909676 ], + [ 5.67185376229668581, 52.5280565894154563 ], + [ 5.66903207841337231, 52.52790646510525363 ], + [ 5.66886041703652044, 52.52929999060298627 ] + ] + ] + }, + + // if taskmap is not generated, output is only geotiff + "GenerateTaskmap": true, + "CellWidth": "3", + "CellHeight": "10", + "StartPoint": { + "type": "Point", + "coordinates": [ 5.66886041703652044, 52.52929999060298627 ] + }, + "EndPoint": { + "type": "Point", + "coordinates": [ 5.6716230923214912, 52.52946316399909676 ] + } // if no angle + + //"Angle": "317.0" // if no endpoint + } + +] diff --git a/FarmmapsPoten_AVRapi/PotenServiceAVR.cs b/FarmmapsPoten_AVRapi/PotenServiceAVR.cs new file mode 100644 index 0000000..42ec93e --- /dev/null +++ b/FarmmapsPoten_AVRapi/PotenServiceAVR.cs @@ -0,0 +1,120 @@ +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; + } + + + } +} + + diff --git a/FarmmapsPoten_AVRapi/Program.cs b/FarmmapsPoten_AVRapi/Program.cs new file mode 100644 index 0000000..1003080 --- /dev/null +++ b/FarmmapsPoten_AVRapi/Program.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using FarmmapsApi; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace FarmmapsVRApoten +{ + class Program : FarmmapsProgram + { + private static async Task Main(string[] args) + { + await new Program().Start(args); + } + + protected override void Configure(IServiceCollection serviceCollection) + { + serviceCollection.AddLogging(opts => opts + .AddConsole() + .AddFilter("System.Net.Http", LogLevel.Warning)) + .AddTransient(); + } + } +} \ No newline at end of file diff --git a/FarmmapsPoten_AVRapi/appsettings.json b/FarmmapsPoten_AVRapi/appsettings.json new file mode 100644 index 0000000..3e75982 --- /dev/null +++ b/FarmmapsPoten_AVRapi/appsettings.json @@ -0,0 +1,10 @@ +{ + "Authority": "https://accounts.test.farmmaps.eu/", + "Endpoint": "https://test.farmmaps.eu/", + "BasePath": "api/v1", + "DiscoveryEndpointUrl": "https://accounts.test.farmmaps.eu/.well-known/openid-configuration", + "RedirectUri": "http://example.nl/api", + "ClientId": "", + "ClientSecret": "", + "Scopes": [ "api" ] +} \ No newline at end of file