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


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

    附上图片效果:



  • 相关阅读:
    规划支持系统的现状与发展方向
    环境影响评价的概念和指标体系
    DTD to XSD的在线免费转换工具
    如何在64位IIS中启用32位支持
    Entity Framework 1.0中的日期比较
    安装Office 2010 beta后Visual Studio 2008的Web设计器失去响应的问题
    为何由WSDL.exe生成的Web服务代理类无法正确的序列化枚举类型?因为……
    如何为一个XML文件进行DTD验证
    释放VB.NET下Linq to XML的智能提示的威力
    Entity Framework概述 For 终结者
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3310693.html
Copyright © 2020-2023  润新知