UNPKG

vue-cesium

Version:
1 lines 74.9 kB
{"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 VcImageBasedLighting\n} from './types'\nimport { compare, CompareOperator } from 'compare-versions'\nimport { hasOwn, isFunction, isArray, isString, isPlainObject, isEmptyObj, getObjClassName, isUndefined } from './util'\nimport { VcCircleWaveMaterialProperty, VcLineFlowMaterialProperty, VcLineTrailMaterialProperty } from '@vue-cesium/shared/extends/materials'\nimport { cloneDeep } from 'lodash'\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 = cloneDeep(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 CompositeMaterialProperty,\n GridMaterialProperty,\n ImageMaterialProperty,\n MaterialProperty,\n PolylineArrowMaterialProperty,\n PolylineDashMaterialProperty,\n PolylineGlowMaterialProperty,\n PolylineOutlineMaterialProperty,\n StripeMaterialProperty,\n StripeOrientation,\n defaultValue,\n Cartesian2,\n Material\n } = Cesium\n\n if (\n val instanceof CallbackProperty ||\n val instanceof Color ||\n val instanceof CheckerboardMaterialProperty ||\n val instanceof ColorMaterialProperty ||\n val instanceof CompositeMaterialProperty ||\n val instanceof GridMaterialProperty ||\n val instanceof ImageMaterialProperty ||\n val instanceof MaterialProperty ||\n val instanceof PolylineArrowMaterialProperty ||\n val instanceof PolylineDashMaterialProperty ||\n val instanceof PolylineGlowMaterialProperty ||\n val instanceof PolylineOutlineMaterialProperty ||\n val instanceof StripeMaterialProperty ||\n val instanceof VcCircleWaveMaterialProperty ||\n val instanceof VcLineFlowMaterialProperty ||\n val instanceof VcLineTrailMaterialProperty\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.dashLength, 16.0),\n dashPattern: defaultValue(value.fabric.uniforms.dashPattern, 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 case 'VcCircleWave': {\n return new VcCircleWaveMaterialProperty({\n duration: defaultValue(value.fabric.uniforms.duration, 3000),\n gradient: defaultValue(value.fabric.uniforms.gradient, 0.5),\n color: makeColor(defaultValue(value.fabric.uniforms.color, Color.RED)),\n count: defaultValue(value.fabric.uniforms.count, 3)\n })\n }\n case 'VcLineFlow': {\n return new VcLineFlowMaterialProperty({\n image: defaultValue(value.fabric.uniforms.image, Material.DefaultImageId),\n color: makeColor(defaultValue(value.fabric.uniforms.color, new Color(1, 1, 1, 1))),\n repeat: makeCartesian2(defaultValue(value.fabric.uniforms.repeat, new Cartesian2(1, 1))),\n axisY: defaultValue(value.fabric.uniforms.axisY, false),\n mixt: defaultValue(value.fabric.uniforms.mixt, false),\n speed: defaultValue(value.fabric.uniforms.speed, 10),\n time: defaultValue(value.fabric.uniforms.time, -1)\n })\n }\n case 'VcLineTrail': {\n return new VcLineTrailMaterialProperty({\n image: defaultValue(value.fabric.uniforms.image, Material.DefaultImageId),\n color: makeColor(defaultValue(value.fabric.uniforms.color, new Color(1, 0, 0, 1))),\n repeat: makeCartesian2(defaultValue(value.fabric.uniforms.repeat, new Cartesian2(1, 1))),\n axisY: defaultValue(value.fabric.uniforms.axisY, false),\n duration: defaultValue(value.fabric.uniforms.duration, 3000),\n loop: defaultValue(value.fabric.uniforms.loop, true)\n })\n }\n }\n }\n\n if (isFunction(val)) {\n return new CallbackProperty(val, isConstant)\n }\n\n return val as unknown 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.rectangle\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\nexport function compareCesiumVersion(a, b, operator: CompareOperator = '>=') {\n a = a || '1.6.7'\n return compare(a, b, operator)\n}\n\nexport function makeImageBasedLighting(options: VcImageBasedLighting) {\n const { ImageBasedLighting, defined } = Cesium\n\n if (options instanceof Cesium.ImageBasedLighting) {\n return options\n }\n\n const imageBasedLighting = new ImageBasedLighting()\n\n if (imageBasedLighting.imageBasedLightingFactor) {\n imageBasedLighting.imageBasedLightingFactor = makeCartesian2(options.imageBasedLightingFactor) as Cesium.Cartesian2\n }\n\n if (imageBasedLighting.sphericalHarmonicCoefficients) {\n imageBasedLighting.sphericalHarmonicCoefficients = makeCartesian3Array(options.sphericalHarmonicCoefficients) as Cesium.Cartesian3[]\n }\n\n if (imageBasedLighting.luminanceAtZenith) {\n imageBasedLighting.luminanceAtZenith = Number(options.luminanceAtZenith)\n }\n\n if (defined(imageBasedLighting.specularEnvironmentMaps)) {\n imageBasedLighting.specularEnvironmentMaps = options.specularEnvironmentMaps\n }\n\n return imageBasedLighting\n}\n"],"names":[],"mappings":"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