首页 文章

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

提问于
浏览
2

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

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

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

我试图在不同的线程中在 Map 上绘制Polylines,但是我得到了一个错误,就像必须在主线程上绘制一样(不记得确切的Exception错误) . 除此之外,我还在互联网上搜索这样的例子,但我只找到了Overlay或ItemizedOverlay的例子,但据我所知,这些都被弃用了 . 这样做还有其他选择吗?你能告诉我一些例子或指导我找到合适的资源吗?向我展示一些代码将非常有帮助 .

谢谢

Update: 忘了在这里包含我的代码,这里是我绘制折线的代码:

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

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

相关问题