谷歌地图Api

Android集成谷歌地图

谷歌api:https://developers.google.cn/maps/documentation/android-sdk/intro
集成步骤:
一.在项目的modle的build.gradle中添加依赖如下:

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

二.地图展示
1.xml文件中

<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" />

2.代码中

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

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

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

在地图上添加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的背景图片。

 /**

     * 设置站点包含设备数量

     *

     * @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点样式

mark点点聚合

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

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

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

如以下操作之后,就可以实现地图展示

 if (mClusterManager == null) {

            mClusterManager = new ClusterManager(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);

        }

    }

你可能感兴趣的:(android)