Android Google地图API v2上的多段线性能问题

Android Google地图API v2上的多段线性能问题,android,google-maps,google-maps-android-api-2,android-maps-v2,mapfragment,Android,Google Maps,Google Maps Android Api 2,Android Maps V2,Mapfragment,我正在为android编写一个应用程序,在这个程序中,我必须表示某些街区的正面。为此,我为每个相关的块立面绘制了一条多段线(非常简单的多段线,实际上是两条点线…) 最坏情况下,可能会有多达100k条多段线 我的问题是,我正在运行大约3000行的测试,它已经非常慢了。我在显示数据方面没有问题,在绘制线条方面也没有问题,但是当绘制超过1k条线条时,地图会变得滞后 我为每条多段线创建一个多段线选项,然后绘制它并将其存储在如下变量中: PolylineOptions options = new Poly

我正在为android编写一个应用程序,在这个程序中,我必须表示某些街区的正面。为此,我为每个相关的块立面绘制了一条多段线(非常简单的多段线,实际上是两条点线…)

最坏情况下,可能会有多达100k条多段线

我的问题是,我正在运行大约3000行的测试,它已经非常慢了。我在显示数据方面没有问题,在绘制线条方面也没有问题,但是当绘制超过1k条线条时,地图会变得滞后

我为每条多段线创建一个多段线选项,然后绘制它并将其存储在如下变量中:

PolylineOptions options = new PolylineOptions();
options.add(latlon1, latlon2);
options.width(5);
options.color(Color.RED);
Polyline myPolyline = map.addPolyline(options);
myPolyline.setVisible(true);
myPolylines.add(myPolyline);
我试着不存储它们(虽然这对于以后的处理是必要的),以防内存问题,但没有起到任何作用。。。此外,当存储它们时,应用程序的其余部分工作流畅(一些额外的按钮/文本字段),只是地图变慢(移动/缩放时)

哦,我使用的是谷歌地图api v2的mapfragment类

因此,问题是:有没有任何方法可以提高map性能

提前谢谢

编辑:多段线一次全部可见。为了避免绘制不必要的线条,我添加了“上一步”,在这一步中,我用填充颜色(绿色到红色)绘制代表立面数量的圆圈,并且仅在选中圆圈且用户要求查看详细视图时才显示线条


EDIT2:以下是我试图实现的目标(它来自mapguide地图,但我尝试在android上复制)

而不是一次绘制所有内容,只绘制您可以看到的内容

所以你可以得到可视地图的边界

VisibleRegion vr = map.getProjection().getVisibleRegion();
bounds = vr.latLngBounds;
然后检查线是否在可见区域的边界内,然后绘制线

这样做将允许您在asynctask中运行代码,您可以在需要时使用处理程序回调主线程以绘制线


您还必须覆盖
onCameraChange
,以了解可视区域何时更改,即您对地图进行模式设置。使用此方法还需要做其他事情,例如跟踪是否绘制了一条直线,这样就不会多次绘制同一条直线

我正在使用asynctask创建每个坐标为50的多段线选项,在publishprogress方法中,我将多段线添加到地图中。如果它确实运行得太长,但没有,我仍然有一个progressdialog,用户可以使用“后退”按钮取消任务。我最大的测试是从sqllite数据库中获取3000个坐标。但是,如果使用“每个多段线两个坐标”选项,则调用publishprogress会使代码陷入困境,因此您必须将几十条两个坐标的多段线堆叠起来,然后在publishprogress方法中将它们添加到地图中。PublishProgress需要一个数组,因此传入50个多段线选项并不困难。在使用每条多段线50个坐标进行调试时,可以看到正在地图上绘制的多段线。在实时模式下,多段线只需在大约一秒钟内出现在我便宜的50美元测试手机上

注意:我将所有AsyncTask作为单独的.java文件来执行,这样我就可以在构造函数中传入我需要的任何内容,因此我有相同的cancelMe()代码。我使用的大部分代码都在下面,我省略了数据库的内容,因为它对每个人都是不同的

public class TaskParseKmldb extends AsyncTask<KmlSummary, PolylineOptions, Boolean>
        implements OnCancelListener {

public interface TaskParseKmldbCallback {
    void onTaskParseKmldbComplete(boolean success);
}


public TaskParseKmldb(Activity activity, KmlSummary kmlSummary, GoogleMap mMap,
            ProgressDialog pd) {
    this.activity = activity;
    this.kmlSummary = kmlSummary;
    this.mMap = mMap;
    this.pd = pd;
    // determine if calling activity has implemented the callback interface
    callback = (TaskParseKmldbCallback.class.isAssignableFrom(activity
.getClass())) ? (TaskParseKmldbCallback) activity : null;   
    }
。。。在doInBackground的某个地方

if (progress.getPoints().size() > 0) {
                publishProgress(progress);
                ret = true;
            }


protected void onProgressUpdate(PolylineOptions... progress) {
        if (isCancelled()) {
            return;
        }
        if (progress[0] != null) {
            // add the poly line to the map
            // save the polyline returned by the map for later use
            polylines.add(mMap.addPolyline(progress[0]));
        }
    }


如果多段线不变,我将在背景平铺上绘制它们,而不是使用“地图”多段线功能


有关如何基于板条坐标将形状绘制为平铺的示例,请参见我对

所有多段线是否同时可见的回答?如果没有,只需绘制地图区域中可见的线。是的,多段线一次全部可见。我甚至还添加了一个“上一步”,在这一步中,我用填充颜色(绿色到红色)绘制代表立面数量的圆圈,并且仅在选中圆圈且用户要求查看详细视图时显示线条。您需要进行聚类。遗憾的是,线条一次全部可见。在我的测试数据集上,线的最小相关部分约为500,在最坏的情况下可能约为10000。此外,可能有理由分析更大的区域,因此在我的测试集中需要大约3000行,在危机中需要大约50000行…是的,这就是为什么你看到了滞后,只绘制在那个时间点上可见的东西,它会更快,但它们都是可见的,并且需要。。。即使是绘制非常(相对)小的数据集部分(7000个数据集中有1000个),它也会滞后。谢谢你的回复!不,它们不需要是,当地图移动时,你检查是否有需要绘制的新线。你100%不需要绘制每一行OK,所以看一下图像,我明白你的意思,实际上你最好的选择是将其转换为图像,并使用
平铺覆盖
,因为无法防止UI延迟。也许可以尝试从更高的缩放级别开始,而不是一次显示所有内容,当用户将图片放大这么多时,可以显示更多内容,这样会更加高效。我在内存填充时出现了一些错误,随机情况下,磁贴不会显示,但这可能是我的编码,因为我刚刚尝试过它,我将进一步测试它。再次感谢。你必须非常小心线程安全。瓷砖在多个线程中同时创建。有些图块没有显示,这可能指向这个方向。起初我创建了太多的提供程序(因为数据按组划分,我为每个组创建了一个提供程序),现在我回去在图块上一次绘制所有内容,到目前为止没有问题,而且非常平滑。我现在要重写我的ontap,因为覆盖层似乎阻止了它。再次感谢,你的代码非常有用。别提ontap,我这边的版本有误,它不会阻止触摸事件。谢谢。@Chess如果可能的话,你能分享结果代码吗?谢谢,但我的问题不是加载行,而是加载后的性能
if (progress.getPoints().size() > 0) {
                publishProgress(progress);
                ret = true;
            }


protected void onProgressUpdate(PolylineOptions... progress) {
        if (isCancelled()) {
            return;
        }
        if (progress[0] != null) {
            // add the poly line to the map
            // save the polyline returned by the map for later use
            polylines.add(mMap.addPolyline(progress[0]));
        }
    }
@Override
protected void onPostExecute(Boolean result) {

    if (pd != null) {
        pd.dismiss();
        pd = null;
    }