geopic-tag-reader 1.3.3__py3-none-any.whl → 1.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. geopic_tag_reader/__init__.py +1 -1
  2. geopic_tag_reader/camera.py +118 -30
  3. geopic_tag_reader/cameras.csv +3777 -0
  4. geopic_tag_reader/main.py +3 -0
  5. geopic_tag_reader/reader.py +119 -21
  6. geopic_tag_reader/translations/da/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  7. geopic_tag_reader/translations/da/LC_MESSAGES/geopic_tag_reader.po +221 -0
  8. geopic_tag_reader/translations/de/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  9. geopic_tag_reader/translations/de/LC_MESSAGES/geopic_tag_reader.po +14 -2
  10. geopic_tag_reader/translations/en/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  11. geopic_tag_reader/translations/en/LC_MESSAGES/geopic_tag_reader.po +52 -39
  12. geopic_tag_reader/translations/eo/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  13. geopic_tag_reader/translations/eo/LC_MESSAGES/geopic_tag_reader.po +219 -0
  14. geopic_tag_reader/translations/fr/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  15. geopic_tag_reader/translations/fr/LC_MESSAGES/geopic_tag_reader.po +17 -5
  16. geopic_tag_reader/translations/geopic_tag_reader.pot +48 -35
  17. geopic_tag_reader/translations/it/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  18. geopic_tag_reader/translations/it/LC_MESSAGES/geopic_tag_reader.po +68 -27
  19. geopic_tag_reader/translations/ja/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  20. geopic_tag_reader/translations/ja/LC_MESSAGES/geopic_tag_reader.po +196 -0
  21. geopic_tag_reader/translations/zh_Hant/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  22. geopic_tag_reader/translations/zh_Hant/LC_MESSAGES/geopic_tag_reader.po +196 -0
  23. {geopic_tag_reader-1.3.3.dist-info → geopic_tag_reader-1.4.1.dist-info}/METADATA +1 -1
  24. {geopic_tag_reader-1.3.3.dist-info → geopic_tag_reader-1.4.1.dist-info}/RECORD +27 -18
  25. {geopic_tag_reader-1.3.3.dist-info → geopic_tag_reader-1.4.1.dist-info}/LICENSE +0 -0
  26. {geopic_tag_reader-1.3.3.dist-info → geopic_tag_reader-1.4.1.dist-info}/WHEEL +0 -0
  27. {geopic_tag_reader-1.3.3.dist-info → geopic_tag_reader-1.4.1.dist-info}/entry_points.txt +0 -0
geopic_tag_reader/main.py CHANGED
@@ -25,6 +25,7 @@ def read(
25
25
  _ = i18n_init(lang)
26
26
  print(_("Latitude:"), metadata.lat)
27
27
  print(_("Longitude:"), metadata.lon)
28
+ print(_("GPS accuracy:"), str(metadata.gps_accuracy) + "m" if metadata.gps_accuracy is not None else _("not set"))
28
29
  print(_("Timestamp:"), metadata.ts)
29
30
  if metadata.ts_by_source is not None:
30
31
  print(" -", (metadata.ts_by_source.gps or _("not set")), _("(GPS)"))
@@ -34,6 +35,8 @@ def read(
34
35
  print(_("Make:"), metadata.make)
35
36
  print(_("Model:"), metadata.model)
36
37
  print(_("Focal length:"), metadata.focal_length)
38
+ print(_("Field of view:"), metadata.field_of_view)
39
+ print(_("Sensor width:"), metadata.sensor_width)
37
40
  print(_("Crop parameters:"), metadata.crop)
38
41
  print(_("Pitch:"), metadata.pitch)
39
42
  print(_("Roll:"), metadata.roll)
@@ -10,6 +10,7 @@ from geopic_tag_reader import camera
10
10
  import timezonefinder # type: ignore
11
11
  import pytz
12
12
  from geopic_tag_reader.i18n import init as i18n_init
13
+ import math
13
14
 
14
15
  # This is a fix for invalid MakerNotes leading to picture not read at all
15
16
  # https://github.com/LeoHsiao1/pyexiv2/issues/58
@@ -86,6 +87,9 @@ class GeoPicTags:
86
87
  roll (float): Picture roll angle, on a right/left axis (in degrees, left-arm down = -90°, flat = 0°, right-arm down = 90°)
87
88
  yaw (float): Picture yaw angle, on a vertical axis (in degrees, front = 0°, right = 90°, rear = 180°, left = 270°). This offsets the center image from GPS direction for a correct 360° sphere correction
88
89
  ts_by_source (TimeBySource): all read timestamps from image, for finer processing.
90
+ sensor_width (float): The camera sensor width, that can be used to compute field of view (combined with focal length)
91
+ field_of_view (int): How large picture is showing of horizon (in degrees)
92
+ gps_accuracy (float): How precise the GPS position is (in meters)
89
93
 
90
94
 
91
95
  Implementation note: this needs to be sync with the PartialGeoPicTags structure
@@ -107,6 +111,9 @@ class GeoPicTags:
107
111
  roll: Optional[float] = None
108
112
  yaw: Optional[float] = None
109
113
  ts_by_source: Optional[TimeBySource] = None
114
+ sensor_width: Optional[float] = None
115
+ field_of_view: Optional[int] = None
116
+ gps_accuracy: Optional[float] = None
110
117
 
111
118
 
112
119
  class InvalidExifException(Exception):
@@ -143,6 +150,9 @@ class PartialGeoPicTags:
143
150
  roll: Optional[float] = None
144
151
  yaw: Optional[float] = None
145
152
  ts_by_source: Optional[TimeBySource] = None
153
+ sensor_width: Optional[float] = None
154
+ field_of_view: Optional[int] = None
155
+ gps_accuracy: Optional[float] = None
146
156
 
147
157
 
148
158
  class PartialExifException(Exception):
@@ -320,14 +330,7 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
320
330
  if make is None and model is None:
321
331
  warnings.append(_("No make and model value found, no assumption on focal length or GPS precision can be made"))
322
332
 
323
- # Focal length
324
- focalLength = None
325
- if isExifTagUsable(data, "Exif.Image.FocalLength", Fraction):
326
- focalLength = float(Fraction(data["Exif.Image.FocalLength"]))
327
- elif isExifTagUsable(data, "Exif.Photo.FocalLength", Fraction):
328
- focalLength = float(Fraction(data["Exif.Photo.FocalLength"]))
329
- if focalLength is None:
330
- warnings.append(_("No focal length value was found, this prevents calculating field of view"))
333
+ cameraMetadata = camera.find_camera(make, model)
331
334
 
332
335
  # Cropped pano data
333
336
  crop = None
@@ -369,6 +372,28 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
369
372
  else:
370
373
  pic_type = "flat"
371
374
 
375
+ # Focal length
376
+ focalLength = decodeFloat(data, ["Exif.Image.FocalLength", "Exif.Photo.FocalLength"])
377
+ focalLength35mm = decodeFloat(data, ["Exif.Image.FocalLengthIn35mmFilm", "Exif.Photo.FocalLengthIn35mmFilm"])
378
+ scaleFactor35efl = focalLength35mm / focalLength if focalLength and focalLength35mm else None
379
+
380
+ if focalLength is None and pic_type != "equirectangular":
381
+ warnings.append(_("No focal length value was found, this prevents calculating field of view"))
382
+
383
+ # Sensor width
384
+ sensorWidth = None
385
+ if cameraMetadata is not None:
386
+ sensorWidth = cameraMetadata.sensor_width
387
+
388
+ # Field of view
389
+ fieldOfView = None
390
+ if pic_type == "equirectangular": # 360°
391
+ fieldOfView = 360
392
+ elif sensorWidth is not None and focalLength is not None: # Based on camera metadata
393
+ fieldOfView = round(math.degrees(2 * math.atan(sensorWidth / (2 * focalLength))))
394
+ elif focalLength is not None and scaleFactor35efl is not None: # Using EXIF Tags
395
+ fieldOfView = compute_fov(focalLength, scaleFactor35efl)
396
+
372
397
  # Altitude
373
398
  altitude = None
374
399
  if isExifTagUsable(data, "Exif.GPSInfo.GPSAltitude", Fraction):
@@ -376,19 +401,40 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
376
401
  ref = -1 if data.get("Exif.GPSInfo.GPSAltitudeRef") == "1" else 1
377
402
  altitude = altitude_raw * ref
378
403
 
379
- # GPS accuracy (only for warning display)
380
- gpshpos = isExifTagUsable(data, "Exif.GPSInfo.GPSHPositioningError", float) or isExifTagUsable(
381
- data, "Xmp.exif.GPSHPositioningError", float
382
- )
383
- gpsdop = isExifTagUsable(data, "Exif.GPSInfo.GPSDOP", float) or isExifTagUsable(data, "Xmp.exif.GPSDOP", float)
384
- gpsdiff = isExifTagUsable(data, "Exif.GPSInfo.GPSDifferential", int) or isExifTagUsable(data, "Xmp.exif.GPSDifferential", int)
385
-
386
- if not gpshpos:
387
- if not gpsdop and not gpsdiff:
388
- warnings.append(_("No GPS accuracy value found, this prevents computing a quality score"))
389
- else:
390
- warnings.append(_("No GPS horizontal positioning error value found, GPS accuracy can only be estimated"))
391
-
404
+ # GPS accuracy
405
+ gpshposEstimated = False
406
+ gpshpos = decodeFloat(data, ["Exif.GPSInfo.GPSHPositioningError", "Xmp.exif.GPSHPositioningError"], 2)
407
+ gpsdop = decodeFloat(data, ["Exif.GPSInfo.GPSDOP", "Xmp.exif.GPSDOP"], 2)
408
+
409
+ gpsdiff = None
410
+ if isExifTagUsable(data, "Exif.GPSInfo.GPSDifferential", int):
411
+ gpsdiff = int(data["Exif.GPSInfo.GPSDifferential"])
412
+ elif isExifTagUsable(data, "Xmp.exif.GPSDifferential", int):
413
+ gpsdiff = int(data["Xmp.exif.GPSDifferential"])
414
+
415
+ if gpshpos is None:
416
+ if gpsdop is not None and gpsdop > 0:
417
+ gpshposEstimated = True
418
+ if gpsdiff == 1: # DOP with a DGPS -> consider GPS nominal error as 1 meter
419
+ gpshpos = gpsdop
420
+ else: # DOP without DGPS -> consider GPS nominal error as 3 meters in average
421
+ gpshpos = round(3 * gpsdop, 2)
422
+ elif gpsdiff == 1: # DGPS only -> return 2 meters precision
423
+ gpshpos = 2
424
+ gpshposEstimated = True
425
+ elif cameraMetadata is not None and cameraMetadata.gps_accuracy is not None: # Estimate based on model
426
+ gpshpos = cameraMetadata.gps_accuracy
427
+ gpshposEstimated = True
428
+ elif make is not None and make.lower() in camera.GPS_ACCURACY_MAKE:
429
+ gpshpos = camera.GPS_ACCURACY_MAKE[make.lower()]
430
+ gpshposEstimated = True
431
+
432
+ if gpshpos is None:
433
+ warnings.append(_("No GPS accuracy value found, this prevents computing a quality score"))
434
+ elif gpshposEstimated:
435
+ warnings.append(_("No GPS horizontal positioning error value found, GPS accuracy can only be estimated"))
436
+
437
+ # Errors display
392
438
  errors = []
393
439
  missing_fields = set()
394
440
  if lat is None or lon is None or (lat == 0 and lon == 0):
@@ -430,6 +476,9 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
430
476
  roll=roll,
431
477
  yaw=yaw,
432
478
  ts_by_source=tsSources,
479
+ sensor_width=sensorWidth,
480
+ field_of_view=fieldOfView,
481
+ gps_accuracy=gpshpos,
433
482
  ),
434
483
  )
