mapillary-tools 0.14.4__py3-none-any.whl → 0.14.5__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.
@@ -1 +1 @@
1
- VERSION = "0.14.4"
1
+ VERSION = "0.14.5"
@@ -6,6 +6,7 @@ import io
6
6
  import json
7
7
  import logging
8
8
  import math
9
+ from fractions import Fraction
9
10
  from pathlib import Path
10
11
 
11
12
  import piexif
@@ -29,16 +30,19 @@ class ExifEdit:
29
30
 
30
31
  @staticmethod
31
32
  def decimal_to_dms(
32
- value: float, precision: int
33
- ) -> tuple[tuple[float, int], tuple[float, int], tuple[float, int]]:
34
- """
35
- Convert decimal position to degrees, minutes, seconds in a fromat supported by EXIF
36
- """
37
- deg = math.floor(value)
38
- min = math.floor((value - deg) * 60)
39
- sec = math.floor((value - deg - min / 60) * 3600 * precision)
40
-
41
- return (deg, 1), (min, 1), (sec, precision)
33
+ value: float,
34
+ ) -> tuple[tuple[int, int], tuple[int, int], tuple[int, int]]:
35
+ """Convert decimal position to Exif degrees, minutes, and seconds rationals"""
36
+
37
+ deg: int = int(value)
38
+ min: int = int(value := (value - deg) * 60)
39
+ sec: float = (value - min) * 60
40
+
41
+ return (
42
+ (deg, 1),
43
+ (min, 1),
44
+ (Fraction.from_float(sec).limit_denominator().as_integer_ratio()),
45
+ )
42
46
 
43
47
  def add_image_description(self, data: dict) -> None:
44
48
  """Add a dict to image description."""
@@ -83,41 +87,69 @@ class ExifEdit:
83
87
  self._ef["GPS"][piexif.GPSIFD.GPSTimeStamp] = (
84
88
  (dt.hour, 1),
85
89
  (dt.minute, 1),
86
- # num / den = (dt.second * 1e6 + dt.microsecond) / 1e6
87
- (int(dt.second * 1e6 + dt.microsecond), int(1e6)),
90
+ (
91
+ Fraction.from_float(dt.second + dt.microsecond / 1e6)
92
+ .limit_denominator()
93
+ .as_integer_ratio()
94
+ ),
88
95
  )
89
-
90
- def add_lat_lon(self, lat: float, lon: float, precision: float = 1e7) -> None:
96
+ if LOG.isEnabledFor(logging.DEBUG):
97
+ LOG.debug(
98
+ 'GPSDateStamp: "%s"\tGPSTimeStamp: %s',
99
+ self._ef["GPS"][piexif.GPSIFD.GPSDateStamp],
100
+ self._ef["GPS"][piexif.GPSIFD.GPSTimeStamp],
101
+ )
102
+
103
+ def add_lat_lon(self, lat: float, lon: float) -> None:
91
104
  """Add lat, lon to gps (lat, lon in float)."""
105
+
92
106
  self._ef["GPS"][piexif.GPSIFD.GPSLatitudeRef] = "N" if lat > 0 else "S"
107
+ self._ef["GPS"][piexif.GPSIFD.GPSLatitude] = ExifEdit.decimal_to_dms(
108
+ math.fabs(lat)
109
+ )
93
110
  self._ef["GPS"][piexif.GPSIFD.GPSLongitudeRef] = "E" if lon > 0 else "W"
94
111
  self._ef["GPS"][piexif.GPSIFD.GPSLongitude] = ExifEdit.decimal_to_dms(
95
- abs(lon), int(precision)
96
- )
97
- self._ef["GPS"][piexif.GPSIFD.GPSLatitude] = ExifEdit.decimal_to_dms(
98
- abs(lat), int(precision)
112
+ math.fabs(lon)
99
113
  )
114
+ if LOG.isEnabledFor(logging.DEBUG):
115
+ LOG.debug(
116
+ "GPSLatitude: %s\tGPSLongitude: %s",
117
+ self._ef["GPS"][piexif.GPSIFD.GPSLatitude],
118
+ self._ef["GPS"][piexif.GPSIFD.GPSLongitude],
119
+ )
120
+
121
+ def add_altitude(self, altitude: float) -> None:
122
+ """Add altitude."""
100
123
 
