pc4Helper.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { ScenePoint, getPointPano } from "@/store/scene";
  2. import JSZip from "jszip";
  3. import saveAs from "@/util/file-serve";
  4. import { openLoading, closeLoading } from "@/helper/loading";
  5. import { dateFormat } from "@/util";
  6. import { ElMessage } from "element-plus";
  7. import {
  8. downloadPointsXLSL,
  9. downloadPointsXLSL1,
  10. downloadPointsXLSL2,
  11. } from "@/util/pc4xlsl";
  12. import { noValidPoint } from "./install";
  13. import { PointTypeEnum } from "@/lib/board/4dmap";
  14. export const exportFile = async (
  15. points: ScenePoint[],
  16. type: number,
  17. name: string = "",
  18. version = "v1"
  19. ) => {
  20. if (!points.length) {
  21. ElMessage.error("请选择要导出的点位");
  22. return;
  23. }
  24. name = name ? name + "-" : "";
  25. points = points.filter((point) => !noValidPoint(point));
  26. if (points.length === 0) {
  27. ElMessage.error("当前选择点位没有gis信息");
  28. return;
  29. }
  30. if (type === 1) {
  31. await downloadPointsXLSL1(
  32. points.map((point) => point.pos),
  33. points.map((point) => ({
  34. title: point.name,
  35. desc: point.remark || "无",
  36. type: point.type || PointTypeEnum.other,
  37. })),
  38. name + "绘制矢量数据"
  39. );
  40. } else if (type === 2) {
  41. await downloadPointsXLSL2(
  42. points.map((point) => point.pos),
  43. points.map((point) => ({
  44. title: point.name,
  45. desc: point.remark || "无",
  46. type: point.type || PointTypeEnum.other,
  47. })),
  48. name + "本体边界坐标",
  49. version
  50. );
  51. } else {
  52. await downloadPointsXLSL(
  53. points.map((point) => point.pos),
  54. points.map((point) => ({ title: point.name, desc: point.name })),
  55. "test"
  56. );
  57. }
  58. ElMessage.success("文件导出成功");
  59. };
  60. export const exportImage = async (points: ScenePoint[], name?: string) => {
  61. if (!points.length) {
  62. ElMessage.error("请选择要导出的点位");
  63. return;
  64. }
  65. openLoading();
  66. const zip = new JSZip();
  67. const imgFolder = zip.folder(name || "images")!;
  68. const downloadImages = Promise.all(
  69. points.map((point) => {
  70. const url = getPointPano(point);
  71. return fetch(url as string)
  72. .then((res) => res.blob())
  73. .then((blob) => {
  74. imgFolder.file(`${point.sceneCode}-${point.uuid}.jpg`, blob);
  75. })
  76. .catch((e) => {
  77. ElMessage.error(url + "图片下载失败!");
  78. throw e;
  79. });
  80. })
  81. );
  82. await downloadImages;
  83. const content = await zip.generateAsync({ type: "blob" });
  84. await saveAs(content, `${name || "images"}.zip`);
  85. closeLoading();
  86. };
  87. export const exposeExsl = async (pointsGroup: ScenePoint[][]) => {
  88. const timeStr = dateFormat(new Date(), "yyyy-MM-ddThh:mm:ssZ");
  89. const rets: string[] = pointsGroup.map((points, i) => {
  90. const name = `Rt${(i + 1).toString().padStart(4, "0")}`;
  91. const rtepts = points.map((point, j) => {
  92. return `
  93. <rtept lat="${point.pos[1]}" lon="${point.pos[0]}">
  94. <ele>${point.pos[2]}</ele>
  95. <time>${timeStr}</time>
  96. <name>${name}_pt${(j + 1).toString().padStart(4, "0")}</name>
  97. </rtept>
  98. `;
  99. });
  100. return `
  101. <rte>
  102. <name>${name}</name>
  103. ${rtepts.join("")}
  104. </rte>
  105. `;
  106. });
  107. for (let i = 0; i < rets.length; i++) {
  108. const name = `Rt${(i + 1).toString().padStart(4, "0")}`;
  109. const text = `\
  110. <?xml version="1.0" encoding="UTF-8" ?>
  111. <gpx version="1.1" creator="BHCNAV" xmlns="http://www.topografix.com/GPX/1/1">
  112. ${rets[i]}
  113. </gpx>
  114. `;
  115. await saveAs(new Blob([text], { type: "text/plain" }), `${name}.gpx`);
  116. }
  117. };