cesium绘制点、线、面,坐标之间的转换

图形绘制

绘制

  const options = {
    show:true,
    color:Cesium.Color.WHITE,
    outlineWidth:10,
    outlineColor:Cesium.Color.BLUE,
  }
  let pointer = Cesium.Cartesian3.fromDegrees(-107.00,40.0,3.0);
  let point = viewer.entities.add({
    id:'pointer',
    name:"这是点",
    description:"pointer_这是点",
    position:pointer,
    point:options
  });
  viewer.zoomTo(point);

绘制 线 

let start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883,3000.0)
  let end = Cesium.Cartesian3.fromDegrees(-125.59777, 40.03883);
  viewer.entities.add({
    id:'line',
    name:"Line",
    description:"这是线",
    position:Cesium.Cartesian3.fromDegrees(-107.00,40.0,3.0),
    polyline:{
      show:true,
      positions:[start,end],
      material: Cesium.Color.RED,
      width:3
    }
  })
  viewer.camera.flyTo({
    destination:start,
    clampToGround:true,
    complete:()=>{
    },
    duration:3
  })

绘制

let start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883,3000.0)
let start1 = Cesium.Cartesian3.fromDegrees(-65.59777, 35.03883,3000.0)
let start2 = Cesium.Cartesian3.fromDegrees(-60.59777, 20.03883,3000.0)
let end = Cesium.Cartesian3.fromDegrees(-125.59777, 40.03883);
let polygon = viewer.entities.add({
    id:"polygon",
    name:"polygon",
    description:"这是面",
    position:Cesium.Cartesian3.fromDegrees(-107.00,40.0,3.0),
    polygon:{
      height:10,
      hierarchy:{
        positions:[start,start1,start2,end]
      },
      outline:true,
      material:Cesium.Color.fromCssColorString("#098").withAlpha(0.2),
      outlineColor:Cesium.Color.BLACK,
      arcType:Cesium.ShadowMode.CAST_ONLY
    }
  })
  viewer.zoomTo(polygon)

动态绘制线,绘制面也是相同的道理

let drawPolygonObj:any = null;
const drawLines = ()=>{
  let f = viewer.entities.getById('drawLinesObj');
  if(f){
    alert("当前id名的图像已存在")
  }
  drawPolygonObj  = viewer.entities.add({
    id:"drawLinesObj",
    name:"动态绘制的线",
    polyline:{
      material:Cesium.Color.BEIGE,
      arcType:Cesium.ArcType.GEODESIC
    }
  })
}

// 定义将点击的每个点保存起来
let arr:number[] = [];
const addEvent = ()=>{
  let handle = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
  // 添加右击方法
  handle.setInputAction((event)=>{
    let p = viewer.scene.pick(event.position);
    if(Cesium.defined(p)){
      console.log(p)
      // alert("右键事件触发,当前位置是:"+event.position.x+"和"+event.position.y)
    }
    if(drawPolygonObj){
      // 右击结束绘制,情况对象和数组
      arr = []
      drawPolygonObj = null;
    }
  },Cesium.ScreenSpaceEventType.RIGHT_CLICK)
  // 添加左击方法
  handle.setInputAction((event:any)=>{
    if(drawPolygonObj){
      // 屏幕坐标转经纬度,具体方法下面会有
      let jw = coverCoordinate(event.position)
      arr.push(Cesium.Cartesian3.fromDegrees(jw!.lon,jw!.lat))
      drawPolygonObj._position = arr[0];
      drawPolygonObj.polyline ? (drawPolygonObj.polyline.positions = arr) : (drawPolygonObj.polygon.hierarchy = {positions:arr});
    }
  },Cesium.ScreenSpaceEventType.LEFT_CLICK)
}

绘制 平面,并在平面中添加视频

  var videoElement = document.createElement('video');
  videoElement.src = 'http://localhost:8001/1.mp4'; // 替换为你的视频文件路径
  videoElement.loop = true; // 让视频循环播放
  videoElement.muted = true; // 设置视频静音(如果需要)
  videoElement.controls = true;
  videoElement.play(); // 播放视频
  viewer.entities.add({
    id:"plane",
    name:"视频牌",
    position:Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883,3000.0),
    plane:{
      material:videoElement,
      plane : Cesium.Plane.ORIGIN_ZX_PLANE,
      dimensions:Cesium.Cartesian2.fromElements(100,100),
      outlineColor:Cesium.Color.BLACK.withAlpha(0.6),
      outlineWidth:10
    }
  })
  viewer.camera.flyTo({
    destination:Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883,3000.0),
    clampToGround:true,
    complete:()=>{
    },
    duration:3
  })

绘制path路径,一般用于路径回放

