GOISTopic.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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.0, maximum-scale=1.0, user-scalable=0"/>
  6. <meta name="apple-mobile-web-app-capable" content="yes"/>
  7. <title>麻点图专题</title>
  8. <link href='./css/bootstrap.min.css' rel='stylesheet'/>
  9. <link href='./css/bootstrap-responsive.min.css' rel='stylesheet'/>
  10. <link href='./css/sm-extend.css' rel='stylesheet'/>
  11. <link href='./css/sm-doc.css' rel='stylesheet'/>
  12. </head>
  13. <body data-spy="scroll" data-target=".subnav" data-offset="50">
  14. <!--导航条-->
  15. <div class="navbar navbar-fixed-top" id="navbar"></div>
  16. <script src="js/navbar.js"></script>
  17. <script src="./js/GoTop.js" id="js_gotop"></script>
  18. <div id='container' class='container'>
  19. <div class='page-header'>
  20. <h1>麻点图专题</h1>
  21. <hr/>
  22. <h2>一、引言</h2>
  23. <p>
  24. 目前在客户端绘制POI(Point of Interest,兴趣点)的方式主要是div(Marker的形式)、svg、canvas、VML(后边三种就是Vector Layer)几种方式,这几种方式中只有canvas的效率是最高的,但是canvas只有一些最新的浏览器才支持。虽然div、svg、VML跨浏览器要好一些,但是这几种的效率不够高,最多只能绘制几千个POI。
  25. </p>
  26. <p>
  27. 为了展现出大数据量的POI,我们也可以考虑将POI数据集通过iServer发布为临时图层,然后在客户端使用动态图层展现出来,这样解决了数据量大和跨浏览器的问题,但是这些POI没法响应鼠标事件。
  28. </p>
  29. <p>
  30. 于是麻点图应运而生。
  31. </p>
  32. <h2>二、简介</h2>
  33. <p>
  34. SuperMap iClient for JavaScript 提供了麻点图功能,这是一种很高效的web端大数据量渲染解决方案。该功能支持大数据量、跨浏览器、事件响应,并且效率高。
  35. 在大部分主流浏览器下都能快速渲染,且轻松漫游地图。
  36. </p>
  37. <div class="pageImage"><img src="./images/goisTopic2.png"/></div>
  38. <br>
  39. <p>
  40. 该功能实际上是先调用SuperMap.REST.GetLayersInfoService获取到服务端图层信息,然后修改图层信息,使用SuperMap.REST.SetLayersInfoService设置图层信息创建临时图层,再使用SuperMap.Layer.TiledDynamicRESTLayer将该临时图层在客户端渲染出来。到这一步,大数据量的点就通过瓦片图片的方式在客户端渲染出来了。
  41. </p>
  42. <p>
  43. 然后我们再创建SuperMap.Layer.UTFGrid对象,来让这些POI有鼠标事件响应。然后在最上层叠加一个SuperMap.Layer.Markers,当鼠标移动到某个POI上时,就会在相应位置添加一个Marker,高亮该点。
  44. </p>
  45. <h2>三、性能</h2>
  46. <div class="pageImage"><img src="./images/goisTopic3.png"/></div>
  47. <br>
  48. <p>
  49. 以上报告为服务端存在临时图层缓存的情况下,渲染POI点所用的时间,当初次使用麻点图功能时渲染会比较慢(大数据量下服务端动态切图是一个比较耗时的操作),初次使用之后(服务端已经存在缓存)渲染POI就要快很多了。
  50. </p>
  51. <h2>四、使用说明</h2>
  52. <br>
  53. <p>下面我们来详细介绍一下如何使用麻点图。</p>
  54. <br>
  55. <h4>
  56. 首先创建一个麻点图对象。
  57. </h4>
  58. <p>
  59. <pre>
  60. var url = "http://localhost:8090/iserver/services/map-china400/rest/maps/China";
  61. var myGOIs = new SuperMap.GOIs({
  62. "url":url,
  63. "datasetName":"China_Town_P@China400",
  64. "style":new SuperMap.REST.ServerStyle({
  65. "markerSymbolID":907941,
  66. "markerSize":8
  67. }),
  68. "pixcell": 16
  69. });
  70. </pre>
  71. </p>
  72. <p>
  73. 以上代码片段中创建麻点图需要传入一些参数:url为所使用的地图服务的url(通常和TiledDynamicRESTLayer使用的url相同),datasetName为数据对应的子图层名称,
  74. style为要素的样式风格,这里需要传入SuperMap.REST.ServerStyle类型的对象。
  75. </p>
  76. <br>
  77. <h4>
  78. 然后给麻点图对象绑定 initialized 事件,麻点图初始化完成后会触发该事件。
  79. </h4>
  80. <pre>
  81. myGOIs.events.on({
  82. "initialized":GOIsInitialized
  83. });
  84. function GOIsInitialized(){
  85. //获取麻点图内部创建的图层对象,并添加到map上
  86. var layers = myGOIs.getLayers();
  87. map.addLayers(layers);
  88. //创建麻点图事件控件,该控件用于实现麻点图的事件响应。
  89. control = new SuperMap.Control.GOIs(layers,{
  90. onClick:function(evt){ //定义click事件
  91. //code
  92. },
  93. highlightIcon:new SuperMap.Icon('images/circle.png', new SuperMap.Size(16,16), new SuperMap.Pixel(-8, -8)),//高亮状态下的点样式
  94. isHighlight:true
  95. });
  96. map.addControl(control); //将控件添加到map上
  97. }
  98. </pre>
  99. <br>
  100. <div>
  101. <h5>这里给麻点图绑定初始化完成事件,初始化完成后需要完成如下步骤:</h5>
  102. <ul style="list-style-type:disc;margin-left:68px;">
  103. <li>获取麻点图内部创建的图层对象,并添加到map上,这里你会得到三个图层对象,
  104. 它们分别是:临时图层(TiledDynamicRESTLayer)、utfgrid图层、marker图层(用于实现高亮效果)。</li>
  105. <li>创建麻点图事件控件,该控件用于实现麻点图的事件响应,将该控件添加到map上。</li>
  106. </ul>
  107. <br>
  108. <h5>用户需要自己制作一张要素高亮风格的图片,并将该图片设置到控件的highlightIcon属性中</h5>
  109. <pre>
  110. highlightIcon:new SuperMap.Icon('images/circle.png', new SuperMap.Size(16,16), new SuperMap.Pixel(-8, -8)),//高亮状态下的点样式
  111. </pre>
  112. <br>
  113. <h5>用户可以通过SuperMap.Control.GOIs给麻点图添加鼠标事件</h5>
  114. <p>可以通过初始化该控件时,以传参数的方式定义事件。</p>
  115. <pre>
  116. var control = new SuperMap.Control.GOIs(layers,{
  117. onClick:function(evt){ //定义click事件
  118. //code
  119. }
  120. });
  121. </pre>
  122. <p>也可以通过事件绑定的方式,给麻点图定义事件。</p>
  123. <pre>
  124. control.events.on("mouseover",function(){
  125. //code
  126. });
  127. </pre>
  128. <p>麻点图提供了丰富的鼠标事件类型:</p>
  129. <ul style="list-style-type:disc;margin-left:68px;">
  130. <li>onMouseover</li>
  131. <li>onMouseout</li>
  132. <li>onMousemove</li>
  133. <li>onMousedown</li>
  134. <li>onMouseup</li>
  135. <li>onClick</li>
  136. <li>onDblclick</li>
  137. </ul>
  138. </div>
  139. <h4>
  140. 以下是完整的范例代码:
  141. </h4>
  142. <pre>
  143. &#60;!DOCTYPE&#62;
  144. &#60;html&#62;
  145. &#60;head&#62;
  146. &#60;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&#62;
  147. &#60;title&#62;麻点图&#60;/title&#62;
  148. &#60;style type="text/css"&#62;
  149. body{
  150. margin: 0;
  151. overflow: hidden;
  152. background: #fff;
  153. }
  154. #map{
  155. position: relative;
  156. height: 520px;
  157. border:1px solid #3473b7;
  158. }
  159. #toolbar {
  160. position: relative;
  161. padding-top: 5px;
  162. padding-bottom: 10px;
  163. }
  164. &#60;/style&#62;
  165. &#60;script src='../libs/SuperMap.Include.js'&#62;&#60;/script&#62;
  166. &#60;script type="text/javascript"&#62;
  167. var map,datasetName,popup,myGOIs,control,
  168. host = document.location.toString().match(/file:\/\//)?"http://localhost:8090":'http://' + document.location.host,
  169. url=host+"/iserver/services/map-china400/rest/maps/China";
  170. function init(){
  171. map = new SuperMap.Map("map",{controls: [
  172. new SuperMap.Control.LayerSwitcher(),
  173. new SuperMap.Control.ScaleLine(),
  174. new SuperMap.Control.Zoom(),
  175. new SuperMap.Control.Navigation({
  176. dragPanOptions: {
  177. enableKinetic: true
  178. }
  179. })],allOverlays: true,projection: "EPSG:3857"
  180. });
  181. layer = new SuperMap.Layer.TiledDynamicRESTLayer("china", url, {transparent: true, cacheEnabled: true}, {maxResolution:"auto"});
  182. layer.events.on({"layerInitialized":addLayer});
  183. }
  184. function addLayer() {
  185. map.addLayers([layer]);
  186. map.setCenter(new SuperMap.LonLat(11782422.179601, 4717749.8315665), 3);
  187. }
  188. function createLayer(){
  189. datasetName = "China_Town_P@China400";
  190. //创建一个麻点图对象
  191. myGOIs = new SuperMap.GOIs({
  192. "url":url,
  193. "datasetName":datasetName,
  194. "style":new SuperMap.REST.ServerStyle({
  195. "markerSymbolID":907942,
  196. "markerSize":4
  197. }),
  198. "pixcell": 16
  199. });
  200. myGOIs.events.on({
  201. "initialized":GOIsInitialized
  202. });
  203. }
  204. function clearLayer(){
  205. closeInfoWin();
  206. var layers = myGOIs.getLayers();
  207. for(var i=0;i&#60;layers.length;i++){
  208. map.removeLayer(layers[i]);
  209. }
  210. myGOIs.destroy();
  211. myGOIs = null;
  212. control.destroy();
  213. control = null;
  214. }
  215. function GOIsInitialized(){
  216. var layers = myGOIs.getLayers();
  217. map.addLayers(layers);
  218. control = new SuperMap.Control.GOIs(layers,{
  219. onClick:function(evt){
  220. var lonlat = evt.loc;
  221. var name = evt.data.NAME;
  222. openInfoWin(lonlat,name);
  223. },
  224. highlightIcon:new SuperMap.Icon('images/circle.png', new SuperMap.Size(16,16), new SuperMap.Pixel(-8, -8)),
  225. isHighlight:true
  226. });
  227. map.addControl(control);
  228. }
  229. function openInfoWin(lonlat,name){
  230. closeInfoWin();
  231. var contentHTML = "&#60;div style=\'font-size:.8em; opacity: 0.8; overflow-y:hidden;\'&#62;";
  232. contentHTML += "&#60;div&#62;"+name+"&#60;/div&#62;&#60;/div&#62;";
  233. popup = new SuperMap.Popup.FramedCloud("popwin",new SuperMap.LonLat(lonlat.lon,lonlat.lat),null,contentHTML,null,true,function(){
  234. closeInfoWin();
  235. control.removeClickedMarker();
  236. });
  237. map.addPopup(popup);
  238. }
  239. function closeInfoWin() {
  240. if (popup) {
  241. try {
  242. map.removePopup(popup);
  243. }
  244. catch (e) {
  245. }
  246. }
  247. }
  248. &#60;/script&#62;
  249. &#60;/head&#62;
  250. &#60;body onload="init()"&#62;
  251. &#60;div id="toolbar"&#62;
  252. &#60;input type="button" value="渲染麻点图" onclick="createLayer()" /&#62;
  253. &#60;input type="button" value="清除" onclick="clearLayer()" /&#62;
  254. &#60;/div&#62;
  255. &#60;div id="map"&#62;&#60;/div&#62;
  256. &#60;/body&#62;
  257. &#60;/html&#62;
  258. </pre>
  259. <div class="pageImage"><img src="./images/goisTopic1.png"/></div>
  260. <br />
  261. <p>
  262. 这样我们就可以使用麻点图功能了,完整范例请见 示范程序->可视化->可视化图层->麻点图。
  263. </p>
  264. </div>
  265. <div class='footer'>
  266. <p>版权所有&nbsp;&copy; 2000-2016 &nbsp;北京超图软件股份有限公司</p>
  267. </div>
  268. </div>
  269. <script src='./js/jquery.js'></script>
  270. <script src='./js/bootstrap.js'></script>
  271. </body>
  272. </html>