Cesium绘制矩形

var viewer = new Cesium.Viewer(‘cesiumContainer’, {

selectionIndicator: false,

infoBox: false,

// 注释时相当于使用默认地形,解开注释相当于使用全球地形

terrainProvider: Cesium.createWorldTerrain()

});

var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);

//双击鼠标左键清除默认事件

viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

//绘制点

function createPoint(worldPosition) {

var point = viewer.entities.add({

    position: worldPosition,

    point: {

        color: Cesium.Color.WHITE,

        pixelSize: 5,

        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND

    }

});

return point;

}

//初始化为线

var drawingMode = ‘line’;

//绘制图形

function drawShape(positionData) {

var shape;

if (drawingMode === ‘rectangle’) {

    //当positionData为数组时绘制最终图,如果为function则绘制动态图

    var arr = typeof positionData.getValue === 'function' ? positionData.getValue(0) : positionData;

    shape = viewer.entities.add({

        name: 'Blue translucent, rotated, and extruded ellipse with outline',

        rectangle : {

            coordinates :  new Cesium.CallbackProperty(function () {

                var obj=Cesium.Rectangle.fromCartesianArray(arr);

                //if(obj.west==obj.east){ obj.east+=0.000001};

                //if(obj.south==obj.north){obj.north+=0.000001};

                return obj;

            }, false),

            material : Cesium.Color.RED.withAlpha(0.5)

        }

    });

}

return shape;

}

var we=[];

var ns=[];

//鼠标左键

handler.setInputAction(function (event) {

// 我们在这里使用“viewer.scene.pickPosition”而不是“viewer.camera.pick椭球体”

// 我们在地形上移动时得到了正确的点。

var earthPosition = viewer.scene.pickPosition(event.position);

// `如果我们的鼠标不在地球上,地球位置将是不确定的

if (Cesium.defined(earthPosition)) {

    if (activeShapePoints.length === 0) {

        floatingPoint = createPoint(earthPosition);

        activeShapePoints.push(earthPosition);

        var dynamicPositions = new Cesium.CallbackProperty(function () {

            return activeShapePoints;

        }, false);

        activeShape = drawShape(dynamicPositions);//绘制动态图

    }

    activeShapePoints.push(earthPosition);

    createPoint(earthPosition);

    console.log(earthPosition,"笛卡尔");

    //将笛卡尔坐标转换为地理坐标

     var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(earthPosition);

     //将弧度转为度的十进制度表示

     var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);

     var  latitudeString = Cesium.Math.toDegrees(cartographic.latitude);

    we.push(longitudeString);

    ns.push(latitudeString);

     //获取相机高度

     var height = Math.ceil(viewer.camera.positionCartographic.height);

     console.log( '(' + longitudeString + ', ' + latitudeString + "," + height + ')弧度' );

     ns.sort(function (a, b) {

      return a-b;

    });

    we.sort(function (a, b) {

      return a-b;

    });

    var east = we[0];  

    var west = we[we.length - 1];         

    var south = ns[0];  

    var north = ns[ns.length - 1];  

     console.log(we,east,west);console.log(ns,south,north); 

}

}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

//鼠标移动

handler.setInputAction(function (event) {

if (Cesium.defined(floatingPoint)) {

    var newPosition = viewer.scene.pickPosition(event.endPosition);

    if (Cesium.defined(newPosition)) {

        floatingPoint.position.setValue(newPosition);

        activeShapePoints.pop();

        activeShapePoints.push(newPosition);

    }

}

}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

// 重新绘制形状,使其不是动态的,然后删除动态形状

function terminateShape() {

activeShapePoints.pop();//去除最后一个动态点

if(activeShapePoints.length){

   drawShape(activeShapePoints);//绘制最终图

}

viewer.entities.remove(floatingPoint);//去除动态点图形(当前鼠标点)

viewer.entities.remove(activeShape);//去除动态图形

floatingPoint = undefined;

activeShape = undefined;

activeShapePoints = [];

}

handler.setInputAction(function (event) {

terminateShape();

}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

var options = [ {

text: 'Draw Rectangle',

onselect: function () {
要实现cesium动态绘制矩形,可以使用Cesium的Primitive API和MouseEvents。具体步骤如下: 1. 创建矩形entity并添加到场景中。 ``` var entity = viewer.entities.add({ rectangle: { coordinates: Cesium.Rectangle.fromDegrees(-100.0, 20.0, -90.0, 30.0), material: Cesium.Color.RED.withAlpha(0.5), outline: true, outlineColor: Cesium.Color.BLACK } }); ``` 2. 获取鼠标左键按下和移动事件,并更新矩形坐标。 ``` var startPosition; var mouseHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); mouseHandler.setInputAction(function(movement) { startPosition = movement.position; }, Cesium.ScreenSpaceEventType.LEFT_DOWN); mouseHandler.setInputAction(function(movement) { if (Cesium.defined(startPosition)) { var endPosition = movement.position; var startCartesian = viewer.scene.camera.pickEllipsoid(startPosition, viewer.scene.globe.ellipsoid); var endCartesian = viewer.scene.camera.pickEllipsoid(endPosition, viewer.scene.globe.ellipsoid); if (Cesium.defined(startCartesian) && Cesium.defined(endCartesian)) { var startCartographic = Cesium.Cartographic.fromCartesian(startCartesian); var endCartographic = Cesium.Cartographic.fromCartesian(endCartesian); var west = Math.min(startCartographic.longitude, endCartographic.longitude); var east = Math.max(startCartographic.longitude, endCartographic.longitude); var south = Math.min(startCartographic.latitude, endCartographic.latitude); var north = Math.max(startCartographic.latitude, endCartographic.latitude); entity.rectangle.coordinates = Cesium.Rectangle.fromDegrees(west, south, east, north); } } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); ``` 3. 获取鼠标左键松开事件,结束矩形绘制。 ``` mouseHandler.setInputAction(function(movement) { startPosition = undefined; }, Cesium.ScreenSpaceEventType.LEFT_UP); ``` 这样,当用户按下鼠标左键并移动时,就可以动态绘制矩形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值