PHP извлечь данные GPS EXIF - PullRequest
       20

PHP извлечь данные GPS EXIF

49 голосов
/ 26 марта 2010

Я хотел бы извлечь тег GPS EXIF ​​из изображений с помощью php. Я использую exif_read_data(), который возвращает массив всех тегов + данные:

GPS.GPSLatitudeRef: N
GPS.GPSLatitude:Array ( [0] => 46/1 [1] => 5403/100 [2] => 0/1 ) 
GPS.GPSLongitudeRef: E
GPS.GPSLongitude:Array ( [0] => 7/1 [1] => 880/100 [2] => 0/1 ) 
GPS.GPSAltitudeRef: 
GPS.GPSAltitude: 634/1

Я не знаю, как интерпретировать 46/1 5403/100 и 0/1? 46 может быть 46 °, но как насчет остальных, особенно 0/1?

angle/1 5403/100 0/1

О чем эта структура?

Как преобразовать их в «стандартные» (например, 46 ° 56′48 ″ с.ш. 7 ° 26′39 ″ в.д. из википедии)? Я хотел бы передать эти координаты в API Google Maps для отображения позиций изображения на карте!

Ответы [ 13 ]

0 голосов
/ 25 июня 2014

Это порт javascript для PHP-кода, размещенного @Gerald выше. Таким образом, вы можете определить местоположение изображения, даже не загружая его, в сочетании с такими библиотеками, как dropzone.js и Javascript-Load-Image

define(function(){

    function parseExif(map) {
        var gps = {
            lng : getGps(map.get('GPSLongitude'), data.get('GPSLongitudeRef')),
            lat : getGps(map.get('GPSLatitude'), data.get('GPSLatitudeRef'))
        }
        return gps;
    }

    function getGps(exifCoord, hemi) {
        var degrees = exifCoord.length > 0 ? parseFloat(gps2Num(exifCoord[0])) : 0,
            minutes = exifCoord.length > 1 ? parseFloat(gps2Num(exifCoord[1])) : 0,
            seconds = exifCoord.length > 2 ? parseFloat(gps2Num(exifCoord[2])) : 0,
            flip = (/w|s/i.test(hemi)) ? -1 : 1;
        return flip * (degrees + (minutes / 60) + (seconds / 3600));
    }

    function gps2Num(coordPart) {
        var parts = (""+coordPart).split('/');
        if (parts.length <= 0) {
            return 0;
        }
        if (parts.length === 1) {
            return parts[0];
        }
        return parts[0] / parts[1];
    }       

    return {
        parseExif: parseExif
    };

});
0 голосов
/ 16 августа 2013

С этими данными GPS:

    ["GPSLatitudeRef"]=>
    string(1) "N"
    ["GPSLatitude"]=>
    array(3) {
        [0]=>
        string(7) "65539/0"
        [1]=>
        string(17) "-1542717440/65539"
        [2]=>
        string(8) "196608/0"
    }
    ["GPSLongitudeRef"]=>
    string(1) "E"
    ["GPSLongitude"]=>
    array(3) {
        [0]=>
        string(20) "39321600/-1166016512"
        [1]=>
        string(21) "1111490956/1811939343"
        [2]=>
        string(22) "1111491292/-1725956081"
    }

Используя приведенный выше код (спасибо Джеральду), я получаю следующие значения широты и долготы:

-392.31537456069,-0.023678137550796

Это не правильно. Это делает мою голову, как код работает, но ответ в этом случае неправильный! Многие другие изображения работают нормально, просто кажется, что не хватает какой-то логики, чтобы удовлетворить что-то в этом виде данных. Например, когда я загружаю изображение в iPhoto (извините за пример Apple для тех, у кого нет Mac), он получает правильный ответ; эти данные EXIF ​​предназначены для изображения вблизи Красного моря.

0 голосов
/ 27 октября 2010

Я использую модифицированную версию от Джеральда Кашубы, но она не точна поэтому я немного изменил формулу.

от

return $flip * ($degrees + $minutes / 60);

изменено на:

return floatval($flip * ($degrees +($minutes/60)+($seconds/3600)));

У меня это работает.

...