基于百度地图API开发问题集合

1、屏幕坐标转换经纬度

//将像素坐标转为地址坐标
				Projection mProjection = BMapView.getProjection();
				GeoPoint pt = mProjection.fromPixels((int)touchX,(int)touchY);

2、替换搜索结果覆盖物的样式

(1)创建OverItemT,继承ItemizedOverlay<OverlayItem>

import java.util.ArrayList;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.OverlayItem;

public class OverItemT extends ItemizedOverlay<OverlayItem> {
	private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

	//defaultMarker替换百度API中覆盖物样式
	public OverItemT(Drawable defaultMarker) {
		super(boundCenterBottom(defaultMarker));
	}

	@Override
	public int size() {
		return mOverlays.size();
	}

	@Override
	protected OverlayItem createItem(int i) {
		return mOverlays.get(i);
	}

	public void addOverlay(OverlayItem overlay) {
		mOverlays.add(overlay);
		populate(); 
	}

	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		super.draw(canvas, mapView, shadow);
	}

	@Override
	protected boolean onTap(int index) {
		return super.onTap(index);
	}
}

(2)把覆盖物添加到MapView上,用invalidate刷新

OverItemT overlay = new OverItemT(drawable);
					for (int i = 0; i < res.getAllPoi().size(); i++) {
						OverlayItem item = new OverlayItem(res.getPoi(i).pt,
								"站点", "站点信息"); // 点,标题,文字片段。
						overlay.addOverlay(item);
					}
					BMapView.getOverlays().clear();
					BMapView.getOverlays().add(overlay);
					BMapView.invalidate();

3、处理地图长按、轻触、滑动等事件

(1)由于地图上有各种手势事件触发,那么我们会用到GestureDetector来处理这些事情,下面介绍GestureDetector:

GestureDetector里面会实现以下方法:

onSingleTapUp、onShowPress、onScroll、onLongPress、onFling、onDown

这些方法都是由MotionEvent触发的。

onSingleTapUp  用户轻触屏幕后松开,由ACTION_UP触发,事件执行顺序为onDown->onShowPress->onSingleTapUp。

onShowPress 用户轻触屏幕后,没有任何的松动或拖动才会触发,由ACTION_DOWN触发,与onDown的区别是,onDown只要用户触摸触摸屏就会触发,若松动或拖动,就不会触发onShowPress,反之,则触发。

onLongPress  顾名思义,用户长时间触摸屏幕,由ACTION_DOWN触发,事件执行顺序为onDown->onShowPress->onLongPress。

onFling 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发

(2)现在,我们定义一个长按层 LongPressOverlay:

这里需要注意一点,想让自定义的View实现各种手势,需设置onTouchEvent,gestureDetector.onTouchEvent(event);

各个实现方法,由具体需要自己修改即可,这里我处理的是长按事件!

构造方法中的Handler,用途是处理长按以后的事件,把一些覆盖物放置在地图上;我在handler中做的是搜索触摸点1公里范围内的公交站点,并显示在地图上。

import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
import com.buscall.ui.MapSearch;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;

/**
 * @ClassName: LongPressOverlay
 * @Descrioption: 地图长按层
 * @author LiZhen 
 * @date 2012-11-7
 */
public class LongPressOverlay extends Overlay implements OnDoubleTapListener,OnGestureListener{
	private MapSearch mContext;
	private MapView mMapView;
	private Handler mHandler;
	private GestureDetector gestureScanner = new GestureDetector(this);
	public LongPressOverlay(MapSearch context, MapView mapView, Handler handler,MapController mapCtrl){
		mContext = context;
		mMapView = mapView;
		mHandler = handler;
	}
	@Override
	public boolean onTouchEvent(MotionEvent event, MapView mapView) {
		mContext.touchX = event.getX();
		mContext.touchY = event.getY();
		return gestureScanner.onTouchEvent(event);
	}

	@Override
	public boolean onSingleTapConfirmed(MotionEvent e) {
		return false;
	}

	@Override
	public boolean onDoubleTap(MotionEvent e) {
		return false;
	}

	@Override
	public boolean onDoubleTapEvent(MotionEvent e) {
		return false;
	}

	@Override
	public boolean onDown(MotionEvent e) {
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		return false;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		mContext.locPoint = mMapView.getProjection().fromPixels((int) e.getX(),
				(int) e.getY());
		mHandler.sendEmptyMessage(mContext.MSG_VIEW_LONGPRESS);
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		return false;
	}

}

(3)MapActivity中添加长按层和编写Handler

把下面这句话加在onCreate中,

BMapView.getOverlays().add(new LongPressOverlay(MapSearch.this, BMapView, mHandler, mMapController));

在这简单的定义Handler了,如下:

	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息
				System.out.println("附近站点个数:" + overlay.size());
				CircleOverlay circle = new CircleOverlay(pt, MapSearch.this);
				BMapView.getOverlays().clear();
				BMapView.getOverlays().add(overlayRemind);
				BMapView.getOverlays().add(mylocTest);
				BMapView.getOverlays().add(overlay);
				BMapView.getOverlays().add(circle);
				BMapView.getOverlays().add(new LongPressOverlay(MapSearch.this, BMapView, mHandler, mMapController));
				BMapView.invalidate();
				if (c.getCount() > 0)
					BMapView.getController().animateTo(pt);
				break;
			case UPDATEUI:

				break;
			default:
				break;
			}
		}
	};

到这就实现了长按事件!

4、点击OverlayItem,弹出信息层,如上图所示:点击像站牌的小图标,弹出“光华桥西”字样的信息框

(1)要知道,这个点击事件是在ItemizedOverlay类中的onTap(int index),index表示按的是具体哪个OverlayItem,所以处理事件在这里编写;

public class OverItemT extends ItemizedOverlay<OverlayItem> {
	private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
	private MapSearch mContext;
	
	//defaultMarker替换百度API中覆盖物样式
	public OverItemT(Drawable defaultMarker , Context context) {
		super(boundCenterBottom(defaultMarker));
		this.mContext = (MapSearch) context;
	}
	@Override
	public int size() {
		return mOverlays.size();
	}

	@Override
	protected OverlayItem createItem(int i) {
		return mOverlays.get(i);
	}

	public void addOverlay(OverlayItem overlay) {
		mOverlays.add(overlay);
		populate(); 
	}

	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		super.draw(canvas, mapView, shadow);
	}

	@Override
	protected boolean onTap(int index) {
		return super.onTap(index);
	}
}
(2)编写popView.xml,样式如下:

关于上面显示的每个item信息从何而来呢?

注意OverlayItem的构造方法:

OverlayItem(GeoPoint point, java.lang.String title, java.lang.String snippet)

参数分别代表 点、标题、文字,我们可以把item的信息存储在这里。

只需设置popView的显示与隐藏,就可以实现效果

这样我们就做好了弹出信息框。


5、搜索sqlite数据库中,范围1公里的公交站点

经度0.0009代表100米

纬度0.0012代表100米

sql语句为:select * from  api_station where ((abs(XCoord-?)/0.0012)*(abs(XCoord-?)/0.0012) + (abs(YCoord-?)/0.0009)*(abs(YCoord-?)/0.0009))<100;

没有找到sqlite中平方用什么方法,只好上面这么写了。

6、真实经纬度数据转化成百度地图的经纬度数据,标识在地图上

将其他坐标系转换到百度坐标系,自V1.1版本之后提供

:com.baidu.mapapi

类:CoordinateConvert


接口摘要说明:

接口

摘要

fromWgs84ToBaidu()

从gps坐标系或mapbar坐标系转换到百度坐标系,

返回结果为经过Base64加密之后字符串

fromGcjToBaidu()

从google坐标系、51地图坐标系、mapcabc坐标系转换到百度坐标系(51地图坐标需要先除10000),

返回结果为经过Base64加密之后的字符串

bundleDecode()

加密bundle到坐标的转换函数

详细说明:

fromWgs84ToBaidu

static public Bundle fromWgs84ToBaidu(GeoPoint ptWgs84)

从gps坐标系或mapbar坐标系转换到百度坐标系.

参数:

ptWgs84- gps坐标或mapbar坐标

返回:

返回bundle,内含x,y两个字段。均为经过Base64加密之后的字符串,可调用bundleDecode()函数进行解析

fromGcjToBaidu

static public Bundle fromGcjToBaidu (GeoPoint ptGcj)

从google坐标系、51地图坐标系、mapabc坐标系转换到百度坐标系.51地图坐标需要先除10000

参数:

ptGcj- google坐标或mapabc坐标或51地图坐标(51地图坐标需要先除10000)

返回:

返回bundle,内含x,y两个字段。均为经过Base64加密之后的字符串,可调用bundleDecode()函数进行解析

bundleDecode

static public GeoPoint bundleDecode(Bundle encryptBundle)

将加密之后的坐标bundle进行解析

参数:

encryptBundle – 加密后的坐标bundle

返回:

返回GeoPoint结构,内含解析之后的x,y坐标

限制

该类提供的转换函数仅供获得授权后的厂商或开发者使用,禁止在公共网站,论坛或其他公共场合进行公布或宣传。

例如:

        CoordinateConvert coordinateConvert = new CoordinateConvert();
	Bundle bundle = coordinateConvert.fromWgs84ToBaidu(gp);
	int x = coordinateConvert.bundleDecode(bundle).getLatitudeE6();
	int y = coordinateConvert.bundleDecode(bundle).getLongitudeE6();
	System.out.println(x+" , "+y);

7、捕获百度地图平移结束事件

MapView.regMapViewListener(BMapManager, new mMKMapViewListener());

class mMKMapViewListener implements MKMapViewListener{
	@Override
	public void onMapMoveFinish() {
        // ...处理地图平移结束后的操作
	}	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值