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配置跟前面一樣。

附上圖片效果:

d6.png

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM