Android 集成谷歌地图

1、Android集成谷歌地图

项目需求,地图展示,设备点聚合,设备站点,设备过滤等功能。我只针对我涉及到的技术做一下总结,希望能帮到开始接触谷歌地图的伙伴们。

1、集成步骤:

①在项目的modle的build.gradle中添加依赖如下:

implementation 'com.google.android.gms:play-services-maps:12.0.1'

//    地图操作工具类,添加标记等
compile 'com.google.maps.android:android-maps-utils:0.5+'

 2、集成完了后,需要展示地图,这里由于谷歌地图是已经被屏蔽,需要翻墙操作才能展示,项目操作步骤如下:

①首先我们要注册一个谷歌账号

②使用谷歌账号登录谷歌地图开发者平台(登录网站:https://cloud.google.com/maps-platform/?hl=zh-CN),点击控制台,如图

点击控制进入控制台进行如下操作,生成谷歌地图的appkey:

点击API秘钥,生成秘钥,在生成的秘钥界面上我们点击秘钥限制,设置成android ,点击确定就生成了我们所需的appkey。

3、项目需求

1、地图展示

1.地图展示:分为两加载地图,一种是在activity中动态或者是静态加载我们的谷歌地图的fragment,进行显示。首先说一下在activity中静态加载地图的fragment。核心代码如下:

①布局:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.mapwithmarker.MapsMarkerActivity" />

②代码中:

  SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

这样一张谷歌地图就展示出来,显示的原因是通过mapFragment.getMapAsync()方法映射注册回调地图监听(因为谷歌地图被屏蔽了,所以需要翻墙才能看到地图,如果没有翻墙,是空白一片,并且android手机里面必须安装谷歌三件套,否则也不能显示)。

③显示谷歌地图的activity要实现onMapReadyCallBack接口,重写onMapReady(GoogleMap googleMap)方法,在这个方法中我们进行逻辑操作,比如是添加mark点,mark点聚合等。

2、在fragment显示谷歌地图(与activity比较有一些不同点)

①布局中的代码:

 <com.google.android.gms.maps.MapView
        android:layout_marginTop="1dp"
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

②在代码中code如下:

   mMap = (MapView) mView.findViewById(R.id.mapview);
        mMap.onCreate(savedInstanceState);
        mMap.onResume();

        try {
            MapsInitializer.initialize(getActivity());
        } catch (Exception e) {
            e.printStackTrace();
        }

        int errorCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this.getActivity());

        if (ConnectionResult.SUCCESS != errorCode) {
            GooglePlayServicesUtil.getErrorDialog(errorCode,
                    this.getActivity(), 0).show();
        } else {
            mMap.getMapAsync(this);
        }

③其他的步骤和activity相同。需要fragment 实现onMapReadyCallBack接口,重写onMapReady(GoogleMap googleMap)方法,在此方法中进行逻辑操作。

2、在地图上添加mark点

在onMapReady(GoogleMap googleMap)方法中,调用返回的googleMap实例添加mark点。核心代码是

 googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").icon(descriptor));

注释:position:就是mark点的经纬度,title:mark的标题,icon :是mark的背景图片。

下面代码是实现自定义 mark背景图片及颜色设置,文字设置的相应方法,抽离于源码,想详细了解可以查看源码:

  /**
     * 设置站点包含设备数量
     *
     * @param context
     * @return
     */
    private SquareTextView makeSquareTextView(Context context) {
        SquareTextView squareTextView = new SquareTextView(context);
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(-2, -2);
        squareTextView.setLayoutParams(layoutParams);
        squareTextView.setId(amu_text);
        int twelveDpi = (int) (12.0F * this.mDensity);
        squareTextView.setPadding(twelveDpi, twelveDpi, twelveDpi, twelveDpi);
        return squareTextView;
    }

    /**
     * 设置站点图片背景色
     *
     * @return
     */
    private LayerDrawable makeClusterBackground() {
        this.mShapeDrawable = new ShapeDrawable(new RectShape());

        ShapeDrawable outline = new ShapeDrawable(new RectShape());
        outline.getPaint().setColor(-2130706433);
        LayerDrawable background = new LayerDrawable(new Drawable[]{outline, this.mShapeDrawable});
        int strokeWidth = (int) (this.mDensity * 3.0F);
        background.setLayerInset(1, strokeWidth, strokeWidth, strokeWidth, strokeWidth);
        return background;
    }

    /**
     * 获得站点图标需要显示的数字的格式 小于10的后面没有添加+,反之则添加
     *
     * @param bucket
     * @return
     */
    protected String getClusterText(int bucket) {
        return bucket < 9 ? String.valueOf(bucket) : bucket + "+";
    }

    /**
     * 给画笔设置颜色,目的是画mark点圆图片的颜色。
     *
     * @param clusterSize
     * @return
     */
    public int getColors(int clusterSize) {
        float hueRange = 220.0F;
        float sizeRange = 300.0F;
        float size = Math.min((float) clusterSize, 300.0F);
        float hue = (300.0F - size) * (300.0F - size) / 90000.0F * 220.0F;
        return Color.HSVToColor(new float[]{hue, 1.0F, 0.6F});
    }

上述就完成了地图添加mark点,并且可以自定义mark点样式。

3、mark点点聚合

实现点聚合需要借助两个核心类,ClusterItem(聚合条目),ClusterMananger(聚合管理类)

实现步骤是:自己定义一个java类继承ClusterItem,每个人的项目中的mark点信息有可能不同,自己在此java类中定义属性。

使用此java类封装每个mark定数据,并调用ClusterMananger中的addItem(mark)方法,把数据交给ClusterMananager处理,这是使用google地图默认的聚合渲染模式,如果需要定制,需要创建一个java类继承CluseterMananger,进行相应的定制。

代码如下:

 if (mClusterManager == null) {
            mClusterManager = new ClusterManager<MarkItem>(getApplication(), googleMap);
        }
        googleMap.setOnCameraIdleListener(mClusterManager);
        googleMap.setOnMarkerClickListener(mClusterManager);
        mClusterManager.setOnClusterItemClickListener(this);
        mClusterManager.setOnClusterClickListener(this);
        addItems();
........................................................................................

    /**
     * 整合mark点数据
     */
    private void addItems() {
        double lat = 51.5145160;
        double lng = -0.1270060;

        String title = "This is a mark";
        String snippet = "every mark distriub";

        for (int i = 0; i < 10; i++) {
            double offset = i / 360d;
            lat = lat + offset;
            lng = lng + offset;
            MarkItem offsetItem = new MarkItem(lat, lng, title, snippet);
            mClusterManager.addItem(offsetItem);
        }
    }
这样就完成了基本的点聚合。

谢谢浏览

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值