百度地图 Android SDK - 标注(Marker)的基本使用

url = http://blog.csdn.net/callmesen/article/details/40540895

标注(Marker)是开发者最常使用的地图覆盖物志一,今天就来向大家介绍一些标注(Marker)的最基本使用方法!

实现目标:

1、构建基础地图页面;

2、在地图的中心点处添加 Marker;

3、实现 Marker 的点击事件响应;

4、实现 Marker 的添加和灵活删除;

为了实现以上目标,我们会分成以下若干步骤来进行。

第一步、创建工程,导入百度地图 Android SDK;

具体创建工程的方式(略)。本示例主要是为了实现地图及相关的覆盖物功能,因此这里我只使用 SDK 开发资源下载平台所提供的【基础地图】功能模块即可。

相应下载地址为:http://lbsyun.baidu.com/sdk/download

勾选如图所示:

选择完成后,点击开发包下载,将所下载开发包正确导入开发工程。


第二步、申请开发者秘钥;

工程创建完成后,到 API 控制台,申请相应的开发秘钥,为具体开发工作准备。

具体申请方式及注意事项,请参考:http://blog.csdn.net/callmesen/article/details/39523767  此处不再赘述。


第三步、修改 AndroidManifest 文件,添加开发秘钥和所需权限;

在 AndroidManifest 文件中,添加开发秘钥和所需权限。

添加开发秘钥方式如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <meta-data    
  2.     android:name="com.baidu.lbsapi.API_KEY"  
  3.     android:value="开发秘钥!" />  
注意在 application 里面。

添加所需权限如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.GET_ACCOUNTS" />    
  2. <uses-permission android:name="android.permission.USE_CREDENTIALS" />    
  3. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />    
  4. <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />    
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
  6. <uses-permission android:name="android.permission.INTERNET" />    
  7. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />    
  8. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
  10. <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
  11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
  12. <uses-permission android:name="android.permission.BROADCAST_STICKY" />    
  13. <uses-permission android:name="android.permission.WRITE_SETTINGS" />    
  14. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  

第四步、创建基础地图;

在 xml 文件中添加 mapview 控件,如下所示:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <com.baidu.mapapi.map.MapView    
  2.     android:id="@+id/bmapView"    
  3.     android:layout_width="fill_parent"    
  4.     android:layout_height="fill_parent"    
  5.     android:clickable="true" />  
在 java 代码中初始化地图 SDK,实现基础地图的展示:
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //初始化地图 SDK  
  2. SDKInitializer.initialize(getApplicationContext());   
  3. setContentView(R.layout.activity_main);  
  4. //绑定XML中得 mapview 控件  
  5. mapView = (MapView) findViewById(R.id.bmapView);  


第五步、获取地图中心点,并添加 Marker 对象;

实现的核心代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. baiduMap = mapView.getMap();  
  2. LatLng latLng = baiduMap.getMapStatus().target;  
  3. //准备 marker 的图片  
  4. BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);  
  5. //准备 marker option 添加 marker 使用  
  6. markerOptions = new MarkerOptions().icon(bitmap).position(latLng);  
  7. //获取添加的 marker 这样便于后续的操作  
  8. marker = (Marker) baiduMap.addOverlay(markerOptions);  

第六步、实现 Marker 的点击事件响应;

利用 baidumap 对象的地图监听方法,实现针对 marker 的点击响应,核心代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //对 marker 添加点击相应事件  
  2. baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {  
  3.       
  4.     @Override  
  5.     public boolean onMarkerClick(Marker arg0) {  
  6.         // TODO Auto-generated method stub  
  7.         Toast.makeText(getApplicationContext(), "Marker被点击了!", Toast.LENGTH_SHORT).show();  
  8.         return false;  
  9.     }  
  10. });  

第七步、利用 Button 控件,控制 Marker 的添加删除;

这里用 button 来控制在地图上添加 或者 删除一个 marker,首先在 xml 中添加一个 button 控件:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Button  
  2.     android:id="@+id/button1"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_alignParentRight="true"  
  6.     android:layout_alignParentTop="true"  
  7.     android:text="删除Marker" />  
在 java 代码中添加这个 button 的点击事件响应,核心代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //按钮控制添加删除 button  
  2. button.setOnClickListener(new View.OnClickListener() {  
  3.           
  4.     @Override  
  5.     public void onClick(View arg0) {  
  6.         // TODO Auto-generated method stub  
  7.               
  8.         if(button.getText() == "添加Marker")  
  9.         {  
  10.             marker = (Marker) baiduMap.addOverlay(markerOptions);  
  11.             button.setText("删除Marker");  
  12.         }  
  13.         else   
  14.         {  
  15.             marker.remove();  
  16.                 button.setText("添加Marker");  
  17.         }  
  18.     }  
  19. });  

通过以上的操作,就可以实现相应的 marker 添加,marker 点击响应,marker 删除等操作。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.需要在 http://developer.baidu.com/ 注册开发者(个人或公司)账号 2.需要申请Key 打开网址 http://developer.baidu.com/map/index.php 点击 创建应用,跟流程创建应用app 3.点击相关下载->一键下载 4.调用百度地图的APP 需要在 AndroidManifest.xml 添加 <application android:name="baidumapsdk.demo.DemoApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 这里需要添加key,创建应用后,会有这个key <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="6t2yuIFylnRG7ECj1xHYuelY" /> ..... package com.obtk.mapdemo; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMapOptions; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.Toast; import android.app.Activity; import com.obtk.mapdemo.R; public class MapApiDemoActivity extends Activity implements OnGetGeoCoderResultListener { private MapView mMapView = null; private BaiduMap mBaiduMap = null; private GeoCoder mSearch = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // SDK初始化 SDKInitializer.initialize(getApplicationContext()); //当前视图 setContentView(R.layout.activity_map_api_demo); //创建地图对象 init(); final Button btn_location = (Button) findViewById(R.id.btn_location); btn_location.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub getLocation(); btn_location.setEnabled(false); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_map_api_demo, menu); return true; } /** * 初始化方法 */ private void init() { //mMapView = (MapView) findViewById(R.id.bmapview); mMapView = new MapView(this, new BaiduMapOptions()); mBaiduMap = mMapView.getMap(); /**添加一个对象*/ RelativeLayout rlly_map = (RelativeLayout)findViewById(R.id.rlly_map); rlly_map.addView(mMapView); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); //初始化搜索模块,注册事件监听 mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(this); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; super.onDestroy(); } // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); private LocationMode mCurrentMode; private boolean isFirstLoc = true; /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) //此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } String addr = location.getAddrStr(); if (addr != null) { Log.i("Test", addr); } else { Log.i("Test","error"); } double longitude = location.getLongitude(); double latitude = location.getLatitude(); if (longitude > 0 && latitude > 0) { Log.i("Test",String.format("纬度:%f 经度:%f", latitude,longitude)); LatLng ptCenter = new LatLng(latitude,longitude); // 反Geo搜索 mSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(ptCenter)); } //停止定位 mLocClient.stop(); } public void onReceivePoi(BDLocation poiLocation) { } } private void getLocation() { // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);//打开gps option.setCoorType("bd09ll"); //设置坐标类型 option.setScanSpan(5000); //定位时间间隔 mLocClient.setLocOption(option); mLocClient.start(); } @Override public void onGetGeoCodeResult(GeoCodeResult arg0) { // TODO Auto-generated method stub } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { // TODO Auto-generated method stub if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MapApiDemoActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } mBaiduMap.clear(); // mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) // .icon(BitmapDescriptorFactory // .fromResource(R.drawable.icon_marka))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); Toast.makeText(MapApiDemoActivity.this, result.getAddress(), Toast.LENGTH_LONG).show(); String province = result.getAddressDetail().province; String city = result.getAddressDetail().city; if (province != null && city != null) { } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值