Cesium学习笔记11——坐标量测

点击球面位置,获取经纬度坐标和高程。

代码:

 1 var annotations;
 2 function axToolCoordinate(layer) {
 3     var handler=new  Cesium.ScreenSpaceEventHandler(viewer.canvas);
 4     annotations=viewer.scene.primitives.add( new Cesium.LabelCollection());
 5     handler.setInputAction(function (evt){
 6         var pickedObject=viewer.scene.pick(evt.position);
 7         if(viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)){
 8             var cartesian=viewr.scene.pickPosition(evt.position);
 9             if(Cesium.defined(cartesian))
10             {
11                 var cartographic=Cesium.Cartographic.fromCartesian(cartesian);
12                 var lng=Cesium.Math.toDegrees(cartographic.longitude);
13                 var lat=Cesium.Math.toDegrees(cartographic.latitude);
14                 var height=cartographic.height;
15                 annotate(cartesian,lng,lat,height);
16             }
17         }
18         else{
19             var ray=viewer.camera.getPickRay(evt.position);
20             var cartesian=viewer.scene.globe.pick(ray,viewer.scene);
21             if(Cesium.defined(cartesian)){
22                 var cartographic=Cesium.Cartographic.fromCartesian(cartesian);
23                 var lng=Cesium.Math.toDegrees(cartographic.longitude);
24                 var lat=Cesium.Math.toDegrees(cartographic.latitude);
25                 var height=cartographic.height;
26                 annotate(cartesian,lng,lat,height);
27             }
28         }
29     },Cesium.ScreenSpaceEventType.LEFT_CLICK);
30 
31     handler.setInputAction(function (){
32         viewer.entities.removeAll();
33         annotations.removeAll();
34     },Cesium.ScreenSpaceEventType.RIGHT_CLICK);
35 }
36 
37 function createPoint(worldPostion){
38     var point = viewer.entities.add({
39         position:worldPostion,
40         point:{
41             color:Cesium.Color.CRIMSON,
42             pixelSize:9,
43             outlineColor:Cesium.Color.ALICEBLUE,
44             outlineWidth:2,
45             disableDepthTestDistance:1000
46         }
47     });
48 }
49 
50 function annotate(cartesian,lng,lat, height){
51     createPoint (cartesian);
52     annotations.add({
53         position:cartesian,
54         text:
55         'Lon:'+lng.toFixed(5)+'\u00B0'+
56         '\nLat:'+lat.toFixed(5)+'\u00B0'+
57         '\nHeight:'+height.toFixed(2)+'m',
58         showBackground:true,
59         font:'22px monospace',
60         horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
61         verticalOrigin: Cesium.VerticalOrigin.Bottom,
62         disableDepthTestDiatane:Number.POSITIVE_INFINITY
63     });
64 }

 因为handle的作用域问题,为了实现其他的鼠标事件,需要将窗口事件管理器变量提前,增加清除事件命令,并修改代码:

 1 var annotations;
 2 function axToolCoordinate(layer) {
 3     if(handler==null){
 4         handler=new  Cesium.ScreenSpaceEventHandler(viewer.canvas);
 5     }
 6     
 7     annotations=viewer.scene.primitives.add( new Cesium.LabelCollection());
 8     handler.setInputAction(function (evt){
 9         var pickedObject=viewer.scene.pick(evt.position);
10         if(viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)){
11             var cartesian=viewr.scene.pickPosition(evt.position);
12             if(Cesium.defined(cartesian))
13             {
14                 var cartographic=Cesium.Cartographic.fromCartesian(cartesian);
15                 var lng=Cesium.Math.toDegrees(cartographic.longitude);
16                 var lat=Cesium.Math.toDegrees(cartographic.latitude);
17                 var height=cartographic.height;
18                 annotate(cartesian,lng,lat,height);
19             }
20         }
21         else{
22             var ray=viewer.camera.getPickRay(evt.position);
23             var cartesian=viewer.scene.globe.pick(ray,viewer.scene);
24             if(Cesium.defined(cartesian)){
25                 var cartographic=Cesium.Cartographic.fromCartesian(cartesian);
26                 var lng=Cesium.Math.toDegrees(cartographic.longitude);
27                 var lat=Cesium.Math.toDegrees(cartographic.latitude);
28                 var height=cartographic.height;
29                 annotate(cartesian,lng,lat,height);
30             }
31         }
32     },Cesium.ScreenSpaceEventType.LEFT_CLICK);
33 
34     handler.setInputAction(function (){
35         viewer.entities.removeAll();
36         annotations.removeAll();
37     },Cesium.ScreenSpaceEventType.RIGHT_CLICK);
38 }
39 
40 function createPoint(worldPostion){
41     var point = viewer.entities.add({
42         position:worldPostion,
43         point:{
44             color:Cesium.Color.CRIMSON,
45             pixelSize:9,
46             outlineColor:Cesium.Color.ALICEBLUE,
47             outlineWidth:2,
48             disableDepthTestDistance:1000
49         }
50     });
51 }
52 
53 function annotate(cartesian,lng,lat, height){
54     createPoint (cartesian);
55     annotations.add({
56         position:cartesian,
57         text:
58         'Lon:'+lng.toFixed(5)+'\u00B0'+
59         '\nLat:'+lat.toFixed(5)+'\u00B0'+
60         '\nHeight:'+height.toFixed(2)+'m',
61         showBackground:true,
62         font:'22px monospace',
63         horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
64         verticalOrigin: Cesium.VerticalOrigin.Bottom,
65         disableDepthTestDiatane:Number.POSITIVE_INFINITY
66     });
67 }

清除绘制:

function destroy()
{
    viewer.entities.removeAll();
    if (handler) {
        handler.destroy();
        handler = null;
    }
}

 

posted @ 2023-12-13 17:46  太一吾鱼水  阅读(49)  评论(0编辑  收藏  举报