- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在学习制作一个使用 Google map 向用户显示数据的 Android 应用程序。目前我正在使用 Polyline 绘制我想在 map 上显示的所有“数据/线”,但我直接在 Google map 上绘制它,例如 mMap.addPolyline(...)。 (我希望我可以发布屏幕截图,但我没有至少 10 个声望:-( )。
但是我在 map 上绘制所有这些线时遇到了一些性能问题,因为它们在一个小区域中包含大约 500 ~ 900 条线(通过放大)。问题是,当应用程序正在绘制所有这些数据时,应用程序会挂起/停止一秒钟,就像卡住一样,然后一旦完成绘制,应用程序就会继续工作。
所以我的问题是,如何在应用程序在 map 上绘图时不挂起/停止一秒钟的情况下顺利绘制那么多折线?例如在 map 上绘制折线时用户可以在 map 上移动?
我曾尝试在不同的线程中在 map 上绘制多段线,但我收到类似必须在主线程上绘制的错误(不记得确切的异常错误)。除此之外,我还在 Internet 上搜索过这样的示例,但我只找到了带有 Overlay 或 ItemizedOverlay 东西的示例,但据我所知这些已被弃用。还有其他选择吗?你能给我一些例子或指导我找到正确的资源吗?向我展示一些代码会很有帮助。
谢谢
更新:忘了在这里包含我的代码,这里是我绘制多段线的代码:
private class LoadDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Show a message saying this app is fetching data
Toast.makeText(mMainActivity,
"Fetching data ...",
Toast.LENGTH_SHORT)
.show();
}
@Override
protected Void doInBackground(String... urls) {
// Load then read the data from a url in the background
loadData();
readData();
return null;
}
@Override
protected void onPostExecute(Void unused) {
// draw lines here
PolylineOptions lineOptions = new PolylineOptions()
.add(new LatLng(locations[0].getLatitude(), locations[0].getLongitude()))
.add(new LatLng(locations[1].getLatitude(), locations[1].getLongitude()))
.color(Color.GREEN)
.width(5f);
Polyline polyline = mMap.addPolyline(lineOptions);
lineList.add(polyline);
}
}
最佳答案
运行获取数据以在后台线程上绘制并仅在主线程上绘制线条,使用以下代码我们绘制 3000 条线条
Set<String> routeNames=cordinatePojos.keySet();
arrayList=new ArrayList<String>();
arrayList.addAll(routeNames);
iterator=routeNames.iterator();
color[0]=Color.BLUE;
color[1]=Color.GREEN;
color[2]=Color.RED;
color[3]=Color.CYAN;
conuter=0;
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (iterator.hasNext()) {
latLngs = cordinatePojos.get(iterator.next());
sortLocations(latLngs, latLngs.get(0).latitude, latLngs.get(0).longitude);
Log.d("test on background======",""+latLngs.get(0)+"======"+conuter);
final PolylineOptions polyLineOptions = new PolylineOptions();
polyLineOptions.addAll(latLngs);
polyLineOptions.width(15-i-i);
polyLineOptions.color(color[i]);
float[] result1 = new float[3];
android.location.Location.distanceBetween(latLngs.get(0).latitude,latLngs.get(0).longitude, latLngs.get(latLngs.size()-1).latitude, latLngs.get(latLngs.size()-1).longitude, result1);
Float distance1 = result1[0];
totalDistance=totalDistance+distance1;
// final MarkerOptions markerOptions=new MarkerOptions().position(latLngs.get(0)).title(arrayList.get(conuter)+"==distance between this road is "+ distance1/1000 + " Km");
// final MarkerOptions lastMarkerOptions=new MarkerOptions().position(latLngs.get(latLngs.size()-1)).title(arrayList.get(conuter)+"==distance between this road is "+distance1/1000+ " Km");
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
/*googleMap.addMarker(markerOptions);
googleMap.addMarker(lastMarkerOptions);*/
googleMap.addPolyline(polyLineOptions);
if (i>2) {
i=0;
}
i++;
}
});
if (conuter>3000) {
break;
}
conuter++;
}
关于android - 如何高效地在谷歌地图中绘制多条折线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934678/
leaflet:一个开源并且对移动端友好的交互式地图 JavaScript 库 中文文档: https://leafletjs.cn/reference.html 官网(英文): ht
我是一名优秀的程序员,十分优秀!