我是靠谱客的博主 轻松大地,最近开发中收集的这篇文章主要介绍百度地图 v3.5 根据数据源添加很多覆盖物和监听这些覆盖物,处理覆盖物重叠,点击添加覆盖物,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在上一片博客中已经讲述了如何定位,这里主要讲根据数据源来添加覆盖物,在百度的demo中就只是演示了他固定添加了几个覆盖物,但是在实际项目中需要添加的添加的覆盖物就不是固定的,需要根据list集合数据源来添加,并且需要为这些覆盖物添加上对应的点击事件。
        markers=new Marker[rodlist.size()];
        for (int i=0;i<rodlist.size();i++){
            double lat=rodlist.get(i).getGeo().getLat();
            double lng=rodlist.get(i).getGeo().getLng();
            LatLng latLng = new LatLng(lat,lng);
            if (rodlist.get(i).getType()==1) {
                OverlayOptions radpacketA = new MarkerOptions().position(latLng).icon(rad_packet);
                markers[i] = (Marker) (mBaiduMap.addOverlay(radpacketA));
            }else if(rodlist.get(i).getType()==2){
                OverlayOptions radpacketB = new MarkerOptions().position(latLng).icon(chests);
                markers[i] = (Marker) (mBaiduMap.addOverlay(radpacketB));
            }else if (rodlist.get(i).getType()==3){
                OverlayOptions radpacketC = new MarkerOptions().position(latLng).icon(gift_bag);
                markers[i] = (Marker) (mBaiduMap.addOverlay(radpacketC));
            }
Marker是覆盖物   OverlayOptions这个属性中可以为放入这个覆盖物的坐标,它的显示图片,还可以添加不断变化的动画。
BitmapDescriptor mCurrentMarker 
= BitmapDescriptorFactory.fromResource(R.mipmap.position_default);
这个就是创建覆盖物图片的对象。
我的这个rodlist中有三个Type我需要根据不同的Type添加不同的图片。应为有许多个 marker 所有我将所有marker放在了一个marker的数组中。
这样地图上就会显示出来所有的覆盖物了。
 
然后就是这些覆盖物的点击效果了。
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
通过这个方法就是实现所有覆盖物的点击效果了

我下边这些代码中实现了,我需要做出判断 我添加的这些覆盖物有没有被重叠。

首先我取到了所有覆盖物的经纬度,将这些覆盖物的坐标添加到一个list集合中,然后循环找出我点击的这个覆盖物是 marker集合中的哪一个。然后我将自己的坐标从所有覆盖物坐标中移除,通过
SpatialRelationUtil.isCircleContainsPoint(clicklat, 5, latlist.get(j));
传入自己的坐标,范围,移除自己后所有覆盖物的坐标。如果在这个范围内,将返回true,没有就是false,
如果有覆盖的就直接跳出这个循环,

需要你需要这些重叠的覆盖物,就可以继续呢个方法做判断,
这次我循环所有的覆盖物包括点击这个。
如果有重叠的,我将这些重叠了的覆盖物在这个list中的下标取到存入一个集合中,然后通过这个集合中的值取出数据源中对应的这些数据。
我是将这些重叠的覆盖物通过一个listview在展示了出来。
然后我通过calculate这个方法,计算出了这些重叠的覆盖物与我当前坐标的距离。

如果需要知道当前点击这个覆盖物与地图上其余覆盖物的距离
可以通过将自己的坐标,和所有覆盖物的坐标进行距离计算  然后将算出的距离存放到一个数组中
通过冒泡法一次排列这些距离,获取距离点击的覆盖物最近的六个覆盖物的下标,将这些下标在存入一个数组,然后循环这些数组取出这些下标然后就可以通过写下标找到数据源中对应的数据。
(不好意,可能我表达的不是很清晰,但是通过上边这些和代码应该就能明白了)

    public void markeronclick(){
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                ArrayList<Data> rodlistdialog = new ArrayList<Data>();
                ArrayList<LatLng> latlist = new ArrayList<LatLng>();
          /*      int km[] = new int[rodlist.size()];
                int kmdata[] = new int[rodlist.size()];*/
                MyArrayList lable = new MyArrayList();
                //取到所有经纬度
                for (int k = 0; k < rodlist.size(); k++) {
                    LatLng allLat = new LatLng(rodlist.get(k).getGeo().getLat(), rodlist.get(k).getGeo().getLng());
                    latlist.add(allLat);
                }
                //循环所有覆盖物
                for (int i = 0; i < rodlist.size(); i++) {
                    //判断点击的覆盖物
                    if (marker == markers[i]) {
                        //获取点击的这个覆盖物的经纬
                        LatLng clicklat = new LatLng(rodlist.get(i).getGeo().getLat(), rodlist.get(i).getGeo().getLng());
                        //移除点击的这个覆盖物的经纬度
                        latlist.remove(i);
                        boolean is = false;
                        //判断点击的覆盖物是否被重叠
                        for (int j = 0; j < latlist.size(); j++) {
                            //点击的覆盖物范围内是否有其他覆盖物 有则为 true
                            is = SpatialRelationUtil.isCircleContainsPoint(clicklat, 5, latlist.get(j));
                            //跳出循环
                            if (is == true) {
                                break;
                            }
                        }
                        //如果有
                        if (is == true) {
                            //判断点击的覆盖物是否被重叠
                            for (int j = 0; j < rodlist.size(); j++) {
                                LatLng ww = new LatLng(rodlist.get(j).getGeo().getLat(), rodlist.get(j).getGeo().getLng());
                                //点击的覆盖物范围内是否有其他覆盖物 有则为 true
                                is = SpatialRelationUtil.isCircleContainsPoint(clicklat, 5, ww);
                                if (is == true) {
                                    lable.add(j);
                                }
                            }

                            for (int v = 0; v < lable.size(); v++) {
                                Data data = new Data();
                                data.setExp(rodlist.get((Integer) lable.get(v)).getExp());
                                data.setTitle(rodlist.get((Integer) lable.get(v)).getTitle());
                                data.setRid(rodlist.get((Integer) lable.get(v)).getRid());
                                data.setType(rodlist.get((Integer) lable.get(v)).getType());
                                data.setFromId(rodlist.get((Integer) lable.get(v)).getFromId());
                                data.setGeo(rodlist.get((Integer) lable.get(v)).getGeo());
                                rodlistdialog.add(data);
                            }
                            //自己定位的位置距离这些红包的距离
                            int kms[] = new int[rodlistdialog.size()];
                            for (int n = 0; n < rodlistdialog.size(); n++) {
                                LatLng lng = new LatLng(rodlistdialog.get(n).getGeo().getLat(), rodlistdialog.get(n).getGeo().getLng());
                                int km = (int) calculate(myLatLng, lng);
                                kms[n] = km;
                            }
                            ListDialogAdapter adapter = new ListDialogAdapter(MainMap.this, rodlistdialog, kms);
                            adapter.notifyDataSetChanged();
                            DialogTip.listdialog(MainMap.this, adapter, itemsOnClick);
                          /*  //计算点击的覆盖物于所有覆盖物之间的距离
                            for (int u = 0; u < rodlist.size(); u++) {
                                LatLng lngB= new LatLng(rodlist.get(u).getGeo().getLat(), rodlist.get(u).getGeo().getLng());
                                int dis = (int) calculate(clicklat, lngB);
                                km[u]=dis;
                                kmdata[u]=km[u];
                            }

                            //冒泡排序
                            bubbleSort(km);
                            int six[]=new int[6];
                            //取到最近的6个覆盖物
                            for (int r=0;r<six.length;r++){
                                six[r]=km[r];
                            }
                            int flag[] = new int[6];
                            //获取这六个覆盖物在所有覆盖物中的对应的下标
                            for (int y=0;y<six.length;y++){
                                for (int l=0;l<kmdata.length;l++){
                                    if (six[y]==kmdata[l]){
                                        flag[y]=l;
                                }
                                }
                            }
                            for (int g=0;g<flag.length;g++) {
                            }*/
                            break;
                        } else {
                            if (rodlist.get(i).getType() == 1) {
                                Intent intent = new Intent(MainMap.this, RodRadPacket.class);
                                intent.putExtra("rId", rodlist.get(i).getRid());
                                intent.putExtra("ll", myLatLng.latitude + "," + myLatLng.longitude);
                                intent.putExtra("type", 1);
                                startActivity(intent);
                            } else if (rodlist.get(i).getType() == 2) {
                                rodchestData(rodlist.get(i).getRid());
//                                DialogTip.getExpdialog(MainMap.this, "系统", rodlist.get(i).getExp());
                            } else if (rodlist.get(i).getType() == 3) {
                                Intent intent = new Intent(MainMap.this, RodRadPacket.class);
                                intent.putExtra("pId", rodlist.get(i).getRid());
                                intent.putExtra("ll", myLatLng.latitude + "," + myLatLng.longitude);
                                intent.putExtra("type", 3);
                                startActivity(intent);
                            }
                        }
                    }
                }
                return true;
            }
        });
    }

   /**
     * 计算两点直间的距离
     * @param A
     * @param B
     * @return
     */
    private double calculate(LatLng A,LatLng B){
        double meter= DistanceUtil. getDistance(A, B);
        return meter;
    }
   /**
     * 冒泡排序
     * 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,
     * 自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
     * 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
     */
    public void bubbleSort(int[] array) {
        int temp;
        for(int i=0;i<array.length;i++){//趟数
            for(int j=0;j<array.length-i-1;j++){//比较次数
                if(array[j]>array[j+1]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
        }
    }

在下一篇中会讲述一下搜索


最后

以上就是轻松大地为你收集整理的百度地图 v3.5 根据数据源添加很多覆盖物和监听这些覆盖物,处理覆盖物重叠,点击添加覆盖物的全部内容,希望文章能够帮你解决百度地图 v3.5 根据数据源添加很多覆盖物和监听这些覆盖物,处理覆盖物重叠,点击添加覆盖物所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部