Ceiusm中点计算椭圆缓冲区 并合并成 包络

通过坐标点 半径生成椭圆


/** 根据经度、纬度、椭圆半径1、椭圆半径2、旋转角度 生成椭圆坐标数组
 * @param x0 longitude
 * @param y0 latutide
 * @param radius1 x 轴半径 米
 * @param radius2 y 轴半径 米
 * @param route 角度
 * @returns 
 */
function computeCircle(x0: number, y0: number, radius1: number, radius2: number, route: number) {
  var positions = [];
  let dx = Math.PI * 2 * 6371000
  const r1 = radius1 * 360 / dx
  const r2 = radius2 * 360 / dx
  for (var i = 0; i <= 360; i++) {
    var radians = CesiumMath.toRadians(i);
    let x1 = x0 + r1 * Math.cos(radians)
    let y1 = y0 + r2 * Math.sin(radians)
    let theta = CesiumMath.toRadians(-route);
    let x = (x1 - x0) * Math.cos(theta) - (y1 - y0) * Math.sin(theta) + x0
    let y = (x1 - x0) * Math.sin(theta) + (y1 - y0) * Math.cos(theta) + y0
    positions.push([x, y]);
  }
  return positions;
}

turf 生成多边形多边形并计算合并图形

const createConvexHull = (points: Array<any>) => {
  let buffers: Array<any> = []
  points.forEach((point) => {
    let ps = computeCircle(point.longitude, point.latitude, point.radii[0], point.radii[1], point.rotation || 0)
    // var p = turf.point([point.longitude, point.latitude]);
    // var buffered = turf.buffer(p, point.radii[0] / 1000);
    buffers.push(turf.polygon([ps]));
  })
    if (buffers.length < 1) {
    return null
  } else if (buffers.length == 1) {
    buffers[0]
  } else {
    let p2 = buffers[buffers.length - 1]
    for (let i = 0; i < buffers.length - 1; i++) {
      let p1 = buffers[i]
      p2 = turf.union(p2, p1)
    }
    return p2
  }
}

cesium 绘制多边形图元图形

 //外包围
  let primitiveCollection = new PrimitiveCollection()
  let geojson = createConvexHull(points)
  if (geojson && geojson.geometry) {
    let instances: any = []
    let polygons = geojson.geometry.coordinates
    if (geojson.geometry.type == "MultiPolygon") {
      polygons.forEach((polygon: any) => {
        polygon.forEach((ring: any) => {
          const polygonArr = ring.toString().split(',')
          polygonArr.forEach((item: string, index: number) => {
            polygonArr[index] = parseFloat(item)
          })
          let instance = new GeometryInstance({
            geometry: new PolylineGeometry({
              positions: Cartesian3.fromDegreesArray(polygonArr),
              width: 2.5,
              vertexFormat: PolylineColorAppearance.VERTEX_FORMAT
            }),
            attributes: {
              color: ColorGeometryInstanceAttribute.fromColor(CesiumColor.fromCssColorString('#df2b2b'))
            }
          })
          instances.push(instance)
        })
      })
    } else if (geojson.geometry.type == "Polygon") {
      polygons.forEach((ring: any) => {
        const polygonArr = ring.toString().split(',')
        polygonArr.forEach((item: string, index: number) => {
          polygonArr[index] = parseFloat(item)
        })
        let instance = new GeometryInstance({
          geometry: new PolylineGeometry({
            positions: Cartesian3.fromDegreesArray(polygonArr),
            width: 2.5,
            vertexFormat: PolylineColorAppearance.VERTEX_FORMAT
          }),
          attributes: {
            color: ColorGeometryInstanceAttribute.fromColor(CesiumColor.fromCssColorString('#df2b2b'))
          }
        })
        instances.push(instance)
      })
    }
    let primitive = new Primitive({
      geometryInstances: instances,
      appearance: new PolylineColorAppearance({
        translucent: false,  //是否透明
      })
    })
    primitiveCollection.add(primitive)
    viewer.scene.primitives.add(primitiveCollection)
  }

效果图

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值