435
484
 
@@ -451,6 +500,9 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
451
500
  roll=roll,
452
501
  yaw=yaw,
453
502
  ts_by_source=tsSources,
503
+ sensor_width=sensorWidth,
504
+ field_of_view=fieldOfView,
505
+ gps_accuracy=gpshpos,
454
506
  )
455
507
 
456
508
 
@@ -485,6 +537,23 @@ def decodeManyFractions(value: str) -> List[Fraction]:
485
537
  raise InvalidFractionException()
486
538
 
487
539
 
540
+ def decodeFloat(data: dict, tags: List[str], precision: Optional[int] = None) -> Optional[float]:
541
+ """
542
+ Tries to read float-like value from many EXIF tags (looks for decimal value and fraction)
543
+ """
544
+
545
+ for tag in tags:
546
+ v = None
547
+ if isExifTagUsable(data, tag, float):
548
+ v = float(data[tag])
549
+ elif isExifTagUsable(data, tag, Fraction):
550
+ v = float(Fraction(data[tag]))
551
+ if v is not None:
552
+ return round(v, precision) if precision is not None else v
553
+
554
+ return None
555
+
556
+
488
557
  def decodeLatLon(data: dict, group: str, _: Callable[[str], str]) -> Tuple[Optional[float], Optional[float], List[str]]:
