Android开发的前期准备
Android配置在百度地图SDK官网上有详细的说明。具体可以参考官网的教程,笔者觉得官网的总结的很细,笔者初学,就不耍大刀了。 以下就是官网地址: https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
当然,按照官网上的步骤,初学会有一些小问题,稍后会在另一篇文章中展现笔者在初学遇见的问题与解决方法。
在最起初,遇见的问题,让笔者摸不着头脑,找不到错误的原因,也搜索了很多文章,都快放弃了,还好,到后面解决了。
言归正传。
地图图层显示与定位
地图SDK提供了3种预置的地图类型,包括普通地图,卫星图,空白地图。另外提供了2种常用图层实时路况图以及百度城市热力图。
可以根据自己的需求选择。笔者用的是普通地图 。 上代码:
public class MyMap extends AppCompatActivity {
private MapView mMapView=null;
LocationClient mLocationClient;
BaiduMap mbaiduMap;
MyLocationListener myLocationListener;
LocationClientOption option;
LatLng latLng;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_my_map);
tv_1=findViewById(R.id.tv_mapmun);
List<String> permissionList = new ArrayList<>();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!permissionList.isEmpty()){
String[] permissions =permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(this, permissions, 1);
}
initLocation();
}
private void initLocation(){
mMapView=findViewById(R.id.bmapView);
mbaiduMap=mMapView.getMap();
ppp=new ArrayList<LatLng>();
mLocationClient=new LocationClient(this);
if(mLocationClient != null&& !mLocationClient.isStarted()){
mLocationClient.requestLocation();
mLocationClient.start();
}
option=new LocationClientOption();
myLocationListener=new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
option.setOpenGps(true);
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setIsNeedAddress(true);
option.setNeedDeviceDirect(true);
option.setScanSpan(1001);
mLocationClient.setLocOption(option);
mLocationClient.start();
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || mMapView == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(location.getDirection()).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
}
}
@Override
protected void onStart() {
super.onStart();
mbaiduMap.setMyLocationEnabled(true);
if (mLocationClient.isStarted())
mLocationClient.start();
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onDestroy() {
mLocationClient.stop();
mbaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView=null;
super.onDestroy();
mMapView.onDestroy();
}
}
public class DemoApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
SDKInitializer.initialize(this);
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
以上就是实现地图的全部代码,记得打开存储权限,不然不会显示图层只有空白。完成以上步骤就可以在应用上显示自己的定位。
这是实现后的图片
运动轨迹的简单绘制
运动轨迹实现方法用的是: 每隔一定的时间收集当前位置的信息,把多个点连起来,绘制成轨迹展现。
public void onReceiveLocation(BDLocation bdLocation) {
if(bdLocation ==null||mMapView ==null){
return;
}
MyLocationData locData=new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
.direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();
mbaiduMap.setMyLocationData(locData);
if(frist){
frist=false;
latLng = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
MapStatus.Builder builder=new MapStatus.Builder();
builder.target(latLng).zoom(18.0f);
mbaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mbaiduMap.animateMapStatus(msu);
}
LatLng pointsss=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
if(pointsss.longitude>0&&pointsss.latitude>0)
ppp.add(pointsss);
if(ppp.size()>=2){
OverlayOptions mOverlay=new PolylineOptions()
.width(10)
.color(0xAAFF0000)
.points(ppp);
Overlay mPolyline=(Polyline)mbaiduMap.addOverlay(mOverlay);
mPolyline.setZIndex(3);
}
Log.i("MyMap", " latitude:" + bdLocation.getLatitude()
+ " longitude:" + bdLocation.getLongitude() + ppp.size());
}
}
以上就是全部的代码。
在绘制轨迹时,需要把第一个点(也就是在几内亚湾)去掉,因为系统最开始会定位到那个点,具体的原因笔者也不清楚。
希望给大家一点帮助和参考。
|