Skip to content

Instantly share code, notes, and snippets.

@sconnelley
Created July 14, 2014 16:04
Show Gist options
  • Save sconnelley/23dd7d6e7314cbdcb0b3 to your computer and use it in GitHub Desktop.
Save sconnelley/23dd7d6e7314cbdcb0b3 to your computer and use it in GitHub Desktop.
Mercator Projection, from Google with Google-ly bits removed.
var Mercator = (function(){
/**
Mercator Projection
ref: https://developers.google.com/maps/documentation/javascript/examples/map-coordinates?csw=1
**/
function MercatorProjection(tileSize) {
this.tileSize = tileSize || 256;
this.ONE_DEGREE = Math.PI / 180;
this.pixelOrigin_ = [this.tileSize / 2, this.tileSize / 2];
this.pixelsPerLonDegree_ = this.tileSize / 360;
this.pixelsPerLonRadian_ = this.tileSize / (2 * Math.PI);
};
MercatorProjection.prototype.bound = function(value, opt_min, opt_max){
if (opt_min != null) value = Math.max(value, opt_min);
if (opt_max != null) value = Math.min(value, opt_max);
return value;
};
MercatorProjection.prototype.radiansToDegrees = function(rad){
return rad / this.ONE_DEGREE;
};
MercatorProjection.prototype.degreesToRadians = function(deg){
return deg * this.ONE_DEGREE;
};
MercatorProjection.prototype.fromLatLngToPoint = function(latLng, zoom, opt_point) {
var me = this;
var point = opt_point || [0, 0];
var origin = me.pixelOrigin_;
point[0] = origin[0] + latLng[1] * me.pixelsPerLonDegree_;
// Truncating to 0.9999 effectively limits latitude to 89.189. This is
// about a third of a tile past the edge of the world tile.
var siny = me.bound(Math.sin(me.degreesToRadians(latLng[0])), -0.9999,
0.9999);
point[1] = origin[1] + 0.5 * Math.log((1 + siny) / (1 - siny)) *
-me.pixelsPerLonRadian_;
var n = 1 << zoom;
point[0] = point[0] * n;
point[1] = point[1] * n;
return point;
};
MercatorProjection.prototype.fromPointToLatLng = function(point) {
var me = this;
var origin = me.pixelOrigin_;
var lng = (point[0] - origin[0]) / me.pixelsPerLonDegree_;
var latRadians = (point[1] - origin[1]) / -me.pixelsPerLonRadian_;
var lat = me.radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) -
Math.PI / 2);
return [lat, lng];
};
return new MercatorProjection(256);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment