Cesium 图片标注

20 篇文章 0 订阅

  功能介绍:
1、在三维场景截一张图,获取一些参数,然后存到数据库。
2、给一张三维场景的截图和一个经纬度坐标,把坐标标注到图片对应位置上。
下面是功能2的代码。

<template>
  <div id="idviewSaveContainer" style="position: relative;" :style="{width:'100%',height:'auto'}">
    <img width="100%" height="auto" :src="srcImg" alt @load="loadImage" />
  </div>
</template>
<script>
import person from "./person";
export default {
  props: {
    fontSize: {
      //人名称字体大小
      type: Number,
      default: 14
    }
  },
  data() {
    return {
      srcImg: "", //图片源
      imgData: null, //截图数据
      personsData: null, //人数据
      doms: []
    };
  },
  computed: {
    person_fontSize() {
      return this.fontSize;
    }
  },
  name: "ty-tagpic",
  mounted() {
    if (!window) {
      return;
    }
    window.onresize = () => {
      this.removePersons();
      this.addPosons(this.personsData, this.imgData);
    };
  },
  methods: {
    loadImage() {
      this.removePersons();
      this.addPosons(this.personsData, this.imgData);
    },
    // 加载数据
    // personsData 人员信息数组
    // imgData  截图相关的信息
    loadData(personsData, imgData) {
      console.log("======ty-tagpic=======personsData:", personsData);
      console.log("======ty-tagpic=======imgData:", imgData);
      this.imgData = imgData;
      this.personsData = personsData;
      this.addPic(imgData.imgdata);
      // this.addPosons(personsData, imgData);
    },
    // 加载截图
    addPic(imgdata) {
      if (!this.checkImg(imgdata)) {
        return;
      }
      this.srcImg = imgdata;
    },
    // 添加人员标注
    addPosons(persons, imgData) {
      if (!this.checkPersons(persons, imgData)) {
        return;
      }
      let el = document.querySelector("#idviewSaveContainer");
      let imgelStyle = getComputedStyle(el);
      if (!imgelStyle || imgelStyle.width.indexOf("%") > -1) {
        console.log("======ty-tagpic=======", "无法获取图片容器宽高!");
        return;
      }
      let elWidth = parseInt(imgelStyle.width.split("px")[0], 10);
      let elHeight = parseInt(imgelStyle.height.split("px")[0], 10);
      persons.forEach(onePerson => {
        let node = this.addOnePerson(onePerson, imgData, elWidth, elHeight);
        node && this.doms.push(node);
      });
    },
    checkImg(imgdata) {
      if (!imgdata || !imgdata.length || imgdata.length < 10) {
        console.log("imgData:", imgdata);
        console.log("======ty-tagpic=======", "图片路径不对");
        return false;
      }
      return true;
    },
    checkPersons(persons, imgObject) {
      let onePerson = persons[0];
      if (!Array.isArray(persons) || persons.length < 1) {
        console.log("======ty-tagpic=======", "没有人!");
        return false;
      }
      let jd = onePerson.jd;
      if (!(jd > 50 && jd < 150)) {
        console.log("======ty-tagpic=======", "经纬度格式或范围不对");
        return false;
      }
      let wd = onePerson.wd;
      if (!(wd > 10 && wd < 70)) {
        console.log("======ty-tagpic=======", "经纬度格式或范围不对");
        return false;
      }
      let name = onePerson.name;
      let floor = onePerson.floor;
      // 图片对应的围栏的经纬度
      let minX = imgObject.wgs84_minx;
      let minY = imgObject.wgs84_miny;
      let maxX = imgObject.wgs84_maxx;
      let maxY = imgObject.wgs84_maxy;
      if (
        !(minX > 50 && minX < 150) ||
        !(minY > 10 && minY < 70) ||
        !(maxX > 50 && maxX < 150) ||
        !(maxY > 10 && maxY < 70)
      ) {
        console.log("======ty-tagpic=======", "经纬度格式或范围不对");
        return false;
      }
      if (
        !(imgObject.win_minx > 0 && imgObject.win_minx < 10000) ||
        !(imgObject.win_maxx > 0 && imgObject.win_maxx < 10000) ||
        !(imgObject.win_miny > 0 && imgObject.win_miny < 10000) ||
        !(imgObject.win_maxy > 0 && imgObject.win_maxy < 10000)
      ) {
        console.log("======ty-tagpic=======", "屏幕坐标格式或范围不对");
        return false;
      }
      return true;
    },
    // 往图片上标注一个人
    // onePerson 一个人的信息
    // imgObject 截图信息
    // imgWidth  图片所在容器宽度
    // imgHeght  图片所在容器高度
    addOnePerson(onePerson, imgObject, imgWidth = 500, imgHeght = 400) {
      //   wgs84_minx; //围栏地理坐标(双精度,至少7位小数)
      //   wgs84_miny; //围栏地理坐标(双精度,至少7位小数)
      //   wgs84_maxx; //围栏地理坐标(双精度,至少7位小数)
      //   wgs84_maxy; //围栏地理坐标(双精度,至少7位小数)
      //   win_minx; //围栏屏幕坐标(整型)
      //   win_miny; //围栏屏幕坐标(整型)
      //   win_maxx; //围栏屏幕坐标(整型)
      //   win_maxy; //围栏屏幕坐标(整型)
      //   imgdata; //图片base64编码数据(TEXT类型)
      //   scene_width; //截图时的场景宽度(整型,4位)
      //   scene_height; //截图时的场景高度(整型,4位)
      //   floor;//电子围栏对应的楼层(这个用于人判断是否在围栏内)
      let jd = onePerson.jd;
      let wd = onePerson.wd;
      let name = onePerson.name;
      let floor = onePerson.floor;
      // 图片对应的围栏的经纬度
      let minX = imgObject.wgs84_minx;
      let minY = imgObject.wgs84_miny;
      let maxX = imgObject.wgs84_maxx;
      let maxY = imgObject.wgs84_maxy;
      let stepX = maxX - minX; //经度差值
      let stepY = maxY - minY; //纬度差值
      let stepXWIN = imgObject.win_maxx - imgObject.win_minx; //屏幕坐标横坐标差值
      let setpYWIN = imgObject.win_maxy - imgObject.win_miny; //屏幕坐标纵坐标差值
      let winX = imgObject.win_minx + ((jd - minX) * stepXWIN) / stepX; //人在截图对应的三维场景中的屏幕坐标-横坐标
      let winY = imgObject.win_miny + ((maxY - wd) * setpYWIN) / stepY; //人在截图对应的三维场景中的屏幕坐标-纵坐标
      let cesiumViewCanvasHeight = imgObject.scene_height; //三维场景的高度
      let cesiumViewCanvasWidth = imgObject.scene_width; //三维场景的宽度
      let xPie = (winX / cesiumViewCanvasWidth) * imgWidth; //人在图片中的横坐标
      let yPie = (winY / cesiumViewCanvasHeight) * imgHeght; //人在图片中的纵坐标
      if (
        !xPie ||
        !yPie ||
        isNaN(xPie) ||
        isNaN(yPie) ||
        xPie < 0 ||
        yPie < 0 ||
        xPie > imgWidth ||
        yPie > imgHeght
      ) {
        console.log(xPie);
        console.log(yPie);
        console.log("======ty-tagpic=======", "经过计算,人不在图片范围内,因此无法展示,请检查人的坐标是否正确!");
        return null;
      }
      // 创建人DIV容器
      var node = person.createNode(
        "div",
        "wl_xq",
        document.getElementById("idviewSaveContainer")
      );
      node.style.width = this.computeSize(100, this.person_fontSize) + `px`;
      node.style.height = this.computeSize(90, this.person_fontSize) + `px`;
      node.style.position = "absolute";
      node.style.left = `${Math.floor(xPie) -
        this.computeSize(50, this.person_fontSize)}px`;
      node.style.top = `${Math.floor(yPie) -
        this.computeSize(100, this.person_fontSize)}px`;
      node.style.textAlign = "center";

      // 创建人的名字标签span,带背景图片
      var nodeLabel = person.createNode("span", "wl_xq", node);
      nodeLabel.style.width = this.computeSize(81, this.person_fontSize) + `px`;
      nodeLabel.style.height =
        this.computeSize(30, this.person_fontSize) + `px`;
      nodeLabel.style.lineHeight =
        this.computeSize(30, this.person_fontSize) + `px`;
      nodeLabel.style.display = "inline-block";
      nodeLabel.style.fontSize = this.person_fontSize + "px";
      nodeLabel.innerHTML = name;
      nodeLabel.style.color = "#E2F5FD";
      nodeLabel.style.fontWeight = "500";
      nodeLabel.style.fontFamily = "PingFangSC-Medium, PingFang SC";
      let personBackgroundIMG = require("./person/bg0.png");
      nodeLabel.style.background =
        "url(" + personBackgroundIMG + ") no-repeat ";
      nodeLabel.style.backgroundSize = "100% 100%";
      nodeLabel.style.textAlign = "center";

      //创建人的标注img
      var nodeBill = person.createNode("img", "wl_xq", node);
      nodeBill.style.width = this.computeSize(40, this.person_fontSize) + `px`;
      nodeBill.style.height = this.computeSize(63, this.person_fontSize) + `px`;
      nodeBill.src = require("./person/ry_a_n.png");
      nodeBill.style.textClign = "center";
      return node;
    },
    // 计算人员各部分元素的像素大小,baseSize对应14文字像素,fontSize变大,则其他元素随着同比例变大。
    computeSize(baseSize, fontSize) {
      return Math.floor((baseSize / 14) * fontSize);
    },
    removePersons() {
      for (let index = 0; index < this.doms.length; index++) {
        const element = this.doms[index];
        person.remove(element);
      }
      this.doms = [];
    },
    resetPos() {}
  }
};
</script>
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹果园dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值