Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android谷歌地图中绘制4K多段线_Java_Android_Google Maps Android Api 2_Performance - Fatal编程技术网

Java 在android谷歌地图中绘制4K多段线

Java 在android谷歌地图中绘制4K多段线,java,android,google-maps-android-api-2,performance,Java,Android,Google Maps Android Api 2,Performance,我现在正在为Android设备开发一个应用程序。主要功能是在地图上绘制多段线,以显示城市每条街道上的交通量。不幸的是,当我画出3K左右的多段线时——数字会根据屏幕大小和缩放级别而减少——我的地图变得非常慢。。。我没有提到画所有线条的时间 也许你们知道在地图上标记街道或画线的更有效的方法 我也在考虑切换到OSM,但我从未使用过它,我不知道它有多高效 我在三星Galaxy Note 10.1上调试应用程序,应用程序使用Map API v2 绘制多段线的代码: Polyline line; List&

我现在正在为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++;

    }
}
多段线;
列表协调开始;
列表协调发送;
车床起动;
板条端;
列出坐标;
int多段线数=0;
功能(ftr:功能){
坐标=ftr.geometry.coordinates;

对于(int i=0;i您是否检查您绘制的多段线是否在屏幕上对用户可见?如果不可见,这将是我的第一个想法。这可能会有所帮助。

这也可能会有所帮助:


我想插话,因为我没有找到完整的答案。如果缩小屏幕,屏幕上仍会有大量单独的多段线,UI线程将停止。我使用自定义的
TileProvider
LatLng
指向屏幕pix的球形墨卡托投影解决了这个问题这个想法来自于,它拥有将画布写入平铺所需的大部分工具(以及许多其他细节)

我在一个项目中编写了一个示例,其中包括在
CustomTileProvider
中更改alpha和线条厚度的方法

我首先使用splashscreen将我的自定义多段线数据库加载到内存中(例如,它是Montréal岛上自行车设施的开放数据库)。从那里,我在画布上绘制每一条线投影,该画布为256x256像素,代表一个瓷砖。总体而言,如果您有大量图形叠加要与地图连接,则此技术的速度会大大加快。

此处的优化效果非常好: 您的主要错误是,对绘制到地图的每条线都使用了
新的多段线选项
实例。这会使绘制速度非常慢

解决办法是:

仅使用多段线选项的一个实例,并在循环内仅使用
.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);
//MAGIC#1在这里
//仅创建一个polylineOptions实例。
//为稍后添加到循环中的线段设置宽度和颜色、点。
PolylineOptions MyPolylineOptions实例=新的PolylineOptions()
.宽度(3)
.颜色(0x7F0000FF);
功能(ftr:功能){
坐标=ftr.geometry.coordinates;
对于(int i=0;i
注意:


如果要为不同的线段/剖面使用不同的颜色,则必须使用多个多段线选项,因为多段线选项只能有一种颜色。但方法相同:尽可能少地使用多段线选项。

尝试使用不太浪费的数据结构,例如,列表可以是列表。并尝试共享对象在可能的情况下(每条线都需要自己的PolylineOptions()?一个就足够了吗?)。因为我假设这个解决方案只会提高绘制时间。当已经绘制线时,地图的响应性如何?不幸的是,对于每条线,我将从3种颜色中选择一种,这就是我需要PolylineOptions()的原因…多段线在屏幕上是可见的,这不是问题所在。我想知道你如何处理多段线的数千个端点,那么用户将无法使用如此多的信息进行任何操作。也许你可以发布一张地图“正在运行”的屏幕截图?问题是,当我要标记街道时,我必须将线切成小块,以形成曲线和线条所以,这就是为什么有这么多元素。这里你可以看到正在工作的web应用程序:这是我在Android上的应用程序:你可以看到只有很少的街道被标记,而且已经有大约3000行了。我认为你不需要数千条多段线来正确显示这些街道。我会尝试大幅降低街道的精度,例如。如果街道由500个点(以及它们之间的多段线)组成,只需每隔5或10点进行一次,然后绘制多段线。当用户放大时,您仍然可以更精确地重新绘制街道。感谢各位的回答。我正在考虑按照您的建议改进算法,但我想问,可能有人对解决此问题有不同的想法。再次感谢您的帮助!这完全是正确的解决了我的问题。在我花了大约20秒来绘制大的多段线之前,现在它还不到一秒。当缩放改变时,多段线消失了。有修复方法吗?@Rishabh Srivastava我想你是无意中删除了它们吧?