1. 程式人生 > >百度地圖:加強篇(覆蓋物的實現)

百度地圖:加強篇(覆蓋物的實現)

覆蓋物
如標註、向量圖形元素(包括:折線和多邊形和圓)、定點陣圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的處理。
覆蓋物包括:

  1. 覆蓋物的抽象基類:Overlay(核心類)
  2. 文字繪製覆蓋物:TextOverlay
  3. 分條目覆蓋物:ItemizedOverlay
  4. 路線規劃覆蓋物:RouteOverlay
  5. 換乘路線覆蓋物:TransitOverlay
  6. 我的位置覆蓋物:MyLocationOverlay

    1、實現目的:在底圖上畫一個圓形的幾何圖形(覆蓋物)
    實現過程:1、建一個基類實現基本的底圖效果,再建一個類實現覆蓋物,當前類繼承基類;2、然後通過
    //①獲取mapView存放覆蓋物的集合
    List overlays = mapView.getOverlays();
    // ②建立自己的overlays資訊並新增集合中
    GraphicsOverlay overlay = new GraphicsOverlay(mapView);
    // 設定幾何圖形
    setData(overlay);
    overlays.add(overlay);
    // ③重新整理mapView的顯示內容
    mapView.refresh();
    3、設定幾何圖形:通過新建一個圖形Graphic(geometry, symbol),裝幾何元素+樣式引數,然後將該圖形新增到圖形的overlay裡面。overlay.setData(graphic);再設定幾何元素和樣式引數。
    4、再設定Manifest.xml的內容即可。
    實現效果:
    這裡寫圖片描述


    GraphicsOverlayDemo.java

package huaxa.it.map;

import java.util.List;

import com.baidu.mapapi.map.Geometry;
import com.baidu.mapapi.map.Graphic;
import com.baidu.mapapi.map.GraphicsOverlay;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.Symbol;

import android.R.color;
import
android.R.drawable; import android.os.Bundle; /** * @專案名: BaiduMap * @包名: huaxa.it.map * @類名: GraphicsOverlayDemo * @建立者: 黃夏蓮 * @建立時間: 2016年12月1日 ,下午6:13:46 * * @描述: TODO */ public class GraphicsOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub
super.onCreate(savedInstanceState); draw(); } /** * 繪製幾何圖形 */ private void draw() { // 覆蓋物操作 // ①獲取存放覆蓋物的集合(MapView) List<Overlay> overlays = mapView.getOverlays(); // ②建立自己的overlays資訊新增集合中 GraphicsOverlay overlay = new GraphicsOverlay(mapView); // 關於幾何圖形設定 setData(overlay); overlays.add(overlay); // ③重新整理mapView的顯示內容 mapView.refresh(); } /** * 幾何圖形設定 * * @param overlay */ private void setData(GraphicsOverlay overlay) { // 繪製圓 /** * setCircle(GeoPoint geoPoint, int radius) 設定圖形為圓 引數: geoPoint地理座標 * radius圓的半徑,單位:米 */ // 幾何元素的定義 // 圓心+半徑 Geometry geometry = new Geometry(); geometry.setCircle(geoPoint, 1000); // 樣式 // 顏色+是否填充+如果不填充,繪製圓的線條的粗細 Symbol symbol = new Symbol(); /** * setSurface * * public void setSurface(Symbol.Color color, int status, int linewidth) * 設定面樣式 引數: color - 顏色 status - 填充狀態,0表示不填充,1表示填充 linewidth - * 線寬,當填充狀態為填充時線寬無意義 */ Symbol.Color color = symbol.new Color(); //指定三色 color.red = 255; color.green = 0; color.blue = 0; color.alpha = 100; symbol.setSurface(color, 1, 0); Graphic graphic = new Graphic(geometry, symbol); overlay.setData(graphic); } }

再設定Manifest.xml的內容即可。

2、實現目的:在底圖上畫一個文字圖形(覆蓋物)
使用到TextOverlay類,其中用到TextItem對文字進行設定。
實現效果:
這裡寫圖片描述
TextOverlayDemo.java

package huaxa.it.map;

import java.util.List;

import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.Symbol;
import com.baidu.mapapi.map.TextItem;
import com.baidu.mapapi.map.TextOverlay;



import android.graphics.Typeface;
import android.os.Bundle;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: TextOverlayDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月1日 ,下午6:13:46
 * 
 * @描述: TODO
 */
public class TextOverlayDemo extends BaseActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        draw();
    }

    /**
     * 繪製文字圖形
     */
    private void draw()
    {
        // 覆蓋物操作
        // ①獲取存放覆蓋物的集合(MapView)
        List<Overlay> overlays = mapView.getOverlays();
        // ②建立自己的overlays資訊新增集合中
        TextOverlay overlay = new TextOverlay(mapView);
        // 關於文字圖形設定
        setData(overlay);
        overlays.add(overlay);
        // ③重新整理mapView的顯示內容
        mapView.refresh();

    }

    /**
     * 文字條目設定
     * 
     * @param overlay
     */
    private void setData(TextOverlay overlay)
    {

        TextItem Item = new TextItem();
        //設定文字格式
        // int align
        // 文字對齊方式 ,為 ALIGN_TOP,ALIGN_CENTER, ALIGN_BOTTOM中的一個值
        // static int ALIGN_BOTTOM
        // 文字對齊引數,下邊中點對齊
        // static int ALIGN_CENTER
        // 文字對齊引數,中心對齊
        // static int ALIGN_TOP
        // 文字對齊引數,上邊中點對齊
        // Symbol.Color bgColor
        // 文字背景色, 預設為透明
        // Symbol.Color fontColor
        // 文字顏色
        // int fontSize
        // 字號大小
        // GeoPoint pt
        // 文字顯示的位置,用經緯度座標表示
        // String text
        // 要顯示的文字內容
        // Typeface typeface
        // 文字字型, android 字體表示,為空則用系統預設字型.
        Item.align = TextItem.ALIGN_TOP; 
        Item.fontColor = getColor();
        Item.fontSize = 20;
        Item.pt = geoPoint;
        Item.text = "廣東工業大學";
        Item.typeface = Typeface.SERIF;
        overlay.addText(Item);

    }

    private Symbol.Color getColor(){
        Symbol symbol = new Symbol();
        Symbol.Color color= symbol.new Color();
        color.alpha=100;
        color.blue=255;
        color.red=0;
        color.green=0;
        return color;

    }

}

3、實現目的:在底圖上畫一個多條目(覆蓋物,如圖示)
實現過程:使用到ItemizedOverlay類
ItemizedOverlay(
getResources().getDrawable(R.drawable.eat_icon), mapView);//第一個引數就是圖片,第二個引數是mapView。
接著對OverlayItem進行設定,然後新增到itemizedOverlay裡面就可以了。另外,可以設定多個條目,直接設定具體座標,並新增到itemizedOverlay裡面。
實現效果
這裡寫圖片描述
ItemizedOverlayDemo.java

package huaxa.it.map;

import java.util.List;

import android.os.Bundle;

import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayItem; 
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: ItemizedOverlayDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月2日 ,上午9:14:17
 * 
 * @描述: 多條目覆蓋物
 */
public class ItemizedOverlayDemo extends BaseActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        controller.setZoom(16);
        draw();
    }

    /**
     * 繪製文字圖形
     */
    private void draw()
    {
        // 覆蓋物操作
        // ①獲取存放覆蓋物的集合(MapView)
        List<Overlay> overlays = mapView.getOverlays();
        // ②建立自己的overlays資訊新增集合中
        ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(
                getResources().getDrawable(R.drawable.eat_icon), mapView);
        setData(overlay);
        overlays.add(overlay);
        // ③重新整理mapView
        mapView.refresh();

    }

    // 設定多條目資料
    private void setData(ItemizedOverlay<OverlayItem> overlay)
    {
        // OverlayItem(GeoPoint point, String title, String snippet)
        // protected GeoPoint mPoint
        // 該item的位置
        // protected String mTitle
        // 該item的標題文字
        // protected String mSnippet
        // 該item的文字片段
        String mSnippet = "該學校是由……";
        OverlayItem Item = new OverlayItem(geoPoint, "廣東工業大學", mSnippet);
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude, longitude+1000), "向東", "增加經度");
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude, longitude-1000), "向西", "減少經度");
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude+1000, longitude-1000), "向西北", "增加緯度,減少經度");
        overlay.addItem(Item);
    }
}

4、實現目的:對上面的多條目進行泡泡顯示
實現過程:1、實現佈局pop.xml;2、實現popView的初始化操作,設定popView不可見,並把popView新增到mapView裡面。3、通過onTap()方法實現點選事件,需要更新mapView(當點選一個Item時,會彈出一個pop視窗),通過mapView.updateViewLayout(popView, params);更新View,而params裡面需要設定pop視窗的位置,所以需要先重新定義params;再設定pop視窗可見,進而設定pop視窗的顯示內容。注意:如果沒有將popView中的TextView在此處例項化,會報空指標異常。
實現效果:
這裡寫圖片描述
pop.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/user_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dip"
        android:layout_weight="1"
        android:background="@drawable/popupmap"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/round"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="2dip"
            android:src="@drawable/round" />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:text="標題"
            android:textSize="20sp" />

        <ImageView
            android:id="@+id/roads"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/roads" />

</LinearLayout>

這裡寫圖片描述
修改java檔案為:

package huaxa.it.map;

import java.util.List;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
 * @專案名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: ItemizedOverlayDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月2日 ,上午9:14:17
 * 
 * @描述: 多條目覆蓋物
 */
public class ItemizedOverlayDemo extends BaseActivity
{
    private TextView    title;
    private View        popView;
    private OverlayItem Item;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        controller.setZoom(17);

        initPop();
        draw();
    }

    // 新增泡泡
    // 點選某個具體的item的時候在其上方顯示

    // 載入pop
    // 新增到mapview中,不用設定座標,pop隱藏
    // 當點選時,顯示泡泡,位置更新

    private void initPop()
    {
        // 初始化popView並且設定相應引數
        popView = View.inflate(getApplicationContext(), R.layout.pop, null);    
        MapView.LayoutParams params = new MapView.LayoutParams(
                MapView.LayoutParams.WRAP_CONTENT,
                MapView.LayoutParams.WRAP_CONTENT, null,
                MapView.LayoutParams.BOTTOM_CENTER);
        mapView.addView(popView, params);
        popView.setVisibility(View.INVISIBLE);// 不可見

    }

    /**
     * 繪製文字圖形
     */
    private void draw()
    {
        // 覆蓋物操作
        // ①獲取存放覆蓋物的集合(MapView)
        List<Overlay> overlays = mapView.getOverlays();
        // ②建立自己的overlays資訊新增集合中
        ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(
                getResources().getDrawable(R.drawable.eat_icon), mapView)
        {
            @Override
            protected boolean onTap(int index)
            {
                OverlayItem item = getItem(index);

                // 更新pop
                MapView.LayoutParams params = new MapView.LayoutParams(
                        MapView.LayoutParams.WRAP_CONTENT,
                        MapView.LayoutParams.WRAP_CONTENT, item.getPoint(),
                        MapView.LayoutParams.BOTTOM_CENTER);

                mapView.updateViewLayout(popView, params);

                popView.setVisibility(View.VISIBLE);
                //務必在這裡例項化TextView空間,否則會報空指標異常。
                title = (TextView) findViewById(R.id.title);
                    title.setText(item.getTitle());
                return super.onTap(index);
            }
        };

        setData(overlay);
        overlays.add(overlay);
        // ③重新整理mapView
        mapView.refresh();

    }

    // 設定多條目資料
    private void setData(ItemizedOverlay<OverlayItem> overlay)
    {
        // OverlayItem(GeoPoint point, String title, String snippet)
        // protected GeoPoint mPoint
        // 該item的位置
        // protected String mTitle
        // 該item的標題文字
        // protected String mSnippet
        // 該item的文字片段
        String mSnippet = "該學校是由……";
        Item = new OverlayItem(geoPoint, "廣東工業大學", mSnippet);
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向東",
                "增加經度");
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude, longitude - 1000), "向西",
                "減少經度");
        overlay.addItem(Item);

        Item = new OverlayItem(new GeoPoint(latitude + 1000, longitude - 1000),
                "向西北", "增加緯度,減少經度");
        overlay.addItem(Item);
    }
}