pc4Helper.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 { downloadPointsXLSL } from "@/util/pc4xlsl";
  8. export const exportFile = async (points: ScenePoint[]) => {
  9. if (!points.length) {
  10. ElMessage.error("请选择要导出的点位");
  11. return;
  12. }
  13. points = points.filter((point) => !!point.pos);
  14. if (points.length === 0) {
  15. ElMessage.error("当前选择点位没有gis信息");
  16. return;
  17. }
  18. await downloadPointsXLSL(
  19. points.map((point) => point.pos),
  20. points.map((point) => ({ title: point.name, desc: point.name })),
  21. "test"
  22. );
  23. ElMessage.success("文件导出成功");
  24. };
  25. export const exportImage = async (points: ScenePoint[]) => {
  26. openLoading();
  27. if (!points.length) {
  28. ElMessage.error("请选择要导出的点位");
  29. return;
  30. }
  31. const zip = new JSZip();
  32. const imgFolder = zip.folder("images")!;
  33. const downloadImages = Promise.all(
  34. points.map((point) => {
  35. const url = getPointPano(point.sceneCode, point.uuid);
  36. return fetch(url as string)
  37. .then((res) => res.blob())
  38. .then((blob) => {
  39. imgFolder.file(`${point.sceneCode}-${point.uuid}.jpg`, blob);
  40. })
  41. .catch((e) => {
  42. ElMessage.error(url + "图片下载失败!");
  43. throw e;
  44. });
  45. })
  46. );
  47. await downloadImages;
  48. const content = await zip.generateAsync({ type: "blob" });
  49. await saveAs(content, "images.zip");
  50. closeLoading();
  51. };
  52. export const exposeExsl = async (pointsGroup: ScenePoint[][]) => {
  53. const timeStr = dateFormat(new Date(), "yyyy-MM-ddThh:mm:ssZ");
  54. const rets: string[] = pointsGroup.map((points, i) => {
  55. const name = `Rt${(i + 1).toString().padStart(4, "0")}`;
  56. const rtepts = points.map((point, j) => {
  57. return `
  58. <rtept lat="${point.pos[1]}" lon="${point.pos[0]}">
  59. <ele>${point.pos[2]}</ele>
  60. <time>${timeStr}</time>
  61. <name>${name}_pt${(j + 1).toString().padStart(4, "0")}</name>
  62. </rtept>
  63. `;
  64. });
  65. return `
  66. <rte>
  67. <name>${name}</name>
  68. ${rtepts.join("")}
  69. </rte>
  70. `;
  71. });
  72. for (let i = 0; i < rets.length; i++) {
  73. const name = `Rt${(i + 1).toString().padStart(4, "0")}`;
  74. const text = `\
  75. <?xml version="1.0" encoding="UTF-8" ?>
  76. <gpx version="1.1" creator="BHCNAV" xmlns="http://www.topografix.com/GPX/1/1">
  77. ${rets[i]}
  78. </gpx>
  79. `;
  80. await saveAs(new Blob([text], { type: "text/plain" }), `${name}.gpx`);
  81. }
  82. };