说明:主要实现加载FeatureLayer并显示属性表,而要实现联动属性表与地图,首先,看看实施后的效果:

显示效果

如上图所看到的,本文章主要实现了下面几个功能:1、FeatureLayer属性表的分页载入与显示;2、属性表和地图的互操作,包含鼠标经过时在地图上显示名称并高亮显示、点击列表显示对象的信息框。例如以下图:

显示信息框

以下,说说详细的实现思路与代码。

1、FeatureLayer属性表的获取

获取FeatureLayer的属性表,首先得创建FeatureLayer对象,例如以下:

  1. ftch = new FeatureLayer("http://localhost:6080/arcgis/rest/services/shpchina/MapServer/0",{
  2. outFields: ["*"]
  3. })
  4. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,
  5. 10,
  6. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  7. new Color([255,0,0]),
  8. 1
  9. ),
  10. new Color([0,255,0,0.25])
  11. );
  12. //简单渲染
  13. var sr = new SimpleRenderer(symbol);
  14. ftch.setRenderer(sr);
  15. map.addLayer(ftch,1);

有了FeatureLayer对象,能够通过ftch.graphics获取全部的记录。获取到graphics就能获取到单个的graphic,就能获取每个graphic的attributes,例如以下:

  1. var graphics=ftch.graphics;
  2. console.log(graphics);
  3. var item = "";
  4. for(var i=0;i<graphics.length;i++){
  5. var attr = graphics[i].attributes;
  6. var id=attr.FID, name=attr.name;
  7. item+= "{\"id\":"+id+",\"text\":'"+name+"'},";
  8. }

2、属性表的分页显示

此时,就能组装分页显示属性的json对象了,例如以下:

  1. var graphics=ftch.graphics;
  2. console.log(graphics);
  3. var item = "";
  4. for(var i=0;i<graphics.length;i++){
  5. var attr = graphics[i].attributes;
  6. var id=attr.FID, name=attr.name;
  7. item+= "{\"id\":"+id+",\"text\":'"+name+"'},";
  8. }
  9. item = "["+item.substring(0,item.length-1)+"]";
  10. attr="{'total':"+graphics.length+",'items':"+item+"}";
  11. PAGE_DATA = eval('(' + attr + ')');

将属性表分页显示,如博文http://blog.csdn.net/gisshixisheng/article/details/40048451所看到的。

3、每个对象事件的绑定与实现

每个显示对象的都是一个div。给div分别加入onclick,onmouseover和onmouseout事件,三个事件传递的參数都一样,是在graphics里面的index值,接下来就是实现三个事件。具体代码例如以下:

  1. showInfo = function(index){
  2. var pt=ftch.graphics[index].geometry;
  3. var attr=ftch.graphics[index].attributes;
  4. map.infoWindow.setTitle(attr.name);
  5. map.infoWindow.setContent(attr.name);
  6. map.infoWindow.show(pt);
  7. };
  8. showObj = function(index){
  9. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,
  10. 12,
  11. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  12. new Color([255,0,0]),
  13. 1
  14. ),
  15. new Color([255,0,0,1])
  16. );
  17. ftch.graphics[index].symbol=symbol;
  18. ftch.redraw();
  19. var pt=ftch.graphics[index].geometry;
  20. var font = new esri.symbol.Font();
  21. font.setSize("10pt");
  22. font.setWeight(esri.symbol.Font.WEIGHT_BOLD);
  23. var text = new esri.symbol.TextSymbol(ftch.graphics[index].attributes.name);
  24. text.setAlign(esri.symbol.TextSymbol.ALIGN_START);
  25. text.setFont(font);
  26. text.setOffset(2,-15);
  27. text.setColor(new dojo.Color([255,0,0,1]));
  28. var labelGraphic = new esri.Graphic(pt,text);
  29. labelLayer.add(labelGraphic);
  30. };
  31. restoreObj = function(index){
  32. labelLayer.clear();
  33. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,
  34. 10,
  35. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  36. new Color([255,0,0]),
  37. 1
  38. ),
  39. new Color([0,255,0,0.25])
  40. );
  41. ftch.graphics[index].symbol=symbol;
  42. ftch.redraw();
  43. };
  44. });

showInfo相应的是单击事件。showObject相应的是鼠标经过事件,restoreObj相应的是鼠标移除事件,这样基本并能就实现了。

具体代码例如以下:

map.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
  6. <title>Simple Map</title>
  7. <link rel="stylesheet" href="http://localhost/arcgis_js_api/library/3.9/3.9/js/esri/css/esri.css">
  8. <link rel="stylesheet" href="page.css">
  9. <style>
  10. html, body, #map {
  11. height: 100%;
  12. margin: 0;
  13. padding: 0;
  14. }
  15. body {
  16. background-color: #FFF;
  17. overflow: hidden;
  18. font-family: "Trebuchet MS";
  19. }
  20. #map_ctrl{
  21. z-index: 99;
  22. position: absolute;
  23. top: 20pt;
  24. right: 10pt;
  25. background: #fff;
  26. }
  27. .button{
  28. padding: 3px;
  29. background: #eee;
  30. text-align: center;
  31. font-size: 12px;
  32. font-family: "微软雅黑";
  33. }
  34. .button:hover,.attr_ctrl:hover{
  35. background: #ccc;
  36. cursor: pointer;
  37. }
  38. #attr_ctrl{
  39. z-index: 99;
  40. width: 155px;
  41. position:absolute;
  42. right: 0px;
  43. bottom:5px;
  44. text-align: right;
  45. }
  46. .attr_ctrl{
  47. padding: 5px;
  48. font-size: 12px;
  49. font-family: "微软雅黑";
  50. width: 100px;
  51. background: #eee;
  52. border: 1px solid #000;
  53. border-bottom: none;
  54. }
  55. #map_attr{
  56. z-index: 99;
  57. font-size: 12px;
  58. font-family: "微软雅黑";
  59. width: 176px;
  60. height: 150px;
  61. background: #eee;
  62. position: absolute;
  63. bottom: 0px;
  64. right:0px;
  65. border: 1px solid #000;
  66. border-bottom: none;
  67. }
  68. </style>
  69. <script src="http://localhost/arcgis_js_api/library/3.9/3.9/init.js"></script>
  70. <script src="jquery-1.8.3.js"></script>
  71. <script src="jquery.page.js"></script>
  72. <script>
  73. var map, mapCenter, ftch;
  74. var PAGE_DATA, currpage= 1, pagesize=5;
  75. var showInfo, showObj, restoreObj;
  76. require([
  77. "esri/map",
  78. "esri/layers/ArcGISTiledMapServiceLayer",
  79. "esri/layers/FeatureLayer",
  80. "esri/layers/GraphicsLayer",
  81. "esri/geometry/Point",
  82. "esri/symbols/SimpleMarkerSymbol",
  83. "esri/symbols/SimpleLineSymbol",
  84. "esri/renderers/SimpleRenderer",
  85. "dojo/_base/Color",
  86. "dojo/on",
  87. "dojo/dom",
  88. "dojo/domReady!"],
  89. function(Map,
  90. Tiled,
  91. FeatureLayer,
  92. GraphicsLayer,
  93. Point,
  94. SimpleMarkerSymbol,
  95. SimpleLineSymbol,
  96. SimpleRenderer,
  97. Color,
  98. on,
  99. dom)
  100. {
  101. map = new Map("map", {logo:false,slider: true});
  102. var tiled = new Tiled("http://localhost:6080/arcgis/rest/services/chinamap/MapServer");
  103. map.addLayer(tiled,0);
  104. ftch = new FeatureLayer("http://localhost:6080/arcgis/rest/services/shpchina/MapServer/0",{
  105. outFields: ["*"]
  106. })
  107. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,
  108. 10,
  109. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  110. new Color([255,0,0]),
  111. 1
  112. ),
  113. new Color([0,255,0,0.25])
  114. );
  115. //简单渲染
  116. var sr = new SimpleRenderer(symbol);
  117. ftch.setRenderer(sr);
  118. map.addLayer(ftch,1);
  119. var labelLayer = new GraphicsLayer();
  120. map.addLayer(labelLayer,2);
  121. mapCenter = new Point(103.847, 36.0473, map.spatialReference);
  122. map.centerAndZoom(mapCenter,4);
  123. var navToolbar = new esri.toolbars.Navigation(map);
  124. on(dom.byId("full_extent"), "click", function(event){//全图
  125. map.centerAndZoom(mapCenter,4);
  126. });
  127. on(dom.byId("zoom_in"), "click", function(event){//拉框放大
  128. map.setMapCursor("url(cursor/zoom-in.cur),auto");
  129. navToolbar.activate(esri.toolbars.Navigation.ZOOM_IN);
  130. });
  131. on(dom.byId("zoom_out"), "click", function(event){//拉框缩小
  132. map.setMapCursor("url(cursor/zoom-out.cur),auto");
  133. navToolbar.activate(esri.toolbars.Navigation.ZOOM_OUT);
  134. });
  135. navToolbar.on("extent-history-change", function(){
  136. map.setMapCursor("default");
  137. navToolbar.deactivate();
  138. });
  139. on(dom.byId("attr_ctrl"), "click", function(event){//显示或隐藏属性表
  140. if($(".attr_ctrl").html()=="显示属性"){
  141. var graphics=ftch.graphics;
  142. console.log(graphics);
  143. var item = "";
  144. for(var i=0;i<graphics.length;i++){
  145. var attr = graphics[i].attributes;
  146. var id=attr.FID, name=attr.name;
  147. item+= "{\"id\":"+id+",\"text\":'"+name+"'},";
  148. }
  149. item = "["+item.substring(0,item.length-1)+"]";
  150. attr="{'total':"+graphics.length+",'items':"+item+"}";
  151. PAGE_DATA = eval('(' + attr + ')');
  152. loadPages(1);
  153. $("#map_attr").show();
  154. $(".attr_ctrl").html("隐藏属性");
  155. $("#attr_ctrl").css("bottom","155px");
  156. }
  157. else{
  158. $("#map_attr").hide();
  159. $(".attr_ctrl").html("显示属性");
  160. $("#attr_ctrl").css("bottom","5px");
  161. }
  162. });
  163. showInfo = function(index){
  164. var pt=ftch.graphics[index].geometry;
  165. var attr=ftch.graphics[index].attributes;
  166. map.infoWindow.setTitle(attr.name);
  167. map.infoWindow.setContent(attr.name);
  168. map.infoWindow.show(pt);
  169. };
  170. showObj = function(index){
  171. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE,
  172. 12,
  173. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  174. new Color([255,0,0]),
  175. 1
  176. ),
  177. new Color([255,0,0,1])
  178. );
  179. ftch.graphics[index].symbol=symbol;
  180. ftch.redraw();
  181. var pt=ftch.graphics[index].geometry;
  182. var font = new esri.symbol.Font();
  183. font.setSize("10pt");
  184. font.setWeight(esri.symbol.Font.WEIGHT_BOLD);
  185. var text = new esri.symbol.TextSymbol(ftch.graphics[index].attributes.name);
  186. text.setAlign(esri.symbol.TextSymbol.ALIGN_START);
  187. text.setFont(font);
  188. text.setOffset(2,-15);
  189. text.setColor(new dojo.Color([255,0,0,1]));
  190. var labelGraphic = new esri.Graphic(pt,text);
  191. labelLayer.add(labelGraphic);
  192. };
  193. restoreObj = function(index){
  194. labelLayer.clear();
  195. var symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_SQUARE,
  196. 10,
  197. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  198. new Color([255,0,0]),
  199. 1
  200. ),
  201. new Color([0,255,0,0.25])
  202. );
  203. ftch.graphics[index].symbol=symbol;
  204. ftch.redraw();
  205. };
  206. });
  207. function loadPages(page){
  208. $('#pages').html("");
  209. $('#pages').itemPage({
  210. data:PAGE_DATA,
  211. currpage:page,
  212. pagesize:pagesize
  213. });
  214. };
  215. function showPage(page){
  216. console.log(page);
  217. switch(page){
  218. case "prev":{//前一页
  219. if(currpage>1){
  220. currpage=currpage-1;
  221. }
  222. else{
  223. alert("没有上一页了!");
  224. }
  225. break;
  226. }
  227. case "next":{//后一页
  228. if(currpage!=getLastPage()){
  229. currpage=currpage+1;
  230. }
  231. else{
  232. alert("没有下一页了!
  233.  
  234. ");
  235. }
  236. break;
  237. }
  238. case "last":{//最后一页
  239. currpage=getLastPage();
  240. break;
  241. }
  242. default:{
  243. currpage=1;//第一页
  244. break;
  245. }
  246. }
  247. loadPages(currpage);
  248. };
  249. function getLastPage(){
  250. var total=PAGE_DATA.total;
  251. if(total%pagesize==0){
  252. return total/pagesize;
  253. }
  254. else{
  255. return parseInt(total/pagesize)+1;
  256. }
  257. }
  258. </script>
  259. </head>
  260.  
  261. <body>
  262. <div id="map">
  263. <div id="map_ctrl">
  264. <a id="full_extent" class="button">全 图</a>
  265. <a id="zoom_in" class="button">拉框放大</a>
  266. <a id="zoom_out" class="button">拉框缩小</a>
  267. </div>
  268. <div id="attr_ctrl">
  269. <a class="attr_ctrl">显示属性</a>
  270. </div>
  271. <div id="map_attr" style="display: none">
  272. <div id="pages">
  273. </div>
  274. </div>
  275. </div>
  276. </body>
  277. </html>

page.css

  1. .page_item{
  2. background:#C9DCD7;
  3. width:170px;
  4. text-align:left;
  5. padding-left:10px;
  6. padding-top:3px;
  7. padding-bottom:3px;
  8. border-bottom:1px solid #3CF;
  9. }
  10. .page_item:hover{
  11. background:#A9C9FA;
  12. cursor:pointer;
  13. }
  14. #page_ctrl{
  15. padding-top:5px;
  16. }
  17. .page_ctrl{
  18. width:40px;
  19. text-align:center;
  20. background:#A9C9FA;
  21. float:left;
  22. margin:2px;
  23. padding-top:5px;
  24. padding-bottom:5px;
  25. }
  26. .page_ctrl:hover{
  27. background:#C9DCD7;
  28. cursor:pointer;
  29. }

jquery.page.js

  1. /**
  2. * Created by Administrator on 14-10-18.
  3. */
  4. (function($){
  5. $.fn.itemPage = function(options){
  6. var defaults = {};
  7. var options = $.extend(defaults, options);
  8.  
  9. var data=options.data,//数据
  10. currpage=options.currpage,//当前页
  11. pagesize=options.pagesize;//每页显示的数据条目器
  12.  
  13. var total=data.total;
  14.  
  15. var items=$("<div id='items'></div>"),
  16. pagectrl=$("<div id='page_ctrl'></div>");
  17.  
  18. var first=$("<div id=\"first\" class=\"page_ctrl\" onClick=\"showPage('first')\">首 页</div>"),
  19. prev=$("<div id=\"prev\" class=\"page_ctrl\" onClick=\"showPage('prev')\">前一页</div>"),
  20. next=$("<div id=\"next\" class=\"page_ctrl\" onClick=\"showPage('next')\">后一页</div>"),
  21. last=$("<div id=\"last\" class=\"page_ctrl\" onClick=\"showPage('last')\">末 页</div>");
  22.  
  23. var start=getStartindex(),
  24. end=getEndindex();
  25.  
  26. for(var i=start;i<end;i++){
  27. var itemi=$("<div class='page_item' onclick='showInfo("+i+")' onmouseout='restoreObj("+i+")' onmouseover='showObj("+i+")'>"+data.items[i].text+"</div>");
  28. items.append(itemi);
  29. }
  30.  
  31. pagectrl.append(first),
  32. pagectrl.append(prev),
  33. pagectrl.append(next)
  34. pagectrl.append(last);
  35.  
  36. var container = $(this);
  37. container.append(items),
  38. container.append(pagectrl);
  39.  
  40. function getStartindex(){
  41. return (currpage-1)*pagesize;
  42. }
  43. function getEndindex(){
  44. var endIndex=0;
  45. if(data.total%pagesize!=0 && currpage==getLastPage()){
  46. endIndex = data.total;
  47. }
  48. else {
  49. endIndex = currpage*pagesize;
  50. }
  51. return endIndex;
  52. }
  53. }
  54. })(jQuery);

到此功能基本上完毕。非常多有待优化,还望继续关注LZUGIS之Arcgis for Javascript系列博文。您的支持就是我的动力,谢谢。

QQ:1004740957

mail:niujp08@qq.com

版权声明:本文博主原创文章。博客,未经同意不得转载。

Arcgis for Javascript之featureLayer图和属性互操作性的更多相关文章

  1. Arcgis for Javascript之featureLayer图和属性的互操作

    说明:主要实现加载FeatureLayer与显示属性表,并实现属性表与地图的联动,首先,看看实现后的效果: 显示效果 如上图所示,本文章主要实现了以下几个功能:1.FeatureLayer属性表的分页 ...

  2. arcgis for javascript 添加featurelayer,设置地图最大最小等级

    转自原文arcgis for javascript 添加featurelayer,设置地图最大最小等级 var map; var livingCenter; var livingCenterUrl = ...

  3. Arcgis for Javascript实现图

    首先,截个图给大家看结果: 初始化状态 放大后的状态 点击选中后的状态 如上图所看到的,一般的涉及到的地图的统计涉及到上述所展示的三个状态:1.初始化状态.2.缩放后的状态:3.点击选中显示详情状态. ...

  4. ArcGIS for JavaScript继承TiledMapServiceLayer来实现“动态切图”

    这种方式可以提高出图速度于效果,算法见http://blog.newnaw.com/?p=633,我用ArcGIS for JavaScript API来实现.具体代码为: function init ...

  5. arcgis for javascript之ArcGISDynamicMapServiceLayer图层控制的实现

    图层控制是非常多GIS系统里面必须的一个小功能,本文就说说arcgis for javascript下ArcGISDynamicMapServiceLayer图层控制的实现方式.首先看图: 实现效果 ...

  6. 利用Arcgis for javascript API绘制GeoJSON并同时弹出多个Popup

    1.引言 由于Arcgis for javascript API不可以绘制Geojson,并且提供的Popup一般只可以弹出一个,在很多专题图制作中,会遇到不少的麻烦.因此本文结合了两个现有的Arcg ...

  7. Arcgis for Javascript之统计图的实现

    首先,截个图给大家看看效果: 初始化状态 放大后的状态 点击选中后的状态 如上图所示,一般的涉及到的地图的统计涉及到上述所展示的三个状态:1.初始化状态:2.缩放后的状态:3.点击选中显示详情状态.第 ...

  8. 关于ArcGis for javascript的使用

    1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...

  9. Arcgis for Javascript API下类似于百度搜索A、B、C、D marker的实现方式

    原文:Arcgis for Javascript API下类似于百度搜索A.B.C.D marker的实现方式 多说无益,首先贴两张图让大家看看具体的效果: 图1.百度地图搜索结果 图2.Arcgis ...

随机推荐

  1. Oracle Data Provider for .NET 的使用经验

    原文:Oracle Data Provider for .NET 的使用经验 Oracle Data Provider for .NET 是Oracle提供的基于Ado.net接口的一个开发包.    ...

  2. Ubuntu 组态 Tomcat而每天的错误解决

    统环境:Ubuntu 14.10 安装版本号:apache-tomcat-7.0.54.tar.gz 安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.54.tar.gz ...

  3. linux下查找某个文件

    参考http://blog.csdn.net/gray13/article/details/6365654 一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 ...

  4. Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils

    1.错误叙述性说明 2014-7-10 23:12:23 org.apache.catalina.core.StandardContext filterStart 严重: Exception star ...

  5. NETSH WINSOCK RESET这个命令的意义和效果?

    简要地netsh winsock reset命令含义复位 Winsock 文件夹.一机多用的假设Winsock协议配置问题,那么问题会导致网络连接,我们需要使用netsh winsock reset命 ...

  6. oracle错误之 ora-01017

    ora-01017 现象描述: scott用户和其它建立的用户,都登的上.但sys和system用户登录不上 方案一(试过,不行): 1,打开目录:F:\app\Administrator\produ ...

  7. POJ 3684 Priest John&#39;s Busiest Day 2-SAT+输出路径

    强连通算法推断是否满足2-sat,然后反向建图,拓扑排序+染色. 一种选择是从 起点開始,还有一种是终点-持续时间那个点 開始. 若2个婚礼的某2种时间线段相交,则有矛盾,建边. easy出错的地方就 ...

  8. 邮箱password复位图

    blog宗旨:用图说话 辅助文字说明: 长处:用户系统完毕接口部分.界面留给业务自行设计. 缺点:邮箱发送邮件定制模板,没有完毕松耦合. 改进点:邮箱的准备发送邮件模板. 版权声明:本文博客原创文章, ...

  9. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  10. 【rman,1】经典案例增量备份

    一.备份策略: 1.星期天晚上      -level 0 backup performed(全备份) 2.星期一晚上      -level 2 backup performed 3.星期二晚上   ...