clickQuery.vue 30 KB

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