OpenLayers OpenLayers

Ticket #1602: features-outside-extent.patch

File features-outside-extent.patch, 5.9 kB (added by ahocevar, 5 months ago)
  • lib/OpenLayers/Renderer.js

    old new  
    8181     */ 
    8282    supported: function() { 
    8383        return false; 
    84     },     
     84    }, 
    8585     
    8686    /** 
    8787     * Method: setExtent 
     
    138138     * style - {<Object>}  
    139139     */ 
    140140    drawFeature: function(feature, style) { 
    141         if(style == null) { 
    142             style = feature.style; 
     141        if (feature.geometry.getBounds().intersectsBounds(this.extent)) { 
     142            if (style == null) { 
     143                style = feature.style; 
     144            } 
     145        } else { 
     146            style = {display: "none"} 
    143147        } 
    144148        if (feature.geometry) { 
    145149            this.drawGeometry(feature.geometry, style, feature.id); 
  • tests/manual/vector-features-performance.html

    old new  
     1<html xmlns="http://www.w3.org/1999/xhtml"> 
     2  <head> 
     3    <title>Vector Features Performance Test</title> 
     4    <style type="text/css"> 
     5        body { 
     6            font-size: 0.8em; 
     7        } 
     8        p { 
     9            padding-top: 1em; 
     10        } 
     11        #map { 
     12            margin: 1em; 
     13            width: 512px; 
     14            height: 512px; 
     15        } 
     16    </style> 
     17 
     18    <script src="../../lib/Firebug/firebug.js"></script> 
     19    <script src="../../lib/OpenLayers.js"></script> 
     20    <script type="text/javascript"> 
     21        var map, wmsLayer, vectorLayer, drawFeature, features 
     22         
     23        var run = 0; 
     24         
     25        function nextRun() { 
     26            window.setTimeout(function() { 
     27                if (run < 4) { 
     28                    vectorLayer.removeFeatures(features); 
     29                } 
     30            }, 750); 
     31             
     32            window.setTimeout(function(){ 
     33                run++; 
     34                 
     35                switch(run) { 
     36                    case 1: 
     37                        wmsLayer.events.register("loadend", this, vectorTestNew); 
     38                        console.log("First run - feature bboxes will be cached"); 
     39                        map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 3); 
     40                        break; 
     41                    case 2: 
     42                        console.log("Test with all features inside extent"); 
     43                        map.layers[0].redraw(true); 
     44                        break; 
     45                    case 3: 
     46                        vectorTestOld(); 
     47                        break; 
     48                    case 4: 
     49                        console.log("Test with some features outside extent"); 
     50                        map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 5); 
     51                        break; 
     52                    case 5: 
     53                        wmsLayer.events.unregister("loadend", this, vectorTestNew); 
     54                        vectorTestOld(); 
     55                        break; 
     56                } 
     57            }, 1000); 
     58        } 
     59         
     60        function vectorTestOld(){             
     61            vectorLayer.renderer.drawFeature = function(feature, style) { 
     62                if(style == null) { 
     63                    style = feature.style; 
     64                } 
     65                if (feature.geometry) { 
     66                    this.drawGeometry(feature.geometry, style, feature.id); 
     67                } 
     68            }; 
     69 
     70            console.time("addFeaturesOld"); 
     71            vectorLayer.addFeatures(features); 
     72            console.timeEnd("addFeaturesOld"); 
     73        } 
     74         
     75        function vectorTestNew() { 
     76            vectorLayer.renderer.drawFeature = drawFeature; 
     77             
     78            console.time("addFeatures"); 
     79            vectorLayer.addFeatures(features); 
     80            console.timeEnd("addFeatures"); 
     81        } 
     82 
     83        function init(){ 
     84            map = new OpenLayers.Map('map'); 
     85            wmsLayer = new OpenLayers.Layer.WMS("OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", { 
     86                layers: 'basic' 
     87            }); 
     88             
     89            vectorLayer = new OpenLayers.Layer.Vector("Vector Layer"); 
     90            drawFeature = vectorLayer.renderer.drawFeature; 
     91 
     92            map.addLayers([wmsLayer, vectorLayer]); 
     93            map.addControl(new OpenLayers.Control.MousePosition()); 
     94            map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 3); 
     95 
     96            vectorLayer.events.register("featuresadded", this, nextRun); 
     97             
     98            features = new Array(100); 
     99            var x, y 
     100            for (var i = 0; i < 100; i++) { 
     101                x = -Math.random()*45; 
     102                y = -Math.random()*45; 
     103                features[i] = new OpenLayers.Feature.Vector( 
     104                    new OpenLayers.Geometry.LinearRing([ 
     105                        new OpenLayers.Geometry.Point( 
     106                            -Math.random()*5+x, -Math.random()*5+y), 
     107                        new OpenLayers.Geometry.Point( 
     108                            -Math.random()*5+x, -Math.random()*5+y), 
     109                        new OpenLayers.Geometry.Point( 
     110                            -Math.random()*5+x, -Math.random()*5+y), 
     111                        new OpenLayers.Geometry.Point( 
     112                            -Math.random()*5+x, -Math.random()*5+y), 
     113                        new OpenLayers.Geometry.Point( 
     114                            -Math.random()*5+x, -Math.random()*5+y) 
     115                    ])); 
     116                     
     117            } 
     118             
     119            nextRun(); 
     120        } 
     121    </script> 
     122  </head> 
     123  <body onload="init()"> 
     124    <h1 id="title">Vector Features Performance Test</h1> 
     125    <div id="map"></div> 
     126    <p> 
     127     
     128    This test examines if checking for a feature being inside the visible 
     129    extent before rendering it has an impact on performance. Make sure that 
     130    the Firebug console is visible when running this test to see the results. 
     131     
     132    </p> 
     133  </body> 
     134</html>