theme_ctl_popDensityRange.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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_popDensityRange"></title>
  9. <style type="text/css">
  10. body {
  11. margin: 0;
  12. overflow: hidden;
  13. background: #fff;
  14. width: 100%;
  15. height: 100%
  16. }
  17. #map {
  18. position: absolute;
  19. width: 100%;
  20. height: 100%;
  21. }
  22. /*图例 style*/
  23. .legend {
  24. position: absolute;
  25. right: 10px;
  26. top: 350px;
  27. width: 250px;
  28. text-align: center;
  29. border: 2px solid #D6E3F1;
  30. background: #FFF;
  31. z-index: 999999;
  32. display: none;
  33. }
  34. .legendTitle {
  35. background: #1E90FF;
  36. }
  37. .legendContent {
  38. padding-left: 15px;
  39. padding-right: 15px;
  40. height: 160px;
  41. display: block;
  42. overflow-y: auto;
  43. }
  44. .legendItemHeader {
  45. top: 5px;
  46. width: 100px;
  47. height: 18px;
  48. text-align: center;
  49. }
  50. .legendItemValue {
  51. top: 5px;
  52. width: 120px;
  53. text-align: center;
  54. height: 18px;
  55. }
  56. /*信息框 style*/
  57. #infoBox {
  58. border: 2px solid #D6E3F1;
  59. position: absolute;
  60. right: 10px;
  61. top: 250px;
  62. width: 250px;
  63. z-index: 999999;
  64. display: none;
  65. }
  66. .editPane {
  67. position: absolute;
  68. right: 60px;
  69. top: 50px;
  70. text-align: center;
  71. background: #FFF;
  72. z-index: 1000;
  73. }
  74. </style>
  75. </head>
  76. <body>
  77. <div class='panel panel-primary editPane' id='editPane' style="z-index: 99999">
  78. <div class='panel-heading'>
  79. <h5 class='panel-title text-center' data-i18n="resources.text_graduatedSymbol"></h5>
  80. </div>
  81. <div class='panel-body' id='params'>
  82. <p></p>
  83. <div align='right' class='button-group'>
  84. <input type='button' id='btn1' class='btn btn-primary' data-i18n="[value]resources.btn_addThemeLayer"
  85. onclick="addThemeLayer()"/>
  86. <input type='button' id='btn2' class='btn btn-primary' data-i18n="[value]resources.btn_updateData"
  87. onclick="updateData()"/>
  88. <input type='button' id='btn3' class='btn btn-primary' data-i18n="[value]resources.text_input_value_clear"
  89. onclick="clearLayer()"/>
  90. </div>
  91. </div>
  92. </div>
  93. <div>
  94. <div id="map" ></div>
  95. <div id="mapLegend" class="legend">
  96. <div class="legendTitle">
  97. <span data-i18n="resources.text_legend"></span>
  98. </div>
  99. <div class="legendContent">
  100. <table>
  101. <tr>
  102. <td class="legendItemHeader" data-i18n="resources.text_populationDensity"></td>
  103. <td class="legendItemValue" data-i18n="resources.text_color"></td>
  104. </tr>
  105. <tr>
  106. <td class="legendItemHeader">0 - 0.02</td>
  107. <td class="legendItemValue" style="background: #FDE2CA"></td>
  108. </tr>
  109. <tr>
  110. <td class="legendItemHeader">0.02 - 0.04</td>
  111. <td class="legendItemValue" style="background: #FACE9C"></td>
  112. </tr>
  113. <tr>
  114. <td class="legendItemHeader">0.04 - 0.06</td>
  115. <td class="legendItemValue" style="background: #F09C42"></td>
  116. </tr>
  117. <tr>
  118. <td class="legendItemHeader">0.06 - 0.1</td>
  119. <td class="legendItemValue" style="background: #D0770B"></td>
  120. </tr>
  121. <tr>
  122. <td class="legendItemHeader">0.1 - 0.2</td>
  123. <td class="legendItemValue" style="background: #945305"></td>
  124. </tr>
  125. </table>
  126. </div>
  127. </div>
  128. <div id="infoBox">
  129. <div data-i18n="resources.text_attributeTable" style="text-align: center;background: #1E90FF"> </div>
  130. <div id="infoContent" style="overflow-y: auto; padding: 5px; background-color: #FFFFFF">
  131. </div>
  132. </div>
  133. </div>
  134. <script type="text/javascript" include="bootstrap,widgets.alert" src="../js/include-web.js"></script>
  135. <script type="text/javascript" exclude="iclient-classic" src="../../dist/classic/include-classic.js"></script>
  136. <script type="text/javascript">
  137. var host = window.isLocal ? window.server : "https://iserver.supermap.io",
  138. url1 = host + "/iserver/services/map-jingjin/rest/maps/京津地区地图",
  139. url2 = host + "/iserver/services/data-jingjin/rest/data";
  140. var map, layer, themeLayer;
  141. // 检测是否支持 Canvas
  142. if (!document.createElement('canvas').getContext) {
  143. widgets.alert.showAlert(resources.msg_supportCanvas, false);
  144. }
  145. map = new SuperMap.Map("map", {
  146. controls: [
  147. new SuperMap.Control.LayerSwitcher(),
  148. new SuperMap.Control.ScaleLine(),
  149. new SuperMap.Control.Zoom(),
  150. new SuperMap.Control.Navigation({
  151. dragPanOptions: {
  152. enableKinetic: true
  153. }
  154. })]
  155. });
  156. layer = new SuperMap.Layer.TiledDynamicRESTLayer("Jingjin", url1, {
  157. transparent: true,
  158. cacheEnabled: true
  159. }, {maxResolution: "auto"});
  160. layer.events.on({"layerInitialized": addLayer});
  161. // 定义 Range 分段专题图层
  162. themeLayer = new SuperMap.Layer.Range("ThemeLayer");
  163. themeLayer.setOpacity(0.8);
  164. // 图层基础样式
  165. themeLayer.style = {
  166. shadowBlur: 16,
  167. shadowColor: "#000000",
  168. fillColor: "#FFFFFF"
  169. };
  170. // 开启 hover 高亮效果
  171. themeLayer.isHoverAble = true;
  172. // hover高亮样式
  173. themeLayer.highlightStyle = {
  174. stroke: true,
  175. strokeWidth: 4,
  176. strokeColor: 'blue',
  177. fillColor: "#00EEEE",
  178. //shadowBlur: 6,
  179. //shadowColor: "#000000",
  180. //shadowOffsetX: 6,
  181. //shadowOffsetY: 6,
  182. fillOpacity: 0.8
  183. };
  184. // 用于范围分段的属性字段名称
  185. themeLayer.themeField = "POP_DENSITY99";
  186. // 风格数组,设定分段范围对应的样式
  187. themeLayer.styleGroups = [
  188. {
  189. start: 0,
  190. end: 0.02,
  191. style: {
  192. color: '#FDE2CA'
  193. }
  194. },
  195. {
  196. start: 0.02,
  197. end: 0.04,
  198. style: {
  199. color: '#FACE9C'
  200. }
  201. },
  202. {
  203. start: 0.04,
  204. end: 0.06,
  205. style: {
  206. color: '#F09C42'
  207. }
  208. },
  209. {
  210. start: 0.06,
  211. end: 0.1,
  212. style: {
  213. color: '#D0770B'
  214. }
  215. },
  216. {
  217. start: 0.1,
  218. end: 0.2,
  219. style: {
  220. color: '#945305'
  221. }
  222. }
  223. ]
  224. // 注册 mousemove 事件
  225. themeLayer.on("mousemove", evn);
  226. function addLayer() {
  227. map.addLayers([layer, themeLayer]);
  228. map.setCenter(new SuperMap.LonLat(117.2, 40.11), 0);
  229. }
  230. //获取 feature 数据, 专题图的数据必须是 SuperMap.Feature.Vector
  231. function addThemeLayer() {
  232. clearLayer();
  233. var getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams;
  234. getFeatureParam = new SuperMap.REST.FilterParameter({
  235. name: "Jingjin",
  236. attributeFilter: "SMID > -1"
  237. });
  238. getFeatureBySQLParams = new SuperMap.REST.GetFeaturesBySQLParameters({
  239. queryParameter: getFeatureParam,
  240. toIndex: 500,
  241. datasetNames: ["Jingjin:BaseMap_R"]
  242. });
  243. getFeatureBySQLService = new SuperMap.REST.GetFeaturesBySQLService(url2, {
  244. eventListeners: {"processCompleted": processCompleted, "processFailed": processFailed}
  245. });
  246. getFeatureBySQLService.processAsync(getFeatureBySQLParams);
  247. }
  248. function processCompleted(getFeaturesEventArgs) {
  249. var result = getFeaturesEventArgs.result;
  250. if (result && result.features) {
  251. themeLayer.addFeatures(result.features);
  252. }
  253. //显示图例
  254. document.getElementById("mapLegend").style.display = "block";
  255. }
  256. function processFailed(e) {
  257. widgets.alert.showAlert(e.error.errorMsg, false);
  258. }
  259. function clearLayer() {
  260. document.getElementById("mapLegend").style.display = "none";
  261. document.getElementById("infoBox").style.display = "none";
  262. //先清除上次的显示结果
  263. themeLayer.clear();
  264. }
  265. // 更新显示数据
  266. function updateData() {
  267. var feas = themeLayer.features;
  268. for (var i = 0, len = feas.length; i < len; i++) {
  269. var fea = feas[i];
  270. fea.attributes.POP_DENSITY99 = getRandomNumber(0, 0.2, 5);
  271. }
  272. themeLayer.redraw();
  273. }
  274. // 获取范围内的随机数
  275. // min - 范围下限
  276. // max - 范围上限
  277. // decimalNum - 返回结果的小数位数。如果为 0,返回整数。
  278. function getRandomNumber(min, max, decimalNum) {
  279. var rNum = min + Math.random() * (max - min);
  280. if (decimalNum) {
  281. if (!isNaN(decimalNum)) {
  282. return rNum;
  283. }
  284. else {
  285. decimalNum = parseInt(decimalNum);
  286. }
  287. if (decimalNum === 0) {
  288. return Math.round(rNum);
  289. }
  290. else {
  291. return parseFloat(rNum).toFixed(decimalNum);
  292. }
  293. }
  294. else {
  295. return rNum;
  296. }
  297. }
  298. //事件处理,控制信息框数据显示
  299. function evn(e) {
  300. if (e.target && e.target.refDataID) {
  301. document.getElementById("infoBox").style.display = "block";
  302. var fid = e.target.refDataID;
  303. var fea = themeLayer.getFeatureById(fid);
  304. if (fea) {
  305. document.getElementById("infoContent").innerHTML = "";
  306. document.getElementById("infoContent").innerHTML += "ID: " + fea.attributes.SMID + "<br/>";
  307. document.getElementById("infoContent").innerHTML += resources.text_districtName + fea.attributes.NAME + "<br/>";
  308. document.getElementById("infoContent").innerHTML += resources.text_populationDensity + ": " + parseFloat(fea.attributes.POP_DENSITY99).toFixed(5) + "<br/>";
  309. }
  310. }
  311. else {
  312. document.getElementById("infoContent").innerHTML = "";
  313. document.getElementById("infoBox").style.display = "none";
  314. }
  315. }
  316. </script>
  317. </body>
  318. </html>