diff --git a/mapillary_tools/exiftool_read_video.py b/mapillary_tools/exiftool_read_video.py index f7fee661..5b778acd 100644 --- a/mapillary_tools/exiftool_read_video.py +++ b/mapillary_tools/exiftool_read_video.py @@ -182,7 +182,7 @@ def _aggregate_float_values_same_length( gps_fix=None, gps_precision=None, gps_ground_speed=ground_speed, - unix_timestamp_ms=int(timestamp * 1000), + unix_timestamp=timestamp, ) ) diff --git a/mapillary_tools/geo.py b/mapillary_tools/geo.py index 0e2570a3..c09b8c2c 100644 --- a/mapillary_tools/geo.py +++ b/mapillary_tools/geo.py @@ -16,6 +16,10 @@ @dataclasses.dataclass(order=True) class Point: + """ + 5-dimensional point. Its coordinates will also be dumped to the JSON description. + """ + # For reducing object sizes # dataclass(slots=True) not available until 3.10 __slots__ = ( @@ -41,11 +45,15 @@ class GPSFix(Enum): @dataclasses.dataclass class GpsPoint(Point): + """ + Extends Point with GPS data for filtering etc. + """ + gps_fix: T.Optional[GPSFix] = None gps_precision: T.Optional[float] = None gps_ground_speed: T.Optional[float] = None - unix_timestamp_ms: T.Optional[int] = None gps_horizontal_accuracy: T.Optional[float] = None + unix_timestamp: T.Optional[int] = None def _ecef_from_lla_DEPRECATED( diff --git a/mapillary_tools/geotag/blackvue_parser.py b/mapillary_tools/geotag/blackvue_parser.py index 3cde904a..12086f27 100644 --- a/mapillary_tools/geotag/blackvue_parser.py +++ b/mapillary_tools/geotag/blackvue_parser.py @@ -50,6 +50,7 @@ def _parse_gps_box(gps_data: bytes) -> T.Generator[geo.GpsPoint, None, None]: lon=nmea.longitude, alt=nmea.altitude, angle=None, + unix_timestamp=int(epoch_ms / 1000), ) diff --git a/mapillary_tools/geotag/camm_parser.py b/mapillary_tools/geotag/camm_parser.py index 966f7ad6..ac787b23 100644 --- a/mapillary_tools/geotag/camm_parser.py +++ b/mapillary_tools/geotag/camm_parser.py @@ -107,9 +107,7 @@ def _parse_point_from_sample( lon=box.data.longitude, alt=box.data.altitude, angle=None, - unix_timestamp_ms=int( - _gps_timestamp_to_unix(box.data.time_gps_epoch) * 1000 - ), + unix_timestamp=int(_gps_timestamp_to_unix(box.data.time_gps_epoch)), gps_fix=geo.GPSFix(box.data.gps_fix_type), gps_ground_speed=speed, gps_horizontal_accuracy=box.data.horizontal_accuracy, diff --git a/mapillary_tools/geotag/geotag_images_from_gpx_file.py b/mapillary_tools/geotag/geotag_images_from_gpx_file.py index e69b632c..a18eb335 100644 --- a/mapillary_tools/geotag/geotag_images_from_gpx_file.py +++ b/mapillary_tools/geotag/geotag_images_from_gpx_file.py @@ -146,10 +146,8 @@ def parse_gpx(gpx_file: Path) -> T.List[Track]: lon=point.longitude, alt=point.elevation, angle=None, - gps_fix=None, - gps_precision=None, gps_ground_speed=point.speed, - unix_timestamp_ms=int(time * 1000), + unix_timestamp=int(time), ) ) diff --git a/mapillary_tools/geotag/geotag_images_from_nmea_file.py b/mapillary_tools/geotag/geotag_images_from_nmea_file.py index 3472ced9..0c282f5a 100644 --- a/mapillary_tools/geotag/geotag_images_from_nmea_file.py +++ b/mapillary_tools/geotag/geotag_images_from_nmea_file.py @@ -58,10 +58,7 @@ def get_lat_lon_time_from_nmea(nmea_file: Path) -> T.List[geo.GpsPoint]: lon=lon, alt=alt, angle=None, - unix_timestamp_ms=int(time * 1000), - gps_fix=None, - gps_ground_speed=None, - gps_precision=None, + unix_timestamp=int(time), ) ) diff --git a/mapillary_tools/types.py b/mapillary_tools/types.py index c503964e..9ba03a63 100644 --- a/mapillary_tools/types.py +++ b/mapillary_tools/types.py @@ -81,7 +81,7 @@ class VideoMetadata: points: T.Sequence[geo.Point] make: T.Optional[str] = None model: T.Optional[str] = None - last_unix_ts: T.Optional[int] = None # GPS time of the last point as Unix ts + last_unix_ts: T.Optional[int] = None # GPS time of the last point as Unix ts def update_md5sum(self) -> None: if self.md5sum is None: @@ -332,8 +332,8 @@ def describe_error_metadata( }, "MAPLastUnixTimestamp": { "type": "integer", - "description": "UNIX timestamp of the last GPS point" - } + "description": "UNIX timestamp of the last GPS point", + }, }, "required": [ "MAPGPSTrack", @@ -602,7 +602,7 @@ def _from_video_desc(desc: VideoDescription) -> VideoMetadata: points=[_decode_point(entry) for entry in desc["MAPGPSTrack"]], make=desc.get("MAPDeviceMake"), model=desc.get("MAPDeviceModel"), - last_unix_ts=desc.get("MAPLastUnixTimestamp") + last_unix_ts=desc.get("MAPLastUnixTimestamp"), ) diff --git a/mapillary_tools/video_data_extraction/extract_video_data.py b/mapillary_tools/video_data_extraction/extract_video_data.py index a760bdc6..87f11e3d 100644 --- a/mapillary_tools/video_data_extraction/extract_video_data.py +++ b/mapillary_tools/video_data_extraction/extract_video_data.py @@ -84,8 +84,8 @@ def process_file(self, file: Path) -> VideoMetadataOrError: {**log_vars, "e": e}, ) - last_ts = points[-1].unix_timestamp_ms if len(points) > 0 else None - last_unix_ts = int(last_ts/1000) if last_ts else None + last_ts = points[-1].unix_timestamp if len(points) > 0 else None + last_ts_int = int(last_ts / 1000) if last_ts else None # After trying all parsers, return the points if we found any, otherwise # the last exception thrown or a default one. @@ -99,7 +99,7 @@ def process_file(self, file: Path) -> VideoMetadataOrError: points=self._gps_points_to_points(points), make=make, model=model, - last_unix_ts=last_unix_ts + last_unix_ts=last_ts_int, ) video_metadata.update_md5sum() return video_metadata diff --git a/tests/unit/test_blackvue_parser.py b/tests/unit/test_blackvue_parser.py index 6b872fe9..f9e54ca0 100644 --- a/tests/unit/test_blackvue_parser.py +++ b/tests/unit/test_blackvue_parser.py @@ -45,12 +45,27 @@ def test_parse_points(): assert x is not None assert [ geo.GpsPoint( - time=0.0, lat=38.8861575, lon=-76.99239516666667, alt=10.2, angle=None + time=0.0, + lat=38.8861575, + lon=-76.99239516666667, + alt=10.2, + angle=None, + unix_timestamp=1623057129, ), geo.GpsPoint( - time=0.968, lat=38.88615816666667, lon=-76.992434, alt=7.7, angle=None + time=0.968, + lat=38.88615816666667, + lon=-76.992434, + alt=7.7, + angle=None, + unix_timestamp=1623057130, ), geo.GpsPoint( - time=0.968, lat=38.88615816666667, lon=-76.992434, alt=7.7, angle=None + time=0.968, + lat=38.88615816666667, + lon=-76.992434, + alt=7.7, + angle=None, + unix_timestamp=1623057130, ), ] == list(x)