Google地图开发中级篇

上篇google地图初级篇我们讲解了如何创建地图,创建不同类型的地图或者是精简模式,然后做一些基本配置,使用哪些控件,写一些基本的监听,另外就是摄像机的移动

 

这篇文章你将学到

1.   在地图上添加标记

2.   定义标记的信息窗口

3.   底面叠层和图块叠层是什么,如何添加它们到地图上

注:文章中的mMap对象就是onMapReady监听返回的GoogleMap对象

 

一.      在地图上绘制标记

有两个相关对象,一个是Marker,一个是MarkerOptions,

生成的marker默认是不可移动的

以下代码告诉你如何添加一个一个marker并获得marker

LatLng sydney2 = new LatLng(-34, 140);//纬度和经度

       MarkerOptions markerOptions = new MarkerOptions();//创建标记设置对象

       markerOptions.draggable(true).title("wahaha").position(sydney2);//设置draggle可拖动,默认为不可拖动,设置后,长按可拖动

       //markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.mymarker2));//设置自定义的标记图标

       markerOptions.snippet("context");//设置标题下的内容

      //markerOptions.anchor(0.5f,0.5f);//设置标记锚点,锚点就是图标围绕旋转的中心,这里设置的是以图标自身中心为锚点

     //markerOptions.rotation(90f);//设置标记旋转,即平面视图上顺时针转动90度

       Marker marker = mMap.addMarker(markerOptions);//会返回一个marker对象

       marker.showInfoWindow();//让信息窗口直接显示出来,不用点击标记才显示

       //marker.hideInfoWindow();//信息窗口隐藏,默认就是隐藏的

 

PS:这里补充一下,BitmapDescriptorFactory获取图片的方法有哪些,

 

·fromAsset(StringassetName)使用资源目录中的图像创建自定义标记。

fromBitmap (Bitmap image) 使用位图图像创建自定义标记。

fromFile (String path)使用指定路径处的文件创建自定义图标。

fromResource (int resourceId)使用现有资源创建自定义标记。

 

二.   标记上方的信息窗口

信息窗口就是点击标记弹出的小窗口,地图上只能同时显示一个信息窗口,如果想要同时显示多个,可利用标记的显示的多个性,定制标记来达到想同时显示多个信息的目的。这个需要去github上设置google的一个库做为依赖或者你直接去download源码

 

三.   添加形状

添加各种形状的代码如下

//定制样式的多段线(可用于设置不同颜色的路线)

 

       Polyline line = mMap.addPolyline(new PolylineOptions()

                .add(new LatLng(-37.81319,144.96298), new LatLng(-31.95285, 115.85734))

                .width(10)//单位是px

                .color(Color.BLUE)

                .visible(true)

                .zIndex(1)//绘制的优先级,默认为0,高优先绘制在低优先级形状之上

                .geodesic(true));//设置测地线段,为true,线段会根据地球表面产生一定的弯曲

//       line.getColor();//获取颜色

//        line.setColor(Color.GREEN);//设置颜色

//       line.setWidth(20);//设置宽度

//       line.getWidth();//获得宽度

//       line.isGeodesic();//获取是否是测地线段

//       line.setGeodesic(false);//设置非测地线段

//       line.getZIndex();//获取优先级

//       line.setZIndex(0);//设置优先级

//            visible属性同上

 

 

       //这也是个多边形,多边形的最后一个点会自动连到第一个点,所以无需在最后写出第一个点

       Polygon polygon2 = mMap.addPolygon(new PolygonOptions()

                .add(new LatLng(0, 0), newLatLng(0, 5), new LatLng(3, 5))

                .strokeColor(Color.RED)

                .strokeWidth(5)//单位是px

                .geodesic(true)//设置测地线段,为true,线段会根据地球表面产生一定的弯曲

                .zIndex(3)//绘制的优先级,默认为0,高优先绘制在低优先级形状之上

                .visible(true)

                .fillColor(Color.TRANSPARENT));

//       polygon2.getFillColor();//获得填充色

//       polygon2.setFillColor(Color.GREEN);//设置颜色

//       polygon2.setStrokeWidth(3);//设置宽度

//       polygon2.getStrokeWidth();//获取宽度

//       polygon2.isGeodesic();//获取是不是测地形状

//       polygon2.setGeodesic(false);//设置非测地形状

//       polygon2.getZIndex();//获取优先级

//       polygon2.setZIndex(4);//设置优先级

       //visible属性同上

 

//圆形

       CircleOptions circleOptions = new CircleOptions()

                .center(new LatLng(37.4,-122.1))

                .radius(1000) // In meters

                .fillColor(Color.BLUE)

                .strokeWidth(2)

                .strokeColor(Color.GREEN)

                .zIndex(10);

       Circle circle = mMap.addCircle(circleOptions);

       //获取圆形对象后,设置他的属性和其他形状类似,自己推导

 

 

1.多边形自动完成,即你不用设置最后一个坐标为你的起点坐标

2.zIndex设置优先级对形状,底面叠层以及图块叠层都有效果

  

 

 

四.   底面叠层

底面叠层是固定在地图上的图像,这个图象不会覆盖地图上的文字,道路名。旋转、倾斜或缩放地图将会改变图像的朝向。如果您想将单个图像固定在地图上的某一区域,便可使用底面叠层。

注:向地图添加图像后,将被转换成边为 2 的次方的图像。 您可以通过使用尺寸为 2 的次方(例如 128x512 或 1024x1024)的原始图像来避免这种转换。

 

//底面叠层,使用LatLng定位图象

        GroundOverlayOptions newarkMap = newGroundOverlayOptions()

               .image(BitmapDescriptorFactory.fromResource(R.drawable.horse))

                .position(sydney, 860000f,650000f);//单位,米

        GroundOverlay imageOverlay =mMap.addGroundOverlay(newarkMap);

       // imageOverlay.remove();//移除底面叠层

       //imageOverlay.setImage(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));//setImage()方法将用另一幅相同尺寸的图像替换现有图像。

    

五.   图块叠层

TileOverlay 定义的是在基础地图图块之上添加的图像集。您还可以通过提供透明图块图像利用图块叠层为地图添加附加功能。您需要为您想支持的每个缩放比例提供图块。如果您在多个缩放比例都有足够的图块,便可为整个地图补充 Google 的地图数据。

实际上google地图就是由很多方格组成的,这些方格的机制可类比图块叠层,当缩放比例为1时,地图就有2*2个方格(横向纵向都是2的1次方),缩放比例为3时,横向纵向都是2的3次方,即8*8个方格,其他依次类推。我们在放大地图时会发现,放大一个级别时,地图每个方格就会变化图集。图块叠层也是这样,所以你需要在用户每放大或缩小级别时,用你的准备好的图片去替换。

由于我这里没有自己的服务端,我找的网上一张图片,作为我的图块叠层,下方代码将会在你将地图放大到 [12,16] 的时候显示图块叠层,因为我这里只有一张图片,无论在范围内如何缩放,图块还是那张图。(图块叠层显示在地图上方,没有替代原地图,只是遮住了,路径名,地点名还是会显示

 

为图块层创建图像时,您需要为您想支持的每个缩放比例下的每个图块都创建一幅图像。Google 地图以 256dp(设备无关像素)为目标显示图块。对于高分辨率设备,建议返回高 dpi 图块(512x512 像素)。

 

//图块叠层

        TileProvidertileProvider = new UrlTileProvider(256, 256) {

            @Override

            public URLgetTileUrl(int x, int y, int zoom) {

 

    /* Define the URL patternfor the tile images */

                String s =String.format("http://imgm.ph.126.net/tYduyA328I_0mtjen_-6RQ==/6608847735213515212.png",

                        zoom,x, y);

 

                if(!checkTileExists(x, y, zoom)) {

                    returnnull;

                }

 

                try {

                    return newURL(s);

                } catch(MalformedURLException e) {

                    throw newAssertionError(e);

                }

            }

 

            /*

             * Check that thetile server supports the requested x, y and zoom.

             * Complete thisstub according to the tile range you support.

             * If you supporta limited range of tiles at different zoom levels, then you

             * need to definethe supported x, y range at each zoom level.

             */

            private booleancheckTileExists(int x, int y, int zoom) {

                int minZoom =12;//显示图块叠层的范围是12-16的放大系数

                int maxZoom =16;

 

                if ((zoom <minZoom || zoom > maxZoom)) {

                    return false;

                }

 

                return true;

            }

        };

 

        TileOverlaytileOverlay = mMap.addTileOverlay(new TileOverlayOptions()

               .tileProvider(tileProvider)

                .zIndex(0));

       tileOverlay.remove();//删除图块儿

//       tileOverlay.clearTileCache();//重新加载所有图块儿,用于更新

你可能感兴趣的:(移动,应用,谷歌,地图,谷歌地图)