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.
- mapillary_tools/__init__.py +1 -1
- mapillary_tools/exif_write.py +61 -29
- mapillary_tools/utils.py +1 -0
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/METADATA +1 -1
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/RECORD +9 -9
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/WHEEL +0 -0
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/entry_points.txt +0 -0
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/licenses/LICENSE +0 -0
- {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.5.dist-info}/top_level.txt +0 -0
mapillary_tools/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
VERSION = "0.14.
|
|
1
|
+
VERSION = "0.14.5"
|
mapillary_tools/exif_write.py
CHANGED
|
@@ -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,
|
|
33
|
-
) -> tuple[tuple[
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
87
|
-
|
|
90
|
+
(
|
|
91
|
+
Fraction.from_float(dt.second + dt.microsecond / 1e6)
|
|
92
|
+
.limit_denominator()
|
|
93
|
+
.as_integer_ratio()
|
|
94
|
+
),
|
|
88
95
|
)
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
142
|
+
direction = math.fmod(direction, 360.0)
|
|
116
143
|
self._ef["GPS"][piexif.GPSIFD.GPSImgDirection] = (
|
|
117
|
-
|
|
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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
mapillary_tools/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
73
|
-
mapillary_tools-0.14.
|
|
74
|
-
mapillary_tools-0.14.
|
|
75
|
-
mapillary_tools-0.14.
|
|
76
|
-
mapillary_tools-0.14.
|
|
77
|
-
mapillary_tools-0.14.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|