private void WritePointData(string outputfile, List <string> points) { HandleFileInput fileops = new HandleFileInput(); System.IO.FileStream csvfilestream; //crossing streams... //it's okay as long as caller remembers to wrap it in using() { } using (csvfilestream = fileops.CheckandCreateCSV(outputfile)) { if (csvfilestream == null) { Console.WriteLine(" [-] Could not create file for editing. Exiting"); return; } foreach (var point in points) { byte[] datatowrite = new UTF8Encoding(true).GetBytes(point); csvfilestream.Write(datatowrite, 0, datatowrite.Length); } } // in case the file stream is still open if (csvfilestream != null) { csvfilestream.Dispose(); } return; }
private IEnumerable <List <string> > ReturnClusterCoords(string filepath) { HandleFileInput fileinput = new HandleFileInput(); //more LINQ weirdness //group list elements into new lists by third comma-separated element in sublist, which represents the tile name //shouldn't be needed anymore now that csv's are output per-tile, will probably remove var groupedlist = from l in HandleFileInput.ReadFromCSV(filepath).Skip(1) let x = l.Split(',') group l by x[6] into g select g.ToList(); return(groupedlist); }
static void Main(string[] args) { int row = 0; int col = 0; string inputdirectory = string.Empty; string outputfile = string.Empty; string argshelp = string.Empty; string maskshpfile = string.Empty; List <string> searchresults; List <string> masktilenames; List <string> maskresults; HandleFileInput fileops = new HandleFileInput(); FindNoDataPixels findpix = new FindNoDataPixels(); CreateConvexHullShp convexhull = new CreateConvexHullShp(); GetSpatialReference getspatialref = new GetSpatialReference(); GenerateMaskList maskinput = new GenerateMaskList(); argshelp = String.Concat(argshelp, "Mandatory Arguments:\r\n"); argshelp = String.Concat(argshelp, "-i\t\t\tinput directory (must be a valid, existing directory)\r\n"); argshelp = String.Concat(argshelp, "-o\t\t\toutput file (.shp format)\r\n"); argshelp = String.Concat(argshelp, "Optional Arguments:\r\n"); argshelp = String.Concat(argshelp, "-m\t\t\tmask shapefile to limit which tiffs are processed"); //make sure program has been provided the correct args if (args.Length < 4) { Console.WriteLine(argshelp); return; } if (!(args.Contains <String>("-i") && args.Contains <String>("-o"))) { Console.WriteLine(argshelp); return; } for (var x = 0; x < args.Count(); x++) { switch (args[x].Trim()) { case "-i": inputdirectory = args.Length == (x + 1) ? "" : args[++x]; break; case "-o": outputfile = args.Length == (x + 1) ? "" : args[++x]; break; case "-m": maskshpfile = args.Length == (x + 1) ? "" : args[++x]; break; } } if (!String.IsNullOrEmpty(inputdirectory)) { // get the file attributes for file or directory FileAttributes attr = new FileAttributes(); try { attr = File.GetAttributes(inputdirectory); } catch (FileNotFoundException) { Console.WriteLine(" [-] Directory does not exist"); return; } if ((attr & FileAttributes.Directory) != FileAttributes.Directory) { Console.WriteLine(" [-] Argument must be a directory"); return; } } else { Console.WriteLine(argshelp); return; } if (!String.IsNullOrEmpty(outputfile)) { if (!(Path.GetExtension(outputfile) == ".shp")) { Console.WriteLine(" [-] Argument must be a .shp file."); return; } if (File.Exists(outputfile)) { Console.WriteLine(" [-] {0} already exists.", outputfile); return; } } else { Console.WriteLine(argshelp); return; } if (!String.IsNullOrEmpty(maskshpfile)) { if (!(Path.GetExtension(maskshpfile) == ".shp")) { Console.WriteLine(" [-] Argument must be a .shp file."); return; } if (File.Exists(outputfile)) { Console.WriteLine(" [-] {0} already exists.", outputfile); return; } } //register gdal/ogr drivers GdalConfiguration.ConfigureGdal(); GdalConfiguration.ConfigureOgr(); //find all tif files in directory from args Console.WriteLine(">Searching directory for tiffs... "); searchresults = fileops.GetTifFilePathsFromDirectory(inputdirectory); if (!searchresults.Any()) { Console.WriteLine(" [-] Invalid directory or no tifs found. Exiting."); return; } else { Console.WriteLine(" [+] {0} Files found.", searchresults.Count); } if (!String.IsNullOrEmpty(maskshpfile)) { Console.WriteLine(">Finding files matching shapefile features..."); maskresults = new List <string>(); masktilenames = maskinput.GetTileNameFromShapefile(maskshpfile); foreach (var filename in searchresults) { foreach (var tilename in masktilenames) { if (tilename.Trim() == Path.GetFileNameWithoutExtension(filename)) { maskresults.Add(filename); } } } searchresults = maskresults; if (!searchresults.Any()) { Console.WriteLine(" [-] Could not find any matches. Exiting."); return; } } //find the coordinates of all pixels that are likely to be data voids Console.WriteLine(">Parsing tiffs for black pixels... "); string outputdir = Path.GetDirectoryName(outputfile); string csvdirectory = fileops.CreateCSVDirectory(outputdir); if (String.IsNullOrEmpty(csvdirectory)) { Console.WriteLine(" [-] Could not create output files. Exiting."); return; } row = Console.CursorTop - 1; col = Console.CursorLeft + 35; var spinner = new Spinner(col, row); spinner.Start(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int i = 0; foreach (var result in searchresults) { Console.SetCursorPosition((Console.CursorLeft), (Console.CursorTop)); Console.Write(" [+] {0} out of {1} files processed", i, searchresults.Count); findpix.FindNoDataXYCoords(result, csvdirectory); i += 1; } spinner.Stop(); stopwatch.Stop(); TimeSpan ts = stopwatch.Elapsed; Console.WriteLine(" [+] Finished processing. Processing time: {0:hh\\:mm\\:ss}", ts); //see if any results were actually returned if (!ResultCoords.csvfiles.Any()) { Console.WriteLine(" [-] No data voids found! Nothing left to do."); return; } //write output to shapefile //shp will contain multipoint features, one for each tiff Console.WriteLine(">Retrieving Projection Reference..."); string spatialref = getspatialref.GetSpatialReferenceFromPath(searchresults.First()); if (spatialref == null) { Console.WriteLine(" [-] Could not retrieve projection reference. Exiting."); return; } Console.WriteLine(" [+] Got projection reference."); Console.WriteLine(">Creating shapefile..."); convexhull.CreateShapeFile(spatialref, outputfile); Console.WriteLine(" [+] Done!"); Console.WriteLine(">Dissolving features..."); string outshp = Path.ChangeExtension(outputfile, null) + "_dissolved.shp"; convexhull.DissolveFeatures(outputfile, outshp, spatialref); Console.WriteLine(" [+] Done!"); Console.WriteLine(">Cleaning Up..."); try { Directory.Delete(csvdirectory, true); } catch (Exception) { Console.WriteLine(" [-] Could not delete temp data."); } Console.WriteLine(" [+] Done!"); }