Arcgis4js实现链家找房的效果

概述

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

功能效果

1、数据的聚合展示

2、地图高亮

3、聚合数据的钻取

4、列表展示

编码实现

1、数据的聚合展示

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

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

                    $("#network").on("click",function(){
                    	for(var i=0;i<data.length;i++){
                    		var _d = data[i];
                    		var geometry = getGeomByWKT(_d.wkt);
                    		var pt = geometry.getCentroid();
                    		var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([255,0,0]), 2),
											    new Color([255,0,0,0.5]));
											  var tsname = new TextSymbol(_d.counname).setOffset(0, 6).setColor(new Color([255,255,255])) ;
											  var tsprice = new TextSymbol(_d.price.toFixed(2)+"万").setOffset(0, -7).setColor(new Color([255,255,255]));
											  var tscount = new TextSymbol(_d.count+"套").setOffset(0, -22).setColor(new Color([255,255,255]));
											  var _gd = _d;
											  _d.index = i;
											  _gd.id="graphic"+i;
											  gLayer.add(new Graphic(pt, sms, _gd));
											  gLayer.add(new Graphic(pt, tsname,_d));
											  gLayer.add(new Graphic(pt, tsprice,_d));
											  gLayer.add(new Graphic(pt, tscount,_d));
                    	}
                    });

实现后效果入下:

2、地图高亮展示

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

                    gLayer.on("mouse-over",function(e){
                    	map.setMapCursor("pointer");
                    	var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([0,0,255]), 2),
											    new Color([0,0,255,0.5]));
											var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
											_zoneG.setSymbol(sms);
											gLayer.redraw();
											zLayer.clear();
									    var geometry = getGeomByWKT(e.graphic.attributes.wkt);
									    var sfs = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
										    new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,
										    new Color([0,0,255]), 2),new Color([0,0,255,0.25])
										  );
									    var gfx = new Graphic(geometry,sfs);
				    					zLayer.add(gfx);
                    });
                    gLayer.on("mouse-out",function(e){
                    	map.setMapCursor("default");
                    	var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([255,0,0]), 2),
											    new Color([255,0,0,0.5]));
											var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
										  _zoneG.setSymbol(sms);
											gLayer.redraw();
											zLayer.clear();
                    })

实现后效果入下:

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

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

										function addZoneData(attr){
											var geometry = getGeomByWKT(attr.wkt);
									    var extent = geometry.getExtent();
									    map.setExtent(extent);
									    var data = getZoneData(extent);
											$(".popup_main").show();
											var nsrlist = $("#nsrlist").html("");
											lLayer.clear();
											lLayer.show();
											var path = "m127,193l103,0l0,33l-56,0l-11,12l-11,-11l-25.00003,0.00002l0.00003,-34.00002z";
											var _sum = 0;
											for(var i=0;i<data.length;i++){
												var _d = data[i];
												var pt = new Point(_d.X, _d.Y, map.spatialReference);
											  var pms = new PictureMarkerSymbol("img/marker.png",24,24);
											  lLayer.add(new Graphic(pt, pms,_d));
											  var _li = $("<li/>").css("position","relative").appendTo(nsrlist);
											  _li.append(‘<div class="image"><img src="img/marker.png" /></div>‘);
											  _li.append(‘<div class="content">‘+
											  	‘<div class="item-tle">‘+_d.NSRNAME+‘</div>‘+_d.NSRSUM+‘万‘+
											  	‘</div>‘);
											  	_sum+=_d.NSRSUM;
											  _li.data("attr",_d);
											  _li.on("click",function(){
											  	var _attr = $(this).data("attr");
											  	showObjInfo(_attr);
											  });
											}
											$("#summary").html(attr.counname+"共有纳税人"+data.length+"人,共纳税"+_sum.toFixed(3)+"万元。")
											$("#block_close").on("click",function(){
												$(".popup_main").hide();
												lLayer.clear();
                   	 		map.infoWindow.hide();
											});
										}

实现效果如下:

