1. 程式人生 > >百度地圖點聚合自定義marker

百度地圖點聚合自定義marker

效果如圖


自定義ClusterItem類

 /**
     * 每個Marker點,包含Marker點座標以及圖示
     */
public class MyClusterItem implements ClusterItem {
private final LatLng mPosition;
private RealTimeLocationBean.ListBean listBean;//方向
private View view;//mark佈局
public MyClusterItem(RealTimeLocationBean.ListBean listBean) {
mPosition = new 
LatLng(Double.valueOf(listBean.getBlat()), Double.valueOf(listBean.getBlng())); this.listBean = listBean; ViewHolder viewHolder; view = View.inflate(RealTimeActivity.this, R.layout.mark_layout, null); viewHolder = new ViewHolder(view); view.setTag(viewHolder); if (Preferences.getBoolean("carNumber",
false)) { viewHolder.textView.setText(listBean.getCarPlate()); } else { viewHolder.textView.setText(listBean.getCarName()); } if (Integer.valueOf(listBean.getState()) < 9) { viewHolder.imageView.setRotation(Float.valueOf(listBean.getDrct())); } else { viewHolder.
imageView.setRotation(0); } viewHolder.imageView.setImageBitmap(ImageUtils.getImageFromAssetsFile("car/" + listBean.getIcon()));
//    public static Bitmap getImageFromAssetsFile(String fileName) {
//        Bitmap image = null;
//        AssetManager am = App.getAppContext().getResources().getAssets();
//        try {
//            InputStream is = am.open(fileName);
//            image = BitmapFactory.decodeStream(is);
//            is.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return image;
//    }

//下載到本地進行的載入//
     File file = new File(ToolsUtil.imgPath+"/"+listBean.getState()+".png");//            if (file.exists()) {//                Bitmap bm = BitmapFactory.decodeFile(ToolsUtil.imgPath+"/"+listBean.getState()+".png");//                //將圖片顯示到ImageView中//                viewHolder.imageView.setImageBitmap(bm);//            }}@Overridepublic LatLng getPosition() {return mPosition;        }@Overridepublic String getCarId() {return listBean.getCarId();        }@Overridepublic RealTimeLocationBean.ListBean getListBean() {return listBean;        }@Overridepublic BitmapDescriptor getBitmapDescriptor() {return BitmapDescriptorFactory.fromView(view);        }class ViewHolder {@BindView(R.id.img_mark_pic)ImageView imageView;@BindView(R.id.tv_mark_name)TextView textView;            ViewHolder(View view) {ButterKnife.bind(this, view);            }        }    }

在要進行聚合的類中

private List<MyClusterItem> items = new ArrayList<>();//marker點集合
// 定義點聚合管理類ClusterManager mClusterManager = new ClusterManager<>(this, mBaiduMap);
items.add(new MyClusterItem(bean));
mClusterManager.addItems(items);
//mClusterManager.cluster();//設定後不用移動更新點狀態
//mBaiduMap.clear();//清理地圖
//items.clear();//清除原來marker的資料
//mClusterManager.clearItems();//清除原來marker的資料
mMapView.showZoomControls(false);//是否顯示縮小放大按鈕// 設定地圖監聽,當地圖狀態發生改變時,進行點聚合運算mBaiduMap.setOnMapStatusChangeListener(mClusterManager);// 設定maker點選時的響應mBaiduMap.setOnMarkerClickListener(mClusterManager);
//集合點展開事件
mClusterManager.setOnClusterClickListener(cluster -> {
List<MyClusterItem> items = (List<MyClusterItem>) cluster.getItems();
LatLngBounds.Builder builder2 = new LatLngBounds.Builder();
for (MyClusterItem MyClusterItem : items) {
builder2 = builder2.include(MyClusterItem.getPosition());
    }
LatLngBounds latlngBounds = builder2.build();
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngBounds(latlngBounds, mMapView.getWidth(), mMapView.getHeight());
mBaiduMap.animateMapStatus(u);
return false;
});
//Marker 監聽事件
mClusterManager.setOnClusterItemClickListener(item -> {
setMarkPopupWindow(item.getListBean().getCarId(), item.getPosition());
return false;
});
//每次重新設定資料時 設定中心點的方法自動計算 顯示地圖所有點 
RealTimeLocationBean.ListBean//是包含marker點資訊的類
private void zoomToSpan(List<RealTimeLocationBean.ListBean> listBean) {if (listBean.size() > 0) {LatLngBounds.Builder builder = new LatLngBounds.Builder();for (RealTimeLocationBean.ListBean bean : listBean) {// polyline 中的點可能太多,只按marker 縮放if (bean.getBlat().equals("") || bean.getBlng().equals("")) continue;builder.include(new LatLng(Double.valueOf(bean.getBlat()), Double.valueOf(bean.getBlng()))); }mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLngBounds(builder.build())); }}
/**
 * 重新設定設定點資料
 */
private void setMarkDates(List<RealTimeLocationBean.ListBean> listBean) {
if (listBean == null || listBean.size() <= 0) return;
mBaiduMap.clear();
items.clear();
mClusterManager.clearItems();
for (RealTimeLocationBean.ListBean bean : listBean) {
if (bean.getBlng().equals("") || bean.getBlat().equals("")) continue;
items.add(new MyClusterItem(bean));
    }
mClusterManager.addItems(items);
mClusterManager.cluster();//設定後不用移動更新點狀態
zoomToSpan(listBean);
}
//清除全部
imgMapClear.setOnClickListener(view -> {
mBaiduMap.clear();
mClusterManager.clearItems();//清除聚合點
saveListBean.clear();
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mBaiduMap.getMapStatus()));//重新整理地圖
});
判斷是否聚合
if (Preferences.getBoolean("point", true)) {
mClusterManager.setMackSize(2);//聚合起始點2個
} else {
mClusterManager.setMackSize(10000);
}
NonHierarchicalDistanceBasedAlgorithm 下 控制點聚合範圍
public static final int MAX_DISTANCE_AT_ZOOM = 200; // essentially 100 dp.設定點聚合距離
/**
 * ClusterItem represents a marker on the map.
 */
public interface ClusterItem {//介面下方法按需求自行更改
/**
     * The position of this marker. This must always return the same value.
     */
LatLng getPosition();//點
String getCarId();//車輛ID
RealTimeLocationBean.ListBean getListBean();//方向
BitmapDescriptor getBitmapDescriptor();//圖片
}

1.如果marker點的圖片要求載入網路圖,而且不進行更改的可以提供思路
進入之前先下載圖片到本地,然後
Bitmap bm = BitmapFactory.decodeFile(ToolsUtil.imgPath+"/"+listBean.getState()+".png");
imageView.setImageBitmap(bm)
進行設定2.如果圖片過多,同時需要放在本地又不想通過id獲取,建議放在assets 資料夾中,通過以下方法進行獲取
imageView.setImageBitmap(ImageUtils.getImageFromAssetsFile("car/" + listBean.getIcon()));

public static Bitmap getImageFromAssetsFile(String fileName) {
Bitmap image = null;
AssetManager am = App.getAppContext().getResources().getAssets();
try {
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
    } catch (IOException e) {
e.printStackTrace();
    }
return image;
}
如同這種需要數字作為檔名的:

相關推薦

地圖聚合定義marker

效果如圖自定義ClusterItem類 /** * 每個Marker點,包含Marker點座標以及圖示 */ public class MyClusterItem implements ClusterItem { private final LatLng

Android定位&地圖&導航——基於地圖,實現定義圖示繪製並選時彈出泡泡

public class MainActivity extends Activity { private EditText txtAddr; // 定位相關 LocationClient mLocClient; LocationData locData = nul

關於地圖InfoWindow響應定義佈局選事件

大概講解:在百度地圖上顯示一個marker,當marker被點選後,會彈出一個自定義view,當時在公司做這個功能,被坑慘了,死活彈不出來,不響應.接下來看一下效果圖,程式碼有詳細註釋,進去之後把百度申請的祕鑰換成自己的.有一部分是檢測網路程式碼.這個不用管.程式碼如下:pu

地圖根據座標定義覆蓋物,並實現其選事件

在很多APP中都會用到百度地圖,以實現各種功能,本片文章介紹在百度地圖中新增自定義覆蓋物並新增其點選事件 public class NearByFragment extends Fragment { private MapView mapView;

地圖聚合動畫一起使用

問題:不修改原始碼的情況下,點聚合和點動畫一起使用的時候,會發現只要移動地圖後,點動畫就會消失 解決方法: 修改點聚合原始碼  =>  BMapLib_MarkerClusterer.js中的 _createClusters 方法 MarkerClust

iOS 地圖聚合在房地產專案中的應用

1.公司的專案是面向房地產的,包含新房(全國多個分公司),存租房(與建行建方的合作)專案,所以地圖與看房相結合比較多,之前為了進度,地圖這一塊的業務都是H5實現,現在穩定下來後,H5的體驗度不是很高,所以地圖這一塊全部換成原生。這篇文章也是做個探索和總結,以便

地圖的覆蓋物定義(二)--資訊視窗的定義(呼叫白茹提供的資訊視窗InfoWindow)

百度地圖的覆蓋物自定義(而)--資訊視窗的自定義(呼叫白茹提供的資訊視窗InfoWindow) var point=new BMap.Point(111.54525,45.578); setInfo

地圖建立InfoWindow定義View顯示

在網上查閱資料發現各種答案,可能是度孃的原因,反正是沒有找到有效的方法。有的解決了,但方法超複雜,不忍直視了。 自己就去查閱百度API,在InfoWindow的構造方法: InfoWindow public InfoWindow(View view, LatLn

地圖聚合MarkerClusterer,效能優化

百度的點聚合演算法 是基於方格和距離的聚合演算法,即開始的時候地圖上沒有任何已知的聚合點,然後遍歷所有的點,去計算點的外包正方形(由gridSize指定),若此點的外包正方形與現有的聚合點的外包正方形不相交,則新建聚合點,若相交就把該點加到該聚合點,效果如下圖,為了便於

地圖聚合聚合樣式修改

百度地圖提供點聚合的功能,但是聚合之後的樣式不一定會滿足我們的需要: 點聚合會用到百度自己寫的js檔案,分別是MarkerClusterer.js,以及TextIconOverlay.js,其中MarkerClusterer.js是實現點的聚合,TextIconOverla

Android地圖聚合功能

在百度地圖的開發說明中有描述到點聚合功能: 點聚合功能 自v3.6.0版本起,新增點聚合功能,可通過縮小地圖層級,將定義範圍內的多個標註點,聚合顯示成一個標註點,並在MarkerClusterDemo中開放原始碼,方便開發者自行修改。   // 初始化點聚合管理

IOS地圖氣泡內容定義

 最簡單,最直接的方法。。。 自定義一個 UIView 核心程式碼如下: //改變標註圖片和自定義氣泡 -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnno

細讀地圖聚合原始碼(上)

之前在專案中需要用到百度地圖的點聚合,看了百度提供的demo之後,稍微讀了一些原始碼就能達到需求了,所以並未深入解讀原始碼。 最近有空就把百度實現點聚合的原始碼從裡到外仔細研究了一遍受益良多,在此分享一下。 為了方便研究我把百度demo中點聚合相關的類抽出來,新建了個工程,

Android整合地圖聚合

在專案中集成了百度地圖,剛開始Mark點少的時候滑動很流暢,後來將資料匯入有三千多個Mark點,這時候滑動地圖已經卡死了,只能換成點聚合了,先把需要用到的類從百度的示例專案複製到當前專案中, 需要用到如上標註的類,上程式碼: public class BdMapFrag

簡析地圖聚合功能----ClusterManager類

在百度地圖提供的Demo中,已經提供了一個很簡單的點聚合的demo程式,主要用到的類就是ClusterManager<T>用來管理各個Marker的聚合, 另外就添加了一個實現了ClusterItem介面的MyItem,用來管理各個Marker的資料。 dem

iOS開發之地圖大頭針的定義解決方法

方法1 - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>

android實現地圖選覆蓋物(MyLocationOverlay)彈出自定義彈出視窗

一:增加覆蓋物MyLocationOverlay          MyLocationOverlay在普通的Overlay基礎上進行了封裝,可以更好的進行一個定位處理,例如方向。        要想點選MyLocationOverlay觸發一個事件,就需要繼承MyLoc

分享怎麽 定義圖片分享 【原創】

多功能 有道 amp popu har dia 1.0 例如 IV 我們在應用百度分享插件的時候, 默認如果開啟圖片分享的話,連很多小圖標也分享了,實在惱火! 去掉圖片分享吧,分享效果又不好。。。 如何做到自定義圖片分享呢? 就是預先定義tag標簽 例如: "tag":

地圖---亮城市

效果圖 程式碼如下 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Android 地圖如何讓所有的Marker都顯示在螢幕範圍內。

前言:        高德地圖有方法直接呼叫就可以,總結下百度地圖的(直接複製就可以) 程式碼: LatLngBounds.Builder builder = new LatLngBounds.B