// 数据源
let dataSource = [
  [117.46031867100001,31.143882499000003,11.147400000001653],
  [117.45946237800001,31.143739847000063,11.108399999997346],
  [117.45859906800001,31.143571198000075,10.890799999993761],
  [117.45789337300005,31.143422075000046,11.12170000000333],
  [117.45711196300001,31.143350937000037,11.545700000002398],
  [117.45620292500007,31.143325030000028,11.5298999999940867],
  [117.45545284400009,31.143363754000063,11.038100000005215],
  [117.45473256600008,31.143448056000068,10.86380000000645],
  [117.45399052200003,31.143623321000064,11.345600000000559],
  [117.45347615200001,31.143811356000007,11.687300000005052],
  [117.45292459000007,31.144031608000034,12.106100000004517],
  [117.45192097000006,31.144426226000064,12.842399999994086],
  [117.45065835500009,31.144954275000032,12.712299999999232],
  [117.44980033200011,31.145266268000057,12.504899999999907],
  [117.44943370300007,31.145413392000023,12.731599999999162],
  [117.44920128900003,31.145382554000037,12.967699999993783],
  [117.44897692800009,31.144980649000047,14.909599999999045],
  [117.44872415000009,31.144495984000006,14.558999999999383],
  [117.44851592000009,31.144125416000065,14.410999999992782],
  [117.44848024700002,31.143928280000007,14.4758000000001631],
  [117.44948683700011,31.143507935000006,14.5074000000022351],
  [117.45089297600009,31.142959855000072,14.290399999998044],
  [117.45149371900004,31.142693826000027,14.127099999997881],
  [117.45166848000008,31.142571364000048,15.526100000002771],
  [117.45163585200001,31.142433625000024,14.034100000000044],
  [117.45082070700005,31.140899211000033,13.2890999999945051],
  [117.45082070700005,31.140899211000033,13.289099999994505]
]
// 将数据源的每天数据转换为Cartesian3类型的对象
  let data = dataSource.map(item=>{
    return Cesium.Cartesian3.fromDegrees(item[0],item[1],item[2]);
  })

// 添加时间对象
  let property = new Cesium.SampledPositionProperty();
  let startTime = new Date();
  let time = startTime.getTime();
  let stopTime:Date = new Date();
  dataSource.forEach((item,index)=>{
    let date = new Date(time + index * 5000);
    stopTime = date;
    property.addSample(Cesium.JulianDate.fromDate(date),Cesium.Cartesian3.fromDegrees(item[0],item[1],item[2]));
  })
  
  property.setInterpolationOptions({
    interpolationDegree:0.0001,
    interpolationAlgorithm:Cesium.LagrangePolynomialApproximation
  })

// 先绘制一条线,等会就安装这条线的路径行走
  let ploygons = viewer.entities.add({
    id:"ploygon100",
    name:"这是多边形",
    position:Cesium.Cartesian3.fromDegrees(polygonData[0][0],polygonData[0][1],polygonData[0][2]),
    polygon:{
      hierarchy:{
        positions:polygonData.map(t=>Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]))
      },
      height:5,
      fill:true,
      extrudedHeight:60,
      material:Cesium.Color.RED.withAlpha(0.4),
      arcType:Cesium.ArcType.GEODESIC
    }
  })
// 绘制回放线
  let ent = viewer.entities.add({
    id:"path01",
    name:"回放线",
    availability : new Cesium.TimeIntervalCollection([
      new Cesium.TimeInterval({
        start:Cesium.JulianDate.fromDate(startTime),
        stop:Cesium.JulianDate.fromDate(stopTime)
      })
    ]),
    position:property,
    orientation:new Cesium.VelocityOrientationProperty(property), // 控制模型的转向
    model:{
      uri:"http://localhost:80/dragon.gltf",
      clampAnimations:true,
      minimumPixelSize:70,
      maximumScale:70
    },
    label:{
      text:"",
      fillColor:Cesium.Color.RED,
      font:"12px 微软雅黑",

    },
    path:{
      leadTime:0,
      trailTime:1,
      material:new Cesium.ImageMaterialProperty({
        image:"http://localhost:8001/1.jpg"
      }),
      width:10
    },
  })

