百度地图开发之点聚合功能

举报
再见孙悟空_ 发表于 2022/01/15 00:23:50 2022/01/15
【摘要】 大家不清楚什么是点聚合,先上一下效果图。 从上面的这几张效果图,大家可以看到其实就是将一个区域内的点  聚合到一起,然后缩放可以改变区域内点显示效果。对于数据量比较大的功能来讲,显示效果会比较直观。 这个功能在百度地图的demo里面可以找到,但是我没有找到相关的文档说明... 具体实现方式 1...

大家不清楚什么是点聚合,先上一下效果图。

从上面的这几张效果图,大家可以看到其实就是将一个区域内的点  聚合到一起,然后缩放可以改变区域内点显示效果。对于数据量比较大的功能来讲,显示效果会比较直观。

这个功能在百度地图的demo里面可以找到,但是我没有找到相关的文档说明...

具体实现方式 1.下载百度地图的demo

     2.在demo中找到MarkerClusterDemo 这个类 具体逻辑参考这个类就行了。

贴出这个类的实现代码


  
  1. package baidumapsdk.demo.map;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import com.baidu.mapapi.clusterutil.clustering.Cluster;
  5. import com.baidu.mapapi.clusterutil.clustering.ClusterItem;
  6. import com.baidu.mapapi.clusterutil.clustering.ClusterManager;
  7. import com.baidu.mapapi.map.BaiduMap;
  8. import com.baidu.mapapi.map.BaiduMap.OnMapLoadedCallback;
  9. import com.baidu.mapapi.map.BitmapDescriptor;
  10. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  11. import com.baidu.mapapi.map.MapStatus;
  12. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  13. import com.baidu.mapapi.map.MapView;
  14. import com.baidu.mapapi.model.LatLng;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import android.widget.Toast;
  18. import baidumapsdk.demo.R;
  19. /**
  20. * 此Demo用来说明点聚合功能
  21. */
  22. public class MarkerClusterDemo extends Activity implements OnMapLoadedCallback {
  23. MapView mMapView;
  24. BaiduMap mBaiduMap;
  25. MapStatus ms;
  26. private ClusterManager<MyItem> mClusterManager;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_marker_cluster_demo);
  31. mMapView = (MapView) findViewById(R.id.bmapView);
  32. ms = new MapStatus.Builder().target(new LatLng(39.914935, 116.403119)).zoom(8).build();
  33. mBaiduMap = mMapView.getMap();
  34. mBaiduMap.setOnMapLoadedCallback(this);
  35. mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
  36. // 定义点聚合管理类ClusterManager
  37. mClusterManager = new ClusterManager<MyItem>(this, mBaiduMap);
  38. // 添加Marker点
  39. addMarkers();
  40. // 设置地图监听,当地图状态发生改变时,进行点聚合运算
  41. mBaiduMap.setOnMapStatusChangeListener(mClusterManager);
  42. // 设置maker点击时的响应
  43. mBaiduMap.setOnMarkerClickListener(mClusterManager);
  44. mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
  45. @Override
  46. public boolean onClusterClick(Cluster<MyItem> cluster) {
  47. Toast.makeText(MarkerClusterDemo.this,
  48. "有" + cluster.getSize() + "个点", Toast.LENGTH_SHORT).show();
  49. return false;
  50. }
  51. });
  52. mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
  53. @Override
  54. public boolean onClusterItemClick(MyItem item) {
  55. Toast.makeText(MarkerClusterDemo.this,
  56. "点击单个Item", Toast.LENGTH_SHORT).show();
  57. return false;
  58. }
  59. });
  60. }
  61. @Override
  62. protected void onPause() {
  63. mMapView.onPause();
  64. super.onPause();
  65. }
  66. @Override
  67. protected void onResume() {
  68. mMapView.onResume();
  69. super.onResume();
  70. }
  71. @Override
  72. protected void onDestroy() {
  73. mMapView.onDestroy();
  74. super.onDestroy();
  75. }
  76. /**
  77. * 向地图添加Marker点
  78. */
  79. public void addMarkers() {
  80. // 添加Marker点
  81. LatLng llA = new LatLng(39.963175, 116.400244);
  82. LatLng llB = new LatLng(39.942821, 116.369199);
  83. LatLng llC = new LatLng(39.939723, 116.425541);
  84. LatLng llD = new LatLng(39.906965, 116.401394);
  85. LatLng llE = new LatLng(39.956965, 116.331394);
  86. LatLng llF = new LatLng(39.886965, 116.441394);
  87. LatLng llG = new LatLng(39.996965, 116.411394);
  88. List<MyItem> items = new ArrayList<MyItem>();
  89. items.add(new MyItem(llA));
  90. items.add(new MyItem(llB));
  91. items.add(new MyItem(llC));
  92. items.add(new MyItem(llD));
  93. items.add(new MyItem(llE));
  94. items.add(new MyItem(llF));
  95. items.add(new MyItem(llG));
  96. mClusterManager.addItems(items);
  97. }
  98. /**
  99. * 每个Marker点,包含Marker点坐标以及图标
  100. */
  101. public class MyItem implements ClusterItem {
  102. private final LatLng mPosition;
  103. public MyItem(LatLng latLng) {
  104. mPosition = latLng;
  105. }
  106. @Override
  107. public LatLng getPosition() {
  108. return mPosition;
  109. }
  110. @Override
  111. public BitmapDescriptor getBitmapDescriptor() {
  112. return BitmapDescriptorFactory
  113. .fromResource(R.drawable.icon_gcoding);
  114. }
  115. }
  116. @Override
  117. public void onMapLoaded() {
  118. // TODO Auto-generated method stub
  119. ms = new MapStatus.Builder().zoom(9).build();
  120. mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms));
  121. }
  122. }


基本的逻辑都在demo里面有所实现,我就不详细说了。 我说几点可能需要我们自己改动的一些细节。

1.地图级别

mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(Float.parseFloat("10.8")).build()));//设置缩放级别
 

2.设置聚合圆圈的点击事件


  
  1. mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<BaiduItem>() {
  2. @Override
  3. public boolean onClusterClick(Cluster<BaiduItem> cluster) {
  4. float level = mBaiduMap.getMapStatus().zoom;
  5. mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(level+1).build()));
  6. return false;
  7. }
  8. });


这个我是点击聚合圆圈的时候 ,将地图级别放大一级,具体你们产品要求是什么样,自己在监听实现就好

3.设置聚合点圆圈样式

这个样式背景修改是在text_bubble.xml里面


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3. ~ Copyright (C) 2015 Baidu, Inc. All Rights Reserved.
  4. -->
  5. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:orientation="vertical">
  9. <com.baidu.mapapi.clusterutil.ui.RotationLayout
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:background="@drawable/map_circle_bg"
  13. android:orientation="vertical">
  14. <TextView
  15. android:id="@+id/text"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_gravity="center_horizontal"
  19. android:paddingBottom="5dp"
  20. android:paddingLeft="10dp"
  21. android:paddingRight="10dp"
  22. android:paddingTop="5dp"/>
  23. </com.baidu.mapapi.clusterutil.ui.RotationLayout>
  24. </LinearLayout>


上面的  android:background="@drawable/map_circle_bg"  这个就是自己定义的样式,我这个是写了一个带背景色的圆形

map_circle_bg.xml


  
  1. <shape
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shape="oval"
  4. android:useLevel="false" >
  5. <solid android:color="@color/green_theme" />
  6. <solid
  7. android:color="@color/green_theme" />
  8. <size android:width="6dp"
  9. android:height="6dp" />
  10. </shape>


颜色就自己改成自己的颜色就可以。

4.设置点击 mark点 弹出pop提示框


  
  1. mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<BaiduItem>() {
  2. @Override
  3. public boolean onClusterItemClick(final BaiduItem item) {
  4. TextView tv = new TextView(getApplicationContext());
  5. tv.setBackgroundResource(R.drawable.icon_pop);
  6. tv.setGravity(Gravity.CENTER_VERTICAL);
  7. tv.setText(item.getName());
  8. //定义用于显示该InfoWindow的坐标点
  9. LatLng pt = new LatLng(item.getPosition().latitude, item.getPosition().longitude);
  10. //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
  11. InfoWindow mInfoWindow = new InfoWindow(tv, pt, -47);
  12. //显示InfoWindow
  13. mBaiduMap.showInfoWindow(mInfoWindow);
  14. return false;
  15. }
  16. });

就是上面图三的提示框,这个需要注意的就是icon_pop这个图片用.9的图片,因为提示信息过多的时候可以自动适配。

5.设置修改marker点的 图片样式

大家看图中 我们的点出来的都是 红色和绿色的小房子,不是传统的 那种红色的小标注点


  
  1. @Override
  2. public BitmapDescriptor getBitmapDescriptor() {
  3. if(state.equals("1")){
  4. return BitmapDescriptorFactory.fromResource(R.drawable.icon_map_wkg);
  5. }else if(state.equals("2")){
  6. return BitmapDescriptorFactory.fromResource(R.drawable.icon_map_jg);
  7. }else if(state.equals("3")){
  8. return BitmapDescriptorFactory.fromResource(R.drawable.icon_map_wkg);
  9. }else{
  10. return BitmapDescriptorFactory.fromResource(R.drawable.icon_map_wkg);
  11. }
  12. }


这个state是自己new这个对象的时候,构造里面传一个值进来,用不同的值判断显示不同的标注icon。

最后给大家放上一个demo,是eclipse版本的。as版本的 官网下载下来的就是as的demo。

DEMO下载

如果大家还有其它相关问题,可以加入我的qq群讨论交流:454430053

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/60959852

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。