2024年6月1日发(作者:)

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

之前我实现过一次,将每个点都遍历一边,然后在Google Map上画出来,但是由于

数据过多导致Google地图移动位置变得不流畅,每次移动Google地图都会调用draw

方法,那么程序一直遍历一直画图,花费大且不流畅。这次做了下优化,对只在屏幕内

的坐标画线。Google地图比之前流畅多了。

之前实现是画蓝色的线,这次实现只画红色的线。

临界条件是上一个点在屏幕内,下一个点在屏幕外。

运行环境:android版本2.3

Java代码

package ;

import ist;

import ;

import ;

import ;

import ;

import ;

import ;

import ;

import nt;

import w;

import y;

import tion;

import ;

public class RouteOverlay extends Overlay

{

final static String TAG = "DrawRoutePath";

private List points = new ArrayList();

private final Projection projection;

private final Paint paint;

public RouteOverlay(Projection projection) {

tion = projection;

// 设置画笔

paint = new Paint();

or();

// 画笔的粗细

okeWidth(3);

iAlias(true);

okeMiter(3);

le();

}

@Override

public void draw(Canvas canvas, MapView mapView, boolean shadow) {

(canvas, mapView, shadow);

if(shadow)

{

return;

}

// 这里使用系统提供的Path,Point来画图

Path drawingPath = new Path();

pixelPoint = new ();

// 得到当前屏幕的高*宽

int width = th();

int height = ght();

GeoPoint bottomRight = xels(width, height);

GeoPoint topLeft = xels(0, 0);

int maxLat = itudeE6();

int minLat = itudeE6();

int minLon = gitudeE6();

int maxLon = gitudeE6();

int pointsSize = ();

// 之前的布点是否在屏幕中

boolean preOutOfBounds = true;

// 之前的布点是否是新的一段路线的开始

boolean preWasMoveTo = true;

int moveToLat = _VALUE;

int moveToLon = _VALUE;

for(int i=0; i

{

double pointLat = (i).getLat();

int pointLatInt = (int)(pointLat * 1E6);

double pointLon = (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);

// 将经纬度转换为屏幕画布像素上的点(称之为布点)

ls(geoPoint, pixelPoint);

// 设置point.x, point.y为新一段路线的开始

(pixelPoint.x, pixelPoint.y);

preWasMoveTo = false;

}

GeoPoint geoPoint = new GeoPoint(pointLatInt, pointLonInt);

ls(geoPoint, pixelPoint);

// 将最后的布点与该布点之间画一条线

(pixelPoint.x, pixelPoint.y);

}

preOutOfBounds = currentOutOfBounds;

}

th(drawingPath, paint);

}

public void setPoints(ArrayList points) {

= points;

}

}

我的博客/blog/1300662