leaflet.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { loadResource } from "../../static/utils/resources.js";
  2. export default {
  3. template: "<div></div>",
  4. props: {
  5. map_options: Object,
  6. resource_path: String,
  7. },
  8. async mounted() {
  9. await this.$nextTick(); // NOTE: wait for window.path_prefix to be set
  10. await Promise.all([
  11. loadResource(window.path_prefix + `${this.resource_path}/leaflet/leaflet.css`),
  12. loadResource(window.path_prefix + `${this.resource_path}/leaflet/leaflet.js`),
  13. ]);
  14. if (this.map_options.drawControl) {
  15. await Promise.all([
  16. loadResource(window.path_prefix + `${this.resource_path}/leaflet-draw/leaflet.draw.css`),
  17. loadResource(window.path_prefix + `${this.resource_path}/leaflet-draw/leaflet.draw.js`),
  18. ]);
  19. }
  20. this.map = L.map(this.$el, this.map_options);
  21. for (const type of [
  22. "baselayerchange",
  23. "overlayadd",
  24. "overlayremove",
  25. "layeradd",
  26. "layerremove",
  27. "zoomlevelschange",
  28. "resize",
  29. "unload",
  30. "viewreset",
  31. "load",
  32. "zoomstart",
  33. "movestart",
  34. "zoom",
  35. "move",
  36. "zoomend",
  37. "moveend",
  38. "popupopen",
  39. "popupclose",
  40. "autopanstart",
  41. "tooltipopen",
  42. "tooltipclose",
  43. "locationerror",
  44. "locationfound",
  45. "click",
  46. "dblclick",
  47. "mousedown",
  48. "mouseup",
  49. "mouseover",
  50. "mouseout",
  51. "mousemove",
  52. "contextmenu",
  53. "keypress",
  54. "keydown",
  55. "keyup",
  56. "preclick",
  57. "zoomanim",
  58. ]) {
  59. this.map.on(type, (e) => {
  60. this.$emit(`map-${type}`, {
  61. ...e,
  62. originalEvent: undefined,
  63. target: undefined,
  64. sourceTarget: undefined,
  65. location: [e.target.getCenter().lat, e.target.getCenter().lng],
  66. zoom: e.target.getZoom(),
  67. });
  68. });
  69. }
  70. if (this.map_options.drawControl) {
  71. for (const key in L.Draw.Event) {
  72. const type = L.Draw.Event[key];
  73. this.map.on(type, (e) => {
  74. this.$emit(type, {
  75. ...e,
  76. layer: e.layer ? { ...e.layer, editing: undefined, _events: undefined } : undefined,
  77. target: undefined,
  78. sourceTarget: undefined,
  79. });
  80. });
  81. }
  82. }
  83. if (this.map_options.drawControl) {
  84. var drawnItems = new L.FeatureGroup();
  85. this.map.addLayer(drawnItems);
  86. }
  87. const connectInterval = setInterval(async () => {
  88. if (window.socket.id === undefined) return;
  89. this.$emit("init", { socket_id: window.socket.id });
  90. clearInterval(connectInterval);
  91. }, 100);
  92. },
  93. updated() {
  94. this.map.setView(L.latLng(this.map_options.center.lat, this.map_options.center.lng), this.map_options.zoom);
  95. },
  96. methods: {
  97. add_layer(layer) {
  98. L[layer.type](...layer.args).addTo(this.map);
  99. },
  100. },
  101. };