Cómo analizar la información de EXIF ​​GPS en números decimales lat, lng

9
"EXIF_GPSAltitude": "(220.279)",
"EXIF_GPSLatitude": "(55) (40.711) (0)",
"EXIF_GPSLatitudeRef": "N",
"EXIF_GPSLongitude": "(8) (30.2282) (0)",

¿Cómo debo entender el ejemplo anterior como grado, min, seg?

Algunos datos exif que extraje tienen metadatos enumerados como anteriormente. ¿Se especifican estos formatos en alguna parte? ¿O debería esperar muchos formatos diferentes de posiciones GPS en EXIF?

Necesito escribir un método que proporcione el lat, lng como números decimales basados ​​en datos exif, y no estoy seguro de cuántos formatos diferentes debería poder analizar (aprenderé esto con el tiempo) y esta pregunta es principalmente sobre los ejemplos anteriores. Sé que el grado es de 55 y 8, pero no estoy seguro si son 30 minutos y 0.22 * 60 segundos, y en ese caso, ¿por qué está ahí el 0?

Poul K. Sørensen
fuente
Que sistema operativo Quizás le interese exiftool sno.phy.queensu.ca/~phil/exiftool . Hay un ejecutable para Win o Mac que he utilizado con éxito (archivos por lotes de Windows en mi caso) para extraer información de coordenadas de las fotos.
jbchurchill
2
¿Qué plataforma estás utilizando para analizar la información? ¿A qué estás buscando convertirlo?
Branco
Estoy convirtiendo a lat, lng decimal / valores dobles y estaba en C #. Simplemente necesitaba la información que daba la respuesta.
Poul K. Sørensen

Respuestas:

3

De acuerdo con esta página , los valores de latitud y longitud podrían estar en (1) grados, (2) grados y minutos decimales, o (3) grados, minutos y segundos decimales.

En su ejemplo, (2) es un valor decimal y (3) es cero, por lo que tiene grados, minutos decimales.

Por lo tanto, deberá realizar algunas verificaciones en los tres valores para determinar qué formato se está utilizando.

mkennedy
fuente
Según el estándar exif, hay tres campos "racionales" para cada uno, que contienen grados, minutos y segundos. exiftool normaliza los grados decimales imporoper en D, M, S mientras asigna estos valores, (exiftool -GPSLongitude = "0.5 90 63.12345" junk.jpg "-> GPS Longitud: 2 deg 1 '3.12" W ") Entonces, si necesita grados decimales , sí dd = x0 + x1 / 60. + x2 / 3600. y podría ignorar la no normalización.
Dave X
4

EXIF almacena los códigos GPS como rational64uuna lista de seis números enteros sin signo en el siguiente orden:

[
   degreesNumerator, degreesDenominator, 
   minutesNumerator, minutesDenominator, 
   secondsNumerator, secondsDenominator
]

El formato es consistente y parece que la herramienta que está utilizando ya ha dividido cada par en números decimales, por lo que lo que tiene es:

Lat: 55°   40.711' 0"
Lng:  8°  30.2282' 0"

Si desea convertir a un solo número decimal:

= Degrees + Minutes/60 + Seconds/3600
Jason Stewart
fuente
0

Usé este archivo por lotes para obtener nombres de archivo, fecha / hora y grado decimal

puestos.

************** inicio lalo.bat '-n fuerza los grados decimales con signo exift -nd: \ util \ 00ymp * .jpg> fud' strfile una cadena por línea (espacios ok) findtr / G: "strfile" fud >> fum ********** end lalo.bat

produce salida

Nombre del archivo: 0104171345.jpg Fecha / hora del GPS: 2017: 01: 04 21: 45: 19Z Posición del GPS: 46.9997367777778 -117.3392105 Nombre del archivo: 0104171355.jpg Fecha / hora del GPS: 2017: 01: 04 21: 55: 52Z Posición del GPS : 46.99622725 -117.307495111111 Nombre del archivo: 0104171402.jpg Fecha / hora GPS: 2017: 01: 04 22: 02: 02Z Posición GPS: 47.0075378333333 -117.284553527778 Nombre del archivo: 0104171404.jpg Fecha / hora GPS: 2017: 01: 04 22:04 : 51Z Posición GPS: 47.0222473055556 -117.275527944444 Nombre de archivo: 0104171405.jpg Fecha / hora GPS: 2017: 01: 04 22: 05: 40Z Posición GPS: 47.0269584444444 -117.269523611111

Nombre del archivo: 0112171921.jpg Nombre del archivo: 0112171921a.jpg Nombre del archivo: 0112171921b.jpg Nombre del archivo: 0120171623.jpg Nombre del archivo: 0120171623a.jpg Nombre del archivo: 0120171624.jpg

Nombre del archivo: 0120171626.jpg Fecha / hora GPS: 2017: 01: 21 00: 26: 49Z Posición GPS: 48.7900199722222 -117.290061944444 Nombre del archivo: 0120171628.jpg Fecha / hora GPS: 2017: 01: 21 00: 28: 44Z Posición GPS : 48.7907943611111 -117.292045583333

Nombre del archivo: 0122170942.jpg Nombre del archivo: 0122170942a.jpg Nombre del archivo: 0122170948.jpg Nombre del archivo: 0122170948a.jpg

Nombre del archivo: 0122170950.jpg Fecha / hora GPS: 2017: 01: 22 17: 50: 12Z Posición GPS: 48.7828292777778 -117.287322972222 Nombre del archivo: 0122170950a.jpg Fecha / hora GPS: 2017: 01: 22 17: 50: 16Z Posición GPS : 48.7828483333333 -117.287322972222 Nombre de archivo: 0122170950b.jpg GPS Fecha / Hora: 2017: 01: 22 17: 50: 38Z Posición GPS: 48.7828178333333 -117.28733825

sunwukong
fuente
0

Gracias Jason por la fórmula para convertir a decimal y a /programming/45136895/extracting-gps-numerical-values-from-byte-array-using-powershell

function getGPS ($fullname) 
{
 'Fullname: ' + $fullname
 $imageProperties =New-Object -TypeName System.Drawing.Bitmap -ArgumentList $fullname
 if($imageProperties.PropertyItems|?{($_.id -eq 2) -or ($_.id -eq 4)}){
  [double]$LatDegrees = (([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 0)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 4)));
  [double]$LatMinutes = ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 8)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 12));
  [double]$LatSeconds = ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 16)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(2).Value, 20));
  [double]$LonDegrees = (([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 0)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 4)));
  [double]$LonMinutes = ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 8)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 12));
  [double]$LonSeconds = ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 16)) / ([System.BitConverter]::ToInt32( $imageProperties.GetPropertyItem(4).Value, 20));
  "Latitude: $LatDegrees;$LatMinutes;$LatSeconds"
  "Longitude: $LonDegrees;$LonMinutes;$LonSeconds"
  "DECLatitude: " + ([int]$LatDegrees +($LatMinutes/60) +($LatSeconds/60))
  "DECLongitude: " + ([int]$LonDegrees +($LonMinutes/60) +($LonSeconds/60))
}}

getGPS D: \ pics \ mypic.jpg

Nombre completo: P: \ IMG_0014.JPG Latitud: 42; 32.27; 0 Longitud: 82; 52.58; 0 DECLatitude: 42.5378333333333 DECLongitude: 82.8763333333333

Kirt Carson
fuente
0

Exiftool generará las coordenadas en decimal de baja precisión si utiliza el modificador -n. Puede obtener más precisión con el interruptor -c y dar la cantidad deseada de dígitos detrás del decimal:

exiftool -c '%.6f' -GPSPosition filename.jpg

Muestra la posición con 6 dígitos detrás del decimal, lo cual es bueno para encontrar un lugar dentro de 5 pulgadas.

Billious
fuente