489
558
  """Reads GPS info from given group to get latitude/longitude as float coordinates"""
490
559
 
@@ -744,3 +813,32 @@ def isExifTagUsable(exif, tag, expectedType: Any = str) -> bool:
744
813
  return True
745
814
  except ValueError:
746
815
  return False
816
+
817
+
818
+ def compute_fov(focal_length, scale_factor_35efl, focus_distance=None) -> int:
819
+ """
820
+ Computes horizontal field of view (only for rectilinear sensors)
821
+ Based on ExifTool computation.
822
+
823
+ Args:
824
+ focal_length (float): focal length (in mm)
825
+ scale_factor_35efl (float): scale factor for 35mm-equivalent sensor
826
+ focus_distance (float, optional): focus distance
827
+
828
+ Returns:
829
+ int: the computed field of view
830
+ """
831
+
832
+ if not focal_length or not scale_factor_35efl:
833
+ raise Exception("Missing focal length or scale factor")
834
+
835
+ correction_factor = 1.0
836
+ if focus_distance:
837
+ d = 1000 * focus_distance - focal_length
838
+ if d > 0:
839
+ correction_factor += focal_length / d
840
+
841
+ fd2 = math.atan2(36, 2 * focal_length * scale_factor_35efl * correction_factor)
842
+ fov_degrees = fd2 * 360 / math.pi
843
+
844
+ return round(fov_degrees)
@@ -0,0 +1,221 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2024-11-24 15:36+0100\n"
11
+ "PO-Revision-Date: 2025-01-07 15:14+0000\n"
12
+ "Last-Translator: ERYpTION <eryption.ar9q2@slmail.me>\n"
13
+ "Language-Team: Danish <http://weblate.panoramax.xyz/projects/panoramax/"
14
+ "tag-reader/da/>\n"
15
+ "Language: da\n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
20
+ "X-Generator: Weblate 5.4.3\n"
21
+
22
+ #: geopic_tag_reader/main.py:26
23
+ msgid "Latitude:"
24
+ msgstr "Breddegrad:"
25
+
26
+ #: geopic_tag_reader/main.py:27
27
+ msgid "Longitude:"
28
+ msgstr "Længdegrad:"
29
+
30
+ #: geopic_tag_reader/main.py:28
31
+ msgid "Timestamp:"
32
+ msgstr "Tidsstempel:"
33
+
34
+ #: geopic_tag_reader/main.py:30 geopic_tag_reader/main.py:31
35
+ msgid "not set"
36
+ msgstr "ikke indstillet"
37
+
38
+ #: geopic_tag_reader/main.py:30
39
+ msgid "(GPS)"
40
+ msgstr "(GPS)"
41
+
42
+ #: geopic_tag_reader/main.py:31
43
+ msgid "(Camera)"
44
+ msgstr "(Kamera)"
45
+
46
+ #: geopic_tag_reader/main.py:32
47
+ msgid "Heading:"
48
+ msgstr "Retning:"
49
+
50
+ #: geopic_tag_reader/main.py:33
51
+ msgid "Type:"
52
+ msgstr "Type:"
53
+
54
+ #: geopic_tag_reader/main.py:34
55
+ msgid "Make:"
56
+ msgstr "Fabrikat:"
57
+
58
+ #: geopic_tag_reader/main.py:35
59
+ msgid "Model:"
60
+ msgstr "Model:"
61
+
62
+ #: geopic_tag_reader/main.py:36
63
+ msgid "Focal length:"
64
+ msgstr "Brændvidde:"
65
+
66
+ #: geopic_tag_reader/main.py:37
67
+ msgid "Crop parameters:"
68
+ msgstr "Beskæringsparametre:"
69
+
70
+ #: geopic_tag_reader/main.py:38
71
+ msgid "Pitch:"
72
+ msgstr "Skråstilling:"
73
+
74
+ #: geopic_tag_reader/main.py:39
75
+ msgid "Roll:"
76
+ msgstr "Rul:"
77
+
78
+ #: geopic_tag_reader/main.py:40
79
+ msgid "Yaw:"
80
+ msgstr "Giring (rotation):"
81
+
82
+ #: geopic_tag_reader/main.py:43
83
+ msgid "Warnings raised by reader:"
84
+ msgstr "Advarsler fremsat af læser:"
85
+
86
+ #: geopic_tag_reader/reader.py:218
87
+ msgid "Read latitude is out of WGS84 bounds (should be in [-90, 90])"
88
+ msgstr ""
89
+ "Den læste breddegrad er uden for WGS84-grænserne (bør være inden for [-90, "
90
+ "90])"
91
+
92
+ #: geopic_tag_reader/reader.py:220
93
+ msgid "Read longitude is out of WGS84 bounds (should be in [-180, 180])"
94
+ msgstr ""
95
+ "Den læste længdegrad er uden for WGS84-grænserne (bør være i [-180, 180])"
96
+
97
+ #: geopic_tag_reader/reader.py:248
98
+ #, python-brace-format
99
+ msgid "Skipping Mapillary date/time as it was not recognized: {v}"
100
+ msgstr "Mapillary-dato/tid springes over, da den ikke blev genkendt: {v}"
101
+
102
+ #: geopic_tag_reader/reader.py:278
103
+ msgid "No heading value was found, this reduces usability of picture"
104
+ msgstr ""
105
+ "Der blev ikke fundet nogen retningsværdi, hvilket reducerer billedets "
106
+ "anvendelighed"
107
+
108
+ #: geopic_tag_reader/reader.py:321
109
+ msgid ""
110
+ "No make and model value found, no assumption on focal length or GPS "
111
+ "precision can be made"
112
+ msgstr ""
113
+ "Ingen fabrikat- og modelværdi fundet, ingen antagelse om brændvidde eller "
114
+ "GPS-præcision kan foretages"
115
+
116
+ #: geopic_tag_reader/reader.py:330
117
+ msgid ""
118
+ "No focal length value was found, this prevents calculating field of view"
119
+ msgstr ""
120
+ "Der blev ikke fundet nogen brændviddeværdi, hvilket forhindrer beregning af "
121
+ "synsfelt"
122
+
123
+ #: geopic_tag_reader/reader.py:388
124
+ msgid "No GPS accuracy value found, this prevents computing a quality score"
125
+ msgstr ""
126
+ "Ingen GPS-nøjagtighedsværdi fundet, dette forhindrer beregning af en "
127
+ "kvalitetsscore"
128
+
129
+ #: geopic_tag_reader/reader.py:390
130
+ msgid ""
131
+ "No GPS horizontal positioning error value found, GPS accuracy can only be "
132
+ "estimated"
133
+ msgstr ""
134
+ "Ingen værdi for horisontal GPS-positioneringsfejl fundet, GPS-nøjagtighed "
135
+ "kan kun estimeres"
136
+
137
+ #: geopic_tag_reader/reader.py:396
138
+ msgid "No GPS coordinates or broken coordinates in picture EXIF tags"
139
+ msgstr "Ingen GPS-koordinater eller defekte koordinater i billedets EXIF-tags"
140
+
141
+ #: geopic_tag_reader/reader.py:402
142
+ msgid "No valid date in picture EXIF tags"
143
+ msgstr "Ingen gyldig dato i billedets EXIF-tags"
144
+
145
+ #: geopic_tag_reader/reader.py:407
146
+ msgid "The picture is missing mandatory metadata:"
147
+ msgstr "Billedet mangler obligatoriske metadata:"
148
+
149
+ #: geopic_tag_reader/reader.py:498 geopic_tag_reader/reader.py:527
150
+ msgid "GPSLatitudeRef not found, assuming GPSLatitudeRef is North"
151
+ msgstr "GPSLatitudeRef ikke fundet, antager at GPSLatitudeRef er nord"
152
+
153
+ #: geopic_tag_reader/reader.py:506
154
+ msgid "Broken GPS coordinates in picture EXIF tags"
155
+ msgstr "Defekte GPS-koordinater i billedets EXIF-tags"
156
+
157
+ #: geopic_tag_reader/reader.py:509 geopic_tag_reader/reader.py:533
158
+ msgid "GPSLongitudeRef not found, assuming GPSLongitudeRef is East"
159
+ msgstr "GPSLongitudeRef ikke fundet, det antages, at GPSLongitudeRef er øst"
160
+
161
+ #: geopic_tag_reader/reader.py:594
162
+ msgid "Precise timezone information not found, fallback to UTC"
163
+ msgstr "Præcise tidszoneoplysninger ikke fundet, går tilbage til UTC"
164
+
165
+ #: geopic_tag_reader/reader.py:599
166
+ msgid ""
167
+ "Precise timezone information not found (and no GPS coordinates to help), "
168
+ "fallback to UTC"
169
+ msgstr ""
170
+ "Præcise tidszoneoplysninger ikke fundet (og ingen GPS-koordinater til at "
171
+ "hjælpe), går tilbage til UTC"
172
+
173
+ #: geopic_tag_reader/reader.py:603
174
+ #, python-brace-format
175
+ msgid ""
176
+ "Skipping original date/time (from {datefield}) as it was not recognized: {v}"
177
+ msgstr ""
178
+ "Springer original dato/tid (fra {datefield}) over, da den ikke blev genkendt:"
179
+ " {v}"
180
+
181
+ #: geopic_tag_reader/reader.py:635
182
+ #, python-brace-format
183
+ msgid ""
184
+ "GPSTimeStamp and GPSDateTime don't contain supported time format (in {group} "
185
+ "group)"
186
+ msgstr ""
187
+ "GPSTimeStamp og GPSDateTime indeholder ikke understøttet tidsformat (i "
188
+ "{group}-gruppe)"
189
+
190
+ #: geopic_tag_reader/reader.py:666
191
+ #, python-brace-format
192
+ msgid "Skipping GPS date/time ({group} group) as it was not recognized: {v}"
193
+ msgstr ""
194
+ "GPS-dato/tid ({group} gruppe) springes over, da den ikke blev genkendt: {v}"
195
+
196
+ #: geopic_tag_reader/reader.py:692
197
+ #, python-brace-format
198
+ msgid ""
199
+ "Microseconds read from decimal seconds value ({microsecondsFromSeconds}) is "
200
+ "not matching value from EXIF field ({microseconds}). Max value will be kept."
201
+ msgstr ""
202
+ "Mikrosekunder læst fra decimalsekunders værdi ({microsecondsFromSeconds}) "
203
+ "svarer ikke til værdien fra EXIF-feltet ({microseconds}). Den maksimale "
204
+ "værdi bevares."
205
+
206
+ #: geopic_tag_reader/writer.py:132
207
+ #, python-brace-format
208
+ msgid "Unsupported key in additional tags ({k})"
209
+ msgstr "Ikke-understøttet nøgle i ekstra tags ({k})"
210
+
211
+ #: geopic_tag_reader/main.py:28
212
+ msgid "GPS accuracy:"
213
+ msgstr "GPS-nøjagtighed:"
214
+
215
+ #: geopic_tag_reader/main.py:38
216
+ msgid "Field of view:"
217
+ msgstr "Synsfelt:"
218
+
219
+ #: geopic_tag_reader/main.py:39
220
+ msgid "Sensor width:"
221
+ msgstr "Sensor-bredde:"
@@ -8,8 +8,8 @@ msgstr ""
8
8
  "Project-Id-Version: PACKAGE VERSION\n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
