| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- /* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the Clear BSD license.
- * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
- * full text of the license. */
- /**
- * @requires OpenLayers/BaseTypes/Class.js
- */
- /**
- * Class: OpenLayers.Renderer
- * This is the base class for all renderers.
- *
- * This is based on a merger code written by Paul Spencer and Bertil Chapuis.
- * It is largely composed of virtual functions that are to be implemented
- * in technology-specific subclasses, but there is some generic code too.
- *
- * The functions that *are* implemented here merely deal with the maintenance
- * of the size and extent variables, as well as the cached 'resolution'
- * value.
- *
- * A note to the user that all subclasses should use getResolution() instead
- * of directly accessing this.resolution in order to correctly use the
- * cacheing system.
- *
- */
- OpenLayers.Renderer = OpenLayers.Class({
- /**
- * Property: container
- * {DOMElement}
- */
- container: null,
-
- /**
- * Property: root
- * {DOMElement}
- */
- root: null,
- /**
- * Property: extent
- * {<OpenLayers.Bounds>}
- */
- extent: null,
- /**
- * Property: locked
- * {Boolean} If the renderer is currently in a state where many things
- * are changing, the 'locked' property is set to true. This means
- * that renderers can expect at least one more drawFeature event to be
- * called with the 'locked' property set to 'true': In some renderers,
- * this might make sense to use as a 'only update local information'
- * flag.
- */
- locked: false,
-
- /**
- * Property: size
- * {<OpenLayers.Size>}
- */
- size: null,
-
- /**
- * Property: resolution
- * {Float} cache of current map resolution
- */
- resolution: null,
-
- /**
- * Property: map
- * {<OpenLayers.Map>} Reference to the map -- this is set in Vector's setMap()
- */
- map: null,
-
- /**
- * Constructor: OpenLayers.Renderer
- *
- * Parameters:
- * containerID - {<String>}
- * options - {Object} options for this renderer. See sublcasses for
- * supported options.
- */
- initialize: function(containerID, options) {
- this.container = OpenLayers.Util.getElement(containerID);
- OpenLayers.Util.extend(this, options);
- },
-
- /**
- * APIMethod: destroy
- */
- destroy: function() {
- this.container = null;
- this.extent = null;
- this.size = null;
- this.resolution = null;
- this.map = null;
- },
- /**
- * APIMethod: supported
- * This should be overridden by specific subclasses
- *
- * Returns:
- * {Boolean} Whether or not the browser supports the renderer class
- */
- supported: function() {
- return false;
- },
-
- /**
- * Method: setExtent
- * Set the visible part of the layer.
- *
- * Resolution has probably changed, so we nullify the resolution
- * cache (this.resolution) -- this way it will be re-computed when
- * next it is needed.
- * We nullify the resolution cache (this.resolution) if resolutionChanged
- * is set to true - this way it will be re-computed on the next
- * getResolution() request.
- *
- * Parameters:
- * extent - {<OpenLayers.Bounds>}
- * resolutionChanged - {Boolean}
- */
- setExtent: function(extent, resolutionChanged) {
- this.extent = extent.clone();
- if (resolutionChanged) {
- this.resolution = null;
- }
- },
-
- /**
- * Method: setSize
- * Sets the size of the drawing surface.
- *
- * Resolution has probably changed, so we nullify the resolution
- * cache (this.resolution) -- this way it will be re-computed when
- * next it is needed.
- *
- * Parameters:
- * size - {<OpenLayers.Size>}
- */
- setSize: function(size) {
- this.size = size.clone();
- this.resolution = null;
- },
-
- /**
- * Method: getResolution
- * Uses cached copy of resolution if available to minimize computing
- *
- * Returns:
- * The current map's resolution
- */
- getResolution: function() {
- this.resolution = this.resolution || this.map.getResolution();
- return this.resolution;
- },
-
- /**
- * Method: drawFeature
- * Draw the feature. The optional style argument can be used
- * to override the feature's own style. This method should only
- * be called from layer.drawFeature().
- *
- * Parameters:
- * feature - {<OpenLayers.Feature.Vector>}
- * style - {<Object>}
- *
- * Returns:
- * {Boolean} true if the feature has been drawn completely, false if not,
- * undefined if the feature had no geometry
- */
- drawFeature: function(feature, style) {
- if(style == null) {
- style = feature.style;
- }
- if (feature.geometry) {
- var bounds = feature.geometry.getBounds();
- if(bounds) {
- if (!bounds.intersectsBounds(this.extent)) {
- style = {display: "none"};
- }
- var rendered = this.drawGeometry(feature.geometry, style, feature.id);
- if(style.display != "none" && style.label && rendered !== false) {
- var location = feature.geometry.getCentroid();
- if(style.labelXOffset || style.labelYOffset) {
- var xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset;
- var yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset;
- var res = this.getResolution();
- location.move(xOffset*res, yOffset*res);
- }
- this.drawText(feature.id, style, location);
- } else {
- this.removeText(feature.id);
- }
- return rendered;
- }
- }
- },
- /**
- * Method: drawGeometry
- *
- * Draw a geometry. This should only be called from the renderer itself.
- * Use layer.drawFeature() from outside the renderer.
- * virtual function
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>}
- * style - {Object}
- * featureId - {<String>}
- */
- drawGeometry: function(geometry, style, featureId) {},
-
- /**
- * Method: drawText
- * Function for drawing text labels.
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * featureId - {String}
- * style -
- * location - {<OpenLayers.Geometry.Point>}
- */
- drawText: function(featureId, style, location) {},
- /**
- * Method: removeText
- * Function for removing text labels.
- * This method is only called by the renderer itself.
- *
- * Parameters:
- * featureId - {String}
- */
- removeText: function(featureId) {},
-
- /**
- * Method: clear
- * Clear all vectors from the renderer.
- * virtual function.
- */
- clear: function() {},
- /**
- * Method: getFeatureIdFromEvent
- * Returns a feature id from an event on the renderer.
- * How this happens is specific to the renderer. This should be
- * called from layer.getFeatureFromEvent().
- * Virtual function.
- *
- * Parameters:
- * evt - {<OpenLayers.Event>}
- *
- * Returns:
- * {String} A feature id or null.
- */
- getFeatureIdFromEvent: function(evt) {},
-
- /**
- * Method: eraseFeatures
- * This is called by the layer to erase features
- *
- * Parameters:
- * features - {Array(<OpenLayers.Feature.Vector>)}
- */
- eraseFeatures: function(features) {
- if(!(OpenLayers.Util.isArray(features))) {
- features = [features];
- }
- for(var i=0, len=features.length; i<len; ++i) {
- var feature = features[i];
- this.eraseGeometry(feature.geometry, feature.id);
- this.removeText(feature.id);
- }
- },
-
- /**
- * Method: eraseGeometry
- * Remove a geometry from the renderer (by id).
- * virtual function.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>}
- * featureId - {String}
- */
- eraseGeometry: function(geometry, featureId) {},
-
- /**
- * Method: moveRoot
- * moves this renderer's root to a (different) renderer.
- * To be implemented by subclasses that require a common renderer root for
- * feature selection.
- *
- * Parameters:
- * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
- */
- moveRoot: function(renderer) {},
- /**
- * Method: getRenderLayerId
- * Gets the layer that this renderer's output appears on. If moveRoot was
- * used, this will be different from the id of the layer containing the
- * features rendered by this renderer.
- *
- * Returns:
- * {String} the id of the output layer.
- */
- getRenderLayerId: function() {
- return this.container.id;
- },
-
- /**
- * Method: applyDefaultSymbolizer
- *
- * Parameters:
- * symbolizer - {Object}
- *
- * Returns:
- * {Object}
- */
- applyDefaultSymbolizer: function(symbolizer) {
- var result = OpenLayers.Util.extend({},
- OpenLayers.Renderer.defaultSymbolizer);
- if(symbolizer.stroke === false) {
- delete result.strokeWidth;
- delete result.strokeColor;
- }
- if(symbolizer.fill === false) {
- delete result.fillColor;
- }
- OpenLayers.Util.extend(result, symbolizer);
- return result;
- },
- CLASS_NAME: "OpenLayers.Renderer"
- });
- /**
- * Constant: OpenLayers.Renderer.defaultSymbolizer
- * {Object} Properties from this symbolizer will be applied to symbolizers
- * with missing properties. This can also be used to set a global
- * symbolizer default in OpenLayers. To be SLD 1.x compliant, add the
- * following code before rendering any vector features:
- * (code)
- * OpenLayers.Renderer.defaultSymbolizer = {
- * fillColor: "#808080",
- * fillOpacity: 1,
- * strokeColor: "#000000",
- * strokeOpacity: 1,
- * strokeWidth: 1,
- * pointRadius: 3,
- * graphicName: "square"
- * };
- * (end)
- */
- OpenLayers.Renderer.defaultSymbolizer = {
- fillColor: "#000000",
- strokeColor: "#000000",
- strokeWidth: 2,
- fillOpacity: 1,
- strokeOpacity: 1,
- pointRadius: 0
- };
-
|