我正在开发Android设备的应用程序。主要功能是在地图上绘制折线,以显示每条街道上城市的交通量。不幸的是,当我绘制3K折线时 - 根据屏幕尺寸和缩放级别减少数量 - 我的地图变得非常慢......我没有提到绘制所有线条的时间。
也许您知道在地图上标记街道或绘制线条的更有效方法吗?
我也在考虑切换到OSM,但我从未使用它,我不知道它的效率如何。
我在Samsung Galaxy Note 10.1上调试应用程序,App使用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++;
}
}
我将不胜感激任何帮助!
答案 0 :(得分:5)
您的主要错误是您使用 new PolyLineOptions
实例为您绘制到地图的每一行。这会使绘图速度非常慢。< / p>
解决方案是:
仅使用折线选项的一个实例,并仅在循环内使用.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);
注意:
如果您希望为不同的线段/截面设置不同的颜色,则必须使用多个折线选项,因为折线选项只能有1种颜色。但方法是相同的:尽可能少使用polylineOptions。
答案 1 :(得分:3)
您是否检查您绘制的折线是否在屏幕上对用户可见?如果没有,那将是我的第一个想法。 This question可能对此有所帮助。
答案 2 :(得分:2)
答案 3 :(得分:2)
我想谈谈这个,因为我没有找到完整的答案。如果你缩小,你将在屏幕上仍然有大量单独的折线,UI线程将停止。我使用自定义TileProvider
和我LatLng
的球形墨卡托投影指向屏幕像素来解决此问题。这个想法来自map-utils-library,它拥有将画布写入图块所需的大部分工具(以及许多其他好处)。
我已经从我正在处理的项目中编写了一个示例ComplexTileOverlays。这包括在CustomTileProvider
中更改Alpha和线条粗细的方法。
我首先使用闪屏将我的折线自定义数据库加载到内存中(对于这个例子,它是蒙特利尔岛上自行车设施的开放数据库)。从那里,我在画布256x256像素画布上绘制每个线投影,代表一个瓷砖。总的来说,如果您有大量的图形叠加层与地图相关联,这种技术可以实现跨越式发展。