二三维联动

摘要:
=0){varangle1=(boundsWidth/360)*_PI;varheight=Math.sin(angle1)*_earthRadius;vara=height/Math.tan(angle1);varb=height/Math.tan(_PI/6);altitude=a+b-_earthRadius;}returnaltitude;}///˂su

前端界面:

二三维联动第1张

JS代码:

   
//点击进行二三维联动
functionesMapAs() {
    $("#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 = newCesium.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);
    };
    functionMaptoScene() {
        //获取当前地图范围
        var bounds =map.getExtent();
        //根据给定的地图范围计算场景的高度
        var altitude =_calculateAltitudeFromBounds(bounds);
        //获取地图中心点
        var center =map.getCenter();
        //设置场景相机
viewer.scene.camera.setView({
           destination : newCesium.Cartesian3.fromDegrees(center.lon, center.lat, altitude)
       });
    
    }


//二维map的viewBoundsChanged事件的回调函数
functionviewBoundsChangedHandler() {

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;
}
returnaltitude;
}


/// <summary>/// 根据给定的场景高度计算地图中显示范围的宽度/// </summary>/// <param name="altitude">场景高度</param>/// <returns>地图显示范围尺寸</returns>
function_calculateSizeFromAltitude(altitude) {
var _PI = 3.1415926;
var _earthRadius = 6378137;
varsize;
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;
}
returnsize;
}

免责声明:文章转载自《二三维联动》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】IO模型及select、poll、epoll和kqueue的区别【原创】主机不能访问虚拟机CentOS7中的站点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SVN图形管理工具-Submint

1.安装svn及相关依赖包 yum install subversion httpd mod_dav_svn apr-util-sqlite   2.下载submin wget https://supermind.nl/submin/current/submin-2.2.2-1.tar.gz tar zxvf submin-2.2.2-1.tar.g...

shell中各种括号的作用详解()、(())、[]、[[]]、{}

一、小括号,圆括号() 1、单小括号 ()   ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。   ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到...

javascript ES6 新特性之 Promise,ES7 async / await

es6 一经推出,Promise 就一直被大家所关注。那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向的调用,也就是链式调用。 我们先来看下面的代码: 1 function getData(){ 2 setTimeout(()=>{ 3...

es6 let

1.变量 var  function let const class import    定义变量的关键字 备注     不能忽略函数的形参      函数的私有变量 var     定义变量 var 定义变量能够提升但是不能定义  给window添加一个对应的属性 function    即可以提前声明     同时还定义了 定义:所谓的定义  就是给这...

获取用户当前位置信息的两种方法——H5、微信

在之前的调用百度地图API的总结中获取当前位置信息我用的是 H5 ,其实微信也提供了获取用户地理位置的方法,现将这两种方法都贴出来,看情况选择使用。 一、H5 获取当前地理位置得到经纬度    //H5 获取当前位置经纬度var location_lon = '',location_lat = ''; //经度,纬度if(navigator.geoloca...

jquery飘动的广告窗

看到网页中有一些广告窗口移动,自己就动手实现了一下。毕竟编程动手很重要 实现思路: 1,广告窗口移动就要开定时器,同时往窗口的x轴方向和y轴方向移动。当移动到可视区域范围边缘,又向 反方向移动。所以要对窗口广告的x和y轴分别做2次判断。是否到边界。到了边界,就改变运行速度, 反方向移动。 此广告窗口,我用的一张图片模拟。具体如下: html: <i...