[OpenLayers-Commits] r10869 - in trunk/openlayers: lib/OpenLayers lib/OpenLayers/Layer tests tests/Layer

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Fri Nov 5 03:33:38 EDT 2010


Author: ahocevar
Date: 2010-11-05 00:33:38 -0700 (Fri, 05 Nov 2010)
New Revision: 10869

Modified:
   trunk/openlayers/lib/OpenLayers/Layer/WMS.js
   trunk/openlayers/lib/OpenLayers/Projection.js
   trunk/openlayers/tests/Layer/WMS.html
   trunk/openlayers/tests/Projection.html
Log:
Handle projections with different aliases: smarter Projection.equals and Layer.WMS.getFullRequestString methods. r=tschaub (closes #2914)


Modified: trunk/openlayers/lib/OpenLayers/Layer/WMS.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Layer/WMS.js	2010-11-03 00:10:00 UTC (rev 10868)
+++ trunk/openlayers/lib/OpenLayers/Layer/WMS.js	2010-11-05 07:33:38 UTC (rev 10869)
@@ -252,7 +252,10 @@
      * {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;

Modified: trunk/openlayers/lib/OpenLayers/Projection.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Projection.js	2010-11-03 00:10:00 UTC (rev 10868)
+++ trunk/openlayers/lib/OpenLayers/Projection.js	2010-11-05 07:33:38 UTC (rev 10869)
@@ -26,6 +26,12 @@
      * {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 @@
      * {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 @@
     }
     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;
+};

Modified: trunk/openlayers/tests/Layer/WMS.html
===================================================================
--- trunk/openlayers/tests/Layer/WMS.html	2010-11-03 00:10:00 UTC (rev 10868)
+++ trunk/openlayers/tests/Layer/WMS.html	2010-11-05 07:33:38 UTC (rev 10869)
@@ -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();
 
     }
 

Modified: trunk/openlayers/tests/Projection.html
===================================================================
--- trunk/openlayers/tests/Projection.html	2010-11-03 00:10:00 UTC (rev 10868)
+++ trunk/openlayers/tests/Projection.html	2010-11-05 07:33:38 UTC (rev 10869)
@@ -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
+         }
+         
+     }
        
     </script> 
   </head> 



More information about the Commits mailing list