android 地图开发之聚合,定位

这次的demo以高德为例做的地图聚合。相信你们只要懂了原理,其他的地图三方都可以做到。

聚合大概意思就是当地图缩小到里面的marker差不多快重叠的时候,让2个marker变成1个marker。口说无凭,下面看效果图就明白是何意思。
这里写图片描述

首先我们理清思路:
1、我们需要一个装有所有数据的集合,和一个只有当前界面才能看到的数据集合。当然我们肯定只会显示当前界面看到的所以marker。所以这里我们需要监听地图改变时的监听,但我们不可能在改变的过程当中来进行筛选和刷新这样就太浪费资源,所以当地图改变完之后的监听进行这样的操作;
2、我们需要一个自定义的marker来遍历当前界面所看到的所有marker集合。来进行一个聚合。每个marker只能合并一次。所以说假如地图上有3个点,一个点和另一个点聚合了之后就不能在与第三个点聚合了。
3、通过上面的操作我们就可以拿到可见范围内的所有marker集合。那现在就是要把所有marker定在地图上面,通过坐标点。聚合点的位置就是所有聚合marker的位置的中心点。
4、地图上的聚合功能不能有旋转功能,所以我把3d地图的旋转给禁了。

好,下面我们开始贴代码,代码里面的注释很详细。如有疑问可以留言。

首先是调用mapview的主类

package com.wyw.amap;

import java.util.ArrayList;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.OnCameraChangeListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.Projection;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;

import android.app.Activity;
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnCameraChangeListener,
        OnMarkerClickListener, AMapLocationListener {
   
    /**
     * 地图view
     */
    private MapView mapView;
    /**
     * 高德amap
     */
    private AMap aMap;
    /**
     * 定位
     */
    private LocationManagerProxy aMapLocManager = null;
    /**
     * 所有的marker
     */
    private ArrayList<MarkerOptions> markerOptionsListall = new ArrayList<MarkerOptions>();
    /**
     * 视野内的marker
     */
    private ArrayList<MarkerOptions> markerOptionsListInView = new ArrayList<MarkerOptions>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mapView = (MapView) findViewById(R.id.map);
        //因为现在屏幕比较大单手不方便操作,高德我没找到能把 定位自己的按钮放在右下角的方法,所以就模拟一个
        findViewById(R.id.nearby_linear_img_location_bottom_right).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 先销毁定位
                if (aMapLocManager != null) {
                    aMapLocManager.removeUpdates(MainActivity.this);
                    aMapLocManager.destory();
                }
                aMapLocManager = null;
                //再重启定位
                if (aMapLocManager == null) {
                    aMapLocM
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值