diff --git a/lib/OpenLayers/Layer/WMS.js b/lib/OpenLayers/Layer/WMS.js index 9d9f993cac..b046e012df 100644 --- a/lib/OpenLayers/Layer/WMS.js +++ b/lib/OpenLayers/Layer/WMS.js @@ -252,7 +252,10 @@ OpenLayers.Layer.WMS = OpenLayers.Class(OpenLayers.Layer.Grid, { * {String} */ getFullRequestString:function(newParams, altUrl) { - var projectionCode = this.map.getProjection(); + var mapProjection = this.map.getProjectionObject(); + var projectionCode = this.projection.equals(mapProjection) ? + this.projection.getCode() : + mapProjection.getCode(); var value = (projectionCode == "none") ? null : projectionCode if (parseFloat(this.params.VERSION) >= 1.3) { this.params.CRS = value; diff --git a/lib/OpenLayers/Projection.js b/lib/OpenLayers/Projection.js index 48b0ff8536..48befddfe3 100644 --- a/lib/OpenLayers/Projection.js +++ b/lib/OpenLayers/Projection.js @@ -26,6 +26,12 @@ OpenLayers.Projection = OpenLayers.Class({ * {String} */ projCode: null, + + /** + * Property: titleRegEx + * {RegEx} regular expression to strip the title from a proj4js definition + */ + titleRegEx: /\+title=[^\+]*/, /** * Constructor: OpenLayers.Projection @@ -92,11 +98,20 @@ OpenLayers.Projection = OpenLayers.Class({ * {Boolean} The two projections are equivalent. */ equals: function(projection) { - if (projection && projection.getCode) { - return this.getCode() == projection.getCode(); - } else { - return false; - } + var p = projection, equals = false; + if (p) { + if (window.Proj4js && this.proj.defData && p.proj.defData) { + equals = this.proj.defData.replace(this.titleRegEx, "") == + p.proj.defData.replace(this.titleRegEx, ""); + } else if (p.getCode) { + var source = this.getCode(), target = p.getCode(); + equals = source == target || + !!OpenLayers.Projection.transforms[source] && + OpenLayers.Projection.transforms[source][target] === + OpenLayers.Projection.nullTransform; + } + } + return equals; }, /* Method: destroy @@ -176,3 +191,23 @@ OpenLayers.Projection.transform = function(point, source, dest) { } return point; }; + +/** + * APIFunction: nullTransform + * A null transformation - useful for defining projection aliases when + * proj4js is not available: + * + * (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.nullTransform); + * OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:3857", + * OpenLayers.Projection.nullTransform); + * (end) + */ +OpenLayers.Projection.nullTransform = function(point) { + return point; +}; diff --git a/tests/Layer/WMS.html b/tests/Layer/WMS.html index 5e8e2a512d..0e50bff424 100644 --- a/tests/Layer/WMS.html +++ b/tests/Layer/WMS.html @@ -230,15 +230,15 @@ function test_Layer_WMS_getFullRequestString (t) { - t.plan( 2 ); + t.plan( 3 ); var map = new OpenLayers.Map('map'); map.projection = "xx"; - tUrl = "http://octo.metacarta.com/cgi-bin/mapserv"; - tParams = { layers: 'basic', + var tUrl = "http://octo.metacarta.com/cgi-bin/mapserv"; + var tParams = { layers: 'basic', format: 'image/png'}; var tLayer = new OpenLayers.Layer.WMS(name, tUrl, tParams); map.addLayer(tLayer); - str = tLayer.getFullRequestString(); + var str = tLayer.getFullRequestString(); var tParams = { LAYERS: "basic", FORMAT: "image/png", SERVICE: "WMS", VERSION: "1.1.1", REQUEST: "GetMap", STYLES: "", @@ -257,6 +257,20 @@ tUrl + "?" + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() by default does *not* add SRS value if projection is 'none'"); map.destroy(); + + map = new OpenLayers.Map("map", {projection: "EPSG:4326"}); + var layerProj = new OpenLayers.Projection("FOO", { + equals: function() {return true}, + getCode: function() {return "FOO"} + }); + tLayer = new OpenLayers.Layer.WMS(name, tUrl, tParams, {projection: layerProj}); + map.addLayer(tLayer); + str = tLayer.getFullRequestString(); + tParams.SRS = "FOO"; + t.eq(str, + tUrl + "?" + OpenLayers.Util.getParameterString(tParams), + "getFullRequestString() uses the layer projection if it equals the map projection"); + map.destroy(); } diff --git a/tests/Projection.html b/tests/Projection.html index 2c6d72c36f..2f7133895c 100644 --- a/tests/Projection.html +++ b/tests/Projection.html @@ -21,7 +21,47 @@ t.eq(projection.equals(null), false, "equals on null projection returns false"); t.eq(projection.equals({}), false, "equals on null projection object returns false (doesn't call getCode)"); - } + } + + function test_Projection_equals(t) { + t.plan(8); + var origTransforms = OpenLayers.Util.extend({}, OpenLayers.Projection.transforms); + OpenLayers.Projection.addTransform("EPSG:4326", "FOO", OpenLayers.Projection.nullTransform); + OpenLayers.Projection.addTransform("FOO", "EPSG:4326", OpenLayers.Projection.nullTransform); + var projection = new OpenLayers.Projection("FOO"); + t.eq(projection.equals(new OpenLayers.Projection("EPSG:4326")), true, "EPSG:4326 and FOO are equal without proj4js"); + t.eq(projection.equals(new OpenLayers.Projection("EPSG:900913")), false, "EPSG:900913 and FOO are not equal without proj4js"); + t.eq(new OpenLayers.Projection("EPSG:4326").equals(new OpenLayers.Projection("EPSG:4326")), true, "EPSG:4326 and EPSG:4326 are equal without proj4js"); + t.eq(new OpenLayers.Projection("BAR").equals(new OpenLayers.Projection("EPSG:4326")), false, "Projection.equals() returns false for unknown projections withoug proj4js"); + OpenLayers.Projection.transforms = origTransforms; + + var proj1 = new OpenLayers.Projection("EPSG:4326"); + var proj2 = new OpenLayers.Projection("FOO"); + var proj3 = new OpenLayers.Projection("EPSG:900913"); + var proj4 = new OpenLayers.Projection("EPSG:4326"); + var proj5 = new OpenLayers.Projection("BAR"); + + // conditionally mock up proj4js + var hasProj = !!window.Proj4js; + if (!hasProj) { + window.Proj4js = true; + } + proj1.proj = {defData: "+title= WGS84 +foo=bar +x=0"}; + proj2.proj = {defData: "+title=FOO +foo=bar +x=0", srsCode: "FOO"}; + proj3.proj = {defData: "+title=Web Mercator +foo=bar +x=0 +I=am-different"}; + proj4.proj = proj1.proj; + proj5.proj = {srsCode: "BAR"}; + + t.eq(proj2.equals(proj1), true, "EPSG:4326 and FOO are equal with proj4js"); + t.eq(proj2.equals(proj3), false, "EPSG:900913 and FOO are not equal with proj4js"); + t.eq(proj1.equals(proj4), true, "EPSG:4326 and EPSG:4326 are equal with proj4js"); + t.eq(proj2.equals(proj5), false, "Projection.equals() returns false for unknown projections with proj4js"); + + if (!hasProj) { + delete window.Proj4js + } + + }