高德地图---点聚合+显示屏幕内的maker+多线程

这里写图片描述

1.首先需要创建两个ArrayList(一个存放所有的maker数据,一个存放屏幕内的maker数据)

    private ArrayList<MarkerOptions> markerOptionsListInView = new ArrayList<MarkerOptions>();
    private ArrayList<MarkerOptions> markerOptionsListall = new ArrayList<MarkerOptions>();

2.第二步把maker数据添加到markerOptionsListall 里边

private void addMarkersToMap() {

        int size = chargList.size();
        for (int i = 0; i < size; i++) {

            double wei =chargList.get(i).getPoi_wei();
            double jing = chargList.get(i).getPoi_jing();
            LatLng latlng = new LatLng(wei, jing);
            markerOptionsListall.add(new MarkerOptions().position(latlng).title(i + ""));
}

3.在添加屏幕移动的监控,然后去动态判断屏幕内的maker是否需要聚合

@Override
    public void onCameraChangeFinish(CameraPosition arg0) {
        // TODO Auto-generated method stub
        resetMarks();
    }

    private void resetMarks() {
        // 开始刷新
        //executorService.execute(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                Projection projection = mAMap.getProjection();
                Point p = null;
                markerOptionsListInView.clear();
                // 获取在当前视野内的marker;提高效率

                ArrayList<MyGaodeImageView> clustersMarker = new ArrayList<MyGaodeImageView>();
                for (MarkerOptions mp : markerOptionsListall) {
                    p = projection.toScreenLocation(mp.getPosition());
                    if (p.x < 0 || p.y < 0 || p.x > screenWidth || p.y > screenHeight || p.x == 0 || p.y == 0
                            || p.x == screenWidth || p.y == screenHeight) {
                        // 不添加到计算的列表中
                    } else {
                        markerOptionsListInView.add(mp);

                        if (clustersMarker.size() == 0) {
                            // 添加一个新的自定义marker
                            clustersMarker.add(new MyGaodeImageView(IndexMapActivity.this, mp, projection, 80));// 80=相距多少才聚合
                        } else {
                            boolean isIn = false;
                            for (MyGaodeImageView cluster : clustersMarker) {
                                // 判断当前的marker是否在前面marker的聚合范围内
                                // 并且每个marker只会聚合一次。
                                if (cluster.getBounds().contains(mp.getPosition())) {
                                    cluster.addMarker(mp);
                                    isIn = true;
                                    break;
                                }
                            }
                            // 如果没在任何范围内,自己单独形成一个自定义marker。在和后面的marker进行比较
                            if (!isIn) {
                                clustersMarker.add(new MyGaodeImageView(IndexMapActivity.this, mp, projection, 80));// 80=相距多少才聚合
                            }
                        }
                    }
                }
                mAMap.clear();
                for (MyGaodeImageView mmc : clustersMarker) {
                    mmc.setpositionAndIcon();
                    mAMap.addMarker(mmc.getOptions());
                }

            }
        //});
    }

4.MyGaodeImageView类和它的布局my_car_cluster_view,图片的话自己改改

package com.aoss.main.charging;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.amap.api.maps.Projection;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.yuntu.scheme.R;

import java.util.ArrayList;

public class MyGaodeImageView {
    // 上下文
    private Activity activity;
    // marker类
    private MarkerOptions options;
    // 当前可观区域里的 聚合过之后的集合
    private ArrayList<MarkerOptions> includeMarkers;
    // 创建区域
    private LatLngBounds bounds;

    /**
     * 头像加载完监听
     */
    public MyGaodeImageView(Activity activity, MarkerOptions firstMarkers, Projection projection, int gridSize) {
        this.activity = activity;
        options = new MarkerOptions();

        Point point = projection.toScreenLocation(firstMarkers.getPosition());
        // 范围类
        Point southwestPoint = new Point(point.x - gridSize, point.y + gridSize);
        // 范围类
        Point northeastPoint = new Point(point.x + gridSize, point.y - gridSize);

        bounds = new LatLngBounds(projection.fromScreenLocation(southwestPoint),
                projection.fromScreenLocation(northeastPoint));
        // 设置初始化marker属性
        options.anchor(0.5f, 0.5f).title(firstMarkers.getTitle()).position(firstMarkers.getPosition());
        // .icon(firstMarkers.getIcon()).snippet(firstMarkers.getSnippet());
        includeMarkers = new ArrayList<MarkerOptions>();
        includeMarkers.add(firstMarkers);
    }

    public LatLngBounds getBounds() {
        return bounds;
    }

    public MarkerOptions getOptions() {
        return options;
    }

    public void setOptions(MarkerOptions options) {
        this.options = options;
    }

    /**
     * 添加marker
     */
    public void addMarker(MarkerOptions markerOptions) {
        includeMarkers.add(markerOptions);// 添加到列表中
    }

    /**
     * 设置聚合点的中心位置以及图标
     */
    public void setpositionAndIcon() {
        int size = includeMarkers.size();
        double lat = 0.0;
        double lng = 0.0;
        // 一个的时候
        if (size == 1) {// 设置marker单个属性
            // 设置marker位置
            options.position(new LatLng(includeMarkers.get(0).getPosition().latitude,
                    includeMarkers.get(0).getPosition().longitude));
             //options.title("聚合点");
            // options.icon(BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size))));

        } else {// 聚合的时候
            // 设置marker聚合属性
            for (MarkerOptions op : includeMarkers) {
                lat += op.getPosition().latitude;
                lng += op.getPosition().longitude;
            }
            // 设置marker的位置为中心位置为聚集点的平均位置
            options.position(new LatLng(lat / size, lng / size));
            options.icon(BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size))));
            // int iconType = size / 10;
            //
            // switch (iconType) {
            // case 10:
            // options.icon(
            // BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size,
            // R.drawable.marker_cluster_10))));
            // break;
            // case 50:
            // options.icon(
            // BitmapDescriptorFactory.fromBitmap(getViewBitmap(getView(size,
            // R.drawable.marker_cluster_20))));
            // break;
            // // case 2:
            // // options.icon(BitmapDescriptorFactory
            // // .fromBitmap(getViewBitmap(getView(size,
            // // R.drawable.marker_cluster_30))));
            // // break;
            // // case 3:
            // // options.icon(BitmapDescriptorFactory
            // // .fromBitmap(getViewBitmap(getView(size,
            // // R.drawable.marker_cluster_30))));
            // // break;
            // // case 4:
            // // options.icon(BitmapDescriptorFactory
            // // .fromBitmap(getViewBitmap(getView(size,
            // // R.drawable.marker_cluster_50))));
            // // break;
            // default:
            // options.icon(BitmapDescriptorFactory
            // .fromBitmap(getViewBitmap(getView(size,
            // R.drawable.marker_cluster_100))));
            // break;
            // }
        }
    }

    public View getView(int carNum) {
        View view = activity.getLayoutInflater().inflate(R.layout.my_car_cluster_view, null);
        TextView carNumTextView = (TextView) view.findViewById(R.id.my_car_num);
        RelativeLayout myCarLayout = (RelativeLayout) view.findViewById(R.id.my_car_bg);
        myCarLayout.setBackgroundResource(R.drawable.location_marker_man1);
        carNumTextView.setText(String.valueOf(carNum));
        return view;
    }

    /**
     * 把一个view转化成bitmap对象
     */
    public static Bitmap getViewBitmap(View view) {
        view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        return bitmap;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:id="@+id/my_car_bg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/my_car_num"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textColor="@color/blue_cloud_scheme"
            android:textSize="12sp" />
    </RelativeLayout>

</LinearLayout>

5.记得注册OnCameraChangeListener监听接口,如果这个任务都在主线程中,再加上很多maker的话,就会很卡,这时就需要多线程的帮助了(个人理解不到位对于多线程,你们可以发挥)首先下边这样,然后再第3步中那样。

private ExecutorService executorService = null;
executorService = Executors.newCachedThreadPool();
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值