上篇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();//重新加载所有图块儿,用于更新