1.环境配置
高德开发定位,地图,搜索,加覆盖物,这四个功能只需要要做三部
第一,下载三个架包,高德里面不涉及到3d地图没有.so文件,只需要三个架包,对于我们不需要的功能其他架包可以不用下载,比如不涉及到导航我们就不需要下载导航架包,这样可以减少应用的负重,将下载好的架包导入工程,配上截图!
这是加入项目中截图
导包完成之后然后就是添加服务,首先,请在application标签中声明service组件,每个app拥有自己单独的定位service。<service android:name="com.amap.api.location.APSService"></service>
然后,<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
最后设置Key,在application标签中加入
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">//开发者申请的key
</meta-data>
2.功能实现
最后就是代码实现我们想要的功能
第一步初始化Amap这个类,这个类是地图对象,里面有很多地图的操作方法和接口
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
aMap.moveCamera(CameraUpdateFactory.zoomTo(16));//设置地图的缩放比例
setUpMap();
}
}
得到地图对象后初始化地图对象的一些属性
private void setUpMap() {
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(com.amap.api.maps2d.model.BitmapDescriptorFactory
.fromResource(R.drawable.biaozhi));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.WHITE);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));// 设置圆形的填充颜色
myLocationStyle.strokeWidth(0.0f);// 设置圆形的边框粗细*/
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false*/
}
});
}
运行激活定位的接口方法,并且开始定位
/**
* 激活定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mLocationOption.setNeedAddress(true);
mLocationOption.setOnceLocation(true);
mlocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();
}
}
开启定位之后定位成功就会回调定位成功接口方法,着这里我们可以获取到我们定位后的城市,经纬度,以及很多
/**
* 定位成功后回调函数
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
aMap.addMarker(new com.amap.api.maps2d.model.MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(com.amap.api.maps2d.model.BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.biaozhi)))
.position(new com.amap.api.maps2d.model.LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));
Log.e("5555",amapLocation.getProvince()+","+amapLocation.getCity()+","+amapLocation.getAddress()+","+amapLocation.getStreet()+","+amapLocation.getAoiName());
city=amapLocation.getCity();
lp=new LatLonPoint(amapLocation.getLatitude(),amapLocation.getLongitude());
poi_Search("");//开始周边搜索
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
Log.e("AmapErr",errText);
}
}
}
租后就是周边搜索代码:
private void poi_Search(String str) {
com.amap.api.services.poisearch.PoiSearch.Query mPoiSearchQuery = new com.amap.api.services.poisearch.PoiSearch.Query(str, "",city);
mPoiSearchQuery.requireSubPois(true);
mPoiSearchQuery.setPageSize(30);
mPoiSearchQuery.setPageNum(0);
com.amap.api.services.poisearch.PoiSearch poiSearch = new com.amap.api.services.poisearch.PoiSearch(BaiDuMapActivity.this, mPoiSearchQuery);
poiSearch.setBound(new com.amap.api.services.poisearch.PoiSearch.SearchBound(lp, 5000, true));
poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
}
搜索成功后调用回调接口方法,获取我们搜索到的结果
@Override
public void onPoiSearched(com.amap.api.services.poisearch.PoiResult poiResult, int i) {
poiItems=poiResult.getPois();
listView.setAdapter(new BaiDuListAdapter(BaiDuMapActivity.this,poiItems));
}
最后我们对搜索的结果进行处理。
最后一个功能就是添加覆盖物
aMap.addMarker(new com.amap.api.maps2d.model.MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(com.amap.api.maps2d.model.BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.biaozhi)))
.position(new com.amap.api.maps2d.model.LatLng(latitude, longitude)));
根据经纬度将我们的红色标志添加到地图上,以便用户很好的知道自己当前位置。
3.百度跟高德的区别
1百度2d地图需要添加.so文件而高德不需要
2百度不支持关键字为空的兴趣点搜索而高德可以