高德地图 聚合

项目里 刚好用到了 高德聚合 开始找了个官方的demo 发现 android 和ios的效果 差很多 ,但还是要做成一致的 。。oedoukei 当然 这难不倒wuli 戴老师 ,几个小时 就帮我改编了一版。。。

高德地图 聚合_第1张图片
这是最终的效果.jpg

高德聚合的demo地址:

(https://github.com/amap-demo/android-cluster-marker)

那下面 我就贴一个工具类 哦:




public class AggregationUtils implements AMap.OnCameraChangeListener,
        AMap.InfoWindowAdapter, AMap.OnMarkerClickListener,AMap.OnMapClickListener {

    private ArrayList mClusters = new ArrayList<>();   //聚合点

    private List allMarker = new ArrayList<>(); //所有的marker

    private Marker clickMarker; //当前点击的marker

    private float zoom;   //当前放大缩小程度

    private int aggregationRadius=100;//聚合半径

    private double mClusterDistance;    //聚合范围

    private List allPoints = new ArrayList(); //所有的点

    private Context context;

    private AMap aMap;

    public void setContext(Context context) {
        this.context = context;
    }

    /**
     * 设置所有的点
     * @param allPoints
     */
    public void setAllPoints(List allPoints) {
        this.allPoints = allPoints;
    }

    /**
     * 设置map
     * @param aMap
     */
    public void setaMap(AMap aMap) {
        this.aMap = aMap;
        zoom = aMap.getCameraPosition().zoom;
        aMap.setInfoWindowAdapter(this);
        aMap.setOnCameraChangeListener(this);
        aMap.setOnMarkerClickListener(this);
        aMap.setOnMapClickListener(this);
    }

    /**
     * 显示所有的点
     */
    private void showPoint(){
        assignClusters();

        //画圆
        for (int i=0;i clusters) {
        //循环所有的聚合点
        for (Cluster cluster : clusters) {
            LatLng clusterCenterPoint = cluster.getCenterLatLng();
            //计算当前点和聚合点之间的距离
            double distance = AMapUtils.calculateLineDistance(latLng, clusterCenterPoint);

            //如果距离在规定点范围内,则说明有聚合点
            if (distance < mClusterDistance) {
                return cluster;
            }
        }
        return null;
    }

    /**
     * 获取每个聚合点的绘制样式
     */
    private BitmapDescriptor getBitmapDes(int num) {
        TextView textView = new TextView(context);
        textView.setText(String.valueOf(num));
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(Color.WHITE);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
        textView.setBackground(getDrawAble());

        return BitmapDescriptorFactory.fromView(textView);
    }


    private Drawable getDrawAble() {
        int radius = DensityUtils.dp2px(context, 50);
        Drawable bitmapDrawable = new BitmapDrawable(null, drawCircle(radius));
        return bitmapDrawable;
    }


    private Bitmap drawCircle(int radius) {
        Bitmap bitmap = Bitmap.createBitmap(radius * 2, radius * 2,
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint1 = new Paint();

        paint1.setColor(Color.parseColor("#2dbdff"));
        paint1.setAlpha(160);
        canvas.drawCircle(radius,radius,radius-10,paint1);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.parseColor("#0386ba"));                          //设置画笔颜色
        paint.setStyle(Paint.Style.STROKE);                       //设置画笔为空心
        paint.setStrokeWidth( DensityUtils.dp2px(context, 4));             //设置线宽
        canvas.drawCircle(radius,radius,radius-10,paint);

        return bitmap;
    }

    /**
     * 点击地图
     * @param latLng
     */
    @Override
    public void onMapClick(LatLng latLng) {
        clickMarker.hideInfoWindow();
    }

    /**
     * 地图移动
     * @param cameraPosition
     */
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        if(zoom!=cameraPosition.zoom){
            clickMarker = null;
            zoom = cameraPosition.zoom;
        }
    }
    /**
     * 地图移动完成
     * @param cameraPosition
     */
    @Override
    public void onCameraChangeFinish(CameraPosition cameraPosition) {
        for (Marker marker:allMarker){
            if(clickMarker!=null&&clickMarker.getPosition().longitude==marker.getPosition().longitude&&clickMarker.getPosition().latitude==marker.getPosition().latitude){
                continue;
            }

            marker.hideInfoWindow();
            marker.remove();
        }

        allMarker = new ArrayList();
        mClusters = new ArrayList();
        mClusterDistance = aMap.getScalePerPixel()*aggregationRadius;//聚合的范围半径
        showPoint();

        //如果点击的marker 不再可是范围内
        LatLngBounds visibleBounds = aMap.getProjection().getVisibleRegion().latLngBounds;
        if(!visibleBounds.contains(clickMarker.getPosition())){
            clickMarker.hideInfoWindow();
            clickMarker.remove();
            clickMarker=null;
        }
    }
    /**
     * marker 点击
     * @param
     */
    @Override
    public boolean onMarkerClick(Marker marker) {
        clickMarker = marker;
        marker.showInfoWindow();

        //返回:true 表示点击marker 后marker 不会移动到地图中心;返回false 表示点击marker 后marker 会自动移动到地图中心
        return true;
    }

    /**
     * 自定义弹框
     * @param marker
     * @return
     */
    @Override
    public View getInfoWindow(Marker marker) {
        View infoContent = LayoutInflater.from(context).inflate(R.layout.dialog_behavior, null);
        render(infoContent,marker);
        return infoContent;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }


    /**
     * 自定义infowinfow窗口
     * @param
     * @param view
     */
    public void render(View view,Marker marker) {
        final Cluster cluster = (Cluster)marker.getObject();

        ListView recyclerView = (ListView) view.findViewById(R.id.listView);
        recyclerView.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return cluster.mClusterItems.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return 0;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = LayoutInflater.from(context).inflate(R.layout.item_behavior, parent,false);
                TextView tv = (TextView) view.findViewById(R.id.text_item);
                tv.setText(cluster.mClusterItems.get(position).address);
                return view;
            }
        });
        setListViewHeightBasedOnChildren(recyclerView);

    }

    /**
     * 切换页面的时候调用
     */
    public void resetData(){
        if(clickMarker!=null){
            clickMarker.hideInfoWindow();
        }
        allPoints.clear();
    }

    /**
     * 动态设置listview 的高度
     * @param listView
     */
    public void setListViewHeightBasedOnChildren(ListView listView) {

        //获取listview的适配器
        ListAdapter listAdapter = listView.getAdapter(); //item的高度

        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;

        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);

            listItem.measure(0, 0); //计算子项View 的宽高 //统计所有子项的总高度
            totalHeight += listItem.getMeasuredHeight()+listView.getDividerHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        int maxHeight=DensityUtils.dp2px(context,100);
        if(totalHeight>maxHeight){
            params.height=maxHeight;
        }else{
            params.height = totalHeight;
        }

        listView.setLayoutParams(params);
    }

    /**
     *
     * 聚合点
     */
    public class Cluster {
        //聚合点位置
        private LatLng mLatLng;

        //聚合点中列表
        private List mClusterItems = new ArrayList();

        Cluster( LatLng latLng) {
            mLatLng = latLng;
        }

        LatLng getCenterLatLng() {
            return mLatLng;
        }

        void addClusterItem(LatLng latLng ,String address,String id) {
            ClusterItem clusterItem=new ClusterItem();
            clusterItem.latLng=latLng;
            clusterItem.address=address;
            clusterItem.id=id;
            mClusterItems.add(clusterItem);
        }
    }

    static class ClusterItem{
        public LatLng latLng;
        public  String address;
        public String id;
    }
}
  • 初始化调用
 aggregationutils=new AggregationUtils();
            aggregationutils.setaMap(aMap);
            aggregationutils.setContext(getActivity());
  • set数据点
aggregationutils.setAllPoints(allPoints);

你可能感兴趣的:(高德地图 聚合)