Android集成百度地图SDK
本Demo中所含功能
1:定位,显⽰当前位置
2:地图多覆盖物(地图描点,弹出该点的详细信息)
3:坐标地址互相换算
4:POI兴趣点检索
5:线路查询(步⾏,驾车,公交)
6:绘制线路(OpenGL和地图SDK绘制)
百度地图的api:lbsyun.baidu/
在上述所有的功能中,先完成如下⼯作:
1、在百度地图API控制台创建AK, 请参考:lbsyun.baidu/index.php?title=androidsdk/guide/key
2、下载百度地图的SDK。下载链接:lbsyun.baidu/sdk/download
根据个⼈的需要下载相对应的sdk
3、将上⾯下载的sdk放到⾃⼰项⽬中的对应的Lib下,可参考链接:lbsyun.baidu/index.php?title=androidsdk/guide/buildproject
4、配置l⽂件:
< uses-permission android:name ="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name ="android.permission.INTERNET" />
<uses-permission android:name= "com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name ="android.permission.WAKE_LOCK" />
<uses-permission android:name ="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name ="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name ="android.permission.GET_TASKS" />
<uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name ="android.permission.WRITE_SETTINGS" />
<!-- 这个权限⽤于进⾏⽹络定位 -->
<uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限⽤于访问GPS定位 -->
<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" />
<!-- ⽤于读取⼿机当前的状态 -->
<uses-permission android:name ="android.permission.READ_PHONE_STATE" />
<!-- SD卡读取权限,⽤户写⼊离线定位数据 -->
<uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name= "android.permission.BAIDU_LOCATION_SERVICE" />
<uses-permission android:name= "android.permission.ACCES_MOCK_LOCATION" />
<uses-permission android:name ="android.permission.ACCESS_GPS" />
<uses-permission android:name ="android.permission.BROADCAST_STICKY" />
<!-- 来电消⾳ -->
<uses-permission android:name= "android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name= "android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name ="android.permission.RECORD_AUDIO" />
<!-- 摄影机 -->
<uses-permission android:name ="android.permission.CAMERA" />
注:上⾯的权限是我的项⽬中所有⽤到的权限,具体可参考百度地图和定位地图所需要的权限。
基础地图参考:
定位参考:
还需要配置地图的AK以及定位service:
< meta-data
android:name= "com.baidu.lbsapi.API_KEY"
android:value= "API控制台申请到的AK" />
< service
android:name= "com.baidu.location.f"
android:enabled= "true"
android:process= ":remote" >
</service >
5、在Application中初始化地图SDK
SDKInitializer.initialize(getApplicationContext());
1、定位并且显⽰当前位置
步骤:1、初始化LocationClient 类,并设置定位回调类(通过registerLocationListener()⽅法)
2、设置定位参数
3、发起定位
4、在回调接⼝中获取定位的信息
代码如下:
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.lb.baidumapdemo.db.DBConstants;
import com.lb.baidumapdemo.db.ShareDB;
import com.lb.baidumapdemo.face.LocationFace;
t.Context;
/**
* @ClassName: LocationFaceUtil
* @Description: 定位帮助类,这个类只⽤来做定位⽤
* @author libiao
* @date 2015 -8 -20 下午2:48:07
*
*/
public class LocationFaceUtil implements BDLocationListener {
private LocationFace locationFace; // 这个为⾃⼰写的⼀个接⼝,⽤来回调给外部处理
public LocationClient mLocationClient = null;
private Context context;
public LocationFaceUtil(Context context, LocationFace locationFace) {
super();
this. locationFace = locationFace;
this. context = context;
mLocationClient = new LocationClient(context);
startLocation();
}
private void startLocation() {
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode. Hight_Accuracy); // 可选,默认⾼精度,设置定位模式,⾼精度,低功耗,仅设备
option.setCoorType( "bd09ll"); // 可选,默认gcj02,设置返回的定位结果坐标系
option.setScanSpan(0); // 可选,默认0,即仅定位⼀次,设置发起定位请求的间隔需要⼤于等于1000ms才是有效的
option.setIsNeedAddress( true); // 可选,设置是否需要地址信息,默认不需要
option.setOpenGps( true); // 可选,默认false,设置是否使⽤ gps
option.setLocationNotify( true); // 可选,默认false,设置是否当 gps有效时按照1S1次频率输出GPS结
果
option.setIsNeedLocationDescribe( true); // 可选,默认false,设置是否需要位置语义化结果,可以在LocationDescribe⾥得到,结果类似于“在 option.setIsNeedLocationPoiList( true); // 可选,默认false,设置是否需要POI结果,可以在PoiList⾥得到
option.setIgnoreKillProcess( false); // 可选,默认false,定位SDK内部是⼀个SERVICE,并放到了独⽴进程,设置是否在stop的时候杀死这个进程,默认杀死 option.SetIgnoreCacheException( false); // 可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps( false); // 可选,默认false,设置是否需要过滤 gps仿真结果,默认需要
mLocationClient.setLocOption(option);
mLocationClient.start();
}
@Override
public void onReceiveLocation(BDLocation arg0) {
//注意这⾥,⼀定要判断BdLocation的返回值,只有在getLocType()==61或者161的情况下才表⽰定位成功,具体返回的错误码可参考lbsyun.baidu.c if (LocType() == 61 || LocType() == 161 && Latitude() != 0.0) {
//将城市的名字存到SharedPreferences⾥⾯
new ShareDB( context).save(DBConstants. CITY_NAME, City());
//将定位结果回调给locationFace的locationResult()⽅法
locationFace.locationResult(arg0);
}
}
}
在调⽤这个类的时候,我们只需要
new LocationFaceUtil(getApplicationContext(), new LocationFace() {
@Override
public void locationResult(BDLocation location) {
bdLocation = location;
addMarker();
}
});
然后回调的信息就全部在这个bdLocation⾥⾯了,接着标注当前⾃⼰的位置,就是调⽤的 addMarker()⽅法
下⾯代码中的:mBaiduMap=(MapView) findViewById(R.id.basemap).getMap();
private void addMarker() {
// 设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图
mBaiduMap.setMapType(BaiduMap. MAP_TYPE_NORMAL);
// 开启交通图
mBaiduMap.setTrafficEnabled( true);
// 设置地图当前级别
MapStatusUpdate statusUpdate = To(19);
mBaiduMap.setMapStatus(statusUpdate);
// 构建覆盖物的经纬度
LatLng latLng = new LatLng( Latitude(), Longitude());
//覆盖物显⽰的图标
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable. icon_gcoding);
OverlayOptions option = new MarkerOptions().position(latLng).icon(descriptor).draggable(true);
// 清除地图上所有的覆盖物
mBaiduMap.clear();
// 将覆盖物添加到地图上
mBaiduMap.addOverlay(option);
// 将覆盖物设置为地图中⼼
MapStatusUpdate u = wLatLng(latLng);
// 以动画⽅式更新地图状态,动画耗时 300 ms
mBaiduMap.animateMapStatus(u);
mBaiduMap.setOnMarkerClickListener(BaseMapActivity. this);
mBaiduMap.setOnMarkerDragListener(BaseMapActivity. this);
}
OK,到这⾥定位显⽰当前⾃⼰的位置的功能就已经完成了
2:地图多覆盖物(地图描点,弹出该点的详细信息)
⾸先,我构建了四个经纬度的点(实际中需要通过POI检索得到),然后循环将这些点添加到地图界⾯上,并给这些点设置额外的数据。最后给覆盖物设置点击事件,在点击事件中弹出弹框
代码如下:
aphics.Point;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.del.LatLng;
import com.lb.baidumapdemo.R;
import com.lb.baidumapdemo.base.BaseActivity;
public class MarkerMapActivity extends BaseActivity implements OnMarkerClickListener,OnMapClickListener {
private MapView mBaiduMapView; // 地图界⾯
private BaiduMap mBaiduMap; // 地图的管理类
private String[] titles = new String[] { "one", "two", "three", "four" };//这是是四个坐标对应的四个信息
//要放在地图上的四个坐标
private LatLng[] latlngs = new LatLng[] { new LatLng(22.539895,114.058935), new LatLng(22.540729,114.066337), new LatLng(22.543763,114.06458), new LatLng(22.538614,114.062811) };
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout. activity_markermap);
mBaiduMapView = (MapView) findViewById(R.id. markermap);
mBaiduMap = Map();
//设置地图点击事件
mBaiduMap.setOnMapClickListener( this);
initMarker();
}
private void initMarker() {
mBaiduMap.clear();
LatLng latLng = null;
OverlayOptions overlayOptions = null;
// 设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图
mBaiduMap.setMapType(BaiduMap. MAP_TYPE_NORMAL);
// 开启交通图
mBaiduMap.setTrafficEnabled( true);
MapStatusUpdate statusUpdate = To(17);
mBaiduMap.setMapStatus(statusUpdate);
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable. icon_gcoding);
//循环添加四个覆盖物到地图上
for ( int i = 0; i < titles. length; i++) {
latLng= latlngs[i];
overlayOptions = new MarkerOptions().position(latLng).icon(descriptor);
// 将覆盖物添加到地图上
Marker marker=(Marker) mBaiduMap.addOverlay(overlayOptions);
Bundle bundle = new Bundle();
bundle.putString( "info", titles[i]+ "个");
marker.setExtraInfo(bundle);
}
// 将最后⼀个坐标设置为地图中⼼
MapStatusUpdate u = wLatLng(latLng);
mBaiduMap.setMapStatus(u);
//设置地图覆盖物的点击事件
mBaiduMap.setOnMarkerClickListener(MarkerMapActivity. this);百度api接口
}
/**
* @Title: onMarkerClick
* @Description: 覆盖物点击事件,每次点击⼀个覆盖物则会在相应的覆盖物上显⽰⼀个InfoWindow
* @param marker
* @return
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论