高德地图自定义路网

思路:绘制折线显示路网信息
前提:已知线段起终点坐标及路况状态(一般通过颜色区分)
步骤:
1、按指导文档配置,显示地图(这里就不讲了)
2、监听地图状态变化,获取当前地图状态(主要是获取缩放级别,变更线段粗细)

aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition cameraPosition) {

            }

            @Override
            public void onCameraChangeFinish(CameraPosition cameraPosition) {
                //todo 通过监听地图状态变化,设置线段粗细
                aMap.clear();
                addPolylinessoild(cameraPosition.zoom);
            }
        });

3、绘制折线,为了尽可能减缓卡顿,建议放在子线程里进行

//绘制一条实线
//TODO 单指滑动地图时,需要重绘线段,屏幕内线段数量500条尚可,1000条略卡,5000条卡翻
private void addPolylinessoild(final float zoom) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i<1;i++){
                    double j = (double)(Math.round(i)/1.0000000);
                    Log.e("j",""+j);
                    aMap.addPolyline((new PolylineOptions())
                            .add(new LatLng(30.345176 +j  ,120.131177+j),
                                    new LatLng(30.092569+j,119.158602+j))
                            .width(zoom)
                            .color(Color.argb(255, 1, 1, 1)));
                }
            }
        }).start();

    }

4、必要情况下可以限制缩放级别

//      //设置最小缩放级别 缩放级别范围为[3, 20],超出范围将按最小级别计算
//      aMap.setMinZoomLevel(15);
//      //设置地图最大缩放级别 缩放级别范围为[3, 20],超出范围将按最大级别计算 。
//      aMap.setMaxZoomLevel(20);

5、因为路网信息会随时间变化,所以还需要确定一个刷新间隔时间,这里可以使用一个定时器Timer

// 定义计时器
// 定义计划任务,根据参数的不同可以完成以下种类的工作:在固定时间执行某任务,在固定时间开始重复执行某任务,重复时间间隔可控,在延迟多久后执行某任务,在延迟多久后重复执行某任务,重复时间间隔可控
// 获取当前地图状态的缩放级别aMap.getCameraPosition().zoom
Timer = new Timer();
Timer.schedule(new TimerTask() {
    // TimerTask 是个抽象类,实现的是Runable类
    @Override
    public void run() {
        aMap.clear();
        addPolylinessoild(aMap.getCameraPosition().zoom);
    }
}, 0, 5*60*1000);

定时器Timer的参数意义参考:
http://blog.csdn.net/u013370255/article/details/69945746

6、关于绘制大量线段时单指拖动地图,卡顿滞涩的问题
描述:当前手机屏幕内,绘制并显示大量线段,单指拖动地图,卡顿滞涩

原因:在地图拖动过程中,屏幕内的线段覆盖物会不停的重绘,以保证与地图的相对位置不变。当同一时间点屏幕内有大量线段覆盖物时,不可避免的会影响性能

解决思路1:
限制地图缩放级别,即保证在地图缩放到屏幕内最大可视范围的情况下,绘制的所有线段覆盖物数量仍不会影响地图正常使用。从而达到控制屏幕内线段覆盖物数量的目的,解决当前问题。

适用与不足:
适用线段覆盖物数量相对较少,且相对比较集中的情况,比如一个城市(一般指绕城高速环线内)的路况。使用体验可能会差点,且不可扩展,只能一块区域一个标准(不同地方道路密集度不同)。

解决思路2:
对每一条线段覆盖物增加显示级别属性,根据地图当前的显示级别Zoom,显示相应级别及以下的线段覆盖物(比如:高德地图显示级别范围为3~20,假设线段级别也是3~20,一一对应,当地图显示级别为15时,线段覆盖物显示级别在3~15之间的可显示,级别超过15的线段覆盖物不可显示)。
甚至于,当地图级别低到一定值时,对节点进行抽希,即比如由A、B、C三个点构成一段一定角度的折线ABC,当地图级别低到一定值时,ABC可以近似的看成直线,如果AB段与BC段路况状态相同,则可以省略B节点,直接生成线段AC表示,这里应该需要一个算法吧。

因为屏幕显示范围有限,级别越高显示范围越小,从而达到控制屏幕内线段覆盖物数量的目的,解决当前问题。

适用与不足:
适用所有自定义绘制路况线路的情况,但数据量相对较多,毕竟加了个属性

解决思路3:
减少覆盖物对象绘制
http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=25308&extra=

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值