上述实现完整代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title>Simple Map</title>
    <link rel="stylesheet" href="http://jsapi.thinkgis.cn/esri/css/esri.css">
    <style>
      html, body, #map {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
      }
      body {
        background-color: #FFF;
        overflow: hidden;
        font-family: "Trebuchet MS";
      }
      .info-content a{
      	float:right;
      }
      .popup_main{
      	border:1px solid #cdcdcd;
				z-index:1001;
				position:absolute;
				background:#fff;
				overflow:hidden;
				left:20px;
				top:100px;
				width:330px;
				display: none;
      }
      .popup_main .title {
				border-bottom:1px solid #dadada;
				height:25px;
				line-height:25px;
				font-size:12px;
				color:#4c4c4c;
				padding-left:7px;
			}
			.popup_main .summary {
				margin:2px;
				background: #ccc;
				padding: 8px;
				border-bottom:1px solid #ddd;
			}
			.popup_main .content {
				height:auto;
				padding: 8px;
				border-bottom:1px solid #ddd;
			}
			.popup_main ul{
				list-style: none;
				margin: -0px 0;
				overflow:hidden;
				overflow-y:auto;
				max-height: 500px;
			}
			.popup_main ul li {
				position: relative;
				margin-left: -40px;
				position: relative;
				border-bottom:1px solid #ddd;
				cursor: pointer;
				height: 50px;
			}
			.popup_main ul li:hover{
				background: #ccc;
			}
			.popup_main ul li .image{
				position:absolute;
				left:8px;
				top: 10px;
				height:30px;
				text-align:center;
				width:30px;
				line-height:15px;
			}
			.popup_main ul li .image img{
				height: 100%;
			}
			.popup_main ul li .content{
				    width: 85%;
				    float: right;
				    border: none;
			}
			.popup_main ul li .content div.item-tle{
				  font-size: 14px;
					color: #262626;
					font-weight: 800;
					overflow: hidden;
					text-overflow: ellipsis;
					line-height: 1;
			}
			.popup_main button{
		    position: absolute;
		    z-index: 50;
		    top: 7px;
		    right: 6px;
		    width: 12px;
		    height: 12px;
		    background: url(img/popup_close_15d2283.gif) no-repeat;
		    border: 0;
		    cursor: pointer;
		  }
    </style>
    <script type="text/javascript">
	    dojoConfig = {
	      parseOnLoad: true,
	      packages: [{
	        name: ‘tdlib‘,
	        location: this.location.pathname.replace(/\/[^/]+$/, "")+"/tdtlib"
	      }]
	    };
	  </script>
	<script src="http://jsapi.thinkgis.cn/init.js"></script>
	<script src="http://lzugis.d152.ptzygj.com/app/js/jquery/jquery-1.8.3.js"></script>
	<script src="terraformer/terraformer.js"></script>
  <script src="terraformer/terraformer-wkt-parser.js"></script>
  <script src="terraformer/terraformer-arcgis-parser.js"></script>
	<script src="data.js"></script>
    <script>
      var map;
        require([
            "esri/map",
            "tdlib/TDTTilesLayer",
            "esri/layers/GraphicsLayer",
            "esri/geometry/Point",
            "esri/geometry/Extent",
            "esri/geometry/Polyline",
            "esri/symbols/SimpleLineSymbol",
            "esri/symbols/SimpleMarkerSymbol",
            "esri/symbols/PictureMarkerSymbol",
            "esri/symbols/SimpleFillSymbol",
            "esri/symbols/TextSymbol",
            "esri/Color",
            "esri/geometry/jsonUtils",
            "esri/graphic",
             "esri/dijit/InfoWindow",
            "dojo/domReady!"],
                function(Map,
                     TDTTilesLayer,
                     GraphicsLayer,
                     Point,
                     Extent,
                Polyline,
                SimpleLineSymbol,
                SimpleMarkerSymbol,
                PictureMarkerSymbol,
                SimpleFillSymbol,
                TextSymbol,
                Color,
                geometryJsonUtils,
                Graphic,InfoWindow)
                {
                   	map = new Map("map", {
											logo: false,
											center: [116.43228121152976, 40.20122178384614], // longitude, latitude
									    zoom: 7
										});
								    var vec_c = new TDTTilesLayer("vec")
								    map.addLayer(vec_c);
								    var zLayer = new GraphicsLayer();
                    map.addLayer(zLayer);
                    var gLayer = new GraphicsLayer();
                    map.addLayer(gLayer);
                    var lLayer = new GraphicsLayer();
                    map.addLayer(lLayer);

                    lLayer.on("mouse-over",function(e){
                    	map.setMapCursor("pointer");
                    })
                    lLayer.on("mouse-out",function(e){
                    	map.setMapCursor("default");
                    })
                    lLayer.on("click",function(e){
                    	var attr = e.graphic.attributes;
                    	if(attr){
                    		showObjInfo(attr);
                    	}
                    })

                   	 map.on("zoom-end",function(anchor,extent,level,zoomFactor){
                   	 	if(map.getZoom()<8){
                   	 		gLayer.show();
                   	 		lLayer.hide();
                   	 		map.infoWindow.hide();
                   	 	};
                   	 });

                    $("#network").on("click",function(){
                    	for(var i=0;i<data.length;i++){
                    		var _d = data[i];
                    		var geometry = getGeomByWKT(_d.wkt);
                    		var pt = geometry.getCentroid();
                    		var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([255,0,0]), 2),
											    new Color([255,0,0,0.5]));
											  var tsname = new TextSymbol(_d.counname).setOffset(0, 6).setColor(new Color([255,255,255])) ;
											  var tsprice = new TextSymbol(_d.price.toFixed(2)+"万").setOffset(0, -7).setColor(new Color([255,255,255]));
											  var tscount = new TextSymbol(_d.count+"套").setOffset(0, -22).setColor(new Color([255,255,255]));
											  var _gd = _d;
											  _d.index = i;
											  _gd.id="graphic"+i;
											  gLayer.add(new Graphic(pt, sms, _gd));
											  gLayer.add(new Graphic(pt, tsname,_d));
											  gLayer.add(new Graphic(pt, tsprice,_d));
											  gLayer.add(new Graphic(pt, tscount,_d));
                    	}
                    });

                    gLayer.on("mouse-over",function(e){
                    	map.setMapCursor("pointer");
                    	var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([0,0,255]), 2),
											    new Color([0,0,255,0.5]));
											var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
											_zoneG.setSymbol(sms);
											gLayer.redraw();
											zLayer.clear();
									    var geometry = getGeomByWKT(e.graphic.attributes.wkt);
									    var sfs = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
										    new SimpleLineSymbol(SimpleLineSymbol.STYLE_DASHDOT,
										    new Color([0,0,255]), 2),new Color([0,0,255,0.25])
										  );
									    var gfx = new Graphic(geometry,sfs);
				    					zLayer.add(gfx);
                    });
                    gLayer.on("mouse-out",function(e){
                    	map.setMapCursor("default");
                    	var sms = new SimpleMarkerSymbol(
				    							SimpleMarkerSymbol.STYLE_CIRCLE, 60,
				    							new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
											    	new Color([255,0,0]), 2),
											    new Color([255,0,0,0.5]));
											var _zoneG = getGraphicById("graphic"+e.graphic.attributes.index);
										  _zoneG.setSymbol(sms);
											gLayer.redraw();
											zLayer.clear();
                    })
                    gLayer.on("click",function(e){
                    	gLayer.hide();
									    addZoneData(e.graphic.attributes);
                    });
                    function getGraphicById(id){
                    	var g = null;
                    	var graphics = gLayer.graphics;
                    	for(var i=0,len = graphics.length;i<len;i++){
                    		var graphic = graphics[i];
                    		if(graphic.attributes.id===id){
                    			g = graphic;
                    			break;
                    		}
                    	}
                    	return g;
                    }
                    function getGeomByWKT(wkt){
                    	var primitive = Terraformer.WKT.parse(wkt);
									    var arcgis = Terraformer.ArcGIS.convert(primitive);
									    return geometryJsonUtils.fromJson(arcgis);
                    }
                    function getZoneData(extent){
                    	var data = [];
                    	for(var i=0;i<10;i++){
                    		var nusnum = GetRandomNum(10,100).toFixed(3);
                    		nusnum = parseFloat(nusnum);
                    		data.push({
                    			X:GetRandomNum(extent.xmin,extent.xmax),
                    			Y:GetRandomNum(extent.ymin,extent.ymax),
                    			NSRNAME:"name"+i,
                    			NSRSUM:nusnum,
                    			URL:"#"
                    		});
                    	}
                    	return data;
                    }
										function addZoneData(attr){
											var geometry = getGeomByWKT(attr.wkt);
									    var extent = geometry.getExtent();
									    map.setExtent(extent);
									    var data = getZoneData(extent);
											$(".popup_main").show();
											var nsrlist = $("#nsrlist").html("");
											lLayer.clear();
											lLayer.show();
											var path = "m127,193l103,0l0,33l-56,0l-11,12l-11,-11l-25.00003,0.00002l0.00003,-34.00002z";
											var _sum = 0;
											for(var i=0;i<data.length;i++){
												var _d = data[i];
												var pt = new Point(_d.X, _d.Y, map.spatialReference);
											  var pms = new PictureMarkerSymbol("img/marker.png",24,24);
											  lLayer.add(new Graphic(pt, pms,_d));
											  var _li = $("<li/>").css("position","relative").appendTo(nsrlist);
											  _li.append(‘<div class="image"><img src="img/marker.png" /></div>‘);
											  _li.append(‘<div class="content">‘+
											  	‘<div class="item-tle">‘+_d.NSRNAME+‘</div>‘+_d.NSRSUM+‘万‘+
											  	‘</div>‘);
											  	_sum+=_d.NSRSUM;
											  _li.data("attr",_d);
											  _li.on("click",function(){
											  	var _attr = $(this).data("attr");
											  	showObjInfo(_attr);
											  });
											}
											$("#summary").html(attr.counname+"共有纳税人"+data.length+"人,共纳税"+_sum.toFixed(3)+"万元。")
											$("#block_close").on("click",function(){
												$(".popup_main").hide();
												lLayer.clear();
                   	 		map.infoWindow.hide();
											});
										}

										function showObjInfo(data){
											var location = new Point(data.X, data.Y, map.spatialReference);
											map.infoWindow.setTitle(data.NSRNAME);
											var content= $("<div/>").addClass("info-content");
											content.append("<b>纳税人名称:</b>"+data.NSRNAME);
											content.append("<br/><b>纳税人金额:</b>"+data.NSRSUM);
											content.append("<br/><a href="+data.URL+">详细信息>></a>");
											map.infoWindow.setContent(content[0]);
											map.infoWindow.show(location, InfoWindow.ANCHOR_UPPERRIGHT);
											map.centerAt(location);
										}
                });
			function GetRandomNum(min, max){
            var r = Math.random()*(max - min);
            var re=r+min;
            return re;
      }
    </script>
  </head>
  <body>
    <div id="map">
    	<div class="popup_main">
    		<div class="title">列表</div>
    		<div class="summary" id="summary">温泉镇共有纳税人100人,共纳税100万元。</div>
    		<ul id="nsrlist">
    		</ul>
    		<button id="block_close" title="关闭"></button>
    	</div>
    	<button style="position:absolute;top:10px;right:10px;z-index: 99;" id="network">network</button>
    </div>
  </body>
</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:[email protected]

公众号:lzugis15

Q Q 群:452117357(webgis)

337469080(Android)

时间: 2024-10-01 04:12:38

Arcgis4js实现链家找房的效果的相关文章

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

链家称王 房多多领跑电商平台 近日,云房数据公布了8月上海房产中介成交数据,从排行榜来看,前五名分别为,总计占上海二手房市场份额达41%. 具体来看,老牌中介方面,链家德佑8月成交9864套遥遥领先,占据上海市场五分之一份额:互联网电商平台方面,房多多本月共成交1406套二手房,一举超越房天下,成为电商中介平台的领头羊.此外,志远本月3057套销售,升至第二名,成为本月最大黑马. TOP10企业占上海二手房市场份额过半 据云房数据统计,2016年8月上海二手房住宅共成交52380套.根据交易方式

链家终于出事了!细数链家金融帝国四宗罪!

摘要说明:高速扩张的链家,在一个敏感时刻,遭到上海政府的迎头一棒.2月24日晚间,有人发现,链家门店橱窗上黏贴的所有二手房房源全部消失了,剩下的是 高速扩张的链家,在一个敏感时刻,遭到上海政府的迎头一棒. 2月24日晚间,有人发现,链家门店橱窗上黏贴的所有二手房房源全部消失了,剩下的是一张张白板.随即,澎湃新闻记者走访了附近链家门店,发现门店原先黏贴在橱窗上的房源确实没有了. 上海市,链家房产枣阳路店,一位工作人员正在关门收工,门口两侧橱窗上的广告已经撤下. 澎湃新闻记者 高征 图 界面新闻还透

