install.ts 2.8 KB

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