高德地圖API總結(jié)--Marker多點(diǎn)聚合

Marker多點(diǎn)聚合計(jì)算

什么是多點(diǎn)聚合呢萨蚕?所謂的多點(diǎn)聚合钞诡,就是計(jì)算地圖上一定范圍內(nèi)的點(diǎn)的個(gè)數(shù)空郊,然和講所有的點(diǎn)統(tǒng)計(jì)的數(shù)量顯示在范圍內(nèi)設(shè)置的marker上攻冷;我們需要解決的問題有:1、在地圖上劃定區(qū)域范圍;2呀狼、計(jì)算范圍內(nèi)的點(diǎn)的個(gè)數(shù)裂允;3、清楚原有的點(diǎn)赠潦,加上聚合后的點(diǎn)叫胖;4草冈、如何刷新
先說第一個(gè)問題:
在地圖上劃定區(qū)域范圍她奥,如下代碼實(shí)現(xiàn):
Point mPoint 定義一個(gè)點(diǎn),這個(gè)點(diǎn)是通過地圖上的marker點(diǎn)在屏幕上的投影的點(diǎn)
劃定區(qū)域范圍


image.png

如上圖怎棱,我們?cè)趧澏▍^(qū)域的時(shí)候以西南角和東北角(手機(jī)屏幕上表現(xiàn)為右下角和左上角)的兩個(gè)點(diǎn)直線距離為直徑劃定圓形區(qū)域哩俭,圓心為mPiont點(diǎn)所在的位置
southwestPoint的X軸上的值要小于northeastPoint的X軸上的值
northeastPoint的Y軸上的值要小于northeastPoint的Y軸上的值
southwestPoint 西南角
northeastPoint 東北角

Point mPoint = mProjection.toScreenLocation(mFirstMarkers.getPosition());
        Point southwestPoint = new Point(mPoint.x - mGridSize,mPoint.y + mGridSize);
        Point northeastPoint = new Point(mPoint.x + mGridSize,mPoint.y - mGridSize);
        double northELat = mProjection.fromScreenLocation(northeastPoint).latitude;
        double southWLat = mProjection.fromScreenLocation(southwestPoint).latitude;
        double northElong = mProjection.fromScreenLocation(northeastPoint).longitude;
        double southWlong = mProjection.fromScreenLocation(southwestPoint).longitude;
        if(northELat > southWLat && northElong > southWlong) {
            LatLng southWestLat = new LatLng(southWLat, southWlong);
            LatLng northEastLat = new LatLng(northELat, northElong);
            mBounds = new LatLngBounds(southWestLat, northEastLat);
        }

添加聚合后的marker點(diǎn)

mMarkerOptions.anchor(0.5f,0.5f)
              .position(mFirstMarkers.getPosition())
              .icon(mFirstMarkers.getIcon());
mIncludeMarkers = new ArrayList<MarkerOptions>();
mIncludeMarkers.add(mFirstMarkers);

獲取聚合后Marker點(diǎn)上的數(shù)量

int num = mIncludeMarkers.size();

設(shè)置marker的style樣式和數(shù)據(jù)

int iconType = 0;
if(num < 100){
    iconType = num / 10;
}else if(num >= 100){
    iconType = (num / 100)/10;
}
switch (iconType) {
    case 0:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 1:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 2:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 3:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 4:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 5:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 6:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 7:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 8:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
    case 9:
        mMarkerOptions.icon(BitmapDescriptorFactory
                .fromBitmap(getViewBitmap(getView(num,
                        R.mipmap.map_marker_num))));
        break;
}
image.png

根據(jù)地圖的移動(dòng)重置和刷新每次的聚合后的點(diǎn)和數(shù)字,因?yàn)楦叩碌貓D本身提供的地圖移動(dòng)的監(jiān)聽的方法拳恋,地圖的放大縮小凡资,移動(dòng)都?xì)w屬于地圖的移動(dòng),我們只需要在地圖移動(dòng)的時(shí)候谬运,我們需要通過Handler將Message傳到子線程隙赁,當(dāng)msg.what為0 的時(shí)候來重置地圖上的所有Marker,

Handler timeHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case 0:
                // 更新markers
                resetMarkers();
                break;
        }
    }
};

補(bǔ)充(重置marker梆暖,參見代碼):

/**
 * 獲取視野內(nèi)的marker 根據(jù)聚合算法合成自定義的marker 顯示視野內(nèi)的marker
 */
private void resetMarkers() {
    /*
    * 返回一個(gè)Projection 對(duì)象伞访。可以通過這個(gè)對(duì)象在屏幕坐標(biāo)與經(jīng)緯度坐標(biāo)之間進(jìn)行轉(zhuǎn)換轰驳。
    * Projection 對(duì)象返回的是當(dāng)前可視區(qū)域的坐標(biāo)厚掷,當(dāng)可視區(qū)域變換時(shí),它不會(huì)自己更新级解。
    * 返回:
    * 當(dāng)前地圖位置的Projection對(duì)象冒黑。
    */
    Projection projection = aMap.getProjection();
    Point point = null;
    markerOptionsListInView.clear();
    for (MarkerOptions markerOptions : markerOptionsList) {
        point = projection.toScreenLocation(markerOptions.getPosition());
        if (point.x < 0 || point.y < 0 || point.x > width || point.y > height) {
        } else {
            markerOptionsListInView.add(markerOptions);
        }
    }
    // 自定義的聚合類mSetMarkerIcon
    ArrayList<SetMarkerIcon> mSetMarkerIcon = new ArrayList<SetMarkerIcon>();
    for (MarkerOptions mp : markerOptionsListInView) {
        if (mSetMarkerIcon.size() == 0) {
            mSetMarkerIcon.add(new SetMarkerIcon(MapActivity.this,
                    mp, projection, 80));// 100根據(jù)自己需求調(diào)整
        } else {
            boolean isIn = false;
            for (SetMarkerIcon cluster : mSetMarkerIcon) {
                if (cluster.getBounds() != null) {
                    if (cluster.getBounds().contains(mp.getPosition())) {
                        cluster.addMarker(mp);
                        isIn = true;
                        break;
                    }
                }
            }
            if (!isIn) {
                mSetMarkerIcon.add(new SetMarkerIcon(
                        MapActivity.this, mp, projection, 80));
            }
        }
    }
    // 設(shè)置聚合點(diǎn)的位置和icon
    for (SetMarkerIcon setMarkerIcon : mSetMarkerIcon) {
        setMarkerIcon.setPositionAndIcon();
    }
    //清楚marker
    aMap.clear(true);
    // 重新添加
    for (SetMarkerIcon markerIcon : mSetMarkerIcon) {
        aMap.addMarker(markerIcon.getOptions());
    }
}

Marker點(diǎn)擊

首先需要在初始化的時(shí)候添加Marker點(diǎn)擊的監(jiān)聽
aMap.setOnMarkerClickListener(this);// 設(shè)置點(diǎn)擊marker事件監(jiān)聽器
點(diǎn)擊事件的處理

/**
 * 對(duì)marker標(biāo)注點(diǎn)點(diǎn)擊響應(yīng)事件
 */
@Override
public boolean onMarkerClick(Marker marker) {
//此處添加Marker點(diǎn)擊事件的處理
return false;
}

以前寫的文章沒有發(fā)表的,僅供參考和學(xué)習(xí)只用
謝謝惠顧勤哗,感覺有用的點(diǎn)個(gè)贊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抡爹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芒划,更是在濱河造成了極大的恐慌冬竟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腊状,死亡現(xiàn)場(chǎng)離奇詭異诱咏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缴挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門袋狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事苟鸯⊥撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵早处,是天一觀的道長(zhǎng)湾蔓。 經(jīng)常有香客問我,道長(zhǎng)砌梆,這世上最難降的妖魔是什么默责? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咸包,結(jié)果婚禮上桃序,老公的妹妹穿的比我還像新娘。我一直安慰自己烂瘫,他們只是感情好媒熊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布奸披。 她就那樣靜靜地躺著柳爽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僻族。 梳的紋絲不亂的頭發(fā)上葛账,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天柠衅,我揣著相機(jī)與錄音,去河邊找鬼注竿。 笑死茄茁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巩割。 我是一名探鬼主播裙顽,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宣谈!你這毒婦竟也來了愈犹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闻丑,失蹤者是張志新(化名)和其女友劉穎漩怎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦嗡,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勋锤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥祭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叁执。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茄厘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谈宛,到底是詐尸還是另有隱情次哈,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布吆录,位于F島的核電站窑滞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恢筝。R本人自食惡果不足惜哀卫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滋恬。 院中可真熱鬧聊训,春花似錦、人聲如沸恢氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勋拟。三九已至,卻和暖如春妈候,著一層夾襖步出監(jiān)牢的瞬間敢靡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工苦银, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸胧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓幔虏,卻偏偏與公主長(zhǎng)得像纺念,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子想括,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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