Move mercator transforms to Projection.js.
The SphericalMercator mixin is not required for coordinate transforms. Default transforms included whenever Projection.js is included.
This commit is contained in:
@@ -1,14 +1,6 @@
|
|||||||
// make map available for easy debugging
|
// make map available for easy debugging
|
||||||
var map;
|
var map;
|
||||||
|
|
||||||
// if your application transforms coordinates to and from EPSG:102113 then
|
|
||||||
// you must uncomment the lines below
|
|
||||||
|
|
||||||
// OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:102113",
|
|
||||||
// OpenLayers.Layer.SphericalMercator.projectForward);
|
|
||||||
// OpenLayers.Projection.addTransform("EPSG:102113", "EPSG:4326",
|
|
||||||
// OpenLayers.Layer.SphericalMercator.projectInverse);
|
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
|
|||||||
@@ -114,14 +114,14 @@ OpenLayers.Layer.SphericalMercator = {
|
|||||||
* Returns:
|
* Returns:
|
||||||
* {<OpenLayers.LonLat>} The coordinates transformed to Mercator.
|
* {<OpenLayers.LonLat>} The coordinates transformed to Mercator.
|
||||||
*/
|
*/
|
||||||
forwardMercator: function(lon, lat) {
|
forwardMercator: (function() {
|
||||||
var x = lon * 20037508.34 / 180;
|
var gg = new OpenLayers.Projection("EPSG:4326");
|
||||||
var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
|
var sm = new OpenLayers.Projection("EPSG:900913");
|
||||||
|
return function(lon, lat) {
|
||||||
y = y * 20037508.34 / 180;
|
var point = OpenLayers.Projection.transform({x: lon, y: lat}, gg, sm);
|
||||||
|
return new OpenLayers.LonLat(point.x, point.y);
|
||||||
return new OpenLayers.LonLat(x, y);
|
};
|
||||||
},
|
})(),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APIMethod: inverseMercator
|
* APIMethod: inverseMercator
|
||||||
@@ -134,84 +134,13 @@ OpenLayers.Layer.SphericalMercator = {
|
|||||||
* Returns:
|
* Returns:
|
||||||
* {<OpenLayers.LonLat>} The coordinates transformed to EPSG:4326.
|
* {<OpenLayers.LonLat>} The coordinates transformed to EPSG:4326.
|
||||||
*/
|
*/
|
||||||
inverseMercator: function(x, y) {
|
inverseMercator: (function() {
|
||||||
|
var gg = new OpenLayers.Projection("EPSG:4326");
|
||||||
var lon = (x / 20037508.34) * 180;
|
var sm = new OpenLayers.Projection("EPSG:900913");
|
||||||
var lat = (y / 20037508.34) * 180;
|
return function(x, y) {
|
||||||
|
var point = OpenLayers.Projection.transform({x: x, y: y}, sm, gg);
|
||||||
lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
|
return new OpenLayers.LonLat(point.x, point.y);
|
||||||
|
};
|
||||||
return new OpenLayers.LonLat(lon, lat);
|
})()
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: projectForward
|
|
||||||
* Given an object with x and y properties in EPSG:4326, modify the x,y
|
|
||||||
* properties on the object to be the Spherical Mercator projected
|
|
||||||
* coordinates.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* point - {Object} An object with x and y properties.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {Object} The point, with the x and y properties transformed to spherical
|
|
||||||
* mercator.
|
|
||||||
*/
|
|
||||||
projectForward: function(point) {
|
|
||||||
var lonlat = OpenLayers.Layer.SphericalMercator.forwardMercator(point.x, point.y);
|
|
||||||
point.x = lonlat.lon;
|
|
||||||
point.y = lonlat.lat;
|
|
||||||
return point;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: projectInverse
|
|
||||||
* Given an object with x and y properties in Spherical Mercator, modify
|
|
||||||
* the x,y properties on the object to be the unprojected coordinates.
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* point - {Object} An object with x and y properties.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* {Object} The point, with the x and y properties transformed from
|
|
||||||
* spherical mercator to unprojected coordinates..
|
|
||||||
*/
|
|
||||||
projectInverse: function(point) {
|
|
||||||
var lonlat = OpenLayers.Layer.SphericalMercator.inverseMercator(point.x, point.y);
|
|
||||||
point.x = lonlat.lon;
|
|
||||||
point.y = lonlat.lat;
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Note: Transforms for web mercator <-> EPSG:4326
|
|
||||||
* OpenLayers recognizes EPSG:3857, EPSG:900913, EPSG:102113 and EPSG:102100.
|
|
||||||
* OpenLayers originally started referring to EPSG:900913 as web mercator.
|
|
||||||
* The EPSG has declared EPSG:3857 to be web mercator.
|
|
||||||
* ArcGIS 10 recognizes the EPSG:3857, EPSG:102113, and EPSG:102100 as
|
|
||||||
* equivalent. See http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2009/11/20/ArcGIS-Online-moving-to-Google-_2F00_-Bing-tiling-scheme_3A00_-What-does-this-mean-for-you_3F00_.aspx#12084
|
|
||||||
*/
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
// list of equivalent codes for web mercator
|
|
||||||
var codes = ["EPSG:900913", "EPSG:3857", "EPSG:102113", "EPSG:102100"];
|
|
||||||
|
|
||||||
var add = OpenLayers.Projection.addTransform;
|
|
||||||
var merc = OpenLayers.Layer.SphericalMercator;
|
|
||||||
var same = OpenLayers.Projection.nullTransform;
|
|
||||||
|
|
||||||
var i, len, code, other, j;
|
|
||||||
for (i=0, len=codes.length; i<len; ++i) {
|
|
||||||
code = codes[i];
|
|
||||||
add("EPSG:4326", code, merc.projectForward);
|
|
||||||
add(code, "EPSG:4326", merc.projectInverse);
|
|
||||||
for (j=i+1; j<len; ++j) {
|
|
||||||
other = codes[j];
|
|
||||||
add(code, other, same);
|
|
||||||
add(other, code, same);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|||||||
@@ -195,9 +195,13 @@ OpenLayers.Projection.transform = function(point, source, dest) {
|
|||||||
}
|
}
|
||||||
if (source.proj && dest.proj) {
|
if (source.proj && dest.proj) {
|
||||||
point = Proj4js.transform(source.proj, dest.proj, point);
|
point = Proj4js.transform(source.proj, dest.proj, point);
|
||||||
} else if (OpenLayers.Projection.transforms[source.getCode()] &&
|
} else {
|
||||||
OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]) {
|
var sourceCode = source.getCode();
|
||||||
OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);
|
var destCode = dest.getCode();
|
||||||
|
var transforms = OpenLayers.Projection.transforms;
|
||||||
|
if (transforms[sourceCode] && transforms[sourceCode][destCode]) {
|
||||||
|
transforms[sourceCode][destCode](point);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return point;
|
return point;
|
||||||
@@ -209,10 +213,6 @@ OpenLayers.Projection.transform = function(point, source, dest) {
|
|||||||
* proj4js is not available:
|
* proj4js is not available:
|
||||||
*
|
*
|
||||||
* (code)
|
* (code)
|
||||||
* OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:3857",
|
|
||||||
* OpenLayers.Layer.SphericalMercator.projectForward);
|
|
||||||
* OpenLayers.Projection.addTransform("EPSG:3857", "EPSG:3857",
|
|
||||||
* OpenLayers.Layer.SphericalMercator.projectInverse);
|
|
||||||
* OpenLayers.Projection.addTransform("EPSG:3857", "EPSG:900913",
|
* OpenLayers.Projection.addTransform("EPSG:3857", "EPSG:900913",
|
||||||
* OpenLayers.Projection.nullTransform);
|
* OpenLayers.Projection.nullTransform);
|
||||||
* OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:3857",
|
* OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:3857",
|
||||||
@@ -222,3 +222,47 @@ OpenLayers.Projection.transform = function(point, source, dest) {
|
|||||||
OpenLayers.Projection.nullTransform = function(point) {
|
OpenLayers.Projection.nullTransform = function(point) {
|
||||||
return point;
|
return point;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: Transforms for web mercator <-> EPSG:4326
|
||||||
|
* OpenLayers recognizes EPSG:3857, EPSG:900913, EPSG:102113 and EPSG:102100.
|
||||||
|
* OpenLayers originally started referring to EPSG:900913 as web mercator.
|
||||||
|
* The EPSG has declared EPSG:3857 to be web mercator.
|
||||||
|
* ArcGIS 10 recognizes the EPSG:3857, EPSG:102113, and EPSG:102100 as
|
||||||
|
* equivalent. See http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2009/11/20/ArcGIS-Online-moving-to-Google-_2F00_-Bing-tiling-scheme_3A00_-What-does-this-mean-for-you_3F00_.aspx#12084
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
var pole = 20037508.34;
|
||||||
|
|
||||||
|
function inverseMercator(xy) {
|
||||||
|
xy.x = 180 * xy.x / pole;
|
||||||
|
xy.y = 180 / Math.PI * (2 * Math.atan(Math.exp((xy.y / pole) * Math.PI)) - Math.PI / 2);
|
||||||
|
return xy;
|
||||||
|
}
|
||||||
|
|
||||||
|
function forwardMercator(xy) {
|
||||||
|
xy.x = xy.x * pole / 180;
|
||||||
|
xy.y = Math.log(Math.tan((90 + xy.y) * Math.PI / 360)) / Math.PI * pole;
|
||||||
|
return xy;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list of equivalent codes for web mercator
|
||||||
|
var codes = ["EPSG:900913", "EPSG:3857", "EPSG:102113", "EPSG:102100"];
|
||||||
|
|
||||||
|
var add = OpenLayers.Projection.addTransform;
|
||||||
|
var same = OpenLayers.Projection.nullTransform;
|
||||||
|
|
||||||
|
var i, len, code, other, j;
|
||||||
|
for (i=0, len=codes.length; i<len; ++i) {
|
||||||
|
code = codes[i];
|
||||||
|
add("EPSG:4326", code, forwardMercator);
|
||||||
|
add(code, "EPSG:4326", inverseMercator);
|
||||||
|
for (j=i+1; j<len; ++j) {
|
||||||
|
other = codes[j];
|
||||||
|
add(code, other, same);
|
||||||
|
add(other, code, same);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
|
|||||||
@@ -65,11 +65,7 @@
|
|||||||
// works correctly both ways.
|
// works correctly both ways.
|
||||||
var gLatLng = new google.maps.LatLng(50,100);
|
var gLatLng = new google.maps.LatLng(50,100);
|
||||||
// v3 uses sphericalMercator by default
|
// v3 uses sphericalMercator by default
|
||||||
var correspondingOLLonLat = new OpenLayers.LonLat(100,50).transform(
|
var correspondingOLLonLat = layer.forwardMercator(100, 50);
|
||||||
new OpenLayers.Projection("EPSG:4326"),
|
|
||||||
map.getProjectionObject()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
olLonLat = layer.getOLLonLatFromMapObjectLonLat(gLatLng);
|
olLonLat = layer.getOLLonLatFromMapObjectLonLat(gLatLng);
|
||||||
t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
|
t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
|
||||||
|
|||||||
@@ -38,8 +38,8 @@
|
|||||||
t.eq(sw.lon, -180, "Southwest lon correct");
|
t.eq(sw.lon, -180, "Southwest lon correct");
|
||||||
t.eq(ne.lon, 180, "Northeast lon correct");
|
t.eq(ne.lon, 180, "Northeast lon correct");
|
||||||
|
|
||||||
t.eq(sw.lat, -85.051128779807, "Southwest lat correct");
|
t.eq(sw.lat.toFixed(10), "-85.0511287798", "Southwest lat correct");
|
||||||
t.eq(ne.lat, 85.051128779807, "Northeast lat correct");
|
t.eq(ne.lat.toFixed(10), "85.0511287798", "Northeast lat correct");
|
||||||
}
|
}
|
||||||
|
|
||||||
function strToFixed(str, dig) {
|
function strToFixed(str, dig) {
|
||||||
@@ -51,21 +51,10 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_SphericalMercator_projectForward(t) {
|
|
||||||
t.plan(1);
|
|
||||||
var point = new OpenLayers.Geometry.Point(10, 20);
|
|
||||||
OpenLayers.Layer.SphericalMercator.projectForward(point);
|
|
||||||
|
|
||||||
t.eq(strToFixed(point.toString()),
|
|
||||||
strToFixed("POINT(1113194.9077777779 2273030.9266712805)"),
|
|
||||||
"point transforms from EPSG:4326 to Spherical Mercator");
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_SphericalMercator_to4326(t) {
|
function test_SphericalMercator_to4326(t) {
|
||||||
t.plan(1);
|
t.plan(1);
|
||||||
var point = new OpenLayers.Geometry.Point(1113195, 2273031);
|
var point = new OpenLayers.Geometry.Point(1113195, 2273031);
|
||||||
|
point.transform("EPSG:900913", "EPSG:4326");
|
||||||
OpenLayers.Layer.SphericalMercator.projectInverse(point);
|
|
||||||
|
|
||||||
t.eq(strToFixed(point.toString()),
|
t.eq(strToFixed(point.toString()),
|
||||||
strToFixed("POINT(10.000000828446318 20.000000618997227)"),
|
strToFixed("POINT(10.000000828446318 20.000000618997227)"),
|
||||||
@@ -82,9 +71,9 @@
|
|||||||
var smerc = OpenLayers.Projection.transforms["EPSG:900913"];
|
var smerc = OpenLayers.Projection.transforms["EPSG:900913"];
|
||||||
t.ok(smerc instanceof Object, "EPSG:900913 exists in table");
|
t.ok(smerc instanceof Object, "EPSG:900913 exists in table");
|
||||||
|
|
||||||
t.ok(wgs84["EPSG:900913"] === OpenLayers.Layer.SphericalMercator.projectForward,
|
t.ok(typeof(wgs84["EPSG:900913"]) === "function",
|
||||||
"from EPSG:4326 to EPSG:900913 correctly defined");
|
"from EPSG:4326 to EPSG:900913 correctly defined");
|
||||||
t.ok(smerc["EPSG:4326"] === OpenLayers.Layer.SphericalMercator.projectInverse,
|
t.ok(typeof(smerc["EPSG:4326"]) === "function",
|
||||||
"from EPSG:900913 to EPSG:4326 correctly defined");
|
"from EPSG:900913 to EPSG:4326 correctly defined");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user