android - 如何防止折线在谷歌地图android中重叠?

标签 android google-maps google-polyline

大家好,这可能是一个愚蠢的问题,但到目前为止我还没有找到任何解决方案。现在让我问一下我的疑问,我使用多条折线来绘制多条路线,每条折线都有不同的颜色,但是当两点相交时,最后一条折线会被覆盖,如何防止它发生。它的外观必须是只有第一条路线应该有一种颜色,所有其他路线必须有相同的颜色如何做到这一点让我发布我迄今为止尝试过的代码:

  public class GetDistance extends AsyncTask<Double, Void, String> {
            private ProgressDialog pd;
            private static final int READ_TIMEOUT = 6000;
            private static final int CONNECTION_TIMEOUT = 6000;
            private int flag;
            public GetDistance(int flag) {
                this.flag=flag;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pd = new ProgressDialog(VisitTravel.this);
                pd.setMessage("Please wait");
                pd.show();
            }



            @Override
            protected String doInBackground(Double... strings) {
                URL url;
                try {
                    url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + strings[0] + "," + strings[1] + "&destination=" + strings[2] + "," + strings[3] + "&sensor=false&units=metric&mode=driving&alternatives=true");

                    HttpURLConnection conn;
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setReadTimeout(READ_TIMEOUT);
                    conn.setConnectTimeout(CONNECTION_TIMEOUT);


                    conn.setRequestMethod("POST");

                    InputStream in;

                    in = new BufferedInputStream(conn.getInputStream());

                    StringBuilder buffer = new StringBuilder();
                    BufferedReader reader;
                    reader = new BufferedReader(new InputStreamReader(in));
                    String inputLine;
                    while ((inputLine = reader.readLine()) != null)
                        buffer.append(inputLine).append("\n");
                    if (buffer.length() == 0) {
                        // Stream was empty. No point in parsing.
                        Log.e("empty", "empty");
                    }
                    JsonResponse = buffer.toString();
                    Log.d("response", JsonResponse);


                } catch (IOException e1) {
                    e1.printStackTrace();
                }


                return JsonResponse;
            }
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                pd.dismiss();
                if(flag==1) {
                    new ParserTask().execute(result);
                }}

        }
       private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
            private ArrayList<LatLng> points;

            @Override
            protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

                JSONObject jObject;
                List<List<HashMap<String, String>>> routes = null;

                try {
                    jObject = new JSONObject(jsonData[0]);
                    DirectionJSONParser parser = new DirectionJSONParser();

                    // Starts parsing data
                    routes = parser.parse(jObject);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return routes;
            }

            @Override
            protected void onPostExecute(List<List<HashMap<String, String>>> result) {
                PolylineOptions polylineOptionss=null;
                //      MarkerOptions markerOptions = new MarkerOptions();
                 // Traversing through all the routes
                for (int i = 0; i < result.size(); i++) {
                    points = new ArrayList<>();


                    // Fetching i-th route
                    List<HashMap<String, String>> path = result.get(i);

                    // Fetching all the points in i-th route
                    for (int j = 0; j < path.size(); j++) {
                        HashMap<String, String> point = path.get(j);

                    if (j == 0) {
                          duration = point.get("duration");
                           Log.d("duration", duration);
                           continue;
                      }
                        double lat = Double.parseDouble(point.get("lat"));
                        double lng = Double.parseDouble(point.get("lng"));
                        LatLng position = new LatLng(lat, lng);

                        points.add(position);

                    }
                     polylineOptionss=new PolylineOptions();
                    // Adding all the points in the route to LineOptions
                    polylineOptionss.addAll(points);
                  //  polylineOptions.width(7);
               //     Random rnd = new Random();
                 //   int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
                    if(i==0) {
                          polylineOptions0=new PolylineOptions();
                        polylineOptions0.addAll(points);
                     //   mGoogleMap.setTrafficEnabled(true);
                        polylineOptions0.width(15);
                           polylineOptions0.color(Color.parseColor("#9c27b0"));
                        polylineOptions0.geodesic(true);
                      Polyline polyline=  mGoogleMap.addPolyline(polylineOptions0);
                        polyline.setTag(duration);
                        polyline.setClickable(true);

                    }
//Here only differentiating each and every route.
                    else if(i==1){
                          polylineOptions1=new PolylineOptions();
                        polylineOptions1.addAll(points);
                        polylineOptions1.geodesic(true);
                        polylineOptions1.width(15);
                     //   mGoogleMap.setTrafficEnabled(true);
                        polylineOptions1.color(Color.parseColor("#9e9e9e"));
                        Polyline polyline=  mGoogleMap.addPolyline(polylineOptions1);
                        polyline.setTag(duration);
                        polyline.setClickable(true);

                    ///
                    }
                    else if(i==2){
                            polylineOptions2=new PolylineOptions();
                        polylineOptions2.addAll(points);
                        polylineOptions2.geodesic(true);
                        polylineOptions2.width(15);
                        polylineOptions2.color(Color.parseColor("#9c27b0"));
                        Polyline polyline=  mGoogleMap.addPolyline(polylineOptions2);
                        polyline.setTag(duration);
                        polyline.setClickable(true);
                        //     mGoogleMap.setTrafficEnabled(true);
                   //
                    }
                    else {
                          polylineOptions3=new PolylineOptions();
                        polylineOptions3.addAll(points);
                  //      mGoogleMap.setTrafficEnabled(true);
                        polylineOptions3.width(15);
                        polylineOptions3.geodesic(true);
                        polylineOptions3.color(Color.parseColor("#9e9e9e"));
                        Polyline polyline=  mGoogleMap.addPolyline(polylineOptions3);
                        polyline.setTag(duration);
                        polyline.setClickable(true);
                        ///     polylineOptions3.color(Color.parseColor("#ffffff"));
                    }

                }
                setBottomSheet(jsonresponse, edt.getText().toString(),1);
                CameraAnimation(polylineOptionss);
              //  mGoogleMap.addPolyline(polylineOptions);
                // Drawing polyline in the Google Map for the i-th route



            }
        }

如何从开始到结束用一种颜色绘制第一条路线,然后用其他颜色绘制剩余路线。预先感谢!

最佳答案

使用折线的 Z-Index 变量并使用 Polylineclick 监听器更改折线的 z-index。意味着每当您单击任何行时,其 z-index 将增加,而其他行的 z-index 将减少,以便您单击的行将始终覆盖其他行。请参阅随附的代码以获取帮助。

Z 索引 此图 block 叠加层相对于其他叠加层(包括 GroundOverlays、TileOverlays、Circles 和 Polygons 但不包括 Markers)的绘制顺序。具有较大 z 索引的叠加层将绘制在具有较小 z 索引的叠加层之上。具有相同 z-index 的叠加顺序是任意的。默认 zIndex 为 0。

            final List<Polyline> polylines = new ArrayList<>();

            for(int i= 0; i<paths.size(); i++ ){
                polylines.add(mMap.addPolyline(paths.get(i)));
            }

            mMap.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
                @Override
                public void onPolylineClick(Polyline polyline) {



                    for(int i= 0; i<polylines.size(); i++ ){

                        polylines.get(i).setColor(Color.argb(255,187,189,191));
                        polylines.get(i).setZIndex(0);
                    }


                    polyline.setColor(Color.argb(255,102,157,246));
                    polyline.setZIndex(2);



                }
            });

关于android - 如何防止折线在谷歌地图android中重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44757424/

相关文章:

java - InputStreamReader.read() 'not' 是如何读取已经读取的缓冲区的?

android - 调试 : file not found in Android 1. 0

javascript - 如何删除谷歌地图控件

android - 谷歌地图实用程序中集群的背景渲染

android - 我想从数据库中获取数据并将其显示在 ListView 上。

android - 应用程式在特定的Android版本中当机

javascript - 使用 GoogleAPI JS 呈现路线

android - 如何获得位置的经纬度点击折线?

algorithm - Google map 编码折线算法格式背后的设计决策是什么?

google-maps-api-3 - Google maps api v3 上标记的多条折线