// 对时钟的onTick进行监听
viewer.clock.onTick.addEventListener((tick:any)=>{
    取出当前的大地坐标
    let p = ent.position.getValue(tick.currentTime);
    // 大地坐标转经纬度
    let cart = worldCoverLonLat(p);
    // 经纬度转屏幕坐标
    let posi = coverLonlatToEvent({lon:cart.longitude,lat:cart.latitude});
    let text = Number(cart.longitude).toFixed(6) +","+ Number(cart.latitude).toFixed(6);
    // 给正在移动的图形更改文字
    ent.label.text = text;

    // 视角实时跟随图形
    viewer.trackedEntity = ent;
    更新cesium当前的时间,调整为开始移动的时间
    viewer.clock.currentTime = Cesium.JulianDate.fromDate(startTime)
    viewer.clock.stopTime = Cesium.JulianDate.fromDate(stopTime)
    viewer.clock.clockRange = Cesium.ClockRange.CLAMPED;
    viewer.clock.shouldAnimate = true;

})

绘制可以旋转

// 声明初始的旋转角度
let rotate = 0;
let ellipse = viewer.entities.add({
    id:"addRatoteCircle",
    name:"添加的旋转圆",
    position:Cesium.Cartesian3.fromDegrees(116.46, 39.92),
    ellipse:{
      semiMinorAxis: 1000.0,
        semiMajorAxis: 1000.0,
        material: new Cesium.ImageMaterialProperty({
            image: 'http://localhost:8001/1.jpg'
      })
    }
  })
  viewer.zoomTo(ellipse)
  _setRotate()
  function _setRotate(){
    ellipse.ellipse.stRotation = new Cesium.CallbackProperty(function(){
      rotate+=1;
      if(rotate>=360){
        rotate = 0
      }
      return Cesium.Math.toRadians(rotate);  // 转弧度
    },false)
  }

删除 图形 

  // 通过cesium提供的getById方法找到指定图形,然后直接调用remove方法删除即可
  let polygon = viewer.entities.getById('point');
  viewer.entities.remove(polygon)
坐标转换
type PositionType = {
  x:number,
  y:number
}
type PositionResult = {
  lon:number,
  lat:number
}
// 屏幕坐标转经纬度
const coverCoordinate = (position:PositionType):PositionResult=>{
  if(!position) return;
    let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene);
    let ellipsoid = viewer.scene.globe.ellipsoid;
    let cartographic = ellipsoid.cartesianToCartographic(cartesian);
    let lon = Cesium.Math.toDegrees(cartographic.longitude);  // 经度
    let lat = Cesium.Math.toDegrees(cartographic.latitude);   // 纬度
    return {
      lon,lat
    }
}
// 经纬度转屏幕坐标
const coverLonlatToEvent = (position:PositionResult):PositionType=>{
  let c3 = Cesium.Cartesian3.fromDegrees(position.lon,position.lat);
   //笛卡尔坐标转屏幕坐标
  let c2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, c3);
  return {
    x:c2!.x,
    y:c2!.y
  }
}
// 世界大地坐标转经纬度
const worldCoverLonLat = (position:Cesium.Cartesian3)=>{
  var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
  cartographic.longitude = Cesium.Math.toDegrees(cartographic.longitude);
  cartographic.latitude = Cesium.Math.toDegrees(cartographic.latitude);
  return cartographic;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 SuperMap iClient 与 Cesium 结合的应用中,可以通过以下步骤绘制一个: 1. 将笛卡尔坐标转换为经纬度坐标系。可以使用 Cesium 中的 `Cesium.Cartographic.fromCartesian` 方法将笛卡尔坐标转换为经纬度坐标系。 2. 在 SuperMap 的 `VectorLayer` 中添加几何图形。可以先创建一个 `GeoRegion` 对象,然后通过 `add` 方法向其添加一个 `GeoRegionPart` 对象,最后将 `GeoRegion` 添加到 `VectorLayer` 中。 下是示例代码: ```javascript // 创建一个 GeoRegion 对象 var geoRegion = new SuperMap.Geometry.GeoRegion(); // 将笛卡尔坐标转换为经纬度坐标系,并添加到 GeoRegionPart 中 var positions = [...]; // 笛卡尔坐标系数组 for (var i = 0; i < positions.length; i++) { var position = positions[i]; var cartographic = Cesium.Cartographic.fromCartesian(position); var lon = Cesium.Math.toDegrees(cartographic.longitude); var lat = Cesium.Math.toDegrees(cartographic.latitude); var point = new SuperMap.Geometry.Point(lon, lat); geoRegion.addPart(point); } // 将 GeoRegion 添加到 VectorLayer 中 var vectorLayer = new SuperMap.Layer.Vector("vectorLayer"); vectorLayer.addFeatures(new SuperMap.Feature.Vector(geoRegion)); ``` 其中,`positions` 是一个笛卡尔坐标系数组,表示的各个顶的位置。在将其添加到 `GeoRegionPart` 中时,需要先将其转换为经纬度坐标系。 最后,将创建的 `VectorLayer` 添加到地图中即可看到绘制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值