mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 17:21:38 -05:00
72 lines
1.8 KiB
Ruby
72 lines
1.8 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
module Places
|
||
|
|
class NearbySearch
|
||
|
|
RADIUS_KM = 0.5
|
||
|
|
MAX_RESULTS = 10
|
||
|
|
|
||
|
|
def initialize(latitude:, longitude:, radius: RADIUS_KM, limit: MAX_RESULTS)
|
||
|
|
@latitude = latitude
|
||
|
|
@longitude = longitude
|
||
|
|
@radius = radius
|
||
|
|
@limit = limit
|
||
|
|
end
|
||
|
|
|
||
|
|
def call
|
||
|
|
return [] unless reverse_geocoding_enabled?
|
||
|
|
|
||
|
|
results = Geocoder.search(
|
||
|
|
[latitude, longitude],
|
||
|
|
limit: limit,
|
||
|
|
distance_sort: true,
|
||
|
|
radius: radius,
|
||
|
|
units: :km
|
||
|
|
)
|
||
|
|
|
||
|
|
format_results(results)
|
||
|
|
rescue StandardError => e
|
||
|
|
Rails.logger.error("Nearby places search error: #{e.message}")
|
||
|
|
[]
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
attr_reader :latitude, :longitude, :radius, :limit
|
||
|
|
|
||
|
|
def reverse_geocoding_enabled?
|
||
|
|
DawarichSettings.reverse_geocoding_enabled?
|
||
|
|
end
|
||
|
|
|
||
|
|
def format_results(results)
|
||
|
|
results.map do |result|
|
||
|
|
properties = result.data['properties'] || {}
|
||
|
|
coordinates = result.data.dig('geometry', 'coordinates') || [longitude, latitude]
|
||
|
|
|
||
|
|
{
|
||
|
|
name: extract_name(result.data),
|
||
|
|
latitude: coordinates[1],
|
||
|
|
longitude: coordinates[0],
|
||
|
|
osm_id: properties['osm_id'],
|
||
|
|
osm_type: properties['osm_type'],
|
||
|
|
osm_key: properties['osm_key'],
|
||
|
|
osm_value: properties['osm_value'],
|
||
|
|
city: properties['city'],
|
||
|
|
country: properties['country'],
|
||
|
|
street: properties['street'],
|
||
|
|
housenumber: properties['housenumber'],
|
||
|
|
postcode: properties['postcode']
|
||
|
|
}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def extract_name(data)
|
||
|
|
properties = data['properties'] || {}
|
||
|
|
|
||
|
|
properties['name'] ||
|
||
|
|
[properties['street'], properties['housenumber']].compact.join(' ').presence ||
|
||
|
|
properties['city'] ||
|
||
|
|
'Unknown Place'
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|