graphThemeLayer.html 17 KB

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