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

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

[img]http://dl.iteye.com/upload/attachment/603597/55118f70-7239-3635-9243-4f247f9d55a3.png[/img]

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


[b]运行环境:android版本2.3[/b]

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 points = new ArrayList();

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 {
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 points) {
this.points = points;
}
}

更多相关文章

  1. Android(安卓)View体系(一)视图坐标系
  2. Android(安卓)TV开发总结【适配】
  3. Android(安卓)View 随手指移动
  4. Android(安卓)坐标系与视图坐标系图解
  5. Android(安卓)终极屏幕适配方案
  6. Android(安卓)1.6 支持更多的屏幕大小和分辨率
  7. 移动APP测试-Android屏幕适配问题(一)
  8. Android坐标的简单方法介绍
  9. Android仿百度外卖自定义下拉刷新效果

随机推荐

  1. 一口气说穿数据中台-给你架构师的视角
  2. 一个数据工作者的自白
  3. 互联网保险的疯狂试探-互助宝的骚操作
  4. hive的join优化
  5. 上万字详解Spark Core(建议收藏)
  6. 都 9102 了,你还不知道 System.out.printl
  7. 值得珍藏!从技术运营中台建设到 AIOps 实
  8. JSON 与 JSONB
  9. 鸿蒙 OS 发布第一天就被人嘲笑了
  10. 设计模式系列,原型模式