高德地圖Marker實(shí)現(xiàn)聚合效果

最近接到一個(gè)新的需求,要在高德地圖實(shí)現(xiàn)marker點(diǎn)的聚合沐旨,想實(shí)現(xiàn)的功能是能夠按縮放比例或者按省市區(qū)級(jí)別實(shí)現(xiàn)聚合森逮。
翻了一下高德API,發(fā)現(xiàn)示例里面只有【 AMap.MarkerClusterer】 插件實(shí)現(xiàn)的點(diǎn)聚合磁携“啵【 AMap.MarkerClusterer】的點(diǎn)聚合通過一些簡(jiǎn)單的算法通過網(wǎng)格的像素大小來實(shí)現(xiàn)聚合,當(dāng)然也可以通過maxZoom的設(shè)置來設(shè)置最大的聚合級(jí)別,大于該級(jí)別就不進(jìn)行相應(yīng)的聚合(要理解到位:聚合級(jí)別越小闷供,同屏下展示的地圖越大)烟央。這并不是我們想要的效果。

下面貼2個(gè)圖理解下maxZoom的配置:


縮放級(jí)別為4時(shí)的地圖
縮放級(jí)別為7時(shí)的地圖

下面貼上我的代碼歪脏,看看我是如何實(shí)現(xiàn)的疑俭,有問題大家及時(shí)交流:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <style type="text/css">
      body,html,#container{height: 100%;margin: 0px;font:12px Arial;}
      .circle{border-radius: 50%;border: solid 1px silver;width: 50px;height: 50px;padding: 3px;text-align: center;line-height: 25px;max-width: 50px;color:#fff;}
      .showtitle{background:#393;width:150px;height:30px;line-height:30px;color:#fff;border-radius:5px;padding-left:5px;}
      .showtitle i{font-size:16px;}
      .showcontent{background:#62ab00;width:300px;font-size:12px;margin-left:-80px;border-radius:5px;color:#fff;position:absolute;display:none;bottom:30px;z-index:99;}
      .showcontent .p{line-height:30px;padding-left:10px;margin-top:-0px;}
      .showcontent i.triangle_i{color:#62ab00;font-size:25px;display:block;width:100%;background:#fff;text-align:center;height:25px;}
      .showcontent i.close_i{position: absolute;right: 5px;top:5px;font-size:25px;z-index:99999;}
    </style>
    <link rel="stylesheet" >
    <link rel="stylesheet" />
    <script src="http://www.w3school.com.cn/jquery/jquery.js"></script>
    <title>高德地圖Marker實(shí)現(xiàn)聚合效果</title>
  </head>
  <body>
   <div id="container" tabindex="0"></div>
   <div id="tip">可以縮放地圖,得到縮放級(jí)別哦婿失!<br><span id="info"></span></div>
   <script src="./marker.js"></script>
   <script src="https://webapi.amap.com/maps?v=1.4.1&key=de46cac2667f7b246a14192b88ba619d"></script>
   <script type="text/javascript">
       $(function(){
            //彈出框關(guān)閉
            $('.showtitle').live('click',function(){
                $(this).prev('.showcontent').toggle();
            })
            $('.close_i').live('click',function(){
                $(this).parent().hide();
            })
        })
        //初始化地圖容器
        var map = new AMap.Map('container', {
            resizeEnable: true,
                zoom: 5,
                zooms:[4,18],
                center: [106.49, 34.60]
        });
       
       //設(shè)置地圖比例尺
       AMap.plugin(['AMap.Scale'],
            function(){
                map.addControl(new AMap.Scale());
        });
       
       //添加監(jiān)聽時(shí)間钞艇,當(dāng)前縮放級(jí)別
        AMap.event.addListener(map,'zoomend',function(){
            document.getElementById('info').innerHTML = '當(dāng)前縮放級(jí)別:' + map.getZoom();
        });
       
        var markersTwo;
        var markersThree;
        var createMarker = function(data,hide) {
            var div = document.createElement('div');
            div.className = 'circle';
            var r = Math.floor(data.count / 1024);
            div.style.backgroundColor = hide ?'#393':'#09f';
            var htmlData='<div>'+data.name+'</div><div>'+data.count+'</div>';
            div.innerHTML = htmlData;
            
            var marker = new AMap.Marker({
                content: div,
                title:data.name,
                position: data.center.split(','),
                offset: new AMap.Pixel(-24, 5),
                zIndex: data.count,
            });
            marker.subMarkers = [];
            if(data.name==='山東省'||data.name==='河南省'||data.name==='濟(jì)南市'||data.name==='天橋區(qū)'){
                marker.setLabel({content:'&larr;請(qǐng)點(diǎn)擊',offset:new AMap.Pixel(45,0)})
                map.setCenter(marker.getPosition());
            }
            if(!hide){
                marker.setMap(map)
            }
             if(data.subDistricts&&data.subDistricts.length){
                for(var i = 0 ; i<data.subDistricts.length;i+=1){
                    marker.subMarkers.push(createMarker(data.subDistricts[i],true));
                }
            } 
            return marker;
        }
        
        
        
        var _onZoomEnd = function(e) {  
            console.log('監(jiān)聽地圖縮放')
            if (map.getZoom() < 7) {//全國(guó)下的省份
                for (var i = 0; i < markers.length; i += 1) {
                    map.remove(markers[i].subMarkers);
                }
                map.add(markers);
            }else if((map.getZoom() < 9) && (map.getZoom() > 7)){//省份下的市
                for (var i = 0; i < markersTwo.length; i += 1) {
                    map.remove(markersTwo[i].subMarkers);
                }
                map.add(markersTwo);
            }else if(map.getZoom() < 14 && map.getZoom() > 9){//市下面的區(qū)或縣
                for (var i = 0; i < markersThree.length; i += 1) {
                    map.remove(markersThree[i].subMarkers);
                }
                map.add(markersThree);
            }
        }
        var _onClick = function(e) {
            console.log(e)
            if(e.target.subMarkers.length){
            
                map.add(e.target.subMarkers);
                map.setFitView(e.target.subMarkers);
                markersTwo=e.target.subMarkers;
                
                var subMarkersTwo=e.target.subMarkers;
                for (var j = 0; j < subMarkersTwo.length; j += 1) {
                    AMap.event.addListener(subMarkersTwo[j], 'click', _onClickTwo);
                    AMap.event.addListener(subMarkersTwo[j], 'mouseover', _onMouseoverTwo);
                    AMap.event.addListener(subMarkersTwo[j], 'mouseout', _onMouseoutTwo);
                } 
                map.remove(markers)
            }
        }
        
        var _onMouseover = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#393';
            e.target.setContent(div);
        }
        var _onMouseout = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#09f';
            e.target.setContent(div);
        }
        
        
        var _onClickTwo = function(e) {
            
            if(e.target.subMarkers.length){
            
                map.add(e.target.subMarkers);
                map.setFitView(e.target.subMarkers);
                map.setZoom(11);
                markersThree=e.target.subMarkers;
                var subMarkersThree=e.target.subMarkers;
                for (var j = 0; j < subMarkersThree.length; j += 1) {

                    AMap.event.addListener(subMarkersThree[j], 'click', _onClickThree);
                    AMap.event.addListener(subMarkersThree[j], 'mouseover', _onMouseoverThree);
                    AMap.event.addListener(subMarkersThree[j], 'mouseout', _onMouseoutThree);
                    
                }
                
                map.remove(markersTwo)
                
            }
            
        }
        
        var _onMouseoverTwo = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#09f';
            e.target.setContent(div);
        }
        
        
        var _onMouseoutTwo = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#393';
            e.target.setContent(div);
        }
        
        var _onClickThree = function(e) {
            
            if(e.target.subMarkers.length){
                map.add(e.target.subMarkers);
                map.setFitView(e.target.subMarkers);
                var subMarkersFour=e.target.subMarkers;
                for (var j = 0; j < subMarkersFour.length; j += 1) {
                    var title = e.target.subMarkers[j].getTitle();
                    var html='<div class="showcontent"><div class="p">公司名稱:'+title+'</div><div class="p">聯(lián)系方式:'+title+'</div><i class="fa triangle_i">&#xf0d7</i><i class="fa close_i">&#xf057</i></div><div class="showtitle"><i  class="fa">&#xf1ba</i>&nbsp;&nbsp;'+title+'</div>';
                    e.target.subMarkers[j].setContent(html);
                }
                map.remove(markersThree)
            }
            
        }
        
        var _onMouseoverThree = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#09f';
            e.target.setContent(div);
        }
        var _onMouseoutThree = function(e) {
            var div = e.target.getContent();
            div.style.backgroundColor = '#393';
            e.target.setContent(div);
        }
        
        var markers = []; //province見Demo引用的JS文件
        for (var i = 0; i < provinces.length; i += 1) {
            var marker = createMarker(provinces[i]);
            markers.push(marker);
            AMap.event.addListener(marker, 'click', _onClick);
            AMap.event.addListener(marker, 'mouseover', _onMouseover);
            AMap.event.addListener(marker, 'mouseout', _onMouseout);
        }
        map.setFitView();
        AMap.event.addListener(map, 'zoomend', _onZoomEnd);     
    </script>
    <script type="text/javascript" src="https://webapi.amap.com/demos/js/liteToolbar.js"></script>
  </body>
</html>

到這里其實(shí)還有一個(gè)很重要的一步,就是從后臺(tái)拿數(shù)據(jù)豪硅,類似于這樣的數(shù)據(jù)哩照,即可實(shí)現(xiàn)不同的級(jí)別下展示該級(jí)別下的marker:

var provinces = [ {
    "id": "15",
    "name": "山東省",
    "center": "117.000923,36.675807",
    "count": 12500,
    "subDistricts": [{
        "id":370100,
        "name": "濟(jì)南市",
        "center": "117.000923,36.675807",
        "count": 10000,
        "subDistricts": [
            {
                "name": "歷下區(qū)",
                "center": "117.0768,36.66661",
                "count": 10000
            },
            {
                "name": "市中區(qū)",
                "center": "116.99741,36.65101",
                "count": 10000
            },
            {
                "name": "槐蔭區(qū)",
                "center": "116.90075,36.65136",
                "count": 10000
            },
            {
                "name": "天橋區(qū)",
                "center": "116.98749,36.67801",
                "count": 10000,
                "subDistricts": [
                    {
                        "name": "濟(jì)南長(zhǎng)途客運(yùn)中心",
                        "center": "116.984658,36.677631",
                        "count": 10000
                    },
                    {
                        "name": "山東交通學(xué)院東區(qū)",
                        "center": "116.964788,36.68152",
                        "count": 10000
                    },
                    {
                        "name": "西苑小區(qū)(中區(qū))",
                        "center": "116.966677,36.687509",
                        "count": 10000
                    },
                    {
                        "name": "金牛建材",
                        "center": "116.97659,36.694391",
                        "count": 10000
                    },
                    {
                        "name": "濟(jì)南師范小學(xué)",
                        "center": "116.990752,36.694804",
                        "count": 10000
                    },
                ]
            },
            {
                "name": "歷城區(qū)",
                "center": "117.06509,36.67995",
                "count": 10000
            },
            {
                "name": "長(zhǎng)清區(qū)",
                "center": "116.75192,36.55352",
                "count": 10000
            },
            {
                "name": "平陰縣",
                "center": "116.45587,36.28955",
                "count": 10000
            },
            {
                "name": "濟(jì)陽縣",
                "center": "117.17327,36.97845",
                "count": 10000
            },
            {
                "name": "商河縣",
                "center": "117.15722,37.31119",
                "count": 10000
            },
            {
                "name": "章丘市",
                "center": "117.53677,36.71392",
                "count": 10000
            },
        ]
    }];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市懒浮,隨后出現(xiàn)的幾起案子葡秒,更是在濱河造成了極大的恐慌,老刑警劉巖嵌溢,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眯牧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赖草,警方通過查閱死者的電腦和手機(jī)学少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧骑,“玉大人版确,你說我怎么就攤上這事『跽郏” “怎么了绒疗?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骂澄。 經(jīng)常有香客問我吓蘑,道長(zhǎng),這世上最難降的妖魔是什么坟冲? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任磨镶,我火速辦了婚禮,結(jié)果婚禮上健提,老公的妹妹穿的比我還像新娘琳猫。我一直安慰自己,他們只是感情好私痹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布脐嫂。 她就那樣靜靜地躺著统刮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪账千。 梳的紋絲不亂的頭發(fā)上侥蒙,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音蕊爵,去河邊找鬼辉哥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛攒射,可吹牛的內(nèi)容都是我干的醋旦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼会放,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饲齐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咧最,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤捂人,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矢沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滥搭,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年捣鲸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑟匆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栽惶,死狀恐怖愁溜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情外厂,我是刑警寧澤冕象,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站汁蝶,受9級(jí)特大地震影響渐扮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜穿仪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一席爽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啊片,春花似錦、人聲如沸玖像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笤昨,卻和暖如春祖驱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞒窒。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工捺僻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇裁。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓匕坯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拔稳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葛峻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 第三章 幼稚傲嬌的向陽先生 在橙子小姐的心里,咱們的向陽先生是個(gè)什么樣的人呢巴比?那還用問嗎术奖?當(dāng)然是成熟穩(wěn)重、溫柔...
    南橘愛北枳閱讀 354評(píng)論 0 21
  • 今天又不自覺的發(fā)脾氣了轻绞,無法自控采记,又一次成為了情緒的奴隸。其實(shí)道理我都懂政勃,就是在現(xiàn)實(shí)生活中唧龄,怎么就那么難實(shí)現(xiàn)呢?唉...
    bu離bu棄閱讀 651評(píng)論 0 0
  • 許是生長(zhǎng)在北方的緣故稼病,對(duì)水總是有著難以割舍的渴求选侨,去年九月和老公一起來到水鄉(xiāng)蘇州。從無錫下飛機(jī)然走,開車去蘇州的路上隨...
    文藝囡閱讀 365評(píng)論 0 0
  • 記不清何時(shí)開始聽你的歌 記不清何時(shí)開始喜歡你的歌 那時(shí)你是情歌的天后 而我喜歡上你卻是在你離開以后 開始把你的歌當(dāng)...
    利君理療閱讀 204評(píng)論 0 0
  • Nice to meet u!
    Skye0601閱讀 173評(píng)論 0 0