forked from FarmMaps/FarmMapsApiClient
		
	Added project FarmmapsBulkSatDownload
This commit is contained in:
		@@ -388,6 +388,29 @@ namespace FarmmapsApi.Services
 | 
				
			|||||||
            return selectedSatelliteItem;
 | 
					            return selectedSatelliteItem;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public async Task<List<Item>> FindSatelliteItemsAll(Item cropfieldItem, string satelliteTaskCode)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var taskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, satelliteTaskCode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // find ndvi or wdvi satellite data geotiffs
 | 
				
			||||||
 | 
					            var temporalItem = await FindChildItemAsync(cropfieldItem.Code, TEMPORAL_ITEMTYPE,
 | 
				
			||||||
 | 
					                "Cropfield Satellite items", item => item.SourceTask == SATELLITE_TASK &&
 | 
				
			||||||
 | 
					                                                                 taskStatus.Finished >= item.Created &&
 | 
				
			||||||
 | 
					                                                                 taskStatus.Finished <= item.Created.Value.AddHours(1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (temporalItem == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogError("Temporal item not found");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var satelliteTiffs = await _farmmapsApiService.GetItemChildrenAsync(temporalItem.Code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return satelliteTiffs;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        //VanDerSat
 | 
					        //VanDerSat
 | 
				
			||||||
        public async Task<string> RunVanDerSatTask(Item cropfieldItem) {
 | 
					        public async Task<string> RunVanDerSatTask(Item cropfieldItem) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FarmMapsBlight", "FarmMapsB
 | 
				
			|||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FarmmapsZonering", "FarmmapsZonering\FarmmapsZonering.csproj", "{91A58C4A-4A80-4079-B43D-9B851206194F}"
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FarmmapsZonering", "FarmmapsZonering\FarmmapsZonering.csproj", "{91A58C4A-4A80-4079-B43D-9B851206194F}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FarmmapsDataDownload", "FarmmapsDataDownload\FarmmapsDataDownload.csproj", "{32ED9500-AAAB-4030-9C7A-F611A85DF890}"
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FarmmapsDataDownload", "FarmmapsDataDownload\FarmmapsDataDownload.csproj", "{32ED9500-AAAB-4030-9C7A-F611A85DF890}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FarmmapsBulkSatDownload", "FarmmapsBulkSatDownload\FarmmapsBulkSatDownload.csproj", "{772DBDCD-9FAA-40A7-8551-2C1620C4AB67}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Global
 | 
					Global
 | 
				
			||||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
@@ -63,6 +65,10 @@ Global
 | 
				
			|||||||
		{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
							{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
				
			||||||
		{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
							{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
		{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
							{32ED9500-AAAB-4030-9C7A-F611A85DF890}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{772DBDCD-9FAA-40A7-8551-2C1620C4AB67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{772DBDCD-9FAA-40A7-8551-2C1620C4AB67}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{772DBDCD-9FAA-40A7-8551-2C1620C4AB67}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{772DBDCD-9FAA-40A7-8551-2C1620C4AB67}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
	EndGlobalSection
 | 
						EndGlobalSection
 | 
				
			||||||
	GlobalSection(SolutionProperties) = preSolution
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
		HideSolutionNode = FALSE
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										242
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadApplication.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadApplication.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,242 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.IO.Compression;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi;
 | 
				
			||||||
 | 
					using FarmmapsApi.Models;
 | 
				
			||||||
 | 
					using FarmmapsApi.Services;
 | 
				
			||||||
 | 
					using FarmmapsBulkSatDownload.Models;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					using Newtonsoft.Json;
 | 
				
			||||||
 | 
					using Npgsql;
 | 
				
			||||||
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
 | 
					using static FarmmapsApiSamples.Constants;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsBulkSatDownload
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class BulkSatDownloadApplication : IApplication
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private const string SettingsFile = "settings.json";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private readonly ILogger<BulkSatDownloadApplication> _logger;
 | 
				
			||||||
 | 
					        private readonly FarmmapsApiService _farmmapsApiService;
 | 
				
			||||||
 | 
					        private readonly BulkSatDownloadService _dataDownloadService;
 | 
				
			||||||
 | 
					        private readonly GeneralService _generalService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private Settings _settings;
 | 
				
			||||||
 | 
					        static DB dbparcels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public BulkSatDownloadApplication(ILogger<BulkSatDownloadApplication> logger, FarmmapsApiService farmmapsApiService,
 | 
				
			||||||
 | 
					            GeneralService generalService, BulkSatDownloadService dataDownloadService)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _logger = logger;
 | 
				
			||||||
 | 
					            _farmmapsApiService = farmmapsApiService;
 | 
				
			||||||
 | 
					            _generalService = generalService;
 | 
				
			||||||
 | 
					            _dataDownloadService = dataDownloadService;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public async Task RunAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // Check if we have permission
 | 
				
			||||||
 | 
					            // !! 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();
 | 
				
			||||||
 | 
					            // Initialize databases. Username, password etc stored in file "DBsettings.json"
 | 
				
			||||||
 | 
					            dbparcels = JsonConvert.DeserializeObject<DB>(File.ReadAllText("DBsettings.json"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //string date;
 | 
				
			||||||
 | 
					            //string asterices = "*****************************************************************************";
 | 
				
			||||||
 | 
					            //string bboxtiffWithTempPath;
 | 
				
			||||||
 | 
					            //string parcelshp = "parcel.shp";
 | 
				
			||||||
 | 
					            //string parcelshpWithTempPath;
 | 
				
			||||||
 | 
					            //string gwoptions; //= String.Format("-overwrite -s_srs EPSG:28992 -t_srs EPSG:28992 -dstnodata 0 -cutline {0} -crop_to_cutline", parcelshp);
 | 
				
			||||||
 | 
					            //string parceltiff = "parcel.tiff";
 | 
				
			||||||
 | 
					            //string parceltiffWithTempPath;
 | 
				
			||||||
 | 
					            //string[] vegetationindices = { "WDVI", "NDVI" };
 | 
				
			||||||
 | 
					            //string[] sources = { "groenmonitor" }; // { "groenmonitor", "akkerwebwenr", "akkerwebneo" }; { "groenmonitor" };
 | 
				
			||||||
 | 
					            string schemaname = "bigdata";
 | 
				
			||||||
 | 
					            string parceltablename = "parcel_flowerbulbs";//"parcelsijbrandij" "parcel"; "parcel_flowerbulbs"
 | 
				
			||||||
 | 
					            //string groenmonitortablename = "groenmonitor_flowerbulbs";//"groenmonitorsijbrandij" "groenmonitor" "groenmonitor_flowerbulbs" //PO20190605: "groenmonitormpt" contains groenmonitor data from multiple parcel tables (mpt)
 | 
				
			||||||
 | 
					            // The  view 'groenmonitorlatestviewname' contains per parcelid (arbid) the year in which it "exists" and the date of the latest image downloaded. It is used to prevent downloading images already downloaded
 | 
				
			||||||
 | 
					            string groenmonitorlatestviewname = "groenmonitorlatest_flowerbulbs"; //"groenmonitorsijbrandijlatest" "groenmonitorlatest" "groenmonitorlatest_flowerbulbs" //PO20190605: "v_groenmonitorlatest" contains latest available dates from groenmonitortablename = "groenmonitormpt"
 | 
				
			||||||
 | 
					            //GroenmonitorTable gmtb;
 | 
				
			||||||
 | 
					            //DateTime dt;
 | 
				
			||||||
 | 
					            //DateTime dtfirst;
 | 
				
			||||||
 | 
					            //DateTime dtlast;
 | 
				
			||||||
 | 
					            //double scalingfactor;
 | 
				
			||||||
 | 
					            BulkSatDownloadInput dataDownloadInput;
 | 
				
			||||||
 | 
					            List<BulkSatDownloadInput> fieldsInputs = new List<BulkSatDownloadInput>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Database query and connection. Geometry must be in WGS84 coordinate system, EPSG 4326
 | 
				
			||||||
 | 
					            // Apparently the FarmmapsApi cannot handle MultiPolygon, so we need to convert to single Polygon
 | 
				
			||||||
 | 
					            // In case database returns a MultiPolygon use ST_NumGeometries(pt.geom) to count the number of polygons
 | 
				
			||||||
 | 
					            // If necessary use WHERE T_NumGeometries(pt.geom) = 1 to use only single polygons
 | 
				
			||||||
 | 
					            string connectionString = dbparcels.GetConnectionString();
 | 
				
			||||||
 | 
					            string readSql = string.Format(
 | 
				
			||||||
 | 
					@"
 | 
				
			||||||
 | 
					SELECT pt.arbid, pt.crop, pt.year, gml.lastwenrdate, ST_AsGeoJSON(ST_Transform((ST_DUMP(pt.geom)).geom::geometry(Polygon),4326)) AS geojson_polygon_wgs84
 | 
				
			||||||
 | 
					FROM {0}.{1} pt, {0}.{2} gml
 | 
				
			||||||
 | 
					WHERE
 | 
				
			||||||
 | 
					    pt.arbid = gml.arbid AND
 | 
				
			||||||
 | 
					    pt.crop NOT IN('Tulp', 'Lelie') AND
 | 
				
			||||||
 | 
					    pt.year = 2018
 | 
				
			||||||
 | 
					LIMIT 10;", schemaname, parceltablename, groenmonitorlatestviewname);   //LIMIT 10 for testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                connection.Open();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Read data (run query) = build a list of fields for which to download images
 | 
				
			||||||
 | 
					                NpgsqlCommand command = connection.CreateCommand();
 | 
				
			||||||
 | 
					                command.CommandText = readSql;
 | 
				
			||||||
 | 
					                NpgsqlDataReader dr = command.ExecuteReader();
 | 
				
			||||||
 | 
					                while (dr.Read())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    dataDownloadInput = new BulkSatDownloadInput();
 | 
				
			||||||
 | 
					                    dataDownloadInput.UseCreatedCropfield = false;
 | 
				
			||||||
 | 
					                    dataDownloadInput.DownloadFolder = "C:\\workdir\\groenmonitor\\";
 | 
				
			||||||
 | 
					                    dataDownloadInput.fieldID = dr.GetInt16(0);
 | 
				
			||||||
 | 
					                    dataDownloadInput.fieldName = string.Format($"{parceltablename}_fld{dataDownloadInput.fieldID}");
 | 
				
			||||||
 | 
					                    dataDownloadInput.cropName = dr.GetString(1);
 | 
				
			||||||
 | 
					                    dataDownloadInput.cropYear = dr.GetInt16(2);
 | 
				
			||||||
 | 
					                    dataDownloadInput.lastdownloadedimagedate = dr.GetDateTime(3);
 | 
				
			||||||
 | 
					                    dataDownloadInput.GeometryJson = JObject.Parse(dr.GetString(4));
 | 
				
			||||||
 | 
					                    fieldsInputs.Add(dataDownloadInput);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                connection.Close();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // For testing using json input instead of database input
 | 
				
			||||||
 | 
					            var fieldsInputJson = File.ReadAllText("BulkSatDownloadInput.json");
 | 
				
			||||||
 | 
					            List<BulkSatDownloadInput> fieldsInputs2 = JsonConvert.DeserializeObject<List<BulkSatDownloadInput>>(fieldsInputJson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Now for each input download all images. Use fieldsInputs or fieldsInputs2 for testing
 | 
				
			||||||
 | 
					            foreach (var input in fieldsInputs2)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    await Process(roots, input);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception ex)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _logger.LogError(ex.Message);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private async Task Process(List<UserRoot> roots, BulkSatDownloadInput input)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            string DownloadFolder = input.DownloadFolder;
 | 
				
			||||||
 | 
					            if (!Directory.Exists(DownloadFolder))
 | 
				
			||||||
 | 
					                Directory.CreateDirectory(DownloadFolder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // !!specify if you are using an already created cropfield:
 | 
				
			||||||
 | 
					            bool useCreatedCropfield = input.UseCreatedCropfield;
 | 
				
			||||||
 | 
					            string settingsfile = $"Settings_BulkSatDownloadApplication.json";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LoadSettings(settingsfile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded");
 | 
				
			||||||
 | 
					            if (uploadedRoot == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogError("Could not find a needed root item");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var myDriveRoot = roots.SingleOrDefault(r => r.Name == "My drive");
 | 
				
			||||||
 | 
					            if (myDriveRoot == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogError("Could not find a needed root item");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Use already created cropfield or create new one
 | 
				
			||||||
 | 
					            Item cropfieldItem;
 | 
				
			||||||
 | 
					            if (useCreatedCropfield == false || string.IsNullOrEmpty(_settings.CropfieldItemCode))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogInformation(string.Format($"Creating cropfield for a field in the year {input.cropYear}"));
 | 
				
			||||||
 | 
					                //string geomjson = input.GeometryJson.ToString(Formatting.None); //"{\"type\":\"Polygon\",\"coordinates\":[[[4.960707146896585,52.80058366970849],[4.960645975538824,52.80047021761092],[4.962140695752897,52.7991771471948],[4.967523821195745,52.80150240004121],[4.966336768950911,52.80254373587981],[4.96171188076433,52.80100999685643],[4.960707146896585,52.80058366970849]]]}"
 | 
				
			||||||
 | 
					                string geomjson = input.GeometryJson.ToString(Formatting.None); 
 | 
				
			||||||
 | 
					                cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDriveRoot.Code,
 | 
				
			||||||
 | 
					                    $"DataCropfield {input.cropName}", input.cropYear, input.GeometryJson.ToString(Formatting.None));
 | 
				
			||||||
 | 
					                _settings.CropfieldItemCode = cropfieldItem.Code;
 | 
				
			||||||
 | 
					                SaveSettings(settingsfile);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.LogInformation("Cropfield already exists, trying to get it");
 | 
				
			||||||
 | 
					                cropfieldItem = await _farmmapsApiService.GetItemAsync(_settings.CropfieldItemCode);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // check if satellite task not yet done, do here and save taskcode
 | 
				
			||||||
 | 
					            if (useCreatedCropfield == false || string.IsNullOrEmpty(_settings.SatelliteTaskCode))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var satelliteTaskCode = await _generalService.RunSatelliteTask(cropfieldItem);
 | 
				
			||||||
 | 
					                _settings.SatelliteTaskCode = satelliteTaskCode;
 | 
				
			||||||
 | 
					                SaveSettings(settingsfile);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Now get the tiffs
 | 
				
			||||||
 | 
					            List<Item> satelliteTiffs = await _generalService.FindSatelliteItemsAll(cropfieldItem, _settings.SatelliteTaskCode);
 | 
				
			||||||
 | 
					            _logger.LogInformation(string.Format($"Downloading {satelliteTiffs.Count} geotiffs for a field in year {input.cropYear} ..."));
 | 
				
			||||||
 | 
					            foreach (Item satalliteItem in satelliteTiffs) {
 | 
				
			||||||
 | 
					                // download the geotiff. Returns a zip file with always these three files: 
 | 
				
			||||||
 | 
					                // data.dat.aux.xml
 | 
				
			||||||
 | 
					                // thumbnail.jpg
 | 
				
			||||||
 | 
					                // wenr.tif. Contains 5 layers: (1) ndvi, (2) wdvi, (3) Red, (4) Green and (5) Blue
 | 
				
			||||||
 | 
					                DateTime SatelliteImageDate = (DateTime)satalliteItem.DataDate;
 | 
				
			||||||
 | 
					                string SatelliteDate = SatelliteImageDate.ToString("yyyyMMdd");
 | 
				
			||||||
 | 
					                string fileName = string.Format($"{input.cropName}_{input.fieldName}_{SatelliteDate}"); // assuming the fieldName is good enough for an ID. One might add here _{input.fieldID} or _{input.cropName}
 | 
				
			||||||
 | 
					                string fileNameZip = string.Format($"{fileName}.zip");
 | 
				
			||||||
 | 
					                string fileNameGeotiff = string.Format($"{fileName}.tif");
 | 
				
			||||||
 | 
					                await _farmmapsApiService.DownloadItemAsync(satalliteItem.Code, Path.Combine(DownloadFolder, fileNameZip));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Extract the file "wenr.tif" from zip, rename it, delete "wenr.tif". overwriteFiles = true
 | 
				
			||||||
 | 
					                ZipFile.ExtractToDirectory(Path.Combine(DownloadFolder, fileNameZip), DownloadFolder, true);
 | 
				
			||||||
 | 
					                File.Delete(Path.Combine(DownloadFolder, fileNameGeotiff)); // Delete the fileNameGeotiff file if exists
 | 
				
			||||||
 | 
					                File.Move(Path.Combine(DownloadFolder, "wenr.tif"), Path.Combine(DownloadFolder, fileNameGeotiff)); // Rename the oldFileName into newFileName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Cleanup
 | 
				
			||||||
 | 
					                string[] filesToDelete = new string[] { fileNameZip, "wenr.tif", "thumbnail.jpg", "data.dat.aux.xml" };
 | 
				
			||||||
 | 
					                foreach (string f in filesToDelete)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    File.Delete(Path.Combine(DownloadFolder, f));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Functions to save previously created cropfields
 | 
				
			||||||
 | 
					        private void LoadSettings(string file)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (File.Exists(file))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var jsonText = File.ReadAllText(file);
 | 
				
			||||||
 | 
					                _settings = JsonConvert.DeserializeObject<Settings>(jsonText);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _settings = new Settings();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void SaveSettings(string file)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_settings == null)
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var json = JsonConvert.SerializeObject(_settings);
 | 
				
			||||||
 | 
					            File.WriteAllText(file, json);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        private void SaveInfo(string file)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_settings == null)
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var json = JsonConvert.SerializeObject(_settings);
 | 
				
			||||||
 | 
					            File.WriteAllText(file, json);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										293
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadInput.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadInput.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,293 @@
 | 
				
			|||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2021,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2021-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2020,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2020-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2019,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2019-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2018,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2018-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2017,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2017-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "UseCreatedCropfield": false,
 | 
				
			||||||
 | 
					    "fieldName": "fld5641", // FarmMaps won't do without a fieldName
 | 
				
			||||||
 | 
					    "DownloadFolder": "C:\\workdir\\groenmonitor\\", //"C:\\workdir\\groenmonitor\\"; // "Downloads" -> if you just put  "Downloads" the program will download to somewhere in ..\FarmMapsApiClient_WURtest\FarmmapsDataDownload\bin\Debug\netcoreapp3.1\Downloads\
 | 
				
			||||||
 | 
					    "cropName": "wheat",
 | 
				
			||||||
 | 
					    "cropYear": 2016,
 | 
				
			||||||
 | 
					    "fieldID": 5641,
 | 
				
			||||||
 | 
					    "lastdownloadedimagedate": "2016-01-01",
 | 
				
			||||||
 | 
					    "geometryJson": {
 | 
				
			||||||
 | 
					      "type": "Polygon",
 | 
				
			||||||
 | 
					      "coordinates": [
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ],
 | 
				
			||||||
 | 
					          [ 3.38065689232502, 51.3212527499355 ],
 | 
				
			||||||
 | 
					          [ 3.38022924592256, 51.3210683536359 ],
 | 
				
			||||||
 | 
					          [ 3.37980548452565, 51.3208801127141 ],
 | 
				
			||||||
 | 
					          [ 3.37959556105776, 51.3207540143696 ],
 | 
				
			||||||
 | 
					          [ 3.3793691292654, 51.3205959677371 ],
 | 
				
			||||||
 | 
					          [ 3.37822219207335, 51.3215667913007 ],
 | 
				
			||||||
 | 
					          [ 3.37816999925795, 51.3216109809456 ],
 | 
				
			||||||
 | 
					          [ 3.37646704574705, 51.3208025481261 ],
 | 
				
			||||||
 | 
					          [ 3.37646695791282, 51.3208025061493 ],
 | 
				
			||||||
 | 
					          [ 3.37608401443192, 51.3206231652693 ],
 | 
				
			||||||
 | 
					          [ 3.37607169507628, 51.3206173959751 ],
 | 
				
			||||||
 | 
					          [ 3.37606021048754, 51.320612017601 ],
 | 
				
			||||||
 | 
					          [ 3.37582728410659, 51.3205029306946 ],
 | 
				
			||||||
 | 
					          [ 3.37580409779263, 51.3206502985963 ],
 | 
				
			||||||
 | 
					          [ 3.37575872019649, 51.3207993094705 ],
 | 
				
			||||||
 | 
					          [ 3.37575476634361, 51.3208122883487 ],
 | 
				
			||||||
 | 
					          [ 3.37571181656268, 51.3208797459348 ],
 | 
				
			||||||
 | 
					          [ 3.3756624532907, 51.3209415238446 ],
 | 
				
			||||||
 | 
					          [ 3.37557609963811, 51.3210110142077 ],
 | 
				
			||||||
 | 
					          [ 3.37541089899821, 51.3211055871218 ],
 | 
				
			||||||
 | 
					          [ 3.37477516102591, 51.3214102985009 ],
 | 
				
			||||||
 | 
					          [ 3.37473173914127, 51.3214311108204 ],
 | 
				
			||||||
 | 
					          [ 3.37455904622072, 51.3215138815012 ],
 | 
				
			||||||
 | 
					          [ 3.37415098054777, 51.3217199232877 ],
 | 
				
			||||||
 | 
					          [ 3.37313700916272, 51.3222422862785 ],
 | 
				
			||||||
 | 
					          [ 3.37748824689601, 51.3242852920348 ],
 | 
				
			||||||
 | 
					          [ 3.37749760805371, 51.3242713084009 ],
 | 
				
			||||||
 | 
					          [ 3.37811903757028, 51.3233437635596 ],
 | 
				
			||||||
 | 
					          [ 3.37818758851947, 51.3232647797363 ],
 | 
				
			||||||
 | 
					          [ 3.37823803668144, 51.3232236798646 ],
 | 
				
			||||||
 | 
					          [ 3.37837807779104, 51.3231095796538 ]
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										29
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadService.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								FarmmapsBulkSatDownload/BulkSatDownloadService.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Globalization;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi.Models;
 | 
				
			||||||
 | 
					using FarmmapsApi.Services;
 | 
				
			||||||
 | 
					using FarmmapsBulkSatDownload.Models;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					using static FarmmapsApi.Extensions;
 | 
				
			||||||
 | 
					using static FarmmapsApiSamples.Constants;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsBulkSatDownload
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class BulkSatDownloadService
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private readonly ILogger<BulkSatDownloadService> _logger;
 | 
				
			||||||
 | 
					        private readonly FarmmapsApiService _farmmapsApiService;
 | 
				
			||||||
 | 
					        private readonly GeneralService _generalService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public BulkSatDownloadService(ILogger<BulkSatDownloadService> logger, FarmmapsApiService farmmapsApiService,
 | 
				
			||||||
 | 
					            GeneralService generalService)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _logger = logger;
 | 
				
			||||||
 | 
					            _farmmapsApiService = farmmapsApiService;
 | 
				
			||||||
 | 
					            _generalService = generalService;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								FarmmapsBulkSatDownload/DBsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								FarmmapsBulkSatDownload/DBsettings.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "User": "",
 | 
				
			||||||
 | 
					  "Password": "",
 | 
				
			||||||
 | 
					  "Database": "",
 | 
				
			||||||
 | 
					  "Host": ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								FarmmapsBulkSatDownload/FarmmapsBulkSatDownload.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								FarmmapsBulkSatDownload/FarmmapsBulkSatDownload.csproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					<Project Sdk="Microsoft.NET.Sdk">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <PropertyGroup>
 | 
				
			||||||
 | 
					        <OutputType>Exe</OutputType>
 | 
				
			||||||
 | 
					        <TargetFramework>netcoreapp3.1</TargetFramework>
 | 
				
			||||||
 | 
					    </PropertyGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <ItemGroup>
 | 
				
			||||||
 | 
					      <PackageReference Include="Npgsql" Version="5.0.5" />
 | 
				
			||||||
 | 
					    </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <ItemGroup>
 | 
				
			||||||
 | 
					      <None Update="appsettings.json">
 | 
				
			||||||
 | 
					        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 | 
				
			||||||
 | 
					      </None>
 | 
				
			||||||
 | 
					      <None Update="Data\**\*">
 | 
				
			||||||
 | 
					        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 | 
				
			||||||
 | 
					      </None>
 | 
				
			||||||
 | 
					      <None Update="BulkSatDownloadInput.json">
 | 
				
			||||||
 | 
					        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 | 
				
			||||||
 | 
					      </None>
 | 
				
			||||||
 | 
					      <None Update="DBsettings.json">
 | 
				
			||||||
 | 
					        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 | 
				
			||||||
 | 
					      </None>
 | 
				
			||||||
 | 
					    </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <ItemGroup>
 | 
				
			||||||
 | 
					      <ProjectReference Include="..\FarmmapsApi\FarmmapsApi.csproj" />
 | 
				
			||||||
 | 
					    </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										18
									
								
								FarmmapsBulkSatDownload/Models/BulkSatDownloadInput.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								FarmmapsBulkSatDownload/Models/BulkSatDownloadInput.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsBulkSatDownload.Models
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class BulkSatDownloadInput
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public bool UseCreatedCropfield { get; set; }
 | 
				
			||||||
 | 
					        public string fieldName { get; set; }
 | 
				
			||||||
 | 
					        public string DownloadFolder { get; set; }
 | 
				
			||||||
 | 
					        public string cropName { get; set; }
 | 
				
			||||||
 | 
					        public int cropYear { get; set; }
 | 
				
			||||||
 | 
					        public int fieldID { get; set; }
 | 
				
			||||||
 | 
					        public DateTime lastdownloadedimagedate { get; set; }
 | 
				
			||||||
 | 
					        public JObject GeometryJson { get; set; }
 | 
				
			||||||
 | 
					        //public string fieldName { get { return string.Format($"{cropName}_fld{fieldID}"); } }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										47
									
								
								FarmmapsBulkSatDownload/Models/DB.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								FarmmapsBulkSatDownload/Models/DB.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using Npgsql;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsApi.Services
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DB
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string Database;
 | 
				
			||||||
 | 
					        public string User;
 | 
				
			||||||
 | 
					        public string Password;
 | 
				
			||||||
 | 
					        public string Host;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string GetConnectionString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
 | 
				
			||||||
 | 
					            sb.Database = Database;
 | 
				
			||||||
 | 
					            sb.Host = Host;
 | 
				
			||||||
 | 
					            sb.Username = User;
 | 
				
			||||||
 | 
					            sb.Password = Password;
 | 
				
			||||||
 | 
					            sb.Port = 5432;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return sb.ConnectionString;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int ExecuteNonQuery(string sql)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            using (NpgsqlConnection conn = new NpgsqlConnection(GetConnectionString()))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                conn.Open();
 | 
				
			||||||
 | 
					                NpgsqlCommand command = conn.CreateCommand();
 | 
				
			||||||
 | 
					                command.CommandText = sql;
 | 
				
			||||||
 | 
					                int r = command.ExecuteNonQuery();
 | 
				
			||||||
 | 
					                return r;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public NpgsqlConnection CreateConnection()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            NpgsqlConnection conn = new NpgsqlConnection(GetConnectionString());
 | 
				
			||||||
 | 
					            conn.Open();
 | 
				
			||||||
 | 
					            return conn;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										28
									
								
								FarmmapsBulkSatDownload/Models/GroenmonitorTable.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								FarmmapsBulkSatDownload/Models/GroenmonitorTable.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsBulkSatDownload.Models
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class GroenmonitorTable
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //public string parceltablename; //PO20190605: parceltablename added as a field (=column) in the GroenmonitorTable. The GroenmonitorTable contains data from multiple parceltables
 | 
				
			||||||
 | 
					        public int parcelid;
 | 
				
			||||||
 | 
					        public string date;
 | 
				
			||||||
 | 
					        public string source;
 | 
				
			||||||
 | 
					        public int wdvi_pixelcount; //count of pixels with data
 | 
				
			||||||
 | 
					        public double wdvi_max;
 | 
				
			||||||
 | 
					        public double wdvi_mean;
 | 
				
			||||||
 | 
					        public double wdvi_min;
 | 
				
			||||||
 | 
					        public double wdvi_stdev;
 | 
				
			||||||
 | 
					        public double wdvi_median;
 | 
				
			||||||
 | 
					        public double wdvi_p90;
 | 
				
			||||||
 | 
					        public int ndvi_pixelcount; //count of pixels with data
 | 
				
			||||||
 | 
					        public double ndvi_max;
 | 
				
			||||||
 | 
					        public double ndvi_mean;
 | 
				
			||||||
 | 
					        public double ndvi_min;
 | 
				
			||||||
 | 
					        public double ndvi_stdev;
 | 
				
			||||||
 | 
					        public double ndvi_median;
 | 
				
			||||||
 | 
					        public double ndvi_p90;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										11
									
								
								FarmmapsBulkSatDownload/Models/Settings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								FarmmapsBulkSatDownload/Models/Settings.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					namespace FarmmapsBulkSatDownload
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class Settings
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string CropfieldItemCode { get; set; }
 | 
				
			||||||
 | 
					        public string SatelliteTaskCode { get; set; }
 | 
				
			||||||
 | 
					        public string VanDerSatTaskCode { get; set; }
 | 
				
			||||||
 | 
					        public string WatBalTaskCode { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								FarmmapsBulkSatDownload/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								FarmmapsBulkSatDownload/Program.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FarmmapsApi;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FarmmapsBulkSatDownload
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class Program : FarmmapsProgram<BulkSatDownloadApplication>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private static async Task Main(string[] args)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await new Program().Start(args);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void Configure(IServiceCollection serviceCollection)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            serviceCollection.AddLogging()
 | 
				
			||||||
 | 
					                .AddTransient<BulkSatDownloadService>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										152
									
								
								FarmmapsBulkSatDownload/ShowGeotiff.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								FarmmapsBulkSatDownload/ShowGeotiff.r
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
				
			|||||||
 | 
					# ShowGeotiff.r
 | 
				
			||||||
 | 
					# I downloaded and calculated the stats for the polygon defined in C:\git\FarmMapsApiClient_WURtest\FarmmapsDataDownload\DataDownloadInput.json
 | 
				
			||||||
 | 
					# in which I set "SatelliteBand": "wdvi" and in which in the console I requested image 8 for date '2020-06-14'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					library(raster)
 | 
				
			||||||
 | 
					library(sf)
 | 
				
			||||||
 | 
					library(rgdal)
 | 
				
			||||||
 | 
					setwd("C:/workdir/groenmonitor/")
 | 
				
			||||||
 | 
					# FarmmapsDataDownload generates two files:
 | 
				
			||||||
 | 
					fileGeotiff <- "wenr.tif"
 | 
				
			||||||
 | 
					# fileJpg <- "thumbnail.jpg"
 | 
				
			||||||
 | 
					# FarmmapsBulkSatDownload generates many files. Here is what I tried when inputing the same field for a number of years using BulkSatDownloadInput.json
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20210224.tif"	# 2 files for year 2021. This file is a nice example having in upperleft corner no data
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20210331.tif"	# 2 files for year 2021
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20200321.tif"	# 14 files for year 2020, earliest
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20200922.tif"	# 14 files for year 2020, latest
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20190121.tif"	# 9 files for year 2019, earliest
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20191117.tif"	# 9 files for year 2019, latest
 | 
				
			||||||
 | 
					# 1 file for year 2018, with error message 'End of Central Directory record could not be found' and invalid wheat_fld5641_20180630.zip 
 | 
				
			||||||
 | 
					# fileGeotiff <- "wheat_fld5641_20170526.tif"	# 1 file for year 2017
 | 
				
			||||||
 | 
					# Zero files for 2016
 | 
				
			||||||
 | 
					lenfilename <- nchar(fileGeotiff)
 | 
				
			||||||
 | 
					year <- substr(fileGeotiff,lenfilename-11,lenfilename-8)
 | 
				
			||||||
 | 
					imgdate <- substr(fileGeotiff,lenfilename-11,lenfilename-4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The thumbnail has the polygon clipped out, has 1 layer, no crs and the mean value is not the mean wdvi we are looking for
 | 
				
			||||||
 | 
					# r.thumbnail <- raster(fileJpg)
 | 
				
			||||||
 | 
					# plot(r.thumbnail)
 | 
				
			||||||
 | 
					# crs(r.thumbnail)
 | 
				
			||||||
 | 
					# CRS arguments: NA 
 | 
				
			||||||
 | 
					# cellStats(r.thumbnail,'mean')	#59.91667
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stk.wenr <- stack(x=fileGeotiff)
 | 
				
			||||||
 | 
					# plot(stk.wenr) shows 5 plots (5 bands)
 | 
				
			||||||
 | 
					# I think these are:
 | 
				
			||||||
 | 
					# 1. ndvi (since it runs from 0 to 1)
 | 
				
			||||||
 | 
					# 2. wdvi (since it runs from 0 to 0.5)
 | 
				
			||||||
 | 
					# 3-5: RGB (since they run from 0 to 255)
 | 
				
			||||||
 | 
					plot(stk.wenr)
 | 
				
			||||||
 | 
					# CRS arguments:
 | 
				
			||||||
 | 
					# +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs
 | 
				
			||||||
 | 
					# Or use st_crs(stk.wenr) to get more info, but no EPSG code in there. 
 | 
				
			||||||
 | 
					# Likely it is epsg:28992 (Amersfoort)
 | 
				
			||||||
 | 
					crs(stk.wenr)
 | 
				
			||||||
 | 
					stk.wenr <- projectRaster(stk.wenr, crs = CRS('+init=EPSG:28992'))
 | 
				
			||||||
 | 
					crs(stk.wenr)
 | 
				
			||||||
 | 
					# Looks the same but strangely, if we don't do projectRaster(stk.wenr, crs = CRS('+init=EPSG:28992')), we find below the bottom left corner of the polygon missing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r.wenr.rd.wdvi <- subset(stk.wenr,2)
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.wenr.rd.wdvi,main=paste("wdvi",imgdate),xlab="RDX",ylab="RDY")
 | 
				
			||||||
 | 
					cellStats(r.wenr.rd.wdvi,'mean')	#0.1654627
 | 
				
			||||||
 | 
					# Same as in downloaded file SatelliteDataStatistics_test_satData_wdvi_2020-06-14.csv
 | 
				
			||||||
 | 
					# "mean": 0.16564258790046743
 | 
				
			||||||
 | 
					# So FindSatelliteItem in C:\git\FarmMapsApiClient_WURtest\FarmmapsApi\Services\GeneralService.cs returns a a stacked geotiff in 
 | 
				
			||||||
 | 
					# i.e. the cellstats are calculated from the rectangle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Furthermore we can see
 | 
				
			||||||
 | 
					# shows coordinates in RD
 | 
				
			||||||
 | 
					# returns a rectangle, thus the shape of the polygon submitted is not clipped. 
 | 
				
			||||||
 | 
					# The polygon was provided in WGS84. Let's draw it on top. 
 | 
				
			||||||
 | 
					# First convert the raster to WGS84
 | 
				
			||||||
 | 
					r.wenr.wgs84.wdvi <- projectRaster(r.wenr.rd.wdvi, crs = CRS('+init=EPSG:4326'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Draw a polygon on top of the raster
 | 
				
			||||||
 | 
					# Example polygon p1
 | 
				
			||||||
 | 
					# p1 <- data.frame(id = 1, wkt = 'POLYGON((4.963 52.801, 4.966 52.801, 4.966 52.803, 4.963 52.803, 4.963 52.801))')
 | 
				
			||||||
 | 
					# p1 <- st_as_sf(p1, wkt = 'wkt', crs = targetcrs)
 | 
				
			||||||
 | 
					# plot(p1,add=TRUE, col="transparent",border="black")
 | 
				
			||||||
 | 
					# Draw the polygon on top of the raster
 | 
				
			||||||
 | 
					# Polygon p2 from C:\git\FarmMapsApiClient_WURtest\FarmmapsDataDownload\DataDownloadInput.json
 | 
				
			||||||
 | 
					p2 <- data.frame(id = 1, wkt = gsub("\n","",'POLYGON((
 | 
				
			||||||
 | 
								3.37837807779104   51.3231095796538,
 | 
				
			||||||
 | 
								3.38065689232502   51.3212527499355,
 | 
				
			||||||
 | 
								3.38022924592256   51.3210683536359,
 | 
				
			||||||
 | 
								3.37980548452565   51.3208801127141,
 | 
				
			||||||
 | 
								3.37959556105776   51.3207540143696,
 | 
				
			||||||
 | 
								3.3793691292654   51.3205959677371,
 | 
				
			||||||
 | 
								3.37822219207335   51.3215667913007,
 | 
				
			||||||
 | 
								3.37816999925795   51.3216109809456,
 | 
				
			||||||
 | 
								3.37646704574705   51.3208025481261,
 | 
				
			||||||
 | 
								3.37646695791282   51.3208025061493,
 | 
				
			||||||
 | 
								3.37608401443192   51.3206231652693,
 | 
				
			||||||
 | 
								3.37607169507628   51.3206173959751,
 | 
				
			||||||
 | 
								3.37606021048754   51.320612017601,
 | 
				
			||||||
 | 
								3.37582728410659   51.3205029306946,
 | 
				
			||||||
 | 
								3.37580409779263   51.3206502985963,
 | 
				
			||||||
 | 
								3.37575872019649   51.3207993094705,
 | 
				
			||||||
 | 
								3.37575476634361   51.3208122883487,
 | 
				
			||||||
 | 
								3.37571181656268   51.3208797459348,
 | 
				
			||||||
 | 
								3.3756624532907   51.3209415238446,
 | 
				
			||||||
 | 
								3.37557609963811   51.3210110142077,
 | 
				
			||||||
 | 
								3.37541089899821   51.3211055871218,
 | 
				
			||||||
 | 
								3.37477516102591   51.3214102985009,
 | 
				
			||||||
 | 
								3.37473173914127   51.3214311108204,
 | 
				
			||||||
 | 
								3.37455904622072   51.3215138815012,
 | 
				
			||||||
 | 
								3.37415098054777   51.3217199232877,
 | 
				
			||||||
 | 
								3.37313700916272   51.3222422862785,
 | 
				
			||||||
 | 
								3.37748824689601   51.3242852920348,
 | 
				
			||||||
 | 
								3.37749760805371   51.3242713084009,
 | 
				
			||||||
 | 
								3.37811903757028   51.3233437635596,
 | 
				
			||||||
 | 
								3.37818758851947   51.3232647797363,
 | 
				
			||||||
 | 
								3.37823803668144   51.3232236798646,
 | 
				
			||||||
 | 
								3.37837807779104   51.3231095796538))'))
 | 
				
			||||||
 | 
					p2.wgs84 <- st_as_sf(p2, wkt = 'wkt', crs = CRS('+init=EPSG:4326'))
 | 
				
			||||||
 | 
					# Or other way round, in RD Amersfoort. That looks ok
 | 
				
			||||||
 | 
					p2.rd <- st_transform(p2.wgs84, "+init=epsg:28992")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Have a look at both
 | 
				
			||||||
 | 
					# wg84
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.wenr.wgs84.wdvi,main=paste("wdvi",imgdate),xlab="LON",ylab="LAT")
 | 
				
			||||||
 | 
					plot(p2.wgs84,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					# RD
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.wenr.rd.wdvi,main=paste("wdvi",imgdate),xlab="RDX",ylab="RDY")
 | 
				
			||||||
 | 
					plot(p2.rd,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Let's clip the polygon
 | 
				
			||||||
 | 
					r.wenr.rd.wdvi.pol <- mask(r.wenr.rd.wdvi,p2.rd)
 | 
				
			||||||
 | 
					r.wenr.wgs84.wdvi.pol <- mask(r.wenr.wgs84.wdvi,p2.wgs84)
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.wenr.wgs84.wdvi.pol,main=paste("wdvi",imgdate),xlab="LON",ylab="LAT")
 | 
				
			||||||
 | 
					plot(p2.wgs84,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					#That's what we want! Now compare the stats
 | 
				
			||||||
 | 
					cellStats(r.wenr.rd.wdvi,'mean')	#0.1654627 # Stats from rectangle, RD
 | 
				
			||||||
 | 
					cellStats(r.wenr.wgs84.wdvi,'mean')	#0.1656399 # Stats from rectangle, WGS84
 | 
				
			||||||
 | 
					cellStats(r.wenr.rd.wdvi.pol,'mean')	#0.1658702 # Stats from raster clipped by polygon, WGS84
 | 
				
			||||||
 | 
					cellStats(r.wenr.wgs84.wdvi.pol,'mean')	#0.1658611 # Stats from raster clipped by polygon, WGS84
 | 
				
			||||||
 | 
					# Conclusion: in this example little difference, but can be quite different!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The project FarmmapsNbs can generate a wenr.tif file, application.tif, uptake.tif (in rtest1.uptake.zip)and shape.shp (in rtest1.taskmap.zip)
 | 
				
			||||||
 | 
					r.application <- raster("C:/git/FarmMapsApiClient_WURtest/FarmmapsNbs/bin/Debug/netcoreapp3.1/Downloads/application.tif")
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.application)
 | 
				
			||||||
 | 
					plot(p2.rd,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					# The application.tif file is a rectangle (polygon not yet clipped), in projection Amersfoort RD New (EPSG:28992)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r.uptake <- raster("C:/git/FarmMapsApiClient_WURtest/FarmmapsNbs/bin/Debug/netcoreapp3.1/Downloads/uptake.tif")
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.uptake)
 | 
				
			||||||
 | 
					plot(p2.rd,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					# The uptake.tif file is a rectangle (polygon not yet clipped), in projection Amersfoort RD New (EPSG:28992)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shp.wgs84 <- readOGR(dsn="C:/git/FarmMapsApiClient_WURtest/FarmmapsNbs/bin/Debug/netcoreapp3.1/Downloads", layer="shape")
 | 
				
			||||||
 | 
					crs(shp.wgs84)
 | 
				
			||||||
 | 
					# CRS arguments: +proj=longlat +datum=WGS84 +no_defs
 | 
				
			||||||
 | 
					dev.off()
 | 
				
			||||||
 | 
					plot(r.wenr.wgs84.wdvi,main="wdvi",xlab="LON",ylab="LAT")
 | 
				
			||||||
 | 
					plot(shp.wgs84,add=TRUE, col="transparent",border="black")
 | 
				
			||||||
 | 
					plot(p2.wgs84,add=TRUE, col="transparent",border="red")
 | 
				
			||||||
 | 
					# The shape file is in WGS84
 | 
				
			||||||
							
								
								
									
										10
									
								
								FarmmapsBulkSatDownload/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								FarmmapsBulkSatDownload/appsettings.json
									
									
									
									
									
										Normal file
									
								
							@@ -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" ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user