航拍编程计划:让你的航拍照片变地图(三分之三)
覆盖物的实现覆盖物
如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。
覆盖物包括:
[*]覆盖物的抽象基类: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);
}
}
学习了,以后可能用的上吧。 好文章,技术贴。就是不太懂。
页:
[1]