Skip to content

Instantly share code, notes, and snippets.

@mourner
Created August 9, 2016 11:10
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 mourner/19b95f46f36ce8bb78e13820bb7c84df to your computer and use it in GitHub Desktop.
Save mourner/19b95f46f36ce8bb78e13820bb7c84df to your computer and use it in GitHub Desktop.
Mercator horner approximation
// not working
// based on https://github.com/Project-OSRM/osrm-backend/blob/master/include/util/web_mercator.hpp
'use strict';
function latY(lat) {
var sin = Math.sin(lat * Math.PI / 180);
return 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI;
}
var c1 = [0.00000000000000000000000000e+00, 1.00000000000089108431373566e+00, 2.34439410386997223035693483e-06,
-3.21291701673364717170998957e-04, -6.62778508496089940141103135e-10, 3.68188055470304769936079078e-08,
6.31192702320492485752941578e-14, -1.77274453235716299127325443e-12, -2.24563810831776747318521450e-18,
3.13524754818073129982475171e-17, 2.09014225025314211415458228e-23, -9.82938075991732185095509716e-23];
var c2 = [1.00000000000000000000000000e+00, 2.34439410398970701719081061e-06, -3.72061271627251952928813333e-04,
-7.81802389685429267252612620e-10, 5.18418724186576447072888605e-08, 9.37468561198098681003717477e-14,
-3.30833288607921773936702558e-12, -4.78446279888774903983338274e-18, 9.32999229169156878168234191e-17,
9.17695141954265959600965170e-23, -8.72130728982012387640166055e-22, -3.23083224835967391884404730e-28];
function horner(c, x) {
var r = 0;
for (var i = 0; i < c.length; i++) {
r = r * x + c[i];
}
return r;
}
function latY2(lat) {
return horner(c1, lat * Math.PI / 180) / horner(c2, lat * Math.PI / 180);
}
var lats = [];
for (var i = 0; i < 10; i++) {
lats.push(Math.random() * 180 - 90);
}
console.time('normal');
for (var i = 0; i < lats.length; i++) latY(lats[i]);
console.timeEnd('normal');
console.time('approx');
for (var i = 0; i < lats.length; i++) latY2(lats[i]);
console.timeEnd('approx');
for (var i = 0; i < 10; i++) {
console.log(latY(lats[i]), latY2(lats[i]));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment