Created
July 30, 2014 01:14
-
-
Save moea/cb09ec395462209ea2db 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 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