PHP извлекают GPS данные EXIF

Я хотел бы извлечь тег EXIF GPS из изображений с помощью 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″N 7°26′39″E из Википедии)? Я хотел бы передать координаты thoses API карт Google для отображения позиций изображений по карте!

49
задан fbrereto 26 March 2010 в 10:39
поделиться

3 ответа

Согласно http://en.wikipedia.org/wiki/Geotagging , ([0] => 46/1 [1] => 5403/100 [2] => 0/1) должно означать 46/1 градус, 5403/100 минут, 0/1 секунды, то есть 46 ° 54,03′0 ″ северной широты. Нормализация секунд дает 46 ° 54′1,8 ″ северной широты.

Приведенный ниже код должен работать до тех пор, пока вы не получите отрицательные координаты (учитывая, что вы получаете N / S и E / W как отдельные координаты, у вас никогда не должно быть отрицательных координат). Сообщите мне, если есть ошибка (на данный момент у меня нет подходящей среды PHP).

//Pass in GPS.GPSLatitude or GPS.GPSLongitude or something in that format
function getGps($exifCoord)
{
  $degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
  $minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
  $seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;

  //normalize
  $minutes += 60 * ($degrees - floor($degrees));
  $degrees = floor($degrees);

  $seconds += 60 * ($minutes - floor($minutes));
  $minutes = floor($minutes);

  //extra normalization, probably not necessary unless you get weird data
  if($seconds >= 60)
  {
    $minutes += floor($seconds/60.0);
    $seconds -= 60*floor($seconds/60.0);
  }

  if($minutes >= 60)
  {
    $degrees += floor($minutes/60.0);
    $minutes -= 60*floor($minutes/60.0);
  }

  return array('degrees' => $degrees, 'minutes' => $minutes, 'seconds' => $seconds);
}

function gps2Num($coordPart)
{
  $parts = explode('/', $coordPart);

  if(count($parts) <= 0)// jic
    return 0;
  if(count($parts) == 1)
    return $parts[0];

  return floatval($parts[0]) / floatval($parts[1]);
}
21
ответ дан 7 November 2019 в 11:24
поделиться

Код, который я использовал в прошлом, выглядит примерно так (на самом деле он также проверяет, что данные неопределенно верны):

// Latitude
$northing = -1;
if( $gpsblock['GPSLatitudeRef'] && 'N' == $gpsblock['GPSLatitudeRef'] )
{
    $northing = 1;
}

$northing *= defraction( $gpsblock['GPSLatitude'][0] ) + ( defraction($gpsblock['GPSLatitude'][1] ) / 60 ) + ( defraction( $gpsblock['GPSLatitude'][2] ) / 3600 );

// Longitude
$easting = -1;
if( $gpsblock['GPSLongitudeRef'] && 'E' == $gpsblock['GPSLongitudeRef'] )
{
    $easting = 1;
}

$easting *= defraction( $gpsblock['GPSLongitude'][0] ) + ( defraction( $gpsblock['GPSLongitude'][1] ) / 60 ) + ( defraction( $gpsblock['GPSLongitude'][2] ) / 3600 );

Где у вас также есть:

function defraction( $fraction )
{
    list( $nominator, $denominator ) = explode( "/", $fraction );

    if( $denominator )
    {
        return ( $nominator / $denominator );
    }
    else
    {
        return $fraction;
    }
}
1
ответ дан 7 November 2019 в 11:24
поделиться

Это моя измененная версия. Другие мне не подошли. Он предоставит вам десятичные версии координат GPS.

Код для обработки данных EXIF:

$exif = exif_read_data($filename);
$lon = getGps($exif["GPSLongitude"], $exif['GPSLongitudeRef']);
$lat = getGps($exif["GPSLatitude"], $exif['GPSLatitudeRef']);
var_dump($lat, $lon);

Распечатывается в следующем формате:

float(-33.8751666667)
float(151.207166667)

Вот функции:

function getGps($exifCoord, $hemi) {

    $degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
    $minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
    $seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;

    $flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1;

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

}

function gps2Num($coordPart) {

    $parts = explode('/', $coordPart);

    if (count($parts) <= 0)
        return 0;

    if (count($parts) == 1)
        return $parts[0];

    return floatval($parts[0]) / floatval($parts[1]);
}
87
ответ дан 7 November 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: