我正在尝试解决从大量(100k+)GeoPoints 集到 Android 上的 MapView 的路径绘制问题。首先我想说,我通过 StackOverflow 搜索了很多,但没有找到答案。我的代码的瓶颈实际上不是画到画布中,而是Projection.toPixels(GeoPoint, Point)
或者Rect.contains(point.x, point.y)
方法..我正在跳过屏幕上不可见的点,并且根据当前的缩放级别仅显示每第 n 个点。当地图放大时,我想显示尽可能准确的路径,所以我跳过零(或接近零)点,这样在找到可见点时,我需要为集合中的每个点调用投影方法。这才是真正需要花费大量时间的原因(不是几秒钟,但地图平移并不流畅,而且我没有在 HTC Wildfire 上对其进行测试:))。我尝试缓存计算点,但由于在每次地图平移/缩放后重新计算点,它根本没有帮助。
我考虑过使用某种修剪和搜索算法而不是迭代数组,但我发现输入数据没有排序(我不能丢弃堆叠在两个不可见点之间的任何分支)。我可以在一开始用简单的排序来解决这个问题,但我仍然不确定即使是getProjection()
和Rect.contains(point.x, point.y)
调用的对数计数而不是线性也能解决性能问题。
贝娄是我当前的代码。如果你知道如何使它变得更好,请帮助我。非常感谢!
public void drawPath(MapView mv, Canvas canvas) {
displayed = false;
tmpPath.reset();
int zoomLevel = mapView.getZoomLevel();
int skippedPoints = (int) Math.pow(2, (Math.max((19 - zoomLevel), 0)));
int mPointsSize = mPoints.size();
int mPointsLastIndex = mPointsSize - 1;
int stop = mPointsLastIndex - skippedPoints;
mapView.getDrawingRect(currentMapBoundsRect);
Projection projection = mv.getProjection();
for (int i = 0; i < mPointsSize; i += skippedPoints) {
if (i > stop) {
break;
}
//HERE IS THE PROBLEM I THINK - THIS METHOD AND THE IF CONDITION BELOW
projection.toPixels(mPoints.get(i), point);
if (currentMapBoundsRect.contains(point.x, point.y)) {
if (!displayed) {
Point tmpPoint = new Point();
projection.toPixels(mPoints.get(Math.max(i - 1, 0)),
tmpPoint);
tmpPath.moveTo(tmpPoint.x, tmpPoint.y);
tmpPath.lineTo(point.x, point.y);
displayed = true;
} else {
tmpPath.lineTo(point.x, point.y);
}
} else if (displayed) {
tmpPath.lineTo(point.x, point.y);
displayed = false;
}
}
canvas.drawPath(tmpPath, this.pathPaint);
}