public static Position TryExtractPositionFromFile(string file) { Console.WriteLine(file); IReadOnlyList <Directory> directories; try { directories = ImageMetadataReader.ReadMetadata(file); } catch (ImageProcessingException) { Console.WriteLine("Unable to process {0}", file); return(null); } if (!directories.Any()) { return(null); } var latitude = directories.SelectMany(x => x.Tags).FirstOrDefault(t => t.Name == "GPS Latitude"); var longitude = directories.SelectMany(x => x.Tags).FirstOrDefault(t => t.Name == "GPS Longitude"); var date = directories.SelectMany(x => x.Tags).FirstOrDefault(t => t.Name == "GPS Date Stamp"); var time = directories.SelectMany(x => x.Tags).FirstOrDefault(t => t.Name == "GPS Time-Stamp"); var dilutionOfPrecision = directories.SelectMany(x => x.Tags).Where(t => t.Name.StartsWith("GPS DOP")).FirstOrDefault(); // sometimes DOP is represented as rational value (numerator, denominator), sometimes as double. if (latitude != null && longitude != null && date != null && time != null) { var dateTime = $"{date.Description} {time.Description}"; Console.WriteLine(dateTime); Console.WriteLine(gpsFormat); var dateTimeUtc = DateTimeOffset.ParseExact(dateTime, gpsFormat, null, System.Globalization.DateTimeStyles.AssumeUniversal); Console.WriteLine("[{0}]: {1}, {2}", dateTimeUtc, latitude.Description, longitude.Description); return(new Position(dateTimeUtc, LatLongParser.ParseString(latitude.Description), LatLongParser.ParseString(longitude.Description), dilutionOfPrecision == null ? 0.0 : ExifParser.ParseRationalOrDouble(dilutionOfPrecision.Description))); } if (latitude != null && longitude != null) { var filesystemTime = directories.SelectMany(x => x.Tags).FirstOrDefault(t => t.Name == "File Modified Date"); if (filesystemTime != null) { var dateTime = DateTimeOffset.ParseExact(filesystemTime.Description, fileModifiedDateFormat, CultureInfo.InvariantCulture); Console.WriteLine("[{0}]: {1}, {2}", dateTime, latitude.Description, longitude.Description); return(new Position(dateTime, LatLongParser.ParseString(latitude.Description), LatLongParser.ParseString(longitude.Description), PositionUnit.WGS84)); } } return(null); }
public void TestParseDouble() { Assertions.AreApproximatelyEqual(3.946, ExifParser.ParseRationalOrDouble("3.946")); }