hcxx.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <div>
  3. <div class="imgCon">
  4. <div class="echartTitle">
  5. <div class="block-title">监测类型情况</div>
  6. </div>
  7. <div class="imgList">
  8. <div
  9. class="imgDiv"
  10. v-for="(item, i) in monitorList"
  11. :key="i"
  12. @click="clickImg(i)"
  13. @mouseenter="handleMouseEnter(item, i)"
  14. @mouseleave="handleMouseLeave(item, i)"
  15. >
  16. <span>{{ i + 1 }}</span>
  17. <img :src="item.imagerPath" />
  18. <p>{{ item.imagerSj }}</p>
  19. </div>
  20. </div>
  21. </div>
  22. </div>
  23. </template>
  24. <script>
  25. // import { getJctbhcInfo, getTiffPath } from "@/api/ghss/jctb.js";
  26. export default {
  27. props: {
  28. detailObj: {
  29. type: Object,
  30. },
  31. jcbh: {
  32. type: String,
  33. },
  34. },
  35. components: {},
  36. data() {
  37. return {
  38. imgUrl: "",
  39. monitorList: [
  40. {
  41. name: "11swm",
  42. imagerPath:
  43. "/analyse/全域土地整治/jctb/0/HN4602022023022004080074/1b9a9da4a23d426cab363ed369150b4f.jpg",
  44. },
  45. ],
  46. primitive: null,
  47. selectId: null,
  48. primitivesArray: [],
  49. hcObj: null,
  50. // jtArr:[],//箭头id数组
  51. // dwArr:[],//
  52. idArr: [], //id数组
  53. handler: {},
  54. };
  55. },
  56. mounted() {
  57. this.init();
  58. },
  59. methods: {
  60. inputAction() {
  61. this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  62. // 鼠标移动事件
  63. this.handler.setInputAction(function (movement) {
  64. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  65. },
  66. handleMouseEnter(a, b) {
  67. this.ceshi(a.id, "yr");
  68. },
  69. handleMouseLeave(a, b) {
  70. this.ceshi(a.id, "yc");
  71. },
  72. changeData(name, updata) {
  73. this[name] = updata;
  74. },
  75. clickImg(val) {
  76. this.$emit("updateParent", "emitImgList", this.monitorList);
  77. this.$emit("updateParent", "emitImgIndex", val);
  78. },
  79. // 加载图片
  80. ddd(obj) {
  81. // 将经纬度转换为 Cartesian3 坐标,起始点
  82. //起始点
  83. var startPosition = Cesium.Cartesian3.fromDegrees(
  84. Number(obj.imagerLzb),
  85. Number(obj.imagerBzb)
  86. );
  87. let poi = this.getLonAndLat(
  88. Number(obj.imagerLzb),
  89. Number(obj.imagerBzb),
  90. Number(obj.imagerAngle),
  91. 20
  92. );
  93. //结束点
  94. var targetPosition = Cesium.Cartesian3.fromDegrees(poi.lng, poi.lat);
  95. // 创建一个实体来表示点
  96. var pointEntity = viewer.entities.add({
  97. id: "dw" + obj.id,
  98. position: startPosition, // 点的位置
  99. point: {
  100. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 设置为贴地
  101. pixelSize: 10, // 点的大小
  102. color: Cesium.Color.RED, // 点的颜色
  103. outlineColor: Cesium.Color.BLACK, // 点的轮廓颜色
  104. outlineWidth: 2, // 点的轮廓宽度
  105. },
  106. });
  107. // 创建一个实体来放置箭头
  108. var arrowEntity = viewer.entities.add({
  109. id: "jt" + obj.id,
  110. position: startPosition, // 设置箭头位置
  111. billboard: {
  112. // image: "http://192.168.176.1:8001/长箭头.png", // 设置箭头图标
  113. image: "/static/images/路径@3x-2.png", // 设置箭头图标
  114. width: 37, // 设置图标宽度
  115. height: 69, // 设置图标高度
  116. scale: 0.7, // 设置图标缩放
  117. rotation: Cesium.Math.toRadians(360 - Number(obj.imagerAngle)), // 可选,默认为0
  118. // rotation: Number(obj.imagerAngle), // 可选,默认为0
  119. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 设置贴地
  120. },
  121. });
  122. // 聚焦视角到箭头位置
  123. viewer.zoomTo(arrowEntity);
  124. },
  125. ceshi(id, evtName) {
  126. let aaa = viewer.entities.getById("jt" + id);
  127. if (evtName == "yr") {
  128. aaa.billboard.image = "/static/images/路径@3x.png";
  129. } else {
  130. aaa.billboard.image = "/static/images/路径@3x-2.png";
  131. }
  132. },
  133. /**
  134. * 根据一个经纬度及距离角度,算出另外一个经纬度
  135. * @param {*} lng 经度 113.3960698
  136. * @param {*} lat 纬度 22.941386
  137. * @param {*} brng 方位角 45 ---- 正北方:000°或360° 正东方:090° 正南方:180° 正西方:270°
  138. * @param {*} dist 90000距离(米)
  139. * 1、角度转换为弧度公式:弧度=角度×(π ÷度180 )
  140. * 2、弧度转换为角度公式: 角度=弧度×(180÷π)
  141. */
  142. getLonAndLat(lng, lat, brng, dist) {
  143. //大地坐标系资料WGS-84 长半径a=6378137 短半径b=6356752.3142 扁率f=1/298.2572236
  144. var a = 6378137;
  145. var b = 6356752.3142;
  146. var f = 1 / 298.257223563;
  147. var lon1 = lng * 1;
  148. var lat1 = lat * 1;
  149. var s = dist;
  150. var alpha1 = brng * (Math.PI / 180); //mapNumberUtil.rad(brng);
  151. var sinAlpha1 = Math.sin(alpha1);
  152. var cosAlpha1 = Math.cos(alpha1);
  153. //var tanU1 = (1 - f) * Math.tan(mapNumberUtil.rad(lat1));
  154. var tanU1 = (1 - f) * Math.tan(lat1 * (Math.PI / 180));
  155. var cosU1 = 1 / Math.sqrt(1 + tanU1 * tanU1),
  156. sinU1 = tanU1 * cosU1;
  157. var sigma1 = Math.atan2(tanU1, cosAlpha1);
  158. var sinAlpha = cosU1 * sinAlpha1;
  159. var cosSqAlpha = 1 - sinAlpha * sinAlpha;
  160. var uSq = (cosSqAlpha * (a * a - b * b)) / (b * b);
  161. var A =
  162. 1 + (uSq / 16384) * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
  163. var B = (uSq / 1024) * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
  164. var sigma = s / (b * A),
  165. sigmaP = 2 * Math.PI;
  166. while (Math.abs(sigma - sigmaP) > 1e-12) {
  167. var cos2SigmaM = Math.cos(2 * sigma1 + sigma);
  168. var sinSigma = Math.sin(sigma);
  169. var cosSigma = Math.cos(sigma);
  170. var deltaSigma =
  171. B *
  172. sinSigma *
  173. (cos2SigmaM +
  174. (B / 4) *
  175. (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -
  176. (B / 6) *
  177. cos2SigmaM *
  178. (-3 + 4 * sinSigma * sinSigma) *
  179. (-3 + 4 * cos2SigmaM * cos2SigmaM)));
  180. sigmaP = sigma;
  181. sigma = s / (b * A) + deltaSigma;
  182. }
  183. var tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;
  184. var lat2 = Math.atan2(
  185. sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,
  186. (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp)
  187. );
  188. var lambda = Math.atan2(
  189. sinSigma * sinAlpha1,
  190. cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1
  191. );
  192. var C = (f / 16) * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
  193. var L =
  194. lambda -
  195. (1 - C) *
  196. f *
  197. sinAlpha *
  198. (sigma +
  199. C *
  200. sinSigma *
  201. (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
  202. var revAz = Math.atan2(sinAlpha, -tmp); // final bearing
  203. var lngLatObj = {
  204. lng: lon1 + L * (180 / Math.PI),
  205. lat: lat2 * (180 / Math.PI),
  206. };
  207. return lngLatObj;
  208. },
  209. delatePoi(type) {
  210. if (this.idArr.length != 0) {
  211. this.idArr.forEach((item) => {
  212. viewer.entities.removeById(type + item);
  213. });
  214. // this.idArr = [];
  215. }
  216. },
  217. init() {
  218. // getJctbhcInfo(newVal).then((res) => {
  219. this.idArr = [];
  220. // if (res.code == 200) {
  221. // this.monitorList = res.data.images;
  222. // this.hcObj = res.data;
  223. this.monitorList.forEach((item, i) => {
  224. // item.name = res.data.dcry;
  225. // window.axiosURI +/file/upload/attachment
  226. item.imagerPath =
  227. "http://192.168.60.2:8080/file/upload/attachment" + item.imagerPath;
  228. // this.ddd(item);
  229. this.idArr.push(item.id);
  230. });
  231. // }
  232. // });
  233. },
  234. },
  235. watch: {
  236. jcbh: {
  237. handler(newVal, oldVal) {},
  238. // deep: true,
  239. // immediate: true,
  240. },
  241. },
  242. beforeDestroy() {
  243. this.delatePoi("jt");
  244. this.delatePoi("dw");
  245. },
  246. };
  247. </script>
  248. <style lang="scss" scoped>
  249. .imgCon {
  250. .imgList {
  251. width: 100%;
  252. // height: 300px;
  253. max-height: 400px;
  254. display: flex;
  255. flex-wrap: wrap;
  256. // background-color: rgba(255, 192, 203, 0.372);
  257. .imgDiv {
  258. width: 126px;
  259. height: 83px;
  260. margin-right: 10px;
  261. // background-color: rgba(0, 255, 255, 0.413);
  262. position: relative;
  263. margin: 4px 4px;
  264. img {
  265. width: 126px;
  266. height: 83px;
  267. }
  268. span {
  269. width: 26px;
  270. height: 26px;
  271. display: inline-block;
  272. position: absolute;
  273. top: 0;
  274. left: 0;
  275. background: #dbad70;
  276. text-align: center;
  277. line-height: 26px;
  278. }
  279. p {
  280. position: absolute;
  281. bottom: 0;
  282. font-size: 10px;
  283. color: #33ccff;
  284. text-align: center;
  285. width: 100%;
  286. height: 30px;
  287. line-height: 30px;
  288. }
  289. }
  290. }
  291. }
  292. </style>