10
  "POT-Creation-Date: 2024-07-10 13:05+0200\n"
11
- "PO-Revision-Date: 2024-11-23 22:10+0000\n"
12
- "Last-Translator: Bastian Greshake Tzovaras <bastian@gedankenstuecke.de>\n"
11
+ "PO-Revision-Date: 2025-01-09 08:14+0000\n"
12
+ "Last-Translator: mcliquid <weblate@mcliquid.de>\n"
13
13
  "Language-Team: German <http://weblate.panoramax.xyz/projects/panoramax/"
14
14
  "tag-reader/de/>\n"
15
15
  "Language: de\n"
@@ -210,3 +210,15 @@ msgid ""
210
210
  msgstr ""
211
211
  "Kein Hersteller und Modell gefunden, keine Annahmen zu Brennweite oder GPS-"
212
212
  "Genauigkeit können angestellt werden"
213
+
214
+ #: geopic_tag_reader/main.py:28
215
+ msgid "GPS accuracy:"
216
+ msgstr "GPS-Genauigkeit:"
217
+
218
+ #: geopic_tag_reader/main.py:38
219
+ msgid "Field of view:"
220
+ msgstr "Sichtbereich:"
221
+
222
+ #: geopic_tag_reader/main.py:39
223
+ msgid "Sensor width:"
224
+ msgstr "Sensorbreite:"