install.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { TileType, createMap } from "./openlayer";
  2. import { computed, ref, watch, watchEffect } from "vue";
  3. import { createBoard } from "drawing-board";
  4. import { Scene, ScenePoint, boardData, relicsId, scenes } from "@/store/scene";
  5. import { router } from "@/router";
  6. import { addOrUpdateDrawingFetch } from "@/request/drawing";
  7. // ---------map---------
  8. export const tileOptions: TileType[] = ["影像底图", "矢量底图"];
  9. export const tileType = ref<TileType>(tileOptions[0]);
  10. export const defaultCenter = [116.412611, 39.908866];
  11. export const mapManage = createMap();
  12. mapManage.setCenter(defaultCenter);
  13. watchEffect(() => mapManage.setTileType(tileType.value));
  14. export const noValidPoint = (pos: ScenePoint) =>
  15. !pos?.pos || pos.pos.length === 0 || pos.pos.some((i) => !i);
  16. export const validScene = (scene: Scene) => !scene.scenePos.every(noValidPoint);
  17. export const flyScene = (scene: Scene) => {
  18. const totalPos = [0, 0];
  19. let numCalc = 0;
  20. for (let i = 0; i < scene.scenePos.length; i++) {
  21. const coord = scene.scenePos[i].pos as number[];
  22. if (!noValidPoint(scene.scenePos[i])) {
  23. totalPos[0] += coord[0];
  24. totalPos[1] += coord[1];
  25. numCalc++;
  26. }
  27. }
  28. console.log(scene);
  29. totalPos[0] /= numCalc;
  30. totalPos[1] /= numCalc;
  31. mapManage.map.getView().setCenter(totalPos);
  32. };
  33. export const gotoPointPage = (point: ScenePoint) => {
  34. router.push({
  35. name: queryMode.value ? "query-pano" : "pano",
  36. params: { pid: point.id },
  37. });
  38. };
  39. export const autoInitPos = () => {
  40. const scene = scenes.value.find(validScene);
  41. if (scene) {
  42. flyScene(scene);
  43. return true;
  44. } else {
  45. return false;
  46. }
  47. };
  48. watch(
  49. () => scenes.value.find(validScene)?.sceneCode,
  50. (code) => {
  51. code && autoInitPos();
  52. },
  53. { immediate: true }
  54. );
  55. // -------board------
  56. export const board = createBoard({ map: mapManage.map });
  57. watch(
  58. boardData,
  59. (data) => {
  60. data && board.setData(data);
  61. },
  62. {
  63. immediate: true,
  64. flush: "pre",
  65. }
  66. );
  67. export const boardDataChange = (dataChange?: () => void) => {
  68. dataChange && dataChange();
  69. return addOrUpdateDrawingFetch({
  70. relicsId: relicsId.value.toString(),
  71. data: boardData.value,
  72. });
  73. };
  74. watch(
  75. tileType,
  76. (type) => {
  77. if (type === "影像底图") {
  78. board.scale.setColor("#fff");
  79. } else {
  80. board.scale.setColor("#000");
  81. }
  82. },
  83. { flush: "post", immediate: true }
  84. );
  85. // -----------status----------
  86. export const queryMode = computed(
  87. () =>
  88. router.currentRoute.value.name &&
  89. router.currentRoute.value.name.toString().includes("query")
  90. );