思路:绘制折线显示路网信息
前提:已知线段起终点坐标及路况状态(一般通过颜色区分)
步骤:
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的参数意义参考:
6、关于绘制大量线段时单指拖动地图,卡顿滞涩的问题
描述:当前手机屏幕内,绘制并显示大量线段,单指拖动地图,卡顿滞涩
原因:在地图拖动过程中,屏幕内的线段覆盖物会不停的重绘,以保证与地图的相对位置不变。当同一时间点屏幕内有大量线段覆盖物时,不可避免的会影响性能
解决思路1:
限制地图缩放级别,即保证在地图缩放到屏幕内最大可视范围的情况下,绘制的所有线段覆盖物数量仍不会影响地图正常使用。从而达到控制屏幕内线段覆盖物数量的目的,解决当前问题。
适用与不足:
适用线段覆盖物数量相对较少,且相对比较集中的情况,比如一个城市(一般指绕城高速环线内)的路况。使用体验可能会差点,且不可扩展,只能一块区域一个标准(不同地方道路密集度不同)。
解决思路2:
对每一条线段覆盖物增加显示级别属性,根据地图当前的显示级别Zoom,显示相应级别及以下的线段覆盖物(比如:高德地图显示级别范围为3~20,假设线段级别也是3~20,一一对应,当地图显示级别为15时,线段覆盖物显示级别在3~15之间的可显示,级别超过15的线段覆盖物不可显示)。
甚至于,当地图级别低到一定值时,对节点进行抽希,即比如由A、B、C三个点构成一段一定角度的折线ABC,当地图级别低到一定值时,ABC可以近似的看成直线,如果AB段与BC段路况状态相同,则可以省略B节点,直接生成线段AC表示,这里应该需要一个算法吧。
因为屏幕显示范围有限,级别越高显示范围越小,从而达到控制屏幕内线段覆盖物数量的目的,解决当前问题。
适用与不足:
适用所有自定义绘制路况线路的情况,但数据量相对较多,毕竟加了个属性