Cesium虚线圆

封装的方法

js 复制代码
import * as Cesium from 'cesium'

export interface DashedCircleOptions {
  width?: number
  segments?: number
  color?: Cesium.Color
  gapColor?: Cesium.Color
  dashLength?: number
  dashPattern?: number
  height?: number
}

export function addDashedCircle (
  viewer: Cesium.Viewer,
  lon: number,
  lat: number,
  radiusMeters: number,
  options: DashedCircleOptions = {}
): Cesium.Primitive | undefined {
  if (!viewer || !Number.isFinite(lon) || !Number.isFinite(lat) || !Number.isFinite(radiusMeters)) return

  const width = options.width ?? 2
  const segments = options.segments ?? 64
  const color = options.color ?? Cesium.Color.YELLOW
  const gapColor = options.gapColor ?? Cesium.Color.TRANSPARENT
  const dashLength = options.dashLength ?? 16.0
  const dashPattern = options.dashPattern ?? 255.0
  const height = options.height ?? 0

  const earthRadius = 6378137
  const latRad = Cesium.Math.toRadians(lat)

  const positions: Cesium.Cartesian3[] = []
  for (let k = 0; k <= segments; k++) {
    const a = (Math.PI * 2 * k) / segments
    const dx = Math.cos(a) * radiusMeters
    const dy = Math.sin(a) * radiusMeters
    const cLat = lat + (dy / earthRadius) * (180 / Math.PI)
    const cLon = lon + (dx / (earthRadius * Math.cos(latRad))) * (180 / Math.PI)
    positions.push(Cesium.Cartesian3.fromDegrees(cLon, cLat, height))
  }

  const polylineGeometry = new Cesium.PolylineGeometry({
    positions,
    width,
    vertexFormat: Cesium.PolylineMaterialAppearance.VERTEX_FORMAT,
    arcType: Cesium.ArcType.NONE,
  })

  const primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
      geometry: polylineGeometry,
    }),
    appearance: new Cesium.PolylineMaterialAppearance({
      material: new Cesium.Material({
        fabric: {
          type: 'PolylineDash',
          uniforms: {
            color,
            gapColor,
            dashLength,
            dashPattern,
          },
        },
      }),
    }),
    asynchronous: true,
  }))

  return primitive
}

调用

js 复制代码
    // 在目标位置绘制虚线圆
    addDashedCircle(viewer, newLon, newLat, 7000, {
      width: 2,
      segments: 128,
      color: Cesium.Color.CYAN,
      gapColor: Cesium.Color.TRANSPARENT,
      dashLength: 16,
      dashPattern: 255,
    })
相关推荐
MrGud17 小时前
Cesium中的坐标系及其转换
前端·cesium
该怎么办呢2 天前
packages\engine\Source\Core\Cartesian3.js
前端·javascript·cesium
该怎么办呢3 天前
Source/Core/Event.js
开发语言·javascript·ecmascript·cesium
该怎么办呢3 天前
cesium核心代码学习-01项目目录及其基本作用
前端·3d·源码·webgl·cesium·webgis
qq_283720055 天前
Cesium实战(三):加载天地图(影像图,注记图)避坑指南
json·gis·cesium
三维GIS那点事_王跃军5 天前
图新GIS云平台·SDK与Cesium的核心区别
cesium·数据格式转换·三维gis·图新gis云平台sdk·三维渲染引擎
GISBox5 天前
OSGB与3DTiles格式转换技术指南:从原理到实践
gis·cesium·倾斜摄影·3dtiles·osgb·gisbox·切片转换
李剑一5 天前
Cesium 海量点位不卡顿!图标动态聚合效果深度解析,看完直接抄代码!
前端·vue.js·cesium
李剑一6 天前
告别冗余代码!Cesium点位图标模糊、重叠?自适应参数调优攻略,一次封装终身复用!
前端·vue.js·cesium
小彭努力中6 天前
190.Vue3 + OpenLayers 实战:实现地图旋转移动动画 + CSS缩放动画(详解 animate 用法)
前端·css·openlayers·cesium·webgis