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

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

附上图片效果:

来自:http://blog.csdn.net/u010142437/article/details/11422213

时间: 2024-10-24 14:31:07

Android百度地图之自定义绘制功能的相关文章

Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能

转载请标明出处:http://blog.csdn.net/tanzuai/article/details/43835431 目前百度地图SDK所集成的检索服务包括:POI检索.公交信息查询.线路规划.地理编码.在线建议查询.短串分享. 本篇博客将先介绍POI检索和在线建议查询(在地图地位功能基础上实现的,还不知道定位的童靴,请参考Android 百度地图 SDK v3.3.0 (二)--- 地图定位和图层展示) 百度地图SDK提供三种类型的POI检索:周边检索.区域检索和城市内检索.下面将以城市

Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图添加:第一,定位功能:第二,与方向传感器结合,通过旋转手机进行道路的方向确认.有了这两个功能,地图已经可以为我服务了~~~~ 效果图: 好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中. 1.初次启动定位 [java] view plaincopy /** * 定位的客户端 */ private LocationClient mLocationClient; /** * 定位的监听器 */ public MyLoca

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报 登录   注册 www.open-open.com/libOPEN经验 投稿 全部经验分类  Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类  >  开发语言与工具  >  移动开发  

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

Android百度地图结合方向传感器我们自己定位哪里走

Android百度地图结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步修改,有兴趣的同学可以研究下怎么修改的 本篇我们准备为地图添加:第一,定位功能:第二,与方向传感器结合,通过旋转手机进行道路的方向确认.有了这两个功能,地图已经可以为我服务了 @一启动就自动定位了 a,MainActivity 中添加定位代码,定位的监听器MyLocationListener b,封装的方向传感器

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

android 百度地图开发实例(转载)

因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点android 百度地图开发常用的方法. 1初始化 MapManager mBMapMan = new BMapManager(this);boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener()); isSuccess 的值

百度地图上自定义图片覆盖物上加点击事件

在百度地图上加自定义图片覆盖物之后,在这个覆盖物上加点击手势,发现并不识别.原因不太清楚.不过可以通过别的方法来实现这个功能. 需要用到BMKMapViewDelegate中的方法: - (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate 然后判断所点击的坐标是否在指定区域内,在指定区域内之后,调用自己写的相应地方法即可. 百度地图上自定义图片覆盖物上加点击事件,布布扣,

[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

    最近做android百度地图,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--只显示网格而没有显示地图,网络连接和APIKey申请都是正确的,就是不知道为什么不能显示,网上也有很多人遇到这个问题,有的是SDK更新不兼容.而且网上很多百度地图都是使用V2.3.1版本,后来没有办法只有通过baidumapapi_v2_4_1.jar完成显示地图. 其中需要注意的是使用2.3.1时调用manager.init(