diff options
-rw-r--r-- | admin/include/functions_metadata.php | 3 | ||||
-rw-r--r-- | include/functions_metadata.inc.php | 47 | ||||
-rw-r--r-- | install/db/139-database.php | 72 | ||||
-rw-r--r-- | install/piwigo_structure-mysql.sql | 7 |
4 files changed, 125 insertions, 4 deletions
diff --git a/admin/include/functions_metadata.php b/admin/include/functions_metadata.php index 4591017bb..7dc08c57e 100644 --- a/admin/include/functions_metadata.php +++ b/admin/include/functions_metadata.php @@ -122,7 +122,8 @@ function get_sync_metadata_attributes() $update_fields = array_merge( $update_fields, - array_keys($conf['use_exif_mapping']) + array_keys($conf['use_exif_mapping']), + array('latitude', 'longitude') ); } diff --git a/include/functions_metadata.inc.php b/include/functions_metadata.inc.php index 255f8221d..a0ebf5c77 100644 --- a/include/functions_metadata.inc.php +++ b/include/functions_metadata.inc.php @@ -152,7 +152,9 @@ function get_exif_data($filename, $map) // Read EXIF data if ($exif = @read_exif_data($filename)) { - $exif = trigger_event('format_exif_data', $exif, $filename, $map ); + $exif = trigger_event('format_exif_data', $exif, $filename, $map); + + // configured fields foreach ($map as $key => $field) { if (strpos($field, ';') === false) @@ -171,6 +173,20 @@ function get_exif_data($filename, $map) } } } + + // GPS data + $gps_exif = array_intersect_key($exif, array_flip(array('GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude'))); + if (count($gps_exif) == 4) + { + if ( + is_array($gps_exif['GPSLatitude']) and in_array($gps_exif['GPSLatitudeRef'], array('S', 'N')) and + is_array($gps_exif['GPSLongitude']) and in_array($gps_exif['GPSLongitudeRef'], array('W', 'E')) + ) + { + $result['latitude'] = parse_exif_gps_data($gps_exif['GPSLatitude'], $gps_exif['GPSLatitudeRef']); + $result['longitude'] = parse_exif_gps_data($gps_exif['GPSLongitude'], $gps_exif['GPSLongitudeRef']); + } + } } if (!$conf['allow_html_in_metadata']) @@ -186,4 +202,33 @@ function get_exif_data($filename, $map) return $result; } + +/** + * Converts EXIF GPS format to a float value. + * @since 2.6 + * + * @param string[] $raw eg: + * - 41/1 + * - 54/1 + * - 9843/500 + * @param string $ref 'S', 'N', 'E', 'W'. eg: 'N' + * @return float eg: 41.905468 + */ +function parse_exif_gps_data($raw, $ref) +{ + foreach ($raw as &$i) + { + $i = explode('/', $i); + $i = $i[1]==0 ? 0 : $i[0]/$i[1]; + } + unset($i); + + $v = $raw[0] + $raw[1]/60 + $raw[2]/3600; + + $ref = strtoupper($ref); + if ($ref == 'S' or $ref == 'W') $v= -$v; + + return $v; +} + ?>
\ No newline at end of file diff --git a/install/db/139-database.php b/install/db/139-database.php new file mode 100644 index 000000000..d8fc59419 --- /dev/null +++ b/install/db/139-database.php @@ -0,0 +1,72 @@ +<?php +// +-----------------------------------------------------------------------+ +// | Piwigo - a PHP based photo gallery | +// +-----------------------------------------------------------------------+ +// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org | +// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | +// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | +// +-----------------------------------------------------------------------+ +// | This program is free software; you can redistribute it and/or modify | +// | it under the terms of the GNU General Public License as published by | +// | the Free Software Foundation | +// | | +// | This program is distributed in the hope that it will be useful, but | +// | WITHOUT ANY WARRANTY; without even the implied warranty of | +// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | +// | General Public License for more details. | +// | | +// | You should have received a copy of the GNU General Public License | +// | along with this program; if not, write to the Free Software | +// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | +// | USA. | +// +-----------------------------------------------------------------------+ + +if (!defined('PHPWG_ROOT_PATH')) +{ + die('Hacking attempt!'); +} + +$upgrade_description = 'add "latitude" and "longitude" fields'; + +// add fields +$query = ' +ALTER TABLE '. IMAGES_TABLE .' + ADD `latitude` DOUBLE(8, 6) DEFAULT NULL, + ADD `longitude` DOUBLE(9, 6) DEFAULT NULL +;'; +pwg_query($query); + +// add index +$query = ' +ALTER TABLE '. IMAGES_TABLE .' + ADD INDEX `images_i6` (`latitude`) +;'; +pwg_query($query); + +// search for old "lat" field +$query = 'SHOW COLUMNS FROM '. IMAGES_TABLE .' LIKE "lat";'; + +if (pwg_db_num_rows(pwg_query($query))) +{ + // duplicate non-null values + $query = ' +UPDATE '. IMAGES_TABLE .' + SET latitude = lat, + longitude = lon + WHERE lat != NULL + AND lon != NULL +;'; + pwg_query($query); + + // delete old fields + $query = ' +ALTER TABLE '. IMAGES_TABLE .' + DROP `lat`, + DROP `lon` +;'; + pwg_query($query); +} + +echo "\n".$upgrade_description."\n"; + +?> diff --git a/install/piwigo_structure-mysql.sql b/install/piwigo_structure-mysql.sql index d161d40e3..dadad1d1b 100644 --- a/install/piwigo_structure-mysql.sql +++ b/install/piwigo_structure-mysql.sql @@ -196,13 +196,16 @@ CREATE TABLE `piwigo_images` ( `level` tinyint unsigned NOT NULL default '0', `md5sum` char(32) default NULL, `added_by` smallint(5) NOT NULL default '0', - `rotation` tinyint unsigned default null, + `rotation` tinyint unsigned default NULL, + `latitude` double(8, 6) default NULL, + `longitude` double(9, 6) default NULL, PRIMARY KEY (`id`), KEY `images_i2` (`date_available`), KEY `images_i3` (`rating_score`), KEY `images_i4` (`hit`), KEY `images_i5` (`date_creation`), - KEY `images_i1` (`storage_category_id`) + KEY `images_i1` (`storage_category_id`), + KEY `images_i6` (`latitude`) ) ENGINE=MyISAM; -- |