通过手指点击屏幕从而获取所点击点的地理坐标是一个在实际应用中较为常见的功能。下面,我将为大家介绍如何实现此功能。
基本原理:通过点击获取屏幕坐标,利用坐标转换的接口,把屏幕坐标转换为地理坐标。
有了以上的基本原理,我们就可以去具体实现了,步骤如下:
第一步,集成MapView,重写onTouchEvent方法。代码如下:
public class MyMapView extends MapView { public interface MapSelPointHandler{ void onClickPoint(GeoPoint point); } private MapSelPointHandler handler; public void setMapSelPointHandler(MapSelPointHandler handler){ this.handler = handler; } public MyMapView(Context context) { super(context); } public MyMapView(Context context, AttributeSet set) { super(context, set); } public MyMapView(Context context, AttributeSet set, int i) { super(context, set, i); } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_UP: int x = (int) event.getX(); int y = (int) event.getY(); GeoPoint geoPoint = this.getProjection().fromPixels(x, y); int xx = geoPoint.getLongitudeE6(); int yy = geoPoint.getLatitudeE6(); if(handler!=null)handler.onClickPoint(geoPoint); break; } return super.onTouchEvent(event); }}
第二步,在布局文件中添加上一步自己定义的MapView。代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical" > <com.xxx.MyMapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/button1" android:clickable="true" /></LinearLayout>
第三步,在主类中定义并初始化MyMapView对象,运行程序,点击屏幕就可以获取点击点的地理坐标了。
public class MapSelActivity extends Activity { private MyMapView mapView; private MapController mMapController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MondeTaoApplication app = (MondeTaoApplication) this.getApplication(); if (app.mBMapManager == null) { app.mBMapManager = new BMapManager(this); app.mBMapManager.init(MondeTaoApplication.strKey, new MondeTaoApplication.MyGeneralListener()); } setContentView(R.layout.map_sel); mapView = (MyMapView) findViewById(R.id.mapView); mapView.setMapSelPointHandler(new MapSelPointHandler() { @Override public void onClickPoint(GeoPoint point) { //这里是点的点儿 Log.d("******", "lat:"+(point.getLatitudeE6()/1E6)); Log.d("******", "lng:"+(point.getLongitudeE6()/1E6)); } }); mMapController = mapView.getController(); GeoPoint point = new GeoPoint((int) (39.963175 * 1E6), (int) (116.400244 * 1E6)); // 设置地图的中心 mMapController.setCenter(point); // 设置地图默认的缩放级别 mMapController.setZoom(16); }}
注意事项:
1 在自定义并继承MapView的时候需要注意几个几个构造方法,特别是public MyMapView(Context context, AttributeSet set),一定要有,不然会报错。
2 布局文件添加的MapView不再是我们百度为大家提供的MapView,应该添加自定义的那个MyMapView(否则有什么意义呢?)。
3 在使用setContentView方法之前一定要先初始化BMapManager,否则会报错,这个在官方开发指南及本博客的相关章节都有强调,可是还有很多不细心的开发者犯这个小错误。
最后希望通过我们大家共同的努力使百度地图SDK越来越好!