对于二三维联动,有多种方法进行实现,当时旧项目使用了当时能掌握的一种写法,在技能提升了这么多后当然要对这些写法做一个总结。
一、通过监听View上的鼠标事件变化来进行分屏联动(同一坐标系)
(同理可以用此方法进行二三维联动)
前期工作,简单创建了四个View:
(已经不再是当时那种小白,建4个View写4遍var view = new MapView(),想想真丢人)
var views = [] //根据需要来创建多个视图并绑定地图容器div的id for (var i = 0; i < 4; i++) { var view = new MapView({ map: map, container: 'map_' + i }) views.push(view); }
接下来就是多屏联动的功能了:
on('load', function () { views && views.forEach(function (view) { //定义一个范围变量 var fullextent = null; //设置鼠标滚轮事件 view.on("mouse-wheel", function (e) { //延迟获取范围的函数 window.setTimeout(function () { //获取操作图层的范围 fullextent = view.extent //遍历所有视图来设置这个范围 views.forEach(function (nview) { nview.extent = fullextent }) }, 1000) }) //设置鼠标拖拽事件 view.on("drag", function (e) { //获取操作图层的范围 fullextent = view.extent //遍历所有视图来设置这个范围 views.forEach(function (nview) { nview.extent = fullextent }) }) }) })
感觉代码简洁了好多,下面就是效果图了(虽然丑爆了,毕竟是简单记录一下嘛)。
二、通过控制放置View的DIV进行二三维联动(不同坐标系)
(同理可以用此方法进行分屏联动)
使用Jquery Easy UI插件,使用了tab选项卡,不同的选项卡放置了MapView和SceneView
<div id="tt" class="easyui-tabs"> <div id="mapDiv" title=" 二维地图" class="tab-page"></div> <div id="sceneDiv" title="三维地图" class="tab-page"></div> </div>
通过点击不同的选项卡进行联动
//绑定事件 $('#tt').tabs({ onSelect: function (title, index) { if (index == 0) { var params2Dto3D = new ProjectParameters({ geometries: [sceneView.extent], outSpatialReference: s2364 }); geometryService1.project(params2Dto3D).then(function (result) { mapView.extent = result[0] }) } else { var params3Dto2D = new ProjectParameters({ geometries: [mapView.extent], outSpatialReference: s4326 }); geometryService1.project(params3Dto2D).then(function (result) { sceneView.extent = result[0]; sceneViewlocal.extent = result[0]; }); //sceneViewlocal.clippingArea=xzqhLayer.fullExtent.expand(0.5); //即地图裁剪至xzqhLayer范围的一半。 //sceneViewlocal.extent = mapView.extent; //这种方式取决于地图坐标系相同 } } });