基于百度地图API开发问题集合
来源:互联网 发布:通达信sar指标源码 编辑:程序博客网 时间:2024/06/06 12:50
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));}@Overridepublic int size() {return mOverlays.size();}@Overrideprotected OverlayItem createItem(int i) {return mOverlays.get(i);}public void addOverlay(OverlayItem overlay) {mOverlays.add(overlay);populate(); }@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);}@Overrideprotected 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;}@Overridepublic boolean onTouchEvent(MotionEvent event, MapView mapView) {mContext.touchX = event.getX();mContext.touchY = event.getY();return gestureScanner.onTouchEvent(event);}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {return false;}@Overridepublic boolean onDoubleTap(MotionEvent e) {return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {return false;}@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {mContext.locPoint = mMapView.getProjection().fromPixels((int) e.getX(),(int) e.getY());mHandler.sendEmptyMessage(mContext.MSG_VIEW_LONGPRESS);}@Overridepublic 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() {@Overridepublic 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;}@Overridepublic int size() {return mOverlays.size();}@Overrideprotected OverlayItem createItem(int i) {return mOverlays.get(i);}public void addOverlay(OverlayItem overlay) {mOverlays.add(overlay);populate(); }@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);}@Overrideprotected 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{@Overridepublic void onMapMoveFinish() { // ...处理地图平移结束后的操作}}
- 基于百度地图API开发问题集合
- 基于百度地图API的开发
- 百度地图API开发
- 百度地图开发API
- android 基于百度地图api开发定位以及获取详细地址
- android 基于百度地图api开发定位以及获取详细地址
- android 基于百度地图api开发定位以及获取详细地址
- 基于百度地图API的WinForm地图
- 百度地图API开发指南
- IOS开发百度地图API
- 百度地图API开发指南
- iOS 开发-百度地图API
- IOS开发百度地图API
- 百度地图API开发概述
- 百度地图API开发应用
- 百度地图API -- 开发总结
- 百度的地图开发API
- 百度地图API开发指南
- Android基础教程之----简单拨打电话程序!!!
- 从事前端开发必须要了解的CSS原理
- 云计算时代的运维职位展望
- Android 基础教程之---动态更改屏幕方向的简单例子(LANDSCAPE与PORTRAIT)!
- 关于ARM 协处理器与MMU的两篇文章
- 基于百度地图API开发问题集合
- 查看进程打开的文件
- Android基础教程之-----访Iphone 拖动相片特效Gallery的简单应用.
- tickcount
- Matlab 中输入希腊字母
- 方便地创建Mac App的iconset(附转换脚本)
- Android架构---学东西还是从高处看才能学得远!!
- 迷茫通向光明的路
- 隐藏Windows登录界面中的用户