Skip to content

Instantly share code, notes, and snippets.

@moea
Created July 30, 2014 01:14
Show Gist options
  • Save moea/cb09ec395462209ea2db to your computer and use it in GitHub Desktop.
Save moea/cb09ec395462209ea2db to your computer and use it in GitHub Desktop.
(ns encounters.geo
(:require [geohash.core :as geohash]))
(def ^:dynamic *geohash-precision* 1)
(def ^:dynamic *radius-km* 6371.009)
(defn great-circle-distance
([lat lon lat' lon']
(great-circle-distance lat lon lat' lon' *radius-km*))
([lat lon lat' lon' radius]
(let [[lat-r lon-r lat-r' lon-r']
(map #(Math/toRadians %) [lat lon lat' lon'])]
(* radius
(Math/acos (+ (* (Math/sin lat-r) (Math/sin lat-r'))
(* (Math/cos lat-r)
(Math/cos lat-r')
(Math/cos (- lon-r lon-r')))))))))
(def ^:dynamic *percentage-margin* 0.05)
(defn get-geohashes
[lat lon]
(let [gh (geohash/encode lat lon *geohash-precision*)
{:keys [minlon minlat maxlon maxlat]} (geohash/decode-bbox gh)
percentage-north (/ (great-circle-distance lat lon maxlat lon)
(great-circle-distance minlat lon maxlat lon))
percentage-east (/ (great-circle-distance lat lon lat maxlon)
(great-circle-distance lat minlon lat maxlon))
neighbors #{}
neighbors (if (<= percentage-north *percentage-margin*)
(conj neighbors :north)
(if (<= (- 1 percentage-north) *percentage-margin*)
(conj neighbors :south)
neighbors))
neighbors (if (<= percentage-east *percentage-margin*)
(conj neighbors :east)
(if (<= (- 1 percentage-east) *percentage-margin*)
(conj neighbors :west)
neighbors))]
neighbors))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment