So analysieren Sie EXIF-GPS-Informationen in lat, lng Dezimalzahlen

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

Wie soll ich das obige Beispiel als Grad, min, sek verstehen?

Einige Exif-Daten, die ich extrahiert habe, haben Metadaten wie oben aufgeführt. Sind diese Formate irgendwo angegeben? oder sollte ich in EXIF ​​viele verschiedene Formate von GPS-Positionen erwarten?

Ich muss eine Methode schreiben, die lat, lng als Dezimalzahlen basierend auf exif-Daten angibt, und ich bin mir nicht sicher, wie viele verschiedene Formate ich voraussichtlich analysieren kann (ich werde dies im Laufe der Zeit lernen), und diese Frage ist meistens über obige Beispiele. Ich weiß, dass der Grad 55 und 8 ist, bin mir aber nicht sicher, ob es 30 Minuten und 0,22 * 60 Sekunden sind, und in diesem Fall, warum ist die 0 dort?

Poul K. Sørensen
quelle
Welches Betriebssystem? Sie könnten an exiftool sno.phy.queensu.ca/~phil/exiftool interessiert sein . Es gibt eine ausführbare Datei für Win oder Mac, die ich erfolgreich verwendet habe (in meinem Fall Windows-Batchdateien), um Koordinateninformationen aus Fotos zu extrahieren.
jbchurchill
2
Auf welcher Plattform analysieren Sie die Informationen? In was möchten Sie es konvertieren?
Branco
Ich konvertiere in lat, lng Dezimal- / Doppelwerte und es war in C #. Ich brauchte einfach die Informationen, die die Antwort gab.
Poul K. Sørensen

Antworten:

3

Gemäß dieser Seite können die Breiten- und Längengrade in (1) Grad, (2) Grad und Dezimalminuten oder (3) Grad, Minuten und Dezimalsekunden angegeben werden.

In Ihrem Beispiel ist (2) ein Dezimalwert und (3) Null, Sie haben also Grad, Dezimalminuten.

Sie müssen also einige Überprüfungen der drei Werte durchführen, um festzustellen, welches Format verwendet wird.

mkennedy
quelle
Gemäß dem Exif-Standard gibt es jeweils drei "rationale" Felder, die Grad, Minuten und Sekunden enthalten. exiftool normalisiert wichtige Dezimalgrade in D, M, S, während diese Werte zugewiesen werden (exiftool -GPSLongitude = "0.5 90 63.12345" junk.jpg "-> GPS-Länge: 2 Grad 1 '3.12" W ") Wenn Sie also Dezimalgrade benötigen , Sie tun dd = x0 + x1 / 60. + x2 / 3600. und könnten die Nicht-Normalisierung ignorieren.
Dave X
4

EXIF speichert GPS-Koordinaten als rational64uListe von sechs vorzeichenlosen ganzen Zahlen in der folgenden Reihenfolge:

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

Das Format ist konsistent und es sieht so aus, als hätte das von Ihnen verwendete Tool bereits jedes Paar in Dezimalzahlen unterteilt. Sie haben also Folgendes:

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

Wenn Sie in eine einzelne Dezimalzahl konvertieren möchten:

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

Ich habe diese Batch-Datei verwendet, um Dateinamen, Datum / Uhrzeit und Dezimalgrad zu erhalten

Positionen.

************** start lalo.bat '-n erzwingt vorzeichenbehaftete Dezimalgrade exift -nd: \ util \ 00ymp * .jpg> fud' strfile eine Zeichenfolge pro Zeile (Leerzeichen ok) findstr / G: "strfile" fud >> fum ********** end lalo.bat

erzeugt Ausgabe

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

Dateiname: 0112171921.jpg Dateiname: 0112171921a.jpg Dateiname: 0112171921b.jpg Dateiname: 0120171623.jpg Dateiname: 0120171623a.jpg Dateiname: 0120171624.jpg

Dateiname: 0120171626.jpg GPS Datum / Uhrzeit: 2017: 01: 21 00: 26: 49Z GPS-Position: 48.7900199722222 -117.290061944444 Dateiname: 0120171628.jpg GPS Datum / Uhrzeit: 2017: 01: 21 00: 28: 44Z GPS-Position : 48.7907943611111 -117.292045583333

Dateiname: 0122170942.jpg Dateiname: 0122170942a.jpg Dateiname: 0122170948.jpg Dateiname: 0122170948a.jpg

Dateiname: 0122170950.jpg GPS Datum / Uhrzeit: 2017: 01: 22 17: 50: 12Z GPS-Position: 48.7828292777778 -117.287322972222 Dateiname: 0122170950a.jpg GPS Datum / Uhrzeit: 2017: 01: 22 17: 50: 16Z GPS-Position : 48.7828483333333 -117.287322972222 Dateiname: 0122170950b.jpg GPS Datum / Uhrzeit: 2017: 01: 22 17: 50: 38Z GPS-Position: 48.7828178333333 -117.28733825

Sunwukong
quelle
0

Vielen Dank an Jason für die Konvertierung der Formel in eine Dezimalzahl und in /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

Vollständiger Name: P: \ IMG_0014.JPG Breite: 42; 32,27; 0 Länge: 82; 52,58; 0 DECLatitude: 42,53783333333333 DECLänge: 82,8763333333333

Kirt Carson
quelle
0

Exiftool gibt die Koordinaten in Dezimalzahl mit niedriger Genauigkeit aus, wenn Sie den Schalter -n verwenden. Mit dem Schalter -c können Sie mehr Präzision erzielen und die gewünschte Anzahl von Ziffern hinter der Dezimalstelle angeben:

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

Zeigt die Position mit 6 Stellen hinter der Dezimalstelle an, was gut ist, um eine Stelle innerhalb von 5 Zoll zu finden.

Billious
quelle