前言
高德地图的api使用方法和百度地图差不多,照着Demo写也并不难,前段时间做的高德地图如今已经忘的差不多了,我的记性真是差,而且最近在重构代码,我才现以前理解的还是不够透彻有问题,希望写下来常常可以看看。
最简单的定位
定位基本上都是一个LocationClient类开始定位,LocationListener进行定位监听拿到定位结果,百度地图中也是这样的。
实例化对象
private void initLocation() {
if(locationClient ==null)
{
locationClient = new AMapLocationClient(this);
}
if(option == null)
{
option = new AMapLocationClientOption();
option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
}
//定位监听
locationClient.setLocationListener(this);
locationClient.setLocationOption(option);
locationClient.startLocation();
}
定位结果的回调方法
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(aMapLocation!=null)
{
if(aMapLocation.getErrorCode()==0)
Log.d(TAG, "onLocationChanged: "+aMapLocation.getAddress());
}
else {
Log.d(TAG, "onLocationChanged: "+aMapLocation.getErrorCode()+aMapLocation.getErrorInfo());
}
}
}
从AmapLocation对象中可以拿到相关的地理位置信息。
定位结果:onLocationChanged: 江苏省南京市浦口区
定位并且在地图上显示出我的位置
有的时候不仅仅希望能拿到城市经纬度,还希望可以直接在地图上看到,怎么办呢?
不是刚刚已经说了,拿到经纬度了吗,那么在地图上放个Marker,再把地图移到这个经纬度上,我们不就可以看到了吗?
对,这是一种方法,可是看高德地图Demo中还有一种更简单的方法。
直接看代码
//定位
private void initLocation() {
//地图监听定位
mAmap.setLocationSource(this);
/**
设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
不设置true定位定不出来(一个大坑)
**/
mAmap.setMyLocationEnabled(true);
}
setLocationSource主要有两个方法
- void activate(LocationSource.OnLocationChangedListener onLocationChangedListener) //激活定位,实例化对象,设置监听等
- void deactivate() 释放资源 如停止定位
具体代码:
//定位回调接口
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null&&mlistener!=null) {
if (aMapLocation.getErrorCode() == 0)
//这行直接显示我的位置,并且给出一个默认的图标标位置
mlistener.onLocationChanged(aMapLocation);
Log.d(TAG, "onLocationChanged: " + aMapLocation.getAddress());
} else {
Log.d(TAG, "onLocationChanged: " + aMapLocation.getErrorCode() + aMapLocation.getErrorInfo());
}
}
//激活定位
@Override
public void activate(LocationSource.OnLocationChangedListener onLocationChangedListener) {
mlistener = onLocationChangedListener;
if(locationClient ==null)
{
locationClient = new AMapLocationClient(this);
}
if(option == null)
{
option = new AMapLocationClientOption();
设置GPS定位优先,即使设置高精度定位模式,它也会优先GPS在室内定位很差,最好不要设置,就默认的也就是false;
option.setGpsFirst(true);
//高精度定位模式
option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
}
//设置定位,onLocationChanged就是这个接口的方法
locationClient.setLocationListener(this);
locationClient.setLocationOption(option);
//开始定位
locationClient.startLocation();
}
@Override
public void deactivate() {
if(locationClient.isStarted())
locationClient.stopLocation();
locationClient = null;
mlistener=null;
}
Poi搜索
poi,point of interset,也就是兴趣点搜索,区别于正向地址解析。.
一般就是为搜索设置查询条件,然后异步搜索。
// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query = new PoiSearch.Query(keyWord,"",aMapLocation.getCity());
// 设置query为poiSearch的查询条件
poiSearch = new PoiSearch(mContext,query);
// 搜索回调接口
poiSearch.setOnPoiSearchListener(this);
// 设置异步搜索
poiSearch.searchPOIAsyn();
搜索结果
@Override
public void onPoiSearched(PoiResult poiResult, int i) {
view.hideProgress();
if(i==1000)
{
if(null != poiResult&&poiResult.getQuery()!=null)
{
//判断返回的结果和想要查询的结果是否一致
if(poiResult.getQuery().equals(query))
{
List<PoiItem> poiItem = poiResult.getPois();
if(null!= poiItem&&poiItem.size()>0)
{
//aMap.clear();
//添加覆盖物
PoiOverlay poiOverlay = new PoiOverlay(aMap,poiItem);
poiOverlay.removeFromMap();
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
}
}
}
}
}
最后说一个高等地图的一个坑
<!-- 高德地图配置 -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="08c9b26d3ce86fb2159bb8b233960c88" />
<!-- 高德地图定位 -->
<service android:name="com.amap.api.location.APSService" />
"com.amap.api.v2.apikey"这个不能改是固定死的,和百度地图一样,不然定位失败。
注意:高德地图并不是比较密钥“08c9b26d3ce86fb2159bb8b233960c88”,而是比较申请key的时候填写的sha1加密值和包名。一台机器上运行的项目放到另一台机器上地图就定位不出结果了,显示key配置有问题,这里就是你本地机器sha1加密和高德服务器上的不一样,所以才会这样。