Last active
October 8, 2015 00:12
-
-
Save qhwa/f2a8f3afa3e94cbc7a80 to your computer and use it in GitHub Desktop.
find nearby users
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# find users nearby a certain location and print them | |
# by qhwa | |
require 'json' | |
require 'ostruct' | |
require 'logger' | |
class User < OpenStruct | |
OFFICE_GPS = [ 53.3381985, -6.2592576 ] | |
def initialize(attrs={}) | |
super | |
self.latitude = latitude.to_f | |
self.longitude = longitude.to_f | |
end | |
def self.load_file file_path | |
File.open(file_path) do |file| | |
file.each.map do |line| | |
begin | |
User.new JSON.parse(line.chomp) | |
rescue JSON::ParserError | |
logger.warn { "Error parsing user data at line ##{file.lineno}: #{line}" } | |
nil | |
end | |
end.compact | |
end | |
end | |
def nearby? target=OFFICE_GPS, distance: 100_000 | |
compute_distance([latitude, longitude], target) <= distance | |
end | |
private | |
# calculate distance with two GPS location | |
# | |
# @param loc1 Array, format: [lat, lng] | |
# @param loc2 Array, format: [lat, lng] | |
def compute_distance loc1, loc2 | |
rad_per_deg = Math::PI/180 | |
earth_radius = 6371_000 | |
dlat_rad = (loc2[0]-loc1[0]) * rad_per_deg | |
dlng_rad = (loc2[1]-loc1[1]) * rad_per_deg | |
lat1_rad, lng1_rad = loc1.map {|i| i * rad_per_deg } | |
lat2_rad, lng2_rad = loc2.map {|i| i * rad_per_deg } | |
a = Math.sin(dlat_rad/2)**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlng_rad/2)**2 | |
c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a)) | |
earth_radius * c | |
end | |
def self.logger | |
@logger ||= Logger.new(STDOUT) | |
end | |
end | |
if __FILE__ == $0 | |
users = User.load_file('users.txt') | |
users.select!(&:nearby?) | |
users.sort_by!(&:user_id) | |
# gem install awesome_print | |
require 'ap' | |
ap users.map {|u| { id: u.user_id, name: u.name } } | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"latitude": "52.986375", "user_id": 12, "name": "Christina McArdle", "longitude": "-6.043701"} | |
{"latitude": "51.92893", "user_id": 1, "name": "Alice Cahill", "longitude": "-10.27699"} | |
{"latitude": "51.8856167", "user_id": 2, "name": "Ian McArdle", "longitude": "-10.4240951"} | |
{"latitude": "52.3191841", "user_id": 3, "name": "Jack Enright", "longitude": "-8.5072391"} | |
{"latitude": "53.807778", "user_id": 28, "name": "Charlie Halligan", "longitude": "-7.714444"} | |
{"latitude": "53.4692815", "user_id": 7, "name": "Frank Kehoe", "longitude": "-9.436036"} | |
{"latitude": "54.0894797", "user_id": 8, "name": "Eoin Ahearn", "longitude": "-6.18671"} | |
{"latitude": "53.038056", "user_id": 26, "name": "Stephen McArdle", "longitude": "-7.653889"} | |
{"latitude": "54.1225", "user_id": 27, "name": "Enid Gallagher", "longitude": "-8.143333"} | |
{"latitude": "53.1229599", "user_id": 6, "name": "Theresa Enright", "longitude": "-6.2705202"} | |
{"latitude": "52.2559432", "user_id": 9, "name": "Jack Dempsey", "longitude": "-7.1048927"} | |
{"latitude": "52.240382", "user_id": 10, "name": "Georgina Gallagher", "longitude": "-6.972413"} | |
{"latitude": "53.2451022", "user_id": 4, "name": "Ian Kehoe", "longitude": "-6.238335"} | |
{"latitude": "53.1302756", "user_id": 5, "name": "Nora Dempsey", "longitude": "-6.2397222"} | |
{"latitude": "53.008769", "user_id": 11, "name": "Richard Finnegan", "longitude": "-6.1056711"} | |
{"latitude": "53.1489345", "user_id": 31, "name": "Alan Behan", "longitude": "-6.8422408"} | |
{"latitude": "53", "user_id": 13, "name": "Olive Ahearn", "longitude": "-7"} | |
{"latitude": "51.999447", "user_id": 14, "name": "Helen Cahill", "longitude": "-9.742744"} | |
{"latitude": "52.966", "user_id": 15, "name": "Michael Ahearn", "longitude": "-6.463"} | |
{"latitude": "52.366037", "user_id": 16, "name": "Ian Larkin", "longitude": "-8.179118"} | |
{"latitude": "54.180238", "user_id": 17, "name": "Patricia Cahill", "longitude": "-5.920898"} | |
{"latitude": "53.0033946", "user_id": 39, "name": "Lisa Ahearn", "longitude": "-6.3877505"} | |
{"latitude": "52.228056", "user_id": 18, "name": "Bob Larkin", "longitude": "-7.915833"} | |
{"latitude": "54.133333", "user_id": 24, "name": "Rose Enright", "longitude": "-6.433333"} | |
{"latitude": "55.033", "user_id": 19, "name": "Enid Cahill", "longitude": "-8.112"} | |
{"latitude": "53.521111", "user_id": 20, "name": "Enid Enright", "longitude": "-9.831111"} | |
{"latitude": "51.802", "user_id": 21, "name": "David Ahearn", "longitude": "-9.442"} | |
{"latitude": "54.374208", "user_id": 22, "name": "Charlie McArdle", "longitude": "-8.371639"} | |
{"latitude": "53.74452", "user_id": 29, "name": "Oliver Ahearn", "longitude": "-7.11167"} | |
{"latitude": "53.761389", "user_id": 30, "name": "Nick Enright", "longitude": "-7.2875"} | |
{"latitude": "54.080556", "user_id": 23, "name": "Eoin Gallagher", "longitude": "-6.361944"} | |
{"latitude": "52.833502", "user_id": 25, "name": "David Behan", "longitude": "-8.522366"} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment