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
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; } } 我的博客/blog/1300662


发布评论