OpenLayers OpenLayers

Ticket #529: gutter.3.2.patch

File gutter.3.2.patch, 57.0 kB (added by sderle, 2 years ago)

gutter.3.patch with fixed line endings

  • examples/gutter.html

    old new  
     1<html>  
     2  <head>  
     3    <style type="text/css">  
     4        #map {  
     5            width: 500px;  
     6            height: 300px;  
     7            border: 1px solid gray;  
     8        }  
     9        p.caption {  
     10            width: 500px;  
     11        }  
     12    </style>  
     13    <script src="../lib/OpenLayers.js"></script>  
     14    <script type="text/javascript">  
     15        <!--  
     16        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 2;  
     17        var map;  
     18        window.onload = function() {  
     19            options = {maxExtent: new OpenLayers.Bounds(-73.5295, 41.2318,  
     20                                                        -69.9097, 42.8883),  
     21                       maxResolution: 0.0003}  
     22            map = new OpenLayers.Map('map', options);  
     23            var roads15 = new OpenLayers.Layer.WMS( "Roads (15px gutter)",   
     24                "http://boston.freemap.in/cgi-bin/mapserv?map=/www/freemap.in/boston/map/gmaps.map&",  
     25                {layers: 'roads_200_40'},  
     26                {gutter: 15});   
     27            var roads = new OpenLayers.Layer.WMS( "Roads (no gutter)",   
     28                "http://boston.freemap.in/cgi-bin/mapserv?map=/www/freemap.in/boston/map/gmaps.map&",  
     29                {layers: 'roads_200_40'});   
     30            map.addLayers([roads, roads15]);  
     31            map.addControl(new OpenLayers.Control.LayerSwitcher());  
     32            map.setCenter(new OpenLayers.LonLat(-71.848, 42.2), 0);  
     33        }  
     34        // -->  
     35    </script>  
     36  </head>  
     37  <body>  
     38    <h1>OpenLayers Gutter Example</h1>  
     39    <div id="map"></div>  
     40    <p class="caption">  
     41        When you render tiles with certain types of symbols, there are artifacts  
     42        at tile edges that make symbology not look continuous.  In the center of  
     43        the above map (when it first loads), the large orange road is split  
     44        vertically by a tile.  Open the layer switcher and change to the layer  
     45        with a 15 pixel gutter to see how the symbology looks nicer.  
     46    </p>  
     47          
     48  </body>  
     49</html> 
  • examples/mapserver.html

    old new  
    1818        function init(){ 
    1919            map = new OpenLayers.Map( 'map' ); 
    2020            layer = new OpenLayers.Layer.MapServer( "OpenLayers WMS",  
    21                     "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} ); 
     21                    "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'}, 
     22                    {gutter: 15}); 
    2223            map.addLayer(layer); 
    2324 
    2425            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom); 
  • examples/mapserver_untiled.html

    old new  
    22  <head> 
    33    <style type="text/css"> 
    44        #map { 
    5             width: 800px
    6             height: 475px
     5            width: 100%
     6            height: 100%
    77            border: 1px solid black; 
    88        } 
    99    </style> 
  • examples/wms-untiled.html

    old new  
     1<html xmlns="http://www.w3.org/1999/xhtml"> 
     2  <head> 
     3    <style type="text/css"> 
     4        #map { 
     5            width: 100%; 
     6            height: 100%; 
     7            border: 1px solid black; 
     8        } 
     9    </style> 
     10    <script src="../lib/OpenLayers.js"></script> 
     11    <script type="text/javascript"> 
     12        <!-- 
     13        var lon = 5; 
     14        var lat = 40; 
     15        var zoom = 5; 
     16        var map, layer; 
     17 
     18        function init(){ 
     19            map = new OpenLayers.Map( 'map' ); 
     20            layer = new OpenLayers.Layer.WMS.Untiled( "OpenLayers WMS",  
     21                    "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} ); 
     22            map.addLayer(layer); 
     23 
     24            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom); 
     25            map.addControl( new OpenLayers.Control.LayerSwitcher() ); 
     26        } 
     27         
     28        // --> 
     29    </script> 
     30  </head> 
     31  <body onload="init()"> 
     32    <div id="map"></div> 
     33  </body> 
     34</html> 
  • lib/OpenLayers/Layer.js

    old new  
    6565     * @type Boolean 
    6666     */ 
    6767    inRange: false, 
     68     
     69    /** 
     70     * For layers that use Tile.Image, the image size is cached here.  For 
     71     * layers without a gutter, the image size is equal to the tile size. 
     72     * For layers with a gutter, the image is larger than the tile by twice 
     73     * the gutter in each dimension. 
     74     *  
     75     * @type OpenLayers.Size 
     76     * @private 
     77     */ 
     78    imageSize: null, 
     79     
     80    /** 
     81     * For layers that use Tile.Image, the image offset is cached here. 
     82     * Layers without a gutter have zero offset.  For layers with a gutter, 
     83     * the image offset represents displacement due to the gutter. 
     84     *  
     85     * @type OpenLayers.Pixel 
     86     * @private 
     87     */ 
     88    imageOffset: null, 
    6889 
    6990  // OPTIONS 
    7091 
    7192    /** @type Array */ 
    7293    options: null, 
    7394 
     95    /** Determines the width (in pixels) of the gutter around image tiles  
     96     * to ignore.  By setting this property to a non-zero value, images  
     97     * will be requested that are wider and taller than the tile size by  
     98     * a value of 2 x gutter.  This allows artifacts of rendering at tile  
     99     * edges to be ignored.  Set a gutter value that is equal to half the size  
     100     * of the widest symbol that needs to be displayed.  Defaults to zero. 
     101     * Non-tiled layers always have zero gutter. 
     102     *   
     103     * @type Int  
     104    */  
     105    gutter: 0,  
     106 
    74107    /** @type String */ 
    75108    projection: null,     
    76109     
     
    243276         
    244277        if (!this.isBaseLayer) { 
    245278            this.inRange = this.calculateInRange(); 
    246         }     
     279        } 
     280         
     281        // deal with gutters 
     282        this.setTileSize(); 
    247283    }, 
    248284   
    249285    /** 
     286     * Set the tile size based on the map size.  This also sets layer.imageSize 
     287     * and layer.imageOffset for use by Tile.Image. 
     288     * 
     289     * @param OpenLayers.Size 
     290     */ 
     291    setTileSize: function(size) { 
     292        var tileSize = (size) ? size : 
     293                                ((this.tileSize) ? this.tileSize : 
     294                                                   this.map.getTileSize()); 
     295        this.tileSize = tileSize; 
     296        if(this.gutter) { 
     297            // layers with gutters need non-null tile sizes 
     298            //if(tileSize == null) { 
     299            //    OpenLayers.console.error("Error in layer.setMap() for " + 
     300            //                              this.name + ": layers with gutters " + 
     301            //                              "need non-null tile sizes"); 
     302            //} 
     303            this.imageOffset = new OpenLayers.Pixel(-this.gutter, -this.gutter);  
     304            this.imageSize = new OpenLayers.Size(tileSize.w + (2 * this.gutter),  
     305                                                 tileSize.h + (2 * this.gutter));  
     306        } else { 
     307            // layers without gutters may have null tile size - as long 
     308            // as they don't rely on Tile.Image 
     309            this.imageSize = tileSize; 
     310            this.imageOffset = new OpenLayers.Pixel(0, 0); 
     311        } 
     312    }, 
     313 
     314    /** 
    250315    * @returns Whether or not the layer should be displayed (if in range) 
    251316    * @type Boolean 
    252317    */ 
     
    560625    }, 
    561626     
    562627    /** 
     628     * Adjusts the extent of a bounds in map units by the layer's gutter 
     629     * in pixels. 
     630     *  
     631     * @param {OpenLayers.Bounds} bounds 
     632     * @type OpenLayers.Bounds 
     633     * @return A bounds adjusted in height and width by the gutter 
     634     */ 
     635    adjustBoundsByGutter: function(bounds) { 
     636        var mapGutter = this.gutter * this.map.getResolution(); 
     637        bounds = new OpenLayers.Bounds(bounds.left - mapGutter, 
     638                                       bounds.bottom - mapGutter, 
     639                                       bounds.right + mapGutter, 
     640                                       bounds.top + mapGutter); 
     641        return bounds; 
     642    }, 
     643     
     644    /** 
    563645     * Sets the opacity for the entire layer (all images) 
    564646     * @param {Float} opacity 
    565647     */ 
    566648    setOpacity: function(opacity) { 
    567649        this.opacity = opacity; 
    568650        for(var i=0; i<this.div.childNodes.length; ++i) { 
    569             var element = this.div.childNodes[i]
     651            var element = this.div.childNodes[i].firstChild
    570652            OpenLayers.Util.modifyDOMElement(element, null, null, null,  
    571653                                             null, null, null, opacity); 
    572654        } 
  • lib/OpenLayers/Layer/MapServer.js

    old new  
    8787     * @type String 
    8888     */ 
    8989    getURL: function (bounds) { 
    90          
     90        if(this.gutter) { 
     91            bounds = this.adjustBoundsByGutter(bounds); 
     92        } 
    9193        // Make a list, so that getFullRequestString uses literal ","  
    9294        var extent = [bounds.left, bounds. bottom, bounds.right, bounds.top]; 
    9395         
     
    9597        var url = this.getFullRequestString( 
    9698                     {mapext:   extent, 
    9799                      imgext:   extent, 
    98                       map_size: [this.tileSize.w,this.tileSize.h], 
    99                       imgx:     this.tileSize.w/2, 
    100                       imgy:     this.tileSize.h/2, 
    101                       imgxy:    [this.tileSize.w,this.tileSize.h] 
     100                      map_size: [this.imageSize.w, this.imageSize.h], 
     101                      imgx:     this.imageSize.w / 2, 
     102                      imgy:     this.imageSize.h / 2, 
     103                      imgxy:    [this.imageSize.w, this.imageSize.h] 
    102104                      }); 
    103105         
    104106        return url; 
  • lib/OpenLayers/Layer/MapServer/Untiled.js

    old new  
    9999     * @param {OpenLayers.Map} map 
    100100     */ 
    101101    setMap: function(map) { 
    102         //determine new tile size 
    103         this.tileSize = map.getSize(); 
    104         this.tileSize.w = this.tileSize.w * this.ratio; 
    105         this.tileSize.h = this.tileSize.h * this.ratio; 
    106102        OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this, arguments); 
    107103    }, 
     104     
     105    /** 
     106     * Set the tile size based on the map size.  This also sets layer.imageSize 
     107     * and layer.imageOffset for use by Tile.Image. 
     108     */ 
     109    setTileSize: function() { 
     110        var tileSize = this.map.getSize(); 
     111        tileSize.w = tileSize.w * this.ratio; 
     112        tileSize.h = tileSize.h * this.ratio; 
     113        this.tileSize = tileSize; 
     114        this.imageSize = tileSize; 
     115        this.imageOffset = new OpenLayers.Pixel(0, 0); 
     116    }, 
    108117 
    109118    /** When it is not a dragging move (ie when done dragging) 
    110119     *   reload and recenter the div. 
     
    149158                                      center.lat + (tileHeight / 2)); 
    150159 
    151160            //determine new tile size 
    152             this.tileSize = this.map.getSize(); 
    153             this.tileSize.w = this.tileSize.w * this.ratio; 
    154             this.tileSize.h = this.tileSize.h * this.ratio; 
     161            this.setTileSize(); 
    155162 
    156163            //formulate request url string 
    157164            var url = this.getURL(tileBounds);  
  • lib/OpenLayers/Layer/WMS.js

    old new  
    2424                     }, 
    2525     
    2626    reproject: true, 
    27  
     27  
    2828    /** 
    2929    * @constructor 
    3030    * 
     
    9393     * @type String 
    9494     */ 
    9595    getURL: function (bounds) { 
     96        if(this.gutter) { 
     97            bounds = this.adjustBoundsByGutter(bounds); 
     98        } 
    9699        return this.getFullRequestString( 
    97100                     {BBOX:bounds.toBBOX(), 
    98                       WIDTH:this.tileSize.w, 
    99                       HEIGHT:this.tileSize.h}); 
     101                      WIDTH:this.imageSize.w, 
     102                      HEIGHT:this.imageSize.h}); 
    100103    }, 
    101104 
    102105    /** 
     
    109112    * @type OpenLayers.Tile.Image 
    110113    */ 
    111114    addTile:function(bounds,position) { 
    112         url = this.getURL(bounds); 
     115        var url = this.getURL(bounds); 
    113116        return new OpenLayers.Tile.Image(this, position, bounds,  
    114117                                             url, this.tileSize); 
    115118    }, 
  • lib/OpenLayers/Layer/WMS/Untiled.js

    old new  
    102102     * @param {OpenLayers.Map} map 
    103103     */ 
    104104    setMap: function(map) { 
    105         //determine new tile size 
    106         this.tileSize = map.getSize(); 
    107         this.tileSize.w = this.tileSize.w * this.ratio; 
    108         this.tileSize.h = this.tileSize.h * this.ratio; 
    109105        OpenLayers.Layer.HTTPRequest.prototype.setMap.apply(this, arguments); 
    110106    }, 
    111107 
     108    /** 
     109     * Set the tile size based on the map size.  This also sets layer.imageSize 
     110     * and layer.imageOffset for use by Tile.Image. 
     111     */ 
     112    setTileSize: function() { 
     113        var tileSize = this.map.getSize(); 
     114        tileSize.w = tileSize.w * this.ratio; 
     115        tileSize.h = tileSize.h * this.ratio; 
     116        this.tileSize = tileSize; 
     117        this.imageSize = tileSize; 
     118        this.imageOffset = new OpenLayers.Pixel(0, 0); 
     119    }, 
     120 
    112121    /** When it is not a dragging move (ie when done dragging) 
    113122     *   reload and recenter the div. 
    114123     *  
     
    152161                                      center.lat + (tileHeight / 2)); 
    153162 
    154163            //determine new tile size 
    155             this.tileSize = this.map.getSize(); 
    156             this.tileSize.w = this.tileSize.w * this.ratio; 
    157             this.tileSize.h = this.tileSize.h * this.ratio; 
     164            this.setTileSize(); 
    158165 
    159166            //formulate request url string 
    160167            var url = this.getURL(tileBounds);  
  • lib/OpenLayers/Tile/Image.js

    old new  
    1515    /** @type DOMElement img */ 
    1616    imgDiv: null, 
    1717 
     18    /** 
     19     * The image element is appended to the frame.  Any gutter on the image  
     20     * will be hidden behind the frame.  
     21     *  
     22     * @type DOMElement div */  
     23    frame: null,  
     24 
    1825    /**  
    1926    * @constructor 
    2027    * 
     
    2633    */ 
    2734    initialize: function(layer, position, bounds, url, size) { 
    2835        OpenLayers.Tile.prototype.initialize.apply(this, arguments); 
     36        this.frame = document.createElement('div');  
     37        this.frame.style.overflow = 'hidden';  
     38        this.frame.style.position = 'absolute';  
    2939    }, 
    3040 
    3141    /** 
     
    3444    destroy: function() { 
    3545        if (this.imgDiv != null)  { 
    3646            OpenLayers.Event.stopObservingElement(this.imgDiv.id); 
    37             if (this.imgDiv.parentNode == this.layer.div) { 
    38                 this.layer.div.removeChild(this.imgDiv); 
     47            if (this.imgDiv.parentNode == this.frame) { 
     48                this.frame.removeChild(this.imgDiv); 
    3949                this.imgDiv.map = null; 
    4050            } 
    4151        } 
    4252        this.imgDiv = null; 
     53        if ((this.frame != null) && (this.frame.parentNode == this.layer.div)) {  
     54            this.layer.div.removeChild(this.frame);  
     55        } 
     56        this.frame = null;  
    4357        OpenLayers.Tile.prototype.destroy.apply(this, arguments); 
    4458    }, 
    4559 
     
    6074        this.imgDiv.viewRequestID = this.layer.map.viewRequestID; 
    6175         
    6276        this.url = this.layer.getURL(this.bounds); 
    63    
     77        // position the frame  
     78        OpenLayers.Util.modifyDOMElement(this.frame,  
     79                                         null, this.position, this.size);    
     80 
    6481        if (this.layer.alpha) { 
    6582            OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv, 
    66                     null, this.position, this.size, this.url); 
     83                    null, null, this.layer.imageSize, this.url); 
    6784        } else { 
    6885            this.imgDiv.src = this.url; 
    6986            OpenLayers.Util.modifyDOMElement(this.imgDiv, 
    70                     null, this.position, this.size) ; 
     87                    null, null, this.layer.imageSize) ; 
    7188        } 
    7289        this.drawn = true; 
    7390        return true; 
     
    102119    initImgDiv: function() { 
    103120        if (this.layer.alpha) { 
    104121            this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null, 
    105                                                            this.position
    106                                                            this.size, 
     122                                                           this.layer.imageOffset
     123                                                           this.layer.imageSize, 
    107124                                                           null, 
    108                                                            "absolute", 
     125                                                           "relative", 
    109126                                                           null, 
    110127                                                           null, 
    111128                                                           null, 
    112129                                                           true); 
    113130        } else { 
    114131            this.imgDiv = OpenLayers.Util.createImage(null, 
    115                                                       this.position
    116                                                       this.size, 
     132                                                      this.layer.imageOffset
     133                                                      this.layer.imageSize, 
    117134                                                      null, 
    118                                                       "absolute", 
     135                                                      "relative", 
    119136                                                      null, 
    120137                                                      null, 
    121138                                                      true); 
     
    131148        OpenLayers.Event.observe( this.imgDiv, "load", 
    132149                        this.checkImgURL.bindAsEventListener(this) ); 
    133150        */ 
    134         this.layer.div.appendChild(this.imgDiv); 
     151        this.frame.appendChild(this.imgDiv);  
     152        this.layer.div.appendChild(this.frame);  
     153 
    135154        if(this.layer.opacity != null) { 
    136155             
    137156            OpenLayers.Util.modifyDOMElement(this.imgDiv, null, null, null, 
  • tests/Layer/test_MapServer.html

    old new  
    1 <html> 
    2 <head> 
    3     <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>Z 
    4      
    5  
    6 <script src="../../lib/OpenLayers.js"></script> 
    7   <script type="text/javascript"><!-- 
    8     var isMozilla = (navigator.userAgent.indexOf("compatible") == -1); 
    9     var layer;  
    10  
    11     var name = 'Test Layer'; 
    12     var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    13     var params = { map: '/mapdata/vmap_wms.map',  
    14                    layers: 'basic'}; 
    15  
    16     function test_01_Layer_MapServer_constructor (t) { 
    17         t.plan( 4 ); 
    18  
    19         var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    20         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    21         t.ok( layer instanceof OpenLayers.Layer.MapServer, "new OpenLayers.Layer.MapServer returns object" ); 
    22         t.eq( layer.url, "http://labs.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" ); 
    23  
    24         t.eq( layer.params.mode, "map", "default mode param correctly copied"); 
    25         t.eq( layer.params.map_imagetype, "png", "default imagetype correctly copied"); 
    26  
    27  
    28     } 
    29      
    30     function test_02_Layer_MapServer_addtile (t) { 
    31         t.plan( 6 ); 
    32      
    33         var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    34         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    35         var map = new OpenLayers.Map('map'); 
    36         map.addLayer(layer); 
    37         var pixel = new OpenLayers.Pixel(5,6); 
    38         var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel); 
    39         tile.draw(); 
    40  
    41         var img = tile.imgDiv; 
    42         var tParams = OpenLayers.Util.extend({},params); 
    43         tParams = OpenLayers.Util.extend(tParams, { 
    44                  layers: 'basic',  
    45                  mode: 'map', 
    46                  map_imagetype: 'png', 
    47                  mapext:[1,2,3,4], 
    48                  imgext:[1,2,3,4], 
    49                  map_size:[256, 256], 
    50                  imgx:128, 
    51                  imgy:128, 
    52                  imgxy:[256,256] 
    53         }); 
    54         t.eq( img.src, 
    55              url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"), 
    56              "image src is created correctly via addtile" ); 
    57         t.eq( tile.imgDiv.style.top, "6px", "image top is set correctly via addtile" ); 
    58         t.eq( tile.imgDiv.style.left, "5px", "image top is set correctly via addtile" ); 
    59  
    60         var firstChild = layer.div.firstChild
    61         if (!isMozilla) 
    62             t.ok( true, "skipping element test outside of Mozilla"); 
    63         else 
    64             t.ok( firstChild instanceof HTMLElement, "div first child is an image object" ); 
    65         t.eq( firstChild.src, 
    66              url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"), 
    67              "div first child is correct image object" ); 
    68         t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." ); 
    69     } 
    70      
    71     function test_03_Layer_MapServer_inittiles (t) { 
    72         t.plan( 2 ); 
    73         var map = new OpenLayers.Map('map'); 
    74         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    75         map.addLayer(layer); 
    76         map.setCenter(new OpenLayers.LonLat(0,0),5); 
    77         t.eq( layer.grid.length, 7, "Grid rows is correct." ); 
    78         t.eq( layer.grid[0].length, 6, "Grid cols is correct." ); 
    79          
    80     } 
    81  
    82  
    83     function test_04_Layer_MapServer_clone (t) { 
    84         t.plan(4); 
    85          
    86         var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    87         var options = {tileSize: new OpenLayers.Size(500,50)}; 
    88         var map = new OpenLayers.Map('map', options); 
    89         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    90         map.addLayer(layer); 
    91  
    92         layer.grid = [ [6, 7],  
    93                        [8, 9]]; 
    94  
    95         var clone = layer.clone(); 
    96  
    97         t.ok( clone.grid != layer.grid, "clone does not copy grid"); 
    98  
    99         t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned"); 
    100  
    101         layer.tileSize.w += 40; 
    102  
    103         t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference"); 
    104  
    105         t.eq( clone.alpha, layer.alpha, "alpha copied correctly"); 
    106  
    107         layer.grid = null; 
    108     } 
    109  
    110     function test_05_Layer_MapServer_isBaseLayer(t) { 
    111         t.plan(3); 
    112          
    113         var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    114         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    115         t.ok( layer.isBaseLayer, "baselayer is true by default"); 
    116  
    117         var newParams = OpenLayers.Util.extend(new Object(), params); 
    118         newParams.transparent = "true"; 
    119         layer = new OpenLayers.Layer.MapServer(name, url, newParams); 
    120         t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true"); 
    121  
    122         layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false}); 
    123         t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" ); 
    124     } 
    125  
    126     function test_06_Layer_MapServer_mergeNewParams (t) { 
    127         t.plan( 5 ); 
    128  
    129         var map = new OpenLayers.Map("map"); 
    130         var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    131         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    132          
    133         var newParams = { layers: 'sooper',  
    134                           chickpeas: 'image/png'}; 
    135  
    136         map.addLayer(layer); 
    137         map.zoomToMaxExtent(); 
    138         t.ok( !layer.grid[0][0].url.match("chickpeas"), "chickpeas is not in URL of first tile in grid" ); 
    139  
    140         layer.mergeNewParams(newParams); 
    141          
    142         t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well"); 
    143         t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well"); 
    144         t.ok( layer.grid[0][0].url.match("chickpeas"), "chickpeas is in URL of first tile in grid" ); 
    145  
    146         newParams.chickpeas = 151; 
    147  
    148         t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable"); 
    149     } 
    150  
    151     function test_07_Layer_MapServer_getFullRequestString (t) { 
    152  
    153          
    154         t.plan( 1 ); 
    155         var map = new OpenLayers.Map('map'); 
    156         tUrl = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    157         tParams = { layers: 'basic',  
    158                     format: 'png'}; 
    159         var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams); 
    160         map.addLayer(tLayer); 
    161         str = tLayer.getFullRequestString(); 
    162         var tParams = { 
    163                  layers: 'basic',  
    164                  format: 'png', 
    165                  mode: 'map', 
    166                  map_imagetype: 'png' 
    167         }; 
    168  
    169             var sStr = tUrl + "?" + OpenLayers.Util.getParameterString(tParams); 
    170             sStr = sStr.replace(/,/g, "+"); 
    171          
    172         t.eq(str, sStr , "getFullRequestString() works"); 
    173  
    174     } 
    175  
    176     function test_08_Layer_MapServer_setOpacity (t) { 
    177         t.plan( 5 ); 
    178  
    179         var map = new OpenLayers.Map('map'); 
    180         map.projection = "xx"; 
    181         tUrl = "http://labs.metacarta.com/cgi-bin/mapserv"; 
    182         tParams = { layers: 'basic',  
    183                    format: 'image/png'}; 
    184         tOptions = { 'opacity': '0.5' };            
    185         var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams, tOptions); 
    186         map.addLayer(tLayer); 
    187         map.zoomToMaxExtent(); 
    188         t.eq(tLayer.opacity, "0.5", "Opacity is set correctly"); 
    189         t.eq(parseFloat(tLayer.div.firstChild.style.opacity), 0.5, "Opacity on tile is correct"); 
    190         tLayer.setOpacity("0.6"); 
    191         t.eq(tLayer.opacity, "0.6", "setOpacity works properly"); 
    192         t.eq(parseFloat(tLayer.div.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly"); 
    193         var pixel = new OpenLayers.Pixel(5,6); 
    194         var tile = tLayer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel); 
    195         tile.draw(); 
    196         t.eq(parseFloat(tile.imgDiv.style.opacity), 0.6, "Tile opacity is set correctly"); 
    197  
    198     }     
    199      
    200     function test_20_Layer_MapServer_Reproject (t) {  
    201         t.plan(5); 
    202         var map = new OpenLayers.Map('map'); 
    203         var layer = new OpenLayers.Layer.Google("Google"); 
    204         map.addLayer(layer); 
    205         layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false, reproject: true}); 
    206         layer.isBaseLayer=false; 
    207         map.addLayer(layer); 
    208         map.setCenter(new OpenLayers.LonLat(0,0), 5); 
    209         var tile = layer.grid[0][0]; 
    210         t.eq( tile.bounds.left, -22.5, "left side matches" );  
    211         t.eq( tile.bounds.right, -11.25, "top side matches" );  
    212         t.eq( tile.bounds.bottom.toFixed(6), '11.178402', "bottom side matches" );  
    213         t.eq( tile.bounds.top.toFixed(6), '21.943046', "top side matches" );  
    214          
    215         var map = new OpenLayers.Map('map'); 
    216         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    217         map.addLayer(layer); 
    218         map.setCenter(new OpenLayers.LonLat(0,0), 5); 
    219         var tile = layer.grid[0][0]; 
    220         t.ok( tile.bounds.equals(new OpenLayers.Bounds(-33.75, 33.75, -22.5, 45)), "okay"); 
    221     } 
    222      
    223     function test_99_Layer_MapServer_destroy (t) { 
    224  
    225         t.plan( 1 ); 
    226  
    227         var map = new OpenLayers.Map('map'); 
    228         layer = new OpenLayers.Layer.MapServer(name, url, params); 
    229         map.addLayer(layer); 
    230  
    231         map.setCenter(new OpenLayers.LonLat(0,0), 5); 
    232  
    233         //grab a reference to one of the tiles 
    234         var tile = layer.grid[0][0];         
    235  
    236         layer.destroy(); 
    237          
    238     // checks to make sure superclass (grid) destroy() was called     
    239          
    240         t.ok( layer.grid == null, "grid set to null"); 
    241     } 
    242      
    243   // --> 
    244   </script> 
    245 </head> 
    246 <body> 
    247 <div id="map" style="width:500px;height:550px"></div> 
    248 </body> 
    249 </html> 
     1<html> 
     2<head> 
     3    <script src='http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>Z 
     4     
     5 
     6<script src="../../lib/OpenLayers.js"></script> 
     7  <script type="text/javascript"><!-- 
     8    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1); 
     9    var layer;  
     10 
     11    var name = 'Test Layer'; 
     12    var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     13    var params = { map: '/mapdata/vmap_wms.map',  
     14                   layers: 'basic'}; 
     15 
     16    function test_01_Layer_MapServer_constructor (t) { 
     17        t.plan( 4 ); 
     18 
     19        var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     20        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     21        t.ok( layer instanceof OpenLayers.Layer.MapServer, "new OpenLayers.Layer.MapServer returns object" ); 
     22        t.eq( layer.url, "http://labs.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" ); 
     23 
     24        t.eq( layer.params.mode, "map", "default mode param correctly copied"); 
     25        t.eq( layer.params.map_imagetype, "png", "default imagetype correctly copied"); 
     26 
     27 
     28    } 
     29     
     30    function test_02_Layer_MapServer_addtile (t) { 
     31        t.plan( 6 ); 
     32     
     33        var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     34        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     35        var map = new OpenLayers.Map('map'); 
     36        map.addLayer(layer); 
     37        var pixel = new OpenLayers.Pixel(5,6); 
     38        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel); 
     39        tile.draw(); 
     40 
     41        var img = tile.imgDiv; 
     42        var tParams = OpenLayers.Util.extend({},params); 
     43        tParams = OpenLayers.Util.extend(tParams, { 
     44                 layers: 'basic',  
     45                 mode: 'map', 
     46                 map_imagetype: 'png', 
     47                 mapext:[1,2,3,4], 
     48                 imgext:[1,2,3,4], 
     49                 map_size:[256, 256], 
     50                 imgx:128, 
     51                 imgy:128, 
     52                 imgxy:[256,256] 
     53        }); 
     54        t.eq( img.src, 
     55             url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"), 
     56             "image src is created correctly via addtile" ); 
     57        t.eq( tile.frame.style.top, "6px", "image top is set correctly via addtile" ); 
     58        t.eq( tile.frame.style.left, "5px", "image top is set correctly via addtile" ); 
     59 
     60        var firstChild = layer.div.firstChild.firstChild
     61        if (!isMozilla) 
     62            t.ok( true, "skipping element test outside of Mozilla"); 
     63        else 
     64            t.ok( firstChild instanceof HTMLElement, "div first child is an image object" ); 
     65        t.eq( firstChild.src, 
     66             url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"), 
     67             "div first child is correct image object" ); 
     68        t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." ); 
     69    } 
     70     
     71    function test_03_Layer_MapServer_inittiles (t) { 
     72        t.plan( 2 ); 
     73        var map = new OpenLayers.Map('map'); 
     74        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     75        map.addLayer(layer); 
     76        map.setCenter(new OpenLayers.LonLat(0,0),5); 
     77        t.eq( layer.grid.length, 7, "Grid rows is correct." ); 
     78        t.eq( layer.grid[0].length, 6, "Grid cols is correct." ); 
     79         
     80    } 
     81 
     82 
     83    function test_04_Layer_MapServer_clone (t) { 
     84        t.plan(4); 
     85         
     86        var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     87        var options = {tileSize: new OpenLayers.Size(500,50)}; 
     88        var map = new OpenLayers.Map('map', options); 
     89        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     90        map.addLayer(layer); 
     91 
     92        layer.grid = [ [6, 7],  
     93                       [8, 9]]; 
     94 
     95        var clone = layer.clone(); 
     96 
     97        t.ok( clone.grid != layer.grid, "clone does not copy grid"); 
     98 
     99        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned"); 
     100 
     101        layer.tileSize.w += 40; 
     102 
     103        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference"); 
     104 
     105        t.eq( clone.alpha, layer.alpha, "alpha copied correctly"); 
     106 
     107        layer.grid = null; 
     108    } 
     109 
     110    function test_05_Layer_MapServer_isBaseLayer(t) { 
     111        t.plan(3); 
     112         
     113        var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     114        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     115        t.ok( layer.isBaseLayer, "baselayer is true by default"); 
     116 
     117        var newParams = OpenLayers.Util.extend(new Object(), params); 
     118        newParams.transparent = "true"; 
     119        layer = new OpenLayers.Layer.MapServer(name, url, newParams); 
     120        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true"); 
     121 
     122        layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false}); 
     123        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" ); 
     124    } 
     125 
     126    function test_06_Layer_MapServer_mergeNewParams (t) { 
     127        t.plan( 5 ); 
     128 
     129        var map = new OpenLayers.Map("map"); 
     130        var url = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     131        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     132         
     133        var newParams = { layers: 'sooper',  
     134                          chickpeas: 'image/png'}; 
     135 
     136        map.addLayer(layer); 
     137        map.zoomToMaxExtent(); 
     138        t.ok( !layer.grid[0][0].url.match("chickpeas"), "chickpeas is not in URL of first tile in grid" ); 
     139 
     140        layer.mergeNewParams(newParams); 
     141         
     142        t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well"); 
     143        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well"); 
     144        t.ok( layer.grid[0][0].url.match("chickpeas"), "chickpeas is in URL of first tile in grid" ); 
     145 
     146        newParams.chickpeas = 151; 
     147 
     148        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable"); 
     149    } 
     150 
     151    function test_07_Layer_MapServer_getFullRequestString (t) { 
     152 
     153         
     154        t.plan( 1 ); 
     155        var map = new OpenLayers.Map('map'); 
     156        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     157        tParams = { layers: 'basic',  
     158                    format: 'png'}; 
     159        var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams); 
     160        map.addLayer(tLayer); 
     161        str = tLayer.getFullRequestString(); 
     162        var tParams = { 
     163                 layers: 'basic',  
     164                 format: 'png', 
     165                 mode: 'map', 
     166                 map_imagetype: 'png' 
     167        }; 
     168 
     169            var sStr = tUrl + "?" + OpenLayers.Util.getParameterString(tParams); 
     170            sStr = sStr.replace(/,/g, "+"); 
     171         
     172        t.eq(str, sStr , "getFullRequestString() works"); 
     173 
     174    } 
     175 
     176    function test_08_Layer_MapServer_setOpacity (t) { 
     177        t.plan( 5 ); 
     178 
     179        var map = new OpenLayers.Map('map'); 
     180        map.projection = "xx"; 
     181        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv"; 
     182        tParams = { layers: 'basic',  
     183                   format: 'image/png'}; 
     184        tOptions = { 'opacity': '0.5' };            
     185        var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams, tOptions); 
     186        map.addLayer(tLayer); 
     187        map.zoomToMaxExtent(); 
     188        t.eq(tLayer.opacity, "0.5", "Opacity is set correctly"); 
     189        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.5, "Opacity on tile is correct"); 
     190        tLayer.setOpacity("0.6"); 
     191        t.eq(tLayer.opacity, "0.6", "setOpacity works properly"); 
     192        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly"); 
     193        var pixel = new OpenLayers.Pixel(5,6); 
     194        var tile = tLayer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel); 
     195        tile.draw(); 
     196        t.eq(parseFloat(tile.imgDiv.style.opacity), 0.6, "Tile opacity is set correctly"); 
     197 
     198    }     
     199     
     200    function test_20_Layer_MapServer_Reproject (t) {  
     201        t.plan(5); 
     202        var map = new OpenLayers.Map('map'); 
     203        var layer = new OpenLayers.Layer.Google("Google"); 
     204        map.addLayer(layer); 
     205        layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false, reproject: true}); 
     206        layer.isBaseLayer=false; 
     207        map.addLayer(layer); 
     208        map.setCenter(new OpenLayers.LonLat(0,0), 5); 
     209        var tile = layer.grid[0][0]; 
     210        t.eq( tile.bounds.left, -22.5, "left side matches" );  
     211        t.eq( tile.bounds.right, -11.25, "top side matches" );  
     212        t.eq( tile.bounds.bottom.toFixed(6), '11.178402', "bottom side matches" );  
     213        t.eq( tile.bounds.top.toFixed(6), '21.943046', "top side matches" );  
     214         
     215        var map = new OpenLayers.Map('map'); 
     216        layer = new OpenLayers.Layer.MapServer(name, url, params); 
     217        map.addLayer(layer); 
     218        map.setCenter