Android GPS坐标 画路线

问题描述:使用成百上千个GPS坐标画路线,在android上的Google Map显示出来 

之前我实现过一次,将每个点都遍历一边,然后在Google Map上画出来,但是由于 
数据过多导致Google地图移动位置变得不流畅,每次移动Google地图都会调用draw 
方法,那么程序一直遍历一直画图,花费大且不流畅。这次做了下优化,对只在屏幕内 
的坐标画线。Google地图比之前流畅多了。 

 

之前实现是画蓝色的线,这次实现只画红色的线。 
临界条件是上一个点在屏幕内,下一个点在屏幕外。 

运行环境:android版本2.3 

package com.ui;
import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
import com.model.Point;

public class RouteOverlay extends Overlay
{
    final static String TAG = "DrawRoutePath";
    private List<Point> points = new ArrayList<Point>();
    
    private final Projection projection;
    private final Paint paint;    
    public RouteOverlay(Projection projection) {
        this.projection = projection;
        
        // 设置画笔
        paint = new Paint();
        paint.setColor(Color.RED);
        // 画笔的粗细
        paint.setStrokeWidth(3);
        paint.setAntiAlias(true);
        paint.setStrokeMiter(3);
        paint.setStyle(Style.STROKE);
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);
        if(shadow) 
        {
            return;
        }
        
        // 这里使用系统提供的Path,Point来画图
        Path drawingPath = new Path();
        android.graphics.Point pixelPoint = new android.graphics.Point();
        
        // 得到当前屏幕的高*宽
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        
        GeoPoint bottomRight = projection.fromPixels(width, height);
        GeoPoint topLeft = projection.fromPixels(0, 0);
        
        int maxLat = topLeft.getLatitudeE6();
        int minLat = bottomRight.getLatitudeE6();
        int minLon = topLeft.getLongitudeE6();
        int maxLon = bottomRight.getLongitudeE6();
        
        int pointsSize = points.size();
        // 之前的布点是否在屏幕中
        boolean preOutOfBounds = true;
        // 之前的布点是否是新的一段路线的开始
        boolean preWasMoveTo = true;
        int moveToLat = Integer.MAX_VALUE;
        int moveToLon = Integer.MIN_VALUE;
        
        for(int i=0; i<pointsSize; i++)
        {
            double pointLat = points.get(i).getLat();
            int pointLatInt = (int)(pointLat * 1E6);
            double pointLon = points.get(i).getLon();
            int pointLonInt = (int)(pointLon * 1E6);
            
            // 判断该点有没有超出屏幕显示的范围
            boolean currentOutOfBounds = pointLatInt < minLat || pointLatInt > maxLat ||
                    pointLonInt < minLon || pointLonInt > maxLon;
            
            // 起点或者先前节点和当前节点都在屏幕之外,将preWasMoveTo设为true‘
            // 当前坐标在屏幕外,并且之前坐标也在屏幕外,则设置preWasMoveTo为true
            if(i == 0 || (preOutOfBounds && currentOutOfBounds))
            {
                moveToLat = pointLatInt;
                moveToLon = pointLonInt;
                preWasMoveTo = true;
            } 
            else 
            {
                if(preWasMoveTo)
                {
                    GeoPoint geoPoint = new GeoPoint(moveToLat, moveToLon);
                    // 将经纬度转换为屏幕画布像素上的点(称之为布点)
                    projection.toPixels(geoPoint, pixelPoint);
                    
                    // 设置point.x, point.y为新一段路线的开始
                    drawingPath.moveTo(pixelPoint.x, pixelPoint.y);
                    preWasMoveTo = false;
                }
                GeoPoint geoPoint = new GeoPoint(pointLatInt, pointLonInt);
                projection.toPixels(geoPoint, pixelPoint);
                // 将最后的布点与该布点之间画一条线
                drawingPath.lineTo(pixelPoint.x, pixelPoint.y);
            }
            preOutOfBounds = currentOutOfBounds;
        }
        canvas.drawPath(drawingPath, paint);
    }
    
    public void setPoints(ArrayList<Point> points) {
        this.points = points;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值