leaflet.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { loadResource } from "../../static/utils/resources.js";
  2. export default {
  3. template: "<div></div>",
  4. props: {
  5. center: Array,
  6. zoom: Number,
  7. options: Object,
  8. draw_control: Object,
  9. resource_path: String,
  10. },
  11. async mounted() {
  12. await this.$nextTick(); // NOTE: wait for window.path_prefix to be set
  13. await Promise.all([
  14. loadResource(window.path_prefix + `${this.resource_path}/leaflet/leaflet.css`),
  15. loadResource(window.path_prefix + `${this.resource_path}/leaflet/leaflet.js`),
  16. ]);
  17. if (this.draw_control) {
  18. await Promise.all([
  19. loadResource(window.path_prefix + `${this.resource_path}/leaflet-draw/leaflet.draw.css`),
  20. loadResource(window.path_prefix + `${this.resource_path}/leaflet-draw/leaflet.draw.js`),
  21. ]);
  22. }
  23. this.map = L.map(this.$el, {
  24. ...this.options,
  25. center: this.center,
  26. zoom: this.zoom,
  27. });
  28. for (const type of [
  29. "baselayerchange",
  30. "overlayadd",
  31. "overlayremove",
  32. "layeradd",
  33. "layerremove",
  34. "zoomlevelschange",
  35. "resize",
  36. "unload",
  37. "viewreset",
  38. "load",
  39. "zoomstart",
  40. "movestart",
  41. "zoom",
  42. "move",
  43. "zoomend",
  44. "moveend",
  45. "popupopen",
  46. "popupclose",
  47. "autopanstart",
  48. "tooltipopen",
  49. "tooltipclose",
  50. "locationerror",
  51. "locationfound",
  52. "click",
  53. "dblclick",
  54. "mousedown",
  55. "mouseup",
  56. "mouseover",
  57. "mouseout",
  58. "mousemove",
  59. "contextmenu",
  60. "keypress",
  61. "keydown",
  62. "keyup",
  63. "preclick",
  64. "zoomanim",
  65. ]) {
  66. this.map.on(type, (e) => {
  67. this.$emit(`map-${type}`, {
  68. ...e,
  69. originalEvent: undefined,
  70. target: undefined,
  71. sourceTarget: undefined,
  72. center: [e.target.getCenter().lat, e.target.getCenter().lng],
  73. zoom: e.target.getZoom(),
  74. });
  75. });
  76. }
  77. if (this.draw_control) {
  78. for (const key in L.Draw.Event) {
  79. const type = L.Draw.Event[key];
  80. this.map.on(type, (e) => {
  81. this.$emit(type, {
  82. ...e,
  83. layer: e.layer ? { ...e.layer, editing: undefined, _events: undefined } : undefined,
  84. target: undefined,
  85. sourceTarget: undefined,
  86. });
  87. });
  88. }
  89. const drawnItems = new L.FeatureGroup();
  90. this.map.addLayer(drawnItems);
  91. const drawControl = new L.Control.Draw({
  92. edit: { featureGroup: drawnItems },
  93. ...this.draw_control,
  94. });
  95. this.map.addControl(drawControl);
  96. }
  97. const connectInterval = setInterval(async () => {
  98. if (window.socket.id === undefined) return;
  99. this.$emit("init", { socket_id: window.socket.id });
  100. clearInterval(connectInterval);
  101. }, 100);
  102. },
  103. methods: {
  104. setCenter(center) {
  105. this.map.panTo(center);
  106. },
  107. setZoom(zoom) {
  108. this.map.setZoom(zoom);
  109. },
  110. add_layer(layer, id) {
  111. const l = L[layer.type](...layer.args);
  112. l.id = id;
  113. l.addTo(this.map);
  114. },
  115. remove_layer(id) {
  116. this.map.eachLayer((layer) => layer.id === id && this.map.removeLayer(layer));
  117. },
  118. clear_layers() {
  119. this.map.eachLayer((layer) => this.map.removeLayer(layer));
  120. },
  121. run_map_method(name, ...args) {
  122. if (name.startsWith(":")) {
  123. name = name.slice(1);
  124. args = args.map((arg) => new Function("return " + arg)());
  125. }
  126. return this.map[name](...args);
  127. },
  128. run_layer_method(id, name, ...args) {
  129. this.map.eachLayer((layer) => {
  130. if (layer.id !== id) return;
  131. if (name.startsWith(":")) {
  132. name = name.slice(1);
  133. args = args.map((arg) => new Function("return " + arg)());
  134. }
  135. return layer[name](...args);
  136. });
  137. },
  138. },
  139. };