]> mj.ucw.cz Git - gallery.git/commitdiff
Cope with craziness of EXIF geo formats
authorMartin Mares <mj@ucw.cz>
Mon, 3 Feb 2014 14:49:20 +0000 (15:49 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 8 Feb 2015 20:14:18 +0000 (21:14 +0100)
gal/bin/gal-gen

index 0c7921a84b0b910e28bb13f050ef2f51944e8c11..dfd434f9ef8568e707eae76a83026c7115ce85ae 100755 (executable)
@@ -65,6 +65,22 @@ sub get_meta_basic($$$) {
        $m->{h} = $h;
 }
 
+sub parse_geo($) {
+       my ($g) = @_;
+       defined $g or return;
+       if ($g =~ m{^([NEWS]) (\d+)\xb0 ([0-9.]+)'$}) {
+               $g = $2 + $3/60;
+               $g = -$g if $1 eq 'W' || $1 eq 'S';
+       } elsif ($g =~ m{^([NEWS]) (\d+)\xb0 (\d+)' ([0-9.]+)$}) {
+               $g = $2 + $3/60 + $4/3600;
+               $g = -$g if $1 eq 'W' || $1 eq 'S';
+       } else {
+               print "[EXIF: unable to parse coordinate $g] ";
+               return;
+       }
+       return sprintf "%.6f", $g;
+}
+
 sub get_meta_exif($$) {
        my ($f, $m) = @_;
        $gal->get('CacheExif') or return;
@@ -77,29 +93,8 @@ sub get_meta_exif($$) {
        }
        # use Data::Dumper; print Dumper($i);
 
-       my $lat = $i->{image}->{'Latitude'};
-       if ($lat) {
-               if ($lat =~ m{^([NS]) (\d+)\xb0 ([0-9.]+)'$}) {
-                       $lat = $2 + $3/60;
-                       $lat = -$lat if $1 eq 'S';
-                       $lat = sprintf "%.6f", $lat;
-               } else {
-                       print "[EXIF: unable to parse latitude $lat] ";
-                       $lat = undef;
-               }
-       }
-
-       my $lon = $i->{image}->{'Longitude'};
-       if ($lon) {
-               if ($lon =~ m{^([WE]) (\d+)\xb0 ([0-9.]+)'$}) {
-                       $lon = $2 + $3/60;
-                       $lon = -$lon if $1 eq 'W';
-                       $lon = sprintf "%.6f", $lon;
-               } else {
-                       print "[EXIF: unable to parse longitude $lon] ";
-                       $lon = undef;
-               }
-       }
+       my $lat = parse_geo($i->{image}->{'Latitude'});
+       my $lon = parse_geo($i->{image}->{'Longitude'});
 
        my $alt = $i->{image}->{'Altitude'};
        if ($alt) {