链家的互联网转型,房产中介变成全产业链服务商

这两天链家战略升级的发布会成为房产和互联网行业热议的话题,房产O2O再次成为业界关注焦点.由传统二手房中介出身的链家,通过互联网化转型由中介角色转变成综合房产服务平台,旗下各条业务线也得到了扩张,这再一次印证了互联网+的爆发力和市场价值. 链家互联网化转型,服务质量.互联网金融.数据营销成核心 链家只用半年时间就成功并购了成都伊诚.上海德佑.深圳中联.高策机构.杭州盛世管家等公司,线下的扩张速度达到了前所未有的程度.而链家选择并购的方式扩张主要目的是为快速搭建能覆盖全国主要城市的房产O2O全产业

使用vue.js仿一个链家

Vue全家桶+localstorage+socket.io简单仿一个链家 在线预览地址首先上项目和预览地址 https://luxroid.com/lianjia/#/Github地址 https://github.com/mixihome/lianjia 注意 如果要在本地运行安装完依赖之后如果报错请手动使用淘宝镜像安装node-sass和sass-loader 确保可以运行建议使用F12移动端模式预览???? 使用到的技能点Vue.js : 前端页面展示Vuex : 全局状态通信axios

JAVA架构师面试分享—链家网

本月7日去了一趟链家网面试,虽然没有面上,但仍有不少收获,在此做个简单的分享,当然了主要是分享给自己,让大家见笑了.因为这次是第一次面试JAVA网站架构师相关的职位,还是有些心虚的,毕竟之前大部分时间都是在做.NET相关的技术工作,并且自己所负责过的项目规模都是比较小,并且差异也较大.在高并发性,高伸缩性的互联网网站的架构方面没有太多的经验,只是在之前空闲时阅读李智慧老师的<大型网站技术架构>一书给了我不少的启发.面试过程比较简单,首先是笔试,架构师职位主要是一些知识的理解,也有一些数据库查询

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

本月7日去了一趟链家网面试,虽然没有面上,但仍有不少收获,在此做个简单的分享,当然了主要是分享给自己,让大家见笑了.因为这次是第一次面试JAVA网站架构师相关的职位,还是有些心虚的,毕竟之前大部分时间都是在做.NET相关的技术工作,并且自己所负责过的项目规模都是比较小,并且差异也较大.在高并发性,高伸缩性的互联网网站的架构方面没有太多的经验,只是在之前空闲时阅读李智慧老师的<大型网站技术架构>一书给了我不少的启发.面试过程比较简单,首先是笔试,架构师职位主要是一些知识的理解,也有一些数据库查询

Python高级应用程序设计任务要求(主题链家二手车)

内容简介 链家二手房成交信息(福州) 本文主要使用了multiprocessing模块创建多个进程对象,使用Queue将多个进程联系在一起,也就是线程之间的通信多个对链家的二手房进行数据的爬取,处理,存储等操作. 结构:主从模式: 主控制节点 从爬虫节点 分析与设计 系统主要核心有两大调度器 1.控制调度器 主要负责管理三个进程:一:负责将地址传递给爬虫节点,二:负责读取爬虫节点返回的数据,三:负责将数据提取进程中提交的数据进行数据持久化 2.爬虫调度器 爬虫节点主要是包括两个功能,下载html

都市白领租房APP定制解决了哪些找房的痛点

现在的都市白领主要是以租房为主,传统找房子存在很多的痛点,要么是朋友介绍,要么就是自己去找.自己找的话,需要专门空一天时间来找,一般都是很盲目地去找的,在想住的地区看到有挂着房东电话号码以及粗略的住房信息的牌子,然后打电话过去咨询,有合适的再去看房,没合适的就接着打下一个电话,这是找城中村房子的方式.还有一种是找小区房子,一般不会在外贴住房信息的,你需要找到房地产中介,让中介帮你找,找到后要给中介付房租一般的中介费用,想想都肉疼.但是互联网APP出现之后,找房子直接线上找,下载一个租房APP就可

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars