Skip to content

Instantly share code, notes, and snippets.

@th0ma5w
Created March 27, 2014 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save th0ma5w/9815946 to your computer and use it in GitHub Desktop.
Save th0ma5w/9815946 to your computer and use it in GitHub Desktop.
Tile Server Quad Tree Math
(import 'java.lang.Math)
(defn tile-count [z]
(Math/pow 2 z))
(defn deg2num [lat_deg lon_deg z]
(let [lat_rad (Math/toRadians lat_deg)
n (tile-count z)
x (int (* (/ (+ lon_deg 180.0) 360.0) n))
y (int
(*
(/
(- 1.0
(/
(Math/log
(+
(Math/tan lat_rad)
(/ 1.0
(Math/cos lat_rad))))
Math/PI))
2)
n))]
(list x y z)))
(defn tilelink [lat lon z]
(let [u "http://a.tile.openstreetmap.org"
url (fn [x y z] (str u "/" z "/" x "/" y ".png"))
]
(apply url (deg2num lat lon z))))
(defn num2deg [x y z]
(let [n (tile-count z)
lon (- (* (/ x n) 360.0) 180.0)
lat_rad (Math/atan
(Math/sinh
(* Math/PI
(- 1
(/ (* 2 y) n)))))
lat (Math/toDegrees lat_rad)]
(list lat lon)))
(defn num2deg-bb [x y z]
(let [nw (num2deg x y z)
sw (num2deg x (+ 1 y) z)
ne (num2deg (+ 1 x) y z)
se (num2deg (+ 1 x) (+ 1 y) z)]
(list nw sw se ne)))
(defn bb-extents [bb]
(let [lats (map first bb)
lons (map second bb)
minlat (reduce min lats)
maxlat (reduce max lats)
minlon (reduce min lons)
maxlon (reduce max lons)]
(list minlat maxlat minlon maxlon)))
(defn deg2extents [lat lon z]
(bb-extents
(apply
num2deg-bb
(deg2num
lat lon z))))
(defn num2extents [x y z]
(bb-extents
(num2deg-bb x y z)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment