摘要:之前的文章都是利用云索引来完成数据的分类显示的,今天教大家用云检索来制作有趣的地图。云检索的优点是,在结果展现的时候,可以让数据呈现出更棒的自定义效果。比如,结果面板的点击效果,markder的鼠标效果,信息窗口的自定义展示等。并且,教程中第一次使用了时间轴这样的插件!根据时间进度来播放整个地图标注加载的过程。
----------------------------------------------------------------
效果提前看一眼:http://zhaoziang.com/amap/tanguan.html
第一步、制作一张云图
登录云图管理台 http://yuntu.amap.com/datamanager/index.html
新建一张地图,这时后台会自动生成一个key。
准备原始数据,并将数据上传至云图。
新建地图:http://yuntu.amap.com/datamanager/index.html
导入数据
附贪官落马数据:
预览一下
这时云图已经制作完成,你可以进行分享。
如果不想写代码的朋友,制作到这里,就可以分享你的云图给好友了。甚至可以用<iframe></iframe>的形式,嵌入到您的网站里。
当然,想要更加炫酷效果的朋友们,就要继续往下看,写两句代码啦。
第二步、云检索
对于自己云数据的检索,我们可以使用多边形检索,附近检索,还有ID检索。这里给出的例子是多边形检索,如下图,给中国区域画个大概的图。
自制简易的坐标拾取工具:http://zhaoziang.com/amap/picpoint.html
云检索代码:
//使用云检索CloudDataSearch function cloudSearch() { var arr = new Array(); //绘制多边形 arr.push(new AMap.LngLat(73.388672,50.578345)); arr.push(new AMap.LngLat(73.388672,34.578345)); arr.push(new AMap.LngLat(78.388672,28.264383)); arr.push(new AMap.LngLat(88.388672,21.578345)); arr.push(new AMap.LngLat(118.912109,20.264383)); arr.push(new AMap.LngLat(125.912109,39.264383)); arr.push(new AMap.LngLat(134.912109,43.578345)); arr.push(new AMap.LngLat(134.912123,56.578309)); arr.push(new AMap.LngLat(100.912123,45.578309)); arr.push(new AMap.LngLat(73.388672,50.578345)); var polygon = new AMap.Polygon({ map:mapObj, path:arr, strokeColor:"#3366FF", strokeOpacity:0.2, strokeWeight:2, fillColor: "#3366FF", fillOpacity: 0.2 }); polygon.setMap(mapObj); var search; var searchOptions = { keywords:"", orderBy:"time:ASC" }; mapObj.plugin(["AMap.Scale"],function(){ var scale = new AMap.Scale(); mapObj.addControl(scale); }); //加载CloudDataSearch服务插件 mapObj.plugin(["AMap.CloudDataSearch"], function() { search = new AMap.CloudDataSearch('53549433e4b0a8066457c35b', searchOptions); //构造云数据检索类 AMap.event.addListener(search, "complete", cloudSearch_CallBack); //查询成功时的回调函数 AMap.event.addListener(search, "error", errorInfo); //查询失败时的回调函数 search.searchInPolygon(arr); //多边形检索 }); }
添加信息窗口和覆盖物
//添加marker和infowindow function addmarker(i, d, mon){ var lngX = d._location.getLng(); var latY = d._location.getLat(); var s=new AMap.Size(40, 50); var iconimg = new AMap.Icon({ image:d.image, imageSize:s, size:s }); var markerOption = { map:mapObj, icon:iconimg, offset: new AMap.Pixel(-10,-30), position:new AMap.LngLat(lngX, latY) }; mar = new AMap.Marker(markerOption); marker.push(new AMap.LngLat(lngX, latY)); var datetime1 = d.time; var datetimestr=d.time.toString() var year1 = datetimestr[0]+datetimestr[1]+datetimestr[2]+datetimestr[3]; var month1 = datetimestr[4]+datetimestr[5]; var date1 = datetimestr[6]+datetimestr[7]; var infoWindow = new AMap.InfoWindow({ content:"<h3><font face="微软雅黑"color="#3366FF">"+(i+1) + "."+ d._name +"</font></h3><hr />" + "官职:" + d.title + "<br />" + "落马时间:" + year1 + "年"+month1+"月"+date1+"日" + "<br />"+ "简介:" + d.profile + "<br />" + "<img class='touxiang' src="+d.image+"></img>", size:new AMap.Size(300, 0), autoMove:true, offset:new AMap.Pixel(0,-30) }); windowsArr.push(infoWindow); var aa = function(){infoWindow.open(mapObj, mar.getPosition());}; AMap.event.addListener(mar, "click", aa); }
云检索的简单示例,大家可以直接参考官网:http://api.amap.com/javascript/example/num/1903
第三步、结果面板
结果面板就是展示搜索结果的地方。当检索到数据后,在右侧展示出来。
并且点击结果时,打开对应的信息窗口。
//回调函数 function cloudSearch_CallBack(data) { resultArr = data.datas; } //回调函数 function errorInfo(data) { resultStr = data.info; document.getElementById("result").innerHTML = resultStr; } //根据id打开搜索结果点tip function openMarkerTipById1(pointid,thiss){ thiss.style.background='#CAE1FF'; windowsArr[pointid].open(mapObj, marker[pointid]); } //鼠标移开后点样式恢复 function onmouseout_MarkerStyle(pointid,thiss) { thiss.style.background=""; }
第四步、添加时间控件
时间控件在网上找了许多个,最后决定用JQ的jquery-ui-1.10.4.custom.js。
function sliderChanged(event, ui) { var value= $( "#slider" ).slider( "option", "value" )/10 + ""; mon = value; mapObj.clearMap(); if (value < 10) mon = "20130" + value.substring(0,2) + "30"; else if(9 < value && value < 13) mon = "2013" + value + "00"; else if(12 < value && value < 22) mon = "2014" + value-12 + "00"; else if(21 < value && value < 25) mon = "2014" + value-12 + "30"; addmarkertest(mon); }; function SliderOn(sliderId,ministep) { var value = $( '#'+sliderId ).slider( "option", "value" ); var max = $( '#'+sliderId ).slider( "option", "max" ); if(value>=max) { clearInterval(intervalId); return; } $( '#'+sliderId ).slider( "option", "value", value + ministep ); }; $( "#slider" ).slider(); $( "#slider" ).slider( "option", "max", 240 ); $( "#slider" ).slider( "option", "step", 10 ); $( "#slider" ).slider( "option", "animate", "slow" ); $( "#slider" ).on( "slide", sliderChanged); $( "#slider" ).on( "slidechange", sliderChanged); intervalId = setInterval("SliderOn('slider',10)",300);
完结。
-----------------------------------------------------------------------------------------
全部源代码:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>贪官地图</title> <script language="javascript" src="http://webapi.amap.com/maps?v=1.2&key=46799a1920f8b8914ad7d0a2db0096d1"></script> <link rel="stylesheet" type="text/css" href="http://api.amap.com/Public/css/demo.Default.css" /> <link rel="stylesheet" href="jquery-ui-1.10.4.custom/css/ui-lightness/jquery-ui-1.10.4.custom.css"> <style>#slider { margin: 0px; } </style> <script src="jquery-ui-1.10.4.custom/js/jquery-1.10.2.js"></script> <script src="jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.js"></script> <style> #mapLeft{ 80%; height:400px;float:left;} #resultList{ 20%; float:left; } #slider{ height: 40px;} #mySlider a.ui-state-default{ background:red; height:40px;} #result{height:470px;} #iCenter{height:500px;} </style> </head> <body onload="mapInit();"> <p>------------------------------------------------------------</p> <div><h1>2013年-2014年贪官落马地图</h1></div> <h2>(数据来源于新闻)</h2> <p>------------------------------------------------------------</p> <div id="mySlider"> <div id="slider"><img src="tanguan_bg.jpg"></div> <input type=button value="播放" onclick="play();"/> </div> <div id="mapLeft"> <div id="iCenter"></div> </div> <div id="resultList"> <div class="resultbox"> <div id="r_title"><b>结果:</b></div> <div id="result"> </div> </div> </div> </body> <script type ="text/javascript"> function play() { clearInterval(intervalId); $( "#slider" ).slider( 'value' , 0); intervalId = setInterval("SliderOn('slider',10)",500); } </script> <script> var intervalId = null; var mapObj; var marker = new Array(); var windowsArr = new Array(); var mon; var resultArr; var resultStr=""; var mar; var sum = 0; //var mon = "20130100"; function sliderChanged(event, ui) { var value= $( "#slider" ).slider( "option", "value" )/10 + ""; mon = value; mapObj.clearMap(); if (value < 10) mon = "20130" + value.substring(0,2) + "30"; else if(9 < value && value < 13) mon = "2013" + value + "00"; else if(12 < value && value < 22) mon = "2014" + value-12 + "00"; else if(21 < value && value < 25) mon = "2014" + value-12 + "30"; addmarkertest(mon); }; function SliderOn(sliderId,ministep) { var value = $( '#'+sliderId ).slider( "option", "value" ); var max = $( '#'+sliderId ).slider( "option", "max" ); if(value>=max) { clearInterval(intervalId); return; } $( '#'+sliderId ).slider( "option", "value", value + ministep ); }; $( "#slider" ).slider(); $( "#slider" ).slider( "option", "max", 240 ); $( "#slider" ).slider( "option", "step", 10 ); $( "#slider" ).slider( "option", "animate", "slow" ); $( "#slider" ).on( "slide", sliderChanged); $( "#slider" ).on( "slidechange", sliderChanged); intervalId = setInterval("SliderOn('slider',10)",300); //基本地图加载 function mapInit() { mapObj = new AMap.Map("iCenter",{center:new AMap.LngLat(104.354166,37),level:4}); //mapObj.setFitView(); cloudSearch(); } //使用云检索CloudDataSearch function cloudSearch() { var arr = new Array(); //绘制多边形 arr.push(new AMap.LngLat(73.388672,50.578345)); arr.push(new AMap.LngLat(73.388672,34.578345)); arr.push(new AMap.LngLat(78.388672,28.264383)); arr.push(new AMap.LngLat(88.388672,21.578345)); arr.push(new AMap.LngLat(118.912109,20.264383)); arr.push(new AMap.LngLat(125.912109,39.264383)); arr.push(new AMap.LngLat(134.912109,43.578345)); arr.push(new AMap.LngLat(134.912123,56.578309)); arr.push(new AMap.LngLat(100.912123,45.578309)); arr.push(new AMap.LngLat(73.388672,50.578345)); var polygon = new AMap.Polygon({ map:mapObj, path:arr, strokeColor:"#3366FF", strokeOpacity:0.2, strokeWeight:2, fillColor: "#3366FF", fillOpacity: 0.2 }); polygon.setMap(mapObj); var search; var searchOptions = { keywords:"", orderBy:"time:ASC" }; mapObj.plugin(["AMap.Scale"],function(){ var scale = new AMap.Scale(); mapObj.addControl(scale); }); //加载CloudDataSearch服务插件 mapObj.plugin(["AMap.CloudDataSearch"], function() { search = new AMap.CloudDataSearch('53549433e4b0a8066457c35b', searchOptions); //构造云数据检索类 AMap.event.addListener(search, "complete", cloudSearch_CallBack); //查询成功时的回调函数 AMap.event.addListener(search, "error", errorInfo); //查询失败时的回调函数 search.searchInPolygon(arr); //多边形检索 }); } //添加marker和infowindow function addmarker(i, d, mon){ var lngX = d._location.getLng(); var latY = d._location.getLat(); var s=new AMap.Size(40, 50); var iconimg = new AMap.Icon({ image:d.image, imageSize:s, size:s }); var markerOption = { map:mapObj, icon:iconimg, offset: new AMap.Pixel(-10,-30), position:new AMap.LngLat(lngX, latY) }; mar = new AMap.Marker(markerOption); marker.push(new AMap.LngLat(lngX, latY)); var datetime1 = d.time; var datetimestr=d.time.toString() var year1 = datetimestr[0]+datetimestr[1]+datetimestr[2]+datetimestr[3]; var month1 = datetimestr[4]+datetimestr[5]; var date1 = datetimestr[6]+datetimestr[7]; var infoWindow = new AMap.InfoWindow({ content:"<h3><font face="微软雅黑"color="#3366FF">"+(i+1) + "."+ d._name +"</font></h3><hr />" + "官职:" + d.title + "<br />" + "落马时间:" + year1 + "年"+month1+"月"+date1+"日" + "<br />"+ "简介:" + d.profile + "<br />" + "<img class='touxiang' src="+d.image+"></img>", size:new AMap.Size(300, 0), autoMove:true, offset:new AMap.Pixel(0,-30) }); windowsArr.push(infoWindow); var aa = function(){infoWindow.open(mapObj, mar.getPosition());}; AMap.event.addListener(mar, "click", aa); } function addmarkertest(mon){ var resultNum = resultArr.length; resultStr = ""; marker = null; windowsArr = null; windowsArr = new Array(); marker = new Array(); for (var i = 0; i < resultNum; i++) { //alert(resultArr[i].time); if(resultArr[i].time < mon) { var datetime2 = resultArr[i].time; var datetimestr2=datetime2.toString() var year2 = datetimestr2[0]+datetimestr2[1]+datetimestr2[2]+datetimestr2[3]; var month2 = datetimestr2[4]+datetimestr2[5]; var date2 = datetimestr2[6]+datetimestr2[7]; resultStr += "<div id='divid" + (i+1) + "' onmouseover='openMarkerTipById1(" + i + ",this)' onmouseout='onmouseout_MarkerStyle(" + (i+1) + ",this)' style="font-size: 12px;cursor:pointer;padding:2px 0 4px 2px; border-bottom:1px solid #C1FFC1;"><table><tr><td><h3><font face="微软雅黑"color="#3366FF">" + (i+1) + "." + resultArr[i]._name + "</font></h3>"; resultStr += '<br/>官职:' + resultArr[i].title + "<br/>" + "落马时间:" + year2 + "年"+month2+"月"+date2+"日"+ '<br/>' + "</td></tr></table></div>"; addmarker(i, resultArr[i] ,mon); } else if(resultArr[i].time > mon) { resultStr += ""; } } sum = sum +1; document.getElementById("result").innerHTML = resultStr; } //回调函数 function cloudSearch_CallBack(data) { resultArr = data.datas; } //回调函数 function errorInfo(data) { resultStr = data.info; document.getElementById("result").innerHTML = resultStr; } //根据id打开搜索结果点tip function openMarkerTipById1(pointid,thiss){ thiss.style.background='#CAE1FF'; windowsArr[pointid].open(mapObj, marker[pointid]); } //鼠标移开后点样式恢复 function onmouseout_MarkerStyle(pointid,thiss) { thiss.style.background=""; } </script> </html>
再看一遍效果: