您的位置:首页 > 其它

使用百度地图api实现定位及选择位置功能

2016-05-19 22:06 621 查看
之前使用过一些第三方的地图api,最后还是觉得百度的比较好用,刚好最近做一个项目,需要用到地图的功能,也比较简单,就是获取当前位置,然后可以自己手动在地图上选择位置,把经纬度丢给服务端。我用的就是百度地图

下面就开始做了,注册开发者账号、申请key、下载SDK什么的,就不说了,官网上说的很清楚。就直接贴代码了:

我先建了一个类,继承Application,里面就一行代码,初始化地图。

[java] view
plain copy

 





public class LocationApp extends Application {  

  

    @Override  

    public void onCreate() {  

        super.onCreate();  

        SDKInitializer.initialize(getApplicationContext());  

    }  

      

}  

为什么地图初始化的方法要写这里,因为文档里做了说明:



然后就是主类了,里面我先贴一部分代码,完整的之后在文章最后面有下载链接。

首先要在main.xml里面把地图的控件给加上:

[html] view
plain copy

 





<com.baidu.mapapi.map.MapView    

        android:id="@+id/bmapView"    

        android:layout_width="match_parent"    

        android:layout_height="match_parent"    

        android:clickable="true" />  

然后在Main.java中,对这个控件进行一些初始化,就可以展示一张最基本的地图了。

[java] view
plain copy

 





private MapView mapView;  

private BaiduMap baiduMap;  

[java] view
plain copy

 





mapView = (MapView) findViewById(R.id.bmapView);  

baiduMap = mapView.getMap();  

baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));//地图缩放级别为17  

就这样就可以了,运行的话,应该就可以看到位置在北京的地图。

当然这只是最简单了,还要有定位的功能,定位出来后,要在地图上把这个点标出来,然后把地图移动到这个点的位置。

[java] view
plain copy

 





private LocationClient locationClient;  

private BDLocationListener listener = new MyLocationListener();  

[java] view
plain copy

 





locationClient = new LocationClient(getApplicationContext());  

locationClient.registerLocationListener(listener);  

initLocation();  

[java] view
plain copy

 





// 初始化定位参数  

private void initLocation(){  

        LocationClientOption option = new LocationClientOption();  

        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  

        int span=1000;  

        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  

        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  

        option.setOpenGps(true);//可选,默认false,设置是否使用gps  

        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  

        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果  

        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果  

        option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死  

        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  

        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  

        locationClient.setLocOption(option);  

        locationClient.start();  

    }  

[java] view
plain copy

 





// 定位监听  

public class MyLocationListener implements BDLocationListener {  

  

    @Override  

    public void onReceiveLocation(BDLocation loc) {  

        if (loc != null && (loc.getLocType() == 161 || loc.getLocType() == 66)) {  

            //这里得到BDLocation就是定位出来的信息了  

        } else {  

            Toast.makeText(MainActivity.this, "定位失败,请检查手机网络或设置!", Toast.LENGTH_LONG).show();  

        }  

    }  

          

}  

上面的这些代码,就是定位的代码了,在MyLocationListener里面,BDLocation有值的话,就说明定位成功了。下面附上BDLocation的说明,想得到什么信息,都可以去得到:

内容就不贴了,太长了,直接给个网站,打开就可以了:百度API

既然定位的信息得到了,就要在地图上添加个标注,显示当前位置:

[java] view
plain copy

 





LatLng point = new LatLng(location.getLatitude(), location.getLongitude());  

setMapOverlay(point);  

baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));  

[java] view
plain copy

 





// 在地图上添加标注  

private void setMapOverlay(LatLng point) {  

    latitude = point.latitude;  

    longitude = point.longitude;  

          

    baiduMap.clear();  

    BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_mark);  

    OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);  

    baiduMap.addOverlay(option);  

}  

这样就可以了,显示的结果就是下面这样的:



这样就满足了第一个需求,就是获取当前位置,并在地图上显示出来。第二个需求就是要能自己在地图上选点,比如现在自动定的位置,不想让服务端知道在这里,要换一个,就可以把地图拖动到其他地方,选择自己想要的位置,点一下,就可以了。

这个功能实现起来也比较简单,给地图添加一个OnMapClickListener点击事件就可以了:

[java] view
plain copy

 





baiduMap.setOnMapClickListener(new OnMapClickListener() {  

              

        @Override  

        public boolean onMapPoiClick(MapPoi poi) {  

                  

            return false;  

        }  

              

        @Override  

        public void onMapClick(LatLng point) {  

            Log.d("map click", point.longitude+","+point.latitude);  

            setMapOverlay(point);  

            getInfoFromLAL(point);  

        }  

});  

[java] view
plain copy

 





// 根据经纬度查询位置  

    private void getInfoFromLAL(final LatLng point) {  

        pb.setVisibility(View.VISIBLE);  

        infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6);  

        GeoCoder gc = GeoCoder.newInstance();  

        gc.reverseGeoCode(new ReverseGeoCodeOption().location(point));  

        gc.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {  

              

            @Override  

            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  

                pb.setVisibility(View.GONE);  

                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  

                    Log.e("发起反地理编码请求", "未能找到结果");  

                } else {  

                    infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6  

                            +"\n"+result.getAddress());  

                }  

            }  

              

            @Override  

            public void onGetGeoCodeResult(GeoCodeResult result) {  

                  

            }  

        });  

    }  

这样就OK了。选择其他地方的一个点,就可以得到该点的位置了:



完事了,功能比较简单,附上源码下载地址:csdn下载

项目放到eclipse中后,一定要在AndroidManifest.xml中把自己申请的key加上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: