Чтение данных Geotag с изображения в php

Кто-нибудь знает, есть ли способ читать геотагные данные из фотографий в PHP?

Спасибо

Ответ 1

Как и все остальные, exif_read_data(); сделаю это. Чтобы продолжить и получить все данные, используйте эти аргументы:

exif_read_data($img, 0, true); // where $img is the path to your image

Эта функция может читать только заголовки из tiffs и jpegs, и я уверен, что только jpeg могут содержать геотаг. Я написал простой php script для использования в командной строке и разместил его как gist на github.

Запустите script следующим образом: php exif.php

Он выведет массив. Найдите координаты здесь:

[GPS] => Array
    [GPSLatitudeRef] => N
    [GPSLatitude] => Array
        [0] => 30/1
        [1] => 1589/100
        [2] => 0/1
    [GPSLongitudeRef] => W
    [GPSLongitude] => Array
        [0] => 87/1
        [1] => 3609/100
        [2] => 0/1
    [GPSAltitudeRef] => 
    [GPSAltitude] => 18289/454
    [GPSTimeStamp] => Array
    [0] => 20/1
    [1] => 22/1
    [2] => 2065/1
    [GPSImgDirectionRef] => T
    [GPSImgDirection] => 34765/689

Массы широты и долготы содержат три значения: 0 для градусов, 1 - минуты, а 2 - секунды. Если вы видите что-то вроде "1589/100", это равно 15.89. Таким образом, для массива GPSLongitude 3609/100 равен 36,09.

Преобразуйте координаты из градусов-минут-второй формы в десятичную форму здесь http://www.satsig.net/degrees-minutes-seconds-calculator.htm

Если широта Юг, не забудьте сделать ее отрицательной. Если долгота на западе, сделайте этот минус. Данные из приведенных выше данных: 30.26483, -87.6015

Ответ 2

Будет ли Coughlin правильным, хотя я сформулировал функцию для быстрой справки, если кто-то наткнулся на ту же проблему.

/**
 * Returns an array of latitude and longitude from the Image file
 * @param image $file
 * @return multitype:number |boolean
 */
function read_gps_location($file){
    if (is_file($file)) {
        $info = exif_read_data($file);
        if (isset($info['GPSLatitude']) && isset($info['GPSLongitude']) &&
            isset($info['GPSLatitudeRef']) && isset($info['GPSLongitudeRef']) &&
            in_array($info['GPSLatitudeRef'], array('E','W','N','S')) && in_array($info['GPSLongitudeRef'], array('E','W','N','S'))) {

            $GPSLatitudeRef  = strtolower(trim($info['GPSLatitudeRef']));
            $GPSLongitudeRef = strtolower(trim($info['GPSLongitudeRef']));

            $lat_degrees_a = explode('/',$info['GPSLatitude'][0]);
            $lat_minutes_a = explode('/',$info['GPSLatitude'][1]);
            $lat_seconds_a = explode('/',$info['GPSLatitude'][2]);
            $lng_degrees_a = explode('/',$info['GPSLongitude'][0]);
            $lng_minutes_a = explode('/',$info['GPSLongitude'][1]);
            $lng_seconds_a = explode('/',$info['GPSLongitude'][2]);

            $lat_degrees = $lat_degrees_a[0] / $lat_degrees_a[1];
            $lat_minutes = $lat_minutes_a[0] / $lat_minutes_a[1];
            $lat_seconds = $lat_seconds_a[0] / $lat_seconds_a[1];
            $lng_degrees = $lng_degrees_a[0] / $lng_degrees_a[1];
            $lng_minutes = $lng_minutes_a[0] / $lng_minutes_a[1];
            $lng_seconds = $lng_seconds_a[0] / $lng_seconds_a[1];

            $lat = (float) $lat_degrees+((($lat_minutes*60)+($lat_seconds))/3600);
            $lng = (float) $lng_degrees+((($lng_minutes*60)+($lng_seconds))/3600);

            //If the latitude is South, make it negative. 
            //If the longitude is west, make it negative
            $GPSLatitudeRef  == 's' ? $lat *= -1 : '';
            $GPSLongitudeRef == 'w' ? $lng *= -1 : '';

            return array(
                'lat' => $lat,
                'lng' => $lng
            );
        }           
    }
    return false;
}

Надеюсь, что это поможет кому-то.

Ответ 4

//вызов этой функции с именем файла

//Perfect Worked.......

$имя_файла = 'XXXXXX'; или $fileName = 'xxxxxxxxx'; echo $return_data = triphoto_getGPS ($ fileName);

функция triphoto_getGPS ($ fileName) {

//get the EXIF all metadata from Images
$exif = exif_read_data($fileName);
if(isset($exif["GPSLatitudeRef"])){
    $LatM = 1; $LongM = 1;
    if($exif["GPSLatitudeRef"] == 'S'){
        $LatM = -1;
    }
    if($exif["GPSLongitudeRef"] == 'W'){
        $LongM = -1;
    }
    //get the GPS data
    $gps['LatDegree']=$exif["GPSLatitude"][0];
    $gps['LatMinute']=$exif["GPSLatitude"][1];
    $gps['LatgSeconds']=$exif["GPSLatitude"][2];
    $gps['LongDegree']=$exif["GPSLongitude"][0];
    $gps['LongMinute']=$exif["GPSLongitude"][1];
    $gps['LongSeconds']=$exif["GPSLongitude"][2];

    //convert strings to numbers
    foreach($gps as $key => $value){
        $pos = strpos($value, '/');
        if($pos !== false){
            $temp = explode('/',$value);
            $gps[$key] = $temp[0] / $temp[1];
        }
    }

//calculate the decimal degree
$result['latitude']  = $LatM * ($gps['LatDegree'] + ($gps['LatMinute'] / 60) + ($gps['LatgSeconds'] / 3600));
$result['longitude'] = $LongM * ($gps['LongDegree'] + ($gps['LongMinute'] / 60) + ($gps['LongSeconds'] / 3600));
$result['datetime']  = $exif["DateTime"];
return $result;

} }

Ответ 5

Вы можете использовать функцию exif_read_data(), если данные геотага встроены в данные EXIF.