zoukankan      html  css  js  c++  java
  • 二三维联动

    前端界面:

    JS代码:

       
    //点击进行二三维联动
    function esMapAs() {
        $("#cesiumContainer").css('width','47%');
        $("#mapContainer").css('width','47%');
        $("#mapContainer").css('left','53%');
        $("#toolbar2").css('display','block');
        $("#mapContainer").css('z-index', '1');
        $("#cesiumContainer").css('z-index', '1');
        $("#cesiumContainer").css('opacity', '1');
        $("#mapContainer").css('opacity', '1');
        $("#hideValue").val("as23D");
        setTimeout(mapenlarge, 1);
        }
        
        // 二维联动三维
        mapPan=function () {
            // 添加地图监听事件
            baseLayer.events.on({"moveend": MaptoScene});
                 // 移除场景鼠标事件
                 handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
                 handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL);
    
        };
        // 三维联动二维
       scenePan =function () {
            // 注销地图监听事件
           baseLayer.events.unregister("moveend", undefined, MaptoScene);
           handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
           handler.setInputAction(function(movement) {
           var camera=viewer.scene.camera;
           var cameraPosiion=camera.position;
           var cartographic = Cesium.Cartographic.fromCartesian(cameraPosiion);
            var longitude = Cesium.Math.toDegrees(cartographic.longitude);
            var latitude = Cesium.Math.toDegrees(cartographic.latitude);
            var height = cartographic.height;
            var size = _calculateSizeFromAltitude(height);
            size = size * 0.5;
           // 设置地图显示范围
           var bounds = new SuperMap.Bounds(longitude - size, latitude - size, longitude + size, latitude + size);
           map.zoomToExtent(bounds, false);
       }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
       // 添加场景鼠标事件
       handler.setInputAction(function(movement) {
           var camera=viewer.scene.camera;
           var cameraPosiion=camera.position;
           var cartographic = Cesium.Cartographic.fromCartesian(cameraPosiion);
            var longitude = Cesium.Math.toDegrees(cartographic.longitude);
            var latitude = Cesium.Math.toDegrees(cartographic.latitude);
            var height = cartographic.height;
            var size = _calculateSizeFromAltitude(height);
            size = size * 0.5;
           // 设置地图显示范围
           var bounds = new SuperMap.Bounds(longitude - size, latitude - size, longitude + size, latitude + size);
           map.zoomToExtent(bounds, false);
       }, Cesium.ScreenSpaceEventType.WHEEL);
        };
        function MaptoScene() {
            // 获取当前地图范围
            var bounds = map.getExtent();
            // 根据给定的地图范围计算场景的高度
            var altitude = _calculateAltitudeFromBounds(bounds);
            // 获取地图中心点
            var center = map.getCenter();
            // 设置场景相机
            viewer.scene.camera.setView({
               destination : new Cesium.Cartesian3.fromDegrees(center.lon, center.lat, altitude)
           });
        
        }
    
    
    // 二维map的viewBoundsChanged事件的回调函数
    function viewBoundsChangedHandler() {
    
    var viewBounds = map.get_viewBounds();
    var altitude = _calculateAltitudeFromBounds(viewBounds);
    var camera = sceneControl.get_scene().get_camera();
    camera.set_altitude(altitude);
    sceneControl.get_scene().set_camera(camera);
    }
    
    // / <summary>
    // / 根据给定的地图范围计算场景的高度
    // / </summary>
    // / <param name="bounds">地图范围</param>
    // / <returns>场景高度</returns>
    function _calculateAltitudeFromBounds(bounds) {
    var _PI = 3.1415926;
    var _earthRadius = 6378137;
    var altitude = _earthRadius;
    var boundsWidth = bounds.right - bounds.left;
    if (boundsWidth >= 120) {
    altitude = _earthRadius * boundsWidth / 60 - _earthRadius;
    }
    else if (boundsWidth != 0) {
    var angle1 = (boundsWidth / 360) * _PI;
    var height = Math.sin(angle1) * _earthRadius;
    var a = height / Math.tan(angle1);
    var b = height / Math.tan(_PI / 6);
    altitude = a + b - _earthRadius;
    }
    return altitude;
    }
    
    
    // / <summary>
    // / 根据给定的场景高度计算地图中显示范围的宽度
    // / </summary>
    // / <param name="altitude">场景高度</param>
    // / <returns>地图显示范围尺寸</returns>
    function _calculateSizeFromAltitude(altitude) {
    var _PI = 3.1415926;
    var _earthRadius = 6378137;
    var size;
    if (altitude >= _earthRadius) {// 当场景高度大于可全幅显示整球的高度时
    var ratio = (altitude + _earthRadius) * 0.5;
    size = 120 * ratio / _earthRadius
    }
    else {// 当场景高度小于可全幅显示整球的高度时,即无法看到整球时
    var tan30 = Math.tan(_PI / 6);
    // 设置方程组的a,b,c
    var a = (Math.pow(tan30, 2) + 1) * Math.pow(_earthRadius, 2);
    var b = -2 * (_earthRadius + altitude) * _earthRadius * Math.pow(tan30, 2);
    var c = Math.pow(tan30, 2) * Math.pow(_earthRadius + altitude, 2) - Math.pow(_earthRadius, 2.0);
    // 解一元二次方程,取锐角,因此余弦值较大
    var cosd = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
    var d = Math.acos(cosd);
    var widthd = 2 * d * _earthRadius;
    size = (widthd / (_PI * _earthRadius)) * 180;
    }
    return size;
    }
  • 相关阅读:
    POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)
    UVaLive 5031 Graph and Queries (Treap)
    Uva 11996 Jewel Magic (Splay)
    HYSBZ
    POJ 3580 SuperMemo (Splay 区间更新、翻转、循环右移,插入,删除,查询)
    HDU 1890 Robotic Sort (Splay 区间翻转)
    【转】ACM中java的使用
    HDU 4267 A Simple Problem with Integers (树状数组)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4417 Super Mario (树状数组/线段树)
  • 原文地址:https://www.cnblogs.com/wanlige/p/12627349.html
Copyright © 2011-2022 走看看