2020-12-11 13:02:01 +00:00
using System ;
2020-11-19 09:38:17 +00:00
using System.Collections.Generic ;
2020-10-15 13:14:29 +00:00
using System.IO ;
using System.Linq ;
using System.Threading.Tasks ;
using FarmmapsApi ;
using FarmmapsApi.Models ;
using FarmmapsApi.Services ;
using FarmmapsHaulmkilling.Models ;
2020-11-12 14:49:17 +00:00
using FarmmapsZonering.Models ;
2020-10-15 13:14:29 +00:00
using FarmmapsZonering.Services ;
using Microsoft.Extensions.Logging ;
using Newtonsoft.Json ;
using static FarmmapsApiSamples . Constants ;
namespace FarmmapsZonering
{
public class ZoneringApplication : IApplication
{
private const string DownloadFolder = "Downloads" ;
private const string SettingsFile = "settings.json" ;
private readonly ILogger < ZoneringApplication > _logger ;
private readonly FarmmapsApiService _farmmapsApiService ;
private readonly GeneralService _generalService ;
private readonly ZoneringService _zoneringService ;
private Settings _settings ;
public ZoneringApplication ( ILogger < ZoneringApplication > logger , FarmmapsApiService farmmapsApiService ,
GeneralService generalService , ZoneringService zoneringService )
{
_logger = logger ;
_farmmapsApiService = farmmapsApiService ;
_generalService = generalService ;
_zoneringService = zoneringService ;
}
public async Task RunAsync ( )
{
if ( ! Directory . Exists ( DownloadFolder ) )
Directory . CreateDirectory ( DownloadFolder ) ;
2020-12-11 13:02:01 +00:00
// Read input data from separate file
var zoneringInputJson = File . ReadAllText ( "ZoneringInput.json" ) ;
List < ZoneringInput > zoneringInputs = JsonConvert . DeserializeObject < List < ZoneringInput > > ( zoneringInputJson ) ;
2020-10-15 13:14:29 +00:00
// !! 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 ( ) ;
2020-11-17 15:37:13 +00:00
2020-11-12 14:49:17 +00:00
2020-12-11 13:02:01 +00:00
foreach ( var input in zoneringInputs )
{
try
2020-11-17 15:37:13 +00:00
{
2020-12-11 13:02:01 +00:00
await ZoningAsync ( roots , input ) ;
}
catch ( Exception ex )
2020-11-17 15:37:13 +00:00
{
2020-12-11 13:02:01 +00:00
_logger . LogError ( ex . Message ) ;
}
}
2020-10-15 13:14:29 +00:00
}
2020-11-19 09:38:17 +00:00
2020-12-11 13:02:01 +00:00
private async Task ZoningAsync ( List < UserRoot > roots , ZoneringInput input )
2020-11-19 09:38:17 +00:00
{
var myDrive = roots . SingleOrDefault ( r = > r . Name = = "My drive" ) ;
if ( myDrive = = null )
{
_logger . LogError ( "Could not find a needed root item" ) ;
return ;
}
2021-01-28 14:08:32 +00:00
bool useCreatedCropfield = true ;
bool GetWatBal = input . GetWatBal ;
bool getVanDerSat = true ; // input.GetVanDerSat;
bool StoreVanDerSatStatistics = true ; // input.storeVanDerSatStatistics;
var FieldName = input . fieldName ;
string settingsfile = $"Settings_{FieldName}.json" ;
// Load settings from previous cropfield
LoadSettings ( settingsfile ) ;
2020-11-19 09:38:17 +00:00
var uploadedRoot = roots . SingleOrDefault ( r = > r . Name = = "Uploaded" ) ;
if ( uploadedRoot = = null )
{
_logger . LogError ( "Could not find a needed root item" ) ;
return ;
}
Item cropfieldItem ;
if ( string . IsNullOrEmpty ( _settings . CropfieldItemCode ) )
{
_logger . LogInformation ( "Creating cropfield" ) ;
2020-12-11 13:02:01 +00:00
//var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDrive.Code, input.CropFieldName, input.cropYear
//$"VRA Poten cropfield {input.OutputFileName}",
//input.GeometryJson.ToString(Formatting.None));
2021-01-28 14:08:32 +00:00
cropfieldItem = await _generalService . CreateCropfieldItemAsync ( myDrive . Code , "Perceel mestsilo" , 2020 ,
@"{ ""type"": ""Polygon"", ""coordinates"": [ [ [ 6.48270347, 53.25953201 ], [ 6.48257178, 53.25858122 ], [ 6.48781397, 53.25797859 ], [ 6.48793320, 53.25928036 ], [ 6.48270347, 53.25953201 ] ] ] }" ) ;
2020-11-19 09:38:17 +00:00
_settings . CropfieldItemCode = cropfieldItem . Code ;
2021-01-28 14:08:32 +00:00
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 ] ] ] }");
//_settings.CropfieldItemCode = cropfieldItem.Code;
//SaveSettings();
}
2020-11-19 09:38:17 +00:00
else
{
_logger . LogInformation ( "Cropfield already exists trying to get" ) ;
cropfieldItem = await _farmmapsApiService . GetItemAsync ( _settings . CropfieldItemCode ) ;
}
2021-01-28 14:08:32 +00:00
if ( GetWatBal = = true ) {
////Run watbal
//if (useCreatedCropfield == false || string.IsNullOrEmpty(_settings.WatBalTaskCode)) {
// var WatBalTaskCode = await _generalService.RunWatBalTask(cropfieldItem);
// _settings.WatBalTaskCode = WatBalTaskCode;
// SaveSettings(settingsfile);
//}
//// Get watbal data
//Item WatBalItem = await _generalService.FindWatBalItem(cropfieldItem, _settings.WatBalTaskCode, FieldName, StoreStatistics);
}
if ( getVanDerSat = = true ) {
// check if vandersat task not yet done, do here and save taskcode
if ( useCreatedCropfield = = false | | string . IsNullOrEmpty ( _settings . VanDerSatTaskCode ) ) {
var VanDerSatTaskCode = await _generalService . RunVanDerSatTask ( cropfieldItem ) ;
_settings . VanDerSatTaskCode = VanDerSatTaskCode ;
SaveSettings ( settingsfile ) ;
}
// Select a particular image item from VanDerSat
Item VanDerSatItem = await _generalService . FindVanDerSatItem ( cropfieldItem , _settings . VanDerSatTaskCode , FieldName , StoreVanDerSatStatistics ) ;
// download the geotiff
_logger . LogInformation ( "Downloading geotiff file" ) ;
await _farmmapsApiService . DownloadItemAsync ( VanDerSatItem . Code ,
Path . Combine ( DownloadFolder , $"nbs_VanDerSatGeotiff_{input.OutputFileName}.zip" ) ) ;
}
var inputOneItem = await _generalService . UploadDataAsync ( uploadedRoot , GEOTIFF_PROCESSED_ITEMTYPE ,
Path . Combine ( "Data" , "data_9001.tif" ) , "data_9001" ) ;
2020-11-19 09:38:17 +00:00
if ( inputOneItem = = null ) {
_logger . LogError ( "Could not find item for uploaded data" ) ;
return ;
}
2021-01-28 14:08:32 +00:00
var inputTwoItem = await _generalService . UploadDataAsync ( uploadedRoot , GEOTIFF_PROCESSED_ITEMTYPE ,
2020-11-19 09:38:17 +00:00
Path . Combine ( "Data" , "data_times_two_4326.tiff" ) , "data_times_two_4326" ) ;
if ( inputTwoItem = = null ) {
_logger . LogError ( "Could not find item for uploaded data" ) ;
return ;
}
2021-01-28 14:08:32 +00:00
//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])
var outputItem = await _zoneringService . CreateApplicationMapAsync ( cropfieldItem , "[0] >= 1.28 then [1] else 0" , new Output ( )
2020-11-19 09:38:17 +00:00
{
2021-01-28 14:08:32 +00:00
Name = "Test" ,
Unit = "index" ,
Quantity = "kg"
2020-11-19 09:38:17 +00:00
} , new InputParameter ( )
{
ItemCode = inputOneItem . Code ,
LayerName = inputOneItem . Data [ "layers" ] [ 0 ] [ "name" ] . ToString ( )
} ,
new InputParameter ( )
{
2021-01-28 14:08:32 +00:00
ItemCode = inputOneItem . Code ,
LayerName = inputOneItem . Data [ "layers" ] [ 0 ] [ "name" ] . ToString ( )
2020-11-19 09:38:17 +00:00
} ) ;
_logger . LogInformation ( "Downloading output" ) ;
await _farmmapsApiService . DownloadItemAsync ( outputItem . Code ,
2021-01-28 14:08:32 +00:00
Path . Combine ( DownloadFolder , $"Test.zip" ) ) ;
2020-11-19 09:38:17 +00:00
}
2020-10-15 13:14:29 +00:00
2021-01-28 14:08:32 +00:00
// Functions to save previously created cropfields
private void LoadSettings ( string file ) {
if ( File . Exists ( file ) ) {
var jsonText = File . ReadAllText ( file ) ;
2020-10-15 13:14:29 +00:00
_settings = JsonConvert . DeserializeObject < Settings > ( jsonText ) ;
2021-01-28 14:08:32 +00:00
} else {
2020-10-15 13:14:29 +00:00
_settings = new Settings ( ) ;
}
}
2021-01-28 14:08:32 +00:00
private void SaveSettings ( string file ) {
2020-10-15 13:14:29 +00:00
if ( _settings = = null )
return ;
var json = JsonConvert . SerializeObject ( _settings ) ;
2021-01-28 14:08:32 +00:00
File . WriteAllText ( file , json ) ;
}
private void SaveInfo ( string file ) {
if ( _settings = = null )
return ;
var json = JsonConvert . SerializeObject ( _settings ) ;
File . WriteAllText ( file , json ) ;
}
2020-10-15 13:14:29 +00:00
}
}