Cesium 介绍之 地图缩放监听 + 后端聚合点位实现

1,001 阅读1分钟

Cesium 介绍之 地图缩放监听 + 后端聚合点位实现

对于后端聚合接口需要在地图缩放后,获取当前可视范围后根据当前的边界值重新请求接口更新点位信息。

methods: {
    handleViewerScaling(viewer) {
        viewer && viewer.camera.moveEnd.addEventListener(this.onMoveEndMap);
    },
    async onMoveEndMap() {
        // 找到需要后端聚合接口的数据源
        const layerInfos = this.layerList.filter(v => v.WFS);
        // 待所有接口请求完成后
        layerInfos.map(async layerInfo => {
            const dataSource = this.layersMap.get(layerInfo.statusName);
            // 根据数据源和图层信息去请求接口更新点位
        });
    },
    // 获取当前视图的范围, 使用方式 const { left: x, top: y } = $("#cesiumContainer").offset(); getCurrentViewRange({ x , y });
    function getCurrentViewRange(lt_point) {
        const { cesiumViewer: viewer } = window;
        const extend = viewer.camera.computeViewRectangle();
        if (typeof extend === "undefined") {
            // 2D下会可能拾取不到坐标,extend返回undefined,所以做以下转换
            const canvas = viewer.scene.canvas;
            // canvas左上角坐标转2d坐标
            const upperLeft = new Cartesian2(lt_point.x, lt_point.y);
            const lowerRight = new Cartesian2(canvas.clientWidth, canvas.clientHeight);

            const ellipsoid = viewer.scene.globe.ellipsoid;
            // 2D转3D世界坐标
            const upperLeft3 = viewer.camera.pickEllipsoid(upperLeft, ellipsoid);
            const lowerRight3 = viewer.camera.pickEllipsoid(lowerRight, ellipsoid);
            // 3D世界坐标转弧度
            const upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(upperLeft3);
            const lowerRightCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(lowerRight3);
            // 弧度转经纬度
            const minx = Math.toDegrees(upperLeftCartographic.longitude);
            const maxx = Math.toDegrees(lowerRightCartographic.longitude);
            const miny = Math.toDegrees(lowerRightCartographic.latitude);
            const maxy = Math.toDegrees(upperLeftCartographic.latitude);
            return [minx, miny, maxx, maxy].join(",");
        } else {
            // 3D获取方式
            return [Math.toDegrees(extend.west), Math.toDegrees(extend.south), Math.toDegrees(extend.east), Math.toDegrees(extend.north)].join(",");
        }
    },
}