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

jopen 10年前

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

附上图片效果:

d6.png

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