Created
July 30, 2014 01:31
-
-
Save moea/c0d34d16ed2f3274f983 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
(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-south (/ (great-circle-distance lat lon maxlat lon) | |
(great-circle-distance minlat lon maxlat lon)) | |
percentage-west (/ (great-circle-distance lat lon lat maxlon) | |
(great-circle-distance lat minlon lat maxlon)) | |
north-south-neighbor (if (<= percentage-south *percentage-margin*) | |
:north | |
(if (<= (- 1 percentage-south) *percentage-margin*) | |
:south)) | |
east-west-neighbor (if (<= percentage-west *percentage-margin*) | |
:east | |
(if (<= (- 1 percentage-west) *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