一、工具

     1.经纬度坐标拾取:百度坐标拾取系统。

     2.常用坐标系投影系统

        墨卡托:百度墨卡托投影坐标java

     3.CAD

         1)选中一条线,输入ls,可以列出坐标,一般不会全部显示,需要enter继续。

         2 ) 图层的灵活使用


二、确定绘图比例尺

      1.将地区实际区域在CAD上画出矩形边界后,计算出1m的实际距离在屏幕上是多少个像素。

      2.比例尺决定统一大小的屏幕能显示多大实际区域。


三、设备上绘图

      1.自定义View技术,建立车道图层和车辆图层自定义View。

      2.坐标转换

         经纬度->墨卡托平面坐标->Android绘图坐标

      3.绘制车道、车辆图

         纠偏:由于实际的数据有小数点,但是android绘图的API的参数是int类型,会用精度损失。如果车道图层移动的次数越多,误差积累就会越来越大。

         纠偏的理论:将精度损失的位移积累起来,如果绝对值超过1,就做+-1的处理。

    Pair androidCenterCarPoint = LaneLayerDataHolder.getInstance().getAndroidPoint(getMeasuredHeight(), centerCarPoint);
    Pair androidLastWindowCenterPoint = LaneLayerDataHolder.getInstance().getAndroidPoint(getMeasuredHeight(), LaneLayerDataHolder.getInstance().getLastWindowCenterPoint());
    
    //!!!!!!!!!!!!!!!!注意下面计算增量,会有精度损失。需要处理,否则地图偏移不对。!!!!!!!!!!!!!!!!!!!!!
    int detX = (int) Math.round(androidCenterCarPoint.first - androidLastWindowCenterPoint.first);
    int detY = (int) Math.round(androidCenterCarPoint.second - androidLastWindowCenterPoint.second);
    Log.d(TAG, "updateMapPositionByCenterCar: detX = " + detX + ",detY = " + detY);
    offsetLeftAndRight(-detX);
    offsetTopAndBottom(-detY);
    
    //纠偏
    addUpDetX+=(androidCenterCarPoint.first - androidLastWindowCenterPoint.first-detX);
    addUpDetY+=(androidCenterCarPoint.second - androidLastWindowCenterPoint.second-detY);
    //Android-X方向
    if(Math.abs(addUpDetX) >=1){
        offsetLeftAndRight(addUpDetX > 0 ? -1 : 1);
        if(addUpDetX > 0){
            addUpDetX = addUpDetX -1;
        }else{
            addUpDetX = addUpDetX+1;
        }
    }
    //Android-Y方向
    if(Math.abs(addUpDetY) >=1){
        offsetLeftAndRight(addUpDetY > 0 ? -1 : 1);
        if(addUpDetY > 0){
            addUpDetY = addUpDetY -1;
        }else{
            addUpDetY = addUpDetY + 1;
        }
    }


      4.车道以车辆为中心联动

         通过计算偏移量,将车道图层layout或者offsetLeftAndRight

      5.