clickQuery.vue 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  1. <template>
  2. <div class="sm-panel sm-function-module-query" v-show="PoinyQueryShow && vectorShow" v-drag>
  3. <div class="sm-panel-header">
  4. <span>{{ Resource.PoinyQuery }}</span>
  5. <span class="closeBtn" @click="toggleVisibility">&times;</span>
  6. </div>
  7. <!-- <div class="sm-function-module-content-btn"> -->
  8. <div class="btnList">
  9. <span v-for="(item, index) in actionOptions" :key="index" class="icon-span" :title="item.lable"
  10. :class="item.isSelect ? 'selected-icon' : ''" @click="changleQueryItem(item)">
  11. <i class="iconfont iconSize" :class="item.iconName" style="margin-top: 0px"></i>
  12. </span>
  13. <!-- <el-button type="primary" size="small" @click.stop="mapLayerQuery"
  14. >点击</el-button
  15. >
  16. <el-button type="primary" size="small" @click.stop="removeMapLayerQuery"
  17. >清除</el-button
  18. > -->
  19. </div>
  20. <div class="sm-function-module-content-tabs">
  21. <el-tabs @tab-click="handleTabClick" v-model="activeLayerId">
  22. <el-tab-pane :label="item.label" :name="item.id" v-for="(item, index) in layerList" :key="index"></el-tab-pane>
  23. </el-tabs>
  24. </div>
  25. <div class="sm-function-module-content-table">
  26. <el-collapse :value="activeNames" @change="handleCollapseChange" v-if="
  27. activeLayerId &&
  28. queryResults[activeLayerId] &&
  29. queryResults[activeLayerId].length > 0
  30. ">
  31. <el-collapse-item :title="'查询结果' + (index + 1)" :name="'查询结果' + (index + 1)"
  32. v-for="(item, index) in queryResults[activeLayerId]" :key="index">
  33. <template slot="title">
  34. 查询结果{{ index + 1
  35. }}<i title="定位" class="header-icon el-icon-s-promotion flyBtn2" @click.stop="flyTo(index)"></i>
  36. </template>
  37. <el-table :data="item" :show-header="false" border style="width: 100%" :header-cell-style="{
  38. background: 'rgba(10, 25, 38, 0.6)',
  39. color: '#66b1ff',
  40. fontSize: '14px',
  41. fontFamily: 'Microsoft YaHei',
  42. fontWeight: '400',
  43. }">
  44. <el-table-column prop="name" label="字段" width="100">
  45. </el-table-column>
  46. <el-table-column prop="value" label="值" width="208">
  47. </el-table-column>
  48. </el-table>
  49. </el-collapse-item>
  50. </el-collapse>
  51. </div>
  52. <!-- <CockpitVector v-if="store.state.vectorData.length > 0"></CockpitVector> -->
  53. <MultiLevelQuery ref="MultiLevelQuery" />
  54. </div>
  55. </template>
  56. <script>
  57. import axios from "axios";
  58. import { GetGDlnfo, GetXzqhTree, GetHouseInfo } from "../../../api/map";
  59. import { keys } from "lodash";
  60. import { handModel, handnew, clearTranslate, keyName } from "./modelLayering";
  61. import CockpitVector from "./CockpitVector.vue";
  62. import MultiLevelQuery from "./MultiLevelQuery.vue";
  63. import {
  64. loadGeoJSON,
  65. removeGeoJSON,
  66. str2Unicode,
  67. bbox,
  68. } from "@/utils/MapHelper/help.js";
  69. import * as pick_cockpit_vector from "./pick_cockpit_vector.js";
  70. import * as tdsy from "@/views/cockpit/js/tdsy";
  71. import * as turf from "@turf/turf";
  72. import {
  73. calcIserverURI,
  74. getfieldList,
  75. cartesianToCartographic84,
  76. superQuery,
  77. mapQuery,
  78. cartesian3ToWGS84,
  79. addGeomParts,
  80. addGeom,
  81. } from "@/utils/MapHelper/clickQuery.js";
  82. // import { cartesian3ToWGS84 } from "@/utils/MapHelper/MapHelper.js";
  83. let gwtype;
  84. let query_click = null;
  85. let manager_layer_png = null;
  86. let dataSourceLayer = null;
  87. export default {
  88. name: "clickQuery",
  89. components: { CockpitVector, MultiLevelQuery },
  90. data() {
  91. return {
  92. inited: false,
  93. activeLayerName: "",
  94. columns: [
  95. {
  96. title: "字段",
  97. key: "name",
  98. },
  99. {
  100. title: "值",
  101. key: "value",
  102. },
  103. ],
  104. layersDataUrl: window.layersDataUrl,
  105. layersData: [],
  106. layerList: [],
  107. loading: false,
  108. handler: {},
  109. activeNames: "查询结果1",
  110. activeLayerId: "",
  111. queryResults: {},
  112. queryResultsGeom: {},
  113. queryResultsGeomPart: {},
  114. viewer: null,
  115. // dataSourceLayer: null,
  116. actionOptions: [
  117. {
  118. index: 1,
  119. lable: "图层",
  120. iconName: "el-icon-tickets",
  121. isSelect: false,
  122. },
  123. {
  124. index: 6,
  125. lable: "框选",
  126. iconName: "el-icon-edit-outline",
  127. isSelect: false,
  128. },
  129. {
  130. index: 2,
  131. lable: "模型",
  132. iconName: "el-icon-office-building",
  133. isSelect: false,
  134. },
  135. // {
  136. // index: 4,
  137. // lable: "矢量",
  138. // iconName: "el-icon-picture",
  139. // isSelect: false,
  140. // },
  141. {
  142. index: 5,
  143. lable: "联级查询",
  144. iconName: "el-icon-c-scale-to-original",
  145. isSelect: false,
  146. },
  147. {
  148. index: 3,
  149. lable: "清除",
  150. iconName: "el-icon-delete",
  151. isSelect: false,
  152. },
  153. ],
  154. };
  155. },
  156. computed: {
  157. PoinyQueryShow: function () {
  158. return store.state.toolBar[9];
  159. },
  160. vectorShow: function () {
  161. return store.state.cockpit_vector.title ||
  162. store.state.cockpit_vector.goitem
  163. ? !store.state.viewer_flag
  164. : true;
  165. },
  166. },
  167. created() { },
  168. watch: {
  169. activeLayerId(val) {
  170. if (val && val != "0") {
  171. for (let i = 0; i < store.state.vectorlayerlist.length; i++) {
  172. let obj = store.state.vectorlayerlist[i];
  173. if (obj.id == val) {
  174. if (obj.serverType == "geoserver") {
  175. removeGeoJSON("geoserver");
  176. this.addGeoJson("#0000ff");
  177. } else {
  178. this.addGeometrys(obj.type == "S3M");
  179. }
  180. break;
  181. }
  182. }
  183. }
  184. },
  185. PoinyQueryShow(val) {
  186. if (!this.inited) {
  187. this.inited = !this.inited;
  188. viewer.entities.removeAll();
  189. this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  190. dataSourceLayer = new Cesium.CustomDataSource("query");
  191. viewer.dataSources.add(dataSourceLayer);
  192. }
  193. },
  194. },
  195. mounted() {
  196. console.log(str2Unicode(`fid_城镇`));
  197. this.$nextTick((res) => {
  198. query_click = new Cesium.CustomDataSource("query_click");
  199. viewer.dataSources.add(query_click);
  200. manager_layer_png = new Cesium.CustomDataSource("manager_layer_png");
  201. viewer.dataSources.add(manager_layer_png);
  202. });
  203. },
  204. methods: {
  205. isArray2D(arr) {
  206. // 首先检查arr是否是数组
  207. if (!Array.isArray(arr)) {
  208. return false;
  209. }
  210. // 检查数组中的每个元素是否也是数组
  211. for (let i = 0; i < arr.length; i++) {
  212. if (!Array.isArray(arr[i])) {
  213. return false;
  214. }
  215. }
  216. // 如果所有元素都是数组,那么arr是二维数组
  217. return true;
  218. },
  219. toggleVisibility() {
  220. this.removeMapLayerQuery();
  221. this.remove_query_click();
  222. removeGeoJSON("geoserver");
  223. store.setToolBarAction(9);
  224. tdsy.remove(false);
  225. },
  226. addGeometrys(fill) {
  227. viewer.entities.removeAll();
  228. dataSourceLayer.entities.removeAll();
  229. let geoms = this.queryResultsGeom[this.activeLayerId];
  230. let parts = this.queryResultsGeomPart[this.activeLayerId];
  231. addGeomParts(fill, geoms, parts);
  232. },
  233. flyTo(index) {
  234. let geoms = this.queryResultsGeom[this.activeLayerId];
  235. let cur = geoms[index];
  236. if (cur) {
  237. if (cur.type) {
  238. removeGeoJSON("geoserver");
  239. loadGeoJSON(
  240. cur,
  241. "#ff0000",
  242. { isfly: true, fill_a: 0.6, sw: 5 },
  243. (data) => (data.name = "geoserver")
  244. );
  245. } else {
  246. this.flyToSuperMap(cur, index);
  247. }
  248. } else {
  249. this.$message({
  250. message: "空间范围为空!",
  251. type: "warning",
  252. });
  253. }
  254. },
  255. addGeoJson() {
  256. let geoms = this.queryResultsGeom[this.activeLayerId];
  257. geoms.forEach((geom) => {
  258. loadGeoJSON(
  259. geom,
  260. "#0000ff",
  261. { fill_a: 0.6, sw: 5 },
  262. (data) => (data.name = "geoserver")
  263. );
  264. });
  265. },
  266. removeGeoJSON() {
  267. // viewer.entities.removeAll();
  268. // viewer.dataSources._dataSources.forEach((das) => {
  269. // if (das.name == "geoserver") viewer.dataSources.remove(das);
  270. // });
  271. },
  272. flyToSuperMap(cur, index) {
  273. dataSourceLayer.entities.removeAll();
  274. let parts = this.queryResultsGeomPart[this.activeLayerId];
  275. let part = parts[index];
  276. addGeom(cur, part, false, true);
  277. },
  278. handleTabClick(item, a) {
  279. this.activeLayerId = item.name;
  280. },
  281. // 设置数据
  282. setData() {
  283. dataSourceLayer = new Cesium.CustomDataSource("query");
  284. viewer.dataSources.add(dataSourceLayer);
  285. this.activeLayerId = "0";
  286. this.queryResults = {};
  287. this.queryResultsGeom = {};
  288. this.queryResultsGeomPart = {};
  289. },
  290. /**
  291. * 左键点击查询图层
  292. */
  293. async mapLayerQuery(movement) {
  294. let that = this;
  295. that.activeLayerId = "0";
  296. that.layerList = [];
  297. that.layersData = [];
  298. this.remove_query_click();
  299. let scene = viewer.scene;
  300. console.log("scene", "scene");
  301. console.log("scene", scene);
  302. viewer.entities.removeAll();
  303. dataSourceLayer.entities.removeAll();
  304. removeGeoJSON("geoserver");
  305. //拾取模型
  306. let pickedFeature = scene.pick(movement.position);
  307. console.log("pickedFeature", pickedFeature);
  308. if (
  309. scene.pickPositionSupported &&
  310. Cesium.defined(pickedFeature) &&
  311. pickedFeature != null &&
  312. pickedFeature.primitive &&
  313. pickedFeature.id.lable!='nopick'
  314. ) {
  315. this.pickClick(pickedFeature);
  316. } else {
  317. this.pickPosition(movement);
  318. }
  319. },
  320. async mapSelect(pos, obj) {
  321. console.log("mapSelect", "---");
  322. // let obj = window.tempSelect;
  323. let queryByIDParameters = {
  324. // getFeatureMode: "BUFFER",
  325. getFeatureMode: "SPATIAL",
  326. spatialQueryMode: "INTERSECT",
  327. datasetNames: [`${obj.fwgzkj}:${obj.fwmc}`], //obj.source.split(","),
  328. geometry: {
  329. parts: [1], // points: [{ y: xy.lat, x: xy.lng }],
  330. points: pos,
  331. type: "REGION",
  332. },
  333. bufferDistance: 0.00005,
  334. hasGeometry: true,
  335. };
  336. let url2 = calcIserverURI(obj.url);
  337. let e;
  338. e = await mapQuery(url2, queryByIDParameters);
  339. if (e && e.totalCount > 0) {
  340. this.addLayerList(obj.title, obj);
  341. let queryData = [];
  342. let geoms = [];
  343. let parts = [];
  344. // let parseJson = JSON.parse(obj.legend);
  345. let parseJson = await getfieldList(obj.id, false);
  346. for (let u = 0; u < e.features.length; u++) {
  347. let cur = [];
  348. var linSAr = JSON.parse(JSON.stringify(e.features[u]));
  349. function condition(ci) {
  350. return ci.status != undefined && ci.status;
  351. }
  352. if (e.features[u].fieldNames) {
  353. linSAr.fieldNames.forEach((fieldName, i) => {
  354. let perjson = parseJson.filter(
  355. (p) => p.filedName.toUpperCase() == fieldName
  356. );
  357. if (perjson.length > 0) {
  358. var show = condition(perjson[0]);
  359. var order = perjson[0].order || linSAr.fieldNames.length;
  360. if (fieldName != perjson[0].filedNameZh)
  361. fieldName = perjson[0].filedNameZh;
  362. }
  363. if (show) {
  364. let v = linSAr.fieldValues[i];
  365. if (v != "" && !isNaN(parseFloat(v))) {
  366. v = Math.round(parseFloat(v) * 100) / 100;
  367. }
  368. cur.push({ name: fieldName, value: v, order });
  369. }
  370. });
  371. } else {
  372. that.$message({
  373. message: "查询结果为空!",
  374. type: "warning",
  375. customClass: "messageIndex",
  376. });
  377. }
  378. // console.log(cur, "cur");
  379. //排序
  380. cur.sort((a, b) => a.order - b.order);
  381. let urlNew = obj.url + ".json";
  382. let resNew = await axios.get(urlNew);
  383. let serCode = resNew.data.prjCoordSys.epsgCode;
  384. let points = [];
  385. for (let y = 0; y < e.features[u].geometry.points.length; y++) {
  386. let c = {};
  387. if (serCode == 3857) {
  388. c = cartesianToCartographic84(
  389. e.features[u].geometry.points[y].x,
  390. e.features[u].geometry.points[y].y
  391. );
  392. } else {
  393. c = e.features[u].geometry.points[y];
  394. }
  395. points.push([c.x, c.y]);
  396. }
  397. parts.push(e.features[u].geometry.parts);
  398. geoms.push(points);
  399. queryData.push(cur);
  400. }
  401. this.queryResultsGeomPart[obj.id] = parts;
  402. this.queryResults[obj.id] = queryData;
  403. this.queryResultsGeom[obj.id] = geoms;
  404. }
  405. this.setactiveLayerId();
  406. // this.drawPolygon(window.tempSelect)
  407. // //拾取模型
  408. // let pickedFeature = viewer.scene.pick(movement.position);
  409. // console.log(pickedFeature, "pickedFeature");
  410. },
  411. async pickClick(pickedFeature) {
  412. let that = this;
  413. let eneityName = pickedFeature.primitive.name;
  414. let Pid = "";
  415. var tempArr = [];
  416. // ##############################################
  417. if (eneityName.indexOf("单体") > -1) {
  418. console.log("eneityName", eneityName);
  419. debugger
  420. let ModelName = "";
  421. let obj = store.state.vectorlayerlist.find((i) => {
  422. return eneityName == i.title;
  423. });
  424. let url1 = obj.url.replace("3D-", "data-");
  425. let url2 = url1.replace(
  426. "realspace",
  427. "data/featureResults.rjson?returnContent=true"
  428. );
  429. console.log(url2, "url2");
  430. let queryModelName = {
  431. getFeatureMode: "ID",
  432. datasetNames: [eneityName + ":" + eneityName + "关联"],
  433. ids: [pickedFeature.id]
  434. };
  435. let res = await mapQuery(url2, queryModelName);
  436. if (res && res.totalCount > 0) {
  437. let feature = res.features[0]
  438. // 循环feature中的fieldNames
  439. for (let i = 0; i < feature.fieldNames.length; i++) {
  440. // 获取字段名
  441. let fieldName = feature.fieldNames[i];
  442. // 获取字段值
  443. let fieldValue = feature.fieldValues[i];
  444. // 如果字段名为ModelName
  445. if (fieldName == "MODELNAME") {
  446. // 获取ModelName的值
  447. ModelName = fieldValue;
  448. break;
  449. }
  450. }
  451. }
  452. let queryByIDParameters = {
  453. getFeatureMode: "SQL",
  454. datasetNames: [eneityName + ":" + eneityName+"矢量"],
  455. queryParameter: { "attributeFilter": "ModelName=" + ModelName },
  456. };
  457. let e = await mapQuery(url2, queryByIDParameters);
  458. if (e && e.totalCount > 0) {
  459. // that.layerList.push(store.state.vectorlayerlist[i]);
  460. that.layerList.push(obj);
  461. for (let u = 0; u < e.features.length; u++) {
  462. let cur = [];
  463. var linSAr = JSON.parse(JSON.stringify(e.features[u]));
  464. if (e.features[u].fieldNames) {
  465. linSAr.fieldNames.forEach((fieldName, i) => {
  466. let v = linSAr.fieldValues[i];
  467. if (v != "" && !isNaN(parseFloat(v))) {
  468. v = Math.round(parseFloat(v) * 100) / 100;
  469. }
  470. // cur.push({ name: fieldName, value: v });
  471. if (
  472. fieldName.toLowerCase().indexOf("shape") < 0 &&
  473. fieldName.toLowerCase().indexOf("sm") &&
  474. v != ""
  475. ) {
  476. cur.push({ name: fieldName, value: v });
  477. }
  478. });
  479. //获取图层id的参数
  480. let substring = pickedFeature.primitive._baseUri.query;
  481. for (let p = 0; p < store.state.vectorlayerlist.length; p++) {
  482. if (store.state.vectorlayerlist[p].id == substring) {
  483. that.layerList.push(store.state.vectorlayerlist[p]);
  484. break;
  485. }
  486. }
  487. that.queryResults[substring] = [cur];
  488. that.queryResultsGeom[substring] = [];
  489. that.activeLayerId = substring;
  490. } else {
  491. that.$message({
  492. message: "查询结果为空!",
  493. type: "warning",
  494. customClass: "messageIndex",
  495. });
  496. }
  497. }
  498. }
  499. } else if (eneityName.indexOf("雨水") > -1 || eneityName.indexOf("管线") > -1) {
  500. // for (let i = 0; i < store.state.vectorlayerlist.length; i++) {
  501. // let obj = store.state.vectorlayerlist[i];
  502. // console.log(obj.url,'url----------',obj);
  503. let str1 = eneityName.match(/@(\S*)#/)[1];
  504. let str2 = eneityName.match(/(\S*)@/)[1];
  505. let str3 = str1 + ":" + str2;
  506. // let obj = store.state.vectorlayerlist.find(i => i.title == str1);
  507. let obj = store.state.vectorlayerlist.find((i) => {
  508. return str1 == i.title;
  509. });
  510. let url1 = obj.url.replace("3D-", "data-");
  511. let url2 = url1.replace(
  512. "realspace",
  513. "data/featureResults.rjson?returnContent=true"
  514. );
  515. console.log(url2, "url2");
  516. let queryByIDParameters = {
  517. getFeatureMode: "ID",
  518. datasetNames: [str3],
  519. ids: [pickedFeature.id],
  520. };
  521. let e = await mapQuery(url2, queryByIDParameters);
  522. if (e && e.totalCount > 0) {
  523. // that.layerList.push(store.state.vectorlayerlist[i]);
  524. that.layerList.push(obj);
  525. for (let u = 0; u < e.features.length; u++) {
  526. let cur = [];
  527. var linSAr = JSON.parse(JSON.stringify(e.features[u]));
  528. if (e.features[u].fieldNames) {
  529. linSAr.fieldNames.forEach((fieldName, i) => {
  530. let v = linSAr.fieldValues[i];
  531. if (v != "" && !isNaN(parseFloat(v))) {
  532. v = Math.round(parseFloat(v) * 100) / 100;
  533. }
  534. // cur.push({ name: fieldName, value: v });
  535. if (
  536. fieldName.toLowerCase().indexOf("shape") < 0 &&
  537. fieldName.toLowerCase().indexOf("sm") &&
  538. v != ""
  539. ) {
  540. cur.push({ name: fieldName, value: v });
  541. }
  542. });
  543. //获取图层id的参数
  544. let substring = pickedFeature.primitive._baseUri.query;
  545. for (let p = 0; p < store.state.vectorlayerlist.length; p++) {
  546. if (store.state.vectorlayerlist[p].id == substring) {
  547. that.layerList.push(store.state.vectorlayerlist[p]);
  548. break;
  549. }
  550. }
  551. that.queryResults[substring] = [cur];
  552. that.queryResultsGeom[substring] = [];
  553. that.activeLayerId = substring;
  554. } else {
  555. that.$message({
  556. message: "查询结果为空!",
  557. type: "warning",
  558. customClass: "messageIndex",
  559. });
  560. }
  561. }
  562. }
  563. // }
  564. }
  565. that.loading = true;
  566. that.queryByPickFeature(pickedFeature, function (result, Fields) {
  567. that.loading = false;
  568. if (result != null && result.features[0].fieldNames) {
  569. result.features[0].fieldNames.forEach((fieldName, i) => {
  570. const Field = Fields.find((c) => c.FieldEn == fieldName);
  571. let v = result.features[0].fieldValues[i];
  572. if (!isNaN(parseFloat(v))) {
  573. v = Math.round(parseFloat(v) * 100) / 100;
  574. }
  575. that.layersData.push({
  576. label: Field ? Field.FieldCn : fieldName,
  577. value: v,
  578. });
  579. });
  580. } else {
  581. that.layersData = [];
  582. }
  583. });
  584. },
  585. pickPosition(movement) {
  586. //拾取图层
  587. // let pickRay = viewer.camera.getPickRay(movement.position);
  588. // let artesian3 = viewer.scene.globe.pick(pickRay, viewer.scene);
  589. let artesian3 = viewer.scene.pickPosition(movement.position);
  590. let xy = cartesian3ToWGS84(artesian3);
  591. //TODO wanger 分图层查询
  592. for (let i = 0; i < store.state.vectorlayerlist.length; i++) {
  593. let obj = store.state.vectorlayerlist[i];
  594. // 结果高亮
  595. this.highlightResultsPng(xy.lng, xy.lat);
  596. if (obj.serverType == "geoserver") {
  597. this.getGeoserver(xy, obj);
  598. } else {
  599. if (!obj.fwgzkj && !obj.fwmc) {
  600. continue;
  601. }
  602. superQuery(xy, obj, (data) => this.superQfun(data, obj));
  603. }
  604. }
  605. },
  606. superQfun({ parts, queryData, geoms, e }, obj) {
  607. if (!e.features[0].fieldNames) {
  608. this.$message({
  609. message: "查询结果为空!",
  610. type: "warning",
  611. customClass: "messageIndex",
  612. });
  613. }
  614. if (e && e.totalCount > 0) {
  615. this.addLayerList(obj.title, obj);
  616. this.queryResultsGeomPart[obj.id] = parts;
  617. this.queryResults[obj.id] = queryData;
  618. this.queryResultsGeom[obj.id] = geoms;
  619. }
  620. this.setactiveLayerId();
  621. },
  622. setactiveLayerId() {
  623. if (this.layerList.length > 0) {
  624. this.activeLayerId = this.layerList[0].id;
  625. } else {
  626. this.$message({
  627. message: "查询结果为空!",
  628. type: "warning",
  629. customClass: "messageIndex",
  630. });
  631. }
  632. },
  633. async getGeoserver(xy, obj) {
  634. this.queryResults[obj.id] = [];
  635. this.queryResultsGeom[obj.id] = [];
  636. let ind =
  637. obj.url.indexOf("geoserver") >= 0
  638. ? obj.url.indexOf("geoserver")
  639. : obj.url.indexOf("siweiserver");
  640. let url = obj.url.substring(0, ind + 9) + "/ows";
  641. let pointml = `<gml:Point srsName='EPSG:4326'><gml:coordinates>
  642. ${xy.lng},${xy.lat}</gml:coordinates></gml:Point>`;
  643. let polygonml = `<gml:Polygon srsName="EPSG:4326">
  644. <gml:outerBoundaryIs>
  645. <gml:LinearRing>
  646. <gml:coordinates> ${xy.points} </gml:coordinates>
  647. </gml:LinearRing>
  648. </gml:outerBoundaryIs>
  649. </gml:Polygon>`;
  650. let params = {
  651. service: "WFS",
  652. version: "1.0.0",
  653. request: "GetFeature",
  654. typeName: `${obj.fwgzkj}:${obj.fwmc}`,
  655. outputFormat: "application/json",
  656. srsName: "EPSG:4326",
  657. filter: `<Filter xmlns='http://www.opengis.net/ogc' xmlns:gml='http://www.opengis.net/gml'><Intersects><PropertyName>geom</PropertyName> ${xy.lng ? pointml : polygonml
  658. }</Intersects></Filter>`,
  659. };
  660. console.log("----", params);
  661. let res = await axios.get(url, { params });
  662. if (res.data && res.data.features && res.data.features.length > 0) {
  663. this.addLayerList(obj.title, obj);
  664. res.data.features.forEach((feitem) => {
  665. let cur = [];
  666. Object.keys(feitem.properties).forEach((key) => {
  667. cur.push({ name: key, value: feitem.properties[key] });
  668. });
  669. this.queryResults[obj.id].push(cur);
  670. this.queryResultsGeom[obj.id].push(feitem.geometry);
  671. });
  672. } else {
  673. this.$message({
  674. message: "查询结果为空!",
  675. type: "warning",
  676. customClass: "messageIndex",
  677. });
  678. }
  679. this.setactiveLayerId();
  680. },
  681. highlightResultsPng(longitude, latitude) {
  682. manager_layer_png.entities.add({
  683. name: "manager_layer_png",
  684. position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
  685. billboard: {
  686. // 图像地址,URI或Canvas的属性
  687. image: "./static/images/overview/go.png",
  688. height: 34,
  689. width: 36,
  690. scale: 1.0,
  691. zIndex: 2,
  692. show: true,
  693. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  694. },
  695. });
  696. },
  697. addLayerList(label, obj) {
  698. if (this.layerList.findIndex((a) => a.label == label) >= 0) return;
  699. if (obj) {
  700. this.layerList.push(obj);
  701. } else {
  702. let layers = store.state.vectorlayerlist.filter(
  703. (element) => element.label === label
  704. );
  705. if (layers.length > 0) {
  706. this.activeLayerId = layers[0].id;
  707. this.layerList.push(layers[0]);
  708. }
  709. }
  710. },
  711. /**
  712. * 左键点击模型查询
  713. */
  714. mapModelQuery(movement) {
  715. this.activeLayerId = "0";
  716. this.layerList = [];
  717. this.layersData = [];
  718. viewer.entities.removeAll();
  719. dataSourceLayer.entities.removeAll();
  720. removeGeoJSON("geoserver");
  721. clearTranslate()
  722. let title;
  723. if (store.state.checkedData) title = store.state.checkedData.title;
  724. // 超图分层分户
  725. if (title == "分层分户" || title == "8号楼-谷") {
  726. let id = handModel(movement);
  727. } else {
  728. handnew(movement);
  729. }
  730. let newArr = [];
  731. GetHouseInfo({ id: "2c01647f-4533-4472-b20b-f5caa4c705b0" }).then(
  732. (res) => {
  733. for (const [key, value] of Object.entries(res.data)) {
  734. newArr.push({ name: keyName[key], value: value });
  735. }
  736. this.addLayerList(title);
  737. this.queryResults[this.activeLayerId] = [newArr];
  738. this.queryResultsGeom[this.activeLayerId] = [];
  739. }
  740. );
  741. },
  742. mapQuerys(queryName) {
  743. this.setData();
  744. let that = this;
  745. this.handler.setInputAction(function (movement) {
  746. that[queryName](movement);
  747. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  748. this.handler.setInputAction(function () {
  749. that.removeMapLayerQuery();
  750. clearTranslate();
  751. }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  752. },
  753. /**
  754. * 超图
  755. * 根据返回的三维对象查询数据信息
  756. *
  757. * @param {*} param
  758. */
  759. async queryByPickFeature(param, completed) {
  760. if (param.primitive) {
  761. let dataUrl = "";
  762. let datasourceName = "";
  763. let Fields = [];
  764. for (const layerData of this.layersDataUrl) {
  765. for (const datasource of layerData.datasources) {
  766. if (datasource.Name3D == param.primitive.name) {
  767. dataUrl = layerData.url;
  768. datasourceName = datasource.DataName;
  769. Fields = datasource.Fields;
  770. break;
  771. }
  772. }
  773. }
  774. let queryByIDParameters = {
  775. getFeatureMode: "ID",
  776. datasetNames: [datasourceName],
  777. ids: [param.id],
  778. hasGeometry: "false",
  779. };
  780. if (!dataUrl) {
  781. completed(null);
  782. } else {
  783. let e = await mapQuery(dataUrl, queryByIDParameters);
  784. if (completed) {
  785. completed(e, Fields);
  786. }
  787. }
  788. }
  789. },
  790. convertCoordinates(coordArray) {
  791. return coordArray.map((coord) => [coord.x, coord.y]);
  792. },
  793. // 取消左键点击查询
  794. removeMapLayerQuery() {
  795. this.queryResults = {};
  796. this.queryResultsGeom = {};
  797. this.queryResultsGeomPart = {};
  798. this.layerList = [];
  799. // viewer.entities.removeAll();
  800. if (this.handler.removeInputAction) {
  801. this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  802. this.handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  803. }
  804. dataSourceLayer.entities.removeAll();
  805. removeGeoJSON("geoserver");
  806. viewer.dataSources.remove(dataSourceLayer);
  807. },
  808. remove_query_click() {
  809. for (var i = 0; i < 10; i++) {
  810. query_click.entities.values.forEach((res) => {
  811. query_click.entities.remove(res);
  812. });
  813. }
  814. // 图标
  815. var entities = manager_layer_png.entities.values;
  816. for (var i = entities.length - 1; i >= 0; i--) {
  817. manager_layer_png.entities.remove(entities[i]);
  818. }
  819. },
  820. //地图数据查询事件
  821. changleQueryItem(item) {
  822. switch (item.index) {
  823. case 1: {
  824. this.mapQuerys("mapLayerQuery"); //图层点击事件
  825. this.remove_query_click();
  826. // viewer.entities.removeAll();
  827. break;
  828. }
  829. case 2: {
  830. this.mapQuerys("mapModelQuery");
  831. break;
  832. }
  833. case 3: {
  834. this.removeMapLayerQuery(); //清除
  835. clearTranslate();
  836. // pick_cockpit_vector.clear_data(); //矢量拾取清除
  837. this.$refs.MultiLevelQuery.clear_data(); //多级查询
  838. this.remove_query_click();
  839. common.clearHandlerDrawing("Polygon");
  840. break;
  841. }
  842. case 4: {
  843. //驾驶舱矢量数据点选查询
  844. // pick_cockpit_vector.init_handler();
  845. break;
  846. }
  847. case 5: {
  848. //联级查询
  849. this.$refs.MultiLevelQuery.init_handler();
  850. break;
  851. }
  852. case 6: {
  853. //联级查询
  854. // this.$refs.MultiLevelQuery.init_handler();
  855. this.drawMap();
  856. console.log("框选事件");
  857. break;
  858. }
  859. default:
  860. break;
  861. }
  862. },
  863. //绘制
  864. drawMap() {
  865. let nReaions = [];
  866. let that = this;
  867. this.activeLayerId = "0";
  868. this.layerList = [];
  869. this.layersData = [];
  870. // this.remove_query_click();
  871. // let scene = viewer.scene;
  872. // viewer.entities.removeAll();
  873. // dataSourceLayer.entities.removeAll();
  874. removeGeoJSON("geoserver");
  875. if (!window.handlerPolygon) {
  876. common.initHandler("Polygon");
  877. }
  878. common.handlerDrawing("Polygon").then(
  879. (res) => {
  880. //过滤掉高度
  881. const filteredArr = res.positions.filter((item, index) => {
  882. if ((index + 1) % 3 !== 0) return item;
  883. });
  884. filteredArr.push(res.positions[0]);
  885. filteredArr.push(res.positions[1]);
  886. console.log(filteredArr, "max-----");
  887. for (let i = 0; i < filteredArr.length; i += 2) {
  888. nReaions.push({
  889. x: filteredArr.slice(i, i + 2)[0],
  890. y: filteredArr.slice(i, i + 2)[1],
  891. });
  892. }
  893. // console.log(nReaions, "nReaions");
  894. removeGeoJSON("geoserver");
  895. store.state.vectorlayerlist.forEach((obj) => {
  896. if (obj.serverType == "geoserver") {
  897. let points = "";
  898. res.positions.forEach((item, index) => {
  899. if ((index + 1) % 3 == 1) points += item + ",";
  900. if ((index + 1) % 3 == 2) points += item + " ";
  901. });
  902. points += res.positions[0] + ",";
  903. points += res.positions[1] + " ";
  904. console.log(res.positions, points);
  905. this.getGeoserver({ points }, obj);
  906. } else {
  907. this.mapSelect(nReaions, obj);
  908. }
  909. });
  910. },
  911. (err) => {
  912. console.log(err);
  913. }
  914. );
  915. window.handlerPolygon.activate();
  916. },
  917. },
  918. beforeDestroy() {
  919. this.removeMapLayerQuery();
  920. clearTranslate();
  921. },
  922. };
  923. </script>
  924. <style>
  925. .sm-function-module-content-btn {
  926. text-align: center;
  927. padding-top: 5px;
  928. }
  929. .flyBtn2 {
  930. position: absolute;
  931. right: 47px;
  932. }
  933. .el-tabs__item {
  934. color: white !important;
  935. }
  936. .sm-function-module-content-tabs {
  937. height: 45px;
  938. padding: 1px 5px 0px 5px;
  939. /* margin-top: 4rem; */
  940. }
  941. .sm-function-module-content-table {
  942. height: 564px;
  943. overflow-y: auto;
  944. padding: 1px 5px 0px 5px;
  945. }
  946. .sm-function-module-query {
  947. /* padding: 5px 10px; */
  948. overflow: hidden;
  949. max-height: 700px;
  950. scrollbar-width: none;
  951. /* firefox */
  952. -ms-overflow-style: none;
  953. /* IE 10+ */
  954. @media (max-width: 1000px) {
  955. margin: 0.8rem 0;
  956. padding: 0 15px;
  957. }
  958. @media (max-width: 750px) {
  959. margin: 0.5rem 0;
  960. padding: 0 10px;
  961. max-height: 410px;
  962. }
  963. @media (max-height: 480px) {
  964. margin: 0.5rem 0;
  965. padding: 0 15px;
  966. max-height: 420px;
  967. max-width: 280px;
  968. }
  969. @media (max-height: 300px) {
  970. margin: 0.5rem 0;
  971. padding: 0 10px;
  972. max-height: 280px;
  973. max-width: 250px;
  974. }
  975. @media (max-height: 250px) {
  976. max-height: 240px;
  977. }
  978. }
  979. </style>
  980. <style lang="scss" scoped>
  981. @import "clickQuery";
  982. /deep/ .el-table tr {
  983. background: rgba(10, 25, 38, 0.5) !important;
  984. }
  985. /deep/ .el-table td.el-table__cell,
  986. .el-table th.el-table__cell.is-leaf {
  987. background: rgba(10, 25, 38, 0.5) !important;
  988. border-bottom: 1px solid #ebeef5;
  989. }
  990. .el-table {
  991. color: #fff;
  992. background: rgba(10, 25, 38, 0.5) !important;
  993. }
  994. /deep/ .el-table__fixed-right::before,
  995. .el-table__fixed::before {
  996. background: rgba(10, 25, 38, 0.9) !important;
  997. }
  998. /deep/ .el-table__fixed-right-patch {
  999. background: rgba(10, 25, 38, 0.9) !important;
  1000. }
  1001. /deep/ .el-table--border::after,
  1002. .el-table--group::after,
  1003. .el-table::before {
  1004. background: rgba(10, 25, 38, 0) !important;
  1005. }
  1006. /deep/ .el-collapse-item__header {
  1007. background-color: transparent !important;
  1008. color: rgb(217, 237, 254) !important;
  1009. }
  1010. /deep/ .el-collapse {
  1011. border: none;
  1012. /* border-top: 1px solid #EBEEF5; */
  1013. /* border-bottom: 1px solid #EBEEF5; */
  1014. }
  1015. /deep/ .el-collapse-item__content {
  1016. padding-bottom: 0px;
  1017. }
  1018. </style>