[OpenLayers-Commits] r5625 - in trunk/openlayers: lib/OpenLayers/BaseTypes lib/OpenLayers/Feature tests/BaseTypes tests/Feature

commits at openlayers.org commits at openlayers.org
Wed Jan 2 14:16:58 EST 2008


Author: tschaub
Date: 2008-01-02 14:16:58 -0500 (Wed, 02 Jan 2008)
New Revision: 5625

Modified:
   trunk/openlayers/lib/OpenLayers/BaseTypes/Bounds.js
   trunk/openlayers/lib/OpenLayers/Feature/Vector.js
   trunk/openlayers/tests/BaseTypes/test_Bounds.html
   trunk/openlayers/tests/Feature/test_Vector.html
Log:
Giving vector features an onScreen method.  By default, this uses geometry.intersects.  If a rougher approximation will do, call with boundsOnly set to true.  r=crschmidt (closes #1238)

Modified: trunk/openlayers/lib/OpenLayers/BaseTypes/Bounds.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/BaseTypes/Bounds.js	2008-01-02 19:06:07 UTC (rev 5624)
+++ trunk/openlayers/lib/OpenLayers/BaseTypes/Bounds.js	2008-01-02 19:16:58 UTC (rev 5625)
@@ -149,6 +149,25 @@
     },
     
     /**
+     * APIMethod: toGeometry
+     * Create a new polygon geometry based on this bounds.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Polygon>} A new polygon with the coordinates
+     *     of this bounds.
+     */
+    toGeometry: function() {
+        return new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(this.left, this.bottom),
+                new OpenLayers.Geometry.Point(this.right, this.bottom),
+                new OpenLayers.Geometry.Point(this.right, this.top),
+                new OpenLayers.Geometry.Point(this.left, this.top)
+            ])
+        ]);
+    },
+    
+    /**
      * APIMethod: getWidth
      * 
      * Returns:

Modified: trunk/openlayers/lib/OpenLayers/Feature/Vector.js
===================================================================
--- trunk/openlayers/lib/OpenLayers/Feature/Vector.js	2008-01-02 19:06:07 UTC (rev 5624)
+++ trunk/openlayers/lib/OpenLayers/Feature/Vector.js	2008-01-02 19:16:58 UTC (rev 5625)
@@ -114,13 +114,34 @@
 
     /**
      * Method: onScreen
-     * HACK - we need to rewrite this for non-point geometry
+     * Determine whether the feature is within the map viewport.  This method
+     *     tests for an intersection between the geometry and the viewport
+     *     bounds.  If a more effecient but less precise geometry bounds
+     *     intersection is desired, call the method with the boundsOnly
+     *     parameter true.
+     *
+     * Parameters:
+     * boundsOnly - {Boolean} Only test whether a feature's bounds intersects
+     *     the viewport bounds.  Default is false.  If false, the feature's
+     *     geometry must intersect the viewport for onScreen to return true.
      * 
      * Returns:
-     * {Boolean} For now just returns null
+     * {Boolean} The feature is currently visible on screen (optionally
+     *     based on its bounds if boundsOnly is true).
      */
-    onScreen:function() {
-        return null;
+    onScreen:function(boundsOnly) {
+        var onScreen = false;
+        if(this.layer && this.layer.map) {
+            var screenBounds = this.layer.map.getExtent();
+            if(boundsOnly) {
+                var featureBounds = this.geometry.getBounds();
+                onScreen = screenBounds.intersectsBounds(featureBounds);
+            } else {
+                var screenPoly = screenBounds.toGeometry();
+                onScreen = screenPoly.intersects(this.geometry);
+            }
+        }    
+        return onScreen;
     },
     
     /**

Modified: trunk/openlayers/tests/BaseTypes/test_Bounds.html
===================================================================
--- trunk/openlayers/tests/BaseTypes/test_Bounds.html	2008-01-02 19:06:07 UTC (rev 5624)
+++ trunk/openlayers/tests/BaseTypes/test_Bounds.html	2008-01-02 19:16:58 UTC (rev 5625)
@@ -76,6 +76,31 @@
         t.eq( bounds.toArray(), [1,2,3,4], "toArray() returns correct value." ); 
     }
 
+    function test_Bounds_toGeometry(t) {
+        t.plan(7);
+        var minx = Math.random();
+        var miny = Math.random();
+        var maxx = Math.random();
+        var maxy = Math.random();
+        var bounds = new OpenLayers.Bounds(minx, miny, maxx, maxy);
+        var poly = bounds.toGeometry();
+        t.eq(poly.CLASS_NAME, "OpenLayers.Geometry.Polygon",
+             "polygon instance created");
+        t.eq(poly.components.length, 1,
+             "polygon with one ring created");
+        var ring = poly.components[0];
+        t.eq(ring.components.length, 5,
+             "four sided polygon created");
+        t.eq(ring.components[0].x, minx,
+             "bounds left preserved");
+        t.eq(ring.components[0].y, miny,
+             "bounds bottom preserved");
+        t.eq(ring.components[2].x, maxx,
+             "bounds left preserved");
+        t.eq(ring.components[2].y, maxy,
+             "bounds bottom preserved");
+    }
+
     function test_04_Bounds_contains(t) {
         t.plan( 6 );
         bounds = new OpenLayers.Bounds(10,10,40,40);

Modified: trunk/openlayers/tests/Feature/test_Vector.html
===================================================================
--- trunk/openlayers/tests/Feature/test_Vector.html	2008-01-02 19:06:07 UTC (rev 5624)
+++ trunk/openlayers/tests/Feature/test_Vector.html	2008-01-02 19:16:58 UTC (rev 5625)
@@ -23,6 +23,41 @@
              "geometry.property set properly" );
     }
     
+    function test_Feature_onScreen(t) {
+        t.plan(6);
+        var line = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(0, 0),
+            new OpenLayers.Geometry.Point(10, 20)
+        ]);
+        var feature = new OpenLayers.Feature.Vector(line);
+        feature.layer = {
+            map: {
+                getExtent: function() {
+                    return new OpenLayers.Bounds(5, 5, 10, 10);
+                }
+            }
+        };
+        t.eq(feature.onScreen(), true,
+             "intersecting feature returns true for intersection");
+        t.eq(feature.onScreen(true), true,
+             "intersecting feature returns true for bounds only");
+        
+        // move the line so only the bounds intersects
+        line.move(0, 5);
+        t.eq(feature.onScreen(), false,
+             "bounds-only feature returns false for intersection");
+        t.eq(feature.onScreen(true), true,
+             "bounds-only feature returns true for bounds only");
+
+        // move the line so bounds does not intersect
+        line.move(0, 10);
+        t.eq(feature.onScreen(), false,
+             "off-screen feature returns false for intersection");
+        t.eq(feature.onScreen(true), false,
+             "off-screen feature returns false for bounds only");
+        
+    }
+    
     function test_Feature_Vector_clone(t) {
         t.plan(5);
 



More information about the Commits mailing list