OpenLayers OpenLayers

Changeset 5407

Show
Ignore:
Timestamp:
12/14/07 08:50:45 (1 year ago)
Author:
pgiraud
Message:

instead of loading a symbol catalogue for the whole layer, user can set a symbol using an external reference to a svg file (file.svg#symbol)
follows the miles.togoe proposal

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sandbox/camptocamp/vectorSymbols/examples/vector-symbols.html

    r5341 r5407  
    2121            map.addLayer(layer); 
    2222             
    23             var options = { 
    24                 rendererOptions: { 
    25                     catalogueUrl: "symbol_catalog.svg" 
    26                 } 
    27             }; 
     23            var options = {}; 
    2824            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry",options); 
    2925             
     
    3127             
    3228            map.setCenter(new OpenLayers.LonLat(0,0), 2); 
    33              
     29            /* 
    3430            var styles = []; 
    3531            var defs = vectorLayer.renderer.defs.childNodes; 
     
    3733                var style = { 
    3834                    pointerEvents: 'visiblePainted', 
    39                     symbol: defs[i].id 
     35                    symbol: '#' + defs[i].id 
    4036                } 
    4137                styles.push(style); 
     
    5450                vectorLayer.addFeatures([pointFeature]); 
    5551            } 
    56  
     52*/ 
     53 
     54            var origin = new OpenLayers.LonLat(-50, -40); 
     55            var style_church = { 
     56                pointerEvents: "visiblePainted", 
     57                symbol: "svg/symbol_catalog.svg#symbol-church", 
     58                width: 20, 
     59                height: 20 
     60            }; 
     61            var point = new OpenLayers.Geometry.Point(origin.lon, origin.lat); 
     62            var pointFeature = new OpenLayers.Feature.Vector(point, null, style_church); 
     63            vectorLayer.addFeatures([pointFeature]); 
    5764 
    5865            var origin = new OpenLayers.LonLat(-50, 30); 
    5966            var style_star = { 
    6067                pointerEvents: "visiblePainted", 
    61                 symbol: "symbol-star" 
     68                symbol: "svg/1.svg#root", 
     69                width: 20, 
     70                height: 20 
    6271            }; 
    6372            var point = new OpenLayers.Geometry.Point(origin.lon, origin.lat); 
     
    6877                fillColor: "red", 
    6978                pointerEvents: "visiblePainted", 
    70                 symbol: "symbol-star" 
     79                symbol: "svg/symbol_catalog.svg#symbol-star" 
    7180            }; 
    7281            var point = new OpenLayers.Geometry.Point(origin.lon, origin.lat + 10); 
     
    7887                strokeColor: "blue", 
    7988                pointerEvents: "visiblePainted", 
    80                 symbol: "symbol-star" 
     89                symbol: "svg/symbol_catalog.svg#symbol-star" 
    8190            }; 
    8291            var point = new OpenLayers.Geometry.Point(origin.lon, origin.lat + 20); 
     
    8695            var style_star2 = { 
    8796                pointerEvents: "visiblePainted", 
    88                 symbol: "symbol-star2" 
     97                symbol: "svg/symbol_catalog.svg#symbol-star2" 
    8998            }; 
    9099            var point = new OpenLayers.Geometry.Point(origin.lon + 10, origin.lat); 
     
    95104                fillColor: "red", 
    96105                pointerEvents: "visiblePainted", 
    97                 symbol: "symbol-star2" 
     106                symbol: "svg/symbol_catalog.svg#symbol-star2" 
    98107            }; 
    99108            var point = new OpenLayers.Geometry.Point(origin.lon + 10, origin.lat + 10); 
     
    105114                strokeColor: "blue", 
    106115                pointerEvents: "visiblePainted", 
    107                 symbol: "symbol-star2" 
     116                symbol: "svg/symbol_catalog.svg#symbol-star2" 
    108117            }; 
    109118            var point = new OpenLayers.Geometry.Point(origin.lon + 10, origin.lat + 20); 
     
    113122            var style_star3 = { 
    114123                pointerEvents: "visiblePainted", 
    115                 symbol: "symbol-star3" 
     124                symbol: "svg/symbol_catalog.svg#symbol-star3" 
    116125            }; 
    117126            var point = new OpenLayers.Geometry.Point(origin.lon + 20, origin.lat); 
     
    122131                fillColor: "red", 
    123132                pointerEvents: "visiblePainted", 
    124                 symbol: "symbol-star3" 
     133                symbol: "svg/symbol_catalog.svg#symbol-star3" 
    125134            }; 
    126135            var point = new OpenLayers.Geometry.Point(origin.lon + 20, origin.lat + 10); 
     
    132141                strokeColor: "blue", 
    133142                pointerEvents: "visiblePainted", 
    134                 symbol: "symbol-star3" 
     143                symbol: "svg/symbol_catalog.svg#symbol-star3" 
    135144            }; 
    136145            var point = new OpenLayers.Geometry.Point(origin.lon + 20 , origin.lat + 20); 
     
    140149            var style_star4 = { 
    141150                pointerEvents: "visiblePainted", 
    142                 symbol: "symbol-star4" 
     151                symbol: "svg/symbol_catalog.svg#symbol-star4" 
    143152            }; 
    144153            var point = new OpenLayers.Geometry.Point(origin.lon + 30, origin.lat); 
     
    149158                fillColor: "red", 
    150159                pointerEvents: "visiblePainted", 
    151                 symbol: "symbol-star4" 
     160                symbol: "svg/symbol_catalog.svg#symbol-star4" 
    152161            }; 
    153162            var point = new OpenLayers.Geometry.Point(origin.lon + 30 , origin.lat + 10); 
     
    159168                strokeColor: "blue", 
    160169                pointerEvents: "visiblePainted", 
    161                 symbol: "symbol-star4" 
     170                symbol: "svg/symbol_catalog.svg#symbol-star4" 
    162171            }; 
    163172            var point = new OpenLayers.Geometry.Point(origin.lon + 30, origin.lat + 20); 
     
    168177            var style_parking = { 
    169178                pointerEvents: "visiblePainted", 
    170                 symbol: "symbol-parking" 
     179                symbol: "svg/symbol_catalog.svg#symbol-parking" 
    171180            }; 
    172181            var point = new OpenLayers.Geometry.Point(origin.lon + 40, origin.lat); 
     
    177186                fillColor: "red", 
    178187                pointerEvents: "visiblePainted", 
    179                 symbol: "symbol-parking" 
     188                symbol: "svg/symbol_catalog.svg#symbol-parking" 
    180189            }; 
    181190            var point = new OpenLayers.Geometry.Point(origin.lon + 40, origin.lat + 10); 
  • sandbox/camptocamp/vectorSymbols/lib/OpenLayers/Renderer/SVG.js

    r5337 r5407  
    236236                var _geometryClass = node._geometryClass; 
    237237                var _style = node._style; 
    238                  
     238                var _symbolId = node._style.symbol; 
     239                // svg external reference 
     240                if (node._style.symbol.indexOf("#") > 1) { 
     241                    _symbolId = '#' + this.importSymbolFromExternalReference(node._style.symbol); 
     242                } 
    239243                // create new use node 
    240244                node = this.createNode("use", id); 
     
    242246                node._geometryClass = _geometryClass; 
    243247                node._style = _style; 
    244                 node.setAttributeNS(this.xlink, "href", "#" + node._style.symbol); 
     248                node.setAttributeNS(this.xlink, "href", _symbolId); 
    245249                     
    246250                var width = node._style.width ? node._style.width : 20 ; 
     
    600604     * Method: addSymbolCatalogue 
    601605     * load the symbol catalogue 
     606     * TODO deprecated 
    602607     *  
    603608     * Parameters: 
     
    615620                     onComplete: OpenLayers.Function.bind(this.parseSymbols, this) 
    616621                  } 
    617                  );                 
     622                 ); 
    618623    }, 
    619624 
     
    621626     * Method: parseSymbols 
    622627     * add symbol definitions to the renderer root 
     628     * TODO deprecated 
    623629     */       
    624630    parseSymbols: function (request)  { 
    625  
    626631        var format = new OpenLayers.Format.XML(); 
    627         doc = format.read(request.responseText); 
     632        var doc = format.read(request.responseText); 
    628633             
    629634        var symbolsDef = doc.getElementsByTagName('symbol');      
     
    634639        }         
    635640    }, 
     641 
     642    /** 
     643     * Method: importSymbolFromExternalReference 
     644     * add a new symbol definition from an external file 
     645     *     The reference should look like file.svg#symbol 
     646     *  
     647     * Returns: 
     648     * {String} - id of the imported symbol 
     649     */       
     650    importSymbolFromExternalReference: function (symbol)  { 
     651        if (!this.defs) { 
     652            // create svg defs tag 
     653            this.defs = this.createDefs(); 
     654        } 
     655        var ref = symbol.split('#'); 
     656        var id = ref[0] + '_' + ref[1] 
     657         
     658        // check if symbol already exists in the defs 
     659        if (document.getElementById(id) != null) { 
     660            return id; 
     661        } 
     662         
     663        // TODO: maybe we also want to check if file (ref[0]) 
     664        // has already been loaded 
     665        // if not we would store the doc for later use 
     666         
     667        var request = new OpenLayers.Ajax.Request(ref[0],  
     668                 {   method: 'get',  
     669                     asynchronous: false, 
     670                     onComplete: function(request){ } 
     671                  } 
     672                 ); 
     673        var format = new OpenLayers.Format.XML(); 
     674        var doc = format.read(request.transport.responseText); 
     675         
     676        var node = document.importNode(doc.getElementById(ref[1]), true); 
     677        node.id = id; 
     678         
     679        if (node.tagName != 'symbol') { 
     680            OpenLayers.Console.error(node.tagName + 'not yet supported for external references'); 
     681        } 
     682         
     683        this.defs.appendChild(node); 
     684        return node.id; 
     685    }, 
    636686     
    637687    /** @final @type String */