我们可以在地图上绘制各种自定义的图形,包括点、折线、圆、多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面GPS定位功能可以做出一些非常有意思的应用,下面应用百度Demo实现绘制的基本功能,代码如下:
Activity:
package com.home; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.baidu.mapapi.map.Geometry; import com.baidu.mapapi.map.Graphic; import com.baidu.mapapi.map.GraphicsOverlay; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Symbol; import com.baidu.mapapi.map.TextItem; import com.baidu.mapapi.map.TextOverlay; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * 此demo用来展示如何在地图上用GraphicsOverlay添加点、线、多边形、圆 同时展示如何在地图上用TextOverlay添加文字 * */ public class GeometryActivity extends Activity implements OnClickListener { // 地图相关 private MapView mMapView = null; private Button resetBtn = null; private Button clearBtn = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_geometry); CharSequence titleLable = "自定义绘制功能"; setTitle(titleLable); // 初始化地图 mMapView = (MapView) findViewById(R.id.bmapView); mMapView.getController().setZoom(12.5f); mMapView.getController().enableClick(true); // UI初始化 clearBtn = (Button) findViewById(R.id.btn_clear); resetBtn = (Button) findViewById(R.id.btn_reset); clearBtn.setOnClickListener(this); resetBtn.setOnClickListener(this); resetBtn.setEnabled(false); // 界面加载时添加绘制图层 addCustomElementsDemo(); } @Override public void onClick(View v) { if (v == clearBtn) { clearClick(); clearBtn.setEnabled(false); resetBtn.setEnabled(true); } if (v == resetBtn) { resetClick(); clearBtn.setEnabled(true); resetBtn.setEnabled(false); } } /** * 清除所有图层 */ public void clearClick() { mMapView.getOverlays().clear(); } /** * 添加绘制元素 */ public void resetClick() { addCustomElementsDemo(); } /** * 添加点、线、多边形、圆、文字 */ public void addCustomElementsDemo() { GraphicsOverlay graphicsOverlay = new GraphicsOverlay(mMapView); mMapView.getOverlays().add(graphicsOverlay); // 添加点 graphicsOverlay.setData(drawPoint()); // 添加折线 graphicsOverlay.setData(drawLine()); // 添加多边形 graphicsOverlay.setData(drawPolygon()); // 添加圆 graphicsOverlay.setData(drawCircle()); // 绘制文字 TextOverlay textOverlay = new TextOverlay(mMapView); mMapView.getOverlays().add(textOverlay); textOverlay.addText(drawText()); // 执行地图刷新使生效 mMapView.refresh(); } /** * 绘制折线,该折线状态随地图状态变化 * * @return 折线对象 */ public Graphic drawLine() { double mLat = 39.97923; double mLon = 116.357428; int lat = (int) (mLat * 1E6); int lon = (int) (mLon * 1E6); GeoPoint pt1 = new GeoPoint(lat, lon); mLat = 39.94923; mLon = 116.397428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt2 = new GeoPoint(lat, lon); mLat = 39.97923; mLon = 116.437428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt3 = new GeoPoint(lat, lon); // 构建线 Geometry lineGeometry = new Geometry(); // 设定折线点坐标 GeoPoint[] linePoints = new GeoPoint[3]; linePoints[0] = pt1; linePoints[1] = pt2; linePoints[2] = pt3; lineGeometry.setPolyLine(linePoints); // 设定样式 Symbol lineSymbol = new Symbol(); Symbol.Color lineColor = lineSymbol.new Color(); lineColor.red = 255; lineColor.green = 0; lineColor.blue = 0; lineColor.alpha = 255; lineSymbol.setLineSymbol(lineColor, 10); // 生成Graphic对象 Graphic lineGraphic = new Graphic(lineGeometry, lineSymbol); return lineGraphic; } /** * 绘制多边形,该多边形随地图状态变化 * * @return 多边形对象 */ public Graphic drawPolygon() { double mLat = 39.93923; double mLon = 116.357428; int lat = (int) (mLat * 1E6); int lon = (int) (mLon * 1E6); GeoPoint pt1 = new GeoPoint(lat, lon); mLat = 39.91923; mLon = 116.327428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt2 = new GeoPoint(lat, lon); mLat = 39.89923; mLon = 116.347428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt3 = new GeoPoint(lat, lon); mLat = 39.89923; mLon = 116.367428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt4 = new GeoPoint(lat, lon); mLat = 39.91923; mLon = 116.387428; lat = (int) (mLat * 1E6); lon = (int) (mLon * 1E6); GeoPoint pt5 = new GeoPoint(lat, lon); // 构建多边形 Geometry polygonGeometry = new Geometry(); // 设置多边形坐标 GeoPoint[] polygonPoints = new GeoPoint[5]; polygonPoints[0] = pt1; polygonPoints[1] = pt2; polygonPoints[2] = pt3; polygonPoints[3] = pt4; polygonPoints[4] = pt5; polygonGeometry.setPolygon(polygonPoints); // 设置多边形样式 Symbol polygonSymbol = new Symbol(); Symbol.Color polygonColor = polygonSymbol.new Color(); polygonColor.red = 0; polygonColor.green = 0; polygonColor.blue = 255; polygonColor.alpha = 126; polygonSymbol.setSurface(polygonColor, 1, 5); // 生成Graphic对象 Graphic polygonGraphic = new Graphic(polygonGeometry, polygonSymbol); return polygonGraphic; } /** * 绘制单点,该点状态不随地图状态变化而变化 * * @return 点对象 */ public Graphic drawPoint() { double mLat = 39.98923; double mLon = 116.397428; int lat = (int) (mLat * 1E6); int lon = (int) (mLon * 1E6); GeoPoint pt1 = new GeoPoint(lat, lon); // 构建点 Geometry pointGeometry = new Geometry(); // 设置坐标 pointGeometry.setPoint(pt1, 10); // 设定样式 Symbol pointSymbol = new Symbol(); Symbol.Color pointColor = pointSymbol.new Color(); pointColor.red = 0; pointColor.green = 126; pointColor.blue = 255; pointColor.alpha = 255; pointSymbol.setPointSymbol(pointColor); // 生成Graphic对象 Graphic pointGraphic = new Graphic(pointGeometry, pointSymbol); return pointGraphic; } /** * 绘制圆,该圆随地图状态变化 * * @return 圆对象 */ public Graphic drawCircle() { double mLat = 39.90923; double mLon = 116.447428; int lat = (int) (mLat * 1E6); int lon = (int) (mLon * 1E6); GeoPoint pt1 = new GeoPoint(lat, lon); // 构建圆 Geometry circleGeometry = new Geometry(); // 设置圆中心点坐标和半径 circleGeometry.setCircle(pt1, 2500); // 设置样式 Symbol circleSymbol = new Symbol(); Symbol.Color circleColor = circleSymbol.new Color(); circleColor.red = 0; circleColor.green = 255; circleColor.blue = 0; circleColor.alpha = 126; circleSymbol.setSurface(circleColor, 1, 3); // 生成Graphic对象 Graphic circleGraphic = new Graphic(circleGeometry, circleSymbol); return circleGraphic; } /** * 绘制文字,该文字随地图变化有透视效果 * * @return 文字对象 */ public TextItem drawText() { double mLat = 39.86923; double mLon = 116.397428; int lat = (int) (mLat * 1E6); int lon = (int) (mLon * 1E6); // 构建文字 TextItem item = new TextItem(); // 设置文字位置 item.pt = new GeoPoint(lat, lon); // 设置文件内容 item.text = "百度地图SDK"; // 设文字大小 item.fontSize = 40; Symbol symbol = new Symbol(); Symbol.Color bgColor = symbol.new Color(); // 设置文字背景色 bgColor.red = 0; bgColor.blue = 0; bgColor.green = 255; bgColor.alpha = 50; Symbol.Color fontColor = symbol.new Color(); // 设置文字着色 fontColor.alpha = 255; fontColor.red = 0; fontColor.green = 0; fontColor.blue = 255; // 设置对齐方式 item.align = TextItem.ALIGN_CENTER; // 设置文字颜色和背景颜色 item.fontColor = fontColor; item.bgColor = bgColor; return item; } @Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { mMapView.destroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } }
布局XMl:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_clear" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="1.0" android:background="@drawable/button_style" android:text="清除(clear)" /> <Button android:id="@+id/btn_reset" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="1.0" android:background="@drawable/button_style" android:text="重置(reset)" /> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>
Manifest配置跟前面一样。
附上图片效果: