Como analisar informações de GPS EXIF ​​em números decimais lat, lng

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

Como devo entender o exemplo acima como grau, min, s?

Alguns dados exif extraídos possuem metadados listados acima. Esses formatos estão especificados em algum lugar? ou devo esperar muitos formatos diferentes de posições de GPS no EXIF?

Preciso escrever um método que forneça o lat, lng como números decimais com base em dados exif, e não tenho certeza sobre quantos formatos diferentes eu devo poder analisar (aprenderei isso com o tempo) e essa pergunta é principalmente sobre os exemplos acima. Eu sei que o grau é 55 e 8, mas não tenho certeza se são 30 minutos e 0,22 * 60 segundos e, nesse caso, por que o 0 está lá?

Poul K. Sørensen
fonte
Qual SO? Você pode estar interessado em exiftool sno.phy.queensu.ca/~phil/exiftool . Existe um executável para Win ou Mac que eu usei com êxito (arquivos em lote do Windows no meu caso) para extrair informações de coordenadas das fotos.
jbchurchill
2
Qual plataforma você está usando para analisar as informações? Para o que você deseja convertê-lo?
Branco
Estou convertendo para lat, lng valores decimais / duplos e estava em c #. Eu simplesmente precisava das informações que a resposta deu.
Poul K. Sørensen

Respostas:

3

De acordo com esta página , os valores de latitude e longitude podem estar em (1) graus, (2) graus e minutos decimais ou (3) graus, minutos e segundos decimais.

No seu exemplo, (2) é um valor decimal e (3) é zero, então você tem graus, minutos decimais.

Portanto, você precisará fazer algumas verificações nos três valores para determinar qual formato está sendo usado.

mkennedy
fonte
De acordo com o padrão exif, existem três campos "racionais" para cada um, contendo graus, minutos e segundos. o exiftool normaliza graus decimais importantes em D, M, S enquanto atribui esses valores (exiftool -GPSLongitude = "0,5 90 63.12345" junk.jpg "-> Longitude GPS: 2 graus 1 '3,12" W ") Portanto, se você precisar de graus decimais , você faz dd = x0 + x1 / 60. + x2 / 3600 e poderia ignorar a não-normalização..
Dave X
4

O EXIF ​​armazena as cordas do GPS como rational64uuma lista de seis números inteiros não assinados na seguinte ordem:

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

O formato é consistente e parece que a ferramenta que você está usando já dividiu cada par em números decimais; portanto, o que você tem é:

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

Se você deseja converter para um único número decimal:

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

Usei esse arquivo em lotes para obter nomes de arquivos, data / hora e graus decimais

posições.

************** start lalo.bat '-n força exift de graus decimais com sinal - e: \ util \ 00ymp * .jpg> fud' strfile uma string por linha (espaços ok) findstr / G: "strfile" fud >> fum ********** end lalo.bat

produz saída

Nome do arquivo: 0104171345.jpg Data e hora do GPS: 2017: 01: 04 21: 45: 19Z Posição do GPS: 46.9997367777778 -117.3392105 Nome do arquivo: 0104171355.jpg Data / hora do GPS: 2017: 01: 04 21: 55: 52Z Posição do GPS : 46.99622725 -117.307495111111 Nome do arquivo: 0104171402.jpg Data / hora do GPS: 2017: 01: 04 22: 02: 02Z Posição do GPS: 47.0075378333333 -117.284553527778 Nome do arquivo: 0104171404.jpg Data / hora do GPS: 2017: 01: 04 22:04 : 51Z Posição GPS: 47.0222473055556 -117.275527944444 Nome do arquivo: 0104171405.jpg Data / hora do GPS: 2017: 01: 04 22: 05: 40Z Posição GPS: 47.0269584444444 -117.269523611111

Nome do arquivo: 0112171921.jpg Nome do arquivo: 0112171921a.jpg Nome do arquivo: 0112171921b.jpg Nome do arquivo: 0120171623.jpg Nome do arquivo: 0120171623a.jpg Nome do arquivo: 0120171624.jpg

Nome do arquivo: 0120171626.jpg Data / hora do GPS: 2017: 01: 21 00: 26: 49Z Posição do GPS: 48.7900199722222 -117.290061944444 Nome do arquivo: 0120171628.jpg Data / hora do GPS: 2017: 01: 21 00: 28: 44Z Posição do GPS : 48.7907943611111 -117.292045583333

Nome do arquivo: 0122170942.jpg Nome do arquivo: 0122170942a.jpg Nome do arquivo: 0122170948.jpg Nome do arquivo: 0122170948a.jpg

Nome do arquivo: 0122170950.jpg Data / hora do GPS: 2017: 01: 22 17: 50: 12Z Posição do GPS: 48.7828292777778 -117.287322972222 Nome do arquivo: 0122170950a.jpg Data / hora do GPS: 2017: 01: 22 17: 50: 16Z Posição do GPS : 48.7828483333333 -117.287322972222 Nome do arquivo: 0122170950b.jpg Data / hora do GPS: 2017: 01: 22 17: 50: 38Z Posição do GPS: 48.7828178333333 -117.28733825

sunwukong
fonte
0

Obrigado Jason pela fórmula de converter para decimal e /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

Nome completo: P: \ IMG_0014.JPG Latitude: 42; 32.27; 0 Longitude: 82; 52.58; 0 DECLatitude: 42.5378333333333 DECLongitude: 82.8763333333333

Kirt Carson
fonte
0

O Exiftool produzirá as coordenadas em decimal de baixa precisão se você usar a opção -n. Você pode obter mais precisão com a opção -c e fornecer a quantidade desejada de dígitos atrás do decimal:

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

Mostra a posição com 6 dígitos atrás do decimal, o que é bom para encontrar um local dentro de 5 polegadas.

Billious
fonte