f30_divGraphic.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0" />
  6. <meta name="apple-touch-fullscreen" content="yes" />
  7. <meta name="apple-mobile-web-app-capable" content="yes" />
  8. <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  9. <meta name="format-detection" content="telephone=no" />
  10. <meta name="x5-fullscreen" content="true" />
  11. <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
  12. <!-- 标题及搜索关键字 -->
  13. <meta name="keywords" content="火星科技,cesium,3D,GIS,marsgis,三维,地球,地图,开发,框架,系统,示例,资料,模型,离线,外包,合肥,安徽,中国" />
  14. <meta
  15. name="description"
  16. content="火星科技 合肥火星 合肥火星科技 合肥火星科技有限公司 leaflet leaflet框架 leaflet开发 cesium cesium开发 cesium框架 三维 地球 模型 gis marsgis 地图离线 地图开发 地图框架 地图外包 框架 开发 外包 地图离线 二维地图 三维地图 全景漫游 地理信息系统 云GIS 三维GIS GIS平台 WebGIS"
  17. />
  18. <link rel="shortcut icon" type="image/x-icon" href="" />
  19. <title>Div文本点</title>
  20. <script
  21. type="text/javascript"
  22. src="../lib/include-lib.js"
  23. libpath="../lib/"
  24. include="jquery,font-awesome,bootstrap,bootstrap-checkbox,layer,haoutil,turf,mars3d"
  25. ></script>
  26. <link href="css/style.css" rel="stylesheet" />
  27. <link href="css/divGraphic.css" rel="stylesheet" />
  28. </head>
  29. <body class="dark">
  30. <!--加载前进行操作提示,优化用户体验-->
  31. <div id="mask" class="signmask" onclick="removeMask()"></div>
  32. <div id="mars3dContainer" class="mars3d-container"></div>
  33. <div class="infoview">
  34. <div>
  35. 图层状态:
  36. <div class="checkbox checkbox-primary checkbox-inline">
  37. <input id="chkShow" class="styled" type="checkbox" checked />
  38. <label for="chkShow"> 显示隐藏 </label>
  39. </div>
  40. <div class="checkbox checkbox-primary checkbox-inline">
  41. <input id="chkPopup" class="styled" type="checkbox" />
  42. <label for="chkPopup"> Popup绑定 </label>
  43. </div>
  44. <div class="checkbox checkbox-primary checkbox-inline">
  45. <input id="chkTooltip" class="styled" type="checkbox" />
  46. <label for="chkTooltip"> Tooltip绑定 </label>
  47. </div>
  48. <!-- <div class="checkbox checkbox-primary checkbox-inline">
  49. <input id="chkContextMenu" class="styled" type="checkbox" checked>
  50. <label for="chkContextMenu">
  51. 右键菜单绑定
  52. </label>
  53. </div> -->
  54. </div>
  55. <div>
  56. 数据维护:
  57. <input id="btnStartDraw" type="button" class="btn btn-primary" value="图上标绘" title="在图上绘制新增一个矢量数据" />
  58. <div class="checkbox checkbox-primary checkbox-inline">
  59. <input id="chkHasEdit" class="styled" type="checkbox" />
  60. <label for="chkHasEdit"> 是否编辑 </label>
  61. </div>
  62. </div>
  63. <div>
  64. 数据管理:
  65. <input id="btnClear" type="button" class="btn btn-danger" value="清除" />
  66. <input id="btnExpFile" type="button" class="btn btn-primary" value="保存GeoJSON" title="保存为GeoJSON文件" />
  67. <input id="btnImpFile" type="button" class="btn btn-primary" value="打开GeoJSON" title="打开之前保存的GeoJSON文件" />
  68. <input id="input_draw_file" type="file" accept=".json,.geojson" style="display: none" />
  69. </div>
  70. </div>
  71. <!-- 切换视角到模型或地形(山区)的快捷按钮 -->
  72. <script type="text/javascript" src="js/center_terrain_3dtiles.js"></script>
  73. <!-- 图层管理相关处理js -->
  74. <script type="text/javascript" src="./js/graphicManager.js"></script>
  75. <script src="./js/common.js"></script>
  76. <script type="text/javascript">
  77. "use script"; //开发环境建议开启严格模式
  78. var map;
  79. function initMap(options) {
  80. //合并属性参数,可覆盖config.json中的对应配置
  81. var mapOptions = mars3d.Util.merge(options, {
  82. scene: {
  83. center: { lat: 30.468743, lng: 116.499464, alt: 67446, heading: 0, pitch: -45 },
  84. },
  85. });
  86. //创建三维地球场景
  87. map = new mars3d.Map("mars3dContainer", mapOptions);
  88. //创建DIV数据图层
  89. var graphicLayer = new mars3d.layer.DivLayer();
  90. map.addLayer(graphicLayer);
  91. //图层管理的相关处理,代码在\js\graphicManager.js
  92. initLayerManager(graphicLayer);
  93. graphicLayer.unbindPopup();
  94. $("#btnStartDraw").click(function () {
  95. graphicLayer.startDraw({
  96. type: "div",
  97. style: {
  98. html: `<div class="marsImgPanel2">
  99. <div class="title">测试DIV点</div>
  100. <div class="content">此处可以绑定任意Html代码和css效果</div>
  101. </div >`,
  102. horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
  103. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  104. },
  105. success: function (graphic) {
  106. console.log("绘制完成", graphic);
  107. },
  108. });
  109. });
  110. //加一些演示数据
  111. addGraphic_01(graphicLayer);
  112. addGraphic_02(graphicLayer);
  113. addGraphic_03(graphicLayer);
  114. addGraphic_04(graphicLayer);
  115. addGraphic_05(graphicLayer);
  116. addGraphic_06(graphicLayer);
  117. addGraphic_07(graphicLayer);
  118. addGraphic_08(graphicLayer);
  119. addGraphic_09(graphicLayer);
  120. addGraphic_10(graphicLayer);
  121. addGraphic_11(graphicLayer);
  122. }
  123. //一个黑色面板,指向左下角黄色连线
  124. function addGraphic_01(graphicLayer) {
  125. var graphic = new mars3d.graphic.DivGraphic({
  126. position: [116.741611, 31.408068, 75.5],
  127. style: {
  128. html: `<div class="marsBlackPanel animation-spaceInDown">
  129. <div class="marsBlackPanel-text">大湖名城,创新高地</div>
  130. </div>`,
  131. horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
  132. verticalOrigin: Cesium.VerticalOrigin.CENTER,
  133. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 400000), //按视距距离显示
  134. //高亮时的样式
  135. highlight: {
  136. // type: mars3d.EventType.click,
  137. className: "marsBlackPanel-highlight",
  138. },
  139. },
  140. });
  141. graphicLayer.addGraphic(graphic);
  142. }
  143. //一个渐变的文本面板,中间竖直连线
  144. function addGraphic_02(graphicLayer) {
  145. var graphic = new mars3d.graphic.DivGraphic({
  146. position: [116.510732, 31.403786, 176.4],
  147. style: {
  148. html: `<div class="marsBlueGradientPnl">
  149. <div>合肥火星科技有限公司</div>
  150. </div>`,
  151. offsetY: -60,
  152. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  153. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  154. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 400000), //按视距距离显示
  155. //高亮时的样式
  156. highlight: {
  157. type: mars3d.EventType.click,
  158. className: "marsBlueGradientPnl-highlight",
  159. },
  160. },
  161. });
  162. graphicLayer.addGraphic(graphic);
  163. }
  164. //
  165. function addGraphic_03(graphicLayer) {
  166. var graphic = new mars3d.graphic.DivGraphic({
  167. position: [116.960075, 31.19609, 237.4],
  168. style: {
  169. html: `<div class="marsGreenGradientPnl" >安徽欢迎您</div>`,
  170. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  171. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  172. //高亮时的样式
  173. highlight: {
  174. type: mars3d.EventType.click,
  175. className: "marsGreenGradientPnl-highlight",
  176. },
  177. },
  178. });
  179. graphicLayer.addGraphic(graphic);
  180. }
  181. //添加GIF图标,DIV方式
  182. function addGraphic_04(graphicLayer) {
  183. var graphic = new mars3d.graphic.DivGraphic({
  184. position: [116.79013, 31.164872, 289],
  185. style: {
  186. html: '<img src="img/marker/tf.gif" style="width:50px;height:50px;" ></img>',
  187. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), //按视距距离显示
  188. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  189. verticalOrigin: Cesium.VerticalOrigin.CENTER,
  190. },
  191. pointerEvents: false, //false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
  192. });
  193. graphicLayer.addGraphic(graphic);
  194. }
  195. //加css动画的扩散点 DivLightPoint
  196. function addGraphic_05(graphicLayer) {
  197. var graphic = new mars3d.graphic.DivLightPoint({
  198. position: [116.630276, 31.213813],
  199. style: {
  200. color: "#f33349",
  201. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), //按视距距离显示
  202. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  203. },
  204. popup: "测试popup",
  205. });
  206. graphicLayer.addGraphic(graphic);
  207. }
  208. //内置扩展的动态文本 DivBoderLabel
  209. function addGraphic_06(graphicLayer) {
  210. var graphic = new mars3d.graphic.DivBoderLabel({
  211. position: [116.460722, 31.140888, 781],
  212. style: {
  213. text: "火星科技Mars3D平台",
  214. font_size: 15,
  215. font_family: "微软雅黑",
  216. color: "#ccc",
  217. boderColor: "#15d1f2",
  218. },
  219. });
  220. graphicLayer.addGraphic(graphic);
  221. }
  222. //内置扩展的竖立文本 DivBoderLabel
  223. function addGraphic_07(graphicLayer) {
  224. var graphic = new mars3d.graphic.DivUpLabel({
  225. position: [116.327136, 30.99723, 914.6],
  226. style: {
  227. text: "我是竖立的文本",
  228. color: "#fff",
  229. font_size: 16,
  230. font_family: "微软雅黑",
  231. lineHeight: 60,
  232. circleSize: 8,
  233. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 100000), //按视距距离显示
  234. },
  235. });
  236. graphicLayer.addGraphic(graphic);
  237. }
  238. //类似popup/toolitp的自定义html
  239. function addGraphic_08(graphicLayer) {
  240. var graphic = new mars3d.graphic.Popup({
  241. position: [116.146461, 31.380152, 395.1],
  242. style: {
  243. html: `这里可以放入任意html代码<br /> Popup和Tooltip也是继承自DivGraphic`,
  244. closeButton: false,
  245. horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  246. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  247. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), //按视距距离显示
  248. //高亮时的样式
  249. highlight: {
  250. type: mars3d.EventType.click,
  251. className: "mars-popup-highlight",
  252. },
  253. },
  254. });
  255. graphicLayer.addGraphic(graphic);
  256. }
  257. //倾斜指向左下角的面板样式
  258. function addGraphic_09(graphicLayer) {
  259. var graphic = new mars3d.graphic.DivGraphic({
  260. position: [116.138686, 31.101009, 1230],
  261. style: {
  262. html: `<div class="marsTiltPanel marsTiltPanel-theme-red">
  263. <div class="marsTiltPanel-wrap">
  264. <div class="area">
  265. <div class="arrow-lt"></div>
  266. <div class="b-t"></div>
  267. <div class="b-r"></div>
  268. <div class="b-b"></div>
  269. <div class="b-l"></div>
  270. <div class="arrow-rb"></div>
  271. <div class="label-wrap">
  272. <div class="title">火星水厂</div>
  273. <div class="label-content">
  274. <div class="data-li">
  275. <div class="data-label">实时流量:</div>
  276. <div class="data-value"><span id="lablLiuliang" class="label-num">39</span><span class="label-unit">m³/s</span>
  277. </div>
  278. </div>
  279. <div class="data-li">
  280. <div class="data-label">水池液位:</div>
  281. <div class="data-value"><span id="lablYeWei" class="label-num">10.22</span><span class="label-unit">m</span>
  282. </div>
  283. </div>
  284. <div class="data-li">
  285. <div class="data-label">水泵状态:</div>
  286. <div class="data-value">
  287. <span id="lablSBZT1" class="label-tag data-value-status-1" alt="中间状态">1号</span>
  288. <span id="lablSBZT2" class="label-tag data-value-status-0" alt="关闭状态">2号</span>
  289. </div>
  290. </div>
  291. <div class="data-li">
  292. <div class="data-label">出水阀门:</div>
  293. <div class="data-value">
  294. <span id="lablCSFM1" class="label-tag data-value-status-1" alt="中间状态">1号</span>
  295. <span id="lablCSFM2" class="label-tag data-value-status-2" alt="打开状态">2号</span>
  296. </div>
  297. </div>
  298. </div>
  299. </div>
  300. </div>
  301. <div class="b-t-l"></div>
  302. <div class="b-b-r"></div>
  303. </div>
  304. <div class="arrow" ></div>
  305. </div>`,
  306. horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
  307. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  308. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), //按视距距离显示
  309. scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 200000, 0.2),
  310. clampToGround: true,
  311. },
  312. pointerEvents: false, //false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
  313. });
  314. graphicLayer.addGraphic(graphic);
  315. //刷新局部DOM,不影响面板的其他控件操作
  316. //[建议读取到后端接口数据后主动去修改DOM,比下面演示的实时刷新效率高些]
  317. graphic.on(mars3d.EventType.postRender, function (event) {
  318. let container = event.container; //popup对应的DOM
  319. let lablLiuliang = container.querySelector("#lablLiuliang");
  320. if (lablLiuliang) {
  321. lablLiuliang.innerHTML = (Math.random() * 100).toFixed(0); //测试的随机数
  322. }
  323. let lablYeWei = container.querySelector("#lablYeWei");
  324. if (lablYeWei) {
  325. lablYeWei.innerHTML = Number(new Date().format("ss.S")).toFixed(2); //测试的随机数
  326. }
  327. });
  328. //演示绑定单击事件
  329. $("#lablSBZT1").click(function () {
  330. haoutil.msg("单击了1号水泵");
  331. });
  332. $("#lablSBZT2").click(function () {
  333. haoutil.msg("单击了2号水泵");
  334. });
  335. $("#lablCSFM1").click(function () {
  336. haoutil.msg("单击了1号出水阀门");
  337. });
  338. $("#lablCSFM2").click(function () {
  339. haoutil.msg("单击了2号出水阀门");
  340. });
  341. }
  342. //倾斜指向左下角的面板样式
  343. function addGraphic_10(graphicLayer) {
  344. var graphic = new mars3d.graphic.DivGraphic({
  345. position: [116.228043, 30.882207],
  346. style: {
  347. html: `<div class="marsTiltPanel marsTiltPanel-theme-green">
  348. <div class="marsTiltPanel-wrap">
  349. <div class="area">
  350. <div class="arrow-lt"></div>
  351. <div class="b-t"></div>
  352. <div class="b-r"></div>
  353. <div class="b-b"></div>
  354. <div class="b-l"></div>
  355. <div class="arrow-rb"></div>
  356. <div class="label-wrap">
  357. <div class="title">大别山水厂</div>
  358. <div class="label-content">
  359. <div class="data-li">
  360. <div class="data-label">实时流量:</div>
  361. <div class="data-value"><span class="label-num">99</span><span class="label-unit">m³/s</span>
  362. </div>
  363. </div>
  364. <div class="data-li">
  365. <div class="data-label">水池液位:</div>
  366. <div class="data-value"><span class="label-num">20.02</span><span class="label-unit">m</span>
  367. </div>
  368. </div>
  369. <div class="data-li">
  370. <div class="data-label">水泵状态:</div>
  371. <div class="data-value"><span class="label-tag data-value-status-1" alt="中间状态">1号</span><span
  372. class="label-tag data-value-status-0" alt="关闭状态">2号</span></div>
  373. </div>
  374. <div class="data-li">
  375. <div class="data-label">出水阀门:</div>
  376. <div class="data-value"><span class="label-tag data-value-status-1" alt="中间状态">1号</span><span
  377. class="label-tag data-value-status-2" alt="打开状态">2号</span></div>
  378. </div>
  379. </div>
  380. </div>
  381. </div>
  382. <div class="b-t-l"></div>
  383. <div class="b-b-r"></div>
  384. </div>
  385. <div class="arrow" ></div>
  386. </div>`,
  387. horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
  388. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  389. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 200000), //按视距距离显示
  390. scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 200000, 0.2),
  391. clampToGround: true,
  392. },
  393. //可以传入自定义测试点样式
  394. // testPoint: {
  395. // color: '#ff0000',
  396. // pixelSize: 8,
  397. // },
  398. pointerEvents: false, //false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
  399. });
  400. graphicLayer.addGraphic(graphic);
  401. graphic.testPoint = true; //打开测试点,与DIV点进行对比位置调整css
  402. }
  403. //倾斜指向左下角的面板样式
  404. function addGraphic_11(graphicLayer) {
  405. var graphic = new mars3d.graphic.DivGraphic({
  406. position: Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5),
  407. style: {
  408. html: `<div class="marsTiltPanel marsTiltPanel-theme-blue">
  409. <div class="marsTiltPanel-wrap">
  410. <div class="area">
  411. <div class="arrow-lt"></div>
  412. <div class="b-t"></div>
  413. <div class="b-r"></div>
  414. <div class="b-b"></div>
  415. <div class="b-l"></div>
  416. <div class="arrow-rb"></div>
  417. <div class="label-wrap">
  418. <div class="title">岳西水厂</div>
  419. <div class="label-content">
  420. <div class="data-li">
  421. <div class="data-label">实时流量:</div>
  422. <div class="data-value"><span class="label-num">98</span><span class="label-unit">m³/s</span>
  423. </div>
  424. </div>
  425. <div class="data-li">
  426. <div class="data-label">水池液位:</div>
  427. <div class="data-value"><span class="label-num">13.14</span><span class="label-unit">m</span>
  428. </div>
  429. </div>
  430. <div class="data-li">
  431. <div class="data-label">水泵状态:</div>
  432. <div class="data-value"><span class="label-tag data-value-status-1" alt="中间状态">1号</span><span
  433. class="label-tag data-value-status-0" alt="关闭状态">2号</span></div>
  434. </div>
  435. </div>
  436. </div>
  437. </div>
  438. <div class="b-t-l"></div>
  439. <div class="b-b-r"></div>
  440. </div>
  441. <div class="arrow" ></div>
  442. </div>`,
  443. horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
  444. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  445. distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1000, 200000), //按视距距离显示
  446. },
  447. });
  448. graphicLayer.addGraphic(graphic);
  449. movePoint(graphic); //动画移动示例
  450. }
  451. //
  452. function movePoint(graphic) {
  453. map.clock.shouldAnimate = true;
  454. //动画移动
  455. var property = new Cesium.SampledPositionProperty();
  456. var time = 20; //移动的时长 ,秒
  457. var tempTime;
  458. //起点
  459. var startPoint = Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5);
  460. tempTime = map.clock.currentTime; //飞行开始时间
  461. property.addSample(tempTime, startPoint);
  462. //移动到的第1个目标点
  463. var point1 = Cesium.Cartesian3.fromDegrees(116.311439, 30.76485, 423.7);
  464. tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate());
  465. property.addSample(tempTime, point1);
  466. //移动到的第2个目标点
  467. var point2 = Cesium.Cartesian3.fromDegrees(116.63081, 30.786585, 85);
  468. tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate());
  469. property.addSample(tempTime, point2);
  470. //移动到的第3个目标点
  471. var point3 = Cesium.Cartesian3.fromDegrees(116.706926, 30.945346, 457.5);
  472. tempTime = Cesium.JulianDate.addSeconds(tempTime, time, new Cesium.JulianDate());
  473. property.addSample(tempTime, point3);
  474. //为了保证到结束时间了,一直停留在那,所以加个很远的时间
  475. tempTime = Cesium.JulianDate.addDays(tempTime, 365, new Cesium.JulianDate());
  476. property.addSample(tempTime, point3);
  477. graphic.position = property;
  478. }
  479. </script>
  480. </body>
  481. </html>