layer.js 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783
  1. /* 引入Cesium */
  2. // import * as Cesium from 'Cesium';
  3. import CoordTransform from "./common/CoordTransform";
  4. /**
  5. *流动纹理线
  6. */
  7. import PolylineDirectionMaterialProperty from "./PolylineObject/PolylineDirectionMaterialProperty.js";
  8. import WallMaterialProperty from "./WallObject/WallMaterialProperty.js";
  9. /**
  10. * 加载各类地图服务
  11. */
  12. class LoadMapData {
  13. /**
  14. * 默认初始化
  15. * @param {Object} viewer 三维场景
  16. *
  17. * @example
  18. *
  19. * 例1:
  20. * const layer = new LoadMapData(viewer);
  21. *
  22. */
  23. constructor(viewer) {
  24. if (!viewer) throw new Cesium.DeveloperError('no viewer object!');
  25. this._viewer = viewer;
  26. }
  27. /**
  28. * 添加ImageryProvider到地图中
  29. * @ignore 忽略注释,注释不生成Doc
  30. * @param {Object} provider 图层构建器
  31. * @return {String} 服务Id
  32. */
  33. _addImageryProvider(id, provider) {
  34. /* 加入到整体图层中 以便可以删除对应的图层 */
  35. window[id] = this._viewer.imageryLayers.addImageryProvider(provider);
  36. }
  37. /**
  38. * 在地图中移除ImageryProvider
  39. * @ignore 忽略注释,注释不生成Doc
  40. * @param {String} serviceId 服务Id
  41. */
  42. _removeImageryProvider(serviceId) {
  43. this._viewer.imageryLayers.remove(window[serviceId]); //移除图层
  44. window[serviceId] = null;
  45. }
  46. /**
  47. *Cesium中的地形类是直接通过不同的terrainProvider控制的,然后把某一个实例化的terrainProvider赋值给Viewer.terrainProvider来控制地形数据的显隐。所以Cesium中的地形图层只能有一个。
  48. * 添加terrainProvider到地图中(地形)
  49. * @ignore 忽略注释,注释不生成Doc
  50. * @param {Object} provider 图层构建器
  51. */
  52. _addTerrainProvider(provider) {
  53. this._viewer.terrainProvider = provider;
  54. }
  55. /**
  56. * 移除地形
  57. * @ignore 忽略注释,注释不生成Doc
  58. */
  59. _setEllipsoidTerrain() {
  60. this._viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider({});
  61. }
  62. /**
  63. * 添加scene.primitives到地图中(三维实景/白膜)
  64. * @ignore 忽略注释,注释不生成Doc
  65. * @param {Object} scenePrimitives
  66. */
  67. _addScenePrimitives(scenePrimitives) {
  68. /* 加入到整体图层中 以便可以删除对应的图层 */
  69. this._viewer.scene.primitives.add(scenePrimitives);;
  70. }
  71. /**
  72. * 在地图中移除scene.primitives
  73. * @ignore 忽略注释,注释不生成Doc
  74. * @param {String} serviceId 服务Id
  75. */
  76. _removeScenePrimitives(serviceId) {
  77. this._viewer.scene.primitives.remove(window[serviceId]); //移除图层
  78. window[serviceId] = null;
  79. }
  80. /**
  81. * 创建GUID
  82. * @ignore 忽略注释,注释不生成Doc
  83. * @return {String} 唯一标识符
  84. */
  85. _guid() {
  86. function S4() {
  87. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  88. }
  89. return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
  90. }
  91. /**
  92. * 地图纠偏
  93. * @ignore 忽略注释,注释不生成Doc
  94. * @param {Object} provider
  95. */
  96. _transformProjection(provider) {
  97. let webMercatorTilingScheme = provider.tilingScheme;
  98. let projection = webMercatorTilingScheme._projection;
  99. projection.x_project = projection.project;
  100. projection.project = function(cartographic) {
  101. let point;
  102. return (
  103. (point = CoordTransform.WGS84ToGCJ02(
  104. Cesium.Math.toDegrees(cartographic.longitude),
  105. Cesium.Math.toDegrees(cartographic.latitude)
  106. )),
  107. projection.x_project(
  108. new Cesium.Cartographic(
  109. Cesium.Math.toRadians(point[0]),
  110. Cesium.Math.toRadians(point[1])
  111. )
  112. )
  113. );
  114. };
  115. projection.x_unproject = projection.unproject;
  116. projection.unproject = function(cartesian) {
  117. let point,
  118. cartographic = projection.x_unproject(cartesian);
  119. return (
  120. (point = CoordTransform.GCJ02ToWGS84(
  121. Cesium.Math.toDegrees(cartographic.longitude),
  122. Cesium.Math.toDegrees(cartographic.latitude)
  123. )),
  124. new Cesium.Cartographic(
  125. Cesium.Math.toRadians(point[0]),
  126. Cesium.Math.toRadians(point[1])
  127. )
  128. );
  129. };
  130. return provider;
  131. }
  132. }
  133. /**
  134. * 通用对外公开函数
  135. */
  136. Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
  137. /**
  138. * 添加地形
  139. * @function
  140. * @param {Object} options 具有以下属性:
  141. * @param {String} options.url 地形服务url
  142. * @param {Number} [options.terrainExaggeration=1] 地形夸张系数
  143. * @param {Number} [options.requestVertexNormals=false] 请求地形照明数据
  144. * @param {Number} [options.requestWaterMask=false] 请求水体效果所需要的海岸线数据
  145. *
  146. * @example
  147. * layer.addTerrain({
  148. * url: "http://data.marsgis.cn/terrain"
  149. * });
  150. *
  151. */
  152. addTerrain(options) {
  153. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  154. throw new Cesium.DeveloperError("options.url is required.");
  155. }
  156. let _ConstructorOptions = {
  157. url: options.url
  158. };
  159. // 请求地形照明数据
  160. if (options.requestVertexNormals) {
  161. _ConstructorOptions.requestVertexNormals = options.requestVertexNormals;
  162. } else {
  163. _ConstructorOptions.requestVertexNormals = false;
  164. }
  165. // 请求水体效果所需要的海岸线数据
  166. if (options.requestWaterMask) {
  167. _ConstructorOptions.requestWaterMask = options.requestWaterMask;
  168. } else {
  169. _ConstructorOptions.requestWaterMask = false;
  170. }
  171. var terrainProvider = new Cesium.CesiumTerrainProvider(_ConstructorOptions);
  172. this._addTerrainProvider(terrainProvider);
  173. // 地形夸张
  174. this.setTerrainExaggeration(options)
  175. },
  176. /**
  177. * 添加Mapbox图层
  178. * @param {Object} options 具有以下属性:
  179. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  180. * @param {String} [options.url='https://api.mapbox.com/styles/v1/'] Mapbox服务器url.
  181. * @param {String} [options.username='mapbox'] 映射帐户的用户名.
  182. * @param {String} options.styleId Mapbox样式ID.
  183. * @param {String} options.accessToken 图像的公共访问令牌.
  184. * @param {Boolean} [options.scaleFactor] 定瓷砖是否以@2倍的比例因子呈现
  185. * @param {Number} [options.alpha=1] 透明度
  186. * @return {String} 服务Id
  187. *
  188. * @example
  189. * layer.addMapboxLayer({
  190. * styleId: 'streets-v11',
  191. * accessToken: 'thisIsMyAccessToken'
  192. * },function (serviceId) {
  193. *
  194. * });
  195. *
  196. */
  197. addMapboxLayer(options, callSuccess) {
  198. if (!Cesium.defined(options) || !Cesium.defined(options.styleId)) {
  199. throw new Cesium.DeveloperError("options.styleId is required.");
  200. }
  201. if (!Cesium.defined(options.accessToken)) {
  202. throw new Cesium.DeveloperError("options.accessToken is required.");
  203. }
  204. options.id = options.id || this._guid();
  205. var imageryProvider = new Cesium.MapboxStyleImageryProvider({
  206. url: options.url,
  207. username: options.username,
  208. styleId: options.styleId,
  209. accessToken: options.accessToken,
  210. scaleFactor: options.scaleFactor
  211. });
  212. /* 加入图层 */
  213. this._addImageryProvider(options.id, imageryProvider);
  214. //设置透明度
  215. this.setLayersStyle({
  216. serviceId: options.id,
  217. alpha: options.alpha
  218. });
  219. if (callSuccess) callSuccess(options.id);
  220. },
  221. /**
  222. * 加载URL模板服务
  223. * @param {Object} options 具有以下属性:
  224. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  225. * @param {string} options.url 服务地址
  226. * @param {string} [options.CRS] 坐标系,纠偏-“WGS84”
  227. * @param {Number} [options.minimumLevel=0] 最小层级
  228. * @param {Number} [options.maximumLevel=18] 最大层级
  229. * @param {Number} [options.alpha=1] 透明度
  230. * @return {String} 服务Id
  231. *
  232. * @example
  233. * layer.addUrlTemplateImagery({
  234. * url: 'https://yoururl/{Time}/{z}/{y}/{x}.png'
  235. * },function (serviceId) {
  236. *
  237. * });
  238. *
  239. */
  240. addUrlTemplateImagery: function(options, callSuccess) {
  241. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  242. throw new Cesium.DeveloperError("options.url is required.");
  243. }
  244. options.id = options.id || this._guid();
  245. options.CRS = options.CRS || "";
  246. let _ConstructorOptions = {
  247. url: options.url
  248. };
  249. if (options.minimumLevel) {
  250. _ConstructorOptions.minimumLevel = options.minimumLevel;
  251. }
  252. if (options.maximumLevel) {
  253. _ConstructorOptions.maximumLevel = options.maximumLevel;
  254. } else {
  255. _ConstructorOptions.maximumLevel = 18;
  256. }
  257. var imageryProvider = new Cesium.UrlTemplateImageryProvider(_ConstructorOptions);
  258. if (options.CRS.toUpperCase() === "WGS84") {
  259. imageryProvider.readyPromise.then(() => {
  260. this._transformProjection(imageryProvider);
  261. });
  262. }
  263. /* 加入图层 */
  264. this._addImageryProvider(options.id, imageryProvider);
  265. //设置透明度
  266. this.setLayersStyle({
  267. serviceId: options.id,
  268. alpha: options.alpha
  269. });
  270. if (callSuccess) callSuccess(options.id);
  271. },
  272. /**
  273. * @description:加载-TMS-地图服务
  274. * @param {Object} options 具有以下属性:
  275. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  276. * @param {string} options.url 服务地址
  277. * @param {Number} [options.minimumLevel=0] 最小层级
  278. * @param {Number} [options.maximumLevel] 最大层级
  279. * @param {Number} [options.alpha=1] 透明度
  280. * @return {String} 服务Id
  281. *
  282. * @example
  283. * layer.addTileMapServiceImagery({
  284. * url: ''
  285. * },function (serviceId) {
  286. *
  287. * });
  288. *
  289. */
  290. addTileMapServiceImagery: function(options, callSuccess) {
  291. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  292. throw new Cesium.DeveloperError("options.url is required.");
  293. }
  294. options.id = options.id || this._guid();
  295. let _ConstructorOptions = {
  296. url: options.url
  297. };
  298. if (options.minimumLevel) {
  299. _ConstructorOptions.minimumLevel = options.minimumLevel;
  300. }
  301. if (options.maximumLevel) {
  302. _ConstructorOptions.maximumLevel = options.maximumLevel;
  303. } else {
  304. _ConstructorOptions.maximumLevel = 18;
  305. }
  306. var imageryProvider = new Cesium.TileMapServiceImageryProvider(_ConstructorOptions);
  307. /* 加入图层 */
  308. this._addImageryProvider(options.id, imageryProvider);
  309. //设置透明度
  310. this.setLayersStyle({
  311. serviceId: options.id,
  312. alpha: options.alpha
  313. });
  314. if (callSuccess) callSuccess(options.id);
  315. },
  316. /**
  317. * 加载-WMTS-地图服务
  318. * @param {Object} options 具有以下属性:
  319. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  320. * @param {string} options.url 服务地址
  321. * @param {string} options.layers 图层集合,WMTS请求的层名
  322. * @param {string} options.style 图层样式,WMTS请求的样式名
  323. * @param {string} options.tileMatrixSetID 用于WMTS请求的TileMatrixSet的标识符。
  324. * @param {Array} [options.tileMatrixLabels] TileMatrix中用于WMTS请求的标识符列表,每个TileMatrix级别一个标识符。
  325. * @param {string} [options.format='image/png'] 从服务器检索图像的MIME类型
  326. * @param {Number} [options.minimumLevel=0] 最小层级
  327. * @param {Number} [options.maximumLevel] 最大层级
  328. * @param {Number} [options.alpha=1] 透明度
  329. * @return {String} 服务Id
  330. *
  331. * @example
  332. * layer.addWebMapTileService({
  333. * url: 'http://t0.tianditu.gov.cn/cia_w/wmts?tk=10f42f91b6e50d2a8eec980577e6a2e6', //加载全国中文注记(经纬度)
  334. * layers: 'cia',
  335. * style: 'default',
  336. * tileMatrixSetID: 'w',
  337. * format: 'tiles',
  338. * maximumLevel: 18
  339. * },function (serviceId) {
  340. *
  341. * });
  342. *
  343. */
  344. addWebMapTileService: function(options, callSuccess) {
  345. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  346. throw new Cesium.DeveloperError("options.url is required.");
  347. }
  348. if (!Cesium.defined(options.layers)) {
  349. throw new Cesium.DeveloperError("options.layers is required.");
  350. }
  351. if (!Cesium.defined(options.style)) {
  352. throw new Cesium.DeveloperError("options.style is required.");
  353. }
  354. if (!Cesium.defined(options.tileMatrixSetID)) {
  355. throw new Cesium.DeveloperError("options.tileMatrixSetID is required.");
  356. }
  357. options.id = options.id || this._guid();
  358. let _ConstructorOptions = {
  359. url: options.url,
  360. layer: options.layers,
  361. style: options.style,
  362. tileMatrixSetID: options.tileMatrixSetID,
  363. format: Cesium.defaultValue(options.format, 'image/png'),
  364. };
  365. if (options.tileMatrixLabels) {
  366. _ConstructorOptions.tileMatrixLabels = options.tileMatrixLabels;
  367. }
  368. if (options.minimumLevel) {
  369. _ConstructorOptions.minimumLevel = options.minimumLevel;
  370. }
  371. if (options.maximumLevel) {
  372. _ConstructorOptions.maximumLevel = options.maximumLevel;
  373. } else {
  374. _ConstructorOptions.maximumLevel = 18;
  375. }
  376. let imageryProvider = new Cesium.WebMapTileServiceImageryProvider(_ConstructorOptions);
  377. /* 加入图层 */
  378. this._addImageryProvider(options.id, imageryProvider);
  379. //设置透明度
  380. this.setLayersStyle({
  381. serviceId: options.id,
  382. alpha: options.alpha
  383. });
  384. if (callSuccess) callSuccess(options.id);
  385. },
  386. /**
  387. * 提供由Web地图服务(WMS)服务器托管的平铺图像。
  388. * @param {Object} options 具有以下属性:
  389. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  390. * @param {string} options.url 服务地址
  391. * @param {string} options.layers 加载图层目录,要包含的层,用逗号分隔。
  392. * @param {Number} [options.parameters={
  393. service:'WMS',
  394. version:'1.1.1',
  395. request:'GetMap',
  396. styles:'',
  397. format:'image/jpeg'
  398. }] 基础参数
  399. * @param {Number} [options.minimumLevel=0] 最小层级
  400. * @param {Number} [options.maximumLevel] 最大层级
  401. * @param {Number} [options.alpha=1] 透明度
  402. * @return {String} 服务Id
  403. *
  404. * @example
  405. * layer.addWebMapService({
  406. * url : 'https://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer',
  407. * layers : '0',
  408. * },function (serviceId) {
  409. *
  410. * });
  411. *
  412. */
  413. addWebMapService: function(options, callSuccess) {
  414. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  415. throw new Cesium.DeveloperError("options.url is required.");
  416. }
  417. if (!Cesium.defined(options.layers)) {
  418. throw new Cesium.DeveloperError("options.layers is required.");
  419. }
  420. options.id = options.id || this._guid();
  421. let _ConstructorOptions = {
  422. url: options.url,
  423. layers: options.layers,
  424. };
  425. if (options.parameters) {
  426. _ConstructorOptions.parameters = options.parameters;
  427. } else {
  428. _ConstructorOptions.parameters = {
  429. service: 'WMS',
  430. transparent: true, //是否透明
  431. request: "GetMap", //添加上则显示,好像变成了必填
  432. format: "image/png",
  433. }
  434. }
  435. if (options.minimumLevel) {
  436. _ConstructorOptions.minimumLevel = options.minimumLevel;
  437. }
  438. if (options.maximumLevel) {
  439. _ConstructorOptions.maximumLevel = options.maximumLevel;
  440. } else {
  441. _ConstructorOptions.maximumLevel = 18;
  442. }
  443. let imageryProvider = new Cesium.WebMapServiceImageryProvider(_ConstructorOptions);
  444. /* 加入图层 */
  445. this._addImageryProvider(options.id, imageryProvider);
  446. //设置透明度
  447. this.setLayersStyle({
  448. serviceId: options.id,
  449. alpha: options.alpha
  450. });
  451. if (callSuccess) callSuccess(options.id);
  452. },
  453. /**
  454. * 提供由 ArcGIS MapServer 托管的切片图像(ArcGIS Online和Server的相关服务)。默认情况下,使用服务器的预缓存切片(如果可用)。
  455. * @param {Object} options 具有以下属性:
  456. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  457. * @param {string} options.url 服务地址
  458. * @param {string} [options.layers] 服务图层列表,以逗号分隔的要显示的层列表,如果要显示所有层,则未定义。
  459. * @param {Number} [options.alpha=1] 透明度
  460. * @return {String} 服务Id
  461. *
  462. * @example
  463. * layer.addArcGisMapServer({
  464. * url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer',
  465. * },function (serviceId) {
  466. *
  467. * });
  468. *
  469. */
  470. addArcGisMapServer: function(options, callSuccess) {
  471. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  472. throw new Cesium.DeveloperError("options.url is required.");
  473. }
  474. options.id = options.id || this._guid();
  475. let _ConstructorOptions = {
  476. url: options.url
  477. };
  478. if (options.layers) {
  479. _ConstructorOptions.layers = options.layers;
  480. }
  481. let imageryProvider = new Cesium.ArcGisMapServerImageryProvider(_ConstructorOptions);
  482. /* 加入图层 */
  483. this._addImageryProvider(options.id, imageryProvider);
  484. //设置透明度
  485. this.setLayersStyle({
  486. serviceId: options.id,
  487. alpha: options.alpha
  488. });
  489. if (callSuccess) callSuccess(options.id);
  490. },
  491. /**
  492. * 加载Cesium3DTileset地图服务--实景
  493. * @param {Object} options 具有以下属性:
  494. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  495. * @param {String} options.url 服务地址
  496. * @param {Number} [options.height=15] 实景抬高高度
  497. * @param {Number} [options.alpha=1] 实景透明度
  498. * @return {String} 服务Id
  499. *
  500. * @example
  501. * layer.addCesium3DTileset({
  502. * url : 'http://localhost:8002/tilesets/Seattle/tileset.json',
  503. * },function (serviceId) {
  504. *
  505. * });
  506. *
  507. */
  508. addCesium3DTileset: function(options, callSuccess) {
  509. let _self = this;
  510. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  511. throw new Cesium.DeveloperError("options.url is required.");
  512. }
  513. options.id = options.id || this._guid();
  514. let _ConstructorOptions = {
  515. url: options.url,
  516. skipLevelOfDetail: true,
  517. };
  518. let tileSetModel = new Cesium.Cesium3DTileset(_ConstructorOptions);
  519. tileSetModel.readyPromise.then(tileset => {
  520. console.log("加载完成")
  521. window[options.id] = tileset;
  522. _self._addScenePrimitives(tileset);
  523. //设置实景距离地面高度,抬高实景
  524. _self.set3DTilePosition({
  525. serviceId: options.id,
  526. height: options.height,
  527. });
  528. //设置实景透明度
  529. _self.set3DTileStyle({
  530. serviceId: options.id,
  531. alpha: options.alpha,
  532. });
  533. if (callSuccess) callSuccess(options.id);
  534. }).catch(function(error) {
  535. console.log(error);
  536. });
  537. },
  538. /**
  539. * 加载Cesium3DTileset地图服务--白膜
  540. * @param {Object} options 具有以下属性:
  541. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  542. * @param {String} options.url 服务地址
  543. * @return {String} 服务Id
  544. *
  545. * @example
  546. * layer.addCesium3DTilesetBm({
  547. * url : 'http://localhost:8002/tilesets/Seattle/tileset.json',
  548. * },function (serviceId) {
  549. *
  550. * });
  551. *
  552. */
  553. addCesium3DTilesetBm: function(options, callSuccess) {
  554. let _self = this;
  555. if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
  556. throw new Cesium.DeveloperError("options.url is required.");
  557. }
  558. options.id = options.id || this._guid();
  559. let _ConstructorOptions = {
  560. url: options.url,
  561. skipLevelOfDetail: true,
  562. };
  563. let tileSetModel = new Cesium.Cesium3DTileset(_ConstructorOptions);
  564. tileSetModel.readyPromise.then(tileset => {
  565. console.log("加载完成")
  566. window[options.id] = tileset;
  567. _self._addScenePrimitives(tileset);
  568. //设置白膜样式
  569. _self.set3DTileBMStyle({
  570. serviceId: options.id,
  571. color: options.color,
  572. });
  573. if (callSuccess) callSuccess(options.id);
  574. }).catch(function(error) {
  575. console.log(error);
  576. });
  577. },
  578. /**
  579. * 图片服务
  580. * @param {Object} options 具有以下属性:
  581. * @param {Array/Cesium.Cartesian3} options.points 模型加载位置 Array[lng,lat,height]经度,以度为单位,纬度,以度为单位,高程
  582. * @param {String} options.url 服务地址
  583. * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
  584. * @param {Number} [options.alpha=1] 透明度
  585. * @return {String} 服务Id
  586. *
  587. * @example
  588. * layer.addPolygonImageMaterial({
  589. * id:"aa",
  590. * url : 'http://localhost:8002/tilesets/Seattle/tileset.json',
  591. * },function (serviceId) {
  592. *
  593. * });
  594. *
  595. */
  596. addPolygonImageMaterial: function(options, callSuccess) {
  597. if (!Cesium.defined(options.points)) {
  598. throw new Cesium.DeveloperError("options.points is required.");
  599. }
  600. if (options.points.length < 3) {
  601. reject("面对象,点数至少3个");
  602. }
  603. /* 转换坐标 */
  604. let positions = [];
  605. if (options.points instanceof Cesium.Cartesian3) {
  606. positions = options.points;
  607. } else {
  608. positions = options.points.map(point => {
  609. return Cesium.Cartesian3.fromDegrees(point[0], point[1], point[2] || 0);
  610. });
  611. }
  612. options.id = options.id || this._guid();
  613. options.alpha = options.alpha || 1;
  614. this.classificationType = Cesium.ClassificationType.BOTH;
  615. if (options.classificationType === "Terrain") {
  616. this.classificationType = Cesium.ClassificationType.TERRAIN;
  617. } else if (options.classificationType === "3DTiles") {
  618. this.classificationType = Cesium.ClassificationType.CESIUM_3D_TILE;
  619. }
  620. /* 创建材质 */
  621. if (options.url) {
  622. if (!Cesium.Entity.supportsMaterialsforEntitiesOnTerrain(this._viewer.scene)) {
  623. window.alert("Terrain Entity materials are not supported on this platform");
  624. }
  625. this.material = new Cesium.ImageMaterialProperty({
  626. image: options.url,
  627. repeat: Cesium.Cartesian2(1.0, 1.0), // 不重复
  628. transparent: true, // 启用png透明
  629. color: Cesium.Color.WHITE.withAlpha(options.alpha)
  630. });
  631. } else {
  632. this.material = Cesium.Color.RED.withAlpha(options.alpha);
  633. }
  634. window[options.id] = this._viewer.entities.add({
  635. id: options.id,
  636. polygon: {
  637. hierarchy: positions,
  638. material: this.material,
  639. classificationType: this.classificationType,
  640. },
  641. });
  642. ////设置透明度
  643. // this.setPolygonImageMaterial({
  644. // serviceId: options.id,
  645. // alpha: options.alpha,
  646. // });
  647. if (callSuccess) callSuccess(options.id);
  648. },
  649. /**
  650. * 加载GLTF/GLB模型数据
  651. * @param {Object} options 参数对象
  652. * @param {String} [options.id=guid] 模型实体加载ID,加入到整体图层中 以便可以删除对应的图层
  653. * @param {Array/Cesium.Cartesian3} options.points 模型加载位置 Array[lng,lat,height]经度,以度为单位,纬度,以度为单位,高程
  654. * @param {String} options.url 模型路径
  655. * @param {Number} [options.heading=0.0] 以弧度为单位的航向分量
  656. * @param {Number} [options.pitch=0.0] 以弧度为单位的螺距分量
  657. * @param {Number} [options.roll=0.0] 以弧度为单位的滚动分量
  658. * @param {Number} [options.minimumPixelSize] 模型最小刻度
  659. * @param {Number} [options.maximumScale] 模型的最大比例尺大小,设置模型最大放大大小
  660. * @param {Array<Number>} [options.silhouetteColor] 模型轮廓颜色[0~255,0~255,0~255,0~1]
  661. * @param {Number} [options.alpha] 模型透明度
  662. */
  663. addEntitiesGltf: function(options, callSuccess) {
  664. let _self = this;
  665. let viewer = this._viewer;
  666. if (!Cesium.defined(options.points)) {
  667. resolve("options.points is required.");
  668. throw new Cesium.DeveloperError("options.points is required.");
  669. }
  670. if (!Cesium.defined(options.url)) {
  671. resolve("options.url is required.");
  672. throw new Cesium.DeveloperError("options.url is required.");
  673. }
  674. // 初始化参数默认值
  675. options.id = options.id || this._guid();
  676. options.heading = Cesium.defaultValue(options.heading, 0.0);
  677. options.pitch = Cesium.defaultValue(options.pitch, 0.0);
  678. options.roll = Cesium.defaultValue(options.roll, 0.0);
  679. options.alpha = Cesium.defaultValue(options.alpha, 1);
  680. //模型加载位置
  681. let position = undefined;
  682. if (options.points instanceof Cesium.Cartesian3) {
  683. position = options.points;
  684. } else {
  685. position = Cesium.Cartesian3.fromDegrees(options.points[0], options.points[1], options.points[2] || 0);
  686. }
  687. //弧度的航向分量。
  688. var heading = Cesium.Math.toRadians(options.heading);
  689. //弧度的螺距分量。
  690. var pitch = options.pitch;
  691. //滚动分量(以弧度为单位)
  692. var roll = options.roll;
  693. //HeadingPitchRoll旋转表示为航向,俯仰和滚动。围绕Z轴。节距是绕负y轴的旋转。滚动是关于正x轴。
  694. var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
  695. var modelGltf = viewer.entities.add({
  696. id: options.id, //模型id
  697. position: position, // 模型位置
  698. orientation: Cesium.Transforms.headingPitchRollQuaternion(position, hpr), // 模型方向
  699. model: { // 模型资源
  700. uri: options.url, // 模型路径
  701. incrementallyLoadTextures: true, //加载模型后纹理是否能够继续流入
  702. colorBlendMode: Cesium.ColorBlendMode['HIGHLIGHT'], //经常使用的有三个HIGHLIGHT,REPLACE,MIX
  703. colorBlendAmount: 0.1, //这个属性必须是MIX混合属性才能生效,见colorBlendMode
  704. color: Cesium.Color.WHITE.withAlpha(options.alpha), //模型颜色,这里可以设置颜色的变化,包含透明度的颜色
  705. imageBasedLightingFactor: new Cesium.Cartesian2(12.0, 13.0),
  706. runAnimations: true, //是否运行模型中的动画效果
  707. show: true, // 模型是否可见
  708. // 仅用于调试,显示魔仙绘制时的线框
  709. debugWireframe: false,
  710. // 仅用于调试。显示模型绘制时的边界球。
  711. debugShowBoundingVolume: false,
  712. },
  713. });
  714. // 模型最小刻度,不管缩放如何,模型的最小最小像素大小。
  715. if (options.minimumPixelSize) {
  716. modelGltf.model.minimumPixelSize = options.minimumPixelSize;
  717. }
  718. // 模型最大刻度,模型的最大比例尺大小。 minimumPixelSize的上限。
  719. if (options.maximumScale) {
  720. modelGltf.model.maximumScale = options.maximumScale;
  721. }
  722. // 模型轮廓颜色
  723. if (options.silhouetteColor) {
  724. modelGltf.model.silhouetteColor = new Cesium.Color(options.silhouetteColor[0] / 255, options.silhouetteColor[1] / 255, options.silhouetteColor[2] / 255, options.silhouetteColor[3]);
  725. }
  726. // //设置透明度
  727. // this.setModelStyle({
  728. // serviceId: options.id,
  729. // alpha: options.alpha,
  730. // });
  731. window[options.id] = modelGltf;
  732. if (callSuccess) callSuccess(options.id);
  733. },
  734. /**
  735. * 加载GLTF/GLB模型数据
  736. * @param {Object} options 参数对象
  737. * @param {Array/Cesium.Cartesian3} options.points 模型加载位置 Array[lng,lat,height]经度,以度为单位,纬度,以度为单位,高程
  738. * @param {String} options.url 模型路径
  739. * @param {String} [options.id=guid] 模型实体加载ID,加入到整体图层中 以便可以删除对应的图层
  740. * @param {Number} [options.scale] 放大倍数
  741. */
  742. addScenePrimitivesGltf(options, callSuccess) {
  743. let _self = this;
  744. let viewer = this._viewer;
  745. if (!Cesium.defined(options.points)) {
  746. resolve("options.points is required.");
  747. throw new Cesium.DeveloperError("options.points is required.");
  748. }
  749. if (!Cesium.defined(options.url)) {
  750. resolve("options.url is required.");
  751. throw new Cesium.DeveloperError("options.url is required.");
  752. }
  753. options.id = options.id || this._guid();
  754. options.scale = Cesium.defaultValue(options.scale, 1);
  755. //gltf数据加载位置
  756. let position = undefined;
  757. if (options.points instanceof Cesium.Cartesian3) {
  758. position = options.points;
  759. } else {
  760. position = Cesium.Cartesian3.fromDegrees(options.points[0], options.points[1], options.points[2] || 0);
  761. }
  762. const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);
  763. let model = viewer.scene.primitives.add(
  764. Cesium.Model.fromGltf({
  765. show: true, //确定是否将显示模型基元
  766. url: options.url, // 资源路径
  767. modelMatrix: modelMatrix, // 模型矩阵
  768. lightColor: new Cesium.Cartesian3(10.0, 10.0, 10.0),
  769. scale: options.scale, // 放大倍数
  770. // 仅用于调试,显示魔仙绘制时的线框
  771. debugWireframe: false,
  772. // 仅用于调试。显示模型绘制时的边界球。
  773. debugShowBoundingVolume: false,
  774. })
  775. )
  776. /** 模型旋转角度 */
  777. model.readyPromise.then(function() {
  778. //延z轴旋转-90度,其它轴同理
  779. var rotationX = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(0)));
  780. Cesium.Matrix4.multiply(model.modelMatrix, rotationX, model.modelMatrix);
  781. })
  782. window[options.id] = model;
  783. if (callSuccess) callSuccess(options.id);
  784. },
  785. /**
  786. * 根据GeoJson绘制线
  787. * @param {Object} [options] 样式,具有以下属性:
  788. * @param {String} options.url geoJson文件路径
  789. * @param {Number} [options.id] 用于移除
  790. * @param {Number} [options.clampToGround=true] 是否贴地
  791. * @param {Number} [options.isImageAlpha=true] 是否采用图片颜色
  792. * @param {Number} [options.imgUrl] 精灵线图片
  793. * @param {String} [options.color="#FF0000"] 指定线的颜色
  794. * @param {Number} [options.width=3] 指定线的宽度,以像素为单位
  795. // * @param {Number} [options.minHeigh=0] 一个属性,指定该折线将显示在距离摄像机的距离。在该间隔内物体可见的最小距离。
  796. // * @param {Number} [options.maxHeigh=200000000] 一个属性,指定该折线将显示在距离摄像机的距离。在间隔内物体可见的最大距离。
  797. * @param {Number} [options.duration=3000] 持续时间 毫秒,越小越快
  798. * @param {Number} [options.count] 重复次数
  799. * @param {String} [options.direction='horizontal'] 方向 vertical纵,垂直方向,horizontal横,水平方向
  800. * @param {String} [options.order] 方向正负
  801. * vertical 纵:'-'(由下到上) , '+"(由上到下)
  802. * horizontal 横:'-'(顺时针) , '+'(逆时针)
  803. */
  804. addPolylineByGeoJson(options, callSuccess) {
  805. let _self = this;
  806. let viewer = this._viewer;
  807. if (!Cesium.defined(options.url)) {
  808. resolve("options.url is required.");
  809. throw new Cesium.DeveloperError("options.url is required.");
  810. }
  811. options.id = options.id || this._guid();
  812. options.clampToGround = Cesium.defaultValue(options.clampToGround, true);
  813. options.width = Cesium.defaultValue(options.width, 3);
  814. options.minHeigh = Cesium.defaultValue(options.minHeigh, 0);
  815. options.maxHeigh = Cesium.defaultValue(options.maxHeigh, 200000000);
  816. let promise = Cesium.GeoJsonDataSource.load(options.url, {
  817. clampToGround: options.clampToGround
  818. });
  819. promise.then((dataSource) => {
  820. _self._viewer.dataSources.add(dataSource); // 加载这个geojson资源
  821. dataSource.name = options.id
  822. let entities = dataSource.entities.values;
  823. // let distanceDisplayCondition = new Cesium.DistanceDisplayCondition(options.minHeigh, options.maxHeigh);
  824. let material = new PolylineDirectionMaterialProperty(options);
  825. for (var i = 0; i < entities.length; i++) {
  826. var entity = entities[i];
  827. // entity.polyline.distanceDisplayCondition = distanceDisplayCondition;
  828. entity.polyline.material = material;
  829. entity.polyline.width = options.width;
  830. if (options.clampToGround) {
  831. entity.polyline.clampToGround = true;
  832. }
  833. }
  834. if (callSuccess) callSuccess(options.id);
  835. });
  836. },
  837. /**
  838. * 根据GeoJson添加广告牌
  839. * @param {Object} options
  840. * @param {String} options.url geoJson文件路径
  841. * @param {String} options.id 用于移除
  842. * @param {Object} [options.billboard] 广告牌的样式,具有以下属性:
  843. * @param {Number} [options.billboard.imgUrl] 广告牌图片
  844. * @param {Number} [options.billboard.scale=1] 尺寸
  845. * @param {Object} [options.billboard.scaleByDistance] 距离相机的距离缩放点。
  846. * @param {Number} [options.billboard.scaleByDistance.near=0] 相机范围的下界。
  847. * @param {String} [options.billboard.scaleByDistance.nearValue=0] 相机范围下界的值。
  848. * @param {String} [options.billboard.scaleByDistance.far=1] 相机范围的上限。
  849. * @param {Number} [options.billboard.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
  850. *
  851. * @param {Object} [options.lable] lable的样式,具有以下属性:
  852. * @param {Number} [options.lable.text=""] 文字
  853. * @param {Number} [options.lable.textField=""] 文字字段
  854. * @param {String} [options.lable.font="24px Helvetica"] 指定CSS字体的属性,字体大小及样式
  855. * @param {String} [options.lable.fillColor=[255,255,0,1]] 字体颜色
  856. * @param {String} [options.lable.outlineColor=[255,255,255,1]] 字体边框颜色
  857. * @param {Number} [options.lable.outlineWidth=1] 边框宽度
  858. * @param {Number} [options.lable.showBackground=false] 是否显示背景颜色
  859. * @param {Number} [options.lable.backgroundColor=[255,255,255,1]] 背景颜色
  860. * @param {Number} [options.lable.pixelOffset=0] 偏移量
  861. * @param {Number} [options.lable.scale=1] 尺寸
  862. * @param {Object} [options.lable.scaleByDistance] 距离相机的距离缩放点。
  863. * @param {Number} [options.lable.scaleByDistance.near=0] 相机范围的下界。
  864. * @param {String} [options.lable.scaleByDistance.nearValue=0] 相机范围下界的值。
  865. * @param {String} [options.lable.scaleByDistance.far=1] 相机范围的上限。
  866. * @param {Number} [options.lable.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
  867. */
  868. addBillboardByGeoJson(options, callSuccess) {
  869. let _self = this;
  870. let viewer = this._viewer;
  871. if (!Cesium.defined(options.url)) {
  872. resolve("options.url is required.");
  873. throw new Cesium.DeveloperError("options.url is required.");
  874. }
  875. options.id = options.id || this._guid();
  876. let billboard = options.billboard || {};
  877. billboard.imgUrl = Cesium.defaultValue(billboard.imgUrl, 'jt3dSDK/imgs/point/point3.png');
  878. billboard.scale = Cesium.defaultValue(billboard.scale, 1);
  879. billboard.pixelOffset = Cesium.defaultValue(billboard.pixelOffset, 0);
  880. const dataSource = new Cesium.GeoJsonDataSource(options.id); // 创建并取名
  881. dataSource.load(options.url, {
  882. clampToGround: true
  883. }).then(function(data) {
  884. viewer.dataSources.add(data); // 添加这个datasource
  885. const entities = data.entities.values; // 拿到所有实体
  886. entities.forEach(entity => {
  887. entity.billboard = {
  888. image: billboard.imgUrl,
  889. horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平
  890. verticalOrigin: Cesium.VerticalOrigin.BOTTOM, //垂直位置
  891. scale: billboard.scale, //尺寸
  892. pixelOffset: new Cesium.Cartesian2(0, billboard.pixelOffset),
  893. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  894. };
  895. if (billboard.scaleByDistance) {
  896. billboard.scaleByDistance.near = Cesium.defaultValue(billboard.scaleByDistance.near, 0);
  897. billboard.scaleByDistance.nearValue = Cesium.defaultValue(billboard.scaleByDistance.nearValue, 0);
  898. billboard.scaleByDistance.far = Cesium.defaultValue(billboard.scaleByDistance.far, 1);
  899. billboard.scaleByDistance.farValue = Cesium.defaultValue(billboard.scaleByDistance.farValue, 0);
  900. entity.billboard.scaleByDistance = new Cesium.NearFarScalar(billboard.scaleByDistance.near, billboard.scaleByDistance.nearValue, billboard.scaleByDistance.far, billboard.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  901. }
  902. if (options.label) {
  903. let label = options.label || {};
  904. label.text = Cesium.defaultValue(label.text, "");
  905. label.textField = Cesium.defaultValue(label.textField, "");
  906. label.font = Cesium.defaultValue(label.font, "24px Helvetica");
  907. if (label.fillColor instanceof Array) {
  908. label.fillColor = new Cesium.Color(label.fillColor[0] / 255, label.fillColor[1] / 255, label.fillColor[2] / 255, label.fillColor[3]);
  909. } else if (typeof options.color === 'string') {
  910. label.fillColor = new Cesium.Color.fromCssColorString(label.fillColor);
  911. } else {
  912. label.fillColor = new Cesium.Color.fromCssColorString("#ff0000");
  913. }
  914. if (label.outlineColor instanceof Array) {
  915. label.outlineColor = new Cesium.Color(label.outlineColor[0] / 255, label.outlineColor[1] / 255, label.outlineColor[2] / 255, label.outlineColor[3]);
  916. } else if (label.outlineColor instanceof String) {
  917. label.outlineColor = new Cesium.Color.fromCssColorString(label.outlineColor);
  918. } else {
  919. label.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
  920. }
  921. label.outlineWidth = Cesium.defaultValue(label.outlineWidth, 1);
  922. //是否显示背景颜色
  923. label.showBackground = Cesium.defaultValue(label.showBackground, false);
  924. //背景颜色
  925. if (label.backgroundColor instanceof Array) {
  926. label.backgroundColor = new Cesium.Color(label.backgroundColor[0] / 255, label.backgroundColor[1] / 255, label.backgroundColor[2] / 255, label.backgroundColor[3]);
  927. } else if (label.backgroundColor instanceof String) {
  928. label.backgroundColor = new Cesium.Color.fromCssColorString(label.backgroundColor);
  929. } else {
  930. label.backgroundColor = new Cesium.Color.fromCssColorString("#FFFF00");
  931. }
  932. label.pixelOffset = Cesium.defaultValue(label.pixelOffset, 0);
  933. label.scale = Cesium.defaultValue(label.scale, 1);
  934. label.near = Cesium.defaultValue(label.near, 1.5e2);
  935. label.nearValue = Cesium.defaultValue(label.nearValue, 1);
  936. label.far = Cesium.defaultValue(label.far, 2400);
  937. label.farValue = Cesium.defaultValue(label.farValue, 0);
  938. let labelText = label.text;
  939. if (entity.properties[label.textField]) {
  940. labelText = entity.properties[label.textField]._value;
  941. }
  942. if (labelText === "") {
  943. labelText = (i + 1).toString();
  944. }
  945. entity.label = {
  946. text: labelText.toString(),
  947. font: label.font,
  948. fillColor: label.fillColor, //填充颜色
  949. outlineColor: label.outlineColor, //边框颜色
  950. outlineWidth: label.outlineWidth, //边框宽度
  951. style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL不要轮廓 , OUTLINE只要轮廓,FILL_AND_OUTLINE轮廓加填充
  952. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  953. showBackground: label.showBackground, //指定标签后面背景的可见性
  954. backgroundColor: label.backgroundColor, // 背景颜色
  955. backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
  956. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  957. pixelOffset: new Cesium.Cartesian2(0, label.pixelOffset), //偏移量
  958. scale: label.scale, //尺寸
  959. }
  960. if (label.scaleByDistance) {
  961. label.scaleByDistance.near = Cesium.defaultValue(label.scaleByDistance.near, 0);
  962. label.scaleByDistance.nearValue = Cesium.defaultValue(label.scaleByDistance.nearValue, 0);
  963. label.scaleByDistance.far = Cesium.defaultValue(label.scaleByDistance.far, 1);
  964. label.scaleByDistance.farValue = Cesium.defaultValue(label.scaleByDistance.farValue, 0);
  965. entity.label.scaleByDistance = new Cesium.NearFarScalar(label.scaleByDistance.near, label.scaleByDistance.nearValue, label.scaleByDistance.far, label.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  966. }
  967. }
  968. })
  969. if (callSuccess) callSuccess(options.id);
  970. })
  971. },
  972. /**
  973. * 根据GeoJson添加广告牌
  974. * @param {Object} options
  975. * @param {String} options.url geoJson文件路径
  976. * @param {String} options.id 用于移除
  977. * @param {Object} [options.billboard] 广告牌的样式,具有以下属性:
  978. * @param {Number} [options.billboard.imgUrl] 广告牌图片
  979. * @param {Number} [options.billboard.scale=1] 尺寸
  980. * @param {Object} [options.billboard.scaleByDistance] 距离相机的距离缩放点。
  981. * @param {Number} [options.billboard.scaleByDistance.near=0] 相机范围的下界。
  982. * @param {String} [options.billboard.scaleByDistance.nearValue=0] 相机范围下界的值。
  983. * @param {String} [options.billboard.scaleByDistance.far=1] 相机范围的上限。
  984. * @param {Number} [options.billboard.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
  985. *
  986. * @param {Object} [options.lable] lable的样式,具有以下属性:
  987. * @param {Number} [options.lable.text=""] 文字
  988. * @param {Number} [options.lable.textField=""] 文字字段
  989. * @param {String} [options.lable.font="24px Helvetica"] 指定CSS字体的属性,字体大小及样式
  990. * @param {String} [options.lable.fillColor=[255,255,0,1]] 字体颜色
  991. * @param {String} [options.lable.outlineColor=[255,255,255,1]] 字体边框颜色
  992. * @param {Number} [options.lable.outlineWidth=1] 边框宽度
  993. * @param {Number} [options.lable.showBackground=false] 是否显示背景颜色
  994. * @param {Number} [options.lable.backgroundColor=[255,255,255,1]] 背景颜色
  995. * @param {Number} [options.lable.pixelOffset=0] 偏移量
  996. * @param {Number} [options.lable.scale=1] 尺寸
  997. * @param {Object} [options.lable.scaleByDistance] 距离相机的距离缩放点。
  998. * @param {Number} [options.lable.scaleByDistance.near=0] 相机范围的下界。
  999. * @param {String} [options.lable.scaleByDistance.nearValue=0] 相机范围下界的值。
  1000. * @param {String} [options.lable.scaleByDistance.far=1] 相机范围的上限。
  1001. * @param {Number} [options.lable.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
  1002. */
  1003. addBillboardByJson(options, callSuccess) {
  1004. let _self = this;
  1005. let viewer = this._viewer;
  1006. if (!Cesium.defined(options.url)) {
  1007. resolve("options.url is required.");
  1008. throw new Cesium.DeveloperError("options.url is required.");
  1009. }
  1010. options.id = options.id || this._guid();
  1011. let billboard = options.billboard || {};
  1012. billboard.imgUrl = Cesium.defaultValue(billboard.imgUrl, 'jt3dSDK/imgs/point/point3.png');
  1013. billboard.scale = Cesium.defaultValue(billboard.scale, 1);
  1014. billboard.pixelOffset = Cesium.defaultValue(billboard.pixelOffset, 0);
  1015. fetch(options.url).then(res => {
  1016. return res.json();
  1017. }).then(res => {
  1018. for (var i = 0; i < res.features.length; i++) {
  1019. let coordinates = res.features[i].geometry.coordinates;
  1020. let position = Cesium.Cartesian3.fromDegrees(coordinates[0], coordinates[1], coordinates[2] || 0);
  1021. //先创建一个CustomDataSource源,然后把entity存入这里面
  1022. let Point = new Cesium.CustomDataSource(options.id);
  1023. viewer.dataSources.add(Point);
  1024. let entity = new Cesium.Entity({
  1025. // id: options.id,
  1026. name: "add billboard",
  1027. //位置
  1028. position: position,
  1029. //图片标签
  1030. billboard: {
  1031. image: billboard.imgUrl,
  1032. horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平
  1033. verticalOrigin: Cesium.VerticalOrigin.BOTTOM, //垂直位置
  1034. scale: billboard.scale, //尺寸
  1035. pixelOffset: new Cesium.Cartesian2(0, billboard.pixelOffset),
  1036. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  1037. }
  1038. });
  1039. if (billboard.scaleByDistance) {
  1040. billboard.scaleByDistance.near = Cesium.defaultValue(billboard.scaleByDistance.near, 0);
  1041. billboard.scaleByDistance.nearValue = Cesium.defaultValue(billboard.scaleByDistance.nearValue, 0);
  1042. billboard.scaleByDistance.far = Cesium.defaultValue(billboard.scaleByDistance.far, 1);
  1043. billboard.scaleByDistance.farValue = Cesium.defaultValue(billboard.scaleByDistance.farValue, 0);
  1044. entity.billboard.scaleByDistance = new Cesium.NearFarScalar(billboard.scaleByDistance.near, billboard.scaleByDistance.nearValue, billboard.scaleByDistance.far, billboard.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  1045. }
  1046. if (options.label) {
  1047. let label = options.label || {};
  1048. label.text = Cesium.defaultValue(label.text, "");
  1049. label.textField = Cesium.defaultValue(label.textField, "");
  1050. label.font = Cesium.defaultValue(label.font, "24px Helvetica");
  1051. if (label.fillColor instanceof Array) {
  1052. label.fillColor = new Cesium.Color(label.fillColor[0] / 255, label.fillColor[1] / 255, label.fillColor[2] / 255, label.fillColor[3]);
  1053. } else if (typeof options.color === 'string') {
  1054. label.fillColor = new Cesium.Color.fromCssColorString(label.fillColor);
  1055. } else {
  1056. label.fillColor = new Cesium.Color.fromCssColorString("#ff0000");
  1057. }
  1058. if (label.outlineColor instanceof Array) {
  1059. label.outlineColor = new Cesium.Color(label.outlineColor[0] / 255, label.outlineColor[1] / 255, label.outlineColor[2] / 255, label.outlineColor[3]);
  1060. } else if (label.outlineColor instanceof String) {
  1061. label.outlineColor = new Cesium.Color.fromCssColorString(label.outlineColor);
  1062. } else {
  1063. label.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
  1064. }
  1065. label.outlineWidth = Cesium.defaultValue(label.outlineWidth, 1);
  1066. //是否显示背景颜色
  1067. label.showBackground = Cesium.defaultValue(label.showBackground, false);
  1068. //背景颜色
  1069. if (label.backgroundColor instanceof Array) {
  1070. label.backgroundColor = new Cesium.Color(label.backgroundColor[0] / 255, label.backgroundColor[1] / 255, label.backgroundColor[2] / 255, label.backgroundColor[3]);
  1071. } else if (label.backgroundColor instanceof String) {
  1072. label.backgroundColor = new Cesium.Color.fromCssColorString(label.backgroundColor);
  1073. } else {
  1074. label.backgroundColor = new Cesium.Color.fromCssColorString("#FFFF00");
  1075. }
  1076. label.pixelOffset = Cesium.defaultValue(label.pixelOffset, 0);
  1077. label.scale = Cesium.defaultValue(label.scale, 1);
  1078. label.near = Cesium.defaultValue(label.near, 1.5e2);
  1079. label.nearValue = Cesium.defaultValue(label.nearValue, 1);
  1080. label.far = Cesium.defaultValue(label.far, 2400);
  1081. label.farValue = Cesium.defaultValue(label.farValue, 0);
  1082. let labelText = label.text;
  1083. if (res.features[i].properties[label.textField]) {
  1084. labelText = res.features[i].properties[label.textField];
  1085. }
  1086. if (labelText === "") {
  1087. labelText = (i + 1).toString();
  1088. }
  1089. entity.label = {
  1090. text: labelText.toString(),
  1091. font: label.font,
  1092. fillColor: label.fillColor, //填充颜色
  1093. outlineColor: label.outlineColor, //边框颜色
  1094. outlineWidth: label.outlineWidth, //边框宽度
  1095. style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL不要轮廓 , OUTLINE只要轮廓,FILL_AND_OUTLINE轮廓加填充
  1096. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  1097. showBackground: label.showBackground, //指定标签后面背景的可见性
  1098. backgroundColor: label.backgroundColor, // 背景颜色
  1099. backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
  1100. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  1101. pixelOffset: new Cesium.Cartesian2(0, label.pixelOffset), //偏移量
  1102. scale: label.scale, //尺寸
  1103. }
  1104. if (label.scaleByDistance) {
  1105. label.scaleByDistance.near = Cesium.defaultValue(label.scaleByDistance.near, 0);
  1106. label.scaleByDistance.nearValue = Cesium.defaultValue(label.scaleByDistance.nearValue, 0);
  1107. label.scaleByDistance.far = Cesium.defaultValue(label.scaleByDistance.far, 1);
  1108. label.scaleByDistance.farValue = Cesium.defaultValue(label.scaleByDistance.farValue, 0);
  1109. entity.label.scaleByDistance = new Cesium.NearFarScalar(label.scaleByDistance.near, label.scaleByDistance.nearValue, label.scaleByDistance.far, label.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示 Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
  1110. }
  1111. }
  1112. // viewer.entities.add(entity);
  1113. Point.entities.add(entity)
  1114. }
  1115. if (callSuccess) callSuccess(options.id);
  1116. });
  1117. },
  1118. /**
  1119. * 根据GeoJson添加动态墙
  1120. * @param {Object} options
  1121. * @param {String} options.url geoJson文件路径
  1122. * @param {String} options.id 用于移除
  1123. * @param {Number} [options.clampToGround=true] 是否贴地
  1124. * @param {Number} [options.minimunHeights=0] 最低高度
  1125. * @param {Number} [options.maximumHeights=100] 最高高度
  1126. * @param {Number} [options.imgUrl] 动态墙图片
  1127. * @param {String} [options.color="#FF0000"] 指定墙的颜色
  1128. * @param {Number} [options.duration=3000] 持续时间 毫秒,越小越快
  1129. * @param {Number} [options.count] 重复次数
  1130. * @param {String} [options.direction='horizontal'] 方向 vertical纵,垂直方向,horizontal横,水平方向
  1131. * @param {String} [options.order] 方向正负
  1132. * vertical 纵:'-'(由下到上) , '+"(由上到下)
  1133. * horizontal 横:'-'(顺时针) , '+'(逆时针)
  1134. */
  1135. addWallByJson(options, callSuccess) {
  1136. let _self = this;
  1137. let viewer = this._viewer;
  1138. if (!Cesium.defined(options.url)) {
  1139. resolve("options.url is required.");
  1140. throw new Cesium.DeveloperError("options.url is required.");
  1141. }
  1142. options = options || {};
  1143. options.id = options.id || setSessionid();
  1144. options.clampToGround = Cesium.defaultValue(options.clampToGround, true);
  1145. options.minimunHeights = options.minimunHeights !== undefined && typeof options.minimunHeights === 'number' ? options.minimunHeights : 0;
  1146. options.maximumHeights = options.maximumHeights !== undefined && typeof options.maximumHeights === 'number' ? options.maximumHeights : 1000;
  1147. if (options.color) {
  1148. if (options.color instanceof Array) {
  1149. options.color = new Cesium.Color(options.color[0] / 255, options.color[1] / 255, options.color[2] / 255, options.color[3]);
  1150. } else if (typeof(options.color) === 'string') {
  1151. options.color = new Cesium.Color.fromCssColorString(options.color);
  1152. } else {
  1153. options.color = new Cesium.Color.fromCssColorString("#FFFF00");
  1154. }
  1155. }
  1156. options.trailImage = Cesium.defaultValue(options.trailImage, 'jt3dSDK/imgs/wallmaterial/wl.png');
  1157. options.duration = Cesium.defaultValue(options.duration, 3000);
  1158. options.count = Cesium.defaultValue(options.count, 1);
  1159. options.direction = Cesium.defaultValue(options.direction, 'vertical');
  1160. options.order = Cesium.defaultValue(options.order, '-');
  1161. fetch(options.url).then(res => {
  1162. return res.json();
  1163. }).then(res => {
  1164. for (var i = 0; i < res.features.length; i++) {
  1165. let coordinates = res.features[i].geometry.coordinates;
  1166. let positions = coordinates.map(point => {
  1167. return Cesium.Cartesian3.fromDegrees(point[0], point[1], point[2] || 0);
  1168. });
  1169. //先创建一个CustomDataSource源,然后把entity存入这里面
  1170. let wall = new Cesium.CustomDataSource(options.id);
  1171. viewer.dataSources.add(wall);
  1172. let entity = new Cesium.Entity({
  1173. name: "立体墙效果",
  1174. wall: {
  1175. positions: positions,
  1176. // 设置高度
  1177. maximumHeights: new Array(positions.length).fill(options.maximumHeights),
  1178. minimunHeights: new Array(positions.length).fill(options.minimunHeights),
  1179. // 扩散墙材质
  1180. // material: new Cesium.WallDiffuseMaterialProperty({
  1181. // color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
  1182. // }),
  1183. material: new WallMaterialProperty(viewer, {
  1184. trailImage: options.trailImage,
  1185. color: options.color,
  1186. duration: options.duration,
  1187. param: {
  1188. count: options.count,
  1189. direction: options.direction,
  1190. order: options.order,
  1191. },
  1192. }),
  1193. // material: new Cesium.DynamicWallMaterialProperty({
  1194. // trailImage: 'jt3dSDK/imgs/wallmaterial/wl.png',
  1195. // color: Cesium.Color.CYAN,
  1196. // duration: 1500
  1197. // })
  1198. }
  1199. });
  1200. // 绘制墙体
  1201. wall.entities.add(entity)
  1202. }
  1203. if (callSuccess) callSuccess(options.id);
  1204. });
  1205. },
  1206. });
  1207. /**
  1208. * 通用对外公开函数 - 设置样式及透明度
  1209. */
  1210. Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
  1211. /**
  1212. * 设置3DTile透明度
  1213. * @param {Object} options
  1214. * @param {String} options.serviceId 服务Id
  1215. * @param {Number} [options.alpha=1] 透明度,0-1,0.0 表示完全透明,1.0 表示完全不透明
  1216. */
  1217. set3DTileStyle(options) {
  1218. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1219. throw new Cesium.DeveloperError("options.serviceId is required.");
  1220. }
  1221. //透明度,0.0 表示完全透明,1.0 表示完全不透明
  1222. if (Cesium.defined(options.alpha)) {
  1223. Cesium.Check.typeOf.number("alpha", options.alpha);
  1224. }
  1225. options.alpha = Cesium.defaultValue(options.alpha, 1);
  1226. let tileset = window[options.serviceId];
  1227. //设置实景透明度
  1228. tileset.style = new Cesium.Cesium3DTileStyle({
  1229. color: "color('rgba(255,255,255," + options.alpha + ")')",
  1230. });
  1231. },
  1232. /**
  1233. * 设置Cesium3DTileStyle白膜样式
  1234. * @param {Object} options 具有以下属性:
  1235. * @param {String} options.serviceId 服务Id
  1236. * @param {Array<Number>} [options.color=[245,82,0,1]] 设置白膜颜色样式[0~255,0~255,0~255,0~1]
  1237. * @example
  1238. * layer.set3DTileBMStyle({
  1239. * serviceId : 'serviceId',
  1240. * color : [0, 148, 220, 0.8],
  1241. * });
  1242. *
  1243. */
  1244. set3DTileBMStyle: function(options) {
  1245. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1246. throw new Cesium.DeveloperError("options.serviceId is required.");
  1247. }
  1248. // vec4(245 / 255, 82 / 255, 0 / 255, 1.0)
  1249. // vec4(0.0, 0.58, 0.86, 1.0)
  1250. // 设置白膜颜色样式,例vec4(0.0, 0.58, 0.86, 1.0) 前三个浮点数 (范围是 0.0 到 1.0) 代表红,绿,蓝,第四个值代表 alpha 通道,控制透明度 (0.0 完全透明,1.0 是完全不透明).
  1251. options.color = options.color ? "vec4(" + options.color[0] + "/255, " + options.color[1] + "/255, " + options.color[2] + "/255, " + options.color[3] + ")" : "vec4(0.0, 0.58, 0.86, 1.0)";
  1252. let tileset = window[options.serviceId];
  1253. tileset.readyPromise.then((tileset) => {
  1254. let r = tileset.boundingSphere.radius;
  1255. if (tileset.boundingSphere.radius > 10000) {
  1256. r = tileset.boundingSphere.radius / 10
  1257. }
  1258. tileset.style = new Cesium.Cesium3DTileStyle({
  1259. color: options.color,
  1260. // color: 'vec4(0, 0.2, 1.0,1.0)',
  1261. });
  1262. tileset.tileVisible.addEventListener((tile) => {
  1263. //console.log("tile:",tile);
  1264. let content = tile.content
  1265. let featuresLength = content.featuresLength
  1266. for (let i = 0; i < featuresLength; i += 2) {
  1267. const feature = content.getFeature(i)
  1268. const model = feature.content._model
  1269. if (model && model._sourcePrograms && model._rendererResources) {
  1270. Object.keys(model._sourcePrograms).forEach((key) => {
  1271. const program = model._sourcePrograms[key]
  1272. const fragmentShader = model._rendererResources.sourceShaders[program.fragmentShader]
  1273. let vPosition = ''
  1274. if (fragmentShader.indexOf(' v_positionEC;') !== -1) {
  1275. vPosition = 'v_positionEC'
  1276. } else if (fragmentShader.indexOf(' v_pos;') !== -1) {
  1277. vPosition = 'v_pos'
  1278. }
  1279. const color = `vec4(${feature.color.toString()})`
  1280. model._rendererResources.sourceShaders[program.fragmentShader] = `
  1281. varying vec3 ${vPosition};
  1282. void main(void){
  1283. vec4 v_helsing_position = czm_inverseModelView * vec4(${vPosition},1);
  1284. float _baseHeight = -30.0;
  1285. float vtxf_height = v_helsing_position.z - _baseHeight;
  1286. float stc_pl = fract(czm_frameNumber / 120.0) * 3.14159265 * 2.0;
  1287. float stc_sd = vtxf_height / 30.0 + sin(stc_pl) * 0.1;
  1288. gl_FragColor = ${color};
  1289. gl_FragColor *= vec4(stc_sd, stc_sd, stc_sd, 1.0);
  1290. /* 扫描线 */
  1291. float glowRange = 80.0;
  1292. float stc_a13 = fract(czm_frameNumber / 460.0);
  1293. float stc_h = clamp(v_helsing_position.z / glowRange, 0.0, 1.0);
  1294. stc_a13 = abs(stc_a13 - 0.5) * 1.0;
  1295. float stc_diff = step(0.003, abs(stc_h - stc_a13));
  1296. gl_FragColor.rgb += gl_FragColor.rgb * (1.0 - stc_diff);
  1297. }
  1298. `
  1299. })
  1300. model._shouldRegenerateShaders = true;
  1301. }
  1302. }
  1303. })
  1304. })
  1305. //刷新地图
  1306. this._viewer.scene.requestRender();
  1307. },
  1308. /**
  1309. * 设置Cesium3DTileset(实景)三维高度
  1310. * @param {Object} options 具有以下属性:
  1311. * @param {String} options.serviceId 服务Id
  1312. * @param {Number} options.height=0 设置模型距离地形高度
  1313. *
  1314. * @example
  1315. * layer.set3DTilePosition({
  1316. * serviceId : 'serviceId',
  1317. * height : 0,
  1318. * });
  1319. *
  1320. */
  1321. set3DTilePosition: function(options) {
  1322. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1323. throw new Cesium.DeveloperError("options.serviceId is required.");
  1324. }
  1325. options.height = Cesium.defaultValue(options.height, 0);
  1326. let boundingSphere = window[options.serviceId].boundingSphere;
  1327. let cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
  1328. // longitude number 经度,单位为弧度
  1329. // latitude number 纬度,单位为弧度
  1330. // height number 椭球的高度,以米为单位
  1331. let left = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, options.height);
  1332. let right = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
  1333. //left 左笛卡尔第一个笛卡尔。
  1334. //right 左笛卡尔第二个笛卡尔。
  1335. //result cartesian3存储结果的对象。
  1336. let translation = Cesium.Cartesian3.subtract(left, right, new Cesium.Cartesian3());
  1337. window[options.serviceId].modelMatrix = Cesium.Matrix4.fromTranslation(translation);
  1338. this._viewer.scene.requestRender(); //刷新地图
  1339. },
  1340. /**
  1341. * 设置图层的透明度、亮度、对比度、伽马、色调、饱和度等
  1342. * @param {Object} options 具有以下属性:
  1343. * @param {Number} [options.alpha] 透明度,0-1,0.0 表示完全透明,1.0 表示完全不透明
  1344. * @param {Number} [options.brightness] 亮度,>1.0 增加亮度. < 1.0 减少亮度.
  1345. * @param {Number} [options.contrast] 对比度,>1.0 增加对比度. < 1.0 减少对比度.
  1346. * @param {Number} [options.gamma] 伽马,>1.0 增加伽马. < 1.0 减少伽马.
  1347. * @param {Number} [options.hue] 色调,>0 增加色调
  1348. * @param {Number} [options.saturation] 饱和度,>1.0 增加亮度. < 1.0 减少亮度.
  1349. *
  1350. * @example
  1351. * layer.setLayersStyle({
  1352. * serviceId : 'serviceId',
  1353. * alpha : 0.5,
  1354. * brightness : 1,
  1355. * });
  1356. *
  1357. */
  1358. setLayersStyle(options) {
  1359. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1360. throw new Cesium.DeveloperError("options.serviceId is required.");
  1361. }
  1362. let layer = window[options.serviceId];
  1363. //透明度,0.0 表示完全透明,1.0 表示完全不透明
  1364. if (Cesium.defined(options.alpha)) {
  1365. Cesium.Check.typeOf.number("alpha", options.alpha);
  1366. }
  1367. options.alpha = Cesium.defaultValue(options.alpha, 1);
  1368. layer.alpha = options.alpha;
  1369. //亮度,>1.0 增加亮度. < 1.0 减少亮度.
  1370. if (Cesium.defined(options.brightness)) {
  1371. Cesium.Check.typeOf.number("brightness", options.brightness);
  1372. }
  1373. options.brightness = Cesium.defaultValue(options.brightness, 1);
  1374. layer.brightness = options.brightness;
  1375. //对比度,>1.0 增加对比度. < 1.0 减少对比度
  1376. if (Cesium.defined(options.contrast)) {
  1377. Cesium.Check.typeOf.number("contrast", options.contrast);
  1378. }
  1379. options.contrast = Cesium.defaultValue(options.contrast, 1);
  1380. layer.contrast = options.contrast;
  1381. //伽马,>1.0 增加亮度. < 1.0 减少亮度.
  1382. if (Cesium.defined(options.gamma)) {
  1383. Cesium.Check.typeOf.number("gamma", options.gamma);
  1384. }
  1385. options.gamma = Cesium.defaultValue(options.gamma, 1);
  1386. layer.gamma = options.gamma;
  1387. //色调,>0 增加色调
  1388. if (Cesium.defined(options.hue)) {
  1389. Cesium.Check.typeOf.number("hue", options.hue);
  1390. }
  1391. options.hue = Cesium.defaultValue(options.hue, 0);
  1392. layer.hue = options.hue;
  1393. //饱和度,>1.0 增加饱和度. < 1.0 减少饱和度.
  1394. if (Cesium.defined(options.saturation)) {
  1395. Cesium.Check.typeOf.number("saturation", options.saturation);
  1396. }
  1397. options.saturation = Cesium.defaultValue(options.saturation, 1);
  1398. layer.saturation = options.saturation;
  1399. },
  1400. /**
  1401. * 设置图片服务透明度
  1402. * @param {Object} options
  1403. * @param {String} options.serviceId 服务Id
  1404. * @param {Number} options.alpha 透明度,0-1,0.0 表示完全透明,1.0 表示完全不透明
  1405. */
  1406. setPolygonImageMaterial(options) {
  1407. //透明度,0.0 表示完全透明,1.0 表示完全不透明
  1408. if (Cesium.defined(options.alpha)) {
  1409. Cesium.Check.typeOf.number("alpha", options.alpha);
  1410. }
  1411. options.alpha = Cesium.defaultValue(options.alpha, 1);
  1412. let entity = window[options.serviceId];
  1413. // let color = entity.polygon.material.color.getValue().clone();
  1414. // entity.material.color.setValue(color.withAlpha(options.alpha));
  1415. entity.polygon.material.color._value.alpha = options.alpha;
  1416. },
  1417. /**
  1418. * 设置图片服务透明度
  1419. * @param {Object} options
  1420. * @param {String} options.serviceId 服务Id
  1421. * @param {Number} options.alpha 透明度,0-1,0.0 表示完全透明,1.0 表示完全不透明
  1422. */
  1423. setModelStyle(options) {
  1424. //透明度,0.0 表示完全透明,1.0 表示完全不透明
  1425. if (Cesium.defined(options.alpha)) {
  1426. Cesium.Check.typeOf.number("alpha", options.alpha);
  1427. }
  1428. options.alpha = Cesium.defaultValue(options.alpha, 1);
  1429. let entity = window[options.serviceId];
  1430. if (entity.model) {
  1431. entity.model.color._value.alpha = options.alpha;
  1432. } else {
  1433. entity.color._value.alpha = options.alpha;
  1434. }
  1435. },
  1436. /**
  1437. * 动态设置地形夸张系数
  1438. * @param {Object} options
  1439. * @param {Number} options.terrainExaggeration=1 地形夸张系数
  1440. */
  1441. setTerrainExaggeration(options) {
  1442. //透明度,0.0 表示完全透明,1.0 表示完全不透明
  1443. if (Cesium.defined(options.terrainExaggeration)) {
  1444. Cesium.Check.typeOf.number("terrainExaggeration", options.terrainExaggeration);
  1445. }
  1446. options.terrainExaggeration = Cesium.defaultValue(options.terrainExaggeration, 1);
  1447. // 地形夸张
  1448. this._viewer.scene.globe.terrainExaggeration = options.terrainExaggeration;
  1449. }
  1450. })
  1451. /**
  1452. * 通用对外公开函数 - 移除图层
  1453. */
  1454. Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
  1455. /**
  1456. * 将图层在地图中移除(ArcGIS Online和Server的相关服务、WMS、WMTS、URL模板服务)
  1457. * @param {Object} options 具有以下属性:
  1458. * @param {String} options.serviceId 服务Id
  1459. * @example
  1460. * layer.removeImageryProvider({
  1461. * serviceId : 'serviceId',
  1462. * });
  1463. *
  1464. */
  1465. removeImageryProvider(options) {
  1466. return new Promise((resolve, reject) => {
  1467. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1468. throw new Cesium.DeveloperError("options.serviceId is required.");
  1469. }
  1470. this._removeImageryProvider(options.serviceId);
  1471. resolve(true);
  1472. });
  1473. },
  1474. /**
  1475. * 将图层在地图中移除(地形)
  1476. *
  1477. */
  1478. removeTerrain() {
  1479. return new Promise((resolve, reject) => {
  1480. this._setEllipsoidTerrain();
  1481. resolve(true);
  1482. });
  1483. },
  1484. /**
  1485. * 将图层在地图中移除(实景/白膜)
  1486. * @param {Object} options 具有以下属性:
  1487. * @param {String} options.serviceId 服务Id
  1488. *
  1489. * @example
  1490. * layer.removeScenePrimitives({
  1491. * serviceId : 'serviceId',
  1492. * });
  1493. *
  1494. */
  1495. removeScenePrimitives(options) {
  1496. return new Promise((resolve, reject) => {
  1497. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1498. throw new Cesium.DeveloperError("options.serviceId is required.");
  1499. }
  1500. this._removeScenePrimitives(options.serviceId);
  1501. resolve(true);
  1502. });
  1503. },
  1504. /**
  1505. * 将图层在地图中移除entity
  1506. * @param {Object} options 具有以下属性:
  1507. * @param {String} options.serviceId 服务Id
  1508. *
  1509. * @example
  1510. * layer.removeEntity({
  1511. * serviceId : 'serviceId',
  1512. * });
  1513. *
  1514. */
  1515. removeEntity(options) {
  1516. return new Promise((resolve, reject) => {
  1517. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1518. throw new Cesium.DeveloperError("options.serviceId is required.");
  1519. }
  1520. this._viewer.entities.remove(window[options.serviceId]);
  1521. window[options.serviceId] = null;
  1522. resolve(true);
  1523. });
  1524. },
  1525. /**
  1526. * 将图层在地图中移除entity
  1527. * @param {Object} options 具有以下属性:
  1528. * @param {String} options.serviceId 服务Id
  1529. *
  1530. * @example
  1531. * layer.removeDataSources({
  1532. * serviceId : 'serviceId',
  1533. * });
  1534. *
  1535. */
  1536. removeDataSources(options) {
  1537. let _self = this;
  1538. let viewer = this._viewer;
  1539. return new Promise((resolve, reject) => {
  1540. if (!Cesium.defined(options) || !Cesium.defined(options.serviceId)) {
  1541. throw new Cesium.DeveloperError("options.serviceId is required.");
  1542. }
  1543. //清除高亮显示
  1544. let list = viewer.dataSources.getByName(options.serviceId)
  1545. list.forEach((res, index) => {
  1546. viewer.dataSources.remove(res)
  1547. if (index === (list.length - 1)) {
  1548. resolve(true);
  1549. }
  1550. })
  1551. });
  1552. },
  1553. })
  1554. export default LoadMapData;