casc-cesium
Version:
Vue 3.x components for CesiumJS.
1 lines • 70.2 kB
Source Map (JSON)
{"version":3,"file":"cesium-helpers.mjs","sources":["../../../../packages/utils/cesium-helpers.ts"],"sourcesContent":["import type {\n AnyFunction,\n Cartesian2Option,\n Cartesian3Option,\n Cartesian4Option,\n PolygonHierarchyOption,\n CartographicInDegreeOption,\n NearFarScalarOption,\n DistanceDisplayConditionOption,\n ColorInByteOption,\n MaterialOption,\n VcComponentInternalInstance,\n RectangleInDegreeOption,\n BoundingRectangleOption,\n PlaneOption,\n TranslationRotationScaleOption,\n VcCamera,\n HeadingPitchRollOption,\n CesiumAppearance,\n VcPosition,\n CesiumPosition,\n VcRectangle,\n CesiumRectangle,\n VcColor,\n CesiumColor,\n VcAppearance,\n CesiumDistanceDisplayCondition,\n VcDistanceDisplayCondition,\n VcCartesian2,\n CesiumCartesian2,\n CesiumCartesian3Array,\n VcCartesian3Array,\n VcCartesian2Array,\n CesiumCartesian2Array,\n CesiumNearFarScalar,\n VcNearFarScalar,\n VcPolygonHierarchy,\n CesiumPolygonHierarchy,\n VcMaterial,\n VcMaterialProperty,\n CesiumMaterialProperty,\n CesiumMaterial,\n VcBoundingRectangle,\n CesiumBoundingRectangle,\n VcHeadingPitchRoll,\n VcHeadingPitchRange,\n VcPlane,\n CesiumPlane\n} from './types'\nimport { hasOwn, isFunction, isArray, isString, isPlainObject, isEmptyObj, getObjClassName, isUndefined } from './util'\n\n/**\n * 将对象或数组转换为 Cesium.Cartesian2\n * @param {Object} val\n * @returns {Cartesian2 | CallbackProperty} 返回 Cartesian2 或者 CallbackProperty\n * @example\n * const options = [100, 100]\n * // const options = [x: 100, y: 100]\n * const position = makeCartesian2(options)\n */\nexport function makeCartesian2(val: VcCartesian2, isConstant = false): CesiumCartesian2 | undefined {\n const { Cartesian2, CallbackProperty } = Cesium\n\n if (val instanceof Cesium.Cartesian2 || val instanceof CallbackProperty) {\n return val\n }\n\n if (isPlainObject(val)) {\n if (hasOwn(val, 'x') && hasOwn(val, 'y')) {\n const value = val as Cartesian2Option\n return new Cartesian2(value.x, value.y)\n }\n }\n\n if (isArray(val)) {\n return new Cartesian2(val[0], val[1])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 将对象或者数组转换为 Cesium.Cartesian3\n * @param {Object} val 传入的对象或数组\n * @param {Boolean} isConstant 传入function时生效,true 代表回调 function 每时每刻都返回值, false 代表改变才会返回值。默认false。\n * @returns 返回 Cartesian3 或者 CallbackProperty\n * @example\n * const options = {\n * lng: 108,\n * lat: 35,\n * height: 1000\n * }\n * // const options = [108, 35, 1000]\n * const position = makeCartesian3 (options) // return Cesium.Cartesian3\n */\nexport function makeCartesian3(val: VcPosition, ellipsoid?: Cesium.Ellipsoid, isConstant = false): CesiumPosition | undefined {\n const {\n CallbackProperty,\n Cartesian3,\n Ellipsoid,\n SampledPositionProperty,\n CompositePositionProperty,\n ConstantPositionProperty,\n TimeIntervalCollectionPositionProperty\n } = Cesium\n\n if (\n val instanceof Cartesian3 ||\n val instanceof CallbackProperty ||\n val instanceof SampledPositionProperty ||\n val instanceof CompositePositionProperty ||\n val instanceof ConstantPositionProperty ||\n val instanceof TimeIntervalCollectionPositionProperty\n ) {\n return val\n }\n\n ellipsoid = ellipsoid || Ellipsoid.WGS84\n\n if (isPlainObject(val)) {\n if (hasOwn(val, 'x') && hasOwn(val, 'y') && hasOwn(val, 'z')) {\n const value = val as Cartesian3Option\n return new Cartesian3(value.x, value.y, value.z)\n } else if (hasOwn(val, 'lng') && hasOwn(val, 'lat')) {\n const value = val as CartographicInDegreeOption\n return Cartesian3.fromDegrees(value.lng!, value.lat!, value.height || 0, ellipsoid)\n }\n }\n // 经纬度数组\n if (isArray(val)) {\n return Cartesian3.fromDegrees(val[0], val[1], val[2] || 0, ellipsoid)\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 将数组 [lng, lat, height, ……,lng, lat, height] 转换为 Cesium.Cartesian3 数组\n * @param {Array} val\n * @returns {Array<Cartesian3>}\n */\nexport function makeCartesian3Array(vals: VcCartesian3Array, ellipsoid?: Cesium.Ellipsoid, isConstant = false): CesiumCartesian3Array | undefined {\n const { CallbackProperty, Cartesian3, Ellipsoid } = Cesium\n\n if (vals instanceof CallbackProperty) {\n return vals\n }\n\n if (isFunction(vals)) {\n return new CallbackProperty(vals, isConstant)\n }\n\n ellipsoid = ellipsoid || Ellipsoid.WGS84\n\n if (isArray(vals)) {\n if (isArray(vals[0]) || isPlainObject(vals[0])) {\n const results: Array<any> = []\n vals.forEach(val => {\n results.push(makeCartesian3(val, ellipsoid))\n })\n return results\n }\n\n return Cartesian3.fromDegreesArrayHeights(vals as Array<number>, ellipsoid)\n }\n\n return undefined\n}\n\n/**\n * 将形如 [lng, lat, ……,lng, lat] 数组转换为 Cesium.Cartesian2 数组\n * @param {Array} vals\n * @returns {Array<Cartesian2>}\n */\nexport function makeCartesian2Array(vals: VcCartesian2Array, isConstant): CesiumCartesian2Array | undefined {\n const { CallbackProperty } = Cesium\n\n if (vals instanceof CallbackProperty) {\n return vals\n }\n\n if (isFunction(vals)) {\n return new CallbackProperty(vals, isConstant)\n }\n\n if (isArray(vals)) {\n const points: Array<Cesium.Cartesian2> = []\n vals.forEach(val => {\n points.push(makeCartesian2(val) as Cesium.Cartesian2)\n })\n return points\n }\n\n return undefined\n}\n\n/**\n * 将对象或数组 转换为 Cesium.Quaternion\n * @param {Object} val\n * @example\n * const options = {x: 0, y: 0, z: 0, w: 0}\n * // const options = [0, 0, 0, 0]\n * const orientation = makeQuaternion(options) // returns Cesium.Quaternion\n */\nexport function makeQuaternion(\n val: Cesium.CallbackProperty | Cesium.Quaternion | Cartesian4Option | Array<number> | AnyFunction<any>,\n isConstant = false\n): Cesium.CallbackProperty | Cesium.Quaternion | Cesium.VelocityOrientationProperty | undefined {\n const { CallbackProperty, Quaternion, VelocityOrientationProperty } = Cesium\n\n if (val instanceof Quaternion || val instanceof CallbackProperty || val instanceof VelocityOrientationProperty) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'x') && hasOwn(val, 'y')) {\n const value = val as Cartesian4Option\n return new Quaternion(value.x, value.y, value.z, value.w)\n }\n\n if (isArray(val)) {\n return new Quaternion(val[0], val[1], val[2], val[3])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 解析 HierarchyJson\n * @param {Object} val\n */\nfunction parsePolygonHierarchyJson(val: Array<PolygonHierarchyOption>, ellipsoid?: Cesium.Ellipsoid) {\n val.forEach(item => {\n item.positions = makeCartesian3Array(item.positions, ellipsoid) as Array<Cesium.Cartesian3>\n if (item.holes) {\n parsePolygonHierarchyJson(item.holes, ellipsoid)\n }\n })\n}\n\n/**\n * 普通数组或对象转 Cesium.PolygonHierarchy 对象。\n * @param {Object|Array} val\n */\nexport function makePolygonHierarchy(val: VcPolygonHierarchy, ellipsoid?: Cesium.Ellipsoid, isConstant = false): CesiumPolygonHierarchy | undefined {\n const { PolygonHierarchy, CallbackProperty } = Cesium\n\n if (val instanceof PolygonHierarchy || val instanceof CallbackProperty) {\n return val\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n if (isArray(val) && val.length >= 3) {\n const points = makeCartesian3Array(val, ellipsoid) as Array<Cesium.Cartesian3>\n return new PolygonHierarchy(points)\n }\n\n if (isPlainObject(val) && hasOwn(val, 'positions')) {\n const value = val as PolygonHierarchyOption\n value.positions = makeCartesian3Array(value.positions, ellipsoid) as Array<Cesium.Cartesian3>\n value.holes?.length && parsePolygonHierarchyJson(value.holes, ellipsoid)\n return value\n }\n\n return undefined\n}\n\n/**\n * 对象或数组转 Cesium.NearFarScalar。\n * @param {Object} val\n * @returns {NearFarScalar}\n * @example\n * const options = {near: 1000, nearValue: 1.0, far: 10000, farValue: 0.5}\n * // const options = [1000, 1.0, 10000, 1.5]\n * const nearFarScalar = makeNearFarScalar(options)\n */\nexport function makeNearFarScalar(val: VcNearFarScalar, isConstant = false): CesiumNearFarScalar | undefined {\n const { NearFarScalar, CallbackProperty } = Cesium\n\n if (val instanceof NearFarScalar || val instanceof CallbackProperty) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'near') && hasOwn(val, 'far')) {\n const value = val as NearFarScalarOption\n return new NearFarScalar(value.near, value.nearValue || 0.0, value.far, value.farValue || 1.0)\n }\n\n if (isArray(val)) {\n return new NearFarScalar(val[0], val[1], val[2], val[3])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n/**\n * 对象或数组转 Cesium.DistanceDisplayCondition。\n * @param {Object} val\n * @returns {DistanceDisplayCondition}\n * @example\n * const options = [0, 1000]\n * // const options = {near: 0, far: 1000}\n * const distanceDisplayCondition = makeDistanceDisplayCondition(options) // return Cesium.DistanceDisplayCondition\n */\nexport function makeDistanceDisplayCondition(val: VcDistanceDisplayCondition, isConstant = false): CesiumDistanceDisplayCondition | undefined {\n const { DistanceDisplayCondition, CallbackProperty } = Cesium\n\n if (val instanceof DistanceDisplayCondition || val instanceof CallbackProperty) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'near') && hasOwn(val, 'far')) {\n const value = val as DistanceDisplayConditionOption\n return new DistanceDisplayCondition(value.near, value.far)\n }\n\n if (isArray(val)) {\n return new DistanceDisplayCondition(val[0], val[1])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 普通对象、数组或字符串转 Cesium.Color。\n * @param {String|Array|Object|Function} val\n * @returns {Color}\n * @example\n * const options = 'red'\n * // const options = [1, 0, 0, 1.0] // r g b a\n * // const options = {red: 255, green: 0, bule: 0, alpha: 255}\n * const color = makeColor(options) // return Cesium.Color\n */\nexport function makeColor(val: VcColor, isConstant = false): CesiumColor | undefined {\n const { Color, CallbackProperty, defaultValue } = Cesium\n\n if (val instanceof Color || val instanceof CallbackProperty) {\n return val\n }\n\n if (isString(val)) {\n return Color.fromCssColorString(val)\n }\n\n if (isPlainObject(val)) {\n if (hasOwn(val, 'red')) {\n const value = val as ColorInByteOption\n return Color.fromBytes(\n defaultValue(value.red, 255),\n defaultValue(value.green, 255),\n defaultValue(value.blue, 255),\n defaultValue(value.alpha, 255)\n )\n } else if (hasOwn(val, 'x')) {\n const value = val as Cartesian4Option\n return new Color(defaultValue(value.x, 1), defaultValue(value.y, 1), defaultValue(value.z, 1), defaultValue(value.w, 1))\n }\n }\n\n if (isArray(val)) {\n return Color.fromBytes(val[0], val[1], val[2], defaultValue(val[3], 255))\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\nexport function makeColors(vals: VcColor[]): Cesium.Color[] {\n if (isArray(vals)) {\n const results: Cesium.Color[] = []\n vals.forEach(val => {\n results.push(makeColor(val) as Cesium.Color)\n })\n\n return results\n } else {\n return vals\n }\n}\n\n/**\n * 普通对象或数组 [r, g, b, a] 或字符串转 MaterialProperty\n * @param {String|Array|Object} val\n */\nexport function makeMaterialProperty(val: VcMaterialProperty, isConstant = false): CesiumMaterialProperty {\n const {\n CallbackProperty,\n Color,\n CheckerboardMaterialProperty,\n ColorMaterialProperty,\n GridMaterialProperty,\n ImageMaterialProperty,\n PolylineArrowMaterialProperty,\n PolylineDashMaterialProperty,\n PolylineGlowMaterialProperty,\n PolylineOutlineMaterialProperty,\n StripeMaterialProperty,\n StripeOrientation,\n defaultValue\n } = Cesium\n\n if (\n val instanceof CallbackProperty ||\n val instanceof Color ||\n val instanceof CheckerboardMaterialProperty ||\n val instanceof ColorMaterialProperty ||\n val instanceof ImageMaterialProperty ||\n val instanceof PolylineArrowMaterialProperty ||\n val instanceof PolylineDashMaterialProperty ||\n val instanceof PolylineGlowMaterialProperty ||\n val instanceof PolylineOutlineMaterialProperty ||\n val instanceof StripeMaterialProperty ||\n getObjClassName(val as any).indexOf('MaterialProperty') !== -1\n ) {\n return val as CesiumMaterialProperty\n }\n if (\n (isString(val) && /(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/.test(val)) ||\n val instanceof HTMLImageElement ||\n val instanceof HTMLCanvasElement ||\n val instanceof HTMLVideoElement\n ) {\n return new ImageMaterialProperty({\n image: val,\n repeat: makeCartesian2({ x: 1.0, y: 1.0 }),\n color: Color.WHITE,\n transparent: true\n })\n }\n\n if (isArray(val) || isString(val)) {\n return new ColorMaterialProperty(makeColor(val))\n }\n\n if (isPlainObject(val) && hasOwn(val, 'fabric')) {\n const value = val as MaterialOption\n switch (value.fabric.type) {\n case 'Image':\n return new ImageMaterialProperty({\n image: value.fabric.uniforms.image,\n repeat: makeCartesian2(defaultValue(value.fabric.uniforms.repeat as Cartesian2Option, { x: 1.0, y: 1.0 })),\n color: defaultValue(makeColor(value.fabric.uniforms.color), Color.WHITE),\n transparent: defaultValue(value.fabric.uniforms.transparent, false)\n })\n case 'Color':\n return new ColorMaterialProperty(makeColor(defaultValue(value.fabric.uniforms.color, Color.WHITE)))\n case 'PolylineArrow':\n return new PolylineArrowMaterialProperty(makeColor(defaultValue(value.fabric.uniforms.color, Color.WHITE)))\n case 'PolylineDash':\n return new PolylineDashMaterialProperty({\n color: makeColor(defaultValue(value.fabric.uniforms.color, 'white')),\n gapColor: makeColor(defaultValue(value.fabric.uniforms.gapColor, Color.TRANSPARENT)),\n dashLength: defaultValue(value.fabric.uniforms.taperPower, 16.0),\n dashPattern: defaultValue(value.fabric.uniforms.taperPower, 255.0)\n })\n case 'PolylineGlow':\n return new PolylineGlowMaterialProperty({\n color: makeColor(defaultValue(value.fabric.uniforms.color, Color.WHITE)),\n glowPower: defaultValue(value.fabric.uniforms.glowPower, 0.25),\n taperPower: defaultValue(value.fabric.uniforms.taperPower, 1.0)\n })\n case 'PolylineOutline':\n return new PolylineOutlineMaterialProperty({\n color: makeColor(defaultValue(value.fabric.uniforms.color, Color.WHITE)),\n outlineColor: makeColor(defaultValue(value.fabric.uniforms.outlineColor, Color.BLACK)),\n outlineWidth: defaultValue(value.fabric.uniforms.outlineWidth, 1.0)\n })\n case 'Checkerboard':\n return new CheckerboardMaterialProperty({\n evenColor: makeColor(defaultValue(value.fabric.uniforms.evenColor, Color.WHITE)),\n oddColor: makeColor(defaultValue(value.fabric.uniforms.oddColor, Color.BLACK)),\n repeat: defaultValue(makeCartesian2(value.fabric.uniforms.repeat as Cartesian2Option), { x: 2, y: 2 })\n })\n case 'Grid':\n return new GridMaterialProperty({\n color: makeColor(defaultValue(value.fabric.uniforms.color, Color.WHITE)),\n cellAlpha: defaultValue(value.fabric.uniforms.cellAlpha, 0.1),\n lineCount: defaultValue(makeCartesian2(value.fabric.uniforms.lineCount as Cartesian2Option), { x: 8, y: 8 }),\n lineThickness: defaultValue(makeCartesian2(value.fabric.uniforms.lineThickness as Cartesian2Option), { x: 1, y: 1 }),\n lineOffset: defaultValue(makeCartesian2(value.fabric.uniforms.lineOffset as Cartesian2Option), { x: 0, y: 0 })\n })\n case 'Stripe':\n return new StripeMaterialProperty({\n orientation: defaultValue(value.fabric.uniforms.orientation, StripeOrientation.HORIZONTAL),\n evenColor: makeColor(defaultValue(value.fabric.uniforms.evenColor, 'white')),\n oddColor: makeColor(defaultValue(value.fabric.uniforms.oddColor, 'black')),\n offset: defaultValue(value.fabric.uniforms.offset, 0),\n repeat: defaultValue(value.fabric.uniforms.repeat as number, 1)\n })\n }\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return val as CesiumMaterialProperty\n}\n\n/**\n * 转 Material\n * @param {String|Array|Object} val\n */\nexport function makeMaterial(this, val: VcMaterial): CesiumMaterial {\n const vcInstance = this as VcComponentInternalInstance\n const cmpName = vcInstance?.proxy?.$options.name\n if (\n cmpName &&\n (cmpName.indexOf('Graphics') !== -1 || cmpName.indexOf('Datasource') !== -1 || cmpName === 'VcOverlayDynamic' || cmpName === 'VcEntity')\n ) {\n return makeMaterialProperty(val as VcMaterialProperty)\n }\n const { Material, combine } = Cesium\n if (val instanceof Material) {\n return val\n }\n if (isPlainObject(val) && hasOwn(val, 'fabric')) {\n const f = obj => {\n for (const i in obj) {\n if (!isArray(obj[i]) && isPlainObject(obj[i])) {\n f(obj[i])\n } else {\n if (i.toLocaleLowerCase().indexOf('color') !== -1 && !isEmptyObj(obj[i])) {\n const result = makeColor(obj[i])\n // Cesium 通过对象属性个数判断具体材质类型的,通过 Cesium.combine 移除 vue 传的一些属性\n obj[i] = combine(result, result, true)\n }\n }\n }\n }\n f(val)\n return new Material(val as MaterialOption)\n }\n\n if (isArray(val) || isString(val)) {\n const material = Material.fromType('Color')\n material.uniforms.color = makeColor(val)\n return material\n }\n\n return undefined\n}\n\nexport function makeAppearance(this: VcComponentInternalInstance, val: VcAppearance): CesiumAppearance | undefined {\n const {\n Appearance,\n DebugAppearance,\n MaterialAppearance,\n PolylineColorAppearance,\n EllipsoidSurfaceAppearance,\n PerInstanceColorAppearance,\n PolylineMaterialAppearance\n } = Cesium\n\n if (\n val instanceof Appearance ||\n val instanceof DebugAppearance ||\n val instanceof MaterialAppearance ||\n val instanceof PolylineColorAppearance ||\n val instanceof EllipsoidSurfaceAppearance ||\n val instanceof PerInstanceColorAppearance ||\n val instanceof PolylineMaterialAppearance ||\n getObjClassName(val as any).indexOf('Appearance') !== -1\n ) {\n return val as CesiumAppearance\n }\n\n if (isPlainObject(val) && hasOwn(val, 'type')) {\n const options: any = {\n ...val.options\n }\n if (val.options?.material) {\n options.material = makeMaterial.call(this, val.options.material as any)\n }\n\n return new Cesium[val.type!]({\n ...options\n })\n }\n\n return undefined\n}\n\n/**\n * 将对象 {west: number, south: number, east: number, north: number} 或者[west, south, east, north]数组 转 Cesium.Rectangle 对象。\n * @param {Object} val\n * @returns {Rectangle}\n */\nexport function makeRectangle(val: VcRectangle, isConstant = false): CesiumRectangle | Cesium.RectangleGraphics | undefined {\n const { Rectangle, RectangleGraphics, CallbackProperty } = Cesium\n // Entiy 的 rectangle 属性不能调用这个方法\n if (val instanceof RectangleGraphics || val instanceof Rectangle || val instanceof CallbackProperty) {\n return val\n }\n\n if (isArray(val)) {\n return Rectangle.fromDegrees(val[0], val[1], val[2], val[3])\n }\n\n if (isPlainObject(val)) {\n if (hasOwn(val, 'west')) {\n const value = val as RectangleInDegreeOption\n return Rectangle.fromDegrees(value.west, value.south, value.east, value.north)\n } else if (hasOwn(val, 'x')) {\n const value = val as Cartesian4Option\n return new Rectangle(value.x, value.y, value.z, value.w)\n }\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 对象或数组转 Cesium.BoundingRectangle。\n * @param {Object} val\n * @returns {Cesium.BoundingRectangle}\n * @example\n * const options = [0, 0, 100, 100]\n * // const options = {x: 0, y: 0, width: 100, height: 100}\n * const boundingRectangle = makeBoundingRectangle(options)\n */\nexport function makeBoundingRectangle(val: VcBoundingRectangle, isConstant = false): CesiumBoundingRectangle | undefined {\n const { BoundingRectangle, CallbackProperty } = Cesium\n\n if (val instanceof BoundingRectangle || val instanceof CallbackProperty) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'x')) {\n const value = val as BoundingRectangleOption\n return new BoundingRectangle(value.x, value.y, value.width, value.height)\n }\n\n if (isArray(val)) {\n return new BoundingRectangle(val[0], val[1], val[2], val[3])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 普通对象 {normal: number, distance: number} 转 Cesium.Plane 对象。\n * @param {Object} val\n * @returns {Plane}\n */\nexport function makePlane(val: VcPlane, isConstant = false): CesiumPlane {\n const { Cartesian3, Plane, PlaneGraphics, CallbackProperty } = Cesium\n\n // Entiy 和 PlaneGraphics 都有个 plane 属性 要区别一下\n if (val instanceof PlaneGraphics || val instanceof Plane || val instanceof CallbackProperty) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'normal')) {\n const value = val as PlaneOption\n // normal 法向量 需要写成 {x: number, y: number, z: number} 形式\n Cartesian3.normalize(makeCartesian3(value.normal) as Cesium.Cartesian3, value.normal as Cesium.Cartesian3)\n return new Plane(value.normal as Cesium.Cartesian3, value.distance)\n }\n\n if (isArray(val)) {\n const point3D = makeCartesian3(val[0]) as Cesium.Cartesian3\n const normalizePoint3D = Cartesian3.normalize(point3D, new Cartesian3())\n return new Plane(normalizePoint3D, val[1])\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return undefined\n}\n\n/**\n * 普通对象转平移、旋转、缩放变换对象。\n * @param {*} val\n */\nexport function makeTranslationRotationScale(\n val: Cesium.TranslationRotationScale | Cesium.CallbackProperty | TranslationRotationScaleOption | AnyFunction<any> | Array<any>,\n isConstant = false\n) {\n const { TranslationRotationScale, CallbackProperty } = Cesium\n if (val instanceof CallbackProperty || val instanceof TranslationRotationScale) {\n return val\n }\n\n if (isPlainObject(val) && hasOwn(val, 'translation')) {\n const value = val as TranslationRotationScaleOption\n // note\n // translation scale需要写成 { x: number, y: number, z: number } 的形式\n return new TranslationRotationScale(\n makeCartesian3(value.translation) as Cesium.Cartesian3,\n makeQuaternion(value.rotation) as Cesium.Quaternion,\n makeCartesian3(value.scale) as Cesium.Cartesian3\n )\n }\n\n if (isArray(val)) {\n return new TranslationRotationScale(\n makeCartesian3(val[0]) as Cesium.Cartesian3,\n makeQuaternion(val[1]) as Cesium.Quaternion,\n makeCartesian3(val[2]) as Cesium.Cartesian3\n )\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n return val\n}\n\nexport function makeOptions(this, val) {\n const vcInstance = this as VcComponentInternalInstance\n const cmpName = vcInstance.proxy?.$options.name\n const result: any = {}\n switch (cmpName) {\n case 'VcDatasourceGeojson':\n Object.assign(result, val)\n result && result.markerColor && (result.markerColor = makeColor(result.markerColor))\n result && result.stroke && (result.stroke = makeColor(result.stroke))\n result && result.fill && (result.fill = makeColor(result.fill))\n return result\n }\n return val\n}\n\nexport function captureScreenshot(viewer: Cesium.Viewer) {\n const scene = viewer.scene\n const promise: Promise<string> = new Promise((resolve, reject) => {\n const removeCallback = viewer.scene.postRender.addEventListener(() => {\n removeCallback()\n try {\n const cesiumCanvas = viewer.scene.canvas\n const canvas = cesiumCanvas\n resolve(canvas.toDataURL('image/png'))\n } catch (e) {\n reject(e)\n }\n })\n })\n\n scene.render(viewer.clock.currentTime)\n return promise\n}\n\nexport function makeCameraOptions(camera: VcCamera, ellipsoid?: Cesium.Ellipsoid) {\n const { Math: CesiumMath, Rectangle, defaultValue } = Cesium\n\n let destination: Cesium.Cartesian3 | Cesium.Rectangle | undefined = undefined\n let orientation: HeadingPitchRollOption = {}\n\n if (hasOwn(camera, 'position')) {\n const position = camera.position\n destination = makeCartesian3(position!, ellipsoid) as Cesium.Cartesian3\n if ((hasOwn(position!, 'lng') && hasOwn(position!, 'lat')) || isArray(position)) {\n orientation = {\n heading: CesiumMath.toRadians(defaultValue(camera.heading, 360)),\n pitch: CesiumMath.toRadians(defaultValue(camera.pitch, -90)),\n roll: CesiumMath.toRadians(defaultValue(camera.roll, 0))\n }\n } else {\n orientation = {\n heading: defaultValue(camera.heading, 2 * Math.PI),\n pitch: defaultValue(camera.pitch, -Math.PI / 2),\n roll: defaultValue(camera.roll, 0)\n }\n }\n } else if (hasOwn(camera, 'rectangle')) {\n const rectangle = camera.retangle\n destination = makeRectangle(rectangle!) as Cesium.Rectangle\n Rectangle.validate(destination)\n if (\n (hasOwn(rectangle!, 'west') && hasOwn(rectangle!, 'south') && hasOwn(rectangle!, 'east') && hasOwn(rectangle!, 'north')) ||\n isArray(rectangle)\n ) {\n orientation = {\n heading: CesiumMath.toRadians(defaultValue(camera.heading, 360)),\n pitch: CesiumMath.toRadians(defaultValue(camera.pitch, -90)),\n roll: CesiumMath.toRadians(defaultValue(camera.roll, 0))\n }\n } else {\n orientation = {\n heading: defaultValue(camera.heading, 2 * Math.PI),\n pitch: defaultValue(camera.pitch, -Math.PI / 2),\n roll: defaultValue(camera.roll, 0)\n }\n }\n }\n\n return {\n destination,\n orientation\n }\n}\n\nexport function setViewerCamera(viewer: Cesium.Viewer, camera: VcCamera) {\n const { destination, orientation } = makeCameraOptions(camera, viewer.scene.globe.ellipsoid)\n viewer.camera.setView({\n destination: destination,\n orientation: orientation\n })\n}\n\nexport function flyToCamera(\n viewer: Cesium.Viewer,\n cameraOpts: VcCamera,\n options?: {\n destination?: Cesium.Cartesian3 | Cesium.Rectangle\n orientation?: any\n duration?: number\n complete?: Cesium.Camera.FlightCompleteCallback\n cancel?: Cesium.Camera.FlightCancelledCallback\n endTransform?: Cesium.Matrix4\n maximumHeight?: number\n pitchAdjustHeight?: number\n flyOverLongitude?: number\n flyOverLongitudeWeight?: number\n convert?: boolean\n easingFunction?: Cesium.EasingFunction.Callback\n }\n) {\n const { destination, orientation } = makeCameraOptions(cameraOpts, viewer.scene.globe.ellipsoid)\n viewer.camera.flyTo({\n ...options,\n destination: options?.destination || destination,\n orientation: options?.orientation || orientation\n })\n}\n\nexport function getGeodesicDistance(start: Cesium.Cartesian3, end: Cesium.Cartesian3, ellipsoid: Cesium.Ellipsoid) {\n const { EllipsoidGeodesic, Ellipsoid } = Cesium\n ellipsoid = ellipsoid || Ellipsoid.WGS84\n const pickedPointCartographic = ellipsoid.cartesianToCartographic(start)\n const lastPointCartographic = ellipsoid.cartesianToCartographic(end)\n const geodesic = new EllipsoidGeodesic(pickedPointCartographic, lastPointCartographic)\n return geodesic.surfaceDistance\n}\n\nexport function getHeadingPitchRoll(start: Cesium.Cartesian3, end: Cesium.Cartesian3, scene: Cesium.Scene, result?: Array<number>) {\n const { Cartesian3 } = Cesium\n if (Cartesian3.equals(start, end)) {\n return undefined\n }\n\n //向量AB\n const vector2 = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3())\n //归一化\n const normal = Cesium.Cartesian3.normalize(vector2, new Cesium.Cartesian3())\n //旋转矩阵 rotationMatrixFromPositionVelocity源码中有,并未出现在cesiumAPI中\n const rotationMatrix3 = Cesium.Transforms.rotationMatrixFromPositionVelocity(start, normal, scene.globe.ellipsoid)\n const m = Cesium.Matrix4.fromRotationTranslation(rotationMatrix3, start)\n const m1 = Cesium.Transforms.eastNorthUpToFixedFrame(\n Cesium.Matrix4.getTranslation(m, new Cesium.Cartesian3()),\n Cesium.Ellipsoid.WGS84,\n new Cesium.Matrix4()\n )\n // 矩阵相除\n const m3 = Cesium.Matrix4.multiply(Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()), m, new Cesium.Matrix4())\n // 得到旋转矩阵\n const mat3 = Cesium.Matrix4.getMatrix3(m3, new Cesium.Matrix3())\n // 计算四元数\n const q = Cesium.Quaternion.fromRotationMatrix(mat3)\n // 计算旋转角(弧度)\n const hpr = Cesium.HeadingPitchRoll.fromQuaternion(q)\n return hpr\n}\n\nexport function getOrientation(start: Cesium.Cartesian3, end: Cesium.Cartesian3, scene?: Cesium.Scene) {\n const hpr = getHeadingPitchRoll(start, end, scene)\n hpr.pitch = hpr.pitch + Math.PI / 2 + Math.PI\n return Cesium.Transforms.headingPitchRollQuaternion(start, hpr)\n}\n\nexport function getPolylineSegmentEndpoint(start: Cesium.Cartesian3, heading: number, distance: number, ellipsoid: Cesium.Ellipsoid) {\n const { HeadingPitchRoll, Transforms, Matrix4, Cartesian3, Cartesian4, Quaternion, Cartographic, Ellipsoid } = Cesium\n ellipsoid = ellipsoid || Ellipsoid.WGS84\n const hpr = new HeadingPitchRoll(heading, 0, 0)\n const scale = new Cartesian3(1, 1, 1)\n const matrix = Transforms.headingPitchRollToFixedFrame(start, hpr)\n const translation = Matrix4.getColumn(matrix, 1, new Cartesian4())\n const axis = new Cartesian3(translation.x, translation.y, translation.z)\n const quaternion = Quaternion.fromAxisAngle(axis, distance * ellipsoid.oneOverRadii.x)\n const hprMatrix = Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.ZERO, quaternion, scale)\n const position = Matrix4.multiplyByPoint(hprMatrix, start, new Cartesian3())\n const startCartographic = Cartographic.fromCartesian(start, ellipsoid)\n const positionCartographic = Cartographic.fromCartesian(position, ellipsoid)\n positionCartographic.height = startCartographic.height\n return Cartographic.toCartesian(positionCartographic, ellipsoid)\n}\n\nexport function calculateAreaByPostions(positions: Array<Cesium.Cartesian3>) {\n let area = 0\n const { CoplanarPolygonGeometry, VertexFormat, defined, Cartesian3 } = Cesium\n const geometry = CoplanarPolygonGeometry.createGeometry(\n CoplanarPolygonGeometry.fromPositions({\n positions: positions,\n vertexFormat: VertexFormat.POSITION_ONLY\n })\n )\n\n if (!isUndefined(geometry) && defined(geometry)) {\n const indices = geometry.indices\n const positionValues = geometry.attributes.position.values as number[]\n for (let i = 0; i < indices.length; i += 3) {\n const indice0 = indices[i]\n const indice1 = indices[i + 1]\n const indice2 = indices[i + 2]\n\n area += triangleArea(\n Cartesian3.unpack(positionValues, 3 * indice0, {} as any),\n Cartesian3.unpack(positionValues, 3 * indice1, {} as any),\n Cartesian3.unpack(positionValues, 3 * indice2, {} as any)\n )\n }\n }\n\n return area\n}\n\nconst triangleArea = (vertexA, vertexB, vertexC) => {\n const { Cartesian3 } = Cesium\n const vectorBA = Cartesian3.subtract(vertexA, vertexB, {} as any)\n const vectorBC = Cartesian3.subtract(vertexC, vertexB, {} as any)\n const crossProduct = Cartesian3.cross(vectorBA, vectorBC, vectorBA)\n return 0.5 * Cartesian3.magnitude(crossProduct)\n}\n\nconst restoreCursors: Array<string> = []\nexport function setViewerCursor(viewer: Cesium.Viewer, cursor: string) {\n const restoreCursor = getComputedStyle(viewer.canvas).cursor\n restoreCursors[restoreCursors.length - 1] !== restoreCursor && restoreCursors.push(restoreCursor)\n viewer.canvas.setAttribute('style', `cursor: ${cursor}`)\n}\n\nexport function restoreViewerCursor(viewer: Cesium.Viewer, count = 1) {\n for (let i = 0; i < count; i++) {\n const cursor = restoreCursors.pop()\n viewer.canvas.setAttribute('style', `cursor: ${cursor}`)\n }\n}\n\nexport function makeJulianDate(val: string | Date | Cesium.JulianDate): Cesium.JulianDate {\n const { JulianDate } = Cesium\n if (val instanceof JulianDate) {\n return val\n } else if (isString(val)) {\n return Cesium.JulianDate.fromDate(new Date(val))\n } else if (val instanceof Date) {\n return Cesium.JulianDate.fromDate(val)\n }\n\n return Cesium.JulianDate.now()\n}\n\nexport function makeHeadingPitchRoll(val: VcHeadingPitchRoll): Cesium.HeadingPitchRoll {\n const { HeadingPitchRoll, Math: CesiumMath } = Cesium\n if (val instanceof Cesium.HeadingPitchRoll) {\n return val\n } else if (Array.isArray(val)) {\n // 认为是经纬度数组\n return new HeadingPitchRoll(CesiumMath.toRadians(val[0]) || 0, CesiumMath.toRadians(val[1]) || 0, CesiumMath.toRadians(val[2]) || 0)\n } else if (isPlainObject(val)) {\n return new HeadingPitchRoll(val.heading || 0, val.pitch || 0, val.roll || 0)\n }\n\n return new HeadingPitchRoll()\n}\n\nexport function makeHeadingPitchRang(val: VcHeadingPitchRange): Cesium.HeadingPitchRange {\n const { HeadingPitchRange, Math: CesiumMath } = Cesium\n if (val instanceof Cesium.HeadingPitchRange) {\n return val\n } else if (Array.isArray(val)) {\n return new HeadingPitchRange(CesiumMath.toRadians(val[0]) || 0, CesiumMath.toRadians(val[1]) || 0, val[2] || 0)\n } else if (isPlainObject(val)) {\n return new HeadingPitchRange(val.heading || 0, val.pitch || 0, val.range || 0)\n }\n\n return new HeadingPitchRange()\n}\n\nexport function getPolylineSegmentHeading(start: Cesium.Cartesian3, end: Cesium.Cartesian3) {\n const { Cartesian3, Matrix4, Transforms, Math: CesiumMath } = Cesium\n const cartesian3Scratch = new Cartesian3()\n const matrix4Scratch = Transforms.eastNorthUpToFixedFrame(start)\n Matrix4.inverse(matrix4Scratch, matrix4Scratch)\n Matrix4.multiplyByPoint(matrix4Scratch, end, cartesian3Scratch)\n Cartesian3.normalize(cartesian3Scratch, cartesian3Scratch)\n return CesiumMath.toDegrees(Math.atan2(cartesian3Scratch.x, cartesian3Scratch.y))\n}\n\nexport function getPolylineSegmentPitch(start: Cesium.Cartesian3, end: Cesium.Cartesian3) {\n const { Cartesian3, Matrix4, Transforms, Math: CesiumMath } = Cesium\n const cartesian3Scratch = new Cartesian3()\n const matrix4Scratch = Transforms.eastNorthUpToFixedFrame(start)\n Matrix4.inverse(matrix4Scratch, matrix4Scratch)\n Matrix4.multiplyByPoint(matrix4Scratch, end, cartesian3Scratch)\n Cartesian3.normalize(cartesian3Scratch, cartesian3Scratch)\n return CesiumMath.toDegrees(Math.asin(cartesian3Scratch.z))\n}\n\nexport function getFirstIntersection(\n start: Cesium.Cartesian3,\n end: Cesium.Cartesian3,\n viewer: Cesium.Viewer,\n objectsToExclude = []\n): Cesium.Cartesian3 {\n const { Cartesian3, Ray, defined } = Cesium\n const direction = Cartesian3.normalize(Cartesian3.subtract(end, start, new Cartesian3()), new Cartesian3())\n const ray = new Ray(start, direction)\n const result = viewer.scene.pickFromRay(ray, objectsToExclude)\n if (defined(result)) {\n if (defined(result.position)) {\n const intersection = result.position\n return intersection\n }\n }\n\n return undefined\n}\n\nexport function heightToLevel(altitude: number) {\n // 粗略计算\n const A = 40487.57\n const B = 0.00007096758\n const C = 91610.74\n const D = -40467.74\n\n return Math.round(D + (A - D) / (1 + Math.pow(altitude / C, B)))\n}\n"],"names":[],"mappings":"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