SketchViewModel.js 118 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036
  1. /**
  2. * 创建者:王成
  3. * 操作系统:MAC
  4. * 创建日期:2022年11月10日
  5. * 描述:该类主要是为了创建三维地图通用绘制工具类
  6. */
  7. /* 引入Cesium */
  8. // import * as Cesium from 'Cesium';
  9. /* 扩展 Cesium.GroundPrimitive 给其添加objId属性*/
  10. /**
  11. * 设置关联的图元
  12. * @ignore
  13. * @param {JSON} geometry 图元信息
  14. * @param {Array<Cesium.Cartesian3>} geometry.cPoints 世界坐标系坐标集合
  15. * @param {Array<JSON>} geometry.gPoints 经纬度坐标集合
  16. */
  17. Cesium.Primitive.prototype.setUseGeometry = function(geometry) {
  18. this._useGeometry = geometry;
  19. }
  20. /**
  21. * 获取设置的图元信息
  22. * @ignore
  23. */
  24. Cesium.Primitive.prototype.getUseGeometry = function() {
  25. return this._useGeometry;
  26. }
  27. /**
  28. * 绘图工具
  29. */
  30. class SketchViewModel {
  31. /**
  32. * 默认初始化
  33. * @param {Object} viewer 三维场景
  34. * @param {JSON} [options] 配置项
  35. * @param {Boolean} [options.isDrawPoint] 是否绘制参考点
  36. * @param {Boolean} [options.isRetainDrawPoint] 绘制完成,是否保留绘制参考点
  37. * @param {SketchViewModel.SketchIconType} options.iconType 点图标类型
  38. */
  39. constructor(viewer, options) {
  40. /* 赋值三维视图 */
  41. this._viewer = viewer;
  42. /* 初始化 */
  43. this._init(options);
  44. }
  45. /**
  46. * @ignore
  47. * @param {JSON} options [配置项]
  48. * @param {Boolean} options.isDrawPoint 是否绘标记点
  49. * @param {Boolean} options.isRetainDrawPoint 绘制完成,是否保留绘制点
  50. * @param {SketchViewModel.SketchIconType} options.iconType 点图标类型
  51. */
  52. _init(options) {
  53. /* 开启地形检测 必须开启 否则会导致获取地形高度时异常 导致鼠标移动时位置哆嗦 */
  54. this._viewer.scene.globe.depthTestAgainstTerrain = true;
  55. /* 取消地图右键点击事件 */
  56. this._viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType
  57. .LEFT_DOUBLE_CLICK);
  58. /* 实体数据集 */
  59. this._entities = this._viewer.entities;
  60. this._pointEntitys = [];
  61. /* 草图工具绘制的点图片 */
  62. this._sketchPointImage = undefined;
  63. this._iconNormal =
  64. 'data:image/png;base64,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';
  65. this._iconBlue =
  66. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkEyMUE1MDg3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkEyMUE1MDc3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  67. this._iconGreen =
  68. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjI1NDIwOUU3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjI1NDIwOUQ3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  69. this._iconViolet =
  70. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzFDREU3Mjk3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzFDREU3Mjg3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  71. /* 创建的临时实体的名称 该名称通用 为了后期统一删除 */
  72. this._sketchEntityName = 'sketchEntity';
  73. /* 存储的点集合 */
  74. this._sketchTempPoints = []; //临时点集合 主要为了存储鼠标移动事件临时存储点
  75. this._sketchPoints = []; //正式点集合 主要为了绘制正式图形
  76. this._sketchOutputPoints = []; //输出点集合 主要为了存储输出的经纬度坐标点集合
  77. /* 创建的临时线 主要为了响应鼠标移动事件 */
  78. this._sketchTempPolyline = undefined;
  79. /* 创建的正式线 */
  80. this._sketchPolyline = undefined;
  81. /* 创建的临时面 主要为了响应鼠标移动事件 */
  82. this._sketchTempPolygon = undefined;
  83. /* 创建正式面 */
  84. this._sketchPolygon = undefined;
  85. /* 高度临时高度线 主要为了相应鼠标事件 */
  86. this._sketchTempAltituePolyline = undefined;
  87. /* 高度正式高度线 */
  88. this._sketchAltitudePolyline = undefined;
  89. /* 高度起始点的初始高度 */
  90. this._sketchAltitudeInitHeight = 0;
  91. /* 创建空间临时线 主要为了相应鼠标事件 */
  92. this._sketchTempSpatialPolyline = undefined;
  93. /* 创建空间正式线 */
  94. this._sketchSpatialPolyline = undefined;
  95. /* 创建临时圆 主要为了相应鼠标事件 */
  96. this._sketchTempCircle = undefined;
  97. /* 创建正式圆 */
  98. this._sketchCircle = undefined;
  99. /* 创建临时矩形 主要为了相应鼠标事件 */
  100. this._sketchTempRectangle = undefined;
  101. /* 创建正式矩形 */
  102. this._sketchRectangle = undefined;
  103. /* 创建临时三角形高度线 主要为了响应高度事件*/
  104. this._sketchTempTriangleAltitudePolyline = undefined;
  105. /* 创建三角形正式高度线 */
  106. this._sketchTriangleAltituePolyline = undefined;
  107. /* 创建临时空间三角形 主要是为了响应鼠标移动事件 */
  108. this._sketchTempSpatialTriangle = undefined;
  109. /* 创建正式空间三角形 */
  110. this._sketchSpatialTriangle = undefined;
  111. /* 点线标注 */
  112. this._lineLabel = undefined;
  113. this._polygonLabel = undefined;
  114. options = options || {};
  115. /* 配置是否绘制点 */
  116. if (options.isDrawPoint) {
  117. this._isDrawPoint = options.isDrawPoint;
  118. } else {
  119. this._isDrawPoint = false;
  120. }
  121. /* 配置绘制完成是否保留绘制点 */
  122. if (options.isRetainDrawPoint) {
  123. this._isRetainDrawPoint = options.isRetainDrawPoint;
  124. } else {
  125. this._isRetainDrawPoint = false;
  126. }
  127. /* 通用参数集合 */
  128. this._param = {
  129. moveLineWidth: 2, //移动线的宽度
  130. lineWidth: 2, //正是线的宽度
  131. moveAltitudeLineWidth: 2, //移动高度线宽度
  132. altitudeLineWidth: 2, //正式高度线的宽度
  133. spatialLineWidth: 2, //空间线的宽度
  134. moveEllipseColor: [0, 255, 0, 0.5], //移动绘制圆的颜色
  135. moveEllipseOutline: true, //移动绘制圆是否有边界线
  136. moveEllipseOutlineColor: [255, 0, 0, 0.5], //移动绘制圆边界线的颜色
  137. moveEllipseOutlineWidth: 1, //移动绘制圆边界线的宽度
  138. spatialLineWidth: 2, //空间线宽度
  139. ellipseColor: [0, 0, 255, 0.5], //正式圆的颜色
  140. ellipseOutline: true, //移动绘制圆是否有边界线
  141. ellipseOutlineColor: [255, 0, 0, 0.5], //移动绘制圆边界线的颜色
  142. ellipseOutlineWidth: 1, //移动绘制圆边界线的宽度
  143. }
  144. /* 各种材质及相关样式的初始化 */
  145. this._setMoveLineStyle(undefined);
  146. this._setLineStyle(undefined);
  147. this._setMovePolygonStyle(undefined);
  148. this._setPolygonStyle(undefined);
  149. this._setMoveAltitudeLineStyle(undefined);
  150. this._setAltitudeLineStyle(undefined);
  151. this._setMoveEllipseStyle(undefined);
  152. this._setEllipseStyle(undefined);
  153. this._setSpatialLineStyle(undefined);
  154. /* 设置点符号类型 */
  155. if (options && options.iconType) {
  156. switch (options.iconType) {
  157. case SketchViewModel.SketchIconType.Normal:
  158. this._sketchPointImage = this._iconNormal;
  159. break;
  160. case SketchViewModel.SketchIconType.Blue:
  161. this._sketchPointImage = this._iconBlue;
  162. break;
  163. case SketchViewModel.SketchIconType.Green:
  164. this._sketchPointImage = this._iconGreen;
  165. break;
  166. case SketchViewModel.SketchIconType.Violet:
  167. this._sketchPointImage = this._iconViolet;
  168. break;
  169. default:
  170. this._sketchPointImage = this._iconNormal;
  171. break;
  172. }
  173. } else {
  174. this._sketchPointImage = this._iconNormal;
  175. }
  176. }
  177. /**
  178. * 弧度转度
  179. * @ignore
  180. * @param {Number} arc 弧度
  181. * @return {Number} 角度
  182. */
  183. _arcToDegree(arc) {
  184. return arc / Math.PI * 180;
  185. }
  186. /**
  187. * 普通颜色值转换为Cesium颜色
  188. * @ignore
  189. * @param {int} red 红色[0~255]
  190. * @param {int} green 绿色[0~255]
  191. * @param {int} blue 蓝色[0~255]
  192. * @param {int} alpha 透明度[0~1]
  193. * @return {Cesium.Color} Cesium格式的颜色
  194. */
  195. _toColor(red, green, blue, alpha) {
  196. let normalColor = new Cesium.Color(0, 0, 0, 1.0);
  197. if (typeof red != 'number') return normalColor;
  198. if (typeof green != 'number') return normalColor;
  199. if (typeof blue != 'number') return normalColor;
  200. if (typeof alpha != 'number') return normalColor;
  201. if (red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255 || alpha < 0 || alpha > 1)
  202. return normalColor;
  203. return new Cesium.Color(red / 255.0, green / 255.0, blue / 255.0, alpha);
  204. }
  205. /**
  206. * 通过颜色数组转换为Cesium颜色
  207. * @ignore
  208. * @param {Array} array 颜色数组
  209. * @return {Cesium.Color} Cesium格式的颜色
  210. */
  211. _toColorFromArray(array) {
  212. if (!array || array.length === undefined || array.length === 0) return new Cesium.Color(255 / 255.0, 255 /
  213. 255.0, 255 / 255.0, 1.0);
  214. let r = 255,
  215. g = 255,
  216. b = 255,
  217. a = 1.0;
  218. if (array.length === 1) {
  219. r = parseInt(array[0]);
  220. } else if (array.length === 2) {
  221. r = parseInt(array[0]);
  222. g = parseInt(array[1]);
  223. } else if (array.length === 3) {
  224. r = parseInt(array[0]);
  225. g = parseInt(array[1]);
  226. b = parseInt(array[2]);
  227. } else if (array.length >= 4) {
  228. r = parseInt(array[0]);
  229. g = parseInt(array[1]);
  230. b = parseInt(array[2]);
  231. a = parseFloat(array[3]);
  232. }
  233. return new Cesium.Color(r / 255.0, g / 255.0, b / 255.0, a);
  234. }
  235. /**
  236. * 刷新场景 刷新一帧
  237. * @ignore
  238. */
  239. _updateScene() {
  240. this._viewer.scene.requestRender();
  241. }
  242. /**
  243. * 根据地形或实景或模型检测当前屏幕位置的世界坐标系位置
  244. * @ignore
  245. * @param {JSON} screenPosition 屏幕坐标
  246. * @param {Number} screenPosition.x 屏幕坐标x
  247. * @param {Number} screenPosition.y 屏幕坐标y
  248. * @return {JSON} 位置信息{x,y,z}
  249. */
  250. _getScreenClickPosition(screenPosition) {
  251. let resCartesian = undefined;
  252. let ray = this._viewer.scene.camera.getPickRay(screenPosition);
  253. let position = this._viewer.scene.globe.pick(ray, this._viewer.scene);
  254. let cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
  255. if (Cesium.defined(position)) {
  256. resCartesian = {
  257. x: position.x,
  258. y: position.y,
  259. z: position.z,
  260. }
  261. }
  262. return resCartesian;
  263. }
  264. /**
  265. * 根据地形或实景或模型检测当前屏幕位置的经纬度及高度
  266. * @ignore
  267. * @param {JSON} screenPoint 屏幕坐标
  268. * @param {Number} screenPoint.x 屏幕坐标x
  269. * @param {Number} screenPoint.y 屏幕坐标y
  270. * @return {JSON} 位置信息{lng,lat,height}
  271. */
  272. _getScreenClickPositionAndHeight(screenPoint) {
  273. var lng = undefined,
  274. lat = undefined,
  275. height = undefined;
  276. /* 从相机位置到 windowPosition 处的像素创建射线在世界坐标系中 */
  277. var ray = this._viewer.scene.camera.getPickRay(screenPoint);
  278. /* 找到射线与渲染的地球表面之间的交点 */
  279. var position = this._viewer.scene.globe.pick(ray, this._viewer.scene);
  280. /* 获取地理位置的制图表达 */
  281. var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
  282. /* 查询屏幕位置的要素 */
  283. var feature = this._viewer.scene.pick(screenPoint);
  284. if (feature == undefined) {
  285. lng = this._arcToDegree(cartographic.longitude);
  286. lat = this._arcToDegree(cartographic.latitude);
  287. height = cartographic.height;
  288. } else {
  289. var cartesian = this._viewer.scene.pickPosition(screenPoint);
  290. if (Cesium.defined(cartesian)) {
  291. var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
  292. lng = this._arcToDegree(cartographic.longitude);
  293. lat = this._arcToDegree(cartographic.latitude);
  294. height = cartographic.height;
  295. }
  296. }
  297. /* 返回结果 */
  298. return {
  299. lng: lng,
  300. lat: lat,
  301. height: height,
  302. }
  303. }
  304. /**
  305. * 屏幕位置转换为经纬度位置及空间位置
  306. * @ignore
  307. * @param {Cesium.Cartesian2} screenPosition 屏幕位置
  308. * @return {JSON} 经纬度位置及空间位置
  309. */
  310. _transfromFromScreenPoint(screenPosition) {
  311. /* 根据屏幕位置获取经度、纬度和高度信息 */
  312. let location = this._getScreenClickPositionAndHeight(screenPosition);
  313. /* 经纬度位置转换为三维坐标 */
  314. var cartesian = Cesium.Cartesian3.fromDegrees(location.lng, location.lat, location
  315. .height);
  316. /* 返回 */
  317. return {
  318. gLocation: location,
  319. sLocation: cartesian,
  320. }
  321. }
  322. /**
  323. * 根据Entity的名称批量删除Entity
  324. * @ignore
  325. * @param {String} entityName 实体名称
  326. */
  327. _removeEntityByName(entityName) {
  328. /* 获取实体集合 */
  329. var entities = this._entities;
  330. /* 如果不存在实体集合或集合中没有数据 则返回 */
  331. if (!entities || !entities.values) return;
  332. var delEntitys = [];
  333. /* 循环获取当前集合中的所有实体 */
  334. for (var i = 0; i < entities.values.length; i++) {
  335. if (entities.values[i].name == entityName) {
  336. delEntitys.push(entities.values[i]);
  337. }
  338. }
  339. /* 删除符合条件的所有实体 */
  340. for (var i = 0; i < delEntitys.length; i++) {
  341. entities.remove(delEntitys[i]);
  342. }
  343. /* 更新场景 */
  344. this._updateScene();
  345. }
  346. /**
  347. * 移除实体
  348. * @ignore
  349. * @param {Object} objEntity 实体
  350. */
  351. _removeEntityByObject(objEntity) {
  352. if (!Cesium.defined(objEntity)) return;
  353. this._entities.remove(objEntity);
  354. }
  355. /**
  356. * 绘制点
  357. * @ignore
  358. * @param {Cesium.Cartesian3} coord 坐标
  359. * @param {Number} coord.x 空间坐标x
  360. * @param {Number} coord.y 空间坐标y
  361. * @param {Number} coord.z 空间坐标z
  362. * @param {String} label [点上面显示的文字标注]
  363. */
  364. _createPoint(coord, label) {
  365. let _self = this;
  366. /* 创建点实体 */
  367. let entity = new Cesium.Entity({
  368. name: _self._sketchEntityName + "_Point",
  369. position: coord,
  370. billboard: {
  371. image: _self._sketchPointImage,
  372. horizontalOrigin: Cesium.HorizontalOrigin.center,
  373. verticalOrigin: Cesium.VerticalOrigin.bottom,
  374. scale: 0.5,
  375. pixelOffset: new Cesium.Cartesian2(0, -11),
  376. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  377. }
  378. });
  379. /* 判断是否需要绘制文字 */
  380. if (label) {
  381. entity.label = {
  382. text: label,
  383. font: '12px sans-serif',
  384. fillColor: this._toColor(255, 255, 255, 1.0),
  385. outlineColor: this._toColor(0, 154, 94, 1.0),
  386. style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  387. outlineWidth: 1.0,
  388. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  389. pixelOffset: new Cesium.Cartesian2(0, -28),
  390. showBackground: true,
  391. backgroundColor: this._toColor(0, 0, 0, 0.6),
  392. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  393. }
  394. }
  395. /* 加入集合中 */
  396. this._entities.add(entity);
  397. /* 加入点集合数组中 */
  398. this._pointEntitys.push(entity);
  399. this._updateScene();
  400. }
  401. /**
  402. * 删除全部点
  403. * @ignore
  404. */
  405. _removePointEntitys() {
  406. /* 清除所有绘制的点实体 */
  407. this._removeEntityByName(this._sketchEntityName + "_Point");
  408. /* 清除用于临时存储的点实体集合 */
  409. this._pointEntitys = [];
  410. }
  411. /**
  412. * 创建临时线
  413. * @ignore
  414. */
  415. _createTempPolyline() {
  416. let _self = this;
  417. /* 创建临时线 */
  418. if (!Cesium.defined(this._sketchTempPolyline)) {
  419. this._sketchTempPolyline = new Cesium.Entity({
  420. name: _self._sketchEntityName,
  421. polyline: {
  422. show: true,
  423. positions: new Cesium.CallbackProperty(function() {
  424. return _self._sketchTempPoints;
  425. }, false),
  426. material: _self._tempLineMaterial,
  427. width: _self._param.moveLineWidth,
  428. clampToGround: true, //开启贴地 如果有模型则贴模型
  429. }
  430. })
  431. this._entities.add(this._sketchTempPolyline);
  432. this._updateScene();
  433. }
  434. }
  435. /**
  436. * 创建正式线
  437. * @ignore
  438. */
  439. _createPolyline() {
  440. let _self = this;
  441. if (!Cesium.defined(this._sketchPolyline)) {
  442. this._sketchPolyline = new Cesium.Entity({
  443. name: _self._sketchEntityName,
  444. polyline: {
  445. show: true,
  446. positions: _self._sketchPoints,
  447. material: _self._lineMaterial,
  448. width: _self._param.lineWidth,
  449. clampToGround: true, //开启贴地 如果有模型则贴模型
  450. }
  451. })
  452. this._entities.add(this._sketchPolyline);
  453. this._updateScene();
  454. }
  455. }
  456. /**
  457. * 创建临时空间线
  458. * @ignore
  459. */
  460. _createTempSpatialPolyline() {
  461. let _self = this;
  462. if (!Cesium.defined(this._sketchTempSpatialPolyline)) {
  463. this._sketchTempSpatialPolyline = new Cesium.Entity({
  464. name: _self._sketchEntityName,
  465. polyline: {
  466. show: true,
  467. positions: new Cesium.CallbackProperty(function() {
  468. return _self._sketchTempPoints;
  469. }, false),
  470. material: _self._tempLineMaterial,
  471. width: _self._param.moveLineWidth,
  472. clampToGround: false, //由于是空间线禁止贴地或贴模型
  473. }
  474. })
  475. this._entities.add(this._sketchTempSpatialPolyline);
  476. this._updateScene();
  477. }
  478. }
  479. /**
  480. * 创建正式空间线
  481. * @ignore
  482. */
  483. _createSpatialPolyline() {
  484. let _self = this;
  485. if (!Cesium.defined(this._sketchSpatialPolyline)) {
  486. this._sketchSpatialPolyline = new Cesium.Entity({
  487. name: _self._sketchEntityName,
  488. polyline: {
  489. show: true,
  490. positions: _self._sketchPoints,
  491. material: _self._spatialLineMaterial,
  492. width: _self._param.spatialLineWidth,
  493. clampToGround: false, //由于是空间线禁止贴地或贴模型
  494. }
  495. })
  496. this._entities.add(this._sketchSpatialPolyline);
  497. this._updateScene();
  498. }
  499. }
  500. /**
  501. * 创建临时面
  502. * @ignore
  503. */
  504. _createTempPolygon() {
  505. let _self = this;
  506. if (!Cesium.defined(this._sketchTempPolygon)) {
  507. this._sketchTempPolygon = new Cesium.Entity({
  508. name: _self._sketchEntityName,
  509. polygon: {
  510. show: true,
  511. hierarchy: new Cesium.CallbackProperty(function() {
  512. return {
  513. positions: _self._sketchTempPoints,
  514. };
  515. }, false),
  516. material: _self._tempPolygonMaterial,
  517. classificationType: Cesium.ClassificationType.BOTH,
  518. }
  519. })
  520. this._entities.add(this._sketchTempPolygon);
  521. this._updateScene();
  522. }
  523. }
  524. /**
  525. * 创建正式面
  526. * @ignore
  527. */
  528. _createPolygon() {
  529. let _self = this;
  530. if (!Cesium.defined(this._sketchPolygon)) {
  531. this._sketchPoints.push(this._sketchPoints[0]);
  532. this._sketchPolygon = new Cesium.Entity({
  533. name: _self._sketchEntityName,
  534. polygon: {
  535. show: true,
  536. hierarchy: {
  537. positions: _self._sketchPoints,
  538. },
  539. material: _self._polygonMaterial,
  540. classificationType: Cesium.ClassificationType.BOTH,
  541. },
  542. polyline: {
  543. show: true,
  544. positions: _self._sketchPoints,
  545. material: _self._lineMaterial,
  546. width: _self._param.lineWidth,
  547. clampToGround: true, //开启贴地 如果有模型则贴模型
  548. }
  549. })
  550. this._entities.add(this._sketchPolygon);
  551. this._updateScene();
  552. }
  553. }
  554. /**
  555. * 创建正式拉伸体
  556. * @ignore
  557. * @param {JSON} options 配置项
  558. */
  559. _createPolygonBody(options) {
  560. let _self = this;
  561. /* 体的高度 */
  562. let appendHeight = parseFloat(100);
  563. if (options && options.height && typeof options.height === 'number') appendHeight = parseFloat(options
  564. .height);
  565. /* 墙和体的颜色 */
  566. let wallColor = [255, 255, 0, 1.0];
  567. let polygonColor = [0, 0, 255, 0.65];
  568. if (options && options.color && this._checkColorAndAlpha(options.color)) polygonColor = this
  569. ._checkColorAndAlpha(options.color);
  570. /* 创建体 */
  571. if (!Cesium.defined(this._sketchPolygon)) {
  572. /* 墙的片元着色器源码 */
  573. let shaderSource =
  574. 'czm_material czm_getMaterial(czm_materialInput materialInput){\n' +
  575. ' czm_material material = czm_getDefaultMaterial(materialInput);\n' +
  576. ' vec2 st = materialInput.st;\n' +
  577. ' vec3 str = materialInput.str;\n' +
  578. // ' vec4 colorImage = texture2D(image, vec2(st.s, fract((st.t - speed * czm_frameNumber * 0.001))));\n' +
  579. // ' vec4 colorImage = texture2D(image, vec2(fract(st.s - speed * czm_frameNumber * 0.001), st.t));\n' +
  580. // ' vec4 colorImage = texture2D(image, vec2(fract((st.t - speed*czm_frameNumber*0.003)), st.t));\n' +
  581. // ' vec4 colorImage = texture2D(image,vec2(str.t,str.r));\n' +
  582. // ' material.alpha = colorImage.a * color.a;\n' +
  583. // ' material.diffuse = 1.2 * color.rgb;\n' +
  584. // ' float time = fract(czm_frameNumber * speed /1000.0);\n' +
  585. ' material.diffuse = color.rgb;\n' +
  586. // ' material.alpha = color.a * fract(time - st.s);\n' +
  587. ' material.alpha = color.a;\n' +
  588. ' return material;\n' +
  589. '}';
  590. /* 创建墙的材质 */
  591. let wallMaterial = new Cesium.Material({
  592. fabric: {
  593. type: 'wallMaterial',
  594. uniforms: {
  595. color: _self._toColorFromArray(wallColor),
  596. speed: 100,
  597. },
  598. source: shaderSource,
  599. }
  600. });
  601. /* 创建墙的外观*/
  602. let wallAppearance = new Cesium.MaterialAppearance({
  603. material: wallMaterial,
  604. });
  605. /* 创建体的外观 */
  606. let polygonAppearance = new Cesium.MaterialAppearance({
  607. material: new Cesium.Material({
  608. fabric: {
  609. type: 'Color',
  610. uniforms: {
  611. color: _self._toColorFromArray(polygonColor),
  612. }
  613. }
  614. }),
  615. });
  616. /* 设置墙的最小、最大高度 */
  617. let wallMinimumHeights = [];
  618. let wallMaximumHeights = [];
  619. for (let i = 0; i < _self._sketchOutputPoints.length; i++) {
  620. let height = parseFloat(_self._sketchOutputPoints[i].height);
  621. wallMinimumHeights.push(height);
  622. wallMaximumHeights.push(height + appendHeight);
  623. }
  624. /* 追加第一个点 */
  625. let height = parseFloat(_self._sketchOutputPoints[0].height);
  626. wallMinimumHeights.push(height);
  627. wallMaximumHeights.push(height + appendHeight);
  628. /* 创建临时数组 */
  629. let tempPoints = [];
  630. for (let i = 0; i < _self._sketchPoints.length; i++) {
  631. tempPoints.push(_self._sketchPoints[i]);
  632. }
  633. /* 追加第一个点 */
  634. tempPoints.push(_self._sketchPoints[0]);
  635. /* 创建墙几何图元 */
  636. let wllGeometry = new Cesium.WallGeometry({
  637. positions: tempPoints,
  638. maximumHeights: wallMaximumHeights,
  639. minimumHeights: wallMinimumHeights,
  640. })
  641. /* 创建区域体底部对象 */
  642. let polygonGeometry = new Cesium.PolygonGeometry({
  643. polygonHierarchy: new Cesium.PolygonHierarchy(tempPoints),
  644. perPositionHeight: true,
  645. extrudedHeight: Math.max.apply(null, wallMaximumHeights),
  646. })
  647. /* 创建面拉伸要素 */
  648. let polygonPrimitive = new Cesium.Primitive({
  649. geometryInstances: new Cesium.GeometryInstance({
  650. geometry: polygonGeometry,
  651. }),
  652. appearance: polygonAppearance,
  653. releaseGeometryInstances: false,
  654. });
  655. /* 追加属性 */
  656. polygonPrimitive.setUseGeometry({
  657. cPoints: _self._sketchPoints,
  658. gPoints: _self._sketchOutputPoints,
  659. height: appendHeight,
  660. color: polygonColor,
  661. })
  662. /* 添加要素 */
  663. this._viewer.scene.primitives.add(polygonPrimitive);
  664. /* 添加墙要素 */
  665. // this._viewer.scene.primitives.add(new Cesium.Primitive({
  666. // geometryInstances: new Cesium.GeometryInstance({
  667. // geometry: wllGeometry,
  668. // }),
  669. // appearance: wallAppearance,
  670. // }));
  671. }
  672. }
  673. /**
  674. * 调用更新椭圆中心点位置信息
  675. * @ignore
  676. */
  677. _callUpdaeEllipseCenterPosition() {
  678. let _self = this;
  679. return function() {
  680. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  681. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  682. _self._sketchEllipseCenterPosition = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  683. return _self._sketchEllipseCenterPosition;
  684. }
  685. }
  686. /**
  687. * 调用更新高度线的点集合信息
  688. * @ignore
  689. */
  690. _callUpdateAltitudePolylinePositions() {
  691. let _self = this;
  692. return function() {
  693. _self._sketchAltitudePolylinePostions = [];
  694. _self._sketchAltitudePolylinePostions.push(_self._sketchTempPoints[0]);
  695. let point1cartographic = Cesium.Cartographic.fromCartesian(_self
  696. ._sketchTempPoints[0]);
  697. let point2cartographic = Cesium.Cartographic.fromCartesian(_self
  698. ._sketchTempPoints[1]);
  699. let point_temp = Cesium.Cartesian3.fromDegrees(Cesium.Math
  700. .toDegrees(
  701. point1cartographic
  702. .longitude), Cesium.Math.toDegrees(point1cartographic
  703. .latitude),
  704. point2cartographic.height);
  705. _self._sketchAltitudePolylinePostions.push(point_temp);
  706. return _self._sketchAltitudePolylinePostions;
  707. }
  708. }
  709. /**
  710. * 椭圆-长短半轴大小变化回调
  711. * @ignore
  712. */
  713. _callUpdateEllipseMinorAxis() {
  714. let _self = this;
  715. return function() {
  716. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  717. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  718. /* 计算距离 */
  719. let geodesic = new Cesium.EllipsoidGeodesic();
  720. geodesic.setEndPoints(point1cartographic, point2cartographic);
  721. _self._sketchEllipseRadius = geodesic.surfaceDistance;
  722. if (_self._sketchEllipseRadius <= 0) _self._sketchEllipseRadius = 1;
  723. return _self._sketchEllipseRadius;
  724. }
  725. }
  726. /**
  727. * 调用更新椭圆高度信息
  728. * @ignore
  729. */
  730. _callUpdateEllipseHeight() {
  731. let _self = this;
  732. return function() {
  733. let cartographic = Cesium.Cartographic.fromCartesian(_self
  734. ._sketchTempPoints[0]);
  735. let cartographic1 = Cesium.Cartographic.fromCartesian(_self
  736. ._sketchTempPoints[1]);
  737. let height_temp = cartographic1.height - cartographic.height;
  738. _self._sketchEllipseHeight = height_temp + _self._sketchAltitudeInitHeight;
  739. return _self._sketchEllipseHeight;
  740. }
  741. }
  742. /**
  743. * 创建临时高度线
  744. * @ignore
  745. */
  746. _createTempAltitudePolyline() {
  747. let _self = this;
  748. if (!Cesium.defined(this._sketchTempAltituePolyline)) {
  749. this._sketchTempAltituePolyline = new Cesium.Entity({
  750. name: _self._sketchEntityName,
  751. position: new Cesium.CallbackProperty(_self._callUpdaeEllipseCenterPosition(),
  752. false),
  753. polyline: {
  754. show: true,
  755. positions: new Cesium.CallbackProperty(_self._callUpdateAltitudePolylinePositions(),
  756. false),
  757. material: _self._tempAlititudeLineMaterial,
  758. width: _self._param.moveAltitudeLineWidth,
  759. clampToGround: false, //禁止贴地或模型 否则为平面线
  760. },
  761. ellipse: {
  762. show: true,
  763. semiMinorAxis: new Cesium.CallbackProperty(_self._callUpdateEllipseMinorAxis(), false),
  764. semiMajorAxis: new Cesium.CallbackProperty(_self._callUpdateEllipseMinorAxis(), false),
  765. height: new Cesium.CallbackProperty(_self._callUpdateEllipseHeight(), false),
  766. material: _self._toColorFromArray(_self._param.moveEllipseColor),
  767. outline: _self._param.moveEllipseOutline,
  768. outlineWidth: _self._param.moveEllipseOutlineWidth,
  769. outlineColor: _self._toColorFromArray(_self._param.moveEllipseOutlineColor),
  770. },
  771. })
  772. _self._entities.add(_self._sketchTempAltituePolyline);
  773. }
  774. }
  775. /**
  776. * 创建正式高度线
  777. * @ignore
  778. */
  779. _createAltitudePolyline() {
  780. let _self = this;
  781. if (!Cesium.defined(this._sketchAltitudePolyline)) {
  782. this._sketchAltitudePolyline = new Cesium.Entity({
  783. name: _self._sketchEntityName,
  784. position: _self._sketchEllipseCenterPosition,
  785. polyline: {
  786. show: true,
  787. positions: _self._sketchAltitudePolylinePostions,
  788. material: _self._altitudeLineMaterial,
  789. width: _self._param.altitudeLineWidth,
  790. clampToGround: false, //禁止贴地或模型 否则为平面线
  791. },
  792. ellipse: {
  793. show: true,
  794. semiMinorAxis: _self._sketchEllipseRadius,
  795. semiMajorAxis: _self._sketchEllipseRadius,
  796. height: _self._sketchEllipseHeight,
  797. material: _self._toColorFromArray(_self._param.ellipseColor),
  798. outline: _self._param.ellipseOutline,
  799. outlineWidth: _self._param.ellipseOutlineWidth,
  800. outlineColor: _self._toColorFromArray(_self._param.ellipseOutlineColor),
  801. },
  802. })
  803. _self._entities.add(_self._sketchAltitudePolyline);
  804. }
  805. }
  806. /**
  807. * 圆边界点变更回调
  808. * @ignore
  809. */
  810. _callEllipseOutlineCoordinate() {
  811. let _self = this;
  812. return function() {
  813. let positionCenter = _self._sketchEllipseCenterPosition;
  814. let positionRotate = _self._sketchTempPoints[1];
  815. _self._ellipseOutlineCoordinates = [];
  816. for (let angle = 5; angle < 360;) {
  817. let newPosition = _self._rotatedPointByAngle(positionRotate, positionCenter, angle);
  818. _self._ellipseOutlineCoordinates.push(newPosition);
  819. angle = angle + 5;
  820. }
  821. _self._ellipseOutlineCoordinates.push(_self._ellipseOutlineCoordinates[0]);
  822. return _self._ellipseOutlineCoordinates;
  823. }
  824. }
  825. /**
  826. * 创建临时圆
  827. * @ignore
  828. * @param {Cesium.Cartesian3} centerPosition 圆的中心点位置
  829. */
  830. _createTempCircle(centerPosition) {
  831. let _self = this;
  832. if (!Cesium.defined(this._sketchTempCircle)) {
  833. /* 存储椭圆中心点位置 */
  834. _self._sketchEllipseCenterPosition = centerPosition.clone();
  835. this._sketchTempCircle = new Cesium.Entity({
  836. name: _self._sketchEntityName,
  837. position: centerPosition,
  838. polyline: {
  839. show: true,
  840. positions: new Cesium.CallbackProperty(_self._callEllipseOutlineCoordinate(), false),
  841. material: _self._tempLineMaterial,
  842. width: _self._param.moveLineWidth,
  843. clampToGround: true, //开启贴地 如果有模型则贴模型
  844. },
  845. ellipse: {
  846. show: true,
  847. semiMinorAxis: new Cesium.CallbackProperty(_self._callUpdateEllipseMinorAxis(), false),
  848. semiMajorAxis: new Cesium.CallbackProperty(_self._callUpdateEllipseMinorAxis(), false),
  849. material: _self._tempPolygonMaterial,
  850. classificationType: Cesium.ClassificationType.BOTH,
  851. },
  852. })
  853. _self._entities.add(_self._sketchTempCircle);
  854. }
  855. }
  856. /**
  857. * position_A绕position_B逆时针旋转angle度(角度)得到新点
  858. * @ignore
  859. * @param {Cesium.Cartesian3} position_A 动点
  860. * @param {Cesium.Cartesian3} position_B 中心点
  861. * @param {Number} angle 旋转角度
  862. */
  863. _rotatedPointByAngle(position_A, position_B, angle) {
  864. //以B点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵
  865. var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(position_B);
  866. //求世界坐标到局部坐标的变换矩阵
  867. var worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4());
  868. //B点在局部坐标的位置,其实就是局部坐标原点
  869. var localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, position_B, new Cesium
  870. .Cartesian3());
  871. //A点在以B点为原点的局部的坐标位置
  872. var localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, position_A, new Cesium
  873. .Cartesian3());
  874. //根据数学公式A点逆时针旋转angle度后在局部坐标系中的x,y,z位置
  875. var new_x = localPosition_A.x * Math.cos(Cesium.Math.toRadians(angle)) + localPosition_A.y * Math.sin(Cesium
  876. .Math.toRadians(angle));
  877. var new_y = localPosition_A.y * Math.cos(Cesium.Math.toRadians(angle)) - localPosition_A.x * Math.sin(Cesium
  878. .Math.toRadians(angle));
  879. var new_z = localPosition_A.z;
  880. //最后应用局部坐标到世界坐标的转换矩阵求得旋转后的A点世界坐标
  881. return Cesium.Matrix4.multiplyByPoint(localToWorld_Matrix, new Cesium.Cartesian3(new_x, new_y, new_z),
  882. new Cesium.Cartesian3());
  883. }
  884. /**
  885. * 创建正式圆
  886. * @ignore
  887. */
  888. _createCircle() {
  889. let _self = this;
  890. if (!Cesium.defined(this._sketchCircle)) {
  891. this._sketchCircle = new Cesium.Entity({
  892. name: _self._sketchEntityName,
  893. position: _self._sketchEllipseCenterPosition,
  894. polyline: {
  895. show: true,
  896. positions: _self._ellipseOutlineCoordinates,
  897. material: _self._lineMaterial,
  898. width: _self._param.lineWidth,
  899. clampToGround: true, //开启贴地 如果有模型则贴模型
  900. },
  901. ellipse: {
  902. show: true,
  903. semiMinorAxis: _self._sketchEllipseRadius,
  904. semiMajorAxis: _self._sketchEllipseRadius,
  905. material: _self._polygonMaterial,
  906. classificationType: Cesium.ClassificationType.BOTH,
  907. },
  908. })
  909. _self._entities.add(_self._sketchCircle);
  910. }
  911. }
  912. /**
  913. * 更新矩形坐标
  914. * @ignore
  915. */
  916. _callUpdateRectangleCoordinates() {
  917. let _self = this;
  918. return function() {
  919. let lng0 = parseFloat(_self._sketchTempPoints[0].lng);
  920. let lat0 = parseFloat(_self._sketchTempPoints[0].lat);
  921. let lng1 = parseFloat(_self._sketchTempPoints[1].lng);
  922. let lat1 = parseFloat(_self._sketchTempPoints[1].lat);
  923. _self._rectangleCoordinates = [0, 0, 1, 1];
  924. if (lng0 < lng1) {
  925. _self._rectangleCoordinates[0] = lng0;
  926. _self._rectangleCoordinates[2] = lng1;
  927. } else {
  928. _self._rectangleCoordinates[0] = lng1;
  929. _self._rectangleCoordinates[2] = lng0;
  930. }
  931. if (lat0 < lat1) {
  932. _self._rectangleCoordinates[1] = lat0;
  933. _self._rectangleCoordinates[3] = lat1;
  934. } else {
  935. _self._rectangleCoordinates[1] = lat1;
  936. _self._rectangleCoordinates[3] = lat0;
  937. }
  938. let rectangle = Cesium.Rectangle.fromDegrees(_self._rectangleCoordinates[0], _self
  939. ._rectangleCoordinates[1],
  940. _self._rectangleCoordinates[2], _self._rectangleCoordinates[3]);
  941. /* 计算并返回矩形的边界线坐标数组 */
  942. let res = _self._calculateRectangleOutlineCoordinates(rectangle);
  943. _self._rectangleOutlineCoordinates = res.cPoints;
  944. _self._sketchOutputPoints = res.gPoints;
  945. return rectangle;
  946. }
  947. }
  948. /**
  949. * 计算矩形的外围坐标串
  950. * @ignore
  951. * @param {Cesium.Rectangle} rectangle 矩形
  952. * @return {Array<Cesium.Cartesian3>} 坐标串集合
  953. */
  954. _calculateRectangleOutlineCoordinates(rectangle) {
  955. /* 计算东南角 */
  956. let south_east = Cesium.Rectangle.southeast(rectangle);
  957. let se = Cesium.Cartographic.toCartesian(south_east);
  958. /* 计算西南角 */
  959. let south_west = Cesium.Rectangle.southwest(rectangle);
  960. let sw = Cesium.Cartographic.toCartesian(south_west);
  961. /* 计算东北角 */
  962. let north_east = Cesium.Rectangle.northeast(rectangle);
  963. let ne = Cesium.Cartographic.toCartesian(north_east);
  964. /* 计算西北角 */
  965. let north_west = Cesium.Rectangle.northwest(rectangle);
  966. let nw = Cesium.Cartographic.toCartesian(north_west);
  967. /* 经纬度坐标数组 */
  968. let gPoints = [];
  969. gPoints.push({
  970. lng: Cesium.Math.toDegrees(south_west.longitude),
  971. lat: Cesium.Math.toDegrees(south_west.latitude),
  972. height: south_west.height,
  973. });
  974. gPoints.push({
  975. lng: Cesium.Math.toDegrees(south_east.longitude),
  976. lat: Cesium.Math.toDegrees(south_east.latitude),
  977. height: south_east.height,
  978. });
  979. gPoints.push({
  980. lng: Cesium.Math.toDegrees(north_east.longitude),
  981. lat: Cesium.Math.toDegrees(north_east.latitude),
  982. height: north_east.height,
  983. });
  984. gPoints.push({
  985. lng: Cesium.Math.toDegrees(north_west.longitude),
  986. lat: Cesium.Math.toDegrees(north_west.latitude),
  987. height: north_west.height,
  988. });
  989. gPoints.push({
  990. lng: Cesium.Math.toDegrees(south_west.longitude),
  991. lat: Cesium.Math.toDegrees(south_west.latitude),
  992. height: south_west.height,
  993. });
  994. /* 返回坐标串 */
  995. return {
  996. cPoints: [sw, se, ne, nw, sw],
  997. gPoints: gPoints,
  998. };
  999. }
  1000. /**
  1001. * 矩形外边框轮廓线调用
  1002. * @ignore
  1003. */
  1004. _callUpdateRectangleOutlineCoordinates() {
  1005. let _self = this;
  1006. return function() {
  1007. return _self._rectangleOutlineCoordinates;
  1008. }
  1009. }
  1010. /**
  1011. * 创建临时矩形
  1012. * @ignore
  1013. */
  1014. _createTempRectangle() {
  1015. let _self = this;
  1016. if (!Cesium.defined(this._sketchTempRectangle)) {
  1017. this._sketchTempRectangle = new Cesium.Entity({
  1018. name: _self._sketchEntityName,
  1019. polyline: {
  1020. show: true,
  1021. positions: new Cesium.CallbackProperty(_self._callUpdateRectangleOutlineCoordinates(), false),
  1022. material: _self._tempLineMaterial,
  1023. width: _self._param.moveLineWidth,
  1024. clampToGround: true, //开启贴地 如果有模型则贴模型
  1025. },
  1026. rectangle: {
  1027. show: true,
  1028. coordinates: new Cesium.CallbackProperty(_self._callUpdateRectangleCoordinates(), false),
  1029. material: _self._tempPolygonMaterial,
  1030. classificationType: Cesium.ClassificationType.BOTH,
  1031. },
  1032. })
  1033. _self._entities.add(_self._sketchTempRectangle);
  1034. }
  1035. }
  1036. /**
  1037. * 创建矩形
  1038. * @ignore
  1039. */
  1040. _createRectangle() {
  1041. let _self = this;
  1042. if (!Cesium.defined(this._sketchRectangle)) {
  1043. this._sketchRectangle = new Cesium.Entity({
  1044. name: _self._sketchEntityName,
  1045. polyline: {
  1046. show: true,
  1047. positions: _self._rectangleOutlineCoordinates,
  1048. material: _self._lineMaterial,
  1049. width: _self._param.lineWidth,
  1050. clampToGround: true, //开启贴地 如果有模型则贴模型
  1051. },
  1052. rectangle: {
  1053. show: true,
  1054. coordinates: Cesium.Rectangle.fromDegrees(_self._rectangleCoordinates[0], _self._rectangleCoordinates[1], _self._rectangleCoordinates[2], _self._rectangleCoordinates[3]),
  1055. material: _self._polygonMaterial,
  1056. classificationType: Cesium.ClassificationType.BOTH,
  1057. },
  1058. })
  1059. _self._entities.add(_self._sketchRectangle);
  1060. }
  1061. }
  1062. /**
  1063. * 调用更新三角形高度线椭圆中心点位置信息
  1064. * @ignore
  1065. */
  1066. _callUpdaeTriangleEllipseCenterPosition() {
  1067. let _self = this;
  1068. return function() {
  1069. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  1070. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[2]);
  1071. _self._sketchEllipseCenterPosition = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  1072. return _self._sketchEllipseCenterPosition;
  1073. }
  1074. }
  1075. /**
  1076. * 调用更新三角形高度线的点集合信息
  1077. * @ignore
  1078. */
  1079. _callUpdateTriangleAltitudePolylinePositions() {
  1080. let _self = this;
  1081. return function() {
  1082. _self._sketchAltitudePolylinePostions = [];
  1083. _self._sketchAltitudePolylinePostions.push(_self._sketchTempPoints[1]);
  1084. let point1cartographic = Cesium.Cartographic.fromCartesian(_self
  1085. ._sketchTempPoints[1]);
  1086. let point2cartographic = Cesium.Cartographic.fromCartesian(_self
  1087. ._sketchTempPoints[2]);
  1088. let point_temp = Cesium.Cartesian3.fromDegrees(Cesium.Math
  1089. .toDegrees(
  1090. point1cartographic
  1091. .longitude), Cesium.Math.toDegrees(point1cartographic
  1092. .latitude),
  1093. point2cartographic.height);
  1094. _self._sketchAltitudePolylinePostions.push(point_temp);
  1095. return _self._sketchAltitudePolylinePostions;
  1096. }
  1097. }
  1098. /**
  1099. * 调用更新三角形高度线椭圆-长短半轴大小变化回调
  1100. * @ignore
  1101. */
  1102. _callUpdateTriangleEllipseMinorAxis() {
  1103. let _self = this;
  1104. return function() {
  1105. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  1106. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[2]);
  1107. /* 计算距离 */
  1108. let geodesic = new Cesium.EllipsoidGeodesic();
  1109. geodesic.setEndPoints(point1cartographic, point2cartographic);
  1110. _self._sketchEllipseRadius = geodesic.surfaceDistance;
  1111. if (_self._sketchEllipseRadius <= 0) _self._sketchEllipseRadius = 1;
  1112. return _self._sketchEllipseRadius;
  1113. }
  1114. }
  1115. /**
  1116. * 调用更新三角形高度线椭圆高度信息
  1117. * @ignore
  1118. */
  1119. _callUpdateTriangleEllipseHeight() {
  1120. let _self = this;
  1121. return function() {
  1122. let cartographic = Cesium.Cartographic.fromCartesian(_self
  1123. ._sketchTempPoints[1]);
  1124. let cartographic1 = Cesium.Cartographic.fromCartesian(_self
  1125. ._sketchTempPoints[2]);
  1126. let height_temp = cartographic1.height - cartographic.height;
  1127. _self._sketchEllipseHeight = height_temp + _self._sketchAltitudeInitHeight;
  1128. return _self._sketchEllipseHeight;
  1129. }
  1130. }
  1131. /**
  1132. * 调用空间三角形空间线位置回调
  1133. * @ignore
  1134. */
  1135. _callUpdateTriangleSpatialPolylinePositions() {
  1136. let _self = this;
  1137. return function() {
  1138. _self._sketchTriangleSpatialPolylinePositions = [];
  1139. _self._sketchTriangleSpatialPolylinePositions.push(_self._sketchTempPoints[0]);
  1140. _self._sketchTriangleSpatialPolylinePositions.push(_self._sketchEllipseCenterPosition);
  1141. return _self._sketchTriangleSpatialPolylinePositions;
  1142. }
  1143. }
  1144. /**
  1145. * 创建三角形空间线
  1146. * @ignore
  1147. */
  1148. _createTriangleSpatialPolyline() {
  1149. let _self = this;
  1150. /* 创建空间线实例 */
  1151. this._sketchSpatialPolyline = new Cesium.Entity({
  1152. name: _self._sketchEntityName,
  1153. polyline: {
  1154. show: true,
  1155. positions: _self._sketchTriangleSpatialPolylinePositions,
  1156. material: _self._spatialLineMaterial,
  1157. width: _self._param.spatialLineWidth,
  1158. clampToGround: false, //开启贴地 如果有模型则贴模型
  1159. }
  1160. });
  1161. /* 加入实体集合 */
  1162. this._entities.add(this._sketchSpatialPolyline);
  1163. }
  1164. /**
  1165. * 创建三角形临时高度线和空间线
  1166. * @ignore
  1167. */
  1168. _createTempTriangleAltitudePolylineAndSpatialPolyline() {
  1169. let _self = this;
  1170. if (!Cesium.defined(this._sketchTempTriangleAltitudePolyline) && !Cesium.defined(this
  1171. ._sketchTempSpatialPolyline)) {
  1172. /* 创建高度线实例 */
  1173. this._sketchTempTriangleAltitudePolyline = new Cesium.Entity({
  1174. name: _self._sketchEntityName,
  1175. position: new Cesium.CallbackProperty(_self._callUpdaeTriangleEllipseCenterPosition(),
  1176. false),
  1177. polyline: {
  1178. show: true,
  1179. positions: new Cesium.CallbackProperty(_self
  1180. ._callUpdateTriangleAltitudePolylinePositions(),
  1181. false),
  1182. material: _self._tempAlititudeLineMaterial,
  1183. width: _self._param.moveAltitudeLineWidth,
  1184. clampToGround: false, //禁止贴地或贴模型
  1185. },
  1186. ellipse: {
  1187. show: true,
  1188. semiMinorAxis: new Cesium.CallbackProperty(_self._callUpdateTriangleEllipseMinorAxis(), false),
  1189. semiMajorAxis: new Cesium.CallbackProperty(_self._callUpdateTriangleEllipseMinorAxis(), false),
  1190. height: new Cesium.CallbackProperty(_self._callUpdateTriangleEllipseHeight(), false),
  1191. material: _self._toColorFromArray(_self._param.moveEllipseColor),
  1192. outline: _self._param.moveEllipseOutline,
  1193. outlineWidth: _self._param.moveEllipseOutlineWidth,
  1194. outlineColor: _self._toColorFromArray(_self._param.moveEllipseOutlineColor),
  1195. },
  1196. });
  1197. /* 加入实体集合 */
  1198. _self._entities.add(_self._sketchTempTriangleAltitudePolyline);
  1199. /* 创建空间线实例 */
  1200. _self._sketchTempSpatialPolyline = new Cesium.Entity({
  1201. name: _self._sketchEntityName,
  1202. polyline: {
  1203. show: true,
  1204. positions: new Cesium.CallbackProperty(_self
  1205. ._callUpdateTriangleSpatialPolylinePositions(), false),
  1206. material: _self._tempLineMaterial,
  1207. width: _self._param.moveLineWidth,
  1208. clampToGround: false, //禁止贴地或贴模型
  1209. }
  1210. });
  1211. /* 加入实体集合 */
  1212. _self._entities.add(_self._sketchTempSpatialPolyline);
  1213. }
  1214. }
  1215. /**
  1216. * 创建临时空间三角形
  1217. * @ignore
  1218. */
  1219. _createTempSpatialTriangle() {
  1220. let _self = this;
  1221. /* 创建临时线 */
  1222. if (!Cesium.defined(this._sketchTempSpatialTriangle)) {
  1223. this._sketchTempSpatialTriangle = new Cesium.Entity({
  1224. name: _self._sketchEntityName,
  1225. polyline: {
  1226. show: true,
  1227. positions: new Cesium.CallbackProperty(function() {
  1228. /* 为了成功绘制 需要对点数据进行处理 */
  1229. _self._sketchSpatialTrianglePositions = [];
  1230. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[0].clone());
  1231. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[1].clone());
  1232. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  1233. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  1234. let point_temp = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  1235. _self._sketchSpatialTrianglePositions.push(point_temp);
  1236. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[0].clone());
  1237. return _self._sketchSpatialTrianglePositions;
  1238. }, false),
  1239. material: _self._tempLineMaterial,
  1240. width: _self._param.moveLineWidth,
  1241. clampToGround: false, //为了绘制空间三角形 禁止贴地
  1242. }
  1243. })
  1244. this._entities.add(this._sketchTempSpatialTriangle);
  1245. this._updateScene();
  1246. }
  1247. }
  1248. /**
  1249. * 创建正式空间三角形
  1250. * @ignore
  1251. */
  1252. _createSpatialTriangle() {
  1253. let _self = this;
  1254. /* 创建临时线 */
  1255. if (!Cesium.defined(this._sketchSpatialTriangle)) {
  1256. this._sketchSpatialTriangle = new Cesium.Entity({
  1257. name: _self._sketchEntityName,
  1258. polyline: {
  1259. show: true,
  1260. positions: _self._sketchSpatialTrianglePositions,
  1261. material: _self._lineMaterial,
  1262. width: _self._param.lineWidth,
  1263. clampToGround: false, //为了绘制空间三角形 禁止贴地
  1264. }
  1265. })
  1266. this._entities.add(this._sketchSpatialTriangle);
  1267. this._updateScene();
  1268. }
  1269. }
  1270. /**
  1271. * 设置移动线样式
  1272. * @ignore
  1273. * @param {JSON} options 配置项
  1274. * @param {Array<Number>} options.color 移动线颜色[0~255,0~255,0~255,0~1]
  1275. * @param {Number} options.lineWidth 移动线的宽度
  1276. * @param {Boolean} options.outline 是否有边框,有边框则为实线,否则为虚线
  1277. * @param {Array<Number>} options.outlineColor 移动线描边颜色[0~255,0~255,0~255,0~1]
  1278. * @param {Number} options.outlineWidth 移动线描边宽度
  1279. * @param {Number} options.power 亮度[0~1],如果需要使用虚线,请将该值设置为undefined
  1280. */
  1281. _setMoveLineStyle(options) {
  1282. let _self = this;
  1283. let color = [255, 255, 255, 1.0];
  1284. let lineWidth = 3;
  1285. let isOutline = false;
  1286. let power = 0.2;
  1287. let outlineColor = [255, 0, 0, 1.0];
  1288. let outlineWidth = 1;
  1289. if (options && options.color && options.color.length === 4) color = options.color;
  1290. if (options && options.outline && typeof options.outline === 'boolean') isOutline = options.outline;
  1291. if (options && options.outlineColor && options.outlineColor.length === 4) outlineColor = options
  1292. .outlineColor;
  1293. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') outlineWidth =
  1294. options.outlineWidth;
  1295. if (options && options.lineWidth && typeof options.lineWidth === 'number') lineWidth = options
  1296. .lineWidth;
  1297. /* 设置亮度 */
  1298. if (options && options.power) power = options.power;
  1299. if (isOutline) {
  1300. this._tempLineMaterial = new Cesium.PolylineOutlineMaterialProperty({
  1301. color: _self._toColorFromArray(color),
  1302. outlineColor: _self._toColorFromArray(outlineColor),
  1303. outlineWidth: outlineWidth,
  1304. });
  1305. } else {
  1306. if (power === undefined) {
  1307. this._tempLineMaterial = new Cesium.PolylineDashMaterialProperty({
  1308. color: _self._toColorFromArray(color),
  1309. });
  1310. } else {
  1311. this._tempLineMaterial = new Cesium.PolylineGlowMaterialProperty({
  1312. color: _self._toColorFromArray(color),
  1313. glowPower: power,
  1314. });
  1315. }
  1316. }
  1317. /* 设置移动线宽 */
  1318. this._param.moveLineWidth = lineWidth;
  1319. }
  1320. /**
  1321. * 设置线样式
  1322. * @ignore
  1323. * @param {JSON} options 配置项
  1324. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1325. * @param {Number} options.lineWidth 移动线的宽度
  1326. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1327. * @param {Number} options.outlineWidth 线描边宽度
  1328. */
  1329. _setLineStyle(options) {
  1330. let _self = this;
  1331. let color = [255, 255, 255, 1.0];
  1332. let lineWidth = 2;
  1333. let outlineColor = [0, 255, 0, 0.6];
  1334. let outlineWidth = 1;
  1335. if (options && options.color && options.color.length === 4) color = options.color;
  1336. if (options && options.outlineColor && options.outlineColor.length === 4) outlineColor = options
  1337. .outlineColor;
  1338. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') outlineWidth =
  1339. options.outlineWidth;
  1340. if (options && options.lineWidth && typeof options.lineWidth === 'number') lineWidth = options
  1341. .lineWidth;
  1342. this._lineMaterial = new Cesium.PolylineOutlineMaterialProperty({
  1343. color: _self._toColorFromArray(color),
  1344. outlineColor: _self._toColorFromArray(outlineColor),
  1345. outlineWidth: outlineWidth,
  1346. });
  1347. /* 设置线宽 */
  1348. this._param.lineWidth = lineWidth;
  1349. }
  1350. /**
  1351. * 设置空间线样式
  1352. * @ignore
  1353. * @param {JSON} options 配置项
  1354. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1355. * @param {Number} options.lineWidth 移动线的宽度
  1356. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1357. * @param {Number} options.outlineWidth 线描边宽度
  1358. */
  1359. _setSpatialLineStyle(options) {
  1360. let _self = this;
  1361. let color = [255, 255, 0, 1.0];
  1362. let lineWidth = 2;
  1363. let outlineColor = [255, 255, 255, 1.0];
  1364. let outlineWidth = 1;
  1365. if (options && options.color && options.color.length === 4) color = options.color;
  1366. if (options && options.outlineColor && options.outlineColor.length === 4) outlineColor = options
  1367. .outlineColor;
  1368. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') outlineWidth =
  1369. options.outlineWidth;
  1370. if (options && options.lineWidth && typeof options.lineWidth === 'number') lineWidth = options
  1371. .lineWidth;
  1372. this._spatialLineMaterial = new Cesium.PolylineOutlineMaterialProperty({
  1373. color: _self._toColorFromArray(color),
  1374. outlineColor: _self._toColorFromArray(outlineColor),
  1375. outlineWidth: outlineWidth,
  1376. });
  1377. /* 设置线宽 */
  1378. this._param.spatialLineWidth = lineWidth;
  1379. }
  1380. /**
  1381. * 设置移动绘制的区域样式
  1382. * @ignore
  1383. * @param {JSON} options 配置项
  1384. * @param {Array<Number>} options.color 移动面颜色[0~255,0~255,0~255,0~1]
  1385. */
  1386. _setMovePolygonStyle(options) {
  1387. let polygonColor = [255, 0, 0, 0.3];
  1388. if (options && options.color && options.color.length === 4) polygonColor = options.color;
  1389. /* 临时面材质 */
  1390. this._tempPolygonMaterial = new Cesium.ColorMaterialProperty(this._toColorFromArray(polygonColor));
  1391. }
  1392. /**
  1393. * 设置区域样式
  1394. * @ignore
  1395. * @param {JSON} options 配置项
  1396. * @param {Array<Number>} options.color 移动面颜色[0~255,0~255,0~255,0~1]
  1397. */
  1398. _setPolygonStyle(options) {
  1399. let polygonColor = [0, 0, 255, 0.3];
  1400. if (options && options.color && options.color.length === 4) polygonColor = options.color;
  1401. /* 临时面材质 */
  1402. this._polygonMaterial = new Cesium.ColorMaterialProperty(this._toColorFromArray(polygonColor));
  1403. }
  1404. /**
  1405. * 设置移动高度线样式
  1406. * @ignore
  1407. * @param {JSON} options 配置项
  1408. * @param {Array<Number>} options.color 移动线颜色[0~255,0~255,0~255,0~1]
  1409. * @param {Number} options.lineWidth 移动线的宽度
  1410. * @param {Boolean} options.outline 是否有边框,有边框则为实线,否则为虚线
  1411. * @param {Array<Number>} options.outlineColor 移动线描边颜色[0~255,0~255,0~255,0~1]
  1412. * @param {Number} options.outlineWidth 移动线描边宽度
  1413. */
  1414. _setMoveAltitudeLineStyle(options) {
  1415. let _self = this;
  1416. let color = [255, 255, 255, 1.0];
  1417. let lineWidth = 2;
  1418. let isOutline = true;
  1419. let outlineColor = [255, 255, 0, 1.0];
  1420. let outlineWidth = 1;
  1421. if (options && options.color && options.color.length === 4) color = options.color;
  1422. if (options && options.outline && typeof options.outline === 'boolean') isOutline = options.outline;
  1423. if (options && options.outlineColor && options.outlineColor.length === 4) outlineColor = options
  1424. .outlineColor;
  1425. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') outlineWidth =
  1426. options.outlineWidth;
  1427. if (options && options.lineWidth && typeof options.lineWidth === 'number') lineWidth = options
  1428. .lineWidth;
  1429. if (isOutline) {
  1430. this._tempAlititudeLineMaterial = new Cesium.PolylineOutlineMaterialProperty({
  1431. color: _self._toColorFromArray(color),
  1432. outlineColor: _self._toColorFromArray(outlineColor),
  1433. outlineWidth: outlineWidth,
  1434. });
  1435. } else {
  1436. this._tempAlititudeLineMaterial = new Cesium.PolylineDashMaterialProperty({
  1437. color: _self._toColorFromArray(color),
  1438. });
  1439. }
  1440. /* 设置移动线宽 */
  1441. this._param.moveAltitudeLineWidth = lineWidth;
  1442. }
  1443. /**
  1444. * 设置高度线样式
  1445. * @ignore
  1446. * @param {JSON} options 配置项
  1447. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1448. * @param {Number} options.lineWidth 移动线的宽度
  1449. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1450. * @param {Number} options.outlineWidth 线描边宽度
  1451. */
  1452. _setAltitudeLineStyle(options) {
  1453. let _self = this;
  1454. let color = [255, 255, 255, 1.0];
  1455. let lineWidth = 2;
  1456. let outlineColor = [0, 0, 255, 1.0];
  1457. let outlineWidth = 1;
  1458. if (options && options.color && options.color.length === 4) color = options.color;
  1459. if (options && options.outlineColor && options.outlineColor.length === 4) outlineColor = options
  1460. .outlineColor;
  1461. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') outlineWidth =
  1462. options.outlineWidth;
  1463. if (options && options.lineWidth && typeof options.lineWidth === 'number') lineWidth = options
  1464. .lineWidth;
  1465. this._altitudeLineMaterial = new Cesium.PolylineOutlineMaterialProperty({
  1466. color: _self._toColorFromArray(color),
  1467. outlineColor: _self._toColorFromArray(outlineColor),
  1468. outlineWidth: outlineWidth,
  1469. });
  1470. /* 设置线宽 */
  1471. this._param.altitudeLineWidth = lineWidth;
  1472. }
  1473. /**
  1474. * 设置移动圆的样式
  1475. * @ignore
  1476. * @param {JSON} options 配置项
  1477. * @param {Array<Number>} options.color 移动圆的颜色[0~255,0~255,0~255,0~1]
  1478. * @param {Boolean} options.outline 是否有边框
  1479. * @param {Array<Number>} options.outlineColor 描边颜色[0~255,0~255,0~255,0~1]
  1480. * @param {Number} options.outlineWidth 描边宽度
  1481. */
  1482. _setMoveEllipseStyle(options) {
  1483. if (options && options.color && options.color.length === 4) this._param.moveEllipseColor = options
  1484. .color;
  1485. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') this._param
  1486. .moveEllipseOutlineWidth = options.outlineWidth;
  1487. if (options && options.outline && typeof options.outline === 'boolean') this._param
  1488. .moveEllipseOutline =
  1489. options.outline;
  1490. if (options && options.outlineColor && options.outlineColor.length === 4) this._param
  1491. .moveEllipseOutlineColor = options.outlineColor;
  1492. }
  1493. /**
  1494. * 设置圆的样式
  1495. * @ignore
  1496. * @param {JSON} options 配置项
  1497. * @param {Array<Number>} options.color 圆的颜色[0~255,0~255,0~255,0~1]
  1498. * @param {Boolean} options.outline 是否有边框
  1499. * @param {Array<Number>} options.outlineColor 描边颜色[0~255,0~255,0~255,0~1]
  1500. * @param {Number} options.outlineWidth 描边宽度
  1501. */
  1502. _setEllipseStyle(options) {
  1503. if (options && options.color && options.color.length === 4) this._param.ellipseColor = options
  1504. .color;
  1505. if (options && options.outlineWidth && typeof options.outlineWidth === 'number') this._param
  1506. .ellipseOutlineWidth = options.outlineWidth;
  1507. if (options && options.outline && typeof options.outline === 'boolean') this._param.ellipseOutline =
  1508. options.outline;
  1509. if (options && options.outlineColor && options.outlineColor.length === 4) this._param
  1510. .ellipseOutlineColor = options.outlineColor;
  1511. }
  1512. /**
  1513. * 清理资源
  1514. * @ignore
  1515. * @param {Boolean} isAll 是否删除已经绘制的全部实体
  1516. */
  1517. _clear(isAll) {
  1518. if (isAll != undefined && isAll === true) {
  1519. this._removeEntityByName(this._sketchEntityName);
  1520. this._removePointEntitys();
  1521. }
  1522. /* 重置数组变量 */
  1523. this._sketchTempPoints = [];
  1524. this._sketchPoints = [];
  1525. this._sketchOutputPoints = [];
  1526. /* 重置绘制线变量 */
  1527. this._sketchTempPolyline = undefined;
  1528. this._sketchPolyline = undefined;
  1529. /* 重置绘制面变量 */
  1530. this._sketchTempPolygon = undefined;
  1531. this._sketchPolygon = undefined;
  1532. /* 重置高度线变量 */
  1533. this._sketchTempAltituePolyline = undefined;
  1534. this._sketchAltitudePolyline = undefined;
  1535. /* 重置空间线变量 */
  1536. this._sketchTempSpatialPolyline = undefined;
  1537. this._sketchSpatialPolyline = undefined;
  1538. /* 重置圆变量 */
  1539. this._sketchTempCircle = undefined;
  1540. this._sketchCircle = undefined;
  1541. /* 重置矩形变量 */
  1542. this._sketchTempRectangle = undefined;
  1543. this._sketchRectangle = undefined;
  1544. /* 重置三角形 */
  1545. this._sketchTempTriangleAltitudePolyline = undefined;
  1546. this._sketchTriangleAltituePolyline = undefined;
  1547. /* 重置空间三角形 */
  1548. this._sketchTempSpatialTriangle = undefined;
  1549. this._sketchSpatialTriangle = undefined;
  1550. }
  1551. /**
  1552. * 检测程序运行环境
  1553. * @ignore
  1554. * @return {SketchViewModel.RuntimeEnvironment}
  1555. */
  1556. _checkAppOrWeb() {
  1557. if (window.navigator.userAgent.match(
  1558. /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
  1559. )) {
  1560. return SketchViewModel.RuntimeEnvironment.App;
  1561. } else {
  1562. return SketchViewModel.RuntimeEnvironment.Web;
  1563. }
  1564. }
  1565. /**
  1566. * 是否是运行于App
  1567. * @ignore
  1568. */
  1569. _isRuntimeApp() {
  1570. if (this._checkAppOrWeb() === SketchViewModel.RuntimeEnvironment.App) {
  1571. return true;
  1572. }
  1573. return false;
  1574. }
  1575. }
  1576. /**
  1577. * 设置方法
  1578. */
  1579. Object.assign(SketchViewModel.prototype, {
  1580. /**
  1581. * 设置移动线样式
  1582. * @ignore
  1583. * @param {JSON} options 配置项
  1584. * @param {Array<Number>} options.color 移动线颜色[0~255,0~255,0~255,0~1]
  1585. * @param {Number} options.lineWidth 移动线的宽度
  1586. * @param {Boolean} options.outline 是否有边框,有边框则为实线,否则为虚线
  1587. * @param {Array<Number>} options.outlineColor 移动线描边颜色[0~255,0~255,0~255,0~1]
  1588. * @param {Number} options.outlineWidth 移动线描边宽度
  1589. * @param {Number} options.power 亮度[0~1],如果需要使用虚线,请将该值设置为undefined
  1590. */
  1591. setMoveLineStyle: function(options) {
  1592. this._setMoveLineStyle(options);
  1593. },
  1594. /**
  1595. * 设置线样式
  1596. * @ignore
  1597. * @param {JSON} options 配置项
  1598. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1599. * @param {Number} options.lineWidth 移动线的宽度
  1600. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1601. * @param {Number} options.outlineWidth 线描边宽度
  1602. */
  1603. setLineStyle: function(options) {
  1604. this._setLineStyle(options);
  1605. },
  1606. /**
  1607. * 设置空间线样式
  1608. * @ignore
  1609. * @param {JSON} options 配置项
  1610. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1611. * @param {Number} options.lineWidth 移动线的宽度
  1612. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1613. * @param {Number} options.outlineWidth 线描边宽度
  1614. */
  1615. setSpatialLineStyle: function() {
  1616. this._setSpatialLineStyle(options);
  1617. },
  1618. /**
  1619. * 设置移动绘制的区域样式
  1620. * @ignore
  1621. * @param {JSON} options 配置项
  1622. * @param {Array<Number>} options.color 移动面颜色[0~255,0~255,0~255,0~1]
  1623. */
  1624. setMovePolygonStyle: function(options) {
  1625. this._setMovePolygonStyle(options);
  1626. },
  1627. /**
  1628. * 设置区域样式
  1629. * @ignore
  1630. * @param {JSON} options 配置项
  1631. * @param {Array<Number>} options.color 移动面颜色[0~255,0~255,0~255,0~1]
  1632. */
  1633. setPolygonStyle: function(options) {
  1634. this._setPolygonStyle(options)
  1635. },
  1636. /**
  1637. * 设置移动高度线样式
  1638. * @ignore
  1639. * @param {JSON} options 配置项
  1640. * @param {Array<Number>} options.color 移动线颜色[0~255,0~255,0~255,0~1]
  1641. * @param {Number} options.lineWidth 移动线的宽度
  1642. * @param {Boolean} options.outline 是否有边框,有边框则为实线,否则为虚线
  1643. * @param {Array<Number>} options.outlineColor 移动线描边颜色[0~255,0~255,0~255,0~1]
  1644. * @param {Number} options.outlineWidth 移动线描边宽度
  1645. */
  1646. setMoveAltitudeLineStyle: function(options) {
  1647. this._setMoveAltitudeLineStyle(options);
  1648. },
  1649. /**
  1650. * 设置高度线样式
  1651. * @ignore
  1652. * @param {JSON} options 配置项
  1653. * @param {Array<Number>} options.color 线颜色[0~255,0~255,0~255,0~1]
  1654. * @param {Number} options.lineWidth 移动线的宽度
  1655. * @param {Array<Number>} options.outlineColor 线描边颜色[0~255,0~255,0~255,0~1]
  1656. * @param {Number} options.outlineWidth 线描边宽度
  1657. */
  1658. setAltitudeLineStyle: function(options) {
  1659. this._setAltitudeLineStyle(options);
  1660. },
  1661. /**
  1662. * 设置移动圆的样式
  1663. * @ignore
  1664. * @param {JSON} options 配置项
  1665. * @param {Array<Number>} options.color 移动圆的颜色[0~255,0~255,0~255,0~1]
  1666. * @param {Boolean} options.outline 是否有边框
  1667. * @param {Array<Number>} options.outlineColor 描边颜色[0~255,0~255,0~255,0~1]
  1668. * @param {Number} options.outlineWidth 描边宽度
  1669. */
  1670. setMoveEllipseStyle: function(options) {
  1671. this._setMoveEllipseStyle(options);
  1672. },
  1673. /**
  1674. * 设置圆的样式
  1675. * @ignore
  1676. * @param {JSON} options 配置项
  1677. * @param {Array<Number>} options.color 圆的颜色[0~255,0~255,0~255,0~1]
  1678. * @param {Boolean} options.outline 是否有边框
  1679. * @param {Array<Number>} options.outlineColor 描边颜色[0~255,0~255,0~255,0~1]
  1680. * @param {Number} options.outlineWidth 描边宽度
  1681. */
  1682. setEllipseStyle: function(options) {
  1683. this._setEllipseStyle(options);
  1684. },
  1685. /**
  1686. * 设置点击点显示的标记
  1687. * @ignore
  1688. * @param {JSNO} options 配置项
  1689. * @param {String} options.lineLabel 线点文字标注
  1690. * @param {String} options.polygonLabel 面点文字标注
  1691. */
  1692. setLabel: function(options) {
  1693. if (!options) {
  1694. options = {
  1695. lineLabel: undefined,
  1696. polygonLabel: undefined,
  1697. }
  1698. }
  1699. if (options.lineLabel) this._lineLabel = options.lineLabel;
  1700. if (options.polygonLabel) this._lineLabel = options.polygonLabel;
  1701. }
  1702. })
  1703. /**
  1704. * 事件相关
  1705. */
  1706. Object.assign(SketchViewModel.prototype, {
  1707. /**
  1708. * 注册鼠标左键点击事件
  1709. * @ignore
  1710. * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
  1711. * @param {Function} callChange 回调callChange(event)
  1712. */
  1713. _registerLeftClickEvent: function(handler, callChange) {
  1714. let _self = this;
  1715. if (!handler) return;
  1716. handler.setInputAction(function(event) {
  1717. /* 锁定点击事件 以免和移动事件冲突 */
  1718. _self._lock = true;
  1719. if (_self._timer != null) clearTimeout(_self._timer);
  1720. _self._timer = setTimeout(function() {
  1721. if (callChange) callChange(event);
  1722. /* 解除锁定 */
  1723. _self._lock = false;
  1724. }, 200);
  1725. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  1726. },
  1727. /**
  1728. * 注册鼠标左键双击事件
  1729. * @ignore
  1730. * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
  1731. * @param {Function} callChange 回调callChange(event)
  1732. */
  1733. _registerLeftDoubleClickEvent: function(handler, callChange) {
  1734. let _self = this;
  1735. if (!handler) return;
  1736. handler.setInputAction(function(event) {
  1737. if (_self._timer != null) clearTimeout(_self._timer);
  1738. /* 解除锁定 */
  1739. _self._lock = false;
  1740. if (callChange) callChange(event);
  1741. }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
  1742. },
  1743. /**
  1744. * 注册鼠标移动事件
  1745. * @ignore
  1746. * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
  1747. * @param {Function} callChange 回调callChange(event)
  1748. */
  1749. _registerMouseMoveEvent: function(handler, callChange) {
  1750. let _self = this;
  1751. if (!handler) return;
  1752. handler.setInputAction(function(event) {
  1753. if (_self._lock === undefined || _self._lock === false) {
  1754. if (callChange) callChange(event);
  1755. }
  1756. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  1757. },
  1758. /**
  1759. * 注册鼠标右键点击事件
  1760. * @ignore
  1761. * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
  1762. * @param {Function} callChange 回调callChange(event)
  1763. */
  1764. _registerRightClickEvent: function(handler, callChange) {
  1765. if (!handler) return;
  1766. handler.setInputAction(function(event) {
  1767. if (callChange) callChange(event);
  1768. }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  1769. },
  1770. /**
  1771. * 清除事件
  1772. * @ignore
  1773. * @param {Cesium.ScreenSpaceEventHandler} handler
  1774. */
  1775. _clearEvent: function(handler) {
  1776. if (!handler) return;
  1777. /* 干掉事件句柄 释放资源 */
  1778. handler.destroy();
  1779. handler = null;
  1780. },
  1781. })
  1782. /**
  1783. * 对外方法-绘制
  1784. */
  1785. Object.assign(SketchViewModel.prototype, /** @lends SketchViewModel.prototype */ {
  1786. /**
  1787. * 绘制点工具
  1788. * @ignore
  1789. * @param {Object} handler 事件句柄
  1790. * @param {JSON} options 配置项
  1791. * @param {Function} [options.onComplete(cPoint, gPoint)] 完成回调 可选
  1792. * @param {Function} [options.onError(message)] 错误回到 可选
  1793. */
  1794. _sketchDrawPoint(handler, options) {
  1795. let _self = this;
  1796. /* 注册鼠标左键点击事件 */
  1797. this._registerLeftClickEvent(handler, function(event) {
  1798. /* 识别屏幕位置 */
  1799. let loc = _self._transfromFromScreenPoint(event.position);
  1800. if (!Cesium.defined(loc.sLocation)) return;
  1801. /* 绘制点 */
  1802. if (_self._isDrawPoint) {
  1803. _self._createPoint(loc.sLocation, _self._lineLabel);
  1804. }
  1805. /* 干掉事件句柄 释放资源 */
  1806. _self._clearEvent(handler);
  1807. /* 监听输出 */
  1808. if (options.onComplete) options.onComplete(loc.sLocation, loc.gLocation);
  1809. })
  1810. },
  1811. /**
  1812. * @ignore
  1813. * @param {Object} handler 事件句柄
  1814. * @param {JSON} options 配置项
  1815. * @param {Function} [options.onAdded(cPoinit,gPoint)] 添加回调 可选
  1816. * @param {Function} [options.onUndo()] 撤销回调 可选
  1817. * @param {Function} [options.onComplete(cPoints,gPoints)] 完成回调 可选
  1818. * @param {Function} [options.onError(message)] 错误回调 可选
  1819. */
  1820. _sketchDrawMultiplePoint(handler, options) {
  1821. let _self = this;
  1822. /* 注册鼠标左键点击事件 */
  1823. this._registerLeftClickEvent(handler, function(event) {
  1824. /* 识别屏幕位置 */
  1825. let loc = _self._transfromFromScreenPoint(event.position);
  1826. if (!Cesium.defined(loc.sLocation)) return;
  1827. /* 绘制点 */
  1828. if (_self._isDrawPoint) {
  1829. _self._createPoint(loc.sLocation, _self._lineLabel);
  1830. }
  1831. _self._sketchPoints.push(loc.sLocation);
  1832. _self._sketchOutputPoints.push(loc.gLocation);
  1833. /* 监听输出 */
  1834. if (options.onAdded) options.onAdded(loc.sLocation, loc.gLocation);
  1835. })
  1836. /* 注册鼠标右键事件 */
  1837. this._registerRightClickEvent(handler, function(event) {
  1838. if (_self._sketchPoints.length > 0) {
  1839. _self._sketchPoints.pop();
  1840. _self._sketchOutputPoints.pop();
  1841. if (options.onUndo) options.onUndo();
  1842. }
  1843. })
  1844. /* 注册鼠标左键双击事件 */
  1845. this._registerLeftDoubleClickEvent(handler, function(event) {
  1846. /* 干掉事件句柄 释放资源 */
  1847. _self._clearEvent();
  1848. /* 回调 */
  1849. if (options.onComplete) options.onComplete(_self._sketchPoints, _self._sketchOutputPoints);
  1850. })
  1851. },
  1852. /**
  1853. * 绘制线工具
  1854. * @ignore
  1855. * @param {Object} handler 事件句柄
  1856. * @param {JSON} options 配置项
  1857. * @param {Function} [options.onAdded(cPoints,gPoints)] 添加回调 可选
  1858. * @param {Function} [options.onMoving(cPoint)] 移动回调 可选
  1859. * @param {Function} [options.onUndo()] 撤销回调 可选
  1860. * @param {Function} [options.onComplete(cPoints,gPoints)] 完成回调 可选
  1861. * @param {Function} [options.onError(message)] 错误回调 可选
  1862. */
  1863. _sketchDrawPolyline(handler, options) {
  1864. let _self = this;
  1865. /* 注册鼠标左键点击事件 */
  1866. this._registerLeftClickEvent(handler, function(event) {
  1867. /* 识别屏幕位置 */
  1868. let loc = _self._transfromFromScreenPoint(event.position);
  1869. if (!Cesium.defined(loc.sLocation)) return;
  1870. /* 绘制点 */
  1871. if (_self._isDrawPoint) {
  1872. _self._createPoint(loc.sLocation, _self._lineLabel);
  1873. }
  1874. /* 第一点击的时候绘制线 */
  1875. if (_self._sketchTempPoints.length === 0) {
  1876. _self._createTempPolyline();
  1877. _self._sketchTempPoints.push(loc.sLocation.clone());
  1878. }
  1879. _self._sketchTempPoints.push(loc.sLocation);
  1880. /* 存储正式绘制点集合 */
  1881. _self._sketchPoints.push(loc.sLocation.clone());
  1882. /* 存储输出经纬度点集合 */
  1883. _self._sketchOutputPoints.push(loc.gLocation);
  1884. /* 监听输出 */
  1885. if (options.onAdded) options.onAdded(_self._sketchPoints, _self._sketchOutputPoints);
  1886. })
  1887. /* 注册鼠标移动事件 */
  1888. this._registerMouseMoveEvent(handler, function(event) {
  1889. /* 如果运行环境是App 则禁止使用移动事件 */
  1890. if (_self._isRuntimeApp()) return;
  1891. /* 识别屏幕位置 */
  1892. let loc = _self._transfromFromScreenPoint(event.endPosition);
  1893. if (!Cesium.defined(loc.sLocation)) return;
  1894. if (Cesium.defined(_self._sketchTempPolyline)) {
  1895. _self._sketchTempPoints.pop();
  1896. _self._sketchTempPoints.push(loc.sLocation);
  1897. /* 监听输出 */
  1898. if (options.onMoving) options.onMoving(loc.sLocation);
  1899. }
  1900. });
  1901. /* 注册鼠标右键点击事件 */
  1902. this._registerRightClickEvent(handler, function(event) {
  1903. if (_self._sketchTempPoints.length > 2) {
  1904. /* 移除正式点最有一个元素 */
  1905. _self._sketchPoints.pop();
  1906. /* 移除临时点倒数第二个元素 */
  1907. _self._sketchTempPoints.splice(_self._sketchTempPoints.length - 2, 1);
  1908. /* 如果绘制了点 则删除最后一个 */
  1909. if (_self._isDrawPoint) {
  1910. let lastPointEntity = _self._pointEntitys[_self._pointEntitys.length - 1];
  1911. _self._entities.remove(lastPointEntity);
  1912. /* 移除点实体数据中的最后一条数据 */
  1913. _self._pointEntitys.pop();
  1914. }
  1915. if (options.onUndo) options.onUndo();
  1916. }
  1917. });
  1918. /* 注册鼠标左键双击事件 */
  1919. this._registerLeftDoubleClickEvent(handler, function(event) {
  1920. /* 如果运行环境是App 则禁止使用双击结束事件 */
  1921. if (_self._isRuntimeApp()) return;
  1922. if (_self._sketchPoints.length < 2) {
  1923. if (options.onError) options.onError('点数少于两个,禁止结束绘制!');
  1924. return;
  1925. }
  1926. /* 删除临时线 */
  1927. _self._removeEntityByObject(_self._sketchTempPolyline);
  1928. /* 绘制正式线 */
  1929. _self._createPolyline();
  1930. /* 删除标记点 */
  1931. if (!_self._isRetainDrawPoint) _self._removePointEntitys();
  1932. /* 干掉事件句柄 释放资源*/
  1933. _self._clearEvent(handler);
  1934. /* 监听输出 */
  1935. if (options.onComplete) options.onComplete(_self._sketchPoints, _self._sketchOutputPoints);
  1936. })
  1937. },
  1938. /**
  1939. * 绘制空间线工具
  1940. * @ignore
  1941. * @param {Object} handler 事件句柄
  1942. * @param {JSON} options 配置项
  1943. * @param {Function} [options.onAdded(cPoints,gPoints)] 添加回调 可选
  1944. * @param {Function} [options.onMoving(cPoint)] 移动回调 可选
  1945. * @param {Function} [options.onUndo()] 撤销回调 可选
  1946. * @param {Function} [options.onComplete(cPoints,gPoints)] 完成回调 可选
  1947. * @param {Function} [options.onError(message)] 错误回到 可选
  1948. */
  1949. _sketchDrawSpatialPolyline(handler, options) {
  1950. let _self = this;
  1951. /* 注册鼠标左键单击事件 */
  1952. this._registerLeftClickEvent(handler, function(event) {
  1953. /* 识别屏幕位置 */
  1954. let loc = _self._transfromFromScreenPoint(event.position);
  1955. if (!Cesium.defined(loc.sLocation)) return;
  1956. /* 绘制点 */
  1957. if (_self._isDrawPoint) {
  1958. _self._createPoint(loc.sLocation, _self._lineLabel);
  1959. }
  1960. /* 第一点击的时候绘制线 */
  1961. if (_self._sketchTempPoints.length === 0) {
  1962. _self._createTempSpatialPolyline();
  1963. _self._sketchTempPoints.push(loc.sLocation.clone());
  1964. }
  1965. _self._sketchTempPoints.push(loc.sLocation);
  1966. /* 存储正式绘制点集合 */
  1967. _self._sketchPoints.push(loc.sLocation.clone());
  1968. /* 存储输出经纬度点集合 */
  1969. _self._sketchOutputPoints.push(loc.gLocation);
  1970. /* 监听输出 */
  1971. if (options.onAdded) options.onAdded(_self._sketchPoints, _self._sketchOutputPoints);
  1972. })
  1973. /* 注册鼠标移动事件 */
  1974. this._registerMouseMoveEvent(handler, function(event) {
  1975. /* 如果运行环境是App 则禁止使用移动事件 */
  1976. if (_self._isRuntimeApp()) return;
  1977. /* 识别屏幕位置 */
  1978. let loc = _self._transfromFromScreenPoint(event.endPosition);
  1979. if (!Cesium.defined(loc.sLocation)) return;
  1980. if (Cesium.defined(_self._sketchTempSpatialPolyline)) {
  1981. _self._sketchTempPoints.pop();
  1982. _self._sketchTempPoints.push(loc.sLocation);
  1983. /* 监听输出 */
  1984. if (options.onMoving) options.onMoving(loc.sLocation);
  1985. }
  1986. })
  1987. /* 注册鼠标左键双击事件 */
  1988. this._registerLeftDoubleClickEvent(handler, function(event) {
  1989. /* 如果运行环境是App 则禁止使用双击结束事件 */
  1990. if (_self._isRuntimeApp()) return;
  1991. if (_self._sketchPoints.length < 2) {
  1992. if (options.onError) options.onError('绘制点少于2个,禁止结束绘制!');
  1993. return;
  1994. }
  1995. /* 删除临时空间线 */
  1996. _self._removeEntityByObject(_self._sketchTempSpatialPolyline);
  1997. /* 绘制正式空间线 */
  1998. _self._createSpatialPolyline();
  1999. /* 删除标记点 */
  2000. _self._removePointEntitys();
  2001. /* 干掉事件句柄 释放资源*/
  2002. _self._clearEvent(handler);
  2003. /* 监听输出 */
  2004. if (options.onComplete) options.onComplete(_self._sketchPoints, _self
  2005. ._sketchOutputPoints);
  2006. })
  2007. /* 注册鼠标右键单击事件 */
  2008. this._registerRightClickEvent(handler, function(event) {
  2009. if (_self._sketchTempPoints.length > 2) {
  2010. /* 移除正式点最有一个元素 */
  2011. _self._sketchPoints.pop();
  2012. /* 移除临时点倒数第二个元素 */
  2013. _self._sketchTempPoints.splice(_self._sketchTempPoints.length - 2, 1);
  2014. if (options.onUndo) options.onUndo();
  2015. }
  2016. });
  2017. },
  2018. /**
  2019. * 绘制面工具
  2020. * @ignore
  2021. * @param {Object} handler 事件句柄
  2022. * @param {JSON} options 配置项
  2023. * @param {Function} [options.onAdded(cPoints,gPoints)] 添加回调 可选
  2024. * @param {Function} [options.onMoving(cPoint)] 移动回调 可选
  2025. * @param {Function} [options.onUndo()] 撤销回调 可选
  2026. * @param {Function} [options.onComplete(cPoints,gPoints)] 完成回调 可选
  2027. * @param {Function} [options.onError(message)] 错误回到 可选
  2028. */
  2029. _sketchDrawPolygon(handler, options) {
  2030. let _self = this;
  2031. /* 注册鼠标左键点击事件 */
  2032. this._registerLeftClickEvent(handler, function(event) {
  2033. /* 识别屏幕位置 */
  2034. let loc = _self._transfromFromScreenPoint(event.position);
  2035. if (!Cesium.defined(loc.sLocation)) return;
  2036. /* 绘制点 */
  2037. if (_self._isDrawPoint) {
  2038. _self._createPoint(loc.sLocation, _self._lineLabel);
  2039. }
  2040. /* 当点数为0时绘制线和面 */
  2041. if (_self._sketchTempPoints.length === 0) {
  2042. _self._createTempPolygon();
  2043. _self._createTempPolyline();
  2044. _self._sketchTempPoints.push(loc.sLocation.clone());
  2045. }
  2046. _self._sketchTempPoints.push(loc.sLocation);
  2047. /* 存储正式绘制点集合 */
  2048. _self._sketchPoints.push(loc.sLocation.clone());
  2049. /* 存储输出经纬度点集合 */
  2050. _self._sketchOutputPoints.push(loc.gLocation);
  2051. /* 监听输出 */
  2052. if (options.onAdded) options.onAdded(_self._sketchPoints, _self._sketchOutputPoints);
  2053. });
  2054. /* 注册鼠标移动事件 */
  2055. this._registerMouseMoveEvent(handler, function(event) {
  2056. /* 如果运行环境是App 则禁止使用移动事件 */
  2057. if (_self._isRuntimeApp()) return;
  2058. /* 识别屏幕位置 */
  2059. let loc = _self._transfromFromScreenPoint(event.endPosition);
  2060. if (!Cesium.defined(loc.sLocation)) return;
  2061. if (Cesium.defined(_self._sketchTempPolygon)) {
  2062. _self._sketchTempPoints.pop();
  2063. _self._sketchTempPoints.push(loc.sLocation);
  2064. /* 监听输出 */
  2065. if (options.onMoving) options.onMoving(loc.sLocation);
  2066. }
  2067. });
  2068. /* 注册鼠标右键单击事件 */
  2069. this._registerRightClickEvent(handler, function(event) {
  2070. if (_self._sketchTempPoints.length > 2) {
  2071. /* 移除正式点最有一个元素 */
  2072. _self._sketchPoints.pop();
  2073. /* 移除临时点倒数第二个元素 */
  2074. _self._sketchTempPoints.splice(_self._sketchTempPoints.length - 2, 1);
  2075. /* 如果绘制了点 则删除最后一个 */
  2076. if (_self._isDrawPoint) {
  2077. let lastPointEntity = _self._pointEntitys[_self._pointEntitys.length - 1];
  2078. _self._entities.remove(lastPointEntity);
  2079. /* 移除点实体数据中的最后一条数据 */
  2080. _self._pointEntitys.pop();
  2081. }
  2082. if (options.onUndo) options.onUndo();
  2083. }
  2084. });
  2085. /* 注册鼠标左键双击事件 */
  2086. this._registerLeftDoubleClickEvent(handler, function(event) {
  2087. /* 如果运行环境是App 则禁止使用双击结束事件 */
  2088. if (_self._isRuntimeApp()) return;
  2089. if (_self._sketchPoints.length < 3) {
  2090. if (options.onError) options.onError('点数少于3个,禁止结束绘制!');
  2091. return;
  2092. }
  2093. /* 删除临时线和面 */
  2094. _self._removeEntityByObject(_self._sketchTempPolygon);
  2095. _self._removeEntityByObject(_self._sketchTempPolyline);
  2096. /* 绘制正式面 */
  2097. _self._createPolygon();
  2098. /* 删除标记点 */
  2099. if (!_self._isRetainDrawPoint) _self._removePointEntitys();
  2100. /* 干掉事件句柄 释放资源*/
  2101. _self._clearEvent(handler);
  2102. /* 监听输出 */
  2103. if (options.onComplete) options.onComplete(_self._sketchPoints, _self
  2104. ._sketchOutputPoints);
  2105. })
  2106. },
  2107. /**
  2108. * 绘制圆
  2109. * @ignore
  2110. * @param {Object} handler 事件句柄
  2111. * @param {JSON} options 配置项
  2112. * @param {Function} [options.onAdded(center)] 添加回调 可选
  2113. * @param {Function} [options.onComplete(center,radius)] 完成回调 可选
  2114. * @param {Function} [options.onError(message)] 错误回到 可选
  2115. */
  2116. _sketchDrawCircle: function(handler, options) {
  2117. let _self = this;
  2118. /* 注册鼠标左键单击事件 */
  2119. this._registerLeftClickEvent(handler, function(event) {
  2120. /* 识别屏幕位置 */
  2121. let loc = _self._transfromFromScreenPoint(event.position);
  2122. if (!Cesium.defined(loc.sLocation)) return;
  2123. if (_self._sketchTempPoints.length === 0) {
  2124. /* 绘制点 */
  2125. if (_self._isDrawPoint) {
  2126. _self._createPoint(loc.sLocation, '起点');
  2127. }
  2128. /* 添加数据 */
  2129. _self._sketchTempPoints.push(loc.sLocation.clone());
  2130. _self._sketchTempPoints.push(loc.sLocation); //凑数的
  2131. /* 存储正式绘制点集合 */
  2132. _self._sketchPoints.push(loc.sLocation.clone());
  2133. /* 存储经纬度 */
  2134. _self._sketchOutputPoints.push(loc.gLocation);
  2135. /* 创建圆 */
  2136. _self._createTempCircle(loc.sLocation);
  2137. /* 监听输出 */
  2138. if (options.onAdded) options.onAdded(loc.sLocation);
  2139. } else {
  2140. if (_self._isRuntimeApp()) {
  2141. _self._sketchTempPoints.pop();
  2142. _self._sketchTempPoints.push(loc.sLocation);
  2143. let positionCenter = _self._sketchEllipseCenterPosition;
  2144. let positionRotate = _self._sketchTempPoints[1];
  2145. _self._ellipseOutlineCoordinates = [];
  2146. for (let angle = 5; angle < 360;) {
  2147. let newPosition = _self._rotatedPointByAngle(positionRotate, positionCenter, angle);
  2148. _self._ellipseOutlineCoordinates.push(newPosition);
  2149. angle = angle + 5;
  2150. }
  2151. _self._ellipseOutlineCoordinates.push(_self._ellipseOutlineCoordinates[0]);
  2152. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  2153. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  2154. /* 计算距离 */
  2155. let geodesic = new Cesium.EllipsoidGeodesic();
  2156. geodesic.setEndPoints(point1cartographic, point2cartographic);
  2157. _self._sketchEllipseRadius = geodesic.surfaceDistance;
  2158. if (_self._sketchEllipseRadius <= 0) _self._sketchEllipseRadius = 1;
  2159. }
  2160. /* 删除标记点 */
  2161. _self._removePointEntitys();
  2162. /* 删除临时圆 */
  2163. _self._removeEntityByObject(_self._sketchTempCircle);
  2164. /* 创建正式圆 */
  2165. _self._createCircle();
  2166. /* 干掉事件句柄 释放资源*/
  2167. _self._clearEvent(handler);
  2168. /* 回调返回 */
  2169. if (options.onComplete) options.onComplete(_self._sketchOutputPoints[0], _self._sketchEllipseRadius);
  2170. }
  2171. });
  2172. /* 注册鼠标移动事件 */
  2173. this._registerMouseMoveEvent(handler, function(event) {
  2174. /* 如果运行环境是App 则禁止使用移动事件 */
  2175. if (_self._isRuntimeApp()) return;
  2176. /* 如果还未创建圆 则直接返回 */
  2177. if (!Cesium.defined(_self._sketchTempCircle)) return;
  2178. /* 获取空间位置 */
  2179. var cartesian = _self._viewer.scene.pickPosition(event.endPosition);
  2180. /* 如果获取点失败 则直接返回 */
  2181. if (cartesian == undefined) return;
  2182. _self._sketchTempPoints.pop();
  2183. _self._sketchTempPoints.push(cartesian);
  2184. })
  2185. },
  2186. /**
  2187. * 绘制高度线
  2188. * @ignore
  2189. * @param {Object} handler 事件句柄
  2190. * @param {JSON} options 配置项
  2191. * @param {Function} [options.onAdded(cPoint)] 添加回调 可选
  2192. * @param {Function} [options.onMoving(cPoints,centerPoint)] 移动回调 可选
  2193. * @param {Function} [options.onComplete(cPoints,centerPoint)] 完成回调 可选
  2194. * @param {Function} [options.onError(message)] 错误回到 可选
  2195. */
  2196. _sketchDrawHeightPolyline: function(handler, options) {
  2197. let _self = this;
  2198. /* 注册鼠标左键单击事件 */
  2199. this._registerLeftClickEvent(handler, function(event) {
  2200. /* 识别屏幕位置 */
  2201. let loc = _self._transfromFromScreenPoint(event.position);
  2202. if (!Cesium.defined(loc.sLocation)) return;
  2203. if (_self._sketchTempPoints.length === 0) {
  2204. /* 绘制点 */
  2205. if (_self._isDrawPoint) {
  2206. _self._createPoint(loc.sLocation, '起点');
  2207. }
  2208. /* 赋值初始高度 */
  2209. _self._sketchAltitudeInitHeight = loc.gLocation.height;
  2210. /* 添加数据 */
  2211. _self._sketchTempPoints.push(loc.sLocation.clone());
  2212. _self._sketchTempPoints.push(loc.sLocation); //凑数的
  2213. /* 存储正式绘制点集合 */
  2214. _self._sketchPoints.push(loc.sLocation.clone());
  2215. /* 监听输出 */
  2216. if (options.onAdded) options.onAdded(loc.sLocation);
  2217. } else {
  2218. if (_self._isRuntimeApp()) {
  2219. _self._sketchTempPoints.pop();
  2220. _self._sketchTempPoints.push(loc.sLocation);
  2221. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  2222. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  2223. _self._sketchEllipseCenterPosition = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  2224. _self._sketchAltitudePolylinePostions = [];
  2225. _self._sketchAltitudePolylinePostions.push(_self._sketchTempPoints[0]);
  2226. let point_temp = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  2227. _self._sketchAltitudePolylinePostions.push(point_temp);
  2228. /* 计算距离 */
  2229. let geodesic = new Cesium.EllipsoidGeodesic();
  2230. geodesic.setEndPoints(point1cartographic, point2cartographic);
  2231. _self._sketchEllipseRadius = geodesic.surfaceDistance;
  2232. if (_self._sketchEllipseRadius <= 0) _self._sketchEllipseRadius = 1;
  2233. let height_temp = point2cartographic.height - point1cartographic.height;
  2234. _self._sketchEllipseHeight = height_temp + _self._sketchAltitudeInitHeight;
  2235. }
  2236. /* 删除标记点 */
  2237. _self._removePointEntitys();
  2238. /* 删除临时高度线 */
  2239. _self._removeEntityByObject(_self._sketchTempAltituePolyline);
  2240. /* 创建正式高度线 */
  2241. _self._createAltitudePolyline();
  2242. /* 干掉事件句柄 释放资源*/
  2243. _self._clearEvent(handler);
  2244. /* 回调返回 */
  2245. if (options.onComplete) {
  2246. options.onComplete(_self._sketchAltitudePolylinePostions, _self
  2247. ._sketchEllipseCenterPosition);
  2248. }
  2249. }
  2250. })
  2251. /* 注册鼠标移动事件 */
  2252. this._registerMouseMoveEvent(handler, function(event) {
  2253. /* 如果运行环境是App 则禁止使用移动事件 */
  2254. if (_self._isRuntimeApp()) return;
  2255. /* 如果还没设置起点 则直接返回 */
  2256. if (_self._sketchTempPoints == undefined || _self._sketchTempPoints.length == 0)
  2257. return;
  2258. /* 获取空间位置 */
  2259. var cartesian = _self._viewer.scene.pickPosition(event.endPosition);
  2260. /* 如果获取点失败 则直接返回 */
  2261. if (cartesian == undefined) return;
  2262. if (_self._sketchTempPoints.length >= 2) {
  2263. if (!Cesium.defined(_self._sketchTempAltituePolyline)) {
  2264. /* 添加线 */
  2265. _self._createTempAltitudePolyline();
  2266. } else {
  2267. _self._sketchTempPoints.pop();
  2268. _self._sketchTempPoints.push(cartesian);
  2269. }
  2270. /* 回调返回 */
  2271. if (options.onMoving) {
  2272. options.onMoving(_self._sketchAltitudePolylinePostions, _self
  2273. ._sketchEllipseCenterPosition);
  2274. }
  2275. }
  2276. })
  2277. },
  2278. /**
  2279. * 绘制矩形
  2280. * @ignore
  2281. * @param {Object} handler 事件句柄
  2282. * @param {JSON} options 配置项
  2283. * @param {Function} [options.onAdded(cPoint)] 添加回调 可选
  2284. * @param {Function} [options.onComplete(points)] 完成回调 可选
  2285. */
  2286. _sketchDrawRectangle: function(handler, options) {
  2287. let _self = this;
  2288. /* 注册鼠标左键单击事件 */
  2289. this._registerLeftClickEvent(handler, function(event) {
  2290. /* 识别屏幕位置 */
  2291. let loc = _self._transfromFromScreenPoint(event.position);
  2292. if (!Cesium.defined(loc.sLocation)) return;
  2293. if (_self._sketchTempPoints.length === 0) {
  2294. /* 绘制点 */
  2295. if (_self._isDrawPoint) {
  2296. _self._createPoint(loc.sLocation, '起点');
  2297. }
  2298. /* 添加数据 */
  2299. _self._sketchTempPoints.push(loc.gLocation);
  2300. _self._sketchTempPoints.push(loc.gLocation); //凑数的
  2301. /* 存储正式绘制点集合 */
  2302. _self._sketchPoints.push(loc.gLocation);
  2303. /* 创建矩形 */
  2304. _self._createTempRectangle();
  2305. /* 回调 */
  2306. if (options.onAdded) options.onAdded(loc.sLocation);
  2307. } else {
  2308. if (_self._isRuntimeApp()) {
  2309. _self._sketchTempPoints.pop();
  2310. _self._sketchTempPoints.push(loc.gLocation);
  2311. let lng0 = parseFloat(_self._sketchTempPoints[0].lng);
  2312. let lat0 = parseFloat(_self._sketchTempPoints[0].lat);
  2313. let lng1 = parseFloat(_self._sketchTempPoints[1].lng);
  2314. let lat1 = parseFloat(_self._sketchTempPoints[1].lat);
  2315. _self._rectangleCoordinates = [0, 0, 1, 1];
  2316. if (lng0 < lng1) {
  2317. _self._rectangleCoordinates[0] = lng0;
  2318. _self._rectangleCoordinates[2] = lng1;
  2319. } else {
  2320. _self._rectangleCoordinates[0] = lng1;
  2321. _self._rectangleCoordinates[2] = lng0;
  2322. }
  2323. if (lat0 < lat1) {
  2324. _self._rectangleCoordinates[1] = lat0;
  2325. _self._rectangleCoordinates[3] = lat1;
  2326. } else {
  2327. _self._rectangleCoordinates[1] = lat1;
  2328. _self._rectangleCoordinates[3] = lat0;
  2329. }
  2330. let rectangle = Cesium.Rectangle.fromDegrees(_self._rectangleCoordinates[0], _self._rectangleCoordinates[1], _self._rectangleCoordinates[2], _self._rectangleCoordinates[3]);
  2331. /* 计算并返回矩形的边界线坐标数组 */
  2332. let res = _self._calculateRectangleOutlineCoordinates(rectangle);
  2333. _self._rectangleOutlineCoordinates = res.cPoints;
  2334. _self._sketchOutputPoints = res.gPoints;
  2335. }
  2336. /* 删除标记点 */
  2337. _self._removePointEntitys();
  2338. /* 删除临时矩形 */
  2339. _self._removeEntityByObject(_self._sketchTempRectangle);
  2340. /* 创建正式矩形 */
  2341. _self._createRectangle();
  2342. /* 干掉事件句柄 释放资源*/
  2343. handler.destroy();
  2344. handler = null;
  2345. /* 回调返回 */
  2346. if (options.onComplete) options.onComplete(_self._sketchOutputPoints);
  2347. }
  2348. });
  2349. /* 挂接鼠标移动事件 */
  2350. this._registerMouseMoveEvent(handler, function(event) {
  2351. /* 如果运行环境是App 则禁止使用移动事件 */
  2352. if (_self._isRuntimeApp()) return;
  2353. /* 如果还未创矩形 则直接返回 */
  2354. if (!Cesium.defined(_self._sketchTempRectangle)) return;
  2355. /* 识别屏幕位置 */
  2356. let loc = _self._transfromFromScreenPoint(event.endPosition);
  2357. if (!Cesium.defined(loc.sLocation)) return;
  2358. _self._sketchTempPoints.pop();
  2359. _self._sketchTempPoints.push(loc.gLocation);
  2360. });
  2361. },
  2362. /**
  2363. * 绘制三角形
  2364. * @ignore
  2365. * @param {Object} handler 事件句柄
  2366. * @param {JSON} options 配置项
  2367. * @param {Function} [options.onComplete(hCoordinates,sCoordinates,heightCoordinates,position)] 完成回调 可选
  2368. * @param {Function} [options.onError(message)] 错误回到 可选
  2369. */
  2370. _sketchDrawTriangle: function(handler, options) {
  2371. let _self = this;
  2372. /* 挂接点击事件监听 */
  2373. handler.setInputAction(function(event) {
  2374. if (Cesium.defined(_self._sketchTempAltituePolyline)) return;
  2375. /* 识别屏幕坐标位置 */
  2376. let loc = _self._transfromFromScreenPoint(event.position);
  2377. if (!Cesium.defined(loc.sLocation)) return;
  2378. if (_self._sketchPoints.length == 0) {
  2379. _self._createPoint(loc.sLocation, '起点');
  2380. _self._sketchTempPoints.push(loc.sLocation.clone());
  2381. _self._sketchTempPoints.push(loc.sLocation);
  2382. _self._sketchPoints.push(loc.sLocation);
  2383. /* 绘制临时线 */
  2384. _self._createTempPolyline();
  2385. } else if (_self._sketchPoints.length === 1) {
  2386. _self._createPoint(loc.sLocation, '高度起点');
  2387. /* 删除临时线 */
  2388. _self._entities.remove(_self._sketchTempPolyline);
  2389. _self._sketchPoints.push(loc.sLocation);
  2390. /* 绘制正式线 */
  2391. _self._createPolyline();
  2392. /* 填充数据 */
  2393. _self._sketchTempPoints.push(loc.sLocation.clone());
  2394. _self._sketchPoints.push(loc.sLocation);
  2395. /* 赋值三角形临时高度线椭圆的初始高度 */
  2396. _self._sketchAltitudeInitHeight = loc.gLocation.height;
  2397. /* 创建三角形临时高度线和空间线 */
  2398. _self._createTempTriangleAltitudePolylineAndSpatialPolyline();
  2399. }
  2400. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  2401. /* 挂接移动事件 */
  2402. handler.setInputAction(function(event) {
  2403. /* 如果还未创建圆 则直接返回 */
  2404. if (_self._sketchPoints === undefined || _self._sketchPoints.length === 0) return;
  2405. /* 获取空间位置 */
  2406. var cartesian = _self._viewer.scene.pickPosition(event.endPosition);
  2407. /* 如果获取点失败 则直接返回 */
  2408. if (cartesian == undefined) return;
  2409. _self._sketchTempPoints.pop();
  2410. _self._sketchTempPoints.push(cartesian);
  2411. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  2412. /* 右键单击事件 */
  2413. handler.setInputAction(function(event) {
  2414. if (_self._sketchPoints.length < 2) {
  2415. if (options.onError) options.onError('绘制图形不完整,禁止结束绘制!');
  2416. return;
  2417. }
  2418. /* 删除标记点 */
  2419. _self._removePointEntitys();
  2420. /* 删除临时高度线及空间线 */
  2421. _self._removeEntityByObject(_self._sketchTempTriangleAltitudePolyline);
  2422. _self._removeEntityByObject(_self._sketchTempSpatialPolyline);
  2423. /* 创建正式高度线及空间线 */
  2424. _self._createAltitudePolyline();
  2425. _self._createTriangleSpatialPolyline();
  2426. /* 干掉事件句柄 释放资源*/
  2427. handler.destroy();
  2428. handler = null;
  2429. /* 回调返回 */
  2430. options.onComplete(_self._sketchPoints, _self
  2431. ._sketchTriangleSpatialPolylinePositions,
  2432. _self._sketchAltitudePolylinePostions, _self
  2433. ._sketchEllipseCenterPosition);
  2434. }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  2435. },
  2436. /**
  2437. * 绘制面拉伸体工具
  2438. * @ignore
  2439. * @param {Object} handler 事件句柄
  2440. * @param {JSON} options 配置项
  2441. * @param {Function} [options.onAdded(cPoints,gPoints)] 添加回调 可选
  2442. * @param {Function} [options.onMoving(cPoint)] 移动回调 可选
  2443. * @param {Function} [options.onUndo(cPoints)] 撤销回调 可选
  2444. * @param {Function} [options.onComplete(cPoints,gPoints)] 完成回调 可选
  2445. * @param {Function} [options.onError(message)] 错误回到 可选
  2446. */
  2447. _sketchDrawPolygonBody(handler, options) {
  2448. let _self = this;
  2449. /* 注册鼠标左键点击事件 */
  2450. this._registerLeftClickEvent(handler, function(event) {
  2451. /* 识别屏幕位置 */
  2452. let loc = _self._transfromFromScreenPoint(event.position);
  2453. if (!Cesium.defined(loc.sLocation)) return;
  2454. /* 绘制点 */
  2455. if (_self._isDrawPoint) {
  2456. _self._createPoint(loc.sLocation, _self._lineLabel);
  2457. }
  2458. /* 第一点击的时候绘制线 */
  2459. if (_self._sketchTempPoints.length === 0) {
  2460. _self._createTempPolygon();
  2461. _self._createTempPolyline();
  2462. _self._sketchTempPoints.push(loc.sLocation.clone());
  2463. }
  2464. _self._sketchTempPoints.push(loc.sLocation);
  2465. /* 存储正式绘制点集合 */
  2466. _self._sketchPoints.push(loc.sLocation.clone());
  2467. /* 存储输出经纬度点集合 */
  2468. _self._sketchOutputPoints.push(loc.gLocation);
  2469. /* 监听输出 */
  2470. if (options.onAdded) options.onAdded(_self._sketchPoints, _self._sketchOutputPoints);
  2471. });
  2472. /* 注册鼠标移动事件 */
  2473. this._registerMouseMoveEvent(handler, function(event) {
  2474. /* 如果运行环境是App 则禁止使用移动事件 */
  2475. if (_self._isRuntimeApp()) return;
  2476. /* 识别屏幕位置 */
  2477. let loc = _self._transfromFromScreenPoint(event.endPosition);
  2478. if (!Cesium.defined(loc.sLocation)) return;
  2479. if (Cesium.defined(_self._sketchTempPolygon)) {
  2480. _self._sketchTempPoints.pop();
  2481. _self._sketchTempPoints.push(loc.sLocation);
  2482. /* 监听输出 */
  2483. if (options.onMoving) options.onMoving(loc.sLocation);
  2484. }
  2485. });
  2486. /* 注册鼠标右键事件 */
  2487. this._registerRightClickEvent(handler, function(event) {
  2488. if (_self._sketchTempPoints.length > 2) {
  2489. /* 移除正式点最有一个元素 */
  2490. _self._sketchPoints.pop();
  2491. _self._sketchOutputPoints.pop();
  2492. /* 移除临时点倒数第二个元素 */
  2493. _self._sketchTempPoints.splice(_self._sketchTempPoints.length - 2, 1);
  2494. if (options.onUndo) options.onUndo(_self._sketchPoints);
  2495. }
  2496. });
  2497. /* 注册鼠标左键双击事件 */
  2498. this._registerLeftDoubleClickEvent(handler, function(event) {
  2499. /* 如果运行环境是App 则禁止使用双击结束事件 */
  2500. if (_self._isRuntimeApp()) return;
  2501. if (_self._sketchPoints.length < 3) {
  2502. if (options.onError) options.onError('点数少于3个,禁止结束绘制!');
  2503. return;
  2504. }
  2505. /* 删除临时线和面 */
  2506. _self._removeEntityByObject(_self._sketchTempPolygon);
  2507. _self._removeEntityByObject(_self._sketchTempPolyline);
  2508. /* 绘制正式体 */
  2509. _self._createPolygonBody({
  2510. height: 30,
  2511. color: [255, 255, 0, 0.9],
  2512. });
  2513. /* 删除标记点 */
  2514. _self._removePointEntitys();
  2515. /* 干掉事件句柄 释放资源*/
  2516. _self._clearEvent(handler);
  2517. /* 监听输出 */
  2518. if (options.onComplete) options.onComplete(_self._sketchPoints, _self
  2519. ._sketchOutputPoints);
  2520. })
  2521. },
  2522. /**
  2523. * 另外一种方式绘制三角形
  2524. * @ignore
  2525. * @param {Object} handler 事件句柄
  2526. * @param {JSON} options 配置项
  2527. * @param {Function} [options.onMoving(cPoint)] 移动回调 可选
  2528. * @param {Function} [options.onComplete(positions)] 完成回调 可选
  2529. * @param {Function} [options.onError(message)] 错误回到 可选
  2530. */
  2531. _sketchDrawTriangleA: function(handler, options) {
  2532. let _self = this;
  2533. /* 注册鼠标左键点击事件 */
  2534. this._registerLeftClickEvent(handler, function(event) {
  2535. if (Cesium.defined(_self._sketchTempAltituePolyline)) return;
  2536. /* 识别屏幕坐标位置 */
  2537. let loc = _self._transfromFromScreenPoint(event.position);
  2538. if (!Cesium.defined(loc.sLocation)) return;
  2539. if (_self._sketchPoints.length == 0) {
  2540. /* 绘制点 */
  2541. if (_self._isDrawPoint) {
  2542. _self._createPoint(loc.sLocation, '起点');
  2543. }
  2544. _self._sketchTempPoints.push(loc.sLocation.clone());
  2545. _self._sketchTempPoints.push(loc.sLocation);
  2546. _self._sketchPoints.push(loc.sLocation);
  2547. /* 绘制临时空间三角形 */
  2548. _self._createTempSpatialTriangle();
  2549. /* 监听输出 */
  2550. if (options.onAdded) options.onAdded(loc.sLocation);
  2551. } else if (_self._sketchPoints.length > 0) {
  2552. if (_self._isRuntimeApp()) {
  2553. _self._sketchTempPoints.pop();
  2554. _self._sketchTempPoints.push(loc.sLocation);
  2555. /* 为了成功绘制 需要对点数据进行处理 */
  2556. _self._sketchSpatialTrianglePositions = [];
  2557. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[0].clone());
  2558. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[1].clone());
  2559. let point1cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[0]);
  2560. let point2cartographic = Cesium.Cartographic.fromCartesian(_self._sketchTempPoints[1]);
  2561. let point_temp = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(point1cartographic.longitude), Cesium.Math.toDegrees(point1cartographic.latitude), point2cartographic.height);
  2562. _self._sketchSpatialTrianglePositions.push(point_temp);
  2563. _self._sketchSpatialTrianglePositions.push(_self._sketchTempPoints[0].clone());
  2564. }
  2565. /* 删除绘制的点 */
  2566. _self._removePointEntitys();
  2567. /* 删除临时三角形 */
  2568. _self._removeEntityByObject(_self._sketchTempSpatialTriangle);
  2569. /* 创建正式三角形 */
  2570. _self._createSpatialTriangle();
  2571. /* 干掉事件句柄 释放资源*/
  2572. _self._clearEvent(handler);
  2573. /* 回调返回 */
  2574. if (options.onComplete) options.onComplete(_self._sketchSpatialTrianglePositions);
  2575. }
  2576. });
  2577. /* 注册鼠标移动事件 */
  2578. this._registerMouseMoveEvent(handler, function(event) {
  2579. /* 如果运行环境是App 则禁止使用移动事件 */
  2580. if (_self._isRuntimeApp()) return;
  2581. /* 如果还未创建圆 则直接返回 */
  2582. if (_self._sketchPoints === undefined || _self._sketchPoints.length === 0) return;
  2583. /* 获取空间位置 */
  2584. var cartesian = _self._viewer.scene.pickPosition(event.endPosition);
  2585. /* 如果获取点失败 则直接返回 */
  2586. if (cartesian == undefined) return;
  2587. _self._sketchTempPoints.pop();
  2588. _self._sketchTempPoints.push(cartesian);
  2589. /* 监听输出 */
  2590. if (options.onMoving) options.onMoving(cartesian);
  2591. });
  2592. },
  2593. /**
  2594. * 绘图工具
  2595. * @param {SketchViewModel.SketchType} toolsType 草图工具类型
  2596. * @param {JSON} options 回调集合
  2597. * @param {Function} [options.onAdded] 添加回调 可选 子方法自定义
  2598. * @param {Function} [options.onMoving] 移动回调 可选 子方法自定义
  2599. * @param {Function} [options.onUndo] 撤销回调 可选 子方法自定义
  2600. * @param {Function} [options.onComplete] 完成回调 可选 子方法自定义
  2601. * @param {Function} [options.onError] 错误回调 可选 子方法自定义
  2602. */
  2603. sketchTools: function(toolsType, options) {
  2604. /* 定义自身 */
  2605. let _self = this;
  2606. /* 初始化 */
  2607. this._clear();
  2608. /* 注册事件 */
  2609. _self._sketchEventHandler = new Cesium.ScreenSpaceEventHandler(this._viewer.scene.canvas);
  2610. /* 分类型注册事件 */
  2611. switch (toolsType) {
  2612. case SketchViewModel.SketchType.Point:
  2613. _self._sketchDrawPoint(_self._sketchEventHandler, options);
  2614. break;
  2615. case SketchViewModel.SketchType.Line:
  2616. _self._sketchDrawPolyline(_self._sketchEventHandler, options);
  2617. break;
  2618. case SketchViewModel.SketchType.Polygon:
  2619. _self._sketchDrawPolygon(_self._sketchEventHandler, options);
  2620. break;
  2621. case SketchViewModel.SketchType.Height:
  2622. _self._sketchDrawHeightPolyline(_self._sketchEventHandler, options);
  2623. break;
  2624. case SketchViewModel.SketchType.Spatial:
  2625. _self._sketchDrawSpatialPolyline(_self._sketchEventHandler, options);
  2626. break;
  2627. case SketchViewModel.SketchType.Circle:
  2628. _self._sketchDrawCircle(_self._sketchEventHandler, options);
  2629. break;
  2630. case SketchViewModel.SketchType.Rectangle:
  2631. _self._sketchDrawRectangle(_self._sketchEventHandler, options);
  2632. break;
  2633. case SketchViewModel.SketchType.Triangle:
  2634. _self._sketchDrawTriangleA(_self._sketchEventHandler, options);
  2635. break;
  2636. case SketchViewModel.SketchType.PolygonBody:
  2637. _self._sketchDrawPolygonBody(_self._sketchEventHandler, options);
  2638. break;
  2639. case SketchViewModel.SketchType.MultiplePoint:
  2640. _self._sketchDrawMultiplePoint(_self._sketchEventHandler, options);
  2641. break;
  2642. }
  2643. },
  2644. /**
  2645. * 根据坐标绘制要素
  2646. * @param {Array<Number>} points 点集合[lng,lat,......];
  2647. * @param {SketchViewModel.SketchType} type 绘制类型
  2648. * @param {JSON} options 回调配置
  2649. * @param {Function} options.onComplete() 完成回调,可选
  2650. * @param {Function} options.onError(message) 错误回调
  2651. */
  2652. sketchDrawFeacture: function(points, type, options) {
  2653. let _self = this;
  2654. if (points === undefined || points.length === undefined || points.length < 2) {
  2655. if (options && options.onError) options.onError("输入的坐标集合异常!");
  2656. return;
  2657. }
  2658. /* 转换坐标 */
  2659. this._sketchPoints = [];
  2660. for (let i = 0; i < points.length;) {
  2661. this._sketchPoints.push(Cesium.Cartesian3.fromDegrees(points[i], points[i + 1], points[i + 2]));
  2662. i = i + 3;
  2663. }
  2664. /* 分别判断 */
  2665. switch (type) {
  2666. case SketchViewModel.SketchType.DrawPoint:
  2667. _self._createPoint(_self._sketchPoints[0], _self._lineLabel);
  2668. if (options && options.onComplete) options.onComplete(_self._pointEntitys);
  2669. break;
  2670. case SketchViewModel.SketchType.DrawMultiplePoint:
  2671. for (let i = 0; i < _self._sketchPoints.length; i++) {
  2672. _self._createPoint(_self._sketchPoints[i], _self._lineLabel);
  2673. }
  2674. if (options && options.onComplete) options.onComplete(_self._pointEntitys);
  2675. break;
  2676. case SketchViewModel.SketchType.DrawPolyline:
  2677. if (_self._sketchPoints.length < 2) {
  2678. if (options && options.onError) options.onError("点数少于2个,无法绘制!");
  2679. } else {
  2680. _self._createPolyline();
  2681. if (options && options.onComplete) options.onComplete(_self._sketchPolyline);
  2682. }
  2683. break;
  2684. case SketchViewModel.SketchType.DrawPolygon:
  2685. if (_self._sketchPoints.length < 3) {
  2686. if (options && options.onError) options.onError("点数少于3个,无法绘制!");
  2687. } else {
  2688. _self._createPolygon();
  2689. if (options && options.onComplete) options.onComplete(_self._sketchPolygon);
  2690. }
  2691. break;
  2692. default:
  2693. if (options && options.onError) options.onError("绘制类型异常!");
  2694. break;
  2695. }
  2696. },
  2697. /**
  2698. * 清理资源
  2699. */
  2700. sketchClear: function() {
  2701. this._clear(true);
  2702. /* 干掉事件句柄 释放资源*/
  2703. this._clearEvent(this._sketchEventHandler);
  2704. },
  2705. /**
  2706. * 初始化
  2707. */
  2708. sketchInit: function() {
  2709. this._clear(false);
  2710. }
  2711. })
  2712. /* 编辑函数相关 */
  2713. Object.assign(SketchViewModel.prototype, {
  2714. /**
  2715. * 检查颜色值
  2716. * @ignore
  2717. * @param {Number} color 颜色值[0~255]
  2718. * @return {Boolean} 是否满足颜色值要求
  2719. */
  2720. _checkColor: function(color) {
  2721. if (color === undefined || color === null) return false;
  2722. if (typeof color != 'number') return false;
  2723. let intColor = parseInt(color);
  2724. if (intColor < 0 || intColor > 255) return false;
  2725. return true;
  2726. },
  2727. /**
  2728. * 检查透明度是否符合要求
  2729. * @ignore
  2730. * @param {Object} alpha 透明度[0~1]
  2731. */
  2732. _checkAlpha: function(alpha) {
  2733. if (alpha === undefined || alpha === null) return false;
  2734. if (typeof alpha != 'number') return false;
  2735. let floatAlpha = parseFloat(alpha);
  2736. if (floatAlpha < 0 || floatAlpha > 1) return false;
  2737. return true;
  2738. },
  2739. /**
  2740. * 颜色和透明度检测
  2741. * @ignore
  2742. * @param {Array<Number>} colorAndAlpah 颜色和透明度
  2743. * @return {Array<Number>} [0~255,0~255,0~255,0~1] 如果异常 则返回undefined
  2744. */
  2745. _checkColorAndAlpha: function(colorAndAlpah) {
  2746. let setColor = undefined;
  2747. if (!colorAndAlpah || colorAndAlpah.length === undefined || colorAndAlpah.length === 0)
  2748. return undefined;
  2749. if (colorAndAlpah.length === 1 && this._checkColor(colorAndAlpah[0])) {
  2750. setColor = [colorAndAlpah[0], 0, 0, 1.0];
  2751. } else if (colorAndAlpah.length === 2 && this._checkColor(colorAndAlpah[0]) && this._checkColor(
  2752. colorAndAlpah[1])) {
  2753. setColor = [colorAndAlpah[0], colorAndAlpah[1], 0, 1.0];
  2754. } else if (colorAndAlpah.length === 3 && this._checkColor(colorAndAlpah[0]) && this._checkColor(
  2755. colorAndAlpah[1]) && this._checkColor(colorAndAlpah[2])) {
  2756. setColor = [colorAndAlpah[0], colorAndAlpah[1], colorAndAlpah[2], 1.0];
  2757. } else if (colorAndAlpah.length === 4 && this._checkColor(colorAndAlpah[0]) && this._checkColor(
  2758. colorAndAlpah[1]) && this._checkColor(colorAndAlpah[2]) && this._checkAlpha(
  2759. colorAndAlpah[
  2760. 3])) {
  2761. setColor = [colorAndAlpah[0], colorAndAlpah[1], colorAndAlpah[2], colorAndAlpah[3]];
  2762. }
  2763. return setColor;
  2764. },
  2765. /**
  2766. * 编辑选择的拉伸对象
  2767. * @ignore
  2768. * @param {JSON} options 配置项
  2769. * @param {Array<Number>} options.color [0~255,0~255,0~255,0~1]
  2770. * @param {Number} options.height 高度
  2771. * @param {Function} onComplete(message) 完成回调,如果message为undefined则代表成功,否则为失败消息
  2772. */
  2773. sketchEditPickPolygonBody: function(options) {
  2774. let _self = this;
  2775. /* 获取当前选中的拉伸对象 */
  2776. let primitive = _self._sketchPickPolygonBody;
  2777. if (primitive === undefined) {
  2778. if (options.onComplete) options.onComplete("未拾取对象或拾取的对象不符合要求!");
  2779. return;
  2780. };
  2781. let color = primitive._useGeometry.color;
  2782. let height = primitive._useGeometry.height;
  2783. this._sketchPoints = primitive._useGeometry.cPoints;
  2784. this._sketchOutputPoints = primitive._useGeometry.gPoints;
  2785. if (options && options.height && typeof options.height === 'number') height = parseInt(options
  2786. .height);
  2787. if (options && options.color && this._checkColorAndAlpha(options.color)) color = this
  2788. ._checkColorAndAlpha(options.color);
  2789. /* 删除已绘制的要素 */
  2790. this._viewer.scene.primitives.remove(primitive);
  2791. /* 创建新的要素 */
  2792. this._createPolygonBody({
  2793. color: color,
  2794. height: height,
  2795. });
  2796. if (options.onComplete) options.onComplete(undefined);
  2797. },
  2798. /**
  2799. * 移除选择的拉伸实体
  2800. * @ignore
  2801. * @param {Function} onComplete(message) 完成回调,message为undifined为成功,否则为失败消息
  2802. */
  2803. sketchRemovePickPolygonBody: function(onComplete) {
  2804. let _self = this;
  2805. /* 获取当前选中的拉伸对象 */
  2806. let primitive = _self._sketchPickPolygonBody;
  2807. if (primitive === undefined) {
  2808. if (onComplete) onComplete("未拾取对象或拾取的对象不符合要求!");
  2809. return;
  2810. };
  2811. /* 删除已绘制的要素 */
  2812. this._viewer.scene.primitives.remove(primitive);
  2813. if (onComplete) onComplete(undefined);
  2814. },
  2815. /**
  2816. * 拾取绘制的区域拉伸对象
  2817. * @ignore
  2818. * @param {Function} onComplete(options) 完成回调
  2819. * options.color 颜色数组
  2820. * options.height 高度
  2821. * 如果未查询到符合要求的对象或者实体 则options为undefined
  2822. */
  2823. sketchPick: function(onComplete) {
  2824. let _self = this;
  2825. /* 创建事件句柄 */
  2826. let handler = new Cesium.ScreenSpaceEventHandler(this._viewer.scene.canvas);
  2827. /* 挂接点击事件监听 */
  2828. handler.setInputAction(function(event) {
  2829. let pickObj = _self._viewer.scene.pick(event.position);
  2830. if (pickObj && pickObj.primitive && pickObj.primitive._useGeometry != undefined) {
  2831. _self._sketchPickPolygonBody = pickObj.primitive;
  2832. if (onComplete) onComplete({
  2833. color: pickObj.primitive._useGeometry.color,
  2834. height: pickObj.primitive._useGeometry.height,
  2835. });
  2836. } else {
  2837. _self._sketchPickPolygonBody = undefined;
  2838. if (onComplete) onComplete(undefined);
  2839. }
  2840. /* 干掉事件句柄 释放资源 */
  2841. handler.destroy();
  2842. handler = null;
  2843. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  2844. }
  2845. });
  2846. /**
  2847. * 草图工具类型
  2848. */
  2849. SketchViewModel.SketchType = Object.freeze({
  2850. Point: 'point',
  2851. MultiplePoint: 'multiplePoint',
  2852. Line: 'line',
  2853. Polygon: 'polygon',
  2854. Height: 'height',
  2855. Spatial: 'spatial',
  2856. Circle: 'circle',
  2857. Rectangle: 'rectangle',
  2858. Triangle: 'triangle',
  2859. PolygonBody: 'polygonBody',
  2860. DrawPoint: 'drawPoint',
  2861. DrawMultiplePoint: 'drawMultiplePoint',
  2862. DrawPolyline: 'drawPolyline',
  2863. DrawPolygon: 'drawPolygon',
  2864. })
  2865. /**
  2866. * 点图标类型
  2867. */
  2868. SketchViewModel.SketchIconType = Object.freeze({
  2869. Normal: 'normal',
  2870. Blue: 'blue',
  2871. Green: 'green',
  2872. Violet: 'violter',
  2873. })
  2874. /**
  2875. * 运行环境类型
  2876. */
  2877. SketchViewModel.RuntimeEnvironment = Object.freeze(({
  2878. App: 'app',
  2879. Web: 'web'
  2880. }))
  2881. /* 输出 */
  2882. export {
  2883. SketchViewModel
  2884. }