mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 17:21:38 -05:00
56 lines
1.8 KiB
Ruby
56 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Points::RawDataLonlatExtractor
|
|
def initialize(point)
|
|
@point = point
|
|
end
|
|
|
|
def call
|
|
lonlat = extract_lonlat(@point)
|
|
|
|
@point.update(
|
|
longitude: lonlat[0],
|
|
latitude: lonlat[1]
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
# rubocop:disable Metrics/MethodLength
|
|
def extract_lonlat(point)
|
|
if point.raw_data.dig('activitySegment', 'waypointPath', 'waypoints', 0)
|
|
# google_semantic_history_parser
|
|
[
|
|
point.raw_data['activitySegment']['waypointPath']['waypoints'][0]['lngE7'].to_f / 10**7,
|
|
point.raw_data['activitySegment']['waypointPath']['waypoints'][0]['latE7'].to_f / 10**7
|
|
]
|
|
elsif point.raw_data['longitudeE7'] && point.raw_data['latitudeE7']
|
|
# google records
|
|
[
|
|
point.raw_data['longitudeE7'].to_f / 10**7,
|
|
point.raw_data['latitudeE7'].to_f / 10**7
|
|
]
|
|
elsif point.raw_data.dig('position', 'LatLng')
|
|
# google phone export
|
|
raw_coordinates = point.raw_data['position']['LatLng']
|
|
if raw_coordinates.include?('°')
|
|
raw_coordinates.split(', ').map { _1.chomp('°') }
|
|
else
|
|
raw_coordinates.delete('geo:').split(',')
|
|
end
|
|
elsif point.raw_data['lon'] && point.raw_data['lat']
|
|
# gpx_track_importer, owntracks
|
|
[point.raw_data['lon'], point.raw_data['lat']]
|
|
elsif point.raw_data.dig('geometry', 'coordinates', 0) && point.raw_data.dig('geometry', 'coordinates', 1)
|
|
# geojson
|
|
[
|
|
point.raw_data['geometry']['coordinates'][0],
|
|
point.raw_data['geometry']['coordinates'][1]
|
|
]
|
|
elsif point.raw_data['longitude'] && point.raw_data['latitude']
|
|
# immich_api, photoprism_api
|
|
[point.raw_data['longitude'], point.raw_data['latitude']]
|
|
end
|
|
end
|
|
# rubocop:enable Metrics/MethodLength
|
|
end
|