OpenLayers OpenLayers

Ticket #1602: features-outside-extent.2.patch

File features-outside-extent.2.patch, 6.2 kB (added by ahocevar, 4 months ago)

new version, now only affects the VML renderer

  • lib/OpenLayers/Renderer/VML.js

    old new  
    497497    createRoot: function() { 
    498498        return this.nodeFactory(this.container.id + "_root", "olv:group"); 
    499499    }, 
     500     
     501    /** 
     502     * Method: drawFeature 
     503     * Overrides the superclass's drawFeature method to take care of features 
     504     * that are outside the viewport. 
     505     */ 
     506    drawFeature: function(feature, style) { 
     507        if (!feature.geometry.getBounds().intersectsBounds(this.extent)) { 
     508            style = {display: "none"}; 
     509        } 
     510        OpenLayers.Renderer.Elements.prototype.drawFeature.apply(this, 
     511            [feature, style]); 
     512    }, 
    500513 
    501514    /************************************** 
    502515     *                                    * 
  • 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 < 5) { 
     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>