mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-11 17:51:39 -05:00
Improve GeoJSON import service to work with FeatureCollection
This commit is contained in:
parent
52f9a64716
commit
90bfd13f95
1 changed files with 43 additions and 18 deletions
|
|
@ -8,31 +8,56 @@ class Geojson::Params
|
|||
end
|
||||
|
||||
def call
|
||||
json['features'].map do |point|
|
||||
next if point[:geometry].nil? || point.dig(:properties, :timestamp).nil?
|
||||
|
||||
{
|
||||
latitude: point[:geometry][:coordinates][1],
|
||||
longitude: point[:geometry][:coordinates][0],
|
||||
battery_status: point[:properties][:battery_state],
|
||||
battery: battery_level(point[:properties][:battery_level]),
|
||||
timestamp: Time.zone.at(point[:properties][:timestamp]),
|
||||
altitude: point[:properties][:altitude],
|
||||
velocity: point[:properties][:speed],
|
||||
tracker_id: point[:properties][:device_id],
|
||||
ssid: point[:properties][:wifi],
|
||||
accuracy: point[:properties][:horizontal_accuracy],
|
||||
vertical_accuracy: point[:properties][:vertical_accuracy],
|
||||
raw_data: point
|
||||
}
|
||||
end.compact
|
||||
case json['type']
|
||||
when 'Feature' then process_feature(json)
|
||||
when 'FeatureCollection' then process_feature_collection(json)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def process_feature(json)
|
||||
json['features'].map do |point|
|
||||
next if point[:geometry].nil? || point.dig(:properties, :timestamp).nil?
|
||||
|
||||
build_point(point)
|
||||
end.compact
|
||||
end
|
||||
|
||||
def process_feature_collection(json)
|
||||
json['features'].map { |feature| process_feature(feature) }
|
||||
end
|
||||
|
||||
def build_point(point)
|
||||
{
|
||||
latitude: point[:geometry][:coordinates][1],
|
||||
longitude: point[:geometry][:coordinates][0],
|
||||
battery_status: point[:properties][:battery_state],
|
||||
battery: battery_level(point[:properties][:battery_level]),
|
||||
timestamp: timestamp(point),
|
||||
altitude: altitude(point),
|
||||
velocity: point[:properties][:speed],
|
||||
tracker_id: point[:properties][:device_id],
|
||||
ssid: point[:properties][:wifi],
|
||||
accuracy: point[:properties][:horizontal_accuracy],
|
||||
vertical_accuracy: point[:properties][:vertical_accuracy],
|
||||
raw_data: point
|
||||
}
|
||||
end
|
||||
|
||||
def battery_level(level)
|
||||
value = (level.to_f * 100).to_i
|
||||
|
||||
value.positive? ? value : nil
|
||||
end
|
||||
|
||||
def altitude(point)
|
||||
point.dig(:properties, :altitude) || point.dig(:geometry, :coordinates, 2)
|
||||
end
|
||||
|
||||
def timestamp(point)
|
||||
value = point.dig(:properties, :timestamp) || point.dig(:geometry, :coordinates, 3)
|
||||
|
||||
Time.zone.at(value)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in a new issue