@芋头 发表于 2017-3-31 07:43:16

航拍编程计划:让你的航拍照片变地图(三分之三)

覆盖物的实现

覆盖物
如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。
覆盖物包括:
[*]覆盖物的抽象基类:Overlay(核心类)
[*]文字绘制覆盖物:TextOverlay
[*]分条目覆盖物:ItemizedOverlay
[*]路线规划覆盖物:RouteOverlay
[*]换乘路线覆盖物:TransitOverlay
[*]我的位置覆盖物:MyLocationOverlay1、实现目的:在底图上画一个圆形的几何图形(覆盖物)
实现过程: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.javapackage 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.javapackage 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);
    }
}

耍流氓的小屁孩 发表于 2017-4-1 00:40:39

学习了,以后可能用的上吧。

tjcdq 发表于 2017-4-2 00:07:01

好文章,技术贴。就是不太懂。
页: [1]
查看完整版本: 航拍编程计划:让你的航拍照片变地图(三分之三)