Skip to content

Instantly share code, notes, and snippets.

@moea
Created July 30, 2014 01:20
Show Gist options
  • Save moea/66c76afdcf193417b6ea to your computer and use it in GitHub Desktop.
Save moea/66c76afdcf193417b6ea 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 required-neighbors
[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))
north-south-neighbor (if (<= percentage-north *percentage-margin*)
:north
(if (<= (- 1 percentage-north) *percentage-margin*)
:south))
east-west-neighbor (if (<= percentage-east *percentage-margin*)
:east
(if (<= (- 1 percentage-east) *percentage-margin*)
:west))]
(disj #{north-south-neighbor east-west-neighbor} nil)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment