Comment analyser les informations GPS EXIF ​​en nombres décimaux lat, lng


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

Comment dois-je comprendre l'exemple ci-dessus comme degré, min, sec?

Certaines données exif que j'ai extraites contiennent des métadonnées répertoriées ci-dessus. Ces formats sont-ils spécifiés quelque part? ou devrais-je m'attendre à beaucoup de différents formats de positions gps dans EXIF?

J'ai besoin d'écrire une méthode qui donne le lat, lng sous forme de nombres décimaux basés sur des données exif, et je ne sais pas combien de formats différents je devrais être en mesure d'analyser (j'apprendrai cela au fil du temps) et cette question est principalement sur les exemples ci-dessus. Je sais que le degré est 55 et 8, mais je ne sais pas si ses 30 minutes et 0,22 * 60 secondes, et dans ce cas, pourquoi le 0 est-il là?


Quel OS? Vous pourriez être intéressé par exiftool sno.phy.queensu.ca/~phil/exiftool . Il y a un exécutable pour Win ou Mac que j'ai utilisé avec succès (les fichiers batch Windows dans mon cas) pour extraire les informations de coordonnées des photos.
jbchurchill

2
Quelle plateforme utilisez-vous pour analyser les informations? À quoi voulez-vous le convertir?
Branco

Je convertis en lat, lng valeurs décimales / doubles et c'était en C #. J'avais simplement besoin des informations fournies par la réponse.
Poul K. Sørensen

Réponses:


3

Selon cette page , les valeurs de latitude et de longitude peuvent être en (1) degrés, (2) degrés et minutes décimales, ou (3) degrés, minutes et secondes décimales.

Dans votre exemple, (2) est une valeur décimale et (3) est zéro, vous avez donc des degrés, des minutes décimales.

Ainsi, vous devrez vérifier les trois valeurs pour déterminer le format utilisé.


Selon la norme exif, il y a trois champs "rationnels" pour chacun, contenant des degrés, des minutes et des secondes. exiftool normalise les degrés décimaux importuns en D, M, S lors de l'attribution de ces valeurs, (exiftool -GPSLongitude = "0.5 90 63.12345" junk.jpg "-> GPS Longitude: 2 deg 1 '3.12" W ") Donc, si vous avez besoin de degrés décimaux , vous faites dd = x0 + x1 / 60. + x2 / 3600. et pourriez ignorer la non-normalisation
Dave X

4

EXIF stocke les coordonnées GPS sous la forme d' rational64uune liste de six nombres entiers non signés dans l'ordre suivant:

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

Le format est cohérent et il semble que l'outil que vous utilisez a déjà divisé chaque paire en nombres décimaux, donc ce que vous avez est:

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

Si vous souhaitez convertir en un seul nombre décimal:

= Degrees + Minutes/60 + Seconds/3600

1

Exiftool affichera les coordonnées en décimales de faible précision si vous utilisez le commutateur -n. Vous pouvez obtenir plus de précision avec l'option -c et donner la quantité souhaitée de chiffres derrière la décimale:

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

Affiche la position avec 6 chiffres derrière la décimale, ce qui est bon pour trouver une place à moins de 5 pouces.


0

J'ai utilisé ce fichier batch pour obtenir les noms de fichiers, la date / heure et le degré décimal

postes.

************** start lalo.bat '-n force les degrés décimaux signés exift -nd: \ util \ 00ymp * .jpg> fud' strfile une chaîne par ligne (espaces ok) findstr / G: "strfile" fud >> fum ********** end lalo.bat

produit une sortie

Nom du fichier: 0104171345.jpg Date / heure GPS: 2017: 01: 04 21: 45: 19Z Position GPS: 46.9997367777778 -117.3392105 Nom du fichier: 0104171355.jpg Date / heure GPS: 2017: 01: 04 21: 55: Position GPS 52Z : 46.99622725 -117.307495111111 Nom du fichier: 0104171402.jpg Date / heure GPS: 2017: 01: 04 22: 02: 02Z Position GPS: 47.0075378333333 -117.284553527778 Nom du fichier: 0104171404.jpg Date / heure GPS: 2017: 01: 04 22:04 : Position GPS 51Z: 47.0222473055556 -117.275527944444 Nom du fichier: 0104171405.jpg Date / heure GPS: 2017: 01: 04 22: 05: Position GPS 40Z: 47.0269584444444 -117.269523611111

Nom du fichier: 0112171921.jpg Nom du fichier: 0112171921a.jpg Nom du fichier: 0112171921b.jpg Nom du fichier: 0120171623.jpg Nom du fichier: 0120171623a.jpg Nom du fichier: 0120171624.jpg

Nom du fichier: 0120171626.jpg Date / heure GPS: 2017: 01: 21 00: 26: 49Z Position GPS: 48.7900199722222 -117.290061944444 Nom du fichier: 0120171628.jpg Date / heure GPS: 2017: 01: 21 00: 28: 44Z Position GPS : 48.7907943611111 -117.292045583333

Nom du fichier: 0122170942.jpg Nom du fichier: 0122170942a.jpg Nom du fichier: 0122170948.jpg Nom du fichier: 0122170948a.jpg

Nom du fichier: 0122170950.jpg Date / heure GPS: 2017: 01: 22 17: 50: 12Z Position GPS: 48.7828292777778 -117.287322972222 Nom du fichier: 0122170950a.jpg Date / heure GPS: 2017: 01: 22 17: 50: 16Z Position GPS : 48.7828483333333 -117.287322972222 Nom du fichier: 0122170950b.jpg Date / heure GPS: 2017: 01: 22 17: 50: 38Z Position GPS: 48.7828178333333 -117.28733825


0

Merci Jason pour la formule à convertir en décimal et à /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

Nom complet: P: \ IMG_0014.JPG Latitude: 42; 32,27; 0 Longitude: 82; 52,58; 0 DECLatitude: 42,5378333333333 DECLongitude: 82,876333333333333

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.