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