shape.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /**
  2. * @ngdoc directive
  3. * @name shape
  4. * @requires Attr2Options
  5. * @description
  6. * Initialize a Google map shape in map with given options and register events
  7. * The shapes are:
  8. * . circle
  9. * . polygon
  10. * . polyline
  11. * . rectangle
  12. * . groundOverlay(or image)
  13. *
  14. * Requires: map directive
  15. *
  16. * Restrict To: Element
  17. *
  18. * @param {Boolean} centered if set, map will be centered with this marker
  19. * @param {String} <OPTIONS>
  20. * For circle, [any circle options](https://developers.google.com/maps/documentation/javascript/reference#CircleOptions)
  21. * For polygon, [any polygon options](https://developers.google.com/maps/documentation/javascript/reference#PolygonOptions)
  22. * For polyline, [any polyline options](https://developers.google.com/maps/documentation/javascript/reference#PolylineOptions)
  23. * For rectangle, [any rectangle options](https://developers.google.com/maps/documentation/javascript/reference#RectangleOptions)
  24. * For image, [any groundOverlay options](https://developers.google.com/maps/documentation/javascript/reference#GroundOverlayOptions)
  25. * @param {String} <MapEvent> Any Shape events, https://developers.google.com/maps/documentation/javascript/reference
  26. * @example
  27. * Usage:
  28. * <map MAP_ATTRIBUTES>
  29. * <shape name=SHAPE_NAME ANY_SHAPE_OPTIONS ANY_SHAPE_EVENTS"></MARKER>
  30. * </map>
  31. *
  32. * Example:
  33. *
  34. * <map zoom="11" center="[40.74, -74.18]">
  35. * <shape id="polyline" name="polyline" geodesic="true" stroke-color="#FF0000" stroke-opacity="1.0" stroke-weight="2"
  36. * path="[[40.74,-74.18],[40.64,-74.10],[40.54,-74.05],[40.44,-74]]" ></shape>
  37. * </map>
  38. *
  39. * <map zoom="11" center="[40.74, -74.18]">
  40. * <shape id="polygon" name="polygon" stroke-color="#FF0000" stroke-opacity="1.0" stroke-weight="2"
  41. * paths="[[40.74,-74.18],[40.64,-74.18],[40.84,-74.08],[40.74,-74.18]]" ></shape>
  42. * </map>
  43. *
  44. * <map zoom="11" center="[40.74, -74.18]">
  45. * <shape id="rectangle" name="rectangle" stroke-color='#FF0000' stroke-opacity="0.8" stroke-weight="2"
  46. * bounds="[[40.74,-74.18], [40.78,-74.14]]" editable="true" ></shape>
  47. * </map>
  48. *
  49. * <map zoom="11" center="[40.74, -74.18]">
  50. * <shape id="circle" name="circle" stroke-color='#FF0000' stroke-opacity="0.8"stroke-weight="2"
  51. * center="[40.70,-74.14]" radius="4000" editable="true" ></shape>
  52. * </map>
  53. *
  54. * <map zoom="11" center="[40.74, -74.18]">
  55. * <shape id="image" name="image" url="https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"
  56. * bounds="[[40.71,-74.22],[40.77,-74.12]]" opacity="0.7" clickable="true" ></shape>
  57. * </map>
  58. *
  59. * For full-working example, please visit
  60. * [shape example](https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/shape.html)
  61. */
  62. ngMap.directive('shape', ['Attr2Options', function(Attr2Options) {
  63. var parser = Attr2Options;
  64. var getBounds = function(points) {
  65. return new google.maps.LatLngBounds(points[0], points[1]);
  66. };
  67. var getShape = function(options, events) {
  68. var shape;
  69. var shapeName = options.name;
  70. delete options.name; //remove name bcoz it's not for options
  71. console.log("shape", shapeName, "options", options, 'events', events);
  72. /**
  73. * set options
  74. */
  75. if (options.icons) {
  76. for (var i=0; i<options.icons.length; i++) {
  77. var el = options.icons[i];
  78. if (el.icon.path.match(/^[A-Z_]+$/)) {
  79. el.icon.path = google.maps.SymbolPath[el.icon.path];
  80. }
  81. }
  82. }
  83. switch(shapeName) {
  84. case "circle":
  85. if (options.center instanceof google.maps.LatLng) {
  86. shape = new google.maps.Circle(options);
  87. } else {
  88. var orgCenter = options.center;
  89. options.center = new google.maps.LatLng(0,0);
  90. shape = new google.maps.Circle(options);
  91. parser.setDelayedGeoLocation(shape, 'setCenter', orgCenter);
  92. }
  93. break;
  94. case "polygon":
  95. shape = new google.maps.Polygon(options);
  96. break;
  97. case "polyline":
  98. shape = new google.maps.Polyline(options);
  99. break;
  100. case "rectangle":
  101. if (options.bounds) {
  102. options.bounds = getBounds(options.bounds);
  103. }
  104. shape = new google.maps.Rectangle(options);
  105. break;
  106. case "groundOverlay":
  107. case "image":
  108. var url = options.url;
  109. var bounds = getBounds(options.bounds);
  110. var opts = {opacity: options.opacity, clickable: options.clickable, id:options.id};
  111. shape = new google.maps.GroundOverlay(url, bounds, opts);
  112. break;
  113. }
  114. /**
  115. * set events
  116. */
  117. for (var eventName in events) {
  118. if (events[eventName]) {
  119. google.maps.event.addListener(shape, eventName, events[eventName]);
  120. }
  121. }
  122. return shape;
  123. };
  124. return {
  125. restrict: 'E',
  126. require: '^map',
  127. /**
  128. * link function
  129. * @private
  130. */
  131. link: function(scope, element, attrs, mapController) {
  132. var orgAttrs = parser.orgAttributes(element);
  133. var filtered = parser.filter(attrs);
  134. var shapeOptions = parser.getOptions(filtered);
  135. var shapeEvents = parser.getEvents(scope, filtered);
  136. var shape = getShape(shapeOptions, shapeEvents);
  137. mapController.addShape(shape);
  138. /**
  139. * set observers
  140. */
  141. parser.observeAttrSetObj(orgAttrs, attrs, shape);
  142. }
  143. }; // return
  144. }]);