CommonTools.js 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959
  1. /**
  2. * 创建者:王成
  3. * 操作系统:MAC
  4. * 创建日期:2022年11月14日
  5. * 描述:工具类
  6. */
  7. /* 引入Cesium */
  8. // import * as Cesium from 'Cesium';
  9. /* 引入草图工具 */
  10. import {
  11. SketchViewModel
  12. } from './SketchViewModel.js'
  13. /**
  14. * 测量、图形查询、根据坐标生成图形
  15. */
  16. class CommonTools {
  17. /**
  18. * 默认初始化
  19. * @param {Object} viewer 三维场景
  20. * @param {JSON} [options] 配置项
  21. * @param {Boolean} [options.isClear] 是否清理前期已绘制内容
  22. * @param {Boolean} [options.isDrawPoint] 是否绘制参考点
  23. * @param {Boolean} [options.isRetainDrawPoint] 绘制完成,是否保留绘制参考点
  24. */
  25. constructor(viewer, options) {
  26. this._viewer = viewer;
  27. options = options || {};
  28. /* 配置是否绘制参考点 */
  29. if (options.isDrawPoint) {
  30. this._isDrawPoint = options.isDrawPoint;
  31. } else {
  32. this._isDrawPoint = false;
  33. }
  34. /* 配置绘制完成是否保留绘制参考点 */
  35. if (options.isRetainDrawPoint) {
  36. this._isRetainDrawPoint = options.isRetainDrawPoint;
  37. } else {
  38. this._isRetainDrawPoint = false;
  39. }
  40. /* 是否清理前期已绘制内容 */
  41. if (options.isClear) {
  42. this._isClear = options.isClear;
  43. } else {
  44. this._isClear = false;
  45. }
  46. this._sketchViewModel = new SketchViewModel(viewer, {
  47. iconType: SketchViewModel.SketchIconType.Blue,
  48. isDrawPoint: this._isDrawPoint,
  49. isRetainDrawPoint: this._isRetainDrawPoint,
  50. });
  51. let buttonDiv = document.getElementById("drawButtonDiv");
  52. if (buttonDiv) {
  53. //从页面移除
  54. document.body.removeChild(buttonDiv);
  55. }
  56. /* 初始化 */
  57. this._init();
  58. }
  59. /**
  60. * 初始化
  61. * @ignore
  62. */
  63. _init() {
  64. /* 绘制的实体名称 */
  65. this._measureEntityName = 'MeasureEntity';
  66. this._entities = this._viewer.entities;
  67. /* 标绘点图片 */
  68. this._measurePointImage =
  69. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcEAYAAAAinQPXAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAB2FJREFUWMO9mHtQlNcZxn/nW65GxHtEqTEajUxVoLYRSIyipHG4qG0lajtxVIRFubgqXuOI28ZE7FAvCLKLSNKxg/FSIzdvqNE62kaRitqpYMxovBGigo4I4n6nfwjsCrsLrtjnn53vnPe87/Oc9/2+854VdBhCd6ZP6dMHlAXO/lOngrzMLz/8EEQ0ASNGANNY2aOHxYIdfHr3LuBCwPnzQIKcf/AgiJ8pQV99BfmvR4+orHxZVsLxpZFT0qd07gyP7zqrej3IInF47lwQkTLV3d1xv3KXWPT4MYhLzMzIgHpn10+Sk+Gw74w+jx79HwSGnzUYhg4FED4FBcBq/jtokOOC2oSb0FZUgHpKVoeHQ9GtGM/y8lcgMLxf5juDBwNDlOWnTgGvUdWz5wsQ7c179fUWzz9y0tX1BdZPILeqCpTtil9QEOT9c876K1faWqS07XeMzJFuboCXkpaX1w5hqxl14QJIKYRWCzLV5OXtDQXbon3c3c2/TeMoYvncucAgPrl40Y7fA0zv1QtMydKwb58FL7toRwbDYo3/0utB3OD8qlX2hIkLqalwO0b9+fLlUHJOG9vQ0P4EjfyFIdPZGfqsURampIBIlxsWLLBtL/NltF4PhUIrVq92QGDIeEOmpye4pYju164Bq6n29LTiopy8tDTIL48pSExsDq/Oj9is/eAD4CRbli1DMEFUBAYCewnUaJD8jr2lpQjpJ7M2bBBi0+L47Tt2mP2G5xhNaWnAHrLj461tKF1rasA0rW5b//6w/0rigQcPWhrZKVFXP8TkybaFyb3kXbkCbiO6fpyU1Dwq58vNG3U6BJvEiYMHEcwQW8aNA3pT7O4OaPmTiwuCnlwcNQrEDRGYmytloilj5vr1Zv+mNXVhSUnmOFYEVnt6gtM9t+8mTbKlwo5AoWdySIjteWUcIwwG2LX7o6lPnkiZULTlj/7+wEThm5oKbCBeCOANUisqkNRxLCEBSSzrYmOB3jw6c8Yi3kL5K51OyvkZGXUTJz7LSH09CIPwMBpt85CHhMf48Q4IJFPofHzsbMAAJfjIEQtXC9TZWi0wkEuKAmjEyspKpNN2pyVBQULZaIjbvXmzUDb6xF0zGJCqv+no6NGAK5fLyiz8JssVcXEWgQLUsZZxWmGbrLTN057Agfh7eNiefhpRb7h922LgOzFp2DDzxnJXrsvLE0rqOW3sTz+12h4lLfRZhuQybuXmWmQkgPzhwy0o1jlV37ljh+e3/L1LF0cEXqX04UPb0075rlovLwtBHuqZ5845T5Z37UqbEAPkzOfsUvlHXZ35saFnQ4++fe04eIfftv64tEfgdvkXeweprFIvBQaaebJH+f3x4xbPvsRPnixlQlHGtDFjWq2Wuqj0yz4+QKk4FxNjMVXD2998Y0FRKEsCAuzwzBKv2eZpR6DspxQcPWpnvrNYoNNBZOTOnRoN0ilJMzYjA3ibsKoqoIxezs6gLJbpxcVSTbyePurwYSkT76VPKSgAWQslJcAmenTrBszgP7W1wBlRmZICY2SydHIC8ZCvdTo7Ak+ri44dcySDNDTs2mVufluhThoGD4bHp6or4uOb3zWJnoqwMGAVLnfuACHscHJCiFRmhISA0BMcFob52PDC/8EDkLfkR5GRQmycN8/t8mXw8O73WVwctnvdJ3SqrQXNSJeY3bttaWhHJxMxzDh97VqQAwheutR2IC6pm/z8oOBm7LcVFVJNKNo0oUsXhBKmGR0VBfI0vkFBINzExxoNEKP+ePYsktefFmVnC2Vjvm5SZSVEpGUNefNNUH8ti8rKQCziaOfOVuL2563PP4eCjJhxK1a8hMCJJ7NTPDxAXWIaefEi0J2r/ftbMfyryDhxAkZ2u1EaHAx6oReq2rb/JiTLZKkoUHLf2//YMWCGnPf++1YM7zHw+nVQ1mlKhg2DvPeiltr+GLaj2W524Kd6zZ4NhGOQ0ophI6GSkr4Gq61VGyjx7vdZQoIdYY1xVZ06RKttS1gTHLkPLjVmGo3AJZToaCsGjSWrPFBKfH3bvta0uyR3ySlGIxS4a7trte1l244MtoRpT93XSUk0l0oruFDbqROYUtQ9X3xhLr2WaBpX4+WnOTl2hHkw9eZN0Li5dLP6Dehogc1dexslK/7MynffhbNDvZXnWq9GNJWyiKC69TlphvobtWbOHNgnZonq6hdl+xL/yTQhbKUxeOtWEP9melSUFYMWJSv/IAtNprZLUu4Rf9u6FQpdo49bfRXaBQcy2BL1p+XURYtAZrLwhx+sGDSWrDpc3ZeVBbJMPt22zY6wRj/1oep08zXMUXRABpsQFmqcHhICYiLlhw4BBWiFA/5FOXmhoc8u0Pv3vyyrDshgEwqLYnKLi4FO5OfkvPh66UdudnZHCXsFAptQ96XMW7jQTsm2xAF23roFlD6NXLy4o9m8AoHFR7SxNTWgjGOsVovtxqBxXAzEbc4cKCycN+/+/Y7n88oRvjarcNYsCDtprP/+ewjvZ1xz9SpERBp3zpz5qqP/D5zQE33tptaiAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA0LTA5VDE2OjQyOjI5KzA4OjAwjRBbGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNC0wOVQxNjo0MjoyOSswODowMPxN46cAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uXzJhcHo1b3VpcnV4L2Rpbmd3ZWkuc3ZncY9vkgAAAABJRU5ErkJggg==';
  70. this._iconBlue =
  71. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkEyMUE1MDg3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkEyMUE1MDc3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  72. this._iconGreen =
  73. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjI1NDIwOUU3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjI1NDIwOUQ3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  74. this._iconViolet =
  75. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzFDREU3Mjk3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzFDREU3Mjg3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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';
  76. /* 用于面积测量 存储临时位置 经纬度格式 */
  77. this._measureTempPoints = [];
  78. }
  79. /**
  80. * 刷新场景 刷新一帧
  81. * @ignore
  82. */
  83. _updateScene() {
  84. this._viewer.scene.requestRender();
  85. }
  86. /**
  87. * 根据Entity的名称批量删除Entity
  88. * @ignore
  89. * @param {string} entityName 实体名称
  90. */
  91. _removeEntityByName(entityName) {
  92. /* 获取实体集合 */
  93. let entities = this._entities;
  94. /* 如果不存在实体集合或集合中没有数据 则返回 */
  95. if (!entities || !entities.values) return;
  96. let delEntitys = [];
  97. /* 循环获取当前集合中的所有实体 */
  98. for (let i = 0; i < entities.values.length; i++) {
  99. if (entities.values[i].name == entityName) {
  100. delEntitys.push(entities.values[i]);
  101. }
  102. }
  103. /* 删除符合条件的所有实体 */
  104. for (let i = 0; i < delEntitys.length; i++) {
  105. entities.remove(delEntitys[i]);
  106. }
  107. /* 更新场景 */
  108. this._updateScene();
  109. }
  110. /**
  111. * 资源清理
  112. * @ignore
  113. * @param {Boolean} isAll 是否清除已绘制内容
  114. */
  115. _clear(isAll) {
  116. if (isAll != undefined && isAll === true) {
  117. /* 删除所有绘制的实体 */
  118. this._removeEntityByName(this._measureEntityName);
  119. if (this._sketchViewModel != undefined) {
  120. this._sketchViewModel.sketchClear();
  121. }
  122. }
  123. /* 清理数组 */
  124. this._measureTempPoints = [];
  125. /* 清理变量 */
  126. this._altitudeDynamicLabel = undefined;
  127. /* 清理提示标签 */
  128. this._tooltipRemove();
  129. //app移除按钮
  130. let buttonDiv = document.getElementById("drawButtonDiv");
  131. if (buttonDiv) {
  132. //从页面移除
  133. document.body.removeChild(buttonDiv);
  134. }
  135. }
  136. /**
  137. * 普通颜色值转换为Cesium颜色
  138. * @ignore
  139. * @param {int} red 红色[0~255]
  140. * @param {int} green 绿色[0~255]
  141. * @param {int} blue 蓝色[0~255]
  142. * @param {int} alpha 透明度[0~1]
  143. * @return {Cesium.Color} Cesium格式的颜色
  144. */
  145. _toColor(red, green, blue, alpha) {
  146. return new Cesium.Color(red / 255.0, green / 255.0, blue / 255.0, alpha);
  147. }
  148. /**
  149. * 世界坐标系坐标转为经纬度坐标
  150. * @ignore
  151. * @param {JSON} cartesian 世界坐标
  152. * @param {Number} cartesian.x x坐标
  153. * @param {Number} cartesian.y y坐标
  154. * @param {Number} cartesian.z z坐标
  155. * @return {JSON} 经纬度格式坐标{long:lat:hei}
  156. */
  157. _cartesianToGeography(cartesian) {
  158. let ellipsoid = Cesium.Ellipsoid.WGS84;
  159. let cartographic = ellipsoid.cartesianToCartographic(cartesian);
  160. let latitude = Cesium.Math.toDegrees(cartographic.latitude);
  161. let longitude = Cesium.Math.toDegrees(cartographic.longitude);
  162. let altitude = cartographic.height;
  163. return {
  164. lon: longitude,
  165. lat: latitude,
  166. hei: altitude,
  167. }
  168. }
  169. /**
  170. * 绘制点
  171. * @ignore
  172. * @param {Object} coord 坐标
  173. * @param {Number} coord.x 空间坐标x
  174. * @param {Number} coord.y 空间坐标y
  175. * @param {Number} coord.z 空间坐标z
  176. * @param {String} label [点上面显示的文字标注]
  177. */
  178. _createPoint(coord, label) {
  179. let _self = this;
  180. let entity = new Cesium.Entity({
  181. name: _self._measureEntityName,
  182. position: coord,
  183. billboard: {
  184. image: _self._iconBlue,
  185. horizontalOrigin: Cesium.HorizontalOrigin.center,
  186. verticalOrigin: Cesium.VerticalOrigin.bottom,
  187. scale: 0.5,
  188. pixelOffset: new Cesium.Cartesian2(0, -11),
  189. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  190. }
  191. });
  192. if (label) {
  193. entity.label = {
  194. text: label,
  195. font: '30px SimHei',
  196. scale: 0.5,
  197. fillColor: this._toColor(255, 255, 255, 1.0),
  198. outlineColor: this._toColor(14, 30, 79, 1.0),
  199. style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  200. outlineWidth: 2.0,
  201. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  202. showBackground: true,
  203. backgroundColor: _self._toColor(0, 0, 0, 0.6),
  204. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  205. pixelOffset: new Cesium.Cartesian2(0, -28),
  206. }
  207. }
  208. this._entities.add(entity);
  209. this._updateScene();
  210. return entity;
  211. }
  212. /**
  213. * 绘制标签
  214. * @ignore
  215. * @param {Object} coord 坐标
  216. * @param {Number} coord.x 标签空间坐标x
  217. * @param {Number} coord.y 标签空间坐标y
  218. * @param {Number} coord.z 标签空间坐标z
  219. * @param {String} label 标签文字内容
  220. */
  221. _createLabel(coord, label) {
  222. let _self = this;
  223. let entity = new Cesium.Entity({
  224. name: _self._measureEntityName,
  225. position: coord,
  226. label: {
  227. text: label,
  228. font: '30px SimHei',
  229. scale: 0.5,
  230. fillColor: this._toColor(255, 255, 255, 1.0),
  231. outlineColor: this._toColor(14, 30, 79, 1.0),
  232. style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  233. outlineWidth: 2.0,
  234. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  235. showBackground: true,
  236. backgroundColor: _self._toColor(0, 0, 0, 0.6),
  237. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  238. pixelOffset: new Cesium.Cartesian2(0, -14),
  239. }
  240. });
  241. this._entities.add(entity);
  242. this._updateScene();
  243. }
  244. /**
  245. * 创建高度测量的动态Label
  246. * @ignore
  247. */
  248. _createAltitudeDynamicLabel() {
  249. let _self = this;
  250. this._altitudeDynamicLabel = new Cesium.Entity({
  251. name: _self._measureEntityName,
  252. position: new Cesium.CallbackProperty(function() {
  253. return _self._altitudeLabelPosition;
  254. }, false),
  255. label: {
  256. text: new Cesium.CallbackProperty(function() {
  257. return _self._altitudeLabelText;
  258. }, false),
  259. font: '12px sans-serif',
  260. fillColor: this._toColor(255, 255, 255, 1.0),
  261. outlineColor: this._toColor(0, 154, 94, 1.0),
  262. style: Cesium.LabelStyle.FILL_AND_OUTLINE,
  263. outlineWidth: 1.0,
  264. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  265. pixelOffset: new Cesium.Cartesian2(0, -28),
  266. showBackground: true,
  267. backgroundColor: this._toColor(0, 0, 0, 0.6),
  268. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  269. }
  270. });
  271. this._entities.add(this._altitudeDynamicLabel);
  272. this._updateScene();
  273. }
  274. /**
  275. * 计算距离
  276. * @ignore
  277. * @param {Array<JSON>} positions 点集合
  278. * @return {string}:距离字符串(含单位)
  279. */
  280. _measureDistance(positions) {
  281. let distance = 0;
  282. for (let i = 0; i < positions.length - 1; i++) {
  283. let point1cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
  284. let point2cartographic = Cesium.Cartographic.fromCartesian(positions[i + 1]);
  285. /**根据经纬度计算出距**/
  286. let geodesic = new Cesium.EllipsoidGeodesic();
  287. geodesic.setEndPoints(point1cartographic, point2cartographic);
  288. let s = geodesic.surfaceDistance;
  289. /* 返回两点之间的距离 */
  290. s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height,
  291. 2));
  292. distance = distance + s;
  293. }
  294. if (distance < 1000) return distance.toFixed(2) + "米";
  295. else return (distance / 1000).toFixed(2) + "公里";
  296. }
  297. /**
  298. * 计算空间距离
  299. * @ignore
  300. * @param {Array<JSON>} positions 点集合
  301. * @return {string}:距离字符串(含单位)
  302. */
  303. _measureSpaceDistance(positions) {
  304. let distance = 0;
  305. for (let i = 0; i < positions.length - 1; i++) {
  306. let point1 = positions[i];
  307. let point2 = positions[i + 1];
  308. /* 计算分量差 */
  309. let sx = Math.abs(point1.x - point2.x);
  310. let sy = Math.abs(point1.y - point2.y);
  311. let sz = Math.abs(point1.z - point2.z);
  312. /* 返回两点之间的空间距离 */
  313. let s = Math.sqrt(Math.pow(sx, 2) + Math.pow(sy, 2) + Math.pow(sz, 2));
  314. distance = distance + s;
  315. }
  316. if (distance < 1000) return distance.toFixed(2) + "米";
  317. else return (distance / 1000).toFixed(2) + "公里";
  318. }
  319. /**
  320. * 计算方向
  321. * @ignore
  322. * @param {Cartesian3} from 起始
  323. * @param {Cartesian3} to 终止
  324. * @return {float} 方向度数
  325. */
  326. _measureAreaBearing(from, to) {
  327. let radiansPerDegree = Math.PI / 180.0; //角度转化为弧度(rad)
  328. let degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度
  329. let lat1 = from.lat * radiansPerDegree;
  330. let lon1 = from.lon * radiansPerDegree;
  331. let lat2 = to.lat * radiansPerDegree;
  332. let lon2 = to.lon * radiansPerDegree;
  333. let angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(
  334. lat2) -
  335. Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
  336. if (angle < 0) {
  337. angle += Math.PI * 2.0;
  338. }
  339. angle = angle * degreesPerRadian; //角度
  340. return angle;
  341. }
  342. /**
  343. * 计算角度
  344. * @ignore
  345. * @param {Cartesian3} p1 点1
  346. * @param {Cartesian3} p2 点2
  347. * @param {Cartesian3} p3 点3
  348. * @return {float} 返回角度
  349. */
  350. _calculateAreaAngle(p1, p2, p3) {
  351. let bearing21 = this._measureAreaBearing(p2, p1);
  352. let bearing23 = this._measureAreaBearing(p2, p3);
  353. let angle = bearing21 - bearing23;
  354. if (angle < 0) {
  355. angle += 360;
  356. }
  357. return angle;
  358. }
  359. /**
  360. * 计算两点之间的距离
  361. * @ignore
  362. * @param {Cartesian3} point1 点1
  363. * @param {Cartesian3} point2 点2
  364. */
  365. _calculateDistance(point1, point2) {
  366. let point1cartographic = Cesium.Cartographic.fromCartesian(point1);
  367. let point2cartographic = Cesium.Cartographic.fromCartesian(point2);
  368. /**根据经纬度计算出距离**/
  369. let geodesic = new Cesium.EllipsoidGeodesic();
  370. geodesic.setEndPoints(point1cartographic, point2cartographic);
  371. let s = geodesic.surfaceDistance;
  372. //返回两点之间的距离
  373. s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic
  374. .height, 2));
  375. return s;
  376. }
  377. /**
  378. * 计算面积
  379. * @ignore
  380. * @param {Array<JSON} points 经纬度格式点集合
  381. * @param {Array<JSON>} cartesianPoints 空间坐标系点集合
  382. * @return {float} 返回面积
  383. */
  384. _measureArea(points, cartesianPoints) {
  385. let self = this;
  386. let res = 0;
  387. /* 拆分三角面 */
  388. for (let i = 0; i < points.length - 2; i++) {
  389. let j = (i + 1) % points.length;
  390. let k = (i + 2) % points.length;
  391. let totalAngle = self._calculateAreaAngle(points[i], points[j], points[k]);
  392. let dis_temp1 = self._calculateDistance(cartesianPoints[i], cartesianPoints[j]);
  393. let dis_temp2 = self._calculateDistance(cartesianPoints[j], cartesianPoints[k]);
  394. res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle));
  395. }
  396. return res;
  397. }
  398. /**
  399. * 计算两个点的高度
  400. * @ignore
  401. * @param {Array<JSON>} points 点集合(集合长度必须大于等于2)
  402. */
  403. _calculatePolylineAltitudeHeight(points) {
  404. if (points === undefined || points.length < 2) return -1;
  405. let cartographic = Cesium.Cartographic.fromCartesian(points[0]);
  406. let cartographic1 = Cesium.Cartographic.fromCartesian(points[1]);
  407. let height_temp = cartographic1.height - cartographic.height;
  408. return Math.abs(height_temp).toFixed(2) + '米';
  409. }
  410. /**
  411. * 设置鼠标为柿子样式
  412. * @ignore
  413. */
  414. _setMousePointerStyle() {
  415. document.querySelector('body').style.cursor = 'crosshair';
  416. }
  417. /**
  418. * 恢复鼠标指针为默认样式
  419. * @ignore
  420. */
  421. _initMousePointerStyle() {
  422. document.querySelector('body').style.cursor = 'default';
  423. }
  424. /**
  425. * 检测程序运行环境
  426. * @return {CommonTools.RuntimeEnvironment}
  427. */
  428. _checkAppOrWeb() {
  429. if (window.navigator.userAgent.match(
  430. /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
  431. )) {
  432. return CommonTools.RuntimeEnvironment.App;
  433. } else {
  434. return CommonTools.RuntimeEnvironment.Web;
  435. }
  436. }
  437. /**
  438. * 是否是运行于App
  439. * @ignore
  440. */
  441. _isRuntimeApp() {
  442. if (this._checkAppOrWeb() === CommonTools.RuntimeEnvironment.App) {
  443. return true;
  444. }
  445. return false;
  446. }
  447. /**
  448. * 是否是运行于App
  449. * @ignore
  450. */
  451. _isRuntimeWeb() {
  452. if (this._checkAppOrWeb() === CommonTools.RuntimeEnvironment.Web) {
  453. return true;
  454. }
  455. return false;
  456. }
  457. /**
  458. * @ignore
  459. * 创建操作的主容器
  460. */
  461. _createOperationMainDom() {
  462. //创建画布
  463. let buttonDiv = document.createElement('div');
  464. buttonDiv.id = "drawButtonDiv";
  465. buttonDiv.style.width = '80px';
  466. buttonDiv.style.backgroundColor = 'rgba(5, 45, 155, 0.7)';
  467. buttonDiv.style.borderRadius = '5px';
  468. buttonDiv.style.display = 'flex';
  469. buttonDiv.style.flexDirection = 'column';
  470. buttonDiv.style.padding = '8px';
  471. buttonDiv.style.justifyContent = 'center';
  472. buttonDiv.style.position = 'absolute';
  473. buttonDiv.style.bottom = '150px';
  474. buttonDiv.style.right = '10px';
  475. let btnUndo = document.createElement('button');
  476. btnUndo.id = "btnDrawBackout";
  477. btnUndo.style.height = '30px';
  478. btnUndo.style.marginBottom = '8px';
  479. btnUndo.style.backgroundColor = 'rgba(52, 137, 255, 1.0)';
  480. btnUndo.style.color = 'rgb(255, 255, 255)';
  481. btnUndo.style.border = '0px solid red';
  482. btnUndo.style.borderRadius = '5px';
  483. btnUndo.innerHTML = '回退';
  484. btnUndo.style.fontSize = '13px';
  485. btnUndo.style.cursor = 'pointer';
  486. buttonDiv.appendChild(btnUndo);
  487. let btnCompletion = document.createElement('button');
  488. btnCompletion.id = "btnDrawComplete";
  489. btnCompletion.style.height = '30px';
  490. btnCompletion.style.backgroundColor = 'rgba(88, 185, 45, 1.0)';
  491. btnCompletion.style.color = 'rgb(255, 255, 255)';
  492. btnCompletion.style.border = '0px solid red';
  493. btnCompletion.style.borderRadius = '5px';
  494. btnCompletion.innerHTML = '完成';
  495. btnCompletion.style.fontSize = '13px';
  496. btnCompletion.style.cursor = 'pointer';
  497. buttonDiv.appendChild(btnCompletion);
  498. /* 加入到页面 */
  499. document.body.appendChild(buttonDiv);
  500. }
  501. /**
  502. * 创建顶部弹出提示消息 1秒后自动消失
  503. * @ignore
  504. * @param {String} message 消息内容
  505. */
  506. _showTooltipMessage(message) {
  507. let msgMainDom = document.getElementById('messageMainDom');
  508. if (msgMainDom !== null && msgMainDom !== undefined) {
  509. document.body.removeChild(msgMainDom);
  510. }
  511. msgMainDom = document.createElement('div');
  512. msgMainDom.style.width = '30%';
  513. msgMainDom.style.backgroundColor = 'rgba(237, 248, 230, 1.0)';
  514. msgMainDom.style.height = '45px';
  515. msgMainDom.style.border = 'solid 2px rgb(219, 241, 208)';
  516. msgMainDom.style.borderRadius = '8px';
  517. msgMainDom.style.display = 'flex';
  518. msgMainDom.style.alignItems = 'center';
  519. msgMainDom.style.paddingLeft = '10px';
  520. msgMainDom.style.color = 'rgb(91, 188, 48)';
  521. msgMainDom.style.fontSize = '14px';
  522. msgMainDom.style.fontWeight = '600';
  523. msgMainDom.style.position = 'absolute';
  524. msgMainDom.style.left = '35%';
  525. msgMainDom.style.transition = 'transform 1s';
  526. msgMainDom.style.transform = 'translateY(-90px)';
  527. msgMainDom.style.top = '0px';
  528. msgMainDom.style.zIndex = 1000;
  529. document.body.appendChild(msgMainDom);
  530. let strHtml = '';
  531. strHtml += "<div style='"
  532. strHtml += "background-color: rgb(88, 185, 45);";
  533. strHtml += "color: rgb(255, 255, 255);";
  534. strHtml += "height: 24px;";
  535. strHtml += "width: 24px;";
  536. strHtml += "border-radius: 20px;";
  537. strHtml += "display: flex;";
  538. strHtml += "justify-content: center;";
  539. strHtml += "align-items: center;";
  540. strHtml += "font-size: 14px;";
  541. strHtml += "margin-right: 18px;";
  542. strHtml += "'>&#10003</div>";
  543. strHtml += "<div>" + message + "</div>";
  544. msgMainDom.innerHTML = strHtml;
  545. msgMainDom.addEventListener('transitionend', function() {
  546. setTimeout(function() {
  547. document.body.removeChild(msgMainDom);
  548. }, 1000);
  549. }, false);
  550. setTimeout(function() {
  551. msgMainDom.style.transform = 'translateY(50px)';
  552. }, 100)
  553. }
  554. }
  555. /**
  556. * 鼠标跟随标签
  557. */
  558. Object.assign(CommonTools.prototype, {
  559. /**
  560. * 提示标签初始化
  561. * @ignore
  562. * @param {String} text 显示的文本内容
  563. */
  564. _tooltipInit: function(text) {
  565. let _self = this;
  566. this._tooltipId = 'tooltipJt';
  567. let tooltipObj = document.getElementById(this._tooltipId);
  568. if (tooltipObj === null) {
  569. tooltipObj = document.createElement('div');
  570. tooltipObj.id = this._tooltipId;
  571. document.body.appendChild(tooltipObj);
  572. let divStyle = '';
  573. divStyle += "top: 30px;";
  574. divStyle += "left: 30px;";
  575. divStyle += "position: absolute;";
  576. divStyle += "display: flex;";
  577. divStyle += "align-items: center;";
  578. divStyle += "width: 12x0px;";
  579. divStyle += "height: auto;";
  580. divStyle += "background-color: rgba(0, 0, 0, 0.65);";
  581. divStyle += "border-radius: 5px;";
  582. divStyle += "color: rgb(255, 255, 255);";
  583. divStyle += "font-size: 12px;";
  584. divStyle += "font-family: 'Alimama_ShuHeiTi_Bold';";
  585. divStyle += "padding: 8px;";
  586. divStyle += "border:solid 1px rgb(255,0,0);";
  587. tooltipObj.setAttribute('style', divStyle);
  588. }
  589. if (text != undefined) tooltipObj.innerHTML = text;
  590. /* 挂接鼠标移动事件 */
  591. document.onmousemove = function(event) {
  592. tooltipObj.style.left = (event.clientX + 10) + 'px';
  593. tooltipObj.style.top = (event.clientY - tooltipObj.offsetHeight / 2) + 'px';
  594. }
  595. },
  596. /**
  597. * 移除提示标签
  598. * @ignore
  599. */
  600. _tooltipRemove: function() {
  601. let tooltipObj = document.getElementById(this._tooltipId);
  602. if (tooltipObj != null) {
  603. document.body.removeChild(tooltipObj);
  604. }
  605. },
  606. /**
  607. * 设置提示标签文本
  608. * @ignore
  609. * @param {String} text 文本
  610. */
  611. _tooltipSetText: function(text) {
  612. let tooltipObj = document.getElementById(this._tooltipId);
  613. if (tooltipObj != null) {
  614. tooltipObj.innerHTML = text;
  615. }
  616. }
  617. })
  618. /**
  619. * 通用对外公开函数
  620. */
  621. Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ {
  622. /**
  623. * 清理资源
  624. */
  625. clear: function() {
  626. /* 清理资源 */
  627. this._clear(true);
  628. /* 初始化鼠标样式 */
  629. this._initMousePointerStyle();
  630. }
  631. })
  632. /**
  633. * 测量类对外公开函数
  634. */
  635. Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ {
  636. /**
  637. * 测量长度
  638. */
  639. measureLength: function(callError) {
  640. let _self = this;
  641. /* 临时创建的实体 */
  642. this._tempEntitys = [];
  643. /* 清理资源 */
  644. this._clear(this._isClear);
  645. /* 设置鼠标样式 */
  646. this._setMousePointerStyle();
  647. /* 设置鼠标跟随 */
  648. if (this._isRuntimeApp()) {
  649. this._showTooltipMessage("点击开始测量");
  650. } else {
  651. this._tooltipInit('点击开始测量');
  652. }
  653. /* 调用草图开始绘制 */
  654. if (this._isRuntimeWeb()) {
  655. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, {
  656. /**
  657. * 添加点回调
  658. * @ignore
  659. * @param {Array<JSON>} cPoints 世界坐标系点集合
  660. * @param {Array<JSON>} gPoints 球面坐标系点集合
  661. */
  662. onAdded: function(cPoints, gPoints) {
  663. if (cPoints.length === 1) {
  664. _self._createPoint(cPoints[0], '起点');
  665. } else {
  666. let distince = _self._measureDistance(cPoints);
  667. /* 追加中间距离 */
  668. let tempPoints = [cPoints[cPoints.length - 2], cPoints[cPoints.length - 1]];
  669. distince += ' +' + _self._measureDistance(tempPoints);
  670. _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1],
  671. distince));
  672. }
  673. },
  674. /**
  675. * 撤销回调
  676. * @ignore
  677. */
  678. onUndo: function() {
  679. _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]);
  680. _self._tempEntitys.pop();
  681. },
  682. /**
  683. * 移动回调
  684. * @ignore
  685. * @param {Cesium.Cartesian3} cPoint
  686. * @param {JSON} scPoint 屏幕点
  687. */
  688. onMoving: function(cPoint, scPoint) {
  689. _self._tooltipSetText('右键单击回退<br>左键双击结束绘制');
  690. },
  691. /**
  692. * 错误回调
  693. * @ignore
  694. * @param {String} error 错误信息
  695. */
  696. onError: function(error) {
  697. if (callError) callError(error);
  698. },
  699. /**
  700. * 完成回调
  701. * @ignore
  702. * @param {Array<JSON>} cPoints 世界坐标系点集合
  703. * @param {Array<JSON>} gPoints 球面坐标系点集合
  704. */
  705. onComplete: function(cPoints, gPoints) {
  706. _self._initMousePointerStyle();
  707. _self._tooltipRemove();
  708. }
  709. });
  710. } else {
  711. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, {
  712. /**
  713. * 添加点回调
  714. * @ignore
  715. * @param {Array<JSON>} cPoints 世界坐标系点集合
  716. * @param {Array<JSON>} gPoints 球面坐标系点集合
  717. */
  718. onAdded: function(cPoints, gPoints) {
  719. if (cPoints.length === 1) {
  720. // 移除提示标签
  721. _self._tooltipRemove();
  722. _self._createPoint(cPoints[0], '起点');
  723. let buttonDiv = document.getElementById("drawButtonDiv");
  724. if (buttonDiv == null) {
  725. //创建按钮
  726. _self._createOperationMainDom();
  727. //撤销
  728. document.getElementById("btnDrawBackout").onclick = () => {
  729. if (_self._sketchViewModel._sketchTempPoints.length > 2) {
  730. /* 移除正式点最有一个元素 */
  731. _self._sketchViewModel._sketchPoints.pop();
  732. /* 移除临时点倒数第二个元素 */
  733. _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1);
  734. /* 如果绘制了点 则删除最后一个 */
  735. if (_self._sketchViewModel._isDrawPoint) {
  736. let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1];
  737. _self._sketchViewModel._entities.remove(lastPointEntity);
  738. /* 移除点实体数据中的最后一条数据 */
  739. _self._sketchViewModel._pointEntitys.pop();
  740. }
  741. _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]);
  742. _self._tempEntitys.pop();
  743. }
  744. }
  745. //完成绘制
  746. document.getElementById("btnDrawComplete").onclick = () => {
  747. if (_self._sketchViewModel._sketchPoints.length < 2) {
  748. if (callError) callError("点数少于两个,禁止结束绘制!");
  749. return;
  750. }
  751. /* 删除临时线 */
  752. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline);
  753. /* 绘制正式线 */
  754. _self._sketchViewModel._createPolyline();
  755. /* 删除标记点 */
  756. if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys();
  757. /* 干掉事件句柄 释放资源*/
  758. _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler);
  759. _self._initMousePointerStyle();
  760. _self._tooltipRemove();
  761. let buttonDiv = document.getElementById("drawButtonDiv");
  762. if (buttonDiv) {
  763. //从页面移除
  764. document.body.removeChild(buttonDiv);
  765. }
  766. }
  767. }
  768. } else {
  769. let distince = _self._measureDistance(cPoints);
  770. /* 追加中间距离 */
  771. let tempPoints = [cPoints[cPoints.length - 2], cPoints[cPoints.length - 1]];
  772. distince += ' +' + _self._measureDistance(tempPoints);
  773. _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince));
  774. }
  775. },
  776. });
  777. }
  778. },
  779. /**
  780. * 空间距离测量
  781. */
  782. measureSpatialLength: function(callError) {
  783. let _self = this;
  784. /* 清理资源 */
  785. this._clear(this._isClear);
  786. /* 设置鼠标样式 */
  787. this._setMousePointerStyle();
  788. /* 设置提示标签 */
  789. if (this._isRuntimeApp()) {
  790. this._showTooltipMessage("点击开始测量");
  791. } else {
  792. this._tooltipInit('点击开始测量');
  793. }
  794. /* 临时创建的实体 */
  795. this._tempEntitys = [];
  796. /* 调用草图开始绘制 */
  797. if (this._isRuntimeWeb()) {
  798. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Spatial, {
  799. /**
  800. * 添加点回调
  801. * @ignore
  802. * @param {Array<JSON>} cPoints 世界坐标系点集合
  803. * @param {Array<JSON>} gPoints 球面坐标系点集合
  804. */
  805. onAdded: function(cPoints, gPoints) {
  806. if (cPoints.length === 1) {
  807. _self._createPoint(cPoints[0], '起点');
  808. } else {
  809. let distince = _self._measureSpaceDistance(cPoints);
  810. _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1],
  811. distince));
  812. }
  813. },
  814. /**
  815. * 撤销回调
  816. * @ignore
  817. */
  818. onUndo: function() {
  819. _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]);
  820. _self._tempEntitys.pop();
  821. },
  822. /**
  823. * 移动回调
  824. * @ignore
  825. * @param {Cesium.Cartesian3} cPoint
  826. * @param {JSON} scPoint 屏幕点
  827. */
  828. onMoving: function(cPoint, scPoint) {
  829. _self._tooltipSetText('右键单击回退<br>左键双击结束绘制');
  830. },
  831. /**
  832. * 错误回调
  833. * @ignore
  834. * @param {String} error 错误信息
  835. */
  836. onError: function(error) {
  837. if (callError) callError(error);
  838. },
  839. /**
  840. * 完成回调
  841. * @ignore
  842. * @param {Array<JSON>} cPoints 世界坐标系点集合
  843. * @param {Array<JSON>} gPoints 球面坐标系点集合
  844. */
  845. onComplete: function(cPoints, gPoints) {
  846. _self._initMousePointerStyle();
  847. _self._tooltipRemove();
  848. }
  849. });
  850. } else {
  851. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Spatial, {
  852. /**
  853. * 添加点回调
  854. * @ignore
  855. * @param {Array<JSON>} cPoints 世界坐标系点集合
  856. * @param {Array<JSON>} gPoints 球面坐标系点集合
  857. */
  858. onAdded: function(cPoints, gPoints) {
  859. if (cPoints.length === 1) {
  860. // 移除提示标签
  861. _self._tooltipRemove();
  862. _self._createPoint(cPoints[0], '起点');
  863. let buttonDiv = document.getElementById("drawButtonDiv");
  864. if (buttonDiv == null) {
  865. //创建按钮
  866. _self._createOperationMainDom();
  867. //撤销
  868. document.getElementById("btnDrawBackout").onclick = () => {
  869. if (_self._sketchViewModel._sketchTempPoints.length > 2) {
  870. /* 移除正式点最有一个元素 */
  871. _self._sketchViewModel._sketchPoints.pop();
  872. /* 移除临时点倒数第二个元素 */
  873. _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1);
  874. _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]);
  875. _self._tempEntitys.pop();
  876. }
  877. }
  878. //完成绘制
  879. document.getElementById("btnDrawComplete").onclick = () => {
  880. if (_self._sketchViewModel._sketchPoints.length < 2) {
  881. if (callError) callError("点数少于两个,禁止结束绘制!");
  882. return;
  883. }
  884. /* 删除临时空间线 */
  885. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempSpatialPolyline);
  886. /* 绘制正式空间线 */
  887. _self._sketchViewModel._createSpatialPolyline();
  888. /* 删除标记点 */
  889. _self._sketchViewModel._removePointEntitys();
  890. /* 干掉事件句柄 释放资源*/
  891. _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler);
  892. _self._initMousePointerStyle();
  893. _self._tooltipRemove();
  894. let buttonDiv = document.getElementById("drawButtonDiv");
  895. if (buttonDiv) {
  896. //从页面移除
  897. document.body.removeChild(buttonDiv);
  898. }
  899. }
  900. }
  901. } else {
  902. let distince = _self._measureSpaceDistance(cPoints);
  903. _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince));
  904. }
  905. },
  906. });
  907. }
  908. },
  909. /**
  910. * 测量面积
  911. */
  912. measureArea: function(callError) {
  913. let _self = this;
  914. /* 清理资源 */
  915. this._clear(this._isClear);
  916. /* 设置鼠标样式 */
  917. this._setMousePointerStyle();
  918. /* 设置提示工具 */
  919. if (this._isRuntimeApp()) {
  920. this._showTooltipMessage("点击开始测量");
  921. } else {
  922. this._tooltipInit('点击开始测量');
  923. }
  924. var _areaLabel = ""; //面积提示
  925. /* 调用草图开始绘制 */
  926. if (this._isRuntimeWeb()) {
  927. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, {
  928. /**
  929. * 添加点回调
  930. * @ignore
  931. * @param {Array<JSON>} cPoints 世界坐标系点集合
  932. * @param {Array<JSON>} gPoints 球面坐标系点集合
  933. */
  934. onAdded: function(cPoints, gPoints) {
  935. _self._measureTempPoints.push(_self._cartesianToGeography(cPoints[cPoints.length - 1]));
  936. if (cPoints.length === 1) {
  937. _areaLabel = '起点';
  938. var areaLabel = _self._createPoint(cPoints[0], new Cesium.CallbackProperty(function() {
  939. var lable = _areaLabel
  940. return lable;
  941. }, false));
  942. } else if (cPoints.length >= 3) {
  943. let area = _self._measureArea(_self._measureTempPoints, cPoints);
  944. if (area > 100000) {
  945. _areaLabel = (area / 100000).toFixed(2) + "km²";
  946. } else {
  947. _areaLabel = area.toFixed(2) + "m²";
  948. }
  949. }
  950. },
  951. /**
  952. * 撤销回调
  953. * @ignore
  954. */
  955. onUndo: function() {
  956. _self._measureTempPoints.pop();
  957. if (_self._measureTempPoints.length === 1) _self._areaLabel = "起点";
  958. },
  959. /**
  960. * 移动回调
  961. * @ignore
  962. * @param {Cesium.Cartesian3} cPoint
  963. * @param {JSON} scPoint 屏幕点
  964. */
  965. onMoving: function(cPoint, scPoint) {
  966. _self._tooltipSetText('右键单击回退<br>左键双击结束绘制');
  967. },
  968. /**
  969. * 错误回调
  970. * @ignore
  971. * @param {String} error 错误信息
  972. */
  973. onError: function(error) {
  974. if (callError) callError(error);
  975. },
  976. /**
  977. * 完成回调
  978. * @ignore
  979. * @param {Array<JSON>} cPoints 世界坐标系点集合
  980. * @param {Array<JSON>} gPoints 球面坐标系点集合
  981. */
  982. onComplete: function(cPoints, gPoints) {
  983. _self._initMousePointerStyle();
  984. _self._tooltipRemove();
  985. }
  986. });
  987. } else {
  988. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, {
  989. /**
  990. * 添加点回调
  991. * @ignore
  992. * @param {Array<JSON>} cPoints 世界坐标系点集合
  993. * @param {Array<JSON>} gPoints 球面坐标系点集合
  994. */
  995. onAdded: function(cPoints, gPoints) {
  996. _self._measureTempPoints.push(_self._cartesianToGeography(cPoints[cPoints.length - 1]));
  997. if (cPoints.length === 1) {
  998. // 移除提示标签
  999. _self._tooltipRemove();
  1000. _areaLabel = '起点';
  1001. var areaLabel = _self._createPoint(cPoints[0], new Cesium.CallbackProperty(function() {
  1002. var lable = _areaLabel
  1003. return lable;
  1004. }, false));
  1005. let buttonDiv = document.getElementById("drawButtonDiv");
  1006. if (buttonDiv == null) {
  1007. //创建按钮
  1008. _self._createOperationMainDom();
  1009. //撤销
  1010. document.getElementById("btnDrawBackout").onclick = () => {
  1011. if (_self._sketchViewModel._sketchTempPoints.length > 2) {
  1012. /* 移除正式点最有一个元素 */
  1013. _self._sketchViewModel._sketchPoints.pop();
  1014. /* 移除临时点倒数第二个元素 */
  1015. _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1);
  1016. /* 如果绘制了点 则删除最后一个 */
  1017. if (_self._sketchViewModel._isDrawPoint) {
  1018. let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1];
  1019. _self._entities.remove(lastPointEntity);
  1020. /* 移除点实体数据中的最后一条数据 */
  1021. _self._sketchViewModel._pointEntitys.pop();
  1022. }
  1023. _self._measureTempPoints.pop();
  1024. if (_self._measureTempPoints.length === 1) _self._areaLabel = "起点";
  1025. }
  1026. }
  1027. //完成绘制
  1028. document.getElementById("btnDrawComplete").onclick = () => {
  1029. if (_self._sketchViewModel._sketchPoints.length < 3) {
  1030. if (callError) callError("点数少于3个,禁止结束绘制!");
  1031. return;
  1032. }
  1033. /* 删除临时线和面 */
  1034. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolygon);
  1035. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline);
  1036. /* 绘制正式面 */
  1037. _self._sketchViewModel._createPolygon();
  1038. /* 删除标记点 */
  1039. if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys();
  1040. /* 干掉事件句柄 释放资源*/
  1041. _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler);
  1042. _self._initMousePointerStyle();
  1043. _self._tooltipRemove();
  1044. let buttonDiv = document.getElementById("drawButtonDiv");
  1045. if (buttonDiv) {
  1046. //从页面移除
  1047. document.body.removeChild(buttonDiv);
  1048. }
  1049. }
  1050. }
  1051. } else if (cPoints.length >= 3) {
  1052. let area = _self._measureArea(_self._measureTempPoints, cPoints);
  1053. if (area > 100000) {
  1054. _areaLabel = (area / 100000).toFixed(2) + "km²";
  1055. } else {
  1056. _areaLabel = area.toFixed(2) + "m²";
  1057. }
  1058. }
  1059. },
  1060. });
  1061. }
  1062. },
  1063. /**
  1064. * 高度测量
  1065. */
  1066. measureHeight: function(callError) {
  1067. let _self = this;
  1068. /* 清理资源 */
  1069. this._clear(this._isClear);
  1070. /* 设置鼠标样式 */
  1071. this._setMousePointerStyle();
  1072. /* 设置提示标签 */
  1073. if (this._isRuntimeApp()) {
  1074. this._showTooltipMessage("点击开始绘制线");
  1075. } else {
  1076. this._tooltipInit('单击开始绘制线');
  1077. }
  1078. /* 调用草图开始绘制 */
  1079. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Height, {
  1080. /**
  1081. * 添加回调
  1082. * @ignore
  1083. * @param {Cesium.Cartesian3} cPoint 点
  1084. */
  1085. onAdded: function(cPoint) {
  1086. if (_self._isRuntimeApp()) {
  1087. _self._showTooltipMessage("再次点击结束测量");
  1088. } else {
  1089. _self._tooltipSetText('再次单击结束测量');
  1090. }
  1091. },
  1092. /**
  1093. * 移动回调
  1094. * @ignore
  1095. * @param {Array<JSON>} cPoints 高度线集合
  1096. * @param {Cesium.Cartesian3} centerPoint 顶端中心点
  1097. */
  1098. onMoving: function(cPoints, centerPoint) {
  1099. let height = _self._calculatePolylineAltitudeHeight(cPoints);
  1100. _self._altitudeLabelPosition = centerPoint;
  1101. _self._altitudeLabelText = height;
  1102. if (_self._altitudeDynamicLabel === undefined) {
  1103. _self._createAltitudeDynamicLabel();
  1104. }
  1105. },
  1106. /**
  1107. * 错误回调
  1108. * @ignore
  1109. * @param {String} error 错误信息
  1110. */
  1111. onError: function(error) {
  1112. if (callError) callError(error);
  1113. },
  1114. /**
  1115. * 完成回调
  1116. * @ignore
  1117. * @param {Array<JSON>} Points 高度线集合
  1118. * @param {Cesium.Cartesian3} centerPoint 顶端中心点
  1119. */
  1120. onComplete: function(cPoints, centerPoint) {
  1121. let height = _self._calculatePolylineAltitudeHeight(cPoints);
  1122. /* 干掉临时创建的 */
  1123. _self._entities.remove(_self._altitudeDynamicLabel);
  1124. /* 创建正式的 */
  1125. _self._createLabel(centerPoint, height);
  1126. /* 恢复鼠标样式 */
  1127. _self._initMousePointerStyle();
  1128. /* 移除提示标签 */
  1129. _self._tooltipRemove();
  1130. }
  1131. });
  1132. },
  1133. /**
  1134. * 三角测量
  1135. */
  1136. measureTriangle: function(callError) {
  1137. let _self = this;
  1138. /* 清理资源 */
  1139. this._clear(this._isClear);
  1140. /* 设置鼠标样式 */
  1141. this._setMousePointerStyle();
  1142. /* 设置提示标签 */
  1143. if (this._isRuntimeApp()) {
  1144. this._showTooltipMessage("点击开始绘制线");
  1145. } else {
  1146. this._tooltipInit('单击开始绘制线');
  1147. }
  1148. /* 调用草图开始绘制 */
  1149. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Triangle, {
  1150. /**
  1151. * 添加回调
  1152. * @ignore
  1153. * @param {Cesium.Cartesian3} cPoint 点
  1154. */
  1155. onAdded: function(cPoint) {
  1156. if (_self._isRuntimeApp()) {
  1157. _self._showTooltipMessage("再次点击结束测量");
  1158. } else {
  1159. _self._tooltipSetText('再次单击结束测量');
  1160. }
  1161. },
  1162. /**
  1163. * 移动回调
  1164. * @ignore
  1165. * @param {Cesium.Cartesian3} cPoint 当前点
  1166. */
  1167. onMoving: function(cPoint) {
  1168. _self._tooltipSetText('再次单击结束测量');
  1169. },
  1170. /**
  1171. * 错误回调
  1172. * @ignore
  1173. * @param {String} error 错误信息
  1174. */
  1175. onError: function(error) {
  1176. if (callError) callError(error);
  1177. },
  1178. /**
  1179. * @ignore
  1180. * @param {Cesium.Cartesian3} positions 高度顶端中心点坐标
  1181. */
  1182. onComplete: function(positions) {
  1183. /* 恢复鼠标初始样式 */
  1184. _self._initMousePointerStyle();
  1185. /* 移除提示标签 */
  1186. _self._tooltipRemove();
  1187. /* 倾斜距离点集合 */
  1188. let sPoints = [positions[0], positions[1]];
  1189. let sDistince = _self._measureSpaceDistance(sPoints);
  1190. /* 平面距离点集合 */
  1191. let hPoints = [positions[1], positions[2]];
  1192. let hDistince = _self._measureSpaceDistance(hPoints);
  1193. /* 高度点*/
  1194. let hePoints = [positions[2], positions[0]];
  1195. let height = _self._calculatePolylineAltitudeHeight(hePoints);
  1196. /* 创建正式的 */
  1197. _self._createLabel(positions[0], '斜距:' + sDistince);
  1198. _self._createLabel(positions[1], '平距:' + hDistince);
  1199. _self._createLabel(positions[2], '高度:' + height);
  1200. }
  1201. });
  1202. }
  1203. })
  1204. /**
  1205. * 查询工具类对外公开函数
  1206. */
  1207. Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ {
  1208. /**
  1209. * 点查询
  1210. * @param {String} callComplete 成功回调callComplete(coordinates)
  1211. */
  1212. queryByPoint: function(callComplete) {
  1213. let _self = this;
  1214. /* 设置鼠标样式 */
  1215. this._setMousePointerStyle();
  1216. /* 清理资源 */
  1217. this._clear(this._isClear);
  1218. /* 设置鼠标跟随 */
  1219. if (this._isRuntimeApp()) {
  1220. this._showTooltipMessage("点击位置进行查询");
  1221. } else {
  1222. this._tooltipInit('单击位置进行查询');
  1223. }
  1224. /* 调用草图开始绘制 */
  1225. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Point, {
  1226. /**
  1227. * 完成回调
  1228. * @ignore
  1229. * @param {Cesium.Cartesian3} cPoint 世界坐标系点
  1230. * @param {JSON} gPoint 经纬度坐标系点
  1231. */
  1232. onComplete: function(cPoint, gPoint) {
  1233. /* 重置鼠标样式 */
  1234. _self._initMousePointerStyle();
  1235. /* 移除提示标签 */
  1236. _self._tooltipRemove();
  1237. _self._createPoint(cPoint);
  1238. let coordinates = gPoint.lng + ',' + gPoint.lat;
  1239. if (callComplete) callComplete(coordinates);
  1240. },
  1241. });
  1242. },
  1243. /**
  1244. * 多点查询
  1245. * @param {String} callComplete 成功回调callComplete(Array<Number>)
  1246. */
  1247. queryByMultiplePoint: function(callComplete) {
  1248. let _self = this;
  1249. /* 设置鼠标样式 */
  1250. this._setMousePointerStyle();
  1251. /* 清理资源 */
  1252. this._clear(this._isClear);
  1253. /* 设置鼠标跟随 */
  1254. this._tooltipInit("点击位置绘制<br>左键双击结束绘制");
  1255. /* 临时创建的实体 */
  1256. this._tempEntitys = [];
  1257. /* 调用草图开始绘制 */
  1258. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.MultiplePoint, {
  1259. /**
  1260. * 添加回调
  1261. * @ignore
  1262. * @param {Cesium.Cartesian3} cPoint 世界坐标系点
  1263. * @param {JSON} gPoint 经纬度坐标系点
  1264. */
  1265. onAdded: function(cPoint, gPoint) {
  1266. let res = gPoint.lng.toFixed(6) + "," + gPoint.lat.toFixed(6);
  1267. _self._tempEntitys.push(_self._createPoint(cPoint, res));
  1268. },
  1269. /**
  1270. * 撤销回调
  1271. * @ignore
  1272. */
  1273. onUndo: function() {
  1274. _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length -
  1275. 1]);
  1276. _self._tempEntitys.pop();
  1277. },
  1278. /**
  1279. * 完成回调
  1280. * @ignore
  1281. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1282. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1283. */
  1284. onComplete: function(cPoints, gPoints) {
  1285. /* 重置鼠标样式 */
  1286. _self._initMousePointerStyle();
  1287. /* 移除提示标签 */
  1288. _self._tooltipRemove();
  1289. /* 返回字符串数组 */
  1290. let res = [];
  1291. for (let i = 0; i < gPoints.length; i++) {
  1292. res.push(gPoints[i].lng);
  1293. res.push(gPoints[i].lat);
  1294. }
  1295. if (callComplete) callComplete(res);
  1296. },
  1297. });
  1298. },
  1299. /**
  1300. * 线查询
  1301. * @param {String} callComplete 成功回调callComplete(coordinates)
  1302. * @param {String} callError 失败回调callError(error)
  1303. */
  1304. queryByLine: function(callComplete, callError) {
  1305. let _self = this;
  1306. /* 清理资源 */
  1307. this._clear(this._isClear);
  1308. /* 设置鼠标样式 */
  1309. this._setMousePointerStyle();
  1310. /* 设置提示标签 */
  1311. if (this._isRuntimeApp()) {
  1312. this._showTooltipMessage("点击开始绘制线");
  1313. } else {
  1314. this._tooltipInit('单击开始绘制线');
  1315. }
  1316. /* 调用草图开始绘制 */
  1317. if (this._isRuntimeWeb()) {
  1318. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, {
  1319. /**
  1320. * 添加点回调
  1321. * @ignore
  1322. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1323. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1324. */
  1325. onAdded: function(cPoints, gPoints) {
  1326. },
  1327. /**
  1328. * 移动回调
  1329. * @ignore
  1330. * @param {Cesium.Cartesian3} cPoint
  1331. * @param {JSON} scPoint 屏幕点
  1332. */
  1333. onMoving: function(cPoint, scPoint) {
  1334. _self._tooltipSetText('右键单击回退<br>左键双击结束绘制开始查询');
  1335. },
  1336. /**
  1337. * 错误回调
  1338. * @ignore
  1339. * @param {String} error 错误信息
  1340. */
  1341. onError: function(error) {
  1342. if (callError) callError(error);
  1343. },
  1344. /**
  1345. * 完成回调
  1346. * @ignore
  1347. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1348. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1349. */
  1350. onComplete: function(cPoints, gPoints) {
  1351. /* 恢复鼠标样式 */
  1352. _self._initMousePointerStyle();
  1353. /* 移除提示标签 */
  1354. _self._tooltipRemove();
  1355. /* 返回坐标串 */
  1356. let coordinates = undefined;
  1357. for (let i = 0; i < gPoints.length; i++) {
  1358. let point = gPoints[i];
  1359. if (coordinates === undefined) coordinates = point.lng + ',' + point.lat;
  1360. else coordinates += ',' + point.lng + ',' + point.lat;
  1361. }
  1362. if (callComplete) callComplete(coordinates);
  1363. },
  1364. });
  1365. } else {
  1366. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, {
  1367. /**
  1368. * 添加点回调
  1369. * @ignore
  1370. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1371. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1372. */
  1373. onAdded: function(cPoints, gPoints) {
  1374. if (cPoints.length === 1) {
  1375. /* 移除提示标签 */
  1376. _self._tooltipRemove();
  1377. let buttonDiv = document.getElementById("drawButtonDiv");
  1378. if (buttonDiv == null) {
  1379. //创建按钮
  1380. _self._createOperationMainDom();
  1381. //撤销
  1382. document.getElementById("btnDrawBackout").onclick = () => {
  1383. if (_self._sketchViewModel._sketchTempPoints.length > 2) {
  1384. /* 移除正式点最有一个元素 */
  1385. _self._sketchViewModel._sketchPoints.pop();
  1386. /* 移除临时点倒数第二个元素 */
  1387. _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1);
  1388. /* 如果绘制了点 则删除最后一个 */
  1389. if (_self._sketchViewModel._isDrawPoint) {
  1390. let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1];
  1391. _self._sketchViewModel._entities.remove(lastPointEntity);
  1392. /* 移除点实体数据中的最后一条数据 */
  1393. _self._sketchViewModel._pointEntitys.pop();
  1394. }
  1395. }
  1396. }
  1397. //完成绘制
  1398. document.getElementById("btnDrawComplete").onclick = () => {
  1399. if (_self._sketchViewModel._sketchPoints.length < 2) {
  1400. if (callError) callError("点数少于两个,禁止结束绘制!");
  1401. return;
  1402. }
  1403. /* 删除临时线 */
  1404. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline);
  1405. /* 绘制正式线 */
  1406. _self._sketchViewModel._createPolyline();
  1407. /* 删除标记点 */
  1408. if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys();
  1409. /* 干掉事件句柄 释放资源*/
  1410. _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler);
  1411. /* 恢复鼠标样式 */
  1412. _self._initMousePointerStyle();
  1413. /* 移除提示标签 */
  1414. _self._tooltipRemove();
  1415. /* 返回坐标串 */
  1416. let coordinates = undefined;
  1417. for (let i = 0; i < gPoints.length; i++) {
  1418. let point = gPoints[i];
  1419. if (coordinates === undefined) coordinates = point.lng + ',' + point.lat;
  1420. else coordinates += ',' + point.lng + ',' + point.lat;
  1421. }
  1422. let buttonDiv = document.getElementById("drawButtonDiv");
  1423. if (buttonDiv) {
  1424. //从页面移除
  1425. document.body.removeChild(buttonDiv);
  1426. }
  1427. if (callComplete) callComplete(coordinates);
  1428. }
  1429. }
  1430. }
  1431. },
  1432. });
  1433. }
  1434. },
  1435. /**
  1436. * 区域查询
  1437. * @param {String} callComplete 成功回调callComplete(coordinates)
  1438. * @param {String} callError 失败回调callError(error)
  1439. */
  1440. queryByPolygon: function(callComplete, callError) {
  1441. let _self = this;
  1442. /* 清理资源 */
  1443. this._clear(this._isClear);
  1444. /* 设置鼠标样式 */
  1445. this._setMousePointerStyle();
  1446. /* 设置提示标签 */
  1447. if (this._isRuntimeApp()) {
  1448. this._showTooltipMessage("点击开始绘制区域");
  1449. } else {
  1450. this._tooltipInit('单击开始绘制区域');
  1451. }
  1452. /* 调用草图开始绘制 */
  1453. if (this._isRuntimeWeb()) {
  1454. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, {
  1455. /**
  1456. * 移动回调
  1457. * @ignore
  1458. * @param {Cesium.Cartesian3} cPoint
  1459. * @param {JSON} scPoint 屏幕点
  1460. */
  1461. onMoving: function(cPoint, scPoint) {
  1462. _self._tooltipSetText('右键单击回退<br>左键双击结束绘制开始查询');
  1463. },
  1464. /**
  1465. * 错误回调
  1466. * @ignore
  1467. * @param {String} error 错误信息
  1468. */
  1469. onError: function(error) {
  1470. if (callError) callError(error);
  1471. },
  1472. /**
  1473. * 完成回调
  1474. * @ignore
  1475. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1476. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1477. */
  1478. onComplete: function(cPoints, gPoints) {
  1479. /* 重置鼠标样式 */
  1480. _self._initMousePointerStyle();
  1481. /* 移除提示标签 */
  1482. _self._tooltipRemove();
  1483. /* 返回坐标串 */
  1484. let coordinates = undefined;
  1485. for (let i = 0; i < gPoints.length; i++) {
  1486. let point = gPoints[i];
  1487. if (coordinates === undefined) coordinates = point.lng + ',' + point.lat;
  1488. else coordinates += ',' + point.lng + ',' + point.lat;
  1489. }
  1490. coordinates += ',' + gPoints[0].lng + ',' + gPoints[0].lat;
  1491. if (callComplete) callComplete(coordinates);
  1492. },
  1493. });
  1494. } else {
  1495. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, {
  1496. /**
  1497. * 添加点回调
  1498. * @ignore
  1499. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1500. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1501. */
  1502. onAdded: function(cPoints, gPoints) {
  1503. if (cPoints.length === 1) {
  1504. // 移除提示标签
  1505. _self._tooltipRemove();
  1506. let buttonDiv = document.getElementById("drawButtonDiv");
  1507. if (buttonDiv == null) {
  1508. //创建按钮
  1509. _self._createOperationMainDom();
  1510. //撤销
  1511. document.getElementById("btnDrawBackout").onclick = () => {
  1512. if (_self._sketchViewModel._sketchTempPoints.length > 2) {
  1513. /* 移除正式点最有一个元素 */
  1514. _self._sketchViewModel._sketchPoints.pop();
  1515. /* 移除临时点倒数第二个元素 */
  1516. _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1);
  1517. /* 如果绘制了点 则删除最后一个 */
  1518. if (_self._sketchViewModel._isDrawPoint) {
  1519. let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1];
  1520. _self._entities.remove(lastPointEntity);
  1521. /* 移除点实体数据中的最后一条数据 */
  1522. _self._sketchViewModel._pointEntitys.pop();
  1523. }
  1524. }
  1525. }
  1526. //完成绘制
  1527. document.getElementById("btnDrawComplete").onclick = () => {
  1528. if (_self._sketchViewModel._sketchPoints.length < 3) {
  1529. if (callError) callError("点数少于3个,禁止结束绘制!");
  1530. return;
  1531. }
  1532. /* 删除临时线和面 */
  1533. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolygon);
  1534. _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline);
  1535. /* 绘制正式面 */
  1536. _self._sketchViewModel._createPolygon();
  1537. /* 删除标记点 */
  1538. if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys();
  1539. /* 干掉事件句柄 释放资源*/
  1540. _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler);
  1541. /* 重置鼠标样式 */
  1542. _self._initMousePointerStyle();
  1543. /* 移除提示标签 */
  1544. _self._tooltipRemove();
  1545. /* 返回坐标串 */
  1546. let coordinates = undefined;
  1547. for (let i = 0; i < gPoints.length; i++) {
  1548. let point = gPoints[i];
  1549. if (coordinates === undefined) coordinates = point.lng + ',' + point.lat;
  1550. else coordinates += ',' + point.lng + ',' + point.lat;
  1551. }
  1552. coordinates += ',' + gPoints[0].lng + ',' + gPoints[0].lat;
  1553. let buttonDiv = document.getElementById("drawButtonDiv");
  1554. if (buttonDiv) {
  1555. //从页面移除
  1556. document.body.removeChild(buttonDiv);
  1557. }
  1558. if (callComplete) callComplete(coordinates);
  1559. }
  1560. }
  1561. }
  1562. },
  1563. });
  1564. }
  1565. },
  1566. /**
  1567. * 圆查询
  1568. * @param {String} callComplete 成功回调callComplete(center,radius)
  1569. */
  1570. queryByCircle: function(callComplete) {
  1571. let _self = this;
  1572. /* 清理资源 */
  1573. this._clear(this._isClear);
  1574. /* 设置鼠标样式 */
  1575. this._setMousePointerStyle();
  1576. /* 设置提示标签 */
  1577. if (this._isRuntimeApp()) {
  1578. this._showTooltipMessage("点击开始绘制圆");
  1579. } else {
  1580. this._tooltipInit('单击开始绘制圆');
  1581. }
  1582. /* 调用草图开始绘制 */
  1583. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Circle, {
  1584. /**
  1585. * 添加回调
  1586. * @ignore
  1587. * @param {JSON} center 中心点
  1588. */
  1589. onAdded: function(center) {
  1590. if (_self._isRuntimeApp()) {
  1591. _self._showTooltipMessage("再次点击结束绘制");
  1592. } else {
  1593. _self._tooltipInit('再次单击结束绘制');
  1594. }
  1595. },
  1596. /**
  1597. * 完成回调
  1598. * @ignore
  1599. * @param {JSON} center 中心点
  1600. * @param {Number} radius 半径
  1601. */
  1602. onComplete: function(center, radius) {
  1603. /* 恢复鼠标样式 */
  1604. _self._initMousePointerStyle();
  1605. /* 移除提示标签 */
  1606. _self._tooltipRemove();
  1607. /* 返回圆心坐标及半径 */
  1608. if (callComplete) callComplete(center.lng + "," + center.lat, radius);
  1609. },
  1610. });
  1611. },
  1612. /**
  1613. * 矩形查询
  1614. * @param {String} callComplete 成功回调callComplete(coordinates)
  1615. */
  1616. queryByRectangle: function(callComplete) {
  1617. let _self = this;
  1618. /* 清理资源 */
  1619. this._clear(this._isClear);
  1620. /* 设置鼠标样式 */
  1621. this._setMousePointerStyle();
  1622. /* 设置提示标签 */
  1623. if (this._isRuntimeApp()) {
  1624. this._showTooltipMessage("点击开始绘制矩形");
  1625. } else {
  1626. this._tooltipInit('单击开始绘制矩形');
  1627. }
  1628. /* 调用草图开始绘制 */
  1629. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Rectangle, {
  1630. /**
  1631. * 添加回调
  1632. * @ignore
  1633. * @param {JSON} center 中心点
  1634. */
  1635. onAdded: function(center) {
  1636. if (_self._isRuntimeApp()) {
  1637. _self._showTooltipMessage("再次点击结束绘制");
  1638. } else {
  1639. _self._tooltipInit('再次单击结束绘制');
  1640. }
  1641. },
  1642. /**
  1643. * 完成回调
  1644. * @ignore
  1645. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1646. */
  1647. onComplete: function(gPoints) {
  1648. /* 恢复鼠标样式 */
  1649. _self._initMousePointerStyle();
  1650. /* 移除提示标签 */
  1651. _self._tooltipRemove();
  1652. /* 返回坐标串 */
  1653. let coordinates = undefined;
  1654. for (let i = 0; i < gPoints.length; i++) {
  1655. let point = gPoints[i];
  1656. if (coordinates === undefined) coordinates = point.lng + ',' + point.lat;
  1657. else coordinates += ',' + point.lng + ',' + point.lat;
  1658. }
  1659. if (callComplete) callComplete(coordinates);
  1660. },
  1661. });
  1662. },
  1663. })
  1664. /**
  1665. * 根据坐标绘制相关图形对外公开函数
  1666. */
  1667. Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ {
  1668. /**
  1669. * 绘制面拉伸体
  1670. * @param {String} callComplete 成功回调callComplete()
  1671. */
  1672. drawPolygonBody: function(callComplete) {
  1673. let _self = this;
  1674. /* 清理资源 */
  1675. this._clear(this._isClear);
  1676. /* 设置鼠标样式 */
  1677. this._setMousePointerStyle();
  1678. /* 设置提示标签 */
  1679. this._tooltipInit('点击开始绘制');
  1680. /* 调用草图开始绘制 */
  1681. this._sketchViewModel.sketchTools(SketchViewModel.SketchType.PolygonBody, {
  1682. /**
  1683. * 添加点回调
  1684. * @ignore
  1685. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1686. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1687. */
  1688. onAdded: function(cPoints, gPoints) {
  1689. if (cPoints.length === 0) {
  1690. _self._tooltipInit('点击开始绘制');
  1691. } else if (cPoints.length < 3) {
  1692. _self._tooltipInit('右键单击回退');
  1693. } else {
  1694. _self._tooltipInit('右键单击回退<br>左键双击结束绘制');
  1695. }
  1696. },
  1697. /**
  1698. * 撤销回调
  1699. * @ignore
  1700. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1701. */
  1702. onUndo: function(cPoints) {
  1703. if (cPoints.length === 0) {
  1704. _self._tooltipInit('点击开始绘制');
  1705. } else if (cPoints.length < 3) {
  1706. _self._tooltipInit('右键单击回退');
  1707. } else {
  1708. _self._tooltipInit('右键单击回退<br>左键双击结束绘制');
  1709. }
  1710. },
  1711. /**
  1712. * 完成回调
  1713. * @ignore
  1714. * @param {Array<JSON>} cPoints 世界坐标系点集合
  1715. * @param {Array<JSON>} gPoints 球面坐标系点集合
  1716. */
  1717. onComplete: function(cPoints, gPoints) {
  1718. /* 恢复鼠标样式 */
  1719. _self._initMousePointerStyle();
  1720. /* 移除提示标签 */
  1721. _self._tooltipRemove();
  1722. /* 回调 */
  1723. if (callComplete) callComplete();
  1724. },
  1725. });
  1726. },
  1727. /**
  1728. * @param {Array<Number>} points 经纬度点集合
  1729. * @param {JSON} options 回调配置
  1730. * @param {Function} options.onComplete() 完成回调,可选
  1731. * @param {Function} options.onError(message) 错误回调
  1732. */
  1733. drawPointFeacture: function(points, options) {
  1734. this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPoint, options);
  1735. },
  1736. /**
  1737. * @param {Array<Number>} points 经纬度点集合
  1738. * @param {JSON} options 回调配置
  1739. * @param {Function} options.onComplete() 完成回调,可选
  1740. * @param {Function} options.onError(message) 错误回调
  1741. */
  1742. drawMultiplePointFeacture: function(points, options) {
  1743. this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawMultiplePoint, options);
  1744. },
  1745. /**
  1746. * @param {Array<Number>} points 经纬度点集合
  1747. * @param {JSON} options 回调配置
  1748. * @param {Function} options.onComplete() 完成回调,可选
  1749. * @param {Function} options.onError(message) 错误回调
  1750. */
  1751. drawPolylineFeacture: function(points, options) {
  1752. this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPolyline, options);
  1753. },
  1754. /**
  1755. * @param {Array<Number>} points 经纬度点集合
  1756. * @param {JSON} options 回调配置
  1757. * @param {Function} options.onComplete() 完成回调,可选
  1758. * @param {Function} options.onError(message) 错误回调
  1759. */
  1760. drawPolygonFeacture: function(points, options) {
  1761. this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPolygon, options);
  1762. }
  1763. })
  1764. /* 鼠标移动标签工具 */
  1765. Object.assign(CommonTools.prototype, {
  1766. /**
  1767. * 提示标签初始化
  1768. * @ignore
  1769. * @param {String} text 显示的文本内容
  1770. */
  1771. tooltipInit: function(text) {
  1772. this._tooltipInit(text);
  1773. },
  1774. /**
  1775. * 移除提示标签
  1776. * @ignore
  1777. */
  1778. tooltipRemove: function() {
  1779. this._tooltipRemove();
  1780. },
  1781. /**
  1782. * 设置提示标签文本
  1783. * @ignore
  1784. * @param {String} text 文本
  1785. */
  1786. tooltipSetText: function(text) {
  1787. this._tooltipSetText(text);
  1788. }
  1789. });
  1790. /* 其他工具 */
  1791. Object.assign(CommonTools.prototype, {
  1792. /**
  1793. * 拾取通过面对象拉伸绘制的体
  1794. * @ignore
  1795. * @param {Function} callComplete 完成回调callComplete({color:height})拾取失败或者未拾取则返回undefined
  1796. */
  1797. pickPolygonBody: function(callComplete) {
  1798. let _self = this;
  1799. this._sketchViewModel.sketchPick(function(options) {
  1800. if (options === undefined) {
  1801. if (callComplete) callComplete(undefined);
  1802. } else {
  1803. if (callComplete) callComplete({
  1804. color: options.color,
  1805. height: options.height,
  1806. });
  1807. }
  1808. })
  1809. },
  1810. /**
  1811. * 设置拾取的体对象样式及高度
  1812. * @ignore
  1813. * @param {JSON} options 配置项
  1814. * @param {Array<Number>} options.color 颜色[0~~255,0~255,0~255,0~1]
  1815. * @param {Number} options.height 高度
  1816. * @param {Function} options.onComplete(message) 完成回调,如果message为undefined则代表成功,否则为失败消息
  1817. */
  1818. setPolygonBody: function(options) {
  1819. this._sketchViewModel.sketchEditPickPolygonBody({
  1820. color: options.color,
  1821. height: options.height,
  1822. onComplete: options.onComplete
  1823. })
  1824. },
  1825. /**
  1826. * 移除拾取的体对象
  1827. * @ignore
  1828. * @param {Function} onComplete(message) 完成回调,message为undifined为成功,否则为失败消息
  1829. */
  1830. removePolygonBody: function(onComplete) {
  1831. this._sketchViewModel.sketchRemovePickPolygonBody(onComplete);
  1832. }
  1833. })
  1834. /**
  1835. * 运行环境类型
  1836. */
  1837. CommonTools.RuntimeEnvironment = Object.freeze(({
  1838. App: 'app',
  1839. Web: 'web'
  1840. }))
  1841. /* 输出 */
  1842. export default CommonTools