如何有效地在Google Map中绘制多条折线?

时间:2015-04-29 04:54:37

标签: android google-maps

我目前正在学习制作一款使用Google Map向用户显示数据的Android应用。目前我正在使用Polyline绘制所有"数据/行"我想在地图上显示,但我直接在Google地图上绘制,如mMap.addPolyline(...)。 (我希望我可以发布截图,但我没有至少10个声望:-()。

但是我在地图上绘制所有这些线条时遇到了一些性能问题,因为它们在那里的一个小区域(通过放大)包含500~900线。问题是,当应用程序正在绘制所有这些数据时,应用程序挂起/停止一秒钟,如冻结,然后一旦完成绘制,应用程序将继续工作。

所以我的问题是,如何在地图上绘制时,如何在没有应用程序挂起/停止的情况下顺利绘制那么多折线?例如,当地图上绘制折线时,用户可以在地图上移动吗?

我曾尝试在不同的线程中在地图上绘制Polylines,但是我得到了一个错误,例如必须在主线程上绘制(无法记住确切的异常错误)。除此之外,我还在互联网上搜索这样的例子,但我只找到了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);

    }
}

3 个答案:

答案 0 :(得分:0)

您应该使用asynclass并显示progressdialog

 private class ShowPolyLine extends
                AsyncTask<Void, Void, Void> {
    ProgressDialog pdDialog;
            @Override
            protected void onPreExecute() {
                try {
        pdDialog = new ProgressDialog(YourActivity.this);
                    pdDialog.show();
                    pdDialog.setCancelable(false);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            protected TicketTemplate doInBackground(Void... params) {
                try {
                    // show pollyline code
                } catch (Exception e) {
                    Log.d("exception", ".........................." + e);
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Void result) {

                    super.onPostExecute(result);
                     pdDialog.dismiss();




            }

        }

并将其称为ShowPolyLine().execute();

答案 1 :(得分:0)

运行获取数据以在背景线程上绘制并仅在主踏板上绘制线条,使用下面的代码我们绘制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++;

                        }   

答案 2 :(得分:0)

试试这个::

GoogleMap mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

List<Polyline> mPolylines = new ArrayList<Polyline>();
// Add polylines to the map and the list
mPolylines.add(mMap.addPolyline(polyOpts));
...
mPolylines.add(mMap.addPolyline(polyOpts));


mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    @Override
    public void onMapClick(LatLng clickCoords) {
        for (PolylineOptions polyline : mPolylines) {
            for (LatLng polyCoords : polyline.getPoints()) {
                float[] results = new float[1];
                Location.distanceBetween(clickCoords.latitude, clickCoords.longitude,
                        polyCoords.latitude, polyCoords.longitude, results);

                if (results[0] < 100) {
                    polyline.setVisible(false);
                    Log.e(TAG, "Found @ "+clickCoords.latitude+" "+clickCoords.longitude);
                    return;
                }
            }
        }
    }
});