7

我现在正在开发适用于 Android 设备的应用程序。主要功能是在地图上绘制折线,以显示城市中每条街道的交通情况。不幸的是,当我在 3K 折线周围绘制时——数量会根据屏幕尺寸和缩放级别而减少——我的地图变得异常缓慢……我没有提到绘制所有线的时间。

也许您知道在地图上标记街道或画线的更有效方法?

我也在考虑切换到 OSM,但我从未使用过它,也不知道它的效率如何。

我在三星 Galaxy Note 10.1 上调试应用程序并且应用程序使用 Map API v2

我绘制折线的代码:

Polyline line;
List<Float> coordinatesStart;
List<Float> coordinatesEnd;
LatLng start;
LatLng end;
List<List<Float>> coordinates;
int polylinesNumber = 0;
for(Features ftr : features){
    coordinates = ftr.geometry.coordinates;

    for(int i = 0; i<coordinates.size()-1; i++){

            coordinatesStart = coordinates.get(i);
            coordinatesEnd = coordinates.get(i+1);
            start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0));
            end = new LatLng(coordinatesEnd.get(1), coordinatesEnd.get(0));
            line = map.addPolyline(new PolylineOptions()
             .add(start, end)
             .width(3)
             .color(0x7F0000FF)); //semi-transparent blue
            polylinesNumber++;

    }
}

我将不胜感激任何帮助!

4

4 回答 4

5

这里有很好的优化:

您的主要错误是您为绘制到地图的每条线都使用了实例。 这使绘图非常缓慢。new PolyLineOptions

解决方案是:

仅使用折线选项的一个实例,并且仅使用.add(LatLng)循环内的函数。

    //MAGIC #1 here
    //You make only ONE instance of polylineOptions.
    //Setting width and color, points for the segments added later inside the loops.
    PolylineOptions myPolylineOptionsInstance = new PolylineOptions()
            .width(3)
            .color(0x7F0000FF);

    for (Features ftr : features) {
        coordinates = ftr.geometry.coordinates;

        for (int i = 0; i < coordinates.size(); i++) {

            coordinatesStart = coordinates.get(i);
            start = new LatLng(coordinatesStart.get(1), coordinatesStart.get(0));

            //MAGIC #2 here
            //Adding the actual point to the polyline instance.
            myPolylineOptionsInstance.add(start);

            polylinesNumber++;
        }
    }

    //MAGIC #3 here
    //Drawing, simply only once.
    line = map.addPolyline(myPolylineOptionsInstance);

注意力:

如果您想为不同的线段/部分使用不同的颜色,则必须使用多个折线选项,因为折线选项可能只有一种颜色。但是方法是一样的:尽可能少地使用 polylineOptions。

于 2016-09-21T12:15:35.230 回答
3

您是否检查您绘制的折线是否在屏幕上对用户可见?如果没有,那将是我的第一个想法。这个问题可能对此有所帮助。

于 2013-05-24T14:42:25.463 回答
2

我想插话,因为我没有找到完整的答案。如果缩小,屏幕上仍然会有大量单独的多段线,并且 UI 线程将停止运行。我使用我的点到屏幕像素的自定义TileProvider和球形墨卡托投影解决了这个问题。LatLng这个想法来自map-utils-library,它具有将画布写入图块所需的大部分工具(以及许多其他优点)。

我已经从我正在从事的项目中编写了一个示例ComplexTileOverlays 。这包括在CustomTileProvider.

我首先使用闪屏将我的自定义折线数据库加载到内存中(对于本示例,它是蒙特利尔岛上自行车设施的开放数据库)。从那里,我在代表一个瓷砖的 256x256 像素画布上绘制每条线投影。总体而言,如果您有很多图形叠加层要与地图相关联,那么这种技术会飞速发展。

于 2014-06-13T19:46:45.617 回答
2

这也可能有帮助:

http://discgolfsoftware.wordpress.com/2012/12/06/hiding-and-showing-on-screen-markers-with-google-maps-android-api-v2/

于 2013-05-24T19:57:37.527 回答