基於百度地圖API開發問題集合

來源:互聯網
上載者:User

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() {        // ...處理地圖平移結束後的操作}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.