NG.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for
  2. * full list of contributors). Published under the Clear BSD license.
  3. * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  4. * full text of the license. */
  5. /**
  6. * @requires OpenLayers/Renderer/Elements.js
  7. */
  8. /**
  9. * Class: OpenLayers.Renderer.NG
  10. *
  11. * Inherits from:
  12. * - <OpenLayers.Renderer.Elements>
  13. */
  14. OpenLayers.Renderer.NG = OpenLayers.Class(OpenLayers.Renderer.Elements, {
  15. /**
  16. * Constant: labelNodeType
  17. * {String} The node type for text label containers. To be defined by
  18. * subclasses.
  19. */
  20. labelNodeType: null,
  21. /**
  22. * Constructor: OpenLayers.Renderer.NG
  23. *
  24. * Parameters:
  25. * containerID - {String}
  26. * options - {Object} options for this renderer. Supported options are:
  27. * * yOrdering - {Boolean} Whether to use y-ordering
  28. * * zIndexing - {Boolean} Whether to use z-indexing. Will be ignored
  29. * if yOrdering is set to true.
  30. */
  31. /**
  32. * Method: updateDimensions
  33. * To be extended by subclasses - here we set positioning related styles
  34. * on HTML elements, subclasses have to do the same for renderer specific
  35. * elements (e.g. viewBox, width and height of the rendererRoot)
  36. *
  37. * Parameters:
  38. * zoomChanged - {Boolean} Has the zoom changed? If so, subclasses may have
  39. * to update feature styles/dimensions.
  40. */
  41. updateDimensions: function(zoomChanged) {
  42. var mapExtent = this.map.getExtent();
  43. var renderExtent = mapExtent.scale(3);
  44. this.setExtent(renderExtent, true);
  45. var res = this.getResolution();
  46. var div = this.rendererRoot.parentNode;
  47. var layerLeft = parseFloat(div.parentNode.style.left);
  48. var layerTop = parseFloat(div.parentNode.style.top);
  49. div.style.left = ((renderExtent.left - mapExtent.left) / res - layerLeft) + "px";
  50. div.style.top = ((mapExtent.top - renderExtent.top) / res - layerTop) + "px";
  51. },
  52. /**
  53. * Method: resize
  54. */
  55. setSize: function() {
  56. this.map.getExtent() && this.updateDimensions();
  57. },
  58. /**
  59. * Method: drawFeature
  60. * Draw the feature. The optional style argument can be used
  61. * to override the feature's own style. This method should only
  62. * be called from layer.drawFeature().
  63. *
  64. * Parameters:
  65. * feature - {<OpenLayers.Feature.Vector>}
  66. * style - {<Object>}
  67. *
  68. * Returns:
  69. * {Boolean} true if the feature has been drawn completely, false if not,
  70. * undefined if the feature had no geometry
  71. */
  72. drawFeature: function(feature, style) {
  73. if(style == null) {
  74. style = feature.style;
  75. }
  76. if (feature.geometry) {
  77. var rendered = this.drawGeometry(feature.geometry, style, feature.id);
  78. if(rendered !== false && style.label) {
  79. var location = feature.geometry.getCentroid();
  80. this.drawText(feature.id, style, location);
  81. } else {
  82. this.removeText(feature.id);
  83. }
  84. return rendered;
  85. }
  86. },
  87. /**
  88. * Method: drawText
  89. * Function for drawing text labels.
  90. * This method is only called by the renderer itself.
  91. *
  92. * Parameters:
  93. * featureId - {String|DOMElement}
  94. * style - {Object}
  95. * location - {<OpenLayers.Geometry.Point>}, will be modified inline
  96. *
  97. * Returns:
  98. * {DOMElement} container holding the text label (to be populated by
  99. * subclasses)
  100. */
  101. drawText: function(featureId, style, location) {
  102. var label;
  103. if (typeof featureId !== "string") {
  104. label = featureId;
  105. } else {
  106. label = this.nodeFactory(featureId + this.LABEL_ID_SUFFIX, this.labelNodeType);
  107. label._featureId = featureId;
  108. }
  109. label._style = style;
  110. label._x = location.x;
  111. label._y = location.y;
  112. if(style.labelXOffset || style.labelYOffset) {
  113. var xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset;
  114. var yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset;
  115. var res = this.getResolution();
  116. location.move(xOffset*res, yOffset*res);
  117. }
  118. if(label.parentNode !== this.textRoot) {
  119. this.textRoot.appendChild(label);
  120. }
  121. return label;
  122. },
  123. CLASS_NAME: "OpenLayers.Renderer.NG"
  124. });