others_d3_dynamicPieChart.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  8. <title data-i18n="resources.title_dynamicPieChart"></title>
  9. <style type="text/css">
  10. .arc path {
  11. stroke: #fff;
  12. }
  13. </style>
  14. </head>
  15. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  16. <div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
  17. <script type="text/javascript" include="bootstrap,widgets.alert" src="../js/include-web.js"></script>
  18. <script type="text/javascript" exclude="iclient-classic" include="d3"
  19. src="../../dist/classic/include-classic.js"></script>
  20. <script type="text/javascript">
  21. var map, layer, utfgrid, control, d3Layer,
  22. host = window.isLocal ? window.server : "https://iserver.supermap.io",
  23. url = host + "/iserver/services/map-china400/rest/maps/China";
  24. var pieChartDom;
  25. var elementsDiv;
  26. var isMapMoving = false;
  27. //判断浏览器是否支持 Svg
  28. function hasSVG() {
  29. var doc = document;
  30. var SVG_NS = 'http://www.w3.org/2000/svg';
  31. return !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect;
  32. }
  33. function init() {
  34. if (!hasSVG()) {
  35. widgets.alert.showAlert(resources.msg_supportSVG, false);
  36. return;
  37. }
  38. //ie 9 支持 svg,但不完善,不能正常运行此范例
  39. if (SuperMap.Browser.name === "msie" && SuperMap.Browser.version.indexOf("9") !== -1) {
  40. widgets.alert.showAlert(resources.msg_supportInstance, false);
  41. return;
  42. }
  43. map = new SuperMap.Map("map", {
  44. controls: [
  45. new SuperMap.Control.ScaleLine(),
  46. new SuperMap.Control.Zoom(),
  47. new SuperMap.Control.LayerSwitcher(),
  48. new SuperMap.Control.Navigation({
  49. dragPanOptions: {
  50. enableKinetic: true
  51. }
  52. })],
  53. projection: "EPSG:3857"
  54. });
  55. //地图移动过程中不显示图表
  56. map.events.on({
  57. "movestart": function () {
  58. document.getElementById("piechart").innerHTML = "";
  59. isMapMoving = true;
  60. }
  61. });
  62. map.events.on({
  63. "moveend": function () {
  64. isMapMoving = false;
  65. }
  66. });
  67. //基础图层
  68. layer = new SuperMap.Layer.TiledDynamicRESTLayer("China", url, {transparent: true}, {
  69. useCanvas: true,
  70. maxResolution: "auto"
  71. });
  72. //创建 Elements 图层,用于显示饼图
  73. d3Layer = new SuperMap.Layer.Elements("D3Layer");
  74. //获取 Elements 图层 div
  75. elementsDiv = d3Layer.getDiv();
  76. //设置Elements实例的div为地图大小
  77. var mapsize = map.getSize();
  78. elementsDiv.style.width = mapsize.w;
  79. elementsDiv.style.height = mapsize.h;
  80. //创建图表 div, 设置其基本属性, 并添加到 Elements 图层
  81. pieChartDom = document.createElement("div");
  82. pieChartDom.id = "piechart";
  83. pieChartDom.style.width = "128px";
  84. pieChartDom.style.height = "128px";
  85. pieChartDom.style.position = "absolute";
  86. pieChartDom.style.opacity = "0.8";
  87. elementsDiv.appendChild(pieChartDom);
  88. console.log(pieChartDom.style.width);
  89. //创建 UTFGrid 图层,用于更新饼图数据
  90. utfgrid = new SuperMap.Layer.UTFGrid("UTFGridLayer", url,
  91. {
  92. layerName: "China_Province_pl@China",
  93. utfTileSize: 256,
  94. pixcell: 8,
  95. isUseCache: true
  96. },
  97. {
  98. utfgridResolution: 8
  99. });
  100. layer.events.on({"layerInitialized": addLayer});
  101. control = new SuperMap.Control.UTFGrid({
  102. layers: [utfgrid],
  103. callback: callback,
  104. handlerMode: "move"
  105. });
  106. map.addControl(control);
  107. }
  108. $(document).ready(function () {
  109. init();
  110. });
  111. var callback = function (infoLookup, loc, pixel) {
  112. if (infoLookup && isMapMoving === false) {
  113. var info;
  114. for (var idx in infoLookup) {
  115. info = infoLookup[idx];
  116. if (info && info.data) {
  117. document.getElementById("piechart").innerHTML = "";
  118. //全国面积取 9.6e12(960万平方千米)
  119. var anotherArea = 9.6e12 - info.data.SmArea;
  120. // 计算面积比
  121. var theArea = ((info.data.SmArea / 9.6e12) * 100).toFixed(2);
  122. var allArea = ((anotherArea / 9.6e12) * 100).toFixed(2);
  123. //组织 D3 PieDChart 数据
  124. var data = [
  125. {
  126. "NAME": resources.text_otherProvince + allArea + "%",
  127. "SmArea": anotherArea
  128. },
  129. {
  130. "NAME": info.data.NAME + theArea + "%",
  131. "SmArea": info.data.SmArea
  132. }
  133. ];
  134. //取图表 div 大小作为创建图表的参数
  135. // console.log(pieChartDom);
  136. var width = parseFloat(128),
  137. height = parseFloat(128),
  138. radius = Math.min(width, height) / 2;
  139. //图表位置
  140. pieChartDom.style.left = pixel.x - width / 2+"px";
  141. pieChartDom.style.top = pixel.y - height / 2+"px";
  142. var color = d3.scale.ordinal()
  143. .range(["#1874CD", "#87CEFA"]);
  144. var arc = d3.svg.arc()
  145. .outerRadius(radius - 10)
  146. .innerRadius(0);
  147. var pie = d3.layout.pie()
  148. .sort(null)
  149. .value(function (d) {
  150. return d.SmArea;
  151. });
  152. var svg = d3.select("#piechart").append("svg")
  153. .attr("width", width)
  154. .attr("height", height)
  155. .append("g")
  156. .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
  157. //D3 饼图绘制
  158. var g = svg.selectAll(".arc")
  159. .data(pie(data))
  160. .enter().append("g")
  161. .attr("class", "arc");
  162. g.append("path")
  163. .attr("d", arc)
  164. .style("fill", function (d) {
  165. return color(d.data.NAME);
  166. });
  167. g.append("text")
  168. .attr("transform", function (d) {
  169. return "translate(" + arc.centroid(d) + ")";
  170. })
  171. .attr("dy", "0.35em")
  172. .style("text-anchor", "middle")
  173. .text(function (d) {
  174. return d.data.NAME;
  175. });
  176. }
  177. else {
  178. //清除饼图
  179. document.getElementById("piechart").innerHTML = "";
  180. }
  181. }
  182. }
  183. };
  184. //添加图层
  185. function addLayer() {
  186. var center = new SuperMap.LonLat(9733502.481499, 4614406.969325);
  187. map.addLayers([layer, d3Layer, utfgrid]);
  188. map.setCenter(center, 4);
  189. }
  190. </script>
  191. </body>
  192. </html>