北京经济技术开发区经开区虚拟城市项目-【前端】--政府服务中心-1号屏Web
Surpriseplus
2023-10-10 1d0db2268bc114753f1f2b0fce056cfbaf519a64
src/assets/js/rpc.js
@@ -2,16 +2,10 @@
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 = {
window.rpc = {
    timeout: 500,
    url: "http://localhost:8999/RPC2",
    method: "get_statue",
    divPoint: null,
    instance: null,
@@ -19,497 +13,85 @@
    position: null,
    marksIndex: null,
    pitchValue: null,
    unsubscribeTicks: null,
    LineRoaming: null, //线路漫游
    dataQuery: [], //关键字查询结果
    pointerFly: null, //定点漫游
    isShow: false,
    objArr: [],
    //关键字查询
    getFuzzyQuery(res) {
        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 = [];
            for (var i = 0; i < length; i++) {
                var world = keyWorld[i].word;
                console.log("world", world);
                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 = [];
            //企v业
            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].candidates.filter(item => {
                return item.attributes.YQmingchen.includes(res);
            });
            YQArr.forEach(val => {
                let itemObj = {
                    type: "园区",
                    name: val.attributes.YQmingchen,
                    address: val.attributes.YQdizhi,
                    lon: val.location.x,
                    lat: val.location.y
                };
                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);
    //消息对接
    initMessage() {
        var that = this;
        window.addEventListener("message", res => {
            if (res.data.status === "ok") {
                console.log(res.data.params, "当前事件数据");
                // that.setLocation();
            }
        });
    },
    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;
        // 划线
        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({
                        x: parseFloat(point[0]),
                        y: parseFloat(point[1]),
                        z: 0
                    });
                }
                if (that.lacationLine) {
                    sgworld.Creator.DeleteObject(that.lacationLine);
                    that.lacationLine = null;
                }
                that.lacationLine = sgworld.Creator.createPolyline(
                    geometry,
                    "#ff0000",
                    1,
                    0,
                    "线"
                );
            }
        });
    },
    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
                "x": data.lng,
                "y": data.lat, "z": data.alt
            },
            orientation: {
                heading: data.heading,
                pitch: data.pitch,
                roll: data.roll
                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 = 75;
            data.speed = 25;
            that.LineRoaming = sgworld.Creator.createDynamicObject(
                data,
                null,
                res => {
                    if (res.time >= res.Totaltime) {
                        that.setCloseLineRomaing();
                        that.setMapRest();
                    }
                }
            );
            duration: 5, //飞行时间8s
        });
    },
    //点击获取坐标
    clickToCoordinates() {
        const handlerClick = new Cesium.ScreenSpaceEventHandler(
            Viewer.scene.canvas
        );
        handlerClick.setInputAction(event => {
            let cartesian = Viewer.camera.pickEllipsoid(
                event.position,
                Viewer.scene.globe.ellipsoid
            );
        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("没有获取到坐标");
                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 });
                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) {
    setLocation() {
        var data = mapData.pointPop;
        var objdata = {
            name: res.name,
            address: res.address,
            area: res.area,
            code: res.code,
            lat: res.lat,
            lon: res.lon
            POITYPE: data.text,
            SSDW: data.text,
            LXR: data.text,
            DIZHI: res,
            lat: data.lat,
            lon: data.lng
        };
        //添加定位弹窗
        this.setAddPointLocation(objdata);
        //范围调用
        this.getLandmass(res);
        // //添加路径线
        // this.setShowPathLine(marks);
        // //飞行漫游
        // window.Viewer.scene.camera.flyTo({
        //     destination: Cesium.Cartesian3.fromDegrees(
        //         marks[0].lng,
        //         marks[0].lat,
        //         marks[0].height
        //     ), //定位坐标点,建议使用谷歌地球坐标位置无偏差
        //     duration: 7 //定位的时间间隔
        // });
        // this.marksIndex = 1;
        // this.pitchValue = -20;
        // setTimeout(() => {
        //     this.setflyExtent(marks);
        // }, 7000);
    },
    setAddPointLocation(res) {
        // 清除方法
        this.setClearPathlayer();
        store.setlocalLayerShowAction(false);
        store.setlocalLayerListAction({});
        store.setlocalLayerShowAction(true);
@@ -537,7 +119,7 @@
        );
        this.position = window.Viewer.entities.add({
            name: "FLYToMap",
            position: Cesium.Cartesian3.fromDegrees(res.lon, res.lat, 200),
            position: Cesium.Cartesian3.fromDegrees(objdata.lon, objdata.lat),
            point: {
                pixelSize: 1,
                color: Cesium.Color.WHITE.withAlpha(0),
@@ -549,22 +131,15 @@
            offset: {
                heading: Cesium.Math.toRadians(0.0),
                pitch: Cesium.Math.toRadians(-45),
                range: 700
            },
            duration: 3
                range: 600
            }
        });
        setTimeout(() => {
            window.Viewer.entities.remove(this.position);
            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秒钟
@@ -606,13 +181,13 @@
                res[this.marksIndex].height
            );
            console.log(1, pitch);
            console.log(1, pitch)
            window.Viewer.scene.camera.setView({
                destination: endPosition,
                orientation: {
                    heading: heading,
                    pitch: Cesium.Math.toRadians(-5)
                }
                    pitch: Cesium.Math.toRadians(-5),
                },
            });
            if (
                Cesium.JulianDate.compare(
@@ -620,38 +195,30 @@
                    window.Viewer.clock.stopTime
                ) >= 0
            ) {
                this.unsubscribeTicks = window.Viewer.clock.onTick.removeEventListener(
                    Exection
                );
                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();
        }, 5000);
    setPointFly() {
        var alll
            = { lng: 116.802948, lat: 36.550064, height: 100, flytime: 15 }
        window.sgworld.Analysis.setPointFly({
            position: Cesium.Cartesian3.fromDegrees(alll.lng, alll.lat, 50),
            hideImage: false
        })
    },
    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;
            // 漫游完成
            this.setPointFly(res);
            return
        }
        // 计算两点之间的方向
        var heading = this.bearing(
@@ -679,8 +246,8 @@
            window.Viewer.scene.camera.setView({
                orientation: {
                    heading: heading,
                    pitch: Cesium.Math.toRadians(-5)
                }
                    pitch: Cesium.Math.toRadians(-5),
                },
            });
            if (
                Cesium.JulianDate.compare(
@@ -715,6 +282,8 @@
    toDegrees(radians) {
        return (radians * 180) / Math.PI;
    },
    setExtentTime(time) {
        var startTime = Cesium.JulianDate.fromDate(new Date());
        var stopTime = Cesium.JulianDate.addSeconds(
@@ -755,8 +324,8 @@
            far: 50000
        });
    },
    //结束事件
    setClearAllMsg() {
    setClearPathlayer() {
        if (this.divPoint) {
            this.divPoint && this.divPoint.deleteObject();
            this.divPoint = null;
@@ -765,34 +334,13 @@
            this.instance && this.instance.$destroy();
            this.instance = null;
        }
        if (this.lacationLine) {
            sgworld.Creator.DeleteObject(this.lacationLine);
            this.lacationLine = null;
        }
        // 轨迹线
        this.setClosePathLine();
        // 漫游
        this.setCloseLineRomaing();
        //定点漫游
        this.setClearPointFly();
        vueEvents.$emit("queryLayer", false);
    },
    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();
        }
        if (this.position) {
            window.Viewer.entities.remove(this.position);
            this.position = null;
        }
    }
};
export default rpc;