高德地图的坑

1、自定义InfoWindow

重写InfoWindow的getInfoWindow()方法,返回一个View,如果这个View的根布局没有设置background,那么高德会给你外面套一层框框:

如果设置了background,哪怕是一个透明的颜色,就能达到我们想要的效果:

由于图片是拿另一个手机拍的,有点歪歪的。

 

2、设置地图缩放等级

高德地图默认显示的区域是很大的,比如我要显示比较详细的街道信息,就要设置一个较大的缩放等级:

 

aMap.moveCamera(CameraUpdateFactory.zoomTo(15));

但是,问题来了,有时候设置了没有起作用抓狂

 

好吧,那我设置一个监听,设置没有成功就重新设置:

 

private float zoom = 16;
	
aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
    }

    @Override
    public void onCameraChangeFinish(CameraPosition cameraPosition) {
        if (cameraPosition.zoom != zoom) {
            aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
        }
    }
});

现在另外一个问题来了,这样设置之后,地图就不能缩放了,因为每次手动缩放之后,就会重新设置到zoom这个等级,好吧,那我们加一个标志,只对第一次加载的时候重新设置zoom:

 

private float zoom = 16;
private boolean isLoaded;

aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
    aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
    }

    @Override
    public void onCameraChangeFinish(CameraPosition cameraPosition) {
        if (!isLoaded && cameraPosition.zoom != zoom) {
            aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
        }
        isLoaded = true;
    }
});

但是。。。。。。。理论上来说,没得问题了,实际上你会发现有时候还是没有作用再见

 

分析原因,发现地图会加载两次,第一次加载的是默认地图(可能并不是你指定的经纬度),经过了一次回调,然后第二次加载的时候,不会再进入回调里面的设置代码了,因为isLoaded已经置true了,知道了原因修改就简单了,把isLoaded置true的代码放在括号里面就行了:

 

@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
    if (!isLoaded && cameraPosition.zoom != zoom) {
        aMap.moveCamera(CameraUpdateFactory.zoomTo(zoom));
        isLoaded = true;
    }
}

 

3、不能正常定位

 

自动定位到非洲的海洋里面去了骂人

看log日志也没有异常,增加一个定位监听:

 

aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener() {
    @Override
    public void onMyLocationChange(Location location) {
        Log.e("map", location.toString());
    }
});

然后在log中发现异常:

10-10 09:41:47.290 27722-27722/com.ht.test E/map: latitude=0.0#longitude=0.0#province=#city=#district=#cityCode=#adCode=#address=#country=#road=#poiName=#street=#streetNum=#aoiName=#poiid=#floor=#errorCode=12#errorInfo=缺少定位权限 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:定位权限被禁用,请授予应用定位权限#1201 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:定位权限被禁用,请授予应用定位权限#1201#locationDetail=定位权限被禁用,请授予应用定位权限#1201#locationType=0

原来是没有定位权限,Android 6.0以后,定位权限需要动态申请,java代码申请权限即可。

 

然后,还是不行,看log:

 

10-10 09:37:02.020 22915-22915/com.ht.test E/map: latitude=0.0#longitude=0.0#province=#city=#district=#cityCode=#adCode=#address=#country=#road=#poiName=#street=#streetNum=#aoiName=#poiid=#floor=#errorCode=7#errorInfo=KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701#locationDetail=auth fail:INVALID_USER_SCODE#SHA1AndPackage#C4:2B:3E:6E:3C:CE:83:63:6A:30:5A:B7:BD:70:65:34:13:04:74:78:com.ht.test#gsid#3ce427c57a5fd872c4cb4ef864a9c4d7#csid#e2fb592fe470496487546e65bc51eaf6#0701#locationType=0

额,key错误,把高德后台申请到的key填到manifest中即可。

4、显示多点,并且视图刚好把所有点包起来

MultiPointOverlayOptions overlayOptions = new MultiPointOverlayOptions();
overlayOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_light));//点的图片
overlayOptions.anchor(0.5f,0.5f); //设置锚点

MultiPointOverlay multiPointOverlay = mBinding.mapView.getMap().addMultiPointOverlay(overlayOptions);
List<MultiPointItem> list = new ArrayList<MultiPointItem>();
LatLngBounds.Builder latLngBounds = LatLngBounds.builder();
for(BeanLight bean : beanLights) {
    //创建MultiPointItem存放,海量点中某单个点的位置及其他信息
    MultiPointItem multiPointItem = new MultiPointItem(new LatLng(Double.valueOf(bean
            .latitude), Double.valueOf(bean.longitude)));
    multiPointItem.setCustomerId(bean.lightCode);
    list.add(multiPointItem);
    latLngBounds.include(new LatLng(Double.valueOf(bean
            .latitude), Double.valueOf(bean.longitude)));
}
multiPointOverlay.setItems(list);//将规范化的点集交给海量点管理对象设置,待加载完毕即可看到海量点信息

mBinding.mapView.getMap().moveCamera(CameraUpdateFactory.newLatLngBounds
        (latLngBounds.build(), 50));

BeanLight代码:

public class BeanLight extends BeanBase {
    public String lightCode;
    public String longitude;
    public String latitude;
}

5、通过屏幕某点坐标获取该点定位

通过aMap.getProjection().fromScreenLocation(x, y)方法可以通过屏幕某点坐标获取该点的经纬度,高德解释如下:

根据转入的屏幕位置返回一个地图位置(经纬度)。

但是他这里所说的屏幕并不包括系统状态栏的高度,所以和view.getLocationOnScreen()方法配合使用时,会有一个高度差。比如:

public LatLng getMapCenterPoint(View view) {
    Projection projection = aMap.getProjection();
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    LatLng pt = projection.fromScreenLocation(new Point(location[0],
            location[1]));
    return pt;
}

通过这个方法获取该view在地图上的经纬度,结果老是有误差,通过根view在屏幕上的坐标可以消除该误差:

public LatLng getMapCenterPoint(View rootView, View view) {
    Projection projection = aMap.getProjection();
    int[] rootLocation = new int[2];
    rootView.getLocationOnScreen(rootLocation);
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    LatLng pt = projection.fromScreenLocation(new Point(location[0],
            location[1] - rootLocation[1]));

    return pt;
}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值