Android开发之高德地图聚合Markers

上一篇说了在地图上实现了自定义Markers,但是markers太多在地图上显示的就会密密麻麻,重叠覆盖,这里就介绍一下markers的聚合。先看一下封装好的聚合类。

 

public class MarkerClusterYellow {
    private Activity activity;
    private MarkerOptions options;
    private ArrayList<MarkerOptions>includeMarkers;
    private LatLngBounds bounds;// 创建区域
 
/**
*
* @param activity
* @param firstMarkers
* @param projection
* @param gridSize
* 区域大小参数
*/
   public MarkerClusterYellow(Activity activity, MarkerOptions firstMarkers,
         Projection projection, int gridSize) {
         options = new MarkerOptions();
         this.activity = activity;
         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));
         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);
     }
 
/**
* 添加marker
*/
  public void addMarker(MarkerOptions markerOptions) {
      includeMarkers.add(markerOptions);// 添加到列表中
  }
 
/**
* 设置聚合点的中心位置以及图标
*/
public void setpositionAndIcon(String text) {
    String id="";
    int size = includeMarkers.size();
    if (size == 1) {
         return;
     }
   double lat = 0.0;
   double lng = 0.0;
   String snippet = "";
   for (MarkerOptions op : includeMarkers) {
       lat += op.getPosition().latitude;
       lng += op.getPosition().longitude;
       snippet += op.getTitle() + "\n";
       id=id+op.getTitle()+",";
    }
   options.position(new LatLng(lat / size, lng / size));// 设置中心位置为聚集点的平均距离
   options.title(id);
   options.snippet(snippet);
   int iconType = size / 2;
 
   switch (iconType) {
 
          default:
               options.icon(BitmapDescriptorFactory
               .fromBitmap(getViewBitmap(getView(size,text,
               R.mipmap.content_icon_positions_yellow))));
          break;
         }
    }
 
   public LatLngBounds getBounds() {
       return bounds;
   }
 
   public MarkerOptions getOptions() {
        return options;
   }
 
   public void setOptions(MarkerOptions options) {
          this.options = options;
   }
 
   public View getView(int carNum,String text,int resourceId) {
        View view = activity.getLayoutInflater().inflate(R.layout.my_car_cluster_view, null);
        TextView carNumTextView = (TextView) view.findViewById(R.id.my_car_num);
        TextView tv_price = (TextView) view.findViewById(R.id.tv_price);
        TextView tv_price_status = (TextView) view.findViewById(R.id.tv_price_status);
        tv_price.setText(text);
        tv_price_status.setText("元/天");
        tv_price.setTextColor(Color.parseColor("#FFBB18"));
        tv_price_status.setTextColor(Color.parseColor("#FFBB18"));
        LinearLayout myCarLayout = (LinearLayout) view.findViewById(R.id.my_car_bg);
        myCarLayout.setBackgroundResource(resourceId);
        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;
     }
}

在前一篇博客的基础上我们进行聚合,只需要做以下操作:

public class FragmentMap extends Fragment implements LocationSource, AMapLocationListener,OnCameraChangeListener {

     private static FragmentMap fragment = null;

     @ViewInject(R.id.map)

     private MapView mapView;

     private AMap aMap;

     private View mapLayout;

     private OnLocationChangedListener mListener;

     private LocationManagerProxy mAMapLocationManager;

     private List<PositionEneity> positionEneityList = new ArrayList<PositionEneity>();

     private ArrayList<MarkerOptions> markerOptionsListYellow = new ArrayList<MarkerOptions>();// 所有的marker

     private ArrayList<MarkerOptions> markerOptionsListInViewYellow= new ArrayList<MarkerOptions>();// 视野内的marker

     String yellow="";

     private int height;// 屏幕高度(px)

     private int width;// 屏幕宽度(px)

     private int gridSize = 50;// marker点区域大小

 

    Handler handler = new Handler() {

      @Override

      public void handleMessage(android.os.Message msg) {

          super.handleMessage(msg);

          if (msg.what == 0) {

              resetMarks();// 更新markers

           }

      }

 };

 

   public static Fragment newInstance() {

        if (fragment == null) {

            synchronized (FragmentMap.class) {

               if (fragment == null) {

                  fragment = new FragmentMap();

 

             }

        }

     }

       return fragment;

 }

 

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

      if (mapLayout == null) {

         mapLayout = inflater.inflate(R.layout.fragment_map, null);

         ViewUtils.inject(this, mapLayout);

         mapView.onCreate(savedInstanceState);

         DisplayMetrics dm = new DisplayMetrics();

         getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);

         width = dm.widthPixels;

         height = dm.heightPixels;

              if (aMap == null) {

                  aMap = mapView.getMap();

                  aMap.setLocationSource(this);// 设置定位监听

                  aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示

                  aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false

 

             }

         } else {

               if (mapLayout.getParent() != null) {

                  ((ViewGroup) mapLayout.getParent()).removeView(mapLayout);

                }

          }

 

         aMap.setOnCameraChangeListener(this);

      return mapLayout;

}

 /**

 * 获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker

 */

<strong> private void resetMarks() {

 // 开始刷新界面

     Projection projection = aMap.getProjection();

     Point p = null;

     markerOptionsListInViewYellow.clear();

 // 获取在当前视野内的marker;提高效率

     for (MarkerOptions mp : markerOptionsListYellow) {

     p = projection.toScreenLocation(mp.getPosition());

     if (p.x &lt; 0 || p.y &lt; 0 || p.x &gt; width || p.y &gt; height) {

 // 不添加到计算的列表中

      } else {

         markerOptionsListInViewYellow.add(mp);

      }

 }

 

 // 自定义的聚合类MarkerCluster

   ArrayList&lt;MarkerClusterYellow&gt; clustersMarkeryellow = new ArrayList&lt;MarkerClusterYellow&gt;();

   for (MarkerOptions mp : markerOptionsListInViewYellow) {

          if (clustersMarkeryellow.size() == 0) {

              clustersMarkeryellow.add(new MarkerClusterYellow(getActivity(), mp,

                projection, gridSize));//gridSize 根据自己需求调整

          } else {

               boolean isIn = false;

               for (MarkerClusterYellow cluster : clustersMarkeryellow) {

               if (cluster.getBounds().contains(mp.getPosition())) {

                   cluster.addMarker(mp);

                   isIn = true;

                   break;

                 }

          }

      if (!isIn) {

            clustersMarkeryellow.add(new MarkerClusterYellow(getActivity(), mp, projection, gridSize));

                 }

         }

 }

 

 // 先清除地图上所有覆盖物

     aMap.clear();

     for (MarkerClusterYellow markerClusterYellow : clustersMarkeryellow) {

            markerClusterYellow.setpositionAndIcon(yellow);// 设置聚合点的位置和icon

            aMap.addMarker(markerClusterYellow.getOptions());// 重新添加

          }

  

 }

 private void initview() {

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

       if (positionEneityList.get(i).getType().equals("2")) {

             yellow=positionEneityList.get(i).getPrice();

             View view01 = View.inflate(getActivity(),R.layout.view_everyday, null);

             TextView tv_price = (TextView) view01.findViewById(R.id.tv_price);

             TextView tv_price_status = (TextView) view01.findViewById(R.id.tv_price_status);

             tv_price.setText(positionEneityList.get(i).getPrice());

             tv_price_status.setText("元/天");

             Bitmap bitmap = CommentActivity.convertViewToBitmap(view01);

           <strong>  markerOptionsListYellow.add(new MarkerOptions() .position(new LatLng(Double.parseDouble(positionEneityList.get(i).getLatitude())

 , Double.parseDouble(positionEneityList.get(i).getLongitude()))).icon(BitmapDescriptorFactory.fromBitmap(bitmap))

 .title(positionEneityList.get(i).getId()));

           }

       }

 }

 

 

 @Override

 public void onCameraChange(CameraPosition cameraPosition) {

 

 }

 

 @Override

 public void onCameraChangeFinish(CameraPosition cameraPosition) {

 

      handler.sendEmptyMessage(0);// 更新界面marker

 }

}

定位和地图显示部分请参考之前的博客:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, arraylist
, new
null
android 高德地图聚合、android 高德聚合点、android 高德地图开发、android 高德导航开发、高德地图点聚合,以便于您获取更多的相关知识。

时间: 2024-09-14 09:41:53

Android开发之高德地图聚合Markers的相关文章

Android开发之高德地图实现定位

在应用开发中,地图开发是经常需要使用的"组件",Google Map虽然有官方教程,无奈用不起来,原因你懂的~~那么国内比较出名的是就是百度地图和高德地图,由于个人喜好,所以选择了高德地图LBS,废话不说,上干货. 1.注册开发者,创建应用 这个几乎是所有开放平台都通用的做法,无外乎注册帐号,成为开发者,然后创建一个Android应用,会为你分配一个key绑定你的服务. 注册key.PNG 2.下载SDK,导入jar包,add to library jar包.PNG 第一个是2D地图的

关于安卓开发中高德地图的定位问题,amaplocationlistener出现问题

问题描述 关于安卓开发中高德地图的定位问题,amaplocationlistener出现问题 想用高德地图实现定位,官方的demo可以运行,但是拷贝到自己工程中就不行,如果不加定位是可以获得地图的,但是加定位后程序就出错,log日志里有提示 Failed resolving Lcom...interface...AMapLocationListener 求助到底是哪里出问题了--我应该导的包应该都导了,配置中也进行了相关配置--

Android高德地图自定义Markers的例子

之前的博客里说了地图的嵌入和定位,今天就说说在地图上显示一些我们想要的.在地图中有自带的Markers(标记),但是它只显示一个椭圆的图标,一般是不符合我们的需求的,这样就要我们自己来自定义.首先标记有下面一些属性; 1.position(Required) 在地图上标记位置的经纬度值.参数不能为空. 2.title 当用户点击标记,在信息窗口上显示的字符串. 3.snippet 附加文本,显示在标题下方. 4.draggable 如果您允许用户可以自由移动标记,设置为" true "

android开发-andriod 离线地图 报错

问题描述 andriod 离线地图 报错 离线地图加载加载成功了 断网也能用 可是第一次进入activity的时候没错 退出的时候再次进入就会退出程序 请问大婶是什么原因 求解决

百度地图 离线导航功能 android开发

问题描述 百度地图 离线导航功能 android开发 现在想做一个百度地图的离线功能的app,要求可以在离线模式下,通过经纬度或者地址 定位某一点,并通过本地位置到该点之间实现离线导航(即显示公交路线,步行路线, 驾车路线等),不知这些功能能否实现,怎么实现? 解决方案 Android开发之--调用百度地图导航功能android开发 百度离线地图百度离线地图开发 解决方案二: 你一定没仔细读百度离线导航的API文档,百度自带离线导航功能,前提是你缓存了当地的地图

高德地图JavaScript API开发研究

原文:高德地图JavaScript API开发研究 高德地图JavaScript API是一套用JavaScript 语言编写的应用程序接口,可以通过各种API接口向地图添加内容,创建功能丰富.交互性强的地图应用.高德地图JavaScript API 提供了大量的实用工具和富有特色的插件功能,并提供了搜索和路线规划等服务. 1.首先 2.然后 3.最后就是看官方文档开发 高德地图API使用介绍:http://lbs.amap.com/api/javascript-api/guide-2/map_

android 用高德地图开发进行导航时,定位位置一直显示不动,不会跟着位置改变而改变

问题描述 android 用高德地图开发进行导航时,定位位置一直显示不动,不会跟着位置改变而改变 用高德地图开发导航时,实际位置虽然改变了,但是地图上的定位按钮始终不动,,无法正常导航 解决方案 导航需要开启gps,并且需要在屋外才可以. 解决方案二: 你不动我不动 中国移动我不动 解决方案三: 权限要确认没有问题,没看代码也不知道你的问题,不过开发平台的文档还是很全面细致的,仔细看看是不是哪儿没做对或少做了

关于Android高德地图的简单开发实例代码(DEMO)_Android

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

关于Android高德地图的简单开发实例代码(DEMO)

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab