graphThemeLayer.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html lang="en-US">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  9. <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  10. <title data-i18n="resources.title_graphThemeLayer"></title>
  11. <script type="text/javascript" src="../../dist/mapboxgl/include-mapboxgl.js"></script>
  12. <script type="text/javascript" src="../data/chinaConsumptionLevel.js"></script>
  13. <style>
  14. body, #map {
  15. position: absolute;
  16. width: 100%;
  17. height: 100%
  18. }
  19. .editPane {
  20. position: absolute;
  21. right: 65px;
  22. top: 8px;
  23. text-align: center;
  24. background: #FFF;
  25. z-index: 1000;
  26. border-radius: 4px;
  27. }
  28. .tooltip-inner {
  29. width: 68px;
  30. background-color: transparent;
  31. color: #515151;
  32. }
  33. .graph {
  34. margin: 5px;
  35. width: 26px;
  36. height: 26px;
  37. border: none;
  38. border-radius: 4px;
  39. background-size: 100%;
  40. }
  41. #bar {
  42. background-image: url("../img/bar.png");
  43. }
  44. #bar3d {
  45. background-image: url("../img/bar3D.png");
  46. }
  47. #ling {
  48. background-image: url("../img/ling.png");
  49. }
  50. #point {
  51. background-image: url("../img/point.png");
  52. }
  53. #pie {
  54. background-image: url("../img/pie.png");
  55. }
  56. #ring {
  57. background-image: url("../img/ring.png");
  58. }
  59. </style>
  60. </head>
  61. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  62. <div class="editPane" role="group" aria-label="...">
  63. <button type='button' class='btn btn-default graph active' id='bar' data-toggle='tooltip' data-placement='bottom'
  64. data-i18n="[title]resources.title_GraphBar"></button>
  65. <button type='button' class='btn btn-default graph' id='bar3d' data-toggle='tooltip' data-placement='bottom'
  66. data-i18n="[title]resources.title_GraphBar3D"></button>
  67. <button type='button' class='btn btn-default graph' id='ling' data-toggle='tooltip' data-placement='bottom'
  68. data-i18n="[title]resources.title_GraphLine"></button>
  69. <button type='button' class='btn btn-default graph' id='point' data-toggle='tooltip' data-placement='bottom'
  70. data-i18n="[title]resources.title_GraphPoint"></button>
  71. <button type='button' class='btn btn-default graph' id='pie' data-toggle='tooltip' data-placement='bottom'
  72. data-i18n="[title]resources.title_GraphPie"></button>
  73. <button type='button' class='btn btn-default graph' id='ring' data-toggle='tooltip' data-placement='bottom'
  74. data-i18n="[title]resources.title_GraphRing"></button>
  75. </div>
  76. <div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
  77. <script type="text/javascript" include="bootstrap" src="../js/include-web.js"></script>
  78. <script type="text/javascript">
  79. var themeLayer, popup,
  80. host = window.isLocal ? window.server : "https://iserver.supermap.io",
  81. url = host + "/iserver/services/map-china400/rest/maps/China_4326";
  82. var attribution = "<a href='https://www.mapbox.com/about/maps/' target='_blank'>© Mapbox </a>" +
  83. " with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a> | </span>" +
  84. " Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> ";
  85. var map = new mapboxgl.Map({
  86. container: 'map',
  87. style: {
  88. "version": 8,
  89. "sources": {
  90. "raster-tiles": {
  91. "attribution": attribution,
  92. "type": "raster",
  93. "tiles": [url + '/zxyTileImage.png?z={z}&x={x}&y={y}'],
  94. "tileSize": 256,
  95. },
  96. },
  97. "layers": [{
  98. "id": "simple-tiles",
  99. "type": "raster",
  100. "source": "raster-tiles",
  101. "minzoom": 0,
  102. "maxzoom": 22
  103. }]
  104. },
  105. center: [105.85, 36.79],
  106. zoom: 3.8
  107. });
  108. map.addControl(new mapboxgl.NavigationControl(), 'top-left');
  109. map.addControl(new mapboxgl.supermap.LogoControl(), 'bottom-right');
  110. bindEvent();
  111. initFeaterDatasAddStyles();
  112. createBarThemeLayer();
  113. function bindEvent() {
  114. $("[data-toggle='tooltip']").on("mouseover", function () {
  115. $("[data-toggle='tooltip']").tooltip();
  116. });
  117. $("[data-toggle='tooltip']").on("mouseout", function () {
  118. $("[data-toggle='tooltip']").tooltip("hide");
  119. });
  120. $(".graph").on("click", function () {
  121. $(".graph").removeClass("active");
  122. });
  123. $("#bar").on("click", function () {
  124. $("#bar").addClass("active");
  125. initFeaterDatasAddStyles();
  126. clearThemeLayer();
  127. createBarThemeLayer();
  128. });
  129. $("#bar3d").on("click", function () {
  130. $("#bar3d").addClass("active");
  131. initFeaterDatasAddStyles();
  132. clearThemeLayer();
  133. createBar3DThemeLayer();
  134. });
  135. $("#ling").on("click", function () {
  136. $("#ling").addClass("active");
  137. initFeaterDatasAddStyles();
  138. clearThemeLayer();
  139. createLineThemeLayer();
  140. });
  141. $("#point").on("click", function () {
  142. $("#point").addClass("active");
  143. initFeaterDatasAddStyles();
  144. clearThemeLayer();
  145. createPointThemeLayer();
  146. });
  147. $("#pie").on("click", function () {
  148. $("#pie").addClass("active");
  149. initFeaterDatasAddStyles();
  150. clearThemeLayer();
  151. createPieThemeLayer();
  152. });
  153. $("#ring").on("click", function () {
  154. $("#ring").addClass("active");
  155. initFeaterDatasAddStyles();
  156. clearThemeLayer();
  157. createRingThemeLayer();
  158. });
  159. }
  160. var features,
  161. chartsSettingForBarAddBar3DCommon,
  162. chartsSettingForPointOrLine,
  163. chartsSettingForPieOrRing,
  164. themeLayerOptions;
  165. function initFeaterDatasAddStyles() {
  166. //创建附着要素
  167. // features = [];
  168. var feas = [];
  169. for (var i = 0, len = chinaConsumptionLevel.length; i < len; i++) {
  170. // 省居民消费水平(单位:元)信息
  171. var provinceInfo = chinaConsumptionLevel[i];
  172. //支持传入 mapboxgl.supermap.ThemeFeature 类型:
  173. /* var geo = new mapboxgl.LngLat(provinceInfo[1], provinceInfo[2]);
  174. var attrs = {};
  175. attrs.NAME = provinceInfo[0];
  176. attrs.CON2009 = provinceInfo[3];
  177. attrs.CON2010 = provinceInfo[4];
  178. attrs.CON2011 = provinceInfo[5];
  179. attrs.CON2012 = provinceInfo[6];
  180. attrs.CON2013 = provinceInfo[7];
  181. var fea = new mapboxgl.supermap.ThemeFeature(geo, attrs);
  182. features.push(fea);*/
  183. //支持 传入 GeoJSON 规范数据类型:
  184. var fea = {
  185. "type": "feature",
  186. "geometry": {
  187. "type": "Point",
  188. "coordinates": [provinceInfo[1], provinceInfo[2]]
  189. },
  190. "properties": {
  191. "NAME": provinceInfo[0],
  192. "CON2009": provinceInfo[3],
  193. "CON2010": provinceInfo[4],
  194. "CON2011": provinceInfo[5],
  195. "CON2012": provinceInfo[6],
  196. "CON2013": provinceInfo[7],
  197. }
  198. };
  199. feas.push(fea);
  200. }
  201. features = {
  202. "type": "FeatureCollection",
  203. "features": feas
  204. };
  205. //Bar add Bar3D chartsSetting
  206. chartsSettingForBarAddBar3DCommon = {
  207. width: 260,
  208. height: 120,
  209. codomain: [0, 40000],
  210. xShapeBlank: [15, 15, 15],
  211. axisYTick: 4,
  212. axisYLabels: ["4万", "3万", "2万", "1万", "0"],
  213. axisXLabels: ["09年", "10年", "11年", "12年", "13年"],
  214. backgroundRadius: [5, 5, 5, 5],
  215. backgroundStyle: {
  216. fillColor: "#d1eeee",
  217. shadowBlur: 12,
  218. shadowColor: "#d1eeee"
  219. }
  220. };
  221. //Point add Line chartsSetting
  222. chartsSettingForPointOrLine = {
  223. width: 220,
  224. height: 100,
  225. codomain: [0, 40000],
  226. xShapeBlank: [10, 10],
  227. axisYTick: 4,
  228. axisYLabels: ["4万", "3万", "2万", "1万", "0"],
  229. axisXLabels: ["09年", "10年", "11年", "12年", "13年"],
  230. backgroundStyle: {fillColor: "#d1eeee"},
  231. backgroundRadius: [5, 5, 5, 5],
  232. useXReferenceLine: true,
  233. pointStyle: {
  234. pointRadius: 5,
  235. shadowBlur: 12,
  236. shadowColor: "#D8361B",
  237. fillOpacity: 0.8
  238. },
  239. pointHoverStyle: {
  240. stroke: true,
  241. strokeColor: "#D8361B",
  242. strokeWidth: 2,
  243. fillColor: "#ffffff",
  244. pointRadius: 4
  245. },
  246. };
  247. //Pie add Ring chartsSetting
  248. chartsSettingForPieOrRing = {
  249. width: 240,
  250. height: 100,
  251. codomain: [0, 40000], // 允许图表展示的值域范围,此范围外的数据将不制作图表
  252. sectorStyle: {fillOpacity: 0.8}, // 柱状图中柱条的(表示字段值的图形)样式
  253. sectorStyleByFields: [
  254. {fillColor: "#FFB980"},
  255. {fillColor: "#5AB1EF"},
  256. {fillColor: "#B6A2DE"},
  257. {fillColor: "#2EC7C9"},
  258. {fillColor: "#D87A80"}],
  259. sectorHoverStyle: {fillOpacity: 1},
  260. xShapeBlank: [10, 10, 10], // 水平方向上的空白间距参数
  261. axisYLabels: ["4万", "3万", "2万", "1万", "0"], // y 轴标签内容
  262. axisXLabels: ["09年", "10年", "11年", "12年", "13年"], // x 轴标签内容
  263. backgroundStyle: {fillColor: "#CCE8CF"}, // 背景样式
  264. backgroundRadius: [5, 5, 5, 5], // 背景框圆角参数
  265. };
  266. //设置graphThemeLayer option参数
  267. themeLayerOptions = {
  268. // map: map,//该可选参数将在下个版本遗弃
  269. attributions: " ",
  270. themeFields: ["CON2009", "CON2010", "CON2011", "CON2012", "CON2013"],
  271. opacity: 0.9,
  272. chartsSetting: {},
  273. };
  274. }
  275. function createBarThemeLayer() {
  276. var chartsSettingForBar = chartsSettingForBarAddBar3DCommon;
  277. chartsSettingForBar.barStyle = {fillOpacity: 0.7}; // 柱状图中柱条的(表示字段值的图形)样式
  278. chartsSettingForBar.barHoverStyle = {fillOpacity: 1}; // 柱条 hover 样式
  279. //阴影样式
  280. chartsSettingForBar.barShadowStyle = {
  281. shadowBlur: 8,
  282. shadowOffsetX: 2,
  283. shadowOffsetY: 2,
  284. shadowColor: "rgba(100,100,100,0.8)"
  285. };
  286. chartsSettingForBar.barLinearGradient = [
  287. ["#00FF00", "#00CD00"],
  288. ["#00CCFF", "#5E87A2"],
  289. ["#00FF66", "#669985"],
  290. ["#CCFF00", "#94A25E"],
  291. ["#FF9900", "#A2945E"]];
  292. themeLayerOptions.chartsSetting = chartsSettingForBar;
  293. themeLayer = new mapboxgl.supermap.GraphThemeLayer("BarLayer", "Bar", themeLayerOptions);
  294. map.addLayer(themeLayer);
  295. //专题图层 mousemove 事件
  296. themeLayer.on('mousemove', showInfoWin);
  297. themeLayer.addFeatures(features);
  298. }
  299. //创建Bar3D图表
  300. function createBar3DThemeLayer() {
  301. var chartsSettingForBar3D = chartsSettingForBarAddBar3DCommon;
  302. chartsSettingForBar3D.useXReferenceLine = true;
  303. chartsSettingForBar3D.xReferenceLineStyle = {strokeColor: "#008acd", strokeOpacity: 0.4};
  304. // 3d 柱条正面样式(3d 柱条的侧面和顶面会以 3d 柱条正面样式为默认样式)
  305. chartsSettingForBar3D.barFaceStyle = {stroke: true};
  306. // 按字段设置 3d 柱条正面样式
  307. chartsSettingForBar3D.barFaceStyleByFields = [
  308. {fillColor: "#FFB980"},
  309. {fillColor: "#5AB1EF"},
  310. {fillColor: "#B6A2DE"},
  311. {fillColor: "#2EC7C9"},
  312. {fillColor: "#D87A80"}];
  313. // 3d 柱条正面 hover 样式(3d 柱条的侧面和顶面 hover 会以 3d 柱条正面 hover 样式为默认 hover 样式)
  314. chartsSettingForBar3D.barFaceHoverStyle = {
  315. stroke: true,
  316. strokeWidth: 1,
  317. strokeColor: "#ffff00"
  318. };
  319. themeLayerOptions.chartsSetting = chartsSettingForBar3D;
  320. themeLayer = new mapboxgl.supermap.GraphThemeLayer("Bar3DLayer", "Bar3D", themeLayerOptions);
  321. map.addLayer(themeLayer);
  322. themeLayer.addFeatures(features);
  323. //专题图层 mousemove 事件
  324. themeLayer.on('mousemove', showInfoWin);
  325. }
  326. //创建Line图表
  327. function createLineThemeLayer() {
  328. chartsSettingForPointOrLine.pointStyle.fillColor = "#9966CC";
  329. themeLayerOptions.chartsSetting = chartsSettingForPointOrLine;
  330. themeLayer = new mapboxgl.supermap.GraphThemeLayer("LineLayer", "Line", themeLayerOptions);
  331. map.addLayer(themeLayer);
  332. themeLayer.addFeatures(features);
  333. //专题图层 mousemove 事件
  334. themeLayer.on('mousemove', showInfoWin);
  335. }
  336. //创建Point图表
  337. function createPointThemeLayer() {
  338. chartsSettingForPointOrLine.pointStyle.fillColor = "#D8361B";
  339. themeLayerOptions.chartsSetting = chartsSettingForPointOrLine;
  340. themeLayer = new mapboxgl.supermap.GraphThemeLayer("PointLayer", "Point", themeLayerOptions);
  341. map.addLayer(themeLayer);
  342. themeLayer.addFeatures(features);
  343. //专题图层 mousemove 事件
  344. themeLayer.on('mousemove', showInfoWin);
  345. }
  346. //创建Pie图表
  347. function createPieThemeLayer() {
  348. themeLayerOptions.chartsSetting = chartsSettingForPieOrRing;
  349. themeLayer = new mapboxgl.supermap.GraphThemeLayer("PieLayer", "Pie", themeLayerOptions);
  350. map.addLayer(themeLayer);
  351. themeLayer.addFeatures(features);
  352. //专题图层 mousemove 事件
  353. themeLayer.on('mousemove', showInfoWin);
  354. }
  355. //创建Ring图表
  356. function createRingThemeLayer() {
  357. chartsSettingForPieOrRing.innerRingRadius = 20;
  358. themeLayerOptions.chartsSetting = chartsSettingForPieOrRing;
  359. themeLayer = new mapboxgl.supermap.GraphThemeLayer("RingSymbolLayer", "Ring", themeLayerOptions);
  360. map.addLayer(themeLayer);
  361. themeLayer.addFeatures(features);
  362. //专题图层 mousemove 事件
  363. themeLayer.on('mousemove', showInfoWin);
  364. }
  365. //清除图表专题图
  366. function clearThemeLayer() {
  367. if (themeLayer) {
  368. themeLayer.clear();
  369. themeLayer.removeFromMap();
  370. themeLayer = null;
  371. }
  372. }
  373. function showInfoWin(e) {
  374. closeInfoWin();
  375. // e.target 是图形对象,即数据的可视化对象,柱状图中是柱条;
  376. // 图形对象的 refDataID 属性是数据(feature)的 id 属性,它指明图形对象是由那个数据制作而来;
  377. // 图形对象的 dataInfo 属性是图形对象表示的具体数据,他有两个属性,field 和 value;
  378. if (e.target && e.target.refDataID && e.target.dataInfo) {
  379. // 获取图形对应的数据 (feature)
  380. var fea = themeLayer.getFeatureById(e.target.refDataID);
  381. var info = e.target.dataInfo;
  382. // 弹窗内容
  383. var contentHTML = "<div style='color: #000; background-color: #fff'>";
  384. contentHTML += resources.text_Name + "<br><strong>" + fea.attributes.NAME + "</strong>";
  385. contentHTML += "<hr style='margin: 3px'>";
  386. switch (info.field) {
  387. case "CON2009":
  388. contentHTML += resources.text_consumptionLevel1 + "09" + resources.text_consumptionLevel2 + "<br/><strong>" + info.value + "</strong>(" + resources.text_yuan + ")";
  389. break;
  390. case "CON2010":
  391. contentHTML += resources.text_consumptionLevel1 + "10" + resources.text_consumptionLevel2 + "<br/><strong>" + info.value + "</strong>(" + resources.text_yuan + ")";
  392. break;
  393. case "CON2011":
  394. contentHTML += resources.text_consumptionLevel1 + "11" + resources.text_consumptionLevel2 + "<br/><strong>" + info.value + "</strong>(" + resources.text_yuan + ")";
  395. break;
  396. case "CON2012":
  397. contentHTML += resources.text_consumptionLevel1 + "12" + resources.text_consumptionLevel2 + " <br/><strong>" + info.value + "</strong>(" + resources.text_yuan + ")";
  398. break;
  399. case "CON2013":
  400. contentHTML += resources.text_consumptionLevel1 + "13" + resources.text_consumptionLevel2 + " <br/><strong>" + info.value + "</strong>(" + resources.text_yuan + ")";
  401. break;
  402. default:
  403. contentHTML += "No Data";
  404. }
  405. contentHTML += "</div>";
  406. var tempPoint = map.unproject({x: e.event.x, y: e.event.y});
  407. popup = new mapboxgl.Popup({closeOnClick: false})
  408. .setLngLat([tempPoint.lng, tempPoint.lat])
  409. .setHTML(contentHTML)
  410. .addTo(map);
  411. return;
  412. }
  413. closeInfoWin();
  414. }
  415. // 移除地图弹窗
  416. function closeInfoWin() {
  417. if (popup) {
  418. popup.remove(map);
  419. }
  420. }
  421. </script>
  422. </body>
  423. </html>