101
- def add_altitude(self, altitude: float, precision: int = 100) -> None:
102
- """Add altitude (pre is the precision)."""
103
124
  ref = 0 if altitude > 0 else 1
104
125
  self._ef["GPS"][piexif.GPSIFD.GPSAltitude] = (
105
- int(abs(altitude) * precision),
106
- precision,
126
+ Fraction.from_float(math.fabs(altitude))
127
+ .limit_denominator()
128
+ .as_integer_ratio()
107
129
  )
108
130
  self._ef["GPS"][piexif.GPSIFD.GPSAltitudeRef] = ref
109
-
110
- def add_direction(
111
- self, direction: float, ref: str = "T", precision: int = 100
112
- ) -> None:
131
+ if LOG.isEnabledFor(logging.DEBUG):
132
+ LOG.debug(
133
+ 'GPSAltitudeRef: "%s"\tGPSAltitude: %s',
134
+ self._ef["GPS"][piexif.GPSIFD.GPSAltitudeRef],
135
+ self._ef["GPS"][piexif.GPSIFD.GPSAltitude],
136
+ )
137
+
138
+ def add_direction(self, direction: float, ref: str = "T") -> None:
113
139
  """Add image direction."""
140
+
114
141
  # normalize direction
115
- direction = direction % 360.0
142
+ direction = math.fmod(direction, 360.0)
116
143
  self._ef["GPS"][piexif.GPSIFD.GPSImgDirection] = (
117
- int(abs(direction) * precision),
118
- precision,
144
+ Fraction.from_float(direction).limit_denominator().as_integer_ratio()
119
145
  )
120
146
  self._ef["GPS"][piexif.GPSIFD.GPSImgDirectionRef] = ref
147
+ if LOG.isEnabledFor(logging.DEBUG):
148
+ LOG.debug(
149
+ 'GPSImgDirectionRef: "%s"\tGPSImgDirection: %s',
150
+ self._ef["GPS"][piexif.GPSIFD.GPSImgDirectionRef],
151
+ self._ef["GPS"][piexif.GPSIFD.GPSImgDirection],
152
+ )
121
153
 
122
154
  def add_make(self, make: str) -> None:
123
155
  if not make:
mapillary_tools/utils.py CHANGED
@@ -31,6 +31,7 @@ def is_image_file(path: Path) -> bool:
31
31
  ".tiff",
32
32
  ".pgm",
33
33
  ".pnm",
34
+ ".36p",
34
35
  )
35
36
 
36
37
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapillary_tools
3
- Version: 0.14.4
3
+ Version: 0.14.5
4
4
  Summary: Mapillary Image/Video Import Pipeline
5
5
  Author-email: Mapillary <support@mapillary.com>
6
6
  License: BSD
@@ -1,4 +1,4 @@
1
- mapillary_tools/__init__.py,sha256=SlLq3LO5ZN4Ap8_XR8x6nXyckJ4qcIktiWVQg34oqMY,19
1
+ mapillary_tools/__init__.py,sha256=QPwHkhbn32xwJH7B6GBDJs1faHBKSuZUsKugKUv8LXk,19
2
2
  mapillary_tools/api_v4.py,sha256=bckAU_atUs0pSuqySeY4W0Rs011a21ClJHo_mbbcXXw,4864
3
3
  mapillary_tools/authenticate.py,sha256=mmaOwjQ444DcX4lRw2ms3naBg5Y_xwIJAIWeVdsQfqM,11742
4
4
  mapillary_tools/blackvue_parser.py,sha256=ea2JtU9MWU6yB0bQlF970_Of0bJVofSTRq1P30WKW-0,5623
@@ -6,7 +6,7 @@ mapillary_tools/config.py,sha256=LDxQoL2StjLGPefCN0y67nhIDN3xSE6Qn8G-tWC-oGA,342
6
6
  mapillary_tools/constants.py,sha256=fk5HBczTBGyDOKQy-grzlf0SafiGwggdF8Ota13Rk0k,6235
7
7
  mapillary_tools/exceptions.py,sha256=uxTgBEfXgGxT0XNGRIAZ5mjtdqsCYfP6gnaXAK_ewBM,2483
8
8
  mapillary_tools/exif_read.py,sha256=nAbZDYAIBx3g4n6QIGKXX3s-A3SkfuvZQBInDrXMlKk,32220
9
- mapillary_tools/exif_write.py,sha256=I9GSs8KRd28QyKPVNHuxesSVbBvahHqKBS3nw9HoLsg,8830
9
+ mapillary_tools/exif_write.py,sha256=XX-DZiWDClk50Pbq7qyn-7mzaGxfFqEsx-kHFfQzAN0,9932
10
10
  mapillary_tools/exiftool_read.py,sha256=5uatYE9mgbg2d9NAnPfX22nSRBjXhJ9ayMqNMd4QwGM,15779
11
11
  mapillary_tools/exiftool_read_video.py,sha256=23O_bjUOVq6j7i3xMz6fY-XIEsjinsCejK_0nrbFyOM,16084
12
12
  mapillary_tools/exiftool_runner.py,sha256=g4gSyqeh3D6EnMJ-c3s-RnO2EP_jD354Qkaz0Y-4D04,1658
@@ -24,7 +24,7 @@ mapillary_tools/types.py,sha256=pIU2wcxiOUWT5Pd05pgNzY9EVEDlwoldtlF2IIYYvE0,5909
24
24
  mapillary_tools/upload.py,sha256=XejAgmVW4Y33MiQ2g-shvHZA_zXTekEsOUHUHNx2AE4,24047
25
25
  mapillary_tools/upload_api_v4.py,sha256=VgOf7RhfUuzmlSBUp5CpekKIJ0xQrC0r-r0Ds9-wU4I,7344
26
26
  mapillary_tools/uploader.py,sha256=T2BNlncuFibg5RJ7c2qweUXDAg6-zYc-rdgbV_JEKDU,46636
27
- mapillary_tools/utils.py,sha256=HjTZ01GQv_UNGySaTZ_Mc1Gn_Y0x3knQf7Vh17whDFw,8108
27
+ mapillary_tools/utils.py,sha256=jKId-E1n1rfuFOjMIIRgkvm6CxkvFWvfg6rqjsoa_6g,8124
28
28
  mapillary_tools/camm/camm_builder.py,sha256=ub6Z9ijep8zAo1NOlU51Gxk95kQ2vfN58YgVCLmNMRk,9211
29
29
  mapillary_tools/camm/camm_parser.py,sha256=aNHP65hNXYQBWBTfhaj_S5XYzmAHhjwcAfGhbm83__o,18043
30
30
  mapillary_tools/commands/__init__.py,sha256=41CFrPLGlG3566uhxssEF3TGAtSpADFPPcDMHbViU0E,171
@@ -69,9 +69,9 @@ mapillary_tools/mp4/simple_mp4_builder.py,sha256=9TUGk1hzI6mQFN1P30jwHL3dCYz3Zz7
69
69
  mapillary_tools/mp4/simple_mp4_parser.py,sha256=g3vvPhBoNu7anhVzC5_XQCV7IwfRWro1vJ6d6GyDkHE,6315
70
70
  mapillary_tools/serializer/description.py,sha256=ECnQxC-1LOgkAKE5qFi9Y2KuCeH8KPUjjNFDiwebjvo,18647
71
71
  mapillary_tools/serializer/gpx.py,sha256=_xx6gHjaWHrlXaUpB5GGBrbRKzbExFyIzWWAH-CvksI,4383
72
- mapillary_tools-0.14.4.dist-info/licenses/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
73
- mapillary_tools-0.14.4.dist-info/METADATA,sha256=DmtexHTWyoTovIswRtvkT638DbdPNXcfVfPcaCflu4w,22200
74
- mapillary_tools-0.14.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- mapillary_tools-0.14.4.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
76
- mapillary_tools-0.14.4.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
77
- mapillary_tools-0.14.4.dist-info/RECORD,,
72
+ mapillary_tools-0.14.5.dist-info/licenses/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
73
+ mapillary_tools-0.14.5.dist-info/METADATA,sha256=DId1oYdgfsgoOtZyp7J3Nnu5TyIY6aaGpGsPGuCWv9k,22200
74
+ mapillary_tools-0.14.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ mapillary_tools-0.14.5.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
76
+ mapillary_tools-0.14.5.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
77
+ mapillary_tools-0.14.5.dist-info/RECORD,,