cesium-xs-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -0
- package/dist/cesium-xs-sdk.cjs.js +7387 -0
- package/dist/cesium-xs-sdk.cjs.js.map +1 -0
- package/dist/cesium-xs-sdk.esm.js +7383 -0
- package/dist/cesium-xs-sdk.esm.js.map +1 -0
- package/dist/cesium-xs-sdk.umd.js +2 -0
- package/dist/cesium-xs-sdk.umd.js.map +1 -0
- package/package.json +78 -0
- package/src/core/Config.js +176 -0
- package/src/core/ModuleManager.js +157 -0
- package/src/index.d.ts +358 -0
- package/src/index.js +59 -0
- package/src/modules/EditorModule.js +370 -0
- package/src/modules/EventModule.js +211 -0
- package/src/modules/GraphicModule.js +1037 -0
- package/src/modules/PlotGraphicType.js +43 -0
- package/src/modules/SceneModule.js +600 -0
- package/src/modules/tools/BaseTool.js +155 -0
- package/src/modules/tools/DeleteTool.js +252 -0
- package/src/modules/tools/DrawTool.js +961 -0
- package/src/modules/tools/EditTool.js +1585 -0
- package/src/modules/tools/SelectTool.js +526 -0
- package/src/react.d.ts +18 -0
- package/src/react.js +49 -0
- package/src/utils/CoordinateUtil.js +63 -0
- package/src/utils/GeoCalcUtil.js +95 -0
- package/src/utils/PlotGeometryUtil.js +1134 -0
- package/src/vue.d.ts +18 -0
- package/src/vue.js +76 -0
- package/src/vue2.d.ts +20 -0
- package/src/vue2.js +75 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).xs3d=e()}(this,function(){"use strict";class t{static instance=null;static getInstance(){return this.instance||(this.instance=new t),this.instance}constructor(){this.config={cesiumToken:"",scene:{animation:!1,timeline:!1,baseLayerPicker:!1,fullscreenButton:!1,geocoder:!1,homeButton:!1,infoBox:!1,sceneModePicker:!1,selectionIndicator:!1,navigationHelpButton:!1,navigationInstructionsInitiallyVisible:!1,depthTestAgainstTerrain:!0}}}#t(){if("undefined"==typeof Cesium)return{};const t=(t,e)=>t&&"function"==typeof t.withAlpha?t.withAlpha(e):t;return{point:{pixelSize:8,color:Cesium.Color.RED},line:{width:2,material:Cesium.Color.BLUE},polygon:{color:t(Cesium.Color.GREEN,.5)},plot:{polygon:{color:t(Cesium.Color.BLUE,.5),outlineColor:Cesium.Color.BLUE,outlineWidth:2},line:{material:Cesium.Color.BLUE,width:2}}}}setConfig(t){for(const e in t)"object"!=typeof t[e]||Array.isArray(t[e])||null===t[e]?this.config[e]=t[e]:"scene"!==e?(this.config[e]=this.config[e]||{},this.#e(this.config[e],t[e])):(this.config.scene=this.config.scene||{},this.#i(this.config.scene,t.scene));console.log("config",this.config),t.cesiumToken&&(Cesium.Ion.defaultAccessToken=t.cesiumToken)}getConfig(){const t=this.#t(),e=this.config.graphic||{},i=e.plot?{...t.plot,...e.plot}:t.plot;return{...this.config,graphic:{...t,...e,plot:i}}}#i(t,e){for(const i in e){const s=e[i],n=t[i];"object"!=typeof s||Array.isArray(s)||null===s?Object.prototype.hasOwnProperty.call(t,i)||(t[i]=s):s instanceof Promise||s.constructor&&"Object"!==s.constructor.name?Object.prototype.hasOwnProperty.call(t,i)||(t[i]=s):(t[i]=n||{},this.#i(t[i],s))}}#e(t,e){for(const i in e)Object.prototype.hasOwnProperty.call(t,i)||(t[i]=e[i])}}const e=Object.freeze({XYZ:"xyz",WMTS:"wmts",WMS:"wms",TMS:"tms",SINGLE_IMAGE:"single_image",TERRAIN:"terrain","3DTILES":"3dtiles"});class i{constructor(t,e,i){this._layer=e,this._sceneModule=t,this._layerId=i,this._pickable=!0,this._eventEnabled=!0}setVisible(t){return this._layer.show=t,this}setAlpha(t){return this._layer.alpha=t,this}setBrightness(t){return this._layer.brightness=t,this}setContrast(t){return this._layer.contrast=t,this}setHue(t){return this._layer.hue=t,this}setSaturation(t){return this._layer.saturation=t,this}setGamma(t){return this._layer.gamma=t,this}enableEdit(t){return this._pickable=t,this}enableEvent(t){return this._eventEnabled=t,this._layer.imageryProvider&&this._layer.imageryProvider.enablePickFeatures&&(this._layer.imageryProvider.enablePickFeatures=t),this}getExtent(){const t=this._layer.imageryProvider;if(t&&t.rectangle){const e=t.rectangle;return{west:Cesium.Math.toDegrees(e.west),south:Cesium.Math.toDegrees(e.south),east:Cesium.Math.toDegrees(e.east),north:Cesium.Math.toDegrees(e.north)}}return null}getRange(){const t=this._layer.imageryProvider;return{minLevel:t.minimumLevel||0,maxLevel:t.maximumLevel||18}}getLayer(){return this._layer}remove(){return this._sceneModule.removeLayer(this._layerId),this}}class s{constructor(t,e,i){this._provider=e,this._sceneModule=t,this._layerId=i,this._visible=!0}setVisible(t){return this._visible=t,this}getExtent(){if(this._provider.rectangle){const t=this._provider.rectangle;return{west:Cesium.Math.toDegrees(t.west),south:Cesium.Math.toDegrees(t.south),east:Cesium.Math.toDegrees(t.east),north:Cesium.Math.toDegrees(t.north)}}return{west:-180,south:-85,east:180,north:85}}getProvider(){return this._provider}remove(){return this._sceneModule.removeLayer(this._layerId),this}}class n{constructor(t,e,i){this._tileset=e,this._sceneModule=t,this._layerId=i}setVisible(t){return this._tileset.show=t,this}setStyle(t){return this._tileset.style=t,this}getExtent(){if(this._tileset.boundingSphere){const t=this._tileset.boundingSphere,e=Cesium.Cartographic.fromCartesian(t.center),i=this._tileset.rectangle;if(i)return{west:Cesium.Math.toDegrees(i.west),south:Cesium.Math.toDegrees(i.south),east:Cesium.Math.toDegrees(i.east),north:Cesium.Math.toDegrees(i.north),center:[Cesium.Math.toDegrees(e.longitude),Cesium.Math.toDegrees(e.latitude)]}}return null}locateTo(){return this._sceneModule.viewer.zoomTo(this._tileset)}getTileset(){return this._tileset}remove(){return this._sceneModule.removeLayer(this._layerId),this}}class o{constructor(e){this.viewer=e,this.config=t.getInstance().getConfig(),this.layerMap=new Map}lonLatToWorld(t,e,i=0){return Cesium.Cartesian3.fromDegrees(t,e,i)}worldToLonLat(t){const e=Cesium.Cartographic.fromCartesian(t);return[Cesium.Math.toDegrees(e.longitude),Cesium.Math.toDegrees(e.latitude),e.height]}screenToWorld(t,e){const i=new Cesium.Cartesian2(t,e);if(this.viewer.scene.pickPositionSupported){const t=this.viewer.scene.pickPosition(i);if(t)return t}const s=this.viewer.camera.getPickRay(i),n=this.viewer.scene.globe.pick(s,this.viewer.scene);return n||this.viewer.camera.pickEllipsoid(i,Cesium.Ellipsoid.WGS84)}worldToScreen(t){return this.viewer.scene.cartesianToCanvasCoordinates(t)}screenToLonLat(t,e){const i=this.screenToWorld(t,e);return i?this.worldToLonLat(i):null}lonLatToScreen(t,e,i=0){const s=this.lonLatToWorld(t,e,i);return this.worldToScreen(s)}lonLatToCartographic(t,e,i=0){return new Cesium.Cartographic(Cesium.Math.toRadians(t),Cesium.Math.toRadians(e),i)}cartographicToLonLat(t){return[Cesium.Math.toDegrees(t.longitude),Cesium.Math.toDegrees(t.latitude),t.height]}async createLayer(t,i={}){const s=i.type??function(t){const i=t.toLowerCase();return/\.json(?:[?#]|$)/.test(i)||i.includes("3dtiles")||i.includes("3d_tiles")?e["3DTILES"]:/\/(?:terrain|dem|gdem|水深|elevation|ele)(\/|$)/.test(i)||/[?&#]terrain=/.test(i)?e.TERRAIN:i.includes("wmts")||i.includes("tilematrixset")?e.WMTS:i.includes("wms")||i.includes("getmap")||i.includes("request=getmap")?e.WMS:i.includes("tms")||i.includes("{-y}")?e.TMS:/\{[xyz]\}/.test(i)?e.XYZ:/\.(?:png|jpe?g|tiff?|gif|bmp|img)(?:[?#]|$)/.test(i)?e.SINGLE_IMAGE:e.XYZ}(t),n=i.layerId||`${s}_${Date.now()}`;if(this.layerMap.has(n))return console.warn(`图层 ${n} 已存在`),this.layerMap.get(n);const o=!1!==i.visible,r=function(t,i,s){switch(t){case e.XYZ:case e.TMS:return new Cesium.UrlTemplateImageryProvider({url:i,...s});case e.WMTS:return new Cesium.WebMapTileServiceImageryProvider({url:i,layer:s.layer,style:s.style||"default",format:s.format||"image/jpeg",tileMatrixSetID:s.tileMatrixSetID||"EPSG:4326",...s});case e.WMS:return new Cesium.WebMapServiceImageryProvider({url:i,layers:s.layers||"",parameters:{transparent:!0,format:"image/png",...s.parameters},...s});case e.SINGLE_IMAGE:return new Cesium.SingleTileImageryProvider({url:i,rectangle:s.extent?Cesium.Rectangle.fromDegrees(...s.extent):void 0,credit:s.credit||"",...s});case e.TERRAIN:return Cesium.CesiumTerrainProvider.fromUrl(i,{requestWaterMask:s.requestWaterMask??!1,requestVertexNormals:s.requestVertexNormals??!1,...s});case e["3DTILES"]:return new Cesium.Cesium3DTileset({url:i,maximumScreenSpaceError:s.maximumScreenSpaceError??16,maximumMemoryUsage:s.maximumMemoryUsage??512,...s});default:throw new Error(`SceneModule: 不支持的图层类型 "${t}",可用值: ${Object.values(e).join(", ")}`)}}(s,t,i),l=await async function(t,i,s,n){if(t===e.TERRAIN){const t=await s;return i.terrainProvider=t,t}if(t===e["3DTILES"]){const t=i.scene.primitives.add(s);return t.show=n??!0,t}const o=i.imageryLayers.addImageryProvider(s);return o.show=n??!0,o}(s,this.viewer,r,o),a=this.#s(s,l,n);if(s===e["3DTILES"]&&!1!==i.autoLocate){const t=l.initialTilesLoaded.addEventListener(()=>{t(),this.viewer.zoomTo(l)})}return this.layerMap.set(n,a),console.log(`${s} 图层 ${n} 创建成功`),a}#s(t,o,r){return t===e.TERRAIN?new s(this,o,r):t===e["3DTILES"]?new n(this,o,r):new i(this,o,r)}removeLayer(t){if(!this.layerMap.has(t))return console.warn(`图层 ${t} 不存在`),!1;const e=this.layerMap.get(t);return e instanceof i?this.viewer.imageryLayers.remove(e.getLayer()):e instanceof s?this.viewer.terrainProvider=new Cesium.EllipsoidTerrainProvider:e instanceof n&&this.viewer.scene.primitives.remove(e.getTileset()),this.layerMap.delete(t),!0}getLayer(t){return this.layerMap.get(t)}flyToLonLat(t={}){const{lon:e,lat:i,height:s=2e3,heading:n=0,pitch:o=-90,roll:r=0,duration:l=3}=t;return Cesium.defined(e)&&Cesium.defined(i)?this.viewer.camera.flyTo({destination:Cesium.Cartesian3.fromDegrees(e,i,s),orientation:{heading:Cesium.Math.toRadians(n),pitch:Cesium.Math.toRadians(o),roll:Cesium.Math.toRadians(r)},duration:l}):(console.warn("flyToLonLat: 必须提供 lon、lat"),Promise.resolve(!1))}setView(t={}){const{lon:e,lat:i,height:s=500,heading:n=0,pitch:o=-90,roll:r=0}=t;Cesium.defined(e)&&Cesium.defined(i)?this.viewer.camera.setView({destination:Cesium.Cartesian3.fromDegrees(e,i,s),orientation:{heading:Cesium.Math.toRadians(n),pitch:Cesium.Math.toRadians(o),roll:Cesium.Math.toRadians(r)}}):console.warn("setView: 必须提供 lon、lat")}}class r{static FITTING_COUNT=100;static ZERO_TOLERANCE=1e-4;static mathDistance(t,e){return Math.sqrt((t[0]-e[0])**2+(t[1]-e[1])**2)}static wholeDistance(t){let e=0;if(!t||!Array.isArray(t)||0===t.length)return e;for(let i=0;i<t.length-1;i++)e+=this.mathDistance(t[i],t[i+1]);return e}static getBaseLength(t){return this.wholeDistance(t)**.99}static mid(t,e){return[(t[0]+e[0])/2,(t[1]+e[1])/2]}static getAzimuth(t,e){const i=this.mathDistance(t,e);if(0===i)return 0;const s=Math.asin(Math.abs(e[1]-t[1])/i);return e[1]>=t[1]&&e[0]>=t[0]?s+Math.PI:e[1]>=t[1]&&e[0]<t[0]?2*Math.PI-s:e[1]<t[1]&&e[0]<t[0]?s:Math.PI-s}static getAngleOfThreePoints(t,e,i){const s=this.getAzimuth(e,t)-this.getAzimuth(e,i);return s<0?s+2*Math.PI:s}static isClockWise(t,e,i){return(i[1]-t[1])*(e[0]-t[0])>(e[1]-t[1])*(i[0]-t[0])}static getThirdPoint(t,e,i,s,n){const o=this.getAzimuth(t,e),r=n?o+i:o-i,l=s*Math.cos(r),a=s*Math.sin(r);return[e[0]+l,e[1]+a]}static getArcPoints(t,e,i,s,n=100){let o=s-i;o=o<0?o+2*Math.PI:o;const r=[];for(let s=0;s<=n;s++){const l=i+o*s/n,a=t[0]+e*Math.cos(l),h=t[1]+e*Math.sin(l);r.push([a,h])}return r}static _calcSphericalDistance(t,e){const i=Math.PI/180,[s,n]=[t[0]*i,t[1]*i],[o,r]=[e[0]*i,e[1]*i],l=r-n,a=o-s,h=Math.sin(l/2)**2+Math.cos(n)*Math.cos(r)*Math.sin(a/2)**2;return 6371e3*(2*Math.atan2(Math.sqrt(h),Math.sqrt(1-h)))}static _getBearing(t,e){const i=Math.PI/180,s=t[0]*i,n=t[1]*i,o=e[0]*i,r=e[1]*i,l=o-s,a=Math.sin(l)*Math.cos(r),h=Math.cos(n)*Math.sin(r)-Math.sin(n)*Math.cos(r)*Math.cos(l);let c=Math.atan2(a,h);c<0&&(c+=2*Math.PI);let u=Math.PI/2-c;return u<0&&(u+=2*Math.PI),u>2*Math.PI-1e-12&&(u=0),u}static _getPointAtBearingAndDistance(t,e,i){const s=Math.PI/180,n=t[0]*s,o=t[1]*s,r=e/6371e3,l=Math.PI/2-i,a=Math.asin(Math.sin(o)*Math.cos(r)+Math.cos(o)*Math.sin(r)*Math.cos(l));return[(n+Math.atan2(Math.sin(l)*Math.sin(r)*Math.cos(o),Math.cos(r)-Math.sin(o)*Math.sin(a)))/s,a/s]}static _getGeoArcPointsBetween(t,e,i,s,n=100){const o=this._getBearing(t,e);let r=this._getBearing(t,i)-o;r=r<0?r+2*Math.PI:r;const l=[e];for(let e=1;e<n;e++){const i=o+r*e/n;l.push(this._getPointAtBearingAndDistance(t,s,i))}return l.push(i),l}static toLonLat(t){return[t[0],t[1]]}static toPositions(t,e=0){return t.map(t=>[t[0],t[1],e])}static _closePolygonPoints(t){if(!t||0===t.length)return t;const e=[t[0]];for(let i=1;i<t.length;i++){const s=e[e.length-1],n=t[i];s[0]===n[0]&&s[1]===n[1]||e.push(n)}if(e.length>1){const t=e[0],i=e[e.length-1];t[0]===i[0]&&t[1]===i[1]||e.push(t)}return e}static toCartesian3Array(t){const e=[];for(const i of t)e.push(i[0],i[1],i[2]||0);return Cesium.Cartesian3.fromDegreesArrayHeights(e)}static getPointOnLine(t,e,i){return[e[0]+t*(i[0]-e[0]),e[1]+t*(i[1]-e[1])]}static getCubicValue(t,e,i,s,n){const o=1-(t=Math.max(Math.min(t,1),0)),r=t*t,l=r*t,a=o*o,h=a*o;return[h*e[0]+3*a*t*i[0]+3*o*r*s[0]+l*n[0],h*e[1]+3*a*t*i[1]+3*o*r*s[1]+l*n[1]]}static getBisectorNormals(t,e,i,s){const n=this.getNormal(e,i,s),o=Math.sqrt(n[0]*n[0]+n[1]*n[1]),r=n[0]/o,l=n[1]/o,a=this.mathDistance(e,i),h=this.mathDistance(i,s);let c,u;if(o>this.ZERO_TOLERANCE)if(this.isClockWise(e,i,s)){let e=t*a,s=i[0]-e*l,n=i[1]+e*r;c=[s,n],e=t*h,s=i[0]+e*l,n=i[1]-e*r,u=[s,n]}else{let e=t*a,s=i[0]+e*l,n=i[1]-e*r;c=[s,n],e=t*h,s=i[0]-e*l,n=i[1]+e*r,u=[s,n]}else{let n=i[0]+t*(e[0]-i[0]),o=i[1]+t*(e[1]-i[1]);c=[n,o],n=i[0]+t*(s[0]-i[0]),o=i[1]+t*(s[1]-i[1]),u=[n,o]}return[c,u]}static getNormal(t,e,i){let s=t[0]-e[0],n=t[1]-e[1];const o=Math.sqrt(s*s+n*n);s/=o,n/=o;let r=i[0]-e[0],l=i[1]-e[1];const a=Math.sqrt(r*r+l*l);return r/=a,l/=a,[s+r,n+l]}static getLeftMostControlPoint(t,e){const[i,s,n]=[t[0],t[1],t[2]],o=this.getBisectorNormals(0,i,s,n)[0],r=this.getNormal(i,s,n);let l,a;if(Math.sqrt(r[0]*r[0]+r[1]*r[1])>this.ZERO_TOLERANCE){const t=this.mid(i,s),e=i[0]-t[0],n=i[1]-t[1],r=2/this.mathDistance(i,s),h=-r*n,c=r*e,u=h*h-c*c,_=2*h*c,p=c*c-h*h,d=o[0]-t[0],g=o[1]-t[1];l=t[0]+u*d+_*g,a=t[1]+_*d+p*g}else l=i[0]+e*(s[0]-i[0]),a=i[1]+e*(s[1]-i[1]);return[l,a]}static getRightMostControlPoint(t,e){const i=t.length,s=t[i-3],n=t[i-2],o=t[i-1],r=this.getBisectorNormals(0,s,n,o)[1],l=this.getNormal(s,n,o);let a,h;if(Math.sqrt(l[0]*l[0]+l[1]*l[1])>this.ZERO_TOLERANCE){const t=this.mid(n,o),e=o[0]-t[0],i=o[1]-t[1],s=2/this.mathDistance(n,o),l=-s*i,c=s*e,u=l*l-c*c,_=2*l*c,p=c*c-l*l,d=r[0]-t[0],g=r[1]-t[1];a=t[0]+u*d+_*g,h=t[1]+_*d+p*g}else a=o[0]+e*(n[0]-o[0]),h=o[1]+e*(n[1]-o[1]);return[a,h]}static getCurvePoints(t,e){if(!e||e.length<3)return e?e.slice():[];const i=[this.getLeftMostControlPoint(e,t)];let s,n,o;for(let r=0;r<e.length-2;r++){s=e[r],n=e[r+1],o=e[r+2];const l=this.getBisectorNormals(t,s,n,o);i.push(...l)}const r=this.getRightMostControlPoint(e,t);r&&i.push(r);const l=[];for(let t=0;t<e.length-1;t++){s=e[t],n=e[t+1],l.push(s);for(let e=0;e<this.FITTING_COUNT;e++){const o=this.getCubicValue(e/this.FITTING_COUNT,s,i[2*t],i[2*t+1],n);l.push(o)}l.push(n)}return l}static getBezierPoints(t){if(!t||t.length<=2)return t;const e=[],i=t.length-1;for(let s=0;s<=1;s+=.01){let n=0,o=0;for(let e=0;e<=i;e++){const r=this.getBinomialFactor(i,e),l=s**e,a=(1-s)**(i-e);n+=r*l*a*t[e][0],o+=r*l*a*t[e][1]}e.push([n,o])}return e.push(t[i]),e}static getFactorial(t){let e=1;for(let i=1;i<=t;i++)e*=i;return e}static getBinomialFactor(t,e){return this.getFactorial(t)/(this.getFactorial(e)*this.getFactorial(t-e))}static getQBSplinePoints(t){if(!t||t.length<=2)return t;const e=[],i=t.length-2-1;e.push(t[0]);for(let s=0;s<=i;s++)for(let i=0;i<=1;i+=.05){let n=0,o=0;for(let e=0;e<=2;e++){const r=this.getQuadricBSplineFactor(e,i);n+=r*t[s+e][0],o+=r*t[s+e][1]}e.push([n,o])}return e.push(t[t.length-1]),e}static getQuadricBSplineFactor(t,e){return 0===t?(e-1)**2/2:1===t?(-2*e**2+2*e+1)/2:2===t?e**2/2:0}static createFineArrow(t,e={}){if(!t||t.length<2)return[];const[i,s]=t.map(t=>this.toLonLat(t)),n=t[0][2]||0,o=e.tailWidthFactor??.1,r=e.neckWidthFactor??.2,l=e.headWidthFactor??.25,a=e.headAngle??Math.PI/8.5,h=e.neckAngle??Math.PI/13,c=this.getBaseLength([i,s]),u=c*o,_=c*r,p=c*l,d=this.getThirdPoint(s,i,Math.PI/2,u,!0),g=this.getThirdPoint(s,i,Math.PI/2,u,!1),C=this.getThirdPoint(i,s,a,p,!1),m=this.getThirdPoint(i,s,a,p,!0),y=[d,this.getThirdPoint(i,s,h,_,!1),C,s,m,this.getThirdPoint(i,s,h,_,!0),g,i];return this.toPositions(y,n)}static createAssaultDirection(t,e={}){if(!t||t.length<2)return[];const[i,s]=t.map(t=>this.toLonLat(t)),n=t[0][2]||0,o=e.tailWidthFactor??.08,r=e.neckWidthFactor??.1,l=e.headWidthFactor??.13,a=e.headAngle??Math.PI/4,h=e.neckAngle??.17741*Math.PI,c=1.5*this.getBaseLength([i,s]),u=c*o,_=c*r,p=c*l,d=this.getThirdPoint(s,i,Math.PI/2,u,!0),g=this.getThirdPoint(s,i,Math.PI/2,u,!1),C=this.getThirdPoint(i,s,a,p,!1),m=this.getThirdPoint(i,s,a,p,!0),y=this.getThirdPoint(i,s,h,_,!1),P=this.getThirdPoint(i,s,h,_,!0);return this.toPositions([d,y,C,s,m,P,g,i],n)}static createStraightArrow(t,e={}){if(!t||t.length<2)return[];const[i,s]=t.map(t=>this.toLonLat(t)),n=t[0][2]||0,o=e.arrowLengthScale??5,r=e.maxArrowLength??3e6;let l=this.mathDistance(i,s)/o;l=Math.min(l,r);const a=this.getThirdPoint(i,s,Math.PI/6,l/2,!1),h=this.getThirdPoint(i,s,Math.PI/6,l/2,!0);return this.toPositions([i,s,a,s,h],n)}static createTriangle(t){return!t||t.length<3?[]:t.slice(0,3).map(t=>[t[0],t[1],t[2]||0])}static createSector(t){if(!t||t.length<3)return[];const[e,i,s]=t.map(t=>this.toLonLat(t)),n=t[0][2]||0,o=this._calcSphericalDistance(i,e),r=this._getGeoArcPointsBetween(e,i,s,o);return r.push(e),this.toPositions(r,n)}static createEllipse(t){if(!t||t.length<3)return[];const e=t.slice(0,3),[i,s,n]=e.map(t=>this.toLonLat(t)),o=e[0][2]||0,r=[s[0]-i[0],s[1]-i[1]],l=[n[0]-i[0],n[1]-i[1]],a=[];for(let t=0;t<=100;t++){const e=2*Math.PI*t/100,s=i[0]+r[0]*Math.cos(e)+l[0]*Math.sin(e),n=i[1]+r[1]*Math.cos(e)+l[1]*Math.sin(e);a.push([s,n])}return this.toPositions(a,o)}static _getAttackArrowHeadPoints(t,e={}){if(!t||t.length<2)return[];const i=e.headHeightFactor??.18,s=e.headWidthFactor??.3,n=e.neckHeightFactor??.85,o=e.neckWidthFactor??.15,r=e.headTailFactor??.8;let l=this.getBaseLength(t)*i;const a=t[t.length-1],h=this.mathDistance(a,t[t.length-2]),c=this.mathDistance(e.tailLeft,e.tailRight);l>c*r&&(l=c*r);const u=l*s,_=l*o;l=Math.min(l,h);const p=l*n,d=this.getThirdPoint(t[t.length-2],a,0,l,!0),g=this.getThirdPoint(t[t.length-2],a,0,p,!0),C=this.getThirdPoint(a,d,Math.PI/2,u,!1),m=this.getThirdPoint(a,d,Math.PI/2,u,!0);return[this.getThirdPoint(a,g,Math.PI/2,_,!1),C,a,m,this.getThirdPoint(a,g,Math.PI/2,_,!0)]}static _getAttackArrowBodyPoints(t,e,i,s){const n=this.wholeDistance(t),o=this.getBaseLength(t)*s,r=(o-this.mathDistance(e,i))/2;let l=0;const a=[],h=[];for(let e=1;e<t.length-1;e++){const i=this.getAngleOfThreePoints(t[e-1],t[e],t[e+1])/2;l+=this.mathDistance(t[e-1],t[e]);const s=(o/2-l/n*r)/Math.sin(i),c=this.getThirdPoint(t[e-1],t[e],Math.PI-i,s,!0),u=this.getThirdPoint(t[e-1],t[e],i,s,!1);a.push(c),h.push(u)}return a.concat(h)}static _getSquadTailPoints(t,e,i=0){const s=this.getBaseLength(t)*e,n=this.getThirdPoint(t[1],t[0],Math.PI/2,s,!1),o=this.getThirdPoint(t[1],t[0],Math.PI/2,s,!0);if(i>0){const e=s*i;return[n,this.getThirdPoint(t[1],t[0],0,e,!0),o]}return[n,o]}static createAttackArrow(t,e={}){if(!t||t.length<3)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0;let[n,o]=[i[0],i[1]];this.isClockWise(i[0],i[1],i[2])&&(n=i[1],o=i[0]);const r=[this.mid(n,o)].concat(i.slice(2)),l=this._getAttackArrowHeadPoints(r,{...e,tailLeft:n,tailRight:o});if(!l||0===l.length)return this.toPositions(i,s);const[a,h]=[l[0],l[4]],c=this.mathDistance(n,o)/this.getBaseLength(r),u=this._getAttackArrowBodyPoints(r,a,h,c),_=u.length;let p=[n].concat(u.slice(0,_/2));p.push(a);let d=[o].concat(u.slice(_/2,_));d.push(h),p=this.getQBSplinePoints(p),d=this.getQBSplinePoints(d);const g=this._closePolygonPoints(p.concat(l,d.reverse()));return this.toPositions(g,s)}static createSwallowtailAttackArrow(t,e={}){if(!t||t.length<3)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0;let[n,o]=[i[0],i[1]];this.isClockWise(i[0],i[1],i[2])&&(n=i[1],o=i[0]);const r=[this.mid(n,o)].concat(i.slice(2)),l=this._getAttackArrowHeadPoints(r,{...e,tailLeft:n,tailRight:o});if(!l||0===l.length)return this.toPositions(i,s);const[a,h]=[l[0],l[4]],c=e.tailWidthFactor??.1,u=e.swallowTailFactor??1,_=this.getBaseLength(r),p=this.mathDistance(n,o),d=_*c*u,g=this.getThirdPoint(r[1],r[0],0,d,!0),C=p/_,m=this._getAttackArrowBodyPoints(r,a,h,C),y=m.length;let P=[n].concat(m.slice(0,y/2));P.push(a);let f=[o].concat(m.slice(y/2,y));f.push(h),P=this.getQBSplinePoints(P),f=this.getQBSplinePoints(f);const E=this._closePolygonPoints(P.concat(l,f.reverse(),[g,P[0]]));return this.toPositions(E,s)}static createSquadCombat(t,e={}){if(!t||t.length<2)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0,n=e.tailWidthFactor??.1,o=this._getSquadTailPoints(i,n),r=this._getAttackArrowHeadPoints(i,{...e,tailLeft:o[0],tailRight:o[1]});if(!r||0===r.length)return this.toPositions(i,s);const[l,a]=[r[0],r[4]],h=this._getAttackArrowBodyPoints(i,l,a,n),c=h.length;let u=[o[0]].concat(h.slice(0,c/2));u.push(l);let _=[o[1]].concat(h.slice(c/2,c));_.push(a),u=this.getQBSplinePoints(u),_=this.getQBSplinePoints(_);const p=this._closePolygonPoints(u.concat(r,_.reverse()));return this.toPositions(p,s)}static createSwallowtailSquadCombat(t,e={}){if(!t||t.length<2)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0,n=e.tailWidthFactor??.1,o=e.swallowTailFactor??1,r=this._getSquadTailPoints(i,n,o),l=this._getAttackArrowHeadPoints(i,{...e,tailLeft:r[0],tailRight:r[2]});if(!l||0===l.length)return this.toPositions(i,s);const[a,h]=[l[0],l[4]],c=this._getAttackArrowBodyPoints(i,a,h,n),u=c.length;let _=[r[0]].concat(c.slice(0,u/2));_.push(a);let p=[r[2]].concat(c.slice(u/2,u));p.push(h),_=this.getQBSplinePoints(_),p=this.getQBSplinePoints(p);const d=this._closePolygonPoints(_.concat(l,p.reverse(),[r[1],_[0]]));return this.toPositions(d,s)}static createDoubleArrow(t,e={}){if(!t||t.length<3)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0,[n,o,r]=i,l=i.length;let a,h;3===l?(a=this._getDoubleArrowTempPoint4(n,o,r),h=this.mid(n,o)):4===l?(a=i[3],h=this.mid(n,o)):(a=i[3],h=i[4]),e.headHeightFactor,e.headWidthFactor,e.neckHeightFactor,e.neckWidthFactor;let c,u;this.isClockWise(n,o,r)?(c=this._getDoubleArrowPoints(n,h,a,!1,e),u=this._getDoubleArrowPoints(h,o,r,!0,e)):(c=this._getDoubleArrowPoints(o,h,r,!1,e),u=this._getDoubleArrowPoints(h,n,a,!0,e));const _=c.length,p=(_-5)/2,d=c.slice(0,p),g=c.slice(p,p+5);let C=c.slice(p+5,_),m=u.slice(0,p);const y=u.slice(p,p+5),P=u.slice(p+5,_);m=this.getBezierPoints(m);const f=this.getBezierPoints(P.concat(d.slice(1)));C=this.getBezierPoints(C);const E=this._closePolygonPoints(m.concat(y,f,g,C));return this.toPositions(E,s)}static _getDoubleArrowTempPoint4(t,e,i){const s=this.mid(t,e),n=this.mathDistance(s,i),o=this.getAngleOfThreePoints(t,s,i);let r,l,a,h=[0,0];return o<Math.PI/2?(r=n*Math.sin(o),l=n*Math.cos(o),a=this.getThirdPoint(t,s,Math.PI/2,r,!1),h=this.getThirdPoint(s,a,Math.PI/2,l,!0)):o<Math.PI?(r=n*Math.sin(Math.PI-o),l=n*Math.cos(Math.PI-o),a=this.getThirdPoint(t,s,Math.PI/2,r,!1),h=this.getThirdPoint(s,a,Math.PI/2,l,!1)):o<1.5*Math.PI?(r=n*Math.sin(o-Math.PI),l=n*Math.cos(o-Math.PI),a=this.getThirdPoint(t,s,Math.PI/2,r,!0),h=this.getThirdPoint(s,a,Math.PI/2,l,!0)):(r=n*Math.sin(2*Math.PI-o),l=n*Math.cos(2*Math.PI-o),a=this.getThirdPoint(t,s,Math.PI/2,r,!0),h=this.getThirdPoint(s,a,Math.PI/2,l,!1)),h}static _getDoubleArrowPoints(t,e,i,s,n={}){n.headHeightFactor,n.headWidthFactor,n.neckHeightFactor,n.neckWidthFactor;const o=this.mid(t,e),r=this.mathDistance(o,i);let l=this.getThirdPoint(i,o,0,.3*r,!0),a=this.getThirdPoint(i,o,0,.5*r,!0);l=this.getThirdPoint(o,l,Math.PI/2,r/5,s),a=this.getThirdPoint(o,a,Math.PI/2,r/4,s);const h=[o,l,a,i],c=this._getDoubleArrowHeadPoints(h,n);if(!c||0===c.length)return[];const u=c[0],_=c[4],p=this.mathDistance(t,e)/this.getBaseLength(h)/2,d=this._getAttackArrowBodyPoints(h,u,_,p),g=d.length;let C=d.slice(0,g/2),m=d.slice(g/2,g);return C.push(u),m.push(_),C=C.reverse(),C.push(e),m=m.reverse(),m.push(t),C.reverse().concat(c,m)}static _getDoubleArrowHeadPoints(t,e={}){const i=this.getBaseLength(t)*(e.headHeightFactor??.25),s=t[t.length-1],n=i*(e.headWidthFactor??.3),o=i*(e.neckWidthFactor??.15),r=i*(e.neckHeightFactor??.85),l=this.getThirdPoint(t[t.length-2],s,0,i,!0),a=this.getThirdPoint(t[t.length-2],s,0,r,!0),h=this.getThirdPoint(s,l,Math.PI/2,n,!1),c=this.getThirdPoint(s,l,Math.PI/2,n,!0);return[this.getThirdPoint(s,a,Math.PI/2,o,!1),h,s,c,this.getThirdPoint(s,a,Math.PI/2,o,!0)]}static createCurvedArrow(t,e={}){if(!t||t.length<2)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0;if(2===t.length)return this.createStraightArrow(t,e);const n=e.t??.3,o=e.arrowLengthScale??5,r=e.maxArrowLength??3e6,l=this.getCurvePoints(n,i);i[i.length-2];const a=i[i.length-1];let h=this.wholeDistance(i)/o;h=Math.min(h,r);const c=this.getThirdPoint(l[l.length-2],l[l.length-1],Math.PI/6,h/2,!1),u=this.getThirdPoint(l[l.length-2],l[l.length-1],Math.PI/6,h/2,!0),_=l.concat([c,a,u]);return this.toPositions(_,s)}static createCurve(t,e={}){if(!t||t.length<2)return[];const i=t.map(t=>this.toLonLat(t)),s=t[0][2]||0;if(2===t.length)return this.toPositions(i,s);const n=e.t??.3,o=this.getCurvePoints(n,i);return this.toPositions(o,s)}}const l={TRIANGLE:"triangle",SECTOR:"sector",ELLIPSE:"ellipse",FINE_ARROW:"fineArrow",ASSAULT_DIRECTION:"assaultDirection",ATTACK_ARROW:"attackArrow",SWALLOWTAIL_ATTACK_ARROW:"swallowtailAttackArrow",SQUAD_COMBAT:"squadCombat",SWALLOWTAIL_SQUAD_COMBAT:"swallowtailSquadCombat",DOUBLE_ARROW:"doubleArrow",STRAIGHT_ARROW:"straightArrow",CURVED_ARROW:"curvedArrow",CURVE:"curve"};class a{constructor(t,e){this._entity=e,this._graphicModule=t}setPosition(t){return this._entity.position=Cesium.Cartesian3.fromDegrees(...t),this}setColor(t){return this._entity.point.color=t,this}setPixelSize(t){return this._entity.point.pixelSize=t,this}setVisible(t){return this._entity.show=t,this}setHeightReference(t){return this._entity.point.heightReference=t,this}setDisableDepthTestDistance(t){return this._entity.point.disableDepthTestDistance=t,this}setOutlineColor(t){return this._entity.point.outlineColor=t,this}setOutlineWidth(t){return this._entity.point.outlineWidth=t,this}setName(t){return this._entity.id=t,this}setNameVisible(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.show=t,this}setText(t,e={}){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.text=t,this._entity.label.disableDepthTestDistance=e.disableDepthTestDistance??Number.POSITIVE_INFINITY,this._entity.label.verticalOrigin=e.verticalOrigin??Cesium.VerticalOrigin.BOTTOM,this._entity.label.eyeOffset=e.eyeOffset??new Cesium.Cartesian3(0,0,-10),this._entity.label.heightReference=e.heightReference??Cesium.HeightReference.RELATIVE_TO_GROUND,this}setFont(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.font=t,this}setTextColor(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.fillColor=t,this}setTextOutlineColor(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.outlineColor=t,this}setTextOutlineWidth(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.outlineWidth=t,this}setAlignType(t){this._entity.label||(this._entity.label=new Cesium.LabelGraphics);const e=[Cesium.HorizontalOrigin.CENTER,Cesium.HorizontalOrigin.LEFT,Cesium.HorizontalOrigin.RIGHT],i=[Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.TOP,Cesium.VerticalOrigin.BOTTOM];return this._entity.label.horizontalOrigin=e[t]||Cesium.HorizontalOrigin.CENTER,this._entity.label.verticalOrigin=i[t]||Cesium.VerticalOrigin.CENTER,this}setTextPixelOffset(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.pixelOffset=t,this}setTextScale(t){return this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.scale=t,this}remove(){return this._graphicModule.removeGraphic(this._entity.id),this}}class h{constructor(t,e){this._entity=e,this._graphicModule=t}setPositions(t){return this._entity.polyline.positions=Cesium.Cartesian3.fromDegreesArrayHeights(t.flatMap(t=>[t[0],t[1],t[2]||0])),this}setColor(t){return this._entity.polyline.material=t,this}setWidth(t){return this._entity.polyline.width=t,this}setMaterial(t){return this._entity.polyline.material=t,this}setVisible(t){return this._entity.show=t,this}setClampToGround(t){return this._entity.polyline.clampToGround=t,this}setName(t){return this._entity.id=t,this}setLabel(t,e={}){this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.text=t,this._entity.label.font=e.font||"14px Microsoft YaHei",this._entity.label.fillColor=e.color||Cesium.Color.WHITE,this._entity.label.outlineColor=e.outlineColor||Cesium.Color.BLACK,this._entity.label.outlineWidth=e.outlineWidth??1,this._entity.label.show=!0,this._entity.label.pixelOffset=e.pixelOffset||new Cesium.Cartesian2(0,-10),this._entity.label.horizontalOrigin=e.horizontalOrigin??Cesium.HorizontalOrigin.CENTER,this._entity.label.verticalOrigin=e.verticalOrigin??Cesium.VerticalOrigin.BOTTOM;const i=this;return this._entity.position=new Cesium.CallbackProperty(function(){const t=i._computeLabelAnchor();return Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0)},!1),this}_computeLabelAnchor(){if(this._entity._isPlotGraphic&&this._entity._controlPoints?.length){const t=this._entity._controlPoints;let e=0,i=0,s=0;return t.forEach(t=>{e+=t[0],i+=t[1],s+=t[2]||0}),[e/t.length,i/t.length,s/t.length]}const t=this._entity.polyline?.positions?.getValue(Cesium.JulianDate.now());if(t&&t.length>0){let e=0,i=0,s=0;t.forEach(t=>{const n=Cesium.Cartographic.fromCartesian(t);e+=Cesium.Math.toDegrees(n.longitude),i+=Cesium.Math.toDegrees(n.latitude),s+=n.height||0});const n=t.length;return[e/n,i/n,s/n]}return[0,0,0]}setPlotType(t,e,i={}){this._entity._isPlotGraphic=!0,this._entity._plotType=t,this._entity._controlPoints=JSON.parse(JSON.stringify(e));const s=`create${this._capitalizePlotType(t)}`;if(!r[s])return console.warn(`未知标绘类型: ${t}`),this;const n=r[s](e,i);return this.setPositions(n),this}setControlPoints(t,e={}){return this._entity._isPlotGraphic?this.setPlotType(this._entity._plotType,t,e):(console.warn("非标绘图元,请使用 setPositions"),this)}_capitalizePlotType(t){return t.replace(/-([a-z])/g,t=>t[1].toUpperCase()).replace(/^./,t=>t.toUpperCase())}remove(){return this._graphicModule.removeGraphic(this._entity.id),this}}class c{constructor(t,e){this._entity=e,this._graphicModule=t}setPositions(t){return this._entity.polygon.hierarchy=new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(t.flatMap(t=>[t[0],t[1],t[2]||0]))),this}setColor(t){return this._entity.polygon.material=t,this}setOutlineColor(t){return this._entity.polygon.outlineColor=t,this}setOutlineWidth(t){return this._entity.polygon.outlineWidth=t,this}setVisible(t){return this._entity.show=t,this}setClampToGround(t){return this._entity.polygon.clampToGround=t,this}setHeightReference(t){return this._entity.polygon.heightReference=t,this}setName(t){return this._entity.id=t,this}setLabel(t,e={}){this._entity.label||(this._entity.label=new Cesium.LabelGraphics),this._entity.label.text=t,this._entity.label.font=e.font||"14px Microsoft YaHei",this._entity.label.fillColor=e.color||Cesium.Color.WHITE,this._entity.label.outlineColor=e.outlineColor||Cesium.Color.BLACK,this._entity.label.outlineWidth=e.outlineWidth??1,this._entity.label.show=!0,this._entity.label.pixelOffset=e.pixelOffset||new Cesium.Cartesian2(0,-10),this._entity.label.horizontalOrigin=e.horizontalOrigin??Cesium.HorizontalOrigin.CENTER,this._entity.label.verticalOrigin=e.verticalOrigin??Cesium.VerticalOrigin.BOTTOM;const i=this;return this._entity.position=new Cesium.CallbackProperty(function(){const t=i._computeLabelAnchor();return Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0)},!1),this}_computeLabelAnchor(){if(this._entity._isPlotGraphic&&this._entity._controlPoints?.length){const t=this._entity._controlPoints;if(this._entity._plotType===l.SECTOR||this._entity._plotType===l.ELLIPSE)return t[0];let e=0,i=0,s=0;return t.forEach(t=>{e+=t[0],i+=t[1],s+=t[2]||0}),[e/t.length,i/t.length,s/t.length]}const t=this._entity.polygon?.hierarchy?.getValue(Cesium.JulianDate.now());if(t&&t.positions&&t.positions.length>0){let e=0,i=0,s=0;t.positions.forEach(t=>{const n=Cesium.Cartographic.fromCartesian(t);e+=Cesium.Math.toDegrees(n.longitude),i+=Cesium.Math.toDegrees(n.latitude),s+=n.height||0});const n=t.positions.length;return[e/n,i/n,s/n]}return[0,0,0]}setPlotType(t,e,i={}){this._entity._isPlotGraphic=!0,this._entity._plotType=t,this._entity._controlPoints=JSON.parse(JSON.stringify(e));const s=`create${this._capitalizePlotType(t)}`;if(!r[s])return console.warn(`未知标绘类型: ${t}`),this;const n=r[s](e,i);return this.setPositions(n),this}setControlPoints(t,e={}){return this._entity._isPlotGraphic?this.setPlotType(this._entity._plotType,t,e):(console.warn("非标绘图元,请使用 setPositions"),this)}_capitalizePlotType(t){return t.replace(/-([a-z])/g,t=>t[1].toUpperCase()).replace(/^./,t=>t.toUpperCase())}remove(){return this._graphicModule.removeGraphic(this._entity.id),this}}class u{constructor(t,e){this._entity=e,this._graphicModule=t}setPosition(t){return this._entity.position=Cesium.Cartesian3.fromDegrees(...t),this}setUrl(t){return this._entity.model.uri=t,this}setScale(t){return this._entity.model.scale=t,this}setMinimumPixelSize(t){return this._entity.model.minimumPixelSize=t,this}setVisible(t){return this._entity.show=t,this}setColor(t){return this._entity.model.color=t,this}setName(t){return this._entity.id=t,this}remove(){return this._graphicModule.removeGraphic(this._entity.id),this}}class _{constructor(t,e){this._entity=e,this._graphicModule=t}setPosition(t){return this._entity.position=Cesium.Cartesian3.fromDegrees(...t),this}setText(t){return this._entity.label.text=t,this}setFont(t){return this._entity.label.font=t,this}setColor(t){return this._entity.label.fillColor=t,this}setOutlineColor(t){return this._entity.label.outlineColor=t,this}setOutlineWidth(t){return this._entity.label.outlineWidth=t,this}setVisible(t){return this._entity.show=t,this}setPixelOffset(t){return this._entity.label.pixelOffset=t,this}setScale(t){return this._entity.label.scale=t,this}setAlignType(t){const e=[Cesium.HorizontalOrigin.CENTER,Cesium.HorizontalOrigin.LEFT,Cesium.HorizontalOrigin.RIGHT],i=[Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.CENTER,Cesium.VerticalOrigin.TOP,Cesium.VerticalOrigin.BOTTOM];return this._entity.label.horizontalOrigin=e[t]||Cesium.HorizontalOrigin.CENTER,this._entity.label.verticalOrigin=i[t]||Cesium.VerticalOrigin.CENTER,this}setName(t){return this._entity.id=t,this}remove(){return this._graphicModule.removeGraphic(this._entity.id),this}}class p{constructor(e){this.viewer=e,this.config=t.getInstance().getConfig(),this.graphicMap=new Map,this.wrapperMap=new Map}createPoint(t){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const e=this.config.graphic?.point||{pixelSize:8,color:Cesium.Color.RED},i={id:t,position:Cesium.Cartesian3.fromDegrees(0,0,0),point:{...e,outlineColor:Cesium.Color.WHITE,outlineWidth:1}},s=this.viewer.entities.add(i);this.graphicMap.set(t,s);const n=new a(this,s);return this.wrapperMap.set(t,n),console.log(`点图元 ${t} 创建成功`),n}CreatePoint(t){return this.createPoint(t)}createLine(t){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const e=this.config.graphic?.line||{width:2,material:Cesium.Color.BLUE},i={id:t,polyline:{positions:Cesium.Cartesian3.fromDegreesArrayHeights([]),clampToGround:!0,...e}},s=this.viewer.entities.add(i);this.graphicMap.set(t,s);const n=new h(this,s);return this.wrapperMap.set(t,n),console.log(`线图元 ${t} 创建成功`),n}CreateLine(t){return this.createLine(t)}createPolygon(t){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const e=this.config.graphic?.polygon||{color:Cesium.Color.GREEN.withAlpha(.5)},i={id:t,polygon:{hierarchy:new Cesium.PolygonHierarchy([]),clampToGround:!0,outlineColor:Cesium.Color.WHITE,outlineWidth:1,...e}},s=this.viewer.entities.add(i);this.graphicMap.set(t,s);const n=new c(this,s);return this.wrapperMap.set(t,n),console.log(`面图元 ${t} 创建成功`),n}CreatePolygon(t){return this.createPolygon(t)}createModel(t){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const e={id:t,position:Cesium.Cartesian3.fromDegrees(0,0,0),model:{uri:"",scale:1,minimumPixelSize:128}},i=this.viewer.entities.add(e);this.graphicMap.set(t,i);const s=new u(this,i);return this.wrapperMap.set(t,s),console.log(`模型图元 ${t} 创建成功`),s}CreateModel(t){return this.createModel(t)}createText(t){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const e={id:t,position:Cesium.Cartesian3.fromDegrees(0,0,0),label:{text:"",font:"16px Microsoft YaHei",fillColor:Cesium.Color.WHITE,outlineColor:Cesium.Color.BLACK,outlineWidth:2,style:Cesium.LabelStyle.FILL_AND_OUTLINE,verticalOrigin:Cesium.VerticalOrigin.BOTTOM,horizontalOrigin:Cesium.HorizontalOrigin.CENTER}},i=this.viewer.entities.add(e);this.graphicMap.set(t,i);const s=new _(this,i);return this.wrapperMap.set(t,s),console.log(`文本图元 ${t} 创建成功`),s}CreateText(t){return this.createText(t)}createPlotGraphic(t,e,i=[]){if(this.wrapperMap.has(t))return console.warn(`图元 ${t} 已存在`),this.wrapperMap.get(t);const s=function(t){return[l.STRAIGHT_ARROW,l.CURVED_ARROW,l.CURVE].includes(t)}(e),n=s?this.createLine(t):this.createPolygon(t);if(i.length>0){const t=this._getPlotOptions(e);n.setPlotType(e,i,t)}else n._entity._isPlotGraphic=!0,n._entity._plotType=e,n._entity._controlPoints=[];return console.log(`标绘图元 ${t}(${e})创建成功`),n}createFineArrow(t,e=[]){return this.createPlotGraphic(t,l.FINE_ARROW,e)}createAssaultDirection(t,e=[]){return this.createPlotGraphic(t,l.ASSAULT_DIRECTION,e)}createStraightArrow(t,e=[]){return this.createPlotGraphic(t,l.STRAIGHT_ARROW,e)}createTriangle(t,e=[]){return this.createPlotGraphic(t,l.TRIANGLE,e)}createSector(t,e,i,s,n){const o=(s||0)*Math.PI/180,a=(void 0===n?90:n)*Math.PI/180,h=[e,r._getPointAtBearingAndDistance(e,i,o),r._getPointAtBearingAndDistance(e,i,a)];return this.createPlotGraphic(t,l.SECTOR,h)}createEllipse(t,e=[]){return this.createPlotGraphic(t,l.ELLIPSE,e)}createAttackArrow(t,e=[]){return this.createPlotGraphic(t,l.ATTACK_ARROW,e)}createSwallowtailAttackArrow(t,e=[]){return this.createPlotGraphic(t,l.SWALLOWTAIL_ATTACK_ARROW,e)}createSquadCombat(t,e=[]){return this.createPlotGraphic(t,l.SQUAD_COMBAT,e)}createSwallowtailSquadCombat(t,e=[]){return this.createPlotGraphic(t,l.SWALLOWTAIL_SQUAD_COMBAT,e)}createDoubleArrow(t,e=[]){return this.createPlotGraphic(t,l.DOUBLE_ARROW,e)}createCurvedArrow(t,e=[]){return this.createPlotGraphic(t,l.CURVED_ARROW,e)}createCurve(t,e=[]){return this.createPlotGraphic(t,l.CURVE,e)}_getPlotOptions(t){this.config.graphic;return{}}removeGraphic(t){if(!this.graphicMap.has(t))return console.warn(`图元 ${t} 不存在`),!1;const e=this.graphicMap.get(t);return this.viewer.entities.remove(e),this.graphicMap.delete(t),this.wrapperMap.delete(t),!0}getGraphic(t){return this.graphicMap.get(t)}}class d{constructor(e){this.viewer=e,this.config=t.getInstance().getConfig(),this.observers=new Map,this.handlers={}}registerObserver(t,e){const i=`obs-${Date.now()}-${Math.random().toString(36).slice(2)}`,[s,n]=t.split(":");return this.observers.has(t)||(this.observers.set(t,new Map),this.createEventHandler(s,n)),this.observers.get(t).set(i,e),i}unregisterObserver(t,e){if(!this.observers.has(t))return!1;const i=this.observers.get(t);return!!i.has(e)&&(i.delete(e),0===i.size&&(this.destroyEventHandler(t),this.observers.delete(t)),!0)}unregisterAllObservers(){Object.keys(this.handlers).forEach(t=>{const e=this.handlers[t];if(!e)return;const[i]=t.split(":");if("mouse"===i&&"function"==typeof e.destroy)e.destroy();else if("scene"===i&&"function"==typeof e)e();else if("keyboard"===i){const i=t.split(":")[1];document.removeEventListener(i,e)}}),this.handlers={},this.observers.clear()}createEventHandler(t,e){const i=`${t}:${e}`;if(!this.handlers[i])switch(t){case"mouse":this.handlers[i]=new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);const t=this.getCesiumMouseEventType(e);this.handlers[i].setInputAction(t=>{const e=t.position||t.endPosition;if(!e)return;let s=null,n=null;try{s=this.viewer.scene.pickPosition(e)}catch(t){console.warn("获取点击位置失败:",t)}const o=this.viewer.scene.pick(e);if(s){const t=Cesium.Cartographic.fromCartesian(s);n=[Cesium.Math.toDegrees(t.longitude),Cesium.Math.toDegrees(t.latitude),t.height]}this.observers.get(i).forEach(e=>{e(n,o?o.id:null,t)})},t);break;case"scene":if("load"===e){let t=null;const e=()=>{t&&(t(),t=null),this.observers.get(i)?.forEach(t=>t())};t=this.viewer.scene.postRender.addEventListener(e),this.handlers[i]=t}else"zoom"===e&&(this.handlers[i]=this.viewer.camera.changed.addEventListener(()=>{const t=this.getZoomLevel();this.observers.get(i).forEach(e=>e(t))}));break;case"keyboard":this.handlers[i]=t=>{t.type===e&&this.observers.get(i).forEach(e=>e(t))},document.addEventListener(e,this.handlers[i])}}destroyEventHandler(t){const[e,i]=t.split(":"),s=t;this.handlers[s]&&("mouse"===e?this.handlers[s].destroy():"scene"===e?"function"==typeof this.handlers[s]&&this.handlers[s]():"keyboard"===e&&document.removeEventListener(i,this.handlers[s]),delete this.handlers[s])}getCesiumMouseEventType(t){switch(t){case"click":default:return Cesium.ScreenSpaceEventType.LEFT_CLICK;case"rightclick":return Cesium.ScreenSpaceEventType.RIGHT_CLICK;case"move":return Cesium.ScreenSpaceEventType.MOUSE_MOVE;case"down":return Cesium.ScreenSpaceEventType.LEFT_DOWN;case"up":return Cesium.ScreenSpaceEventType.LEFT_UP}}getZoomLevel(){const t=this.viewer.camera,e=t.positionCartographic,i=Cesium.Cartesian3.fromRadians(e.longitude,e.latitude,e.height),s=Cesium.Cartesian3.distance(t.position,i);return Math.floor(Math.log2(12756274*Math.PI/s))+1}}class g{constructor(t,e={}){this._editor=t,this._viewer=t.viewer,this._graphicModule=t.graphicModule,this._eventModule=t.eventModule,this._options=e,this._isActive=!1,this._handlers=[]}activate(){this._isActive||(this._isActive=!0,this.onActivate())}deactivate(){this._isActive&&(this._isActive=!1,this.onDeactivate(),this.clearHandlers())}onActivate(){}onDeactivate(){}registerObserver(t,e){const i=this._eventModule.registerObserver(t,(i,s,n)=>{"mouse:move"===t?e(n):e(i,s,n)});return this._handlers.push({eventType:t,observerId:i}),i}clearHandlers(){this._handlers.forEach(({eventType:t,observerId:e})=>{this._eventModule.unregisterObserver(t,e)}),this._handlers=[]}screenToLonLat(t){if(!t||null==t.x||null==t.y)return null;let e=null;try{e=this._viewer.scene.pickPosition(t)}catch(t){}if(e||(e=this._viewer.camera.pickEllipsoid(new Cesium.Cartesian3(t.x,t.y),this._viewer.scene.globe.ellipsoid)),!e)return null;const i=Cesium.Cartographic.fromCartesian(e);return[Cesium.Math.toDegrees(i.longitude),Cesium.Math.toDegrees(i.latitude),i.height]}async getTerrainHeight(t){const e=Cesium.Cartographic.fromDegrees(t[0],t[1]);return(await Cesium.sampleTerrainMostDetailed(this._viewer.terrainProvider,[e]))[0].height}createTempEntity(t,e){return this._viewer.entities.add({id:`${t}`,...e})}removeTempEntity(t){t&&this._viewer.entities.remove(t)}generateId(t="tool"){return`${t}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}}const C={POINT:"point",LINE:"line",POLYGON:"polygon",RECTANGLE:"rectangle",CIRCLE:"circle",TRIANGLE:"triangle",SECTOR:"sector",ELLIPSE:"ellipse",FINE_ARROW:"fineArrow",ASSAULT_DIRECTION:"assaultDirection",STRAIGHT_ARROW:"straightArrow",ATTACK_ARROW:"attackArrow",SWALLOWTAIL_ATTACK_ARROW:"swallowtailAttackArrow",SQUAD_COMBAT:"squadCombat",SWALLOWTAIL_SQUAD_COMBAT:"swallowtailSquadCombat",DOUBLE_ARROW:"doubleArrow",CURVED_ARROW:"curvedArrow",CURVE:"curve"},m={[C.TRIANGLE]:{category:"polygon",minPoints:3,finishOnCount:3,plotType:l.TRIANGLE},[C.SECTOR]:{category:"polygon",minPoints:3,finishOnCount:3,plotType:l.SECTOR},[C.ELLIPSE]:{category:"polygon",minPoints:3,finishOnCount:3,plotType:l.ELLIPSE},[C.FINE_ARROW]:{category:"polygon",minPoints:2,finishOnCount:2,plotType:l.FINE_ARROW},[C.ASSAULT_DIRECTION]:{category:"polygon",minPoints:2,finishOnCount:2,plotType:l.ASSAULT_DIRECTION},[C.STRAIGHT_ARROW]:{category:"line",minPoints:2,finishOnCount:2,plotType:l.STRAIGHT_ARROW},[C.ATTACK_ARROW]:{category:"polygon",minPoints:3,finishOnDoubleClick:!0,plotType:l.ATTACK_ARROW},[C.SWALLOWTAIL_ATTACK_ARROW]:{category:"polygon",minPoints:3,finishOnDoubleClick:!0,plotType:l.SWALLOWTAIL_ATTACK_ARROW},[C.SQUAD_COMBAT]:{category:"polygon",minPoints:2,finishOnDoubleClick:!0,plotType:l.SQUAD_COMBAT},[C.SWALLOWTAIL_SQUAD_COMBAT]:{category:"polygon",minPoints:2,finishOnDoubleClick:!0,plotType:l.SWALLOWTAIL_SQUAD_COMBAT},[C.DOUBLE_ARROW]:{category:"polygon",minPoints:4,finishOnCount:4,plotType:l.DOUBLE_ARROW},[C.CURVED_ARROW]:{category:"line",minPoints:2,finishOnDoubleClick:!0,plotType:l.CURVED_ARROW},[C.CURVE]:{category:"line",minPoints:2,finishOnDoubleClick:!0,plotType:l.CURVE}};class y extends g{constructor(t,e={}){super(t,e),this._drawType=e.drawType||C.POINT,this._tempEntities=[],this._tempPositions=[],this._isDrawing=!1,this._startPos=null,this._mouseMoveHandler=null,this._clickCount=0,this._previewLine=null,this._previewPolygon=null,this._previewRect=null,this._previewCircle=null,this._previewPlot=null,this._currentMousePos=null}setDrawType(t){return this._drawType=t,this}getDrawType(){return this._drawType}onActivate(){this.registerObserver("mouse:click",this._onClick.bind(this)),this.registerObserver("mouse:move",this._onMove.bind(this)),this.registerObserver("mouse:rightclick",this._onRightClick.bind(this)),this.registerObserver("keyboard:keydown",this._onKeyDown.bind(this))}onDeactivate(){this.clearTempEntities(),this._isDrawing=!1,this._tempPositions=[],this._clickCount=0,this._currentMousePos=null,this._startPos=null,this._previewPlot=null}_onClick(t,e,i){if(!t)return;const s=m[this._drawType];if(s)this._handlePlotClick(t,s);else switch(this._drawType){case C.POINT:this._drawPoint(t);break;case C.LINE:this._handleLineClick(t);break;case C.POLYGON:this._handlePolygonClick(t);break;case C.RECTANGLE:this._handleRectangleClick(t);break;case C.CIRCLE:this._handleCircleClick(t)}}_onMove(t){const e=t.position||t.endPosition;if(!e)return;const i=this.screenToLonLat({x:e.x,y:e.y});if(!i)return;if(this._currentMousePos=i,this._drawType===C.POINT)return;const s=m[this._drawType];s?this._isDrawing&&this._tempPositions.length>=s.minPoints-1&&this._updatePlotPreview(s,i):(this._isDrawing&&(this._drawType===C.LINE?this._updateTempLine(i):this._drawType===C.POLYGON&&this._updateTempPolygon(i)),this._startPos&&this._updateRectOrCirclePreview(i))}_onKeyDown(t){if("Escape"===t.key&&this.cancelDrawing(),"Enter"===t.key){const t=m[this._drawType];if(t&&this._isDrawing&&this._tempPositions.length>=t.minPoints)return void this._finishPlotDrawing(t);this.finishDrawing()}if("Backspace"===t.key&&this._isDrawing&&this._tempPositions.length>0){const t=m[this._drawType];if(t){this._tempPositions.pop();const e=this._tempEntities.pop();return e&&this.removeTempEntity(e),void this._updatePlotPreview(t)}this._tempPositions.pop();const e=this._tempEntities.pop();e&&this.removeTempEntity(e),this._updateTempPositions()}}_onRightClick(t,e,i){if(this._isDrawing){const t=m[this._drawType];if(t&&this._tempPositions.length>=t.minPoints)return void this._finishPlotDrawing(t);this.finishDrawing()}}_drawPoint(t){const e=this.generateId("point");this._graphicModule.CreatePoint(e).setPosition(t).setColor(Cesium.Color.RED).setPixelSize(10),this._emitGraphicCreated("point",e)}_handleLineClick(t){this._tempPositions.push(t),this._isDrawing=!0;const e=this.createTempEntity(this.generateId("temp_point"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.YELLOW,pixelSize:8}});this._tempEntities.push(e),this._tempPositions.length>=2&&this._updateTempLine(),this._emitDrawProgress("line",this._tempPositions.slice())}_handlePolygonClick(t){this._tempPositions.push(t),this._isDrawing=!0;const e=this.createTempEntity(this.generateId("temp_point"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.YELLOW,pixelSize:8}});this._tempEntities.push(e),this._tempPositions.length>=3&&this._updateTempPolygon(),this._emitDrawProgress("polygon",this._tempPositions.slice())}_handleRectangleClick(t){if(this._startPos)this._finishRectangle(t);else{this._startPos=t;const e=this.createTempEntity(this.generateId("temp_start"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.YELLOW,pixelSize:10}});this._tempEntities.push(e)}}_handleCircleClick(t){if(this._startPos)this._finishCircle(t);else{this._startPos=t;const e=this.createTempEntity(this.generateId("temp_start"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.YELLOW,pixelSize:10}});this._tempEntities.push(e)}}_updateTempLine(t){const e=[...this._tempPositions];t&&e.push(t);const i=[];for(const t of e)i.push(t[0],t[1],t[2]||0);const s=Cesium.Cartesian3.fromDegreesArrayHeights(i);this._previewLine?this._previewLine.polyline.positions=new Cesium.CallbackProperty(()=>s,!1):(this._previewLine=this.createTempEntity(this.generateId("temp_line"),{polyline:{positions:s,material:Cesium.Color.YELLOW,width:2}}),this._tempEntities.push(this._previewLine))}_updateTempPolygon(t){if(this._tempPositions.length<3)return;const e=[...this._tempPositions];t&&e.push(t);const i=[];for(const t of e)i.push(t[0],t[1],t[2]||0);const s=Cesium.Cartesian3.fromDegreesArrayHeights(i);this._previewPolygon?this._previewPolygon.polygon.hierarchy=new Cesium.CallbackProperty(()=>new Cesium.PolygonHierarchy(s),!1):(this._previewPolygon=this.createTempEntity(this.generateId("temp_polygon"),{polygon:{hierarchy:new Cesium.PolygonHierarchy(s),material:Cesium.Color.YELLOW.withAlpha(.5),outline:!1,outlineColor:Cesium.Color.YELLOW}}),this._tempEntities.push(this._previewPolygon))}_updateRectOrCirclePreview(t){this._startPos&&(this._drawType===C.RECTANGLE?this._updateRectPreview(t):this._drawType===C.CIRCLE&&this._updateCirclePreview(t))}_updateRectPreview(t){const e=this._startPos,i=t,s=[[e[0],e[1]],[i[0],e[1]],[i[0],i[1]],[e[0],i[1]],[e[0],e[1]]],n=[];for(const t of s)n.push(t[0],t[1],0);const o=Cesium.Cartesian3.fromDegreesArrayHeights(n);this._previewRect?(this._previewRect.polyline.positions=new Cesium.CallbackProperty(()=>{const t=this._startPos,e=this._currentMousePos;if(!t||!e)return o;const i=[[t[0],t[1]],[e[0],t[1]],[e[0],e[1]],[t[0],e[1]],[t[0],t[1]]],s=[];for(const t of i)s.push(t[0],t[1],0);return Cesium.Cartesian3.fromDegreesArrayHeights(s)},!1),this._previewRect.polygon.hierarchy=new Cesium.CallbackProperty(()=>{const t=this._startPos,e=this._currentMousePos;if(!t||!e)return new Cesium.PolygonHierarchy(o);const i=[[t[0],t[1]],[e[0],t[1]],[e[0],e[1]],[t[0],e[1]],[t[0],t[1]]],s=[];for(const t of i)s.push(t[0],t[1],0);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(s))},!1)):(this._previewRect=this.createTempEntity(this.generateId("temp_rect"),{polyline:{positions:new Cesium.CallbackProperty(()=>o,!1),material:Cesium.Color.YELLOW.withAlpha(.7),width:2},polygon:{hierarchy:new Cesium.CallbackProperty(()=>new Cesium.PolygonHierarchy(o),!1),material:Cesium.Color.YELLOW.withAlpha(.2),outline:!1}}),this._previewRect._isPreview=!0,this._tempEntities.push(this._previewRect))}_updateCirclePreview(t){const e=this._startPos,i=this._calcDistance(e,t);this._previewCircle?this._previewCircle.polygon.hierarchy=new Cesium.CallbackProperty(()=>{const t=this._calcDistance(this._startPos,this._currentMousePos),e=this._generateCirclePositions(this._startPos,t,64).flatMap(t=>[t[0],t[1],0]);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(e))},!1):(this._previewCircle=this.createTempEntity(this.generateId("temp_circle"),{polygon:{hierarchy:new Cesium.CallbackProperty(()=>{const t=this._generateCirclePositions(e,i,64).flatMap(t=>[t[0],t[1],0]);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(t))},!1),material:Cesium.Color.YELLOW.withAlpha(.2),outline:!1}}),this._previewCircle._isPreview=!0,this._tempEntities.push(this._previewCircle))}_finishRectangle(t){const e=this._startPos,i=[[e[0],e[1]],[t[0],e[1]],[t[0],t[1]],[e[0],t[1]]],s=this.generateId("rectangle");this._graphicModule.CreatePolygon(s).setPositions(i).setColor(Cesium.Color.BLUE.withAlpha(.5)).setOutlineColor(Cesium.Color.BLUE).setOutlineWidth(2).setHeightReference(Cesium.HeightReference.NONE),this.clearTempEntities(),this._startPos=null,this._emitGraphicCreated("rectangle",s)}_finishCircle(t){const e=this._startPos,i=this._calcDistance(e,t),s=this._generateCirclePositions(e,i,64),n=this.generateId("circle");console.log("创建圆:",{center:e,radius:i,edgeLonLat:t,positionsCount:s.length});const o=this._graphicModule.CreatePolygon(n);o.setPositions(s).setColor(Cesium.Color.BLUE.withAlpha(.5)).setOutlineColor(Cesium.Color.BLUE).setOutlineWidth(2);const r=o._entity;r._isCircle=!0,r._circleCenter=e,r._circleRadius=i,this.clearTempEntities(),this._startPos=null,this._currentMousePos=null,this._emitGraphicCreated("circle",n)}_generateCirclePositions(t,e,i){const[s,n]=t,o=[],r=Math.PI/180,l=111320*Math.cos(n*r);for(let t=0;t<=i;t++){const r=t/i*Math.PI*2,a=e*Math.cos(r)/l,h=e*Math.sin(r)/110540;o.push([s+a,n+h])}return o}_calcDistance(t,e){const[i,s]=t.map(t=>t*Math.PI/180),[n,o]=e.map(t=>t*Math.PI/180),r=o-s,l=n-i,a=Math.sin(r/2)**2+Math.cos(s)*Math.cos(o)*Math.sin(l/2)**2;return 6371e3*(2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)))}_normalizeEllipseControlPoints(t){if(!t||t.length<3)return t;const e=t[0],i=t[1],s=t[2],n=[i[0]-e[0],i[1]-e[1]],o=Math.hypot(n[0],n[1]);if(0===o)return t;const r=-(n[1]/o),l=n[0]/o,a=[s[0]-e[0],s[1]-e[1]],h=a[0]*r+a[1]*l;return[e,i,[e[0]+r*h,e[1]+l*h,e[2]||0]]}_handlePlotClick(t,e){this._tempPositions.push(t),this._isDrawing=!0;const i=this.createTempEntity(this.generateId("temp_point"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.YELLOW,pixelSize:8}});this._tempEntities.push(i),this._tempPositions.length>=e.minPoints&&this._updatePlotPreview(e),this._emitDrawProgress(e.plotType,this._tempPositions.slice()),e.finishOnCount&&this._tempPositions.length>=e.finishOnCount?this._finishPlotDrawing(e):e.finishOnDoubleClick&&this._tempPositions.length>=e.minPoints&&console.log(`标绘 ${e.plotType} 已达到最小点数,可右键或按 Enter 完成`)}_updatePlotPreview(t,e){const i=t.plotType===l.ELLIPSE,s=t=>i?this._normalizeEllipseControlPoints(t):t,n=[...this._tempPositions];if(e&&n.push(e),n.length<t.minPoints)return;const o=`create${this._capitalizePlotType(t.plotType)}`;if(!r[o])return void console.warn(`未知标绘类型: ${t.plotType}`);const a=s(n),h=r[o](a),c="line"===t.category,u=[];for(const t of h)u.push(t[0],t[1],t[2]||0);const _=Cesium.Cartesian3.fromDegreesArrayHeights(u);if(this._previewPlot){const e=this;c?this._previewPlot.polyline.positions=new Cesium.CallbackProperty(()=>{const i=[...e._tempPositions];if(e._currentMousePos&&i.push(e._currentMousePos),i.length<t.minPoints)return[];const n=r[o](s(i)),l=[];for(const t of n)l.push(t[0],t[1],t[2]||0);return Cesium.Cartesian3.fromDegreesArrayHeights(l)},!1):(this._previewPlot.polygon.hierarchy=new Cesium.CallbackProperty(()=>{const i=[...e._tempPositions];if(e._currentMousePos&&i.push(e._currentMousePos),i.length<t.minPoints)return new Cesium.PolygonHierarchy([]);const n=r[o](s(i)),l=[];for(const t of n)l.push(t[0],t[1],t[2]||0);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(l))},!1),this._previewPlot.polyline.positions=new Cesium.CallbackProperty(()=>{const i=[...e._tempPositions];if(e._currentMousePos&&i.push(e._currentMousePos),i.length<t.minPoints)return[];const n=r[o](s(i)),l=[];for(const t of n)l.push(t[0],t[1],t[2]||0);const a=Cesium.Cartesian3.fromDegreesArrayHeights(l);return[...a,a[0]]},!1))}else this._previewPlot=c?this.createTempEntity(this.generateId("temp_plot"),{polyline:{positions:new Cesium.CallbackProperty(()=>_,!1),material:Cesium.Color.YELLOW,width:2}}):this.createTempEntity(this.generateId("temp_plot"),{polygon:{hierarchy:new Cesium.CallbackProperty(()=>new Cesium.PolygonHierarchy(_),!1),material:Cesium.Color.YELLOW.withAlpha(.3),outline:!1},polyline:{positions:new Cesium.CallbackProperty(()=>[..._,_[0]],!1),material:Cesium.Color.YELLOW,width:1}}),this._previewPlot._isPreview=!0,this._tempEntities.push(this._previewPlot)}_finishPlotDrawing(t){if(this._tempPositions.length<t.minPoints)return;const e=`create${this._capitalizePlotType(t.plotType)}`;if(!r[e])return void console.warn(`未知标绘类型: ${t.plotType}`);const i=this.generateId(t.plotType),s="line"===t.category,n=t.plotType===l.ELLIPSE?this._normalizeEllipseControlPoints(this._tempPositions):this._tempPositions,o=this._graphicModule.createPlotGraphic(i,t.plotType,n);s?o.setColor(Cesium.Color.BLUE).setWidth(2):o.setColor(Cesium.Color.BLUE.withAlpha(.5)).setOutlineColor(Cesium.Color.BLUE).setOutlineWidth(2),this.clearTempEntities(),this._startPos=null,this._currentMousePos=null,this._isDrawing=!1,this._tempPositions=[],this._previewPlot=null,this._emitGraphicCreated(t.plotType,i)}_capitalizePlotType(t){return t.replace(/-([a-z])/g,t=>t[1].toUpperCase()).replace(/^./,t=>t.toUpperCase())}_updateTempPositions(){this._drawType===C.LINE?this._updateTempLine():this._drawType===C.POLYGON&&this._updateTempPolygon()}cancelDrawing(){this.clearTempEntities(),this._tempPositions=[],this._isDrawing=!1,this._clickCount=0,this._startPos=null,this._currentMousePos=null,this._emitDrawCancel()}finishDrawing(){if(this._drawType===C.LINE&&this._tempPositions.length>=2){const t=this.generateId("line");this._graphicModule.CreateLine(t).setPositions(this._tempPositions).setColor(Cesium.Color.BLUE).setWidth(2),this._emitGraphicCreated("line",t)}else if(this._drawType===C.POLYGON&&this._tempPositions.length>=3){const t=[...this._tempPositions,this._tempPositions[0]],e=this.generateId("polygon");this._graphicModule.CreatePolygon(e).setPositions(t).setColor(Cesium.Color.BLUE.withAlpha(.5)).setOutlineColor(Cesium.Color.BLUE),this._emitGraphicCreated("polygon",e)}this.clearTempEntities(),this._tempPositions=[],this._isDrawing=!1,this._clickCount=0,this._currentMousePos=null}clearTempEntities(){this._tempEntities.forEach(t=>{this.removeTempEntity(t)}),this._tempEntities=[],this._previewLine=null,this._previewPolygon=null,this._previewRect=null,this._previewCircle=null,this._previewPlot=null}_emitGraphicCreated(t,e){this._options.onGraphicCreated&&this._options.onGraphicCreated({type:t,id:e})}_emitDrawProgress(t,e){this._options.onDrawProgress&&this._options.onDrawProgress({type:t,positions:e})}_emitDrawCancel(){this._options.onDrawCancel&&this._options.onDrawCancel()}}const P={VERTEX:"vertex"};class f extends g{static CLOSE_POINT_TOLERANCE=.001;static DEFAULT_PIXEL_SIZE=12;static DEFAULT_OUTLINE_WIDTH=2;static MOVE_THROTTLE_MS=16;constructor(t,e={}){super(t,e),this._editMode=e.editMode||P.VERTEX,this._selectedEntity=null,this._selectedEntityId=null,this._editHandles=[],this._positionOutline=null,this._polygonPreview=null,this._tempEntities=[],this._isDragging=!1,this._dragHandle=null,this._originalPositions=null,this._handleVertexIndices=null,this._rectangleOriginalPositions=null,this._originalEnableInputs=!0,this._lastMoveTime=0,this._originalCircleCenter=null,this._originalCircleRadius=null,this._originalEntityCenter=null,this._radiusLine=null}setEditMode(t){return this._editMode=t,this}getEditMode(){return this._editMode}selectEntity(t){const e=this._graphicModule.getGraphic(t);e&&this._selectEntity(e)}onActivate(){this.registerObserver("mouse:click",this._onClick.bind(this)),this.registerObserver("mouse:move",this._onMove.bind(this)),this.registerObserver("mouse:down",this._onMouseDown.bind(this)),this.registerObserver("mouse:up",this._onMouseUp.bind(this))}onDeactivate(){this._deselectEntity()}_onClick(t,e,i){const s=i.position||i&&i.endPosition;if(!s)return;const n=this._viewer.scene.pick({x:s.x,y:s.y});if(console.log("EditTool _onClick:",{picked:n,screenPos:s}),Cesium.defined(n)&&Cesium.defined(n.id)){const t=n.id.id;if(console.log("EditTool picked entity:",t),t&&t.startsWith("__temp_"))return;if(t&&(t.startsWith("__edit_handle_")||t.includes("__edit_handle_")))return;const e=this._graphicModule.getGraphic(t);e?(console.log("EditTool selecting entity"),this._selectEntity(e)):this._deselectEntity()}else console.log("EditTool click on empty"),this._deselectEntity()}_onMouseDown(t,e,i){const s=i&&(i.position||i.endPosition);if(s&&this._selectedEntity&&!this._isDragging){const t=this._viewer.scene.pick({x:s.x,y:s.y});if(Cesium.defined(t)&&Cesium.defined(t.id)){const e=t.id.id;if(e&&(e.startsWith("__edit_handle_")||e.includes("__edit_handle_"))){const t=this._editHandles.find(t=>t.id===e);t&&(this._dragHandle=t,this._isDragging=!0,this._originalPositions=this._getEntityPositions(this._selectedEntity),this._viewer.scene.screenSpaceCameraController.enableRotate=!1,this._viewer.scene.screenSpaceCameraController.enableTranslate=!1)}}}}_onMouseUp(t){this._isDragging&&(this._isDragging=!1,this._viewer.scene.screenSpaceCameraController.enableRotate=!0,this._viewer.scene.screenSpaceCameraController.enableTranslate=!0,this._setCursorStyle("default"),this._emitEditComplete(),this._dragHandle=null)}_setCursorStyle(t){this._viewer&&this._viewer.canvas&&(this._viewer.canvas.style.cursor=t)}_onMove(t){const e=t.position||t.endPosition;if(e){if(!this._isDragging){const t=Date.now();if(t-this._lastMoveTime<f.MOVE_THROTTLE_MS)return;this._lastMoveTime=t;const i=this._viewer.scene.pick({x:e.x,y:e.y}),s=Cesium.defined(i)&&Cesium.defined(i.id)&&i.id.id&&i.id.id.startsWith("__edit_handle_");this._setCursorStyle(s?"move":"default")}if(this._isDragging&&this._dragHandle){this._setCursorStyle("grabbing");let t=null;const i=this._viewer.camera.pickEllipsoid(new Cesium.Cartesian2(e.x,e.y),this._viewer.scene.globe.ellipsoid);if(i){const e=Cesium.Cartographic.fromCartesian(i);t=[Cesium.Math.toDegrees(e.longitude),Cesium.Math.toDegrees(e.latitude),e.height||0]}else t=this.screenToLonLat({x:e.x,y:e.y});t&&this._updateEntityPosition(t)}}}_translatePlotControlPoints(t,e){const i=t.x-e.x,s=t.y-e.y,n=t.z-e.z,o=this._selectedEntity._controlPoints.map(t=>{const e=Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0),o=new Cesium.Cartesian3(e.x+i,e.y+s,e.z+n),r=Cesium.Cartographic.fromCartesian(o);return[Cesium.Math.toDegrees(r.longitude),Cesium.Math.toDegrees(r.latitude),r.height||0]});this._selectedEntity._controlPoints=o;const r=this._graphicModule.wrapperMap.get(this._selectedEntity.id);r&&r.setControlPoints(o),this._editHandles.forEach(t=>{if(t.id&&t.id.includes("center")){const e=this._selectedEntity._plotType,i=e===l.SECTOR||e===l.ELLIPSE?o[0]:this._getPlotControlPointsCenter(o);return void(t.position=new Cesium.ConstantPositionProperty(this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(i[0],i[1],i[2]||0))))}const e=t.id.match(/__edit_handle_(\d+)$/);if(e){const i=parseInt(e[1],10),s=o[i];t.position=new Cesium.ConstantPositionProperty(this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(s[0],s[1],s[2]||0)))}}),this._originalPositions=this._getEntityPositions(this._selectedEntity)}_selectEntity(t){this._deselectEntity(),this._selectedEntity=t,this._selectedEntityId=t.id,this._createEditHandles(),this._highlightEntity(t,!0),this._emitSelect(t.id)}_deselectEntity(){this._selectedEntity&&this._highlightEntity(this._selectedEntity,!1),this._clearEditHandles(),this._selectedEntity=null,this._selectedEntityId=null,this._isDragging=!1,this._dragHandle=null,this._viewer.scene.screenSpaceCameraController.enableRotate=!0,this._viewer.scene.screenSpaceCameraController.enableTranslate=!0}_createEditHandles(){if(this._clearEditHandles(),this._selectedEntity&&this._selectedEntity._isPlotGraphic)return void this._createPlotControlHandles(this._selectedEntity);const t=this._getEditablePositions(this._selectedEntity);t&&0!==t.length&&(this._createVertexHandles(t),t.length>1&&!this._isCircle(this._selectedEntity)&&this._createCenterHandleForVertexMode(t))}_clampPositionToGround(t){if(!t)return t;const e=Cesium.Cartographic.fromCartesian(t);return Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(e.longitude),Cesium.Math.toDegrees(e.latitude),0)}_createPlotControlHandles(t){const e=t._controlPoints||[];if(0===e.length)return;const i=t._plotType,s=i===l.SECTOR,n=i===l.ELLIPSE;e.forEach((t,e)=>{if((s||n)&&0===e)return;const i=this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0)),o=this.createTempEntity(`__edit_handle_${e}`,{position:i,point:{color:Cesium.Color.YELLOW,pixelSize:12,outlineColor:Cesium.Color.RED,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(o)}),e.length>1&&this._createPlotPositionOutline(),n&&this._createEllipseAxisLines(),e.length>1&&(s||n?this._createPlotCenterHandle(e,e[0]):this._createPlotCenterHandle(e))}_createPlotCenterHandle(t,e=null){const i=e||this._getPlotControlPointsCenter(t);if(!i)return;this._originalEntityCenter=this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(i[0],i[1],i[2]||0));const s=this.createTempEntity("__edit_handle_center_plot",{position:this._originalEntityCenter,point:{color:Cesium.Color.CYAN,pixelSize:14,outlineColor:Cesium.Color.BLUE,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(s)}_getPlotControlPointsCenter(t){if(!t||0===t.length)return null;let e=0,i=0,s=0;return t.forEach(t=>{e+=t[0],i+=t[1],s+=t[2]||0}),[e/t.length,i/t.length,s/t.length]}_createPlotPositionOutline(){const t=this,e=this._selectedEntity,i=Cesium.defined(e.polyline),s=new Set([l.FINE_ARROW,l.ASSAULT_DIRECTION,l.ATTACK_ARROW,l.SWALLOWTAIL_ATTACK_ARROW,l.SQUAD_COMBAT,l.SWALLOWTAIL_SQUAD_COMBAT,l.DOUBLE_ARROW,l.CURVED_ARROW,l.CURVE]);this._positionOutline=this.createTempEntity(this.generateId("temp_plot_outline"),{polyline:{positions:new Cesium.CallbackProperty(function(){const n=t._editHandles;if(!n||0===n.length)return[];const o=e._plotType;if(s.has(o))return[];if(o===l.SECTOR||o===l.ELLIPSE){const t=e.polygon?.hierarchy;let i=null;if(t)if("function"==typeof t.getValue){const e=t.getValue(Cesium.JulianDate.now());i=e?e.positions:null}else t.positions&&(i=t.positions);if(i&&i.length>2){const t=i.slice();return t.push(i[0]),t}return i||[]}const r=[];if(n.forEach(t=>{if(t.id&&t.id.includes("center"))return;const e=t.position.getValue(Cesium.JulianDate.now());if(e){const t=Cesium.Cartographic.fromCartesian(e);r.push(Cesium.Math.toDegrees(t.longitude)),r.push(Cesium.Math.toDegrees(t.latitude)),r.push(t.height||0)}}),0===r.length)return[];const a=Cesium.Cartesian3.fromDegreesArrayHeights(r);return i?a:[...a,a[0]]},!1),material:Cesium.Color.YELLOW,width:2,clampToGround:!0}}),this._positionOutline._isPreview=!0,this._tempEntities.push(this._positionOutline)}_createEllipseAxisLines(){const t=this,e=this.createTempEntity(this.generateId("temp_ellipse_axis"),{polyline:{positions:new Cesium.CallbackProperty(function(){const e=t._selectedEntity,i=e?._controlPoints;if(!i||i.length<3)return[];const s=Cesium.Cartesian3.fromDegrees(i[0][0],i[0][1],i[0][2]||0);return[s,Cesium.Cartesian3.fromDegrees(i[1][0],i[1][1],i[1][2]||0),s,Cesium.Cartesian3.fromDegrees(i[2][0],i[2][1],i[2][2]||0)]},!1),material:Cesium.Color.YELLOW,width:2,clampToGround:!0}});e._isPreview=!0,this._tempEntities.push(e)}_createVertexHandles(t){if(Cesium.defined(this._selectedEntity.polygon)&&4===t.length&&this._isRectangle(t)){this._rectangleOriginalPositions=t.slice();[0,1,2,3].forEach((e,i)=>{const s=this._clampPositionToGround(t[e]),n=this.createTempEntity(`__edit_handle_${i}`,{position:s,point:{color:Cesium.Color.YELLOW,pixelSize:12,outlineColor:Cesium.Color.RED,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(n)}),this._handleVertexIndices=[0,1,2,3]}else if(this._isCircle(this._selectedEntity)){const t=this._getCircleInfo(this._selectedEntity);if(!t)return;const{center:e,radius:i}=t,s=Cesium.Cartesian3.fromDegrees(e[0],e[1],0),n=this._getPointOnCircle(e,i,0),o=Cesium.Cartesian3.fromDegrees(n[0],n[1],0),r=this.createTempEntity("__edit_handle_center",{position:s,point:{color:Cesium.Color.CYAN,pixelSize:14,outlineColor:Cesium.Color.BLUE,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(r);const l=this.createTempEntity("__edit_handle_radius",{position:o,point:{color:Cesium.Color.RED,pixelSize:12,outlineColor:Cesium.Color.YELLOW,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(l),this._handleVertexIndices=["center","radius"],this._originalCircleCenter=e,this._originalCircleRadius=i,this._rectangleOriginalPositions=null,this._createCircleOutline()}else this._rectangleOriginalPositions=null,this._handleVertexIndices=null,t.forEach((t,e)=>{const i=this._clampPositionToGround(t),s=this.createTempEntity(`__edit_handle_${e}`,{position:i,point:{color:Cesium.Color.YELLOW,pixelSize:12,outlineColor:Cesium.Color.RED,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY}});this._editHandles.push(s)});t.length>1&&this._createPositionOutline()}_createCenterHandleForVertexMode(t){const e=this._getEntityCenter(this._selectedEntity);if(!e)return;const i=this._clampPositionToGround(e);if(this._originalEntityCenter=i,this._isCircle(this._selectedEntity)){const t=this._getCircleInfo(this._selectedEntity);t&&(this._originalCircleCenter=t.center.slice(),this._originalCircleRadius=t.radius)}const s=this.createTempEntity("__edit_handle_center_vertex",{position:i,point:{color:Cesium.Color.CYAN,pixelSize:14,outlineColor:Cesium.Color.BLUE,outlineWidth:2,disableDepthTestDistance:Number.POSITIVE_INFINITY,heightReference:Cesium.HeightReference.CLAMP_TO_GROUND}});this._editHandles.push(s)}_updateCenterHandlePosition(){if(this._isCircle(this._selectedEntity))return;const t=this._editHandles.find(t=>t.id&&t.id.includes("center"));if(!t)return;const e=this._getEntityCenter(this._selectedEntity);if(!e)return;const i=this._clampPositionToGround(e);t.position=new Cesium.ConstantPositionProperty(i),this._originalEntityCenter=i}_createPositionOutline(){const t=this,e=Cesium.defined(this._selectedEntity.polyline);this._positionOutline=this.createTempEntity(this.generateId("temp_outline"),{polyline:{positions:new Cesium.CallbackProperty(function(){const i=t._editHandles;if(!i||0===i.length)return[];const s=[];return i.forEach(t=>{if(t.id&&t.id.includes("center"))return;const e=t.position.getValue(Cesium.JulianDate.now());if(e){const t=Cesium.Cartographic.fromCartesian(e);s.push(Cesium.Math.toDegrees(t.longitude)),s.push(Cesium.Math.toDegrees(t.latitude)),s.push(t.height||0)}}),0===s.length?[]:e?Cesium.Cartesian3.fromDegreesArrayHeights(s):Cesium.Cartesian3.fromDegreesArrayHeights([...s,s[0],s[1],s[2]||0])},!1),material:Cesium.Color.YELLOW,width:2,clampToGround:!0}}),this._positionOutline._isPreview=!0,this._tempEntities.push(this._positionOutline)}_clearEditHandles(){this._editHandles.forEach(t=>{this.removeTempEntity(t)}),this._editHandles=[],this._positionOutline=null,this._polygonPreview=null,this._handleVertexIndices=null,this._rectangleOriginalPositions=null,this._originalCircleCenter=null,this._originalCircleRadius=null,this._originalEntityCenter=null,this._radiusLine=null,this._tempEntities.forEach(t=>{this.removeTempEntity(t)}),this._tempEntities=[]}_getEditablePositions(t){if(!t)return[];if(Cesium.defined(t.polyline)&&Cesium.defined(t.polyline.positions))return t.polyline.positions.getValue(Cesium.JulianDate.now());if(Cesium.defined(t.polygon)&&Cesium.defined(t.polygon.hierarchy)){const e=t.polygon.hierarchy.getValue(Cesium.JulianDate.now());if(e&&e.positions){let t=e.positions;if(t.length>=2){const e=t[0],i=t[t.length-1];Cesium.Cartesian3.distance(e,i)<f.CLOSE_POINT_TOLERANCE&&(t=t.slice(0,-1))}return t}}return Cesium.defined(t.position)?[t.position.getValue(Cesium.JulianDate.now())]:[]}_getEntityPositions(t){return this._getEditablePositions(t)}_getEntityCenter(t){const e=this._getEditablePositions(t);if(!e||0===e.length)return null;let i=0,s=0,n=0;e.forEach(t=>{i+=t.x,s+=t.y,n+=t.z});const o=e.length;return new Cesium.Cartesian3(i/o,s/o,n/o)}_translateEntity(t){if(!this._selectedEntity||!this._originalEntityCenter)return void console.log("Translate skipped: no entity or no original center",{hasEntity:!!this._selectedEntity,originalCenter:this._originalEntityCenter});const e=this._clampPositionToGround(t),i=e.x-this._originalEntityCenter.x,s=e.y-this._originalEntityCenter.y,n=e.z-this._originalEntityCenter.z,o=new Cesium.Cartesian3(this._originalEntityCenter.x+i,this._originalEntityCenter.y+s,this._originalEntityCenter.z+n);if(this._originalEntityCenter=o,this._dragHandle.position=new Cesium.ConstantPositionProperty(o),Cesium.defined(this._selectedEntity.polyline)){const t=this._originalPositions.map(t=>{const e=new Cesium.Cartesian3(t.x+i,t.y+s,t.z+n);return this._clampPositionToGround(e)});this._selectedEntity.polyline.positions=t,this._editHandles.forEach(e=>{if(e.id&&e.id.includes("center"))return;const i=e.id.match(/__edit_handle_(\d+)$/);if(i){const s=parseInt(i[1],10);t[s]&&(e.position=new Cesium.ConstantPositionProperty(t[s]))}}),this._originalPositions=t}else if(Cesium.defined(this._selectedEntity.polygon))if(this._isCircle(this._selectedEntity)){const t=this._selectedEntity._circleCenter,e=Cesium.Cartesian3.fromDegrees(t[0],t[1],0),o=new Cesium.Cartesian3(e.x+i,e.y+s,e.z+n),r=Cesium.Cartographic.fromCartesian(o),l=Cesium.Math.toDegrees(r.longitude),a=Cesium.Math.toDegrees(r.latitude);this._selectedEntity._circleCenter=[l,a];const h=this._generateCirclePositions(this._selectedEntity._circleCenter,this._selectedEntity._circleRadius,256).flatMap(t=>[t[0],t[1],0]);this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(h));const c=this._editHandles.find(t=>t.id&&t.id.includes("__edit_handle_center"));c&&(c.position=new Cesium.ConstantPositionProperty(o))}else{const t=this._originalPositions.map(t=>{const e=new Cesium.Cartesian3(t.x+i,t.y+s,t.z+n);return this._clampPositionToGround(e)});t.push(t[0].clone()),this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(t),this._editHandles.forEach(e=>{if(e.id&&e.id.includes("center"))return;const i=e.id.match(/__edit_handle_(\d+)$/);if(i){const s=parseInt(i[1],10);t[s]&&(e.position=new Cesium.ConstantPositionProperty(t[s]))}}),this._originalPositions=t.slice(0,-1)}else Cesium.defined(this._selectedEntity.position)&&(this._selectedEntity.position=new Cesium.ConstantPositionProperty(o),this._originalPositions=[o])}_isRectangle(t){if(4!==t.length)return!1;const e=.001,i=t.map(t=>({x:t.x,y:t.y})),[s,n,o,r]=i,l=(t,e)=>Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)),a=l(s,n),h=l(n,o),c=l(o,r),u=l(r,s),_=l(s,o),p=l(n,r),d=Math.abs(a-c)/Math.max(a,c)<e&&Math.abs(h-u)/Math.max(h,u)<e,g=Math.abs(_-p)/Math.max(_,p)<e;return d&&g}_isCircle(t){return t&&!0===t._isCircle}_getCircleInfo(t){return this._isCircle(t)?{center:t._circleCenter,radius:t._circleRadius}:null}_generateCirclePositions(t,e,i=256){const[s,n]=t,o=Math.PI/180,r=[],l=111320*Math.cos(n*o);for(let t=0;t<=i;t++){const o=t/i*Math.PI*2,a=e*Math.cos(o)/l,h=e*Math.sin(o)/110540;r.push([s+a,n+h])}return r}_getPointOnCircle(t,e,i){const[s,n]=t,o=Math.PI/180,r=111320*Math.cos(n*o);return[s+e*Math.cos(i)/r,n+e*Math.sin(i)/110540]}_rotatePerpendicular(t,e){const i=Math.hypot(t[0],t[1]),s=Math.hypot(e[0],e[1]);if(0===i||0===s)return[0,0];const n=t[0]/i,o=t[1]/i,r=t[0]*e[1]-t[1]*e[0]>=0?1:-1;return[-r*o*s,r*n*s]}_createCircleOutline(){const t=this;this._positionOutline=this.createTempEntity(this.generateId("temp_circle_outline"),{polyline:{positions:new Cesium.CallbackProperty(function(){const e=t._getCircleInfo(t._selectedEntity);if(!e)return[];const{center:i,radius:s}=e,n=t._generateCirclePositions(i,s,256).flatMap(t=>[t[0],t[1],0]);return Cesium.Cartesian3.fromDegreesArrayHeights(n)},!1),material:Cesium.Color.YELLOW,width:2,clampToGround:!0}}),this._positionOutline._isPreview=!0,this._tempEntities.push(this._positionOutline),this._radiusLine=this.createTempEntity(this.generateId("temp_radius_line"),{polyline:{positions:new Cesium.CallbackProperty(function(){const e=t._getCircleInfo(t._selectedEntity);if(!e)return[];const{center:i}=e,s=t._editHandles.find(t=>t.id&&t.id.includes("__edit_handle_radius"));if(!s)return[];const n=s.position.getValue(Cesium.JulianDate.now());if(!n)return[];return[Cesium.Cartesian3.fromDegrees(i[0],i[1],0),n]},!1),material:Cesium.Color.RED,width:3,clampToGround:!0}}),this._radiusLine._isPreview=!0,this._tempEntities.push(this._radiusLine)}_calcDistance(t,e){const[i,s]=t.map(t=>t*Math.PI/180),[n,o]=e.map(t=>t*Math.PI/180),r=o-s,l=n-i,a=Math.sin(r/2)**2+Math.cos(s)*Math.cos(o)*Math.sin(l/2)**2;return 6371e3*(2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)))}_computeRectangleNewPositions(t,e,i){const s=(i+2)%4,n=Cesium.Cartographic.fromCartesian(t),o=e.map(t=>Cesium.Cartographic.fromCartesian(t))[s],r=new Array(4);r[i]=t,r[s]=e[s];const l=(i+3)%4;return r[(i+1)%4]=Cesium.Cartesian3.fromRadians(n.longitude,o.latitude,o.height),r[l]=Cesium.Cartesian3.fromRadians(o.longitude,n.latitude,o.height),r}_updateEntityPosition(t){if(!this._selectedEntity)return;const e=this._editHandles.indexOf(this._dragHandle);if(-1===e)return;const i=Cesium.Cartesian3.fromDegrees(t[0],t[1],0);if(this._selectedEntity._isPlotGraphic){const e=this._dragHandle.id;if(e&&e.includes("center")&&this._originalEntityCenter){const t=this._clampPositionToGround(i);return this._translatePlotControlPoints(t,this._originalEntityCenter),void(this._originalEntityCenter=t)}const s=e.match(/__edit_handle_(\d+)$/);if(!s)return;const n=parseInt(s[1],10),o=this._selectedEntity._plotType;if(o===l.SECTOR&&0===n){const t=this._selectedEntity._controlPoints[0],e=Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0),s=this._clampPositionToGround(i);return this._translatePlotControlPoints(s,e),void(this._originalEntityCenter=this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(this._selectedEntity._controlPoints[0][0],this._selectedEntity._controlPoints[0][1],this._selectedEntity._controlPoints[0][2]||0)))}const a=this._selectedEntity._controlPoints.map((e,i)=>i===n?[t[0],t[1],e[2]||0]:e);if(o===l.SECTOR&&n>0){const t=a[0],e=r._calcSphericalDistance(a[n],t),i=1===n?2:1,s=a[i],o=r._getBearing(t,s),l=r._getPointAtBearingAndDistance(t,e,o);a[i]=[l[0],l[1],s[2]||0]}if(o===l.ELLIPSE&&(1===n||2===n)){const e=a[0];if(1===n){const t=[a[1][0]-e[0],a[1][1]-e[1]],i=[this._selectedEntity._controlPoints[2][0]-e[0],this._selectedEntity._controlPoints[2][1]-e[1]],s=this._rotatePerpendicular(t,i);a[2]=[e[0]+s[0],e[1]+s[1],e[2]||0]}else if(2===n){const i=[a[1][0]-e[0],a[1][1]-e[1]],s=Math.hypot(i[0],i[1]);if(s>0){const n=i[0]/s,o=-(i[1]/s),r=n,l=[t[0]-e[0],t[1]-e[1]],h=l[0]*o+l[1]*r;a[2]=[e[0]+o*h,e[1]+r*h,e[2]||0]}}}this._selectedEntity._controlPoints=a;const h=this._graphicModule.wrapperMap.get(this._selectedEntity.id);h&&h.setControlPoints(a),this._editHandles.forEach(t=>{if(t.id&&t.id.includes("center"))return;const e=t.id.match(/__edit_handle_(\d+)$/);if(e){const i=parseInt(e[1],10),s=a[i];t.position=new Cesium.ConstantPositionProperty(this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(s[0],s[1],s[2]||0)))}});const c=this._editHandles.find(t=>t.id&&t.id.includes("center"));if(c){const t=o===l.SECTOR||o===l.ELLIPSE?a[0]:this._getPlotControlPointsCenter(a);c.position=new Cesium.ConstantPositionProperty(this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0))),this._originalEntityCenter=this._clampPositionToGround(Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0))}return void(this._originalPositions=this._getEntityPositions(this._selectedEntity))}const s=this._selectedEntity.polygon?.hierarchy?.getValue(Cesium.JulianDate.now());if(this._dragHandle.id&&this._dragHandle.id.includes("center")&&this._originalEntityCenter)this._translateEntity(i);else{if(this._handleVertexIndices&&Array.isArray(this._handleVertexIndices)&&"number"==typeof this._handleVertexIndices[0]&&Cesium.defined(this._selectedEntity.polygon)){if(!s||!s.positions||s.positions.length<4)return;const t=this._handleVertexIndices[e],n=this._computeRectangleNewPositions(i,s.positions,t).map(t=>this._clampPositionToGround(t));return this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(n),this._editHandles.forEach((t,e)=>{t.id&&t.id.includes("center")||(t.position=new Cesium.ConstantPositionProperty(n[e]))}),void this._updateCenterHandlePosition()}if(this._handleVertexIndices&&Array.isArray(this._handleVertexIndices)&&this._isCircle(this._selectedEntity)){const e=this._getCircleInfo(this._selectedEntity);if(!e)return;const s=this._dragHandle.id;if(s&&s.includes("__edit_handle_center")){const s=t;this._dragHandle.position=i,this._selectedEntity._circleCenter=s;const n=this._generateCirclePositions(s,e.radius,256).flatMap(t=>[t[0],t[1],0]);this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(n));const o=this._editHandles.find(t=>t.id&&t.id.includes("radius"));if(o){const t=this._getPointOnCircle(s,e.radius,0);o.position=new Cesium.ConstantPositionProperty(Cesium.Cartesian3.fromDegrees(t[0],t[1],0))}return}let n=this._calcDistance(e.center,t);const o=Math.atan2(t[1]-e.center[1],t[0]-e.center[0]),r=this._getPointOnCircle(e.center,n,o);this._dragHandle.position=new Cesium.ConstantPositionProperty(Cesium.Cartesian3.fromDegrees(r[0],r[1],0)),this._selectedEntity._circleCenter=e.center,this._selectedEntity._circleRadius=n;const l=this._generateCirclePositions(e.center,n,256).flatMap(t=>[t[0],t[1],0]);return void(this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(l)))}if(Cesium.defined(this._selectedEntity.polyline)){const t=this._selectedEntity.polyline.positions.getValue(Cesium.JulianDate.now());t&&t[e]&&(t[e]=i,this._selectedEntity.polyline.positions=t,this._dragHandle.position=new Cesium.ConstantPositionProperty(i),this._updateCenterHandlePosition())}else{if(Cesium.defined(this._selectedEntity.polygon)){this._editHandles.filter(t=>!t.id.includes("center")).length;const t=[];for(let e=0;e<this._editHandles.length;e++){const s=this._editHandles[e];if(!s.id||!s.id.includes("center"))if(s===this._dragHandle)t.push(i);else{const e=s.position.getValue(Cesium.JulianDate.now());t.push(this._clampPositionToGround(e))}}return t.push(t[0].clone()),this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(t),this._dragHandle.position=new Cesium.ConstantPositionProperty(i),void this._updateCenterHandlePosition()}Cesium.defined(this._selectedEntity.position)&&(this._selectedEntity.position=new Cesium.ConstantPositionProperty(i),this._dragHandle.position=new Cesium.ConstantPositionProperty(i))}}}_highlightEntity(t,e){t&&(Cesium.defined(t.point)&&(e?(t.point.outlineColor=Cesium.Color.CYAN,t.point.outlineWidth=3):(t.point.outlineColor=Cesium.Color.WHITE,t.point.outlineWidth=1)),Cesium.defined(t.polyline)&&(t.polyline.material=e?Cesium.Color.CYAN:Cesium.Color.BLUE),Cesium.defined(t.polygon)&&(t.polygon.outlineColor=e?Cesium.Color.CYAN:Cesium.Color.WHITE))}getSelectedEntityId(){return this._selectedEntityId}getOriginalPositions(){return this._originalPositions}undo(){if(!this._selectedEntity)return;if(this._isCircle(this._selectedEntity)&&this._originalCircleCenter&&this._originalCircleRadius){const t=this._originalCircleCenter,e=this._originalCircleRadius;this._selectedEntity._circleCenter=t,this._selectedEntity._circleRadius=e;const i=this._generateCirclePositions(t,e,256).flatMap(t=>[t[0],t[1],0]);return this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(i)),this._createEditHandles(),void this._emitEditComplete()}const t=this._rectangleOriginalPositions||this._originalPositions;if(!t)return;const e=t.map(t=>t.clone?t.clone():t);Cesium.defined(this._selectedEntity.polyline)?this._selectedEntity.polyline.positions=e:Cesium.defined(this._selectedEntity.polygon)&&(this._selectedEntity.polygon.hierarchy=new Cesium.PolygonHierarchy(e)),this._createEditHandles(),this._emitEditComplete()}_emitSelect(t){this._options.onSelect&&this._options.onSelect({entityId:t})}_emitEditComplete(){this._options.onEditComplete&&this._options.onEditComplete({entityId:this._selectedEntityId,positions:this._getEntityPositions(this._selectedEntity)})}}const E={POINT:"point",RECTANGLE:"rectangle",CIRCLE:"circle"};class T extends g{constructor(t,e={}){super(t,e),this._selectType=e.selectType||E.POINT,this._isSelecting=!1,this._startPos=null,this._tempEntities=[],this._selectedIds=new Set,this._selectionRect=null,this._originalStyles=new Map}setSelectType(t){return this._selectType=t,this}getSelectType(){return this._selectType}onActivate(){this.registerObserver("mouse:click",this._onClick.bind(this)),this.registerObserver("mouse:move",this._onMove.bind(this)),this.registerObserver("mouse:down",this._onMouseDown.bind(this)),this.registerObserver("mouse:up",this._onMouseUp.bind(this))}onDeactivate(){this._cancelSelection(),this._clearSelectionRect()}_onMouseDown(t){const e=t.position||t.endPosition;if(e&&this._selectType!==E.POINT){const t=this.screenToLonLat({x:e.x,y:e.y});t&&(this._startPos=t,this._isSelecting=!0,this._createSelectionStartMarker(t))}}_onMouseUp(t){const e=t.position||t.endPosition;if(e&&this._isSelecting&&this._startPos){const t=this.screenToLonLat({x:e.x,y:e.y});t&&this._finishSelection(t)}}_onClick(t,e,i){if(this._selectType!==E.POINT)return;const s=i.position||i&&i.endPosition;if(!s)return;const n=this._viewer.scene.pick({x:s.x,y:s.y});if(Cesium.defined(n)&&Cesium.defined(n.id)){const t=n.id.id;if(t&&t.startsWith("__temp_"))return;if(t&&t.startsWith("__edit_handle_"))return;this._isSelected(t)?this._deselect(t):this._select(t)}else this._clearAllSelections()}_onMove(t){const e=t.position||t.endPosition;if(!e)return;if(!this._isSelecting||!this._startPos)return;const i=this.screenToLonLat({x:e.x,y:e.y});if(i)if(this._updateSelectionRectPreview(i),this._selectType===E.RECTANGLE){const t=this._getEntitiesInRectangle(this._startPos,i);this._highlightEntitiesInSelection(t)}else if(this._selectType===E.CIRCLE){const t=this._getEntitiesInCircle(this._startPos,i);this._highlightEntitiesInSelection(t)}}_createSelectionStartMarker(t){const e=this.createTempEntity(this.generateId("sel_start"),{position:Cesium.Cartesian3.fromDegrees(...t),point:{color:Cesium.Color.GREEN,pixelSize:10}});this._tempEntities.push(e)}_updateSelectionRectPreview(t){this._selectType===E.RECTANGLE?this._updateRectPreview(t):this._selectType===E.CIRCLE&&this._updateCirclePreview(t)}_updateRectPreview(t){const e=this._startPos,i=t;e&&i&&(this._selectionRect||(this._selectionRect=this.createTempEntity(this.generateId("sel_rect"),{polyline:{positions:new Cesium.CallbackProperty(()=>{const t=this._getRectPositions(e,i);return Cesium.Cartesian3.fromDegreesArrayHeights(t.flatMap(t=>[t[0],t[1],0]))},!1),material:Cesium.Color.CYAN,width:2},polygon:{hierarchy:new Cesium.CallbackProperty(()=>{const t=this._getRectPositions(e,i);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(t.flatMap(t=>[t[0],t[1],0])))},!1),material:Cesium.Color.CYAN.withAlpha(.2),outline:!1}}),this._selectionRect._isPreview=!0,this._tempEntities.push(this._selectionRect)))}_updateCirclePreview(t){const e=this._startPos;e&&t&&(this._selectionRect||(this._selectionRect=this.createTempEntity(this.generateId("sel_circle"),{polygon:{hierarchy:new Cesium.CallbackProperty(()=>{const i=this._calcDistance(e,t),s=this._generateCirclePositions(e,i,36);return new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(s.flatMap(t=>[t[0],t[1],0])))},!1),material:Cesium.Color.CYAN.withAlpha(.2),outline:!0,outlineColor:Cesium.Color.CYAN}}),this._selectionRect._isPreview=!0,this._tempEntities.push(this._selectionRect)))}_getRectPositions(t,e){return[[t[0],t[1]],[e[0],t[1]],[e[0],e[1]],[t[0],e[1]],[t[0],t[1]]]}_clearSelectionRect(){this._tempEntities.forEach(t=>{t._isPreview&&this.removeTempEntity(t)}),this._tempEntities=this._tempEntities.filter(t=>!t._isPreview),this._selectionRect=null}_finishSelection(t){let e=[];this._selectType===E.RECTANGLE?e=this._getEntitiesInRectangle(this._startPos,t):this._selectType===E.CIRCLE&&(e=this._getEntitiesInCircle(this._startPos,t)),e.forEach(t=>{this._select(t,!1)}),this._cancelSelection(),this._emitSelectionComplete(Array.from(this._selectedIds))}_cancelSelection(){this._isSelecting=!1,this._startPos=null,this._isSelecting=!1,this._selectionRect=null,this._tempEntities.forEach(t=>{this.removeTempEntity(t)}),this._tempEntities=[]}_select(t,e=!0){this._selectedIds.has(t)||(this._selectedIds.add(t),this._highlightEntity(t,!0),e&&this._emitSelect(t))}_deselect(t){this._selectedIds.has(t)&&(this._selectedIds.delete(t),this._highlightEntity(t,!1))}_clearAllSelections(){this._selectedIds.forEach(t=>{this._highlightEntity(t,!1)}),this._selectedIds.clear(),this._emitSelectionChange([])}_highlightEntity(t,e){const i=this._graphicModule.getGraphic(t);if(!i)return;const s=t;if(Cesium.defined(i.point))if(e)this._originalStyles.has(s)||this._originalStyles.set(s,{point:{outlineColor:i.point.outlineColor,outlineWidth:i.point.outlineWidth}}),i.point.outlineColor=Cesium.Color.YELLOW,i.point.outlineWidth=2;else{const t=this._originalStyles.get(s)?.point;t?(i.point.outlineColor=t.outlineColor,i.point.outlineWidth=t.outlineWidth):(i.point.outlineColor=Cesium.Color.WHITE,i.point.outlineWidth=1)}if(Cesium.defined(i.polyline))if(e)this._originalStyles.has(s)||this._originalStyles.set(s,{polyline:{material:i.polyline.material}}),i.polyline.material=Cesium.Color.CYAN;else{const t=this._originalStyles.get(s)?.polyline;i.polyline.material=t?.material||Cesium.Color.BLUE}if(Cesium.defined(i.polygon))if(e)this._originalStyles.has(s)||this._originalStyles.set(s,{polygon:{outlineColor:i.polygon.outlineColor}}),i.polygon.outlineColor=Cesium.Color.CYAN;else{const t=this._originalStyles.get(s)?.polygon;i.polygon.outlineColor=t?.outlineColor||Cesium.Color.WHITE}e||this._originalStyles.delete(s)}_highlightEntitiesInSelection(t){this._selectedIds.forEach(e=>{t.includes(e)||(this._highlightEntity(e,!1),this._selectedIds.delete(e))}),t.forEach(t=>{this._selectedIds.has(t)||(this._selectedIds.add(t),this._highlightEntity(t,!0))})}_getOriginalColor(t){return null}_getEntitiesInRectangle(t,e){const i=Math.min(t[0],e[0]),s=Math.max(t[0],e[0]),n=Math.min(t[1],e[1]),o=Math.max(t[1],e[1]),r=this._getAllGraphicIds();return this._filterEntitiesInBounds(r,i,s,n,o)}_getEntitiesInCircle(t,e){const i=this._calcDistance(t,e),s=this._getAllGraphicIds(),n=[];return s.forEach(e=>{const s=this._graphicModule.getGraphic(e);if(!s)return;const o=this._getEntityPosition(s);if(!o)return;this._calcDistance(t,o)<=i&&n.push(e)}),n}_getAllGraphicIds(){const t=[];return this._graphicModule.graphicMap.forEach((e,i)=>{i.startsWith("__temp_")||i.startsWith("__edit_handle_")||t.push(i)}),t}_filterEntitiesInBounds(t,e,i,s,n){const o=[];return t.forEach(t=>{const r=this._graphicModule.getGraphic(t);if(!r)return;const l=this._getEntityPositions(r);if(!l||0===l.length)return;let a=!0;for(const t of l){const o=Cesium.Cartographic.fromCartesian(t),r=Cesium.Math.toDegrees(o.longitude),l=Cesium.Math.toDegrees(o.latitude);if(r<e||r>i||l<s||l>n){a=!1;break}}a&&o.push(t)}),o}_getEntityPosition(t){if(Cesium.defined(t.position)){const e=t.position.getValue(Cesium.JulianDate.now());if(e){const t=Cesium.Cartographic.fromCartesian(e);return[Cesium.Math.toDegrees(t.longitude),Cesium.Math.toDegrees(t.latitude)]}}return null}_getEntityPositions(t){if(Cesium.defined(t.polyline)&&Cesium.defined(t.polyline.positions))return t.polyline.positions.getValue(Cesium.JulianDate.now());if(Cesium.defined(t.polygon)&&Cesium.defined(t.polygon.hierarchy)){const e=t.polygon.hierarchy.getValue(Cesium.JulianDate.now());return e?e.positions:[]}return[]}_calcDistance(t,e){const[i,s]=t.map(t=>t*Math.PI/180),[n,o]=e.map(t=>t*Math.PI/180),r=o-s,l=n-i,a=Math.sin(r/2)**2+Math.cos(s)*Math.cos(o)*Math.sin(l/2)**2;return 6371e3*(2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)))}_generateCirclePositions(t,e,i){const s=[],[n,o]=t,r=Math.PI/180;for(let t=0;t<=i;t++){const l=t/i*Math.PI*2,a=e/111320*Math.cos(l)/r,h=e/110540/r;s.push([n+a,o+h])}return s}_isSelected(t){return this._selectedIds.has(t)}getSelectedIds(){return Array.from(this._selectedIds)}_emitSelect(t){this._options.onSelect&&this._options.onSelect({entityId:t})}_emitSelectionChange(t){this._options.onSelectionChange&&this._options.onSelectionChange({selectedIds:t})}_emitSelectionComplete(t){this._options.onSelectionComplete&&this._options.onSelectionComplete({selectedIds:t})}}const w={SINGLE:"single",SELECTED:"selected"};class M extends g{constructor(t,e={}){super(t,e),this._deleteMode=e.deleteMode||w.SINGLE,this._hoveredEntity=null,this._hoverEntity=null,this._originalStyles=new Map}setDeleteMode(t){return this._deleteMode=t,this}getDeleteMode(){return this._deleteMode}onActivate(){this.registerObserver("mouse:click",this._onClick.bind(this)),this.registerObserver("mouse:move",this._onMove.bind(this))}onDeactivate(){this._clearHoverHighlight()}_onClick(t,e,i){const s=i.position||i&&i.endPosition;if(!s)return;const n=this._viewer.scene.pick({x:s.x,y:s.y});if(Cesium.defined(n)&&Cesium.defined(n.id)){const t=n.id.id;if(t&&t.startsWith("__temp_"))return;if(t&&t.startsWith("__edit_handle_"))return;if(t&&t.startsWith("__sel_"))return;this._deleteMode===w.SINGLE&&this._deleteSingle(t)}}_onMove(t){const e=t.position||t.endPosition;if(!e)return;const i=this._viewer.scene.pick({x:e.x,y:e.y});let s=null;if(Cesium.defined(i)&&Cesium.defined(i.id)){const t=i.id.id;t.startsWith("__temp_")||t.startsWith("__edit_handle_")||(s=t)}s!==this._hoveredEntity&&(this._clearHoverHighlight(),this._hoveredEntity=s,s&&this._highlightAsDeletable(s))}_deleteSingle(t){const e=this._graphicModule.getGraphic(t);e&&(this._emitBeforeDelete({entityId:t,entity:e}),this._graphicModule.removeGraphic(t),this._emitDelete({entityId:t}))}deleteMultiple(t){const e=[],i=[];return t.forEach(t=>{this._graphicModule.removeGraphic(t)?e.push(t):i.push(t)}),this._emitDeleteMultiple({deleted:e,failed:i}),{deleted:e,failed:i}}deleteAll(){const t=[];return this._graphicModule.graphicMap.forEach((e,i)=>{i.startsWith("__temp_")||i.startsWith("__edit_handle_")||t.push(i)}),this.deleteMultiple(t)}_highlightAsDeletable(t){const e=this._graphicModule.getGraphic(t);if(!e)return;this._hoverEntity=e;const i=t;Cesium.defined(e.point)&&(this._originalStyles.has(i)||this._originalStyles.set(i,{point:{outlineColor:e.point.outlineColor,outlineWidth:e.point.outlineWidth}}),e.point.outlineColor=Cesium.Color.RED,e.point.outlineWidth=3),Cesium.defined(e.polyline)&&(this._originalStyles.has(i)||this._originalStyles.set(i,{polyline:{material:e.polyline.material}}),e.polyline.material=Cesium.Color.RED),Cesium.defined(e.polygon)&&(this._originalStyles.has(i)||this._originalStyles.set(i,{polygon:{outlineColor:e.polygon.outlineColor}}),e.polygon.outlineColor=Cesium.Color.RED),this._viewer.container&&(this._viewer.container.style.cursor="pointer")}_clearHoverHighlight(){if(!this._hoverEntity)return;const t=this._hoverEntity,e=this._hoveredEntity,i=e?this._originalStyles.get(e):null;Cesium.defined(t.point)&&(i?.point?(t.point.outlineColor=i.point.outlineColor,t.point.outlineWidth=i.point.outlineWidth):(t.point.outlineColor=Cesium.Color.WHITE,t.point.outlineWidth=1)),Cesium.defined(t.polyline)&&(t.polyline.material=i?.polyline?.material||Cesium.Color.BLUE),Cesium.defined(t.polygon)&&(t.polygon.outlineColor=i?.polygon?.outlineColor||Cesium.Color.WHITE),this._viewer.container&&(this._viewer.container.style.cursor="default"),e&&this._originalStyles.delete(e),this._hoverEntity=null,this._hoveredEntity=null}_emitBeforeDelete(t){this._options.onBeforeDelete&&this._options.onBeforeDelete(t)}_emitDelete(t){this._options.onDelete&&this._options.onDelete(t)}_emitDeleteMultiple(t){this._options.onDeleteMultiple&&this._options.onDeleteMultiple(t)}}const D={DRAW:"draw",EDIT:"edit",SELECT:"select",DELETE:"delete"};class v{constructor(e,i={}){this.viewer=e,this.config=t.getInstance().getConfig(),this.graphicModule=null,this.eventModule=null,this.toolMap=new Map,this.currentTool=null,this.currentToolName=null,this._isActive=!1}setDependencies(t){return this.graphicModule=t.graphicModule,this.eventModule=t.eventModule,this}init(){return this.registerTool(D.DRAW,new y(this)),this.registerTool(D.EDIT,new f(this)),this.registerTool(D.SELECT,new T(this)),this.registerTool(D.DELETE,new M(this)),this}registerTool(t,e){return this.toolMap.set(t,e),this}getTool(t){return this.toolMap.get(t)}getCurrentTool(){return this.currentTool}getCurrentToolName(){return this.currentToolName}activateTool(t){const e=this.toolMap.get(t);return e?(this.currentTool&&this.currentTool.deactivate(),this.currentTool=e,this.currentToolName=t,this.currentTool.activate(),this._isActive=!0,console.log(`工具 ${t} 已激活`),this):(console.warn(`工具 ${t} 未注册`),this)}deactivateTool(){return this.currentTool&&this.currentTool.deactivate(),this.currentTool=null,this.currentToolName=null,this._isActive=!1,this}activateDrawTool(t=C.POINT){const e=this.toolMap.get(D.DRAW);return e&&e.setDrawType(t),this.activateTool(D.DRAW)}activateSelectTool(t=E.POINT){const e=this.toolMap.get(D.SELECT);return e&&e.setSelectType(t),this.activateTool(D.SELECT)}activateEditTool(t=P.VERTEX){const e=this.toolMap.get(D.EDIT);return e&&e.setEditMode(t),this.activateTool(D.EDIT)}activateDeleteTool(t=w.SINGLE){const e=this.toolMap.get(D.DELETE);return e&&e.setDeleteMode(t),this.activateTool(D.DELETE)}getDrawTool(){return this.toolMap.get(D.DRAW)}getSelectTool(){return this.toolMap.get(D.SELECT)}getEditTool(){return this.toolMap.get(D.EDIT)}getDeleteTool(){return this.toolMap.get(D.DELETE)}onDrawComplete(t){return this.getDrawTool()._options.onGraphicCreated=t,this}onDrawProgress(t){return this.getDrawTool()._options.onDrawProgress=t,this}onDrawCancel(t){return this.getDrawTool()._options.onDrawCancel=t,this}onEditComplete(t){return this.getEditTool()._options.onEditComplete=t,this}onEditSelect(t){return this.getEditTool()._options.onSelect=t,this}onSelect(t){return this.getSelectTool()._options.onSelect=t,this}onSelectionChange(t){return this.getSelectTool()._options.onSelectionChange=t,this}onSelectionComplete(t){return this.getSelectTool()._options.onSelectionComplete=t,this}onBeforeDelete(t){return this.getDeleteTool()._options.onBeforeDelete=t,this}onDelete(t){return this.getDeleteTool()._options.onDelete=t,this}onDeleteMultiple(t){return this.getDeleteTool()._options.onDeleteMultiple=t,this}getSelectedIds(){const t=this.getSelectTool();return t?t.getSelectedIds():[]}deleteSelected(){const t=this.getSelectTool();if(t){const e=t.getSelectedIds(),i=this.getDeleteTool();if(i)return i.deleteMultiple(e)}return{deleted:[],failed:[]}}isActive(){return this._isActive}destroy(){this.deactivateTool(),this.toolMap.clear(),this.graphicModule=null,this.eventModule=null}}class L{static instance=null;static getInstance(){return this.instance||(this.instance=new L),this.instance}constructor(){this.modules=new Map,this.cesiumViewer=null}initViewer(e){if(this.cesiumViewer)return this.cesiumViewer;const i=t.getInstance().getConfig();this.cesiumViewer=new Cesium.Viewer(e,i.scene);const s=this.cesiumViewer.cesiumWidget?.creditContainer;s&&(s.style.display="none"),this.registerModule("SceneModule",new o(this.cesiumViewer)),this.registerModule("GraphicModule",new p(this.cesiumViewer)),this.registerModule("EventModule",new d(this.cesiumViewer));const n=new v(this.cesiumViewer);return n.setDependencies({graphicModule:this.getModule("GraphicModule"),eventModule:this.getModule("EventModule")}).init(),this.registerModule("EditorModule",n),this.cesiumViewer}getModule(t){if(!this.modules.has(t))throw new Error(`模块 ${t} 未注册,请先初始化 Viewer`);return this.modules.get(t)}get viewer(){return this.cesiumViewer}get sceneModule(){return this.getModule("SceneModule")}get graphicModule(){return this.getModule("GraphicModule")}get eventModule(){return this.getModule("EventModule")}get editorModule(){return this.getModule("EditorModule")}registerModule(t,e){this.modules.set(t,e)}destroy(){if(this.cesiumViewer){try{const t=this.modules.get("EventModule");t&&"function"==typeof t.unregisterAllObservers&&t.unregisterAllObservers()}catch(t){console.warn("EventModule 注销失败:",t)}try{const t=this.modules.get("EditorModule");t&&"function"==typeof t.destroy&&t.destroy()}catch(t){console.warn("EditorModule 销毁失败:",t)}this.cesiumViewer.destroy(),this.cesiumViewer=null,this.modules.clear()}}static reset(){L.instance&&(L.instance.destroy(),L.instance=null)}}class I{static calcDistance(t,e){const i=Cesium.Cartesian3.fromDegrees(...t),s=Cesium.Cartesian3.fromDegrees(...e);return Cesium.Cartesian3.distance(i,s)}static calcArea(t){if(!t||t.length<3)return 0;const e=t.map(t=>Cesium.Cartesian3.fromDegrees(t[0],t[1],t[2]||0)),i=new Cesium.PolygonGeometry({polygonHierarchy:new Cesium.PolygonHierarchy(e)}),s=Cesium.PolygonGeometry.createGeometry(i);if(!s||!s.attributes||!s.attributes.position)return 0;const n=s.attributes.position.values,o=[];for(let t=0;t<n.length;t+=3)o.push(new Cesium.Cartesian3(n[t],n[t+1],n[t+2]));const r=I.#n(o);return Math.abs(r)}static#n(t){const e=Cesium.Ellipsoid.WGS84,i=t.length;if(i<3)return 0;let s=new Cesium.Cartesian3(0,0,0);for(const e of t)s=Cesium.Cartesian3.add(s,e,s);s=Cesium.Cartesian3.normalize(s,new Cesium.Cartesian3),s=e.scaleToGeodeticSurface(s,new Cesium.Cartesian3)||s;const n=new Cesium.EllipsoidTangentPlane(s,e),o=t.map(t=>n.projectPointOntoPlane(t,new Cesium.Cartesian2));let r=0;for(let t=0;t<i;t++){const e=o[t],s=o[(t+1)%i];r+=e.x*s.y-s.x*e.y}return.5*Math.abs(r)}static async getHeight(t,e){const i=Cesium.Cartographic.fromDegrees(e[0],e[1]),s=await Cesium.sampleTerrainMostDetailed(t.terrainProvider,[i]);return s[0]?.height??0}}return{init:(e,i={})=>{i.cesiumToken&&(window.Cesium.Ion.defaultAccessToken=i.cesiumToken),t.getInstance().setConfig(i);const s=L.getInstance();return s.initViewer(e),s},getModule:t=>L.getInstance().getModule(t),destroy:()=>{L.reset(),t.getInstance().setConfig({}),window.Cesium?.Ion&&(window.Cesium.Ion.defaultAccessToken="")},Config:t,ModuleManager:L,SceneModule:o,GraphicModule:p,EventModule:d,EditorModule:v,CoordinateUtil:class{static transform(t,e,i,s){let n=e;switch(Array.isArray(e)&&("scene"===i?n=Cesium.Cartesian3.fromDegrees(...e):"world"===i?n=new Cesium.Cartesian3(e[0],e[1],e[2]):"screen"===i&&(n=new Cesium.Cartesian2(e[0],e[1]))),`${i}_${s}`){case"screen_world":return t.camera.pickEllipsoid(n);case"screen_scene":const e=t.camera.pickEllipsoid(n),i=Cesium.Cartographic.fromCartesian(e);return[Cesium.Math.toDegrees(i.longitude),Cesium.Math.toDegrees(i.latitude),i.height];case"world_screen":case"scene_screen":return Cesium.SceneTransforms.wgs84ToWindowCoordinates(t.scene,n);case"world_scene":const s=Cesium.Cartographic.fromCartesian(n);return[Cesium.Math.toDegrees(s.longitude),Cesium.Math.toDegrees(s.latitude),s.height];default:return n}}},GeoCalcUtil:I,DrawType:C,EditMode:P,SelectType:E,DeleteMode:w,ToolName:D,LayerType:e,PlotGraphicType:l}});
|
|
2
|
+
//# sourceMappingURL=cesium-xs-sdk.umd.js.map
|