import Vue from "vue"; import coord from "@/components/poplayer/coord"; import store from "@/utils/store"; import mapData from "../../../static/mapData"; import { liushisijiayuanqudizhibianmafuwu, findAddressCandidates, getDiKuanFanWei, ent_selectByName } from "../../api/api"; import vueEvents from "@/utils/vueEvent.js"; let PoiLayerConstructor = Vue.extend(coord); const rpc = { timeout: 500, method: "get_statue", divPoint: null, instance: null, pathLayer: null, position: null, marksIndex: null, pitchValue: null, unsubscribeTicks: null, LineRoaming: null, //线路漫游 dataQuery: [], //关键字查询结果 pointerFly: null, //定点漫游 isShow: false, objArr: [], pointrange:null, //关键字查询 getFuzzyQuery(res) { if(res.message.indexOf('奔驰')>-1){ store.queryLayer.val ='奔驰公司' } else if(res.message.indexOf('永昌')>-1){ store.queryLayer.val ='永昌工业园' }else if(res.message.indexOf('京东')>-1){ store.queryLayer.val ='京东' }else if(res.message.indexOf('小米')>-1){ store.queryLayer.val ='小米' }else if(res.message.indexOf('博大')>-1){ store.queryLayer.val ='博大大厦' }else{ // store.queryLayer.val = res.message; } this.setClearAllMsg(); if (!res.baidu_keys) return; var flag = true; if (this.dataQuery.length > 0) { if (res.message.indexOf("第") > -1 && res.message.indexOf("条") > -1) { var data = mapData.msgMach.localPage; flag = false; var val_Data = null; for (var i in data) { if (res.message.indexOf(data[i]) > -1) { val_Data = this.dataQuery[i]; setTimeout(() => { this.setLocation(val_Data); }, 1000); break; return; } } } else { for (var i in this.dataQuery) { var name = this.dataQuery[i].name; for (var j = 0; j < length; j++) { var world = keyWorld[j].word; if (name.indexOf(world) > -1) { flag = false; this.setLocation(this.dataQuery[i]); break; return; } } } } } if (!flag) { return; } var keyWorld = res.baidu_keys.results; if (keyWorld) { var length = keyWorld.length; this.dataQuery = []; this.objArr = []; this.pointrange = 2000; for (var i = 0; i < length; i++) { var world = keyWorld[i].word; if(world.indexOf('奔驰')>-1){ world ='奔驰'; this.pointrange = 12000 } else if(world.indexOf('永昌')>-1){ world ='永昌' }else if(world.indexOf('京东')>-1){ world ='京东' }else if(world.indexOf('小米')>-1){ world ='小米' }else if(world.indexOf('博大大厦')>-1){ world ='博大大厦' }else{ continue; } this.setFuzzyQueryData(world, i, length - 1); } } }, async setFuzzyQueryData(res, index, length) { Promise.all([ ent_selectByName(res), //企业 liushisijiayuanqudizhibianmafuwu(res), //园区 findAddressCandidates(res) //地块 ]).then(result => { var that = this; store.queryLayer.data = []; //企业 var EntArr = result[0].result.filter(item => { return item.entName.includes(res); }); EntArr.forEach(val => { let itemObj = { type: "企业", name: val.entName, address: val.address, lon: val.x, lat: val.y }; that.objArr.push(itemObj); }); //园区 var YQArr = result[1].features.filter(item => { return item.properties.YQmingchen.includes(res); }); YQArr.forEach(val => { let itemObj = { type: "园区", name: val.properties.YQmingchen, address: val.properties.YQdizhi, lon: val.geometry.coordinates[0], lat: val.geometry.coordinates[1], geom: val.properties.Coor1 + val.properties.Coor2 }; that.objArr.push(itemObj); }); //地块 var LandArr = result[2].candidates.filter((item) => { return item.attributes.QYMC.includes(res); }) // 结果根据QYMC从短到长排序 LandArr.sort((a, b) => (b.attributes.QYMC.length === a.attributes.QYMC.length ? 0 : a.attributes.QYMC.length > b.attributes.QYMC.length ? 1 : -1)) LandArr.forEach((val) => { let itemObj = { type: "地块", name: val.attributes.QYMC, area: val.attributes.area, code: val.attributes["地块编"], lon: val.location.x, lat: val.location.y, }; that.objArr.push(itemObj); }); if (index == length) { if (that.objArr.length <= 0) { vueEvents.$emit("queryData", true); return; } var num = that.objArr.length; for (var i = 0; i < num; i++) { if (i < 6) { that.dataQuery.push(that.objArr[i]); } } store.queryLayer.data = that.dataQuery; that.setClearAllMsg(); setTimeout(() => { vueEvents.$emit("queryData", true); that.setLocation(that.dataQuery[0]); }, 1000); } }); }, getFuzzyQueryData(res, index, length, flag) { if (!res || res.length <= 0) return; for (var i in res) { if (this.dataQuery.length < 6) { this.dataQuery.push(res[i]); } } if (index == length) { if (this.dataQuery.length <= 0) { vueEvents.$emit("queryData", false); return; } store.queryLayer.data = this.dataQuery; this.setClearAllMsg(); setTimeout(() => { vueEvents.$emit("queryData", true); this.setLocation(this.dataQuery[0]); }, 1000); } }, // 显示地块范围 getLandmass(res) { let that = this; if (res.type == "园区") { var geom = res.geom.split(','); var coord = []; for (var i in geom) { coord.push(parseFloat(geom[i])) } this.setDrawPolyExtent(coord) } else if (res.type == "地块" || res.type == "企业") { getDiKuanFanWei(res.lon, res.lat).then(response => { let center = { lon: 0, lat: 0 }; let polygon = that.read(response.geometry); if (polygon.length > 0) { var geometry = []; let points = polygon[0].split(","); for (let i = 0; i < points.length; i++) { let point = points[i].replace(/^\s+|\s+$/g, "").split(" "); // center.lon += parseFloat(point[0]) / points.length; // center.lat += parseFloat(point[1]) / points.length; geometry.push(parseFloat(point[0]), parseFloat(point[1])) } that.setDrawPolyExtent(geometry) } }); } }, setDrawPolyExtent(res) { this.setLacationLineClear() var position = Cesium.Cartesian3.fromDegreesArray(res) this.lacationLine = Viewer.entities.add({ name: "立体墙效果", wall: { positions: position, material: new Cesium.DynamicWallMaterialProperty({ // color: new Cesium.Color.fromCssColorString('#73DB0E'), color: new Cesium.Color.fromCssColorString('#1f1fa8'), duration: 4000, }), // 设置高度 maximumHeights: Array(position.length).fill(80), minimumHeights: Array(position.length).fill(10), } }) }, read(wkt) { var regExes = { typeStr: /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/, emptyTypeStr: /^\s*(\w+)\s*EMPTY\s*$/, spaces: /\s+/, parenComma: /\)\s*,\s*\(/, doubleParenComma: /\)\s*\)\s*,\s*\(\s*\(/, // can't use {2} here trimParens: /^\s*\(?(.*?)\)?\s*$/ }; /** * Object with properties corresponding to the geometry types. Property values * are functions that do the actual parsing. * @private */ var parse$1 = { /** * Return point geometry given a point WKT fragment. * * @param {String} str A WKT fragment representing the point. * @return {Point} A point geometry. * @private */ point: function point(str) { if (str === undefined) { return []; } var coords = str.trim().split(regExes.spaces); return [Number.parseFloat(coords[0]), Number.parseFloat(coords[1])]; }, /** * Return a multipoint geometry given a multipoint WKT fragment. * * @param {String} str A WKT fragment representing the multipoint. * @return {Point} A multipoint feature. * @private */ multipoint: function multipoint(str) { var this$1 = this; if (str === undefined) { return []; } var point; var points = str.trim().split(","); var components = []; for (var i = 0, len = points.length; i < len; ++i) { point = points[i].replace(regExes.trimParens, "$1"); components.push(parse$1.point(point)); } return components; }, /** * Return a linestring geometry given a linestring WKT fragment. * * @param {String} str A WKT fragment representing the linestring. * @return {LineString} A linestring geometry. * @private */ linestring: function linestring(str) { if (str === undefined) { return []; } var points = str.trim().split(","); var components = []; var coords; for (var i = 0, len = points.length; i < len; ++i) { coords = points[i].trim().split(regExes.spaces); components.push([ Number.parseFloat(coords[0]), Number.parseFloat(coords[1]) ]); } return components; }, /** * Return a linearring geometry given a linearring WKT fragment. * * @param {String} str A WKT fragment representing the linearring. * @return {LinearRing} A linearring geometry. * @private */ linearring: function linearring(str) { if (str === undefined) { return []; } var points = str.trim().split(","); var components = []; var coords; for (var i = 0, len = points.length; i < len; ++i) { coords = points[i].trim().split(regExes.spaces); components.push([ Number.parseFloat(coords[0]), Number.parseFloat(coords[1]) ]); } return components; }, /** * Return a multilinestring geometry given a multilinestring WKT fragment. * * @param {String} str A WKT fragment representing the multilinestring. * @return {MultiLineString} A multilinestring geometry. * @private */ multilinestring: function multilinestring(str) { var this$1 = this; if (str === undefined) { return []; } var line; var lines = str.trim().split(regExes.parenComma); var components = []; for (var i = 0, len = lines.length; i < len; ++i) { line = lines[i].replace(regExes.trimParens, "$1"); components.push(parse$1.linestring(line)); } return components; }, /** * Return a polygon geometry given a polygon WKT fragment. * * @param {String} str A WKT fragment representing the polygon. * @return {Polygon} A polygon geometry. * @private */ polygon: function polygon(str) { var this$1 = this; if (str === undefined) { return []; } var ring, linestring, linearring; var rings = str.trim().split(regExes.parenComma); var shell; var holes = []; //for (var i = 0, len = rings.length; i < len; ++i) { ring = rings[0].replace(regExes.trimParens, "$1"); linestring = ring; //} return linestring; }, /** * Return a multipolygon geometry given a multipolygon WKT fragment. * * @param {String} str A WKT fragment representing the multipolygon. * @return {MultiPolygon} A multipolygon geometry. * @private */ multipolygon: function multipolygon(str) { var this$1 = this; if (str === undefined) { return []; } var polygon; var polygons = str.trim().split(regExes.doubleParenComma); var components = []; for (var i = 0, len = polygons.length; i < len; ++i) { polygon = polygons[i].replace(regExes.trimParens, "$1"); components.push(parse$1.polygon(polygon)); } return components; } }; var geometry, type, str; wkt = wkt.replace(/[\n\r]/g, " "); var matches = regExes.typeStr.exec(wkt); if (wkt.search("EMPTY") !== -1) { matches = regExes.emptyTypeStr.exec(wkt); matches[2] = undefined; } if (matches) { type = matches[1].toLowerCase(); str = matches[2]; if (parse$1[type]) { geometry = parse$1[type].apply(this, [str]); } } if (geometry === undefined) { throw new Error("Could not parse WKT " + wkt); } return geometry; }, //地图复位 setMapRest() { const data = mapData.mapRest; sgworld.Navigate.flyToPointsInterest({ destination: { x: data.lng, y: data.lat, z: data.alt }, orientation: { heading: data.heading, pitch: data.pitch, roll: data.roll }, duration: 8 //飞行时间8s }); }, //动画导航 setLineRoaming() { var valdata = mapData.animaNavigation; this.marksIndex = 1; this.pitchValue = -20; this.setShowPathLine(valdata); var geom = []; for (var i in valdata) { geom.push(valdata[i].lng, valdata[i].lat, valdata[i].height); } var that = this; sgworld.Creator.getFlyData(geom, data => { data.showPoint = false; data.showLine = false; data.mode = 1; data.pitch = -10; data.height = 500; data.speed = 25; that.LineRoaming = sgworld.Creator.createDynamicObject( data, null, res => { if (res.time >= res.Totaltime) { that.setCloseLineRomaing(); that.setMapRest(); } } ); }); }, //点击获取坐标 clickToCoordinates() { const handlerClick = new Cesium.ScreenSpaceEventHandler( Viewer.scene.canvas ); handlerClick.setInputAction(event => { let cartesian = Viewer.camera.pickEllipsoid( event.position, Viewer.scene.globe.ellipsoid ); if (cartesian == undefined) { console.log("没有获取到坐标"); } else { // 空间坐标转世界坐标(弧度) let cartographic = Cesium.Cartographic.fromCartesian(cartesian); // 弧度转为角度(经纬度) let lon = Cesium.Math.toDegrees(cartographic.longitude); // 经度值 let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度值 console.log("经纬度是:", { x: lon, y: lat }); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); }, //定位弹窗 setLocation(res) { var objdata = { name: res.name, address: res.address, area: res.area, code: res.code, lat: res.lat, lon: res.lon }; //添加定位弹窗 this.setAddPointLocation(objdata); //范围调用 this.getLandmass(res); }, setAddPointLocation(res) { // 清除方法 store.setlocalLayerShowAction(false); store.setlocalLayerListAction({}); store.setlocalLayerShowAction(true); store.setlocalLayerListAction(res); this.instance = new PoiLayerConstructor({ data: { list: res } }); this.instance.$mount(); this.divPoint = sgworld.Creator.createDivPoint( "", { lon: res.lon, lat: res.lat, height: 50 }, { type: "custom", offset: ["c", 100], description: this.instance.$el, near: 0, far: 100000 } ); this.position = window.Viewer.entities.add({ name: "FLYToMap", position: Cesium.Cartesian3.fromDegrees(res.lon, res.lat, 0), point: { pixelSize: 1, color: Cesium.Color.WHITE.withAlpha(0), outlineColor: Cesium.Color.WHITE.withAlpha(0.9), outlineWidth: 1 } }); window.Viewer.flyTo(this.position, { offset: { heading: Cesium.Math.toRadians(-200), pitch: Cesium.Math.toRadians(-45), range: this.pointrange }, duration: 3 }); setTimeout(() => { window.Viewer.entities.remove(this.position); }, 1000); setTimeout(() => { this.setPointFly(res); }, 4000); }, setflyExtent(res) { if (this.unsubscribeTicks) { window.Viewer.clock.onTick.removeEventListener(this.unsubscribeTicks); this.unsubscribeTicks = null; } // 相机看点的角度,如果大于0那么则是从地底往上看,所以要为负值 var pitch = Cesium.Math.toRadians(this.pitchValue); // 时间间隔2秒钟 this.setExtentTime(res[this.marksIndex].flytime); var Exection = () => { var preIndex = this.marksIndex - 1; if (this.marksIndex == 0) { preIndex = res.length - 1; } var heading = this.bearing( res[preIndex].lat, res[preIndex].lng, res[this.marksIndex].lat, res[this.marksIndex].lng ); heading = Cesium.Math.toRadians(heading); // 当前已经过去的时间,单位s var delTime = Cesium.JulianDate.secondsDifference( window.Viewer.clock.currentTime, window.Viewer.clock.startTime ); var originLat = this.marksIndex == 0 ? res[res.length - 1].lat : res[this.marksIndex - 1].lat; var originLng = this.marksIndex == 0 ? res[res.length - 1].lng : res[this.marksIndex - 1].lng; var endPosition = Cesium.Cartesian3.fromDegrees( originLng + ((res[this.marksIndex].lng - originLng) / res[this.marksIndex].flytime) * delTime, originLat + ((res[this.marksIndex].lat - originLat) / res[this.marksIndex].flytime) * delTime, res[this.marksIndex].height ); console.log(1, pitch); window.Viewer.scene.camera.setView({ destination: endPosition, orientation: { heading: heading, pitch: Cesium.Math.toRadians(-5) } }); if ( Cesium.JulianDate.compare( window.Viewer.clock.currentTime, window.Viewer.clock.stopTime ) >= 0 ) { this.unsubscribeTicks = window.Viewer.clock.onTick.removeEventListener( Exection ); this.changeCameraHeading(res); } }; window.Viewer.clock.onTick.addEventListener(Exection); }, setPointFly(res) { var that = this; that.pointerFly = window.sgworld.Analysis.setPointFly({ position: Cesium.Cartesian3.fromDegrees(res.lon, res.lat, 200), hideImage: true, time: 120, limitTime: true, limitAngel: 120, end: () => { that.pointerFly = null; } }); setTimeout(() => { this.setClearPointFly(); }, 8000); }, changeCameraHeading(res) { var nextIndex = this.marksIndex + 1; if (this.marksIndex == res.length - 1) { if (this.unsubscribeTicks) { window.Viewer.clock.onTick.removeEventListener(this.unsubscribeTicks); this.unsubscribeTicks = null; } return; } // 计算两点之间的方向 var heading = this.bearing( res[this.marksIndex].lat, res[this.marksIndex].lng, res[nextIndex].lat, res[nextIndex].lng ); // 相机看点的角度,如果大于0那么则是从地底往上看,所以要为负值 var pitch = Cesium.Math.toRadians(this.pitchValue); // 给定飞行一周所需时间,比如10s, 那么每秒转动度数 var angle = (heading - Cesium.Math.toDegrees(window.Viewer.camera.heading)) / 2; // 时间间隔2秒钟 this.setExtentTime(2); // 相机的当前heading var initialHeading = window.Viewer.camera.heading; var Exection = () => { // 当前已经过去的时间,单位s var delTime = Cesium.JulianDate.secondsDifference( window.Viewer.clock.currentTime, window.Viewer.clock.startTime ); var heading = Cesium.Math.toRadians(delTime * angle) + initialHeading; window.Viewer.scene.camera.setView({ orientation: { heading: heading, pitch: Cesium.Math.toRadians(-5) } }); if ( Cesium.JulianDate.compare( window.Viewer.clock.currentTime, window.Viewer.clock.stopTime ) >= 0 ) { window.Viewer.clock.onTick.removeEventListener(Exection); this.marksIndex = ++this.marksIndex >= res.length ? 0 : this.marksIndex; this.setflyExtent(res); } }; window.Viewer.clock.onTick.addEventListener(Exection); }, bearing(startLat, startLng, destLat, destLng) { startLat = this.toRadians(startLat); startLng = this.toRadians(startLng); destLat = this.toRadians(destLat); destLng = this.toRadians(destLng); let y = Math.sin(destLng - startLng) * Math.cos(destLat); let x = Math.cos(startLat) * Math.sin(destLat) - Math.sin(startLat) * Math.cos(destLat) * Math.cos(destLng - startLng); let brng = Math.atan2(y, x); let brngDgr = this.toDegrees(brng); return (brngDgr + 360) % 360; }, toRadians(degrees) { return (degrees * Math.PI) / 180; }, toDegrees(radians) { return (radians * 180) / Math.PI; }, setExtentTime(time) { var startTime = Cesium.JulianDate.fromDate(new Date()); var stopTime = Cesium.JulianDate.addSeconds( startTime, time, new Cesium.JulianDate() ); window.Viewer.clock.startTime = startTime.clone(); // 开始时间 window.Viewer.clock.stopTime = stopTime.clone(); // 结速时间 window.Viewer.clock.currentTime = startTime.clone(); // 当前时间 window.Viewer.clock.clockRange = Cesium.ClockRange.CLAMPED; // 行为方式 window.Viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK; // 时钟设置为当前系统时间; 忽略所有其他设置。 }, setShowPathLine(res) { var geom = []; for (var i in res) { geom.push([res[i].lng, res[i].lat]); } var url = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "LineString", coordinates: geom } } ] }; this.pathLayer = window.sgworld.Creator.createPathLayer({ url: url, color: "#0033FF", //线的颜色 width: 4.0, //线的宽度 pointColor: "#FFFFFF", //移动点的颜色 speed: 5, far: 50000 }); }, //结束事件 setClearAllMsg() { if (this.divPoint) { this.divPoint && this.divPoint.deleteObject(); this.divPoint = null; } if (this.instance) { this.instance && this.instance.$destroy(); this.instance = null; } //地块 this.setLacationLineClear() // 轨迹线 this.setClosePathLine(); // 漫游 this.setCloseLineRomaing(); //定点漫游 this.setClearPointFly(); vueEvents.$emit("queryLayer", false); }, setLacationLineClear() { if (this.lacationLine) { Viewer.entities.remove(this.lacationLine) this.lacationLine = null; } }, setClearPointFly() { if (this.pointerFly) { this.pointerFly && this.pointerFly.end(); this.pointerFly = null; } }, setCloseLineRomaing() { if (this.LineRoaming) { this.LineRoaming && this.LineRoaming.exit(); this.LineRoaming = null; } }, setClosePathLine() { if (this.pathLayer) { this.pathLayer && this.pathLayer.deleteObject(); } } }; export default rpc;