百度地图之自定义绘制功能

我们可以在地图上绘制各种自定义的图形,包括点、折线、圆、多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面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配置跟前面一样。

附上图片效果:



原文地址:https://www.cnblogs.com/suncoolcat/p/3310693.html