http://blog.csdn.net/gisshixisheng/article/details/71009901

概述

买房的各位亲们不知是否留意过链家的"地图找房",这样的功能对于使用者来说,是非常方便的,大家可通过连接(https://bj.lianjia.com/ditu/)查看具体效果。鉴于此,本文结合该效果与功能,介绍在Arcgis4js中如何实现类似的效果。

功能效果

1、数据的聚合展示

2、地图高亮

3、聚合数据的钻取

4、列表展示

编码实现

1、数据的聚合展示

链家的实现是基于距离的一个聚合展示,在本实例中做了简化,聚合是通过后台统计查询实现的,其数据组织格式如下:

之后,在地图上做展示,关键代码如下:

  1. $("#network").on("click",function(){
  2. for(var i=0;i<data.length;i++){
  3. var _d = data[i];
  4. var geometry = getGeomByWKT(_d.wkt);
  5. var pt = geometry.getCentroid();
  6. var sms = new SimpleMarkerSymbol(
  7. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  8. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  9. new Color([255,0,0]), 2),
  10. new Color([255,0,0,0.5]));
  11. var tsname = new TextSymbol(_d.counname).setOffset(0, 6).setColor(new Color([255,255,255])) ;
  12. var tsprice = new TextSymbol(_d.price.toFixed(2)+"万").setOffset(0, -7).setColor(new Color([255,255,255]));
  13. var tscount = new TextSymbol(_d.count+"套").setOffset(0, -22).setColor(new Color([255,255,255]));
  14. var _gd = _d;
  15. _d.index = i;
  16. _gd.id="graphic"+i;
  17. gLayer.add(new Graphic(pt, sms, _gd));
  18. gLayer.add(new Graphic(pt, tsname,_d));
  19. gLayer.add(new Graphic(pt, tsprice,_d));
  20. gLayer.add(new Graphic(pt, tscount,_d));
  21. }
  22. });

实现后效果入下:

2、地图高亮展示

地图高亮展示是鼠标经过聚合点时高亮展示该区域,代码如下:

  1. gLayer.on("mouse-over",function(e){
  2. map.setMapCursor("pointer");
  3. var sms = new SimpleMarkerSymbol(
  4. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  5. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  6. new Color([0,0,255]), 2),
  7. new Color([0,0,255,0.5]));
  8. var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
  9. _zoneG.setSymbol(sms);
  10. gLayer.redraw();
  11. zLayer.clear();
  12. var geometry = getGeomByWKT(e.graphic.attributes.wkt);
  13. var sfs = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
  14. new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,
  15. new Color([0,0,255]), 2),new Color([0,0,255,0.25])
  16. );
  17. var gfx = new Graphic(geometry,sfs);
  18. zLayer.add(gfx);
  19. });
  20. gLayer.on("mouse-out",function(e){
  21. map.setMapCursor("default");
  22. var sms = new SimpleMarkerSymbol(
  23. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  24. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  25. new Color([255,0,0]), 2),
  26. new Color([255,0,0,0.5]));
  27. var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
  28. _zoneG.setSymbol(sms);
  29. gLayer.redraw();
  30. zLayer.clear();
  31. })

实现后效果入下:

3、聚合数据的钻取与列表展示

点击聚合数据点,钻取数据,数据分别以地图和列表两种方式进行展示,关键代码如下:

  1. function addZoneData(attr){
  2. var geometry = getGeomByWKT(attr.wkt);
  3. var extent = geometry.getExtent();
  4. map.setExtent(extent);
  5. var data = getZoneData(extent);
  6. $(".popup_main").show();
  7. var nsrlist = $("#nsrlist").html("");
  8. lLayer.clear();
  9. lLayer.show();
  10. var path = "m127,193l103,0l0,33l-56,0l-11,12l-11,-11l-25.00003,0.00002l0.00003,-34.00002z";
  11. var _sum = 0;
  12. for(var i=0;i<data.length;i++){
  13. var _d = data[i];
  14. var pt = new Point(_d.X, _d.Y, map.spatialReference);
  15. var pms = new PictureMarkerSymbol("img/marker.png",24,24);
  16. lLayer.add(new Graphic(pt, pms,_d));
  17. var _li = $("<li/>").css("position","relative").appendTo(nsrlist);
  18. _li.append('<div class="image"><img src="img/marker.png" /></div>');
  19. _li.append('<div class="content">'+
  20. '<div class="item-tle">'+_d.NSRNAME+'</div>'+_d.NSRSUM+'万'+
  21. '</div>');
  22. _sum+=_d.NSRSUM;
  23. _li.data("attr",_d);
  24. _li.on("click",function(){
  25. var _attr = $(this).data("attr");
  26. showObjInfo(_attr);
  27. });
  28. }
  29. $("#summary").html(attr.counname+"共有纳税人"+data.length+"人,共纳税"+_sum.toFixed(3)+"万元。")
  30. $("#block_close").on("click",function(){
  31. $(".popup_main").hide();
  32. lLayer.clear();
  33. map.infoWindow.hide();
  34. });
  35. }

实现效果如下:

上述实现完整代码如下:

  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://jsapi.thinkgis.cn/esri/css/esri.css">
  8. <style>
  9. html, body, #map {
  10. height: 100%;
  11. width: 100%;
  12. margin: 0;
  13. padding: 0;
  14. }
  15. body {
  16. background-color: #FFF;
  17. overflow: hidden;
  18. font-family: "Trebuchet MS";
  19. }
  20. .info-content a{
  21. float:right;
  22. }
  23. .popup_main{
  24. border:1px solid #cdcdcd;
  25. z-index:1001;
  26. position:absolute;
  27. background:#fff;
  28. overflow:hidden;
  29. left:20px;
  30. top:100px;
  31. width:330px;
  32. display: none;
  33. }
  34. .popup_main .title {
  35. border-bottom:1px solid #dadada;
  36. height:25px;
  37. line-height:25px;
  38. font-size:12px;
  39. color:#4c4c4c;
  40. padding-left:7px;
  41. }
  42. .popup_main .summary {
  43. margin:2px;
  44. background: #ccc;
  45. padding: 8px;
  46. border-bottom:1px solid #ddd;
  47. }
  48. .popup_main .content {
  49. height:auto;
  50. padding: 8px;
  51. border-bottom:1px solid #ddd;
  52. }
  53. .popup_main ul{
  54. list-style: none;
  55. margin: -0px 0;
  56. overflow:hidden;
  57. overflow-y:auto;
  58. max-height: 500px;
  59. }
  60. .popup_main ul li {
  61. position: relative;
  62. margin-left: -40px;
  63. position: relative;
  64. border-bottom:1px solid #ddd;
  65. cursor: pointer;
  66. height: 50px;
  67. }
  68. .popup_main ul li:hover{
  69. background: #ccc;
  70. }
  71. .popup_main ul li .image{
  72. position:absolute;
  73. left:8px;
  74. top: 10px;
  75. height:30px;
  76. text-align:center;
  77. width:30px;
  78. line-height:15px;
  79. }
  80. .popup_main ul li .image img{
  81. height: 100%;
  82. }
  83. .popup_main ul li .content{
  84. width: 85%;
  85. float: right;
  86. border: none;
  87. }
  88. .popup_main ul li .content div.item-tle{
  89. font-size: 14px;
  90. color: #262626;
  91. font-weight: 800;
  92. overflow: hidden;
  93. text-overflow: ellipsis;
  94. line-height: 1;
  95. }
  96. .popup_main button{
  97. position: absolute;
  98. z-index: 50;
  99. top: 7px;
  100. right: 6px;
  101. width: 12px;
  102. height: 12px;
  103. background: url(img/popup_close_15d2283.gif) no-repeat;
  104. border: 0;
  105. cursor: pointer;
  106. }
  107. </style>
  108. <script type="text/javascript">
  109. dojoConfig = {
  110. parseOnLoad: true,
  111. packages: [{
  112. name: 'tdlib',
  113. location: this.location.pathname.replace(/\/[^/]+$/, "")+"/tdtlib"
  114. }]
  115. };
  116. </script>
  117. <script src="http://jsapi.thinkgis.cn/init.js"></script>
  118. <script src="http://lzugis.d152.ptzygj.com/app/js/jquery/jquery-1.8.3.js"></script>
  119. <script src="terraformer/terraformer.js"></script>
  120. <script src="terraformer/terraformer-wkt-parser.js"></script>
  121. <script src="terraformer/terraformer-arcgis-parser.js"></script>
  122. <script src="data.js"></script>
  123. <script>
  124. var map;
  125. require([
  126. "esri/map",
  127. "tdlib/TDTTilesLayer",
  128. "esri/layers/GraphicsLayer",
  129. "esri/geometry/Point",
  130. "esri/geometry/Extent",
  131. "esri/geometry/Polyline",
  132. "esri/symbols/SimpleLineSymbol",
  133. "esri/symbols/SimpleMarkerSymbol",
  134. "esri/symbols/PictureMarkerSymbol",
  135. "esri/symbols/SimpleFillSymbol",
  136. "esri/symbols/TextSymbol",
  137. "esri/Color",
  138. "esri/geometry/jsonUtils",
  139. "esri/graphic",
  140. "esri/dijit/InfoWindow",
  141. "dojo/domReady!"],
  142. function(Map,
  143. TDTTilesLayer,
  144. GraphicsLayer,
  145. Point,
  146. Extent,
  147. Polyline,
  148. SimpleLineSymbol,
  149. SimpleMarkerSymbol,
  150. PictureMarkerSymbol,
  151. SimpleFillSymbol,
  152. TextSymbol,
  153. Color,
  154. geometryJsonUtils,
  155. Graphic,InfoWindow)
  156. {
  157. map = new Map("map", {
  158. logo: false,
  159. center: [116.43228121152976, 40.20122178384614], // longitude, latitude
  160. zoom: 7
  161. });
  162. var vec_c = new TDTTilesLayer("vec")
  163. map.addLayer(vec_c);
  164. var zLayer = new GraphicsLayer();
  165. map.addLayer(zLayer);
  166. var gLayer = new GraphicsLayer();
  167. map.addLayer(gLayer);
  168. var lLayer = new GraphicsLayer();
  169. map.addLayer(lLayer);
  170. lLayer.on("mouse-over",function(e){
  171. map.setMapCursor("pointer");
  172. })
  173. lLayer.on("mouse-out",function(e){
  174. map.setMapCursor("default");
  175. })
  176. lLayer.on("click",function(e){
  177. var attr = e.graphic.attributes;
  178. if(attr){
  179. showObjInfo(attr);
  180. }
  181. })
  182. map.on("zoom-end",function(anchor,extent,level,zoomFactor){
  183. if(map.getZoom()<8){
  184. gLayer.show();
  185. lLayer.hide();
  186. map.infoWindow.hide();
  187. };
  188. });
  189. $("#network").on("click",function(){
  190. for(var i=0;i<data.length;i++){
  191. var _d = data[i];
  192. var geometry = getGeomByWKT(_d.wkt);
  193. var pt = geometry.getCentroid();
  194. var sms = new SimpleMarkerSymbol(
  195. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  196. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  197. new Color([255,0,0]), 2),
  198. new Color([255,0,0,0.5]));
  199. var tsname = new TextSymbol(_d.counname).setOffset(0, 6).setColor(new Color([255,255,255])) ;
  200. var tsprice = new TextSymbol(_d.price.toFixed(2)+"万").setOffset(0, -7).setColor(new Color([255,255,255]));
  201. var tscount = new TextSymbol(_d.count+"套").setOffset(0, -22).setColor(new Color([255,255,255]));
  202. var _gd = _d;
  203. _d.index = i;
  204. _gd.id="graphic"+i;
  205. gLayer.add(new Graphic(pt, sms, _gd));
  206. gLayer.add(new Graphic(pt, tsname,_d));
  207. gLayer.add(new Graphic(pt, tsprice,_d));
  208. gLayer.add(new Graphic(pt, tscount,_d));
  209. }
  210. });
  211. gLayer.on("mouse-over",function(e){
  212. map.setMapCursor("pointer");
  213. var sms = new SimpleMarkerSymbol(
  214. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  215. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  216. new Color([0,0,255]), 2),
  217. new Color([0,0,255,0.5]));
  218. var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
  219. _zoneG.setSymbol(sms);
  220. gLayer.redraw();
  221. zLayer.clear();
  222. var geometry = getGeomByWKT(e.graphic.attributes.wkt);
  223. var sfs = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
  224. new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,
  225. new Color([0,0,255]), 2),new Color([0,0,255,0.25])
  226. );
  227. var gfx = new Graphic(geometry,sfs);
  228. zLayer.add(gfx);
  229. });
  230. gLayer.on("mouse-out",function(e){
  231. map.setMapCursor("default");
  232. var sms = new SimpleMarkerSymbol(
  233. SimpleMarkerSymbol.STYLE_CIRCLE, 60,
  234. new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  235. new Color([255,0,0]), 2),
  236. new Color([255,0,0,0.5]));
  237. var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
  238. _zoneG.setSymbol(sms);
  239. gLayer.redraw();
  240. zLayer.clear();
  241. })
  242. gLayer.on("click",function(e){
  243. gLayer.hide();
  244. addZoneData(e.graphic.attributes);
  245. });
  246. function getGraphicById(id){
  247. var g = null;
  248. var graphics = gLayer.graphics;
  249. for(var i=0,len = graphics.length;i<len;i++){
  250. var graphic = graphics[i];
  251. if(graphic.attributes.id===id){
  252. g = graphic;
  253. break;
  254. }
  255. }
  256. return g;
  257. }
  258. function getGeomByWKT(wkt){
  259. var primitive = Terraformer.WKT.parse(wkt);
  260. var arcgis = Terraformer.ArcGIS.convert(primitive);
  261. return geometryJsonUtils.fromJson(arcgis);
  262. }
  263. function getZoneData(extent){
  264. var data = [];
  265. for(var i=0;i<10;i++){
  266. var nusnum = GetRandomNum(10,100).toFixed(3);
  267. nusnum = parseFloat(nusnum);
  268. data.push({
  269. X:GetRandomNum(extent.xmin,extent.xmax),
  270. Y:GetRandomNum(extent.ymin,extent.ymax),
  271. NSRNAME:"name"+i,
  272. NSRSUM:nusnum,
  273. URL:"#"
  274. });
  275. }
  276. return data;
  277. }
  278. function addZoneData(attr){
  279. var geometry = getGeomByWKT(attr.wkt);
  280. var extent = geometry.getExtent();
  281. map.setExtent(extent);
  282. var data = getZoneData(extent);
  283. $(".popup_main").show();
  284. var nsrlist = $("#nsrlist").html("");
  285. lLayer.clear();
  286. lLayer.show();
  287. var path = "m127,193l103,0l0,33l-56,0l-11,12l-11,-11l-25.00003,0.00002l0.00003,-34.00002z";
  288. var _sum = 0;
  289. for(var i=0;i<data.length;i++){
  290. var _d = data[i];
  291. var pt = new Point(_d.X, _d.Y, map.spatialReference);
  292. var pms = new PictureMarkerSymbol("img/marker.png",24,24);
  293. lLayer.add(new Graphic(pt, pms,_d));
  294. var _li = $("<li/>").css("position","relative").appendTo(nsrlist);
  295. _li.append('<div class="image"><img src="img/marker.png" /></div>');
  296. _li.append('<div class="content">'+
  297. '<div class="item-tle">'+_d.NSRNAME+'</div>'+_d.NSRSUM+'万'+
  298. '</div>');
  299. _sum+=_d.NSRSUM;
  300. _li.data("attr",_d);
  301. _li.on("click",function(){
  302. var _attr = $(this).data("attr");
  303. showObjInfo(_attr);
  304. });
  305. }
  306. $("#summary").html(attr.counname+"共有纳税人"+data.length+"人,共纳税"+_sum.toFixed(3)+"万元。")
  307. $("#block_close").on("click",function(){
  308. $(".popup_main").hide();
  309. lLayer.clear();
  310. map.infoWindow.hide();
  311. });
  312. }
  313. function showObjInfo(data){
  314. var location = new Point(data.X, data.Y, map.spatialReference);
  315. map.infoWindow.setTitle(data.NSRNAME);
  316. var content= $("<div/>").addClass("info-content");
  317. content.append("<b>纳税人名称:</b>"+data.NSRNAME);
  318. content.append("<br/><b>纳税人金额:</b>"+data.NSRSUM);
  319. content.append("<br/><a href="+data.URL+">详细信息>></a>");
  320. map.infoWindow.setContent(content[0]);
  321. map.infoWindow.show(location, InfoWindow.ANCHOR_UPPERRIGHT);
  322. map.centerAt(location);
  323. }
  324. });
  325. function GetRandomNum(min, max){
  326. var r = Math.random()*(max - min);
  327. var re=r+min;
  328. return re;
  329. }
  330. </script>
  331. </head>
  332. <body>
  333. <div id="map">
  334. <div class="popup_main">
  335. <div class="title">列表</div>
  336. <div class="summary" id="summary">温泉镇共有纳税人100人,共纳税100万元。</div>
  337. <ul id="nsrlist">
  338. </ul>
  339. <button id="block_close" title="关闭"></button>
  340. </div>
  341. <button style="position:absolute;top:10px;right:10px;z-index: 99;" id="network">network</button>
  342. </div>
  343. </body>
  344. </html>

---------------------------------------------------------------------------------------------------------------

技术博客

CSDN:http://blog.csdn.NET/gisshixisheng

博客园:http://www.cnblogs.com/lzugis/

在线教程

http://edu.csdn.Net/course/detail/799

Github

https://github.com/lzugis/

联系方式

q       q:1004740957

e-mail:niujp08@qq.com

公众号:lzugis15

Q Q 群:452117357(webgis)

337469080(Android)

(转) Arcgis4js实现链家找房的效果的更多相关文章

  1. 上海二手房8月排名:链家、悟空找房、中原、太平洋、我爱我家、易居、房天下、iwjw、房多多、房好多、q房网、、、

    房产网站总结 链家: 悟空找房: 中原: 太平洋: 我爱我家: 易居: 房天下: iwjw:有较多二手房信息 链家称王 房多多领跑电商平台 近日,云房数据公布了8月上海房产中介成交数据,从排行榜来看, ...

  2. 分享系列--面试JAVA架构师--链家网

    本月7日去了一趟链家网面试,虽然没有面上,但仍有不少收获,在此做个简单的分享,当然了主要是分享给自己,让大家见笑了.因为这次是第一次面试JAVA网站架构师相关的职位,还是有些心虚的,毕竟之前大部分时间 ...

  3. 【nodejs 爬虫】使用 puppeteer 爬取链家房价信息

    使用 puppeteer 爬取链家房价信息 目录 使用 puppeteer 爬取链家房价信息 页面结构 爬虫库 pupeteer 库 实现 打开待爬页面 遍历区级页面 方法一 方法二 遍历街道页面 遍 ...

  4. Hawk 1.1 快速入门(链家二手房)

    链家的同学请原谅我,但你们的网站做的真是不错. 1. 设计网页采集器 我们以爬取链家二手房为例,介绍网页采集器的使用.首先双击图标,加载采集器: 在最上方的地址栏中,输入要采集的目标网址,本次是htt ...

  5. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

  6. Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  7. 链家web前端面试

    共有三轮面试,每个面试官的第一个问题都是:介绍一个你觉着比较出彩的项目 第一轮面试: 因为公司项目没什么亮点,很传统的pc端,美女面试官就说让讲一下我用react的私人项目; 问了很多都是关于reac ...

  8. 链家鸟哥:从留级打架问题学生到PHP大神,他的人生驱动力竟然是?

    链家鸟哥:从留级打架问题学生到PHP大神,他的人生驱动力竟然是?| 二叉树短视频 http://mp.weixin.qq.com/s/D4l_zOpKDakptCM__4hLrQ 从问题劝退学生到高考 ...

  9. TOP100summit:【分享实录】链家网大数据平台体系构建历程

    本篇文章内容来自2016年TOP100summit 链家网大数据部资深研发架构师李小龙的案例分享. 编辑:Cynthia 李小龙:链家网大数据部资深研发架构师,负责大数据工具平台化相关的工作.专注于数 ...

随机推荐

  1. 用API中的raf复制文件图片等及系统找不到指定的文件的解决办法

    该运行是在eclipse中进行的操作,小白的基础理解,如有不妥之处,请大佬们指正.QQ:1055802635 package raf; import java.io.IOException;impor ...

  2. mysql bin-log 设置

    mysql 的事物日至为 [root@localhost mysql]# ls -ldtr mysql-bin.* -rw-rw---- mysql mysql 4月 : mysql-bin. -rw ...

  3. jquery 1.9以上新版本不支持toggle()的解决方法

    原文:http://blog.csdn.net/u011061889/article/details/50397462 参考: http://www.cnblogs.com/lionden/archi ...

  4. update city_demo set city=(select city from city order by rand() limit1);

    update city_demo set city=(select city from city order by rand() limit1); 因为使用了rand()函数,所以每一次查询的结果是不 ...

  5. 測试赛D - The War(有控制范围的贪心)

    D - The War Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit St ...

  6. kafka01

    消息队列松耦合 消息队列

  7. C语言strdup()函数:复制字符串【转】

    本文转载自:http://c.biancheng.net/cpp/html/166.html 头文件:#include <string.h> 定义函数:char * strdup(cons ...

  8. 【HNOI 2003】 激光炸弹

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1218 [算法] 二维前缀和 [代码] #include<bits/stdc++ ...

  9. Linux VPS上安装KDE, Gnome和VNC

  10. java enum int String 相互转换

    1.  enum<->int enum -> int: int i = enumType.value.ordinal(); int -> enum: enumType b= e ...