6

Dobrze, więc aktualnie używam interfejsu Google Directions API w mojej aplikacji, aby pobrać trasę między dwiema lokalizacjami.Podświetl określoną trasę w Google Maps v2 Android

Po wysłaniu zapytania o trasę, uzyskuję szereg informacji w JSON dotyczących trasy, w tym nazwy wszystkich dróg wzdłuż trasy, odpowiadających im współrzędnych początkowych i końcowych oraz ich polilinii. wartość.

Na przykład: Jeśli wyślę żądanie http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false między dwiema drogami, otrzymam następującą odpowiedź JSON (wyjście dla jednej drogi wzdłuż trasy).

{ 
        "distance" : { 
         "text" : "0.2 km", 
         "value" : 203 
        }, 
        "duration" : { 
         "text" : "1 min", 
         "value" : 18 
        }, 
        "end_location" : { 
         "lat" : 53.435250, 
         "lng" : -6.132140000000001 
        }, 
        "html_instructions" : "Head \u003cb\u003eeast\u003c/b\u003e on \u003cb\u003eRedfern Ave.\u003c/b\u003e toward \u003cb\u003eMartello Court\u003c/b\u003e", 
        **"polyline" : { 
         "points" : "[email protected]}DOkDQqF"** 
        }, 

Dotychczas moja aplikacja przetwarza te informacje i po prostu wymienia drogi i kierunki na liście widok jak to:

enter image description here

Co chcę zrobić, to zaznaczyć całą drogę od A do B na mapie, jednak nie znalazłem nic przydatnego w Internecie, jak to zrobić w nowym Google Maps API v2. Widzę, że polilinie są używane zamiast nakładek do rysowania linii w Google Maps v2, jednak z tego co wiem, rysują tylko proste linie, które są dla mnie bezużyteczne. Czy mimo to podświetlam trasę, korzystając z informacji, które mam do dyspozycji (nazwy dróg, początek & koniec współrzędnych długich, punkty polilinii? Każda pomoc jest mile widziana

Widzę też polilinię "wartość w odpowiedzi, które mogą być przydatne, ale nie mogę dowiedzieć się, jak analizować i wykorzystywać ten bit informacji. czy ktoś wie jak mogę zrozumieć sens tej wartości wykreślić łamaną?

**"polyline" : { 
      "points" : "[email protected]}DOkDQqF"** 

EDIT : Mój kod rozwiązania znajduje się w mojej odpowiedzi poniżej:

Odpowiedz

34

W końcu udało mi się uruchomić go po wielu próbach i błędach! Teraz w pełni podświetla określoną trasę od A do B na mapie (jak widać na moim zrzucie poniżej). Wrzuciłem też kod do każdego, kto może go potrzebować w przyszłości.

enter image description here

public class PolyMap extends Activity { 
     ProgressDialog pDialog; 
     GoogleMap map; 
     List<LatLng> polyz; 
     JSONArray array; 
     static final LatLng DUBLIN = new LatLng(53.344103999999990000, 
       -6.267493699999932000); 

     @SuppressLint("NewApi") 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.map_layout); 
      map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 
      map.moveCamera(CameraUpdateFactory.newLatLngZoom(DUBLIN, 15)); 
      map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 
      new GetDirection().execute(); 
     } 

     class GetDirection extends AsyncTask<String, String, String> { 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       pDialog = new ProgressDialog(PolyMap.this); 
       pDialog.setMessage("Loading route. Please wait..."); 
       pDialog.setIndeterminate(false); 
       pDialog.setCancelable(false); 
       pDialog.show(); 
      } 

      protected String doInBackground(String... args) { 
       Intent i = getIntent(); 
       String startLocation = i.getStringExtra("startLoc"); 
       String endLocation = i.getStringExtra("endLoc"); 
          startLocation = startLocation.replace(" ", "+"); 
        endLocation = endLocation.replace(" ", "+");; 
       String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + startLocation + ",+dublin&destination=" + endLocation + ",+dublin&sensor=false"; 
       StringBuilder response = new StringBuilder(); 
       try { 
        URL url = new URL(stringUrl); 
        HttpURLConnection httpconn = (HttpURLConnection) url 
          .openConnection(); 
        if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
         BufferedReader input = new BufferedReader(
           new InputStreamReader(httpconn.getInputStream()), 
           8192); 
         String strLine = null; 

         while ((strLine = input.readLine()) != null) { 
          response.append(strLine); 
         } 
         input.close(); 
        } 

        String jsonOutput = response.toString(); 

        JSONObject jsonObject = new JSONObject(jsonOutput); 

        // routesArray contains ALL routes 
        JSONArray routesArray = jsonObject.getJSONArray("routes"); 
        // Grab the first route 
        JSONObject route = routesArray.getJSONObject(0); 

        JSONObject poly = route.getJSONObject("overview_polyline"); 
        String polyline = poly.getString("points"); 
        polyz = decodePoly(polyline); 

       } catch (Exception e) { 

       } 

       return null; 

      } 

      protected void onPostExecute(String file_url) { 

       for (int i = 0; i < polyz.size() - 1; i++) { 
        LatLng src = polyz.get(i); 
        LatLng dest = polyz.get(i + 1); 
        Polyline line = map.addPolyline(new PolylineOptions() 
          .add(new LatLng(src.latitude, src.longitude), 
            new LatLng(dest.latitude,    dest.longitude)) 
          .width(2).color(Color.RED).geodesic(true)); 

       } 
       pDialog.dismiss(); 

      } 
     } 

     /* Method to decode polyline points */ 
     private List<LatLng> decodePoly(String encoded) { 

      List<LatLng> poly = new ArrayList<LatLng>(); 
      int index = 0, len = encoded.length(); 
      int lat = 0, lng = 0; 

      while (index < len) { 
       int b, shift = 0, result = 0; 
       do { 
        b = encoded.charAt(index++) - 63; 
        result |= (b & 0x1f) << shift; 
        shift += 5; 
       } while (b >= 0x20); 
       int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
       lat += dlat; 

       shift = 0; 
       result = 0; 
       do { 
        b = encoded.charAt(index++) - 63; 
        result |= (b & 0x1f) << shift; 
        shift += 5; 
       } while (b >= 0x20); 
       int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
       lng += dlng; 

       LatLng p = new LatLng((((double) lat/1E5)), 
         (((double) lng/1E5))); 
       poly.add(p); 
      } 

      return poly; 
     } 
    } 
+1

To mi bardzo pomaga. dzięki. Musisz rozważyć zapisanie linii polilinii w tablicy, jeśli chcesz ponownie użyć tej samej mapy, dzięki czemu możesz usunąć linie z tej mapy. –

+0

Cóż, jest częstość występowania, dosłownie spędziłem wiele godzin, próbując dowiedzieć się, dlaczego line.remove() nie działa. Dzięki! –

+0

Dzięki za dołączenie kodu :) –

2

Z api 2 mapy Androida, należy użyć Polyline klasa, aby narysować trasę na mapie (przynajmniej jest to najprostszy sposób :)). To, co musisz zrobić, to dostarczyć listę punktów na swojej trasie.

chodzi o podkreślenie aktywnej trasy - jest poręczny interfejs w Polyline klasy setColor, dzięki czemu można ustawić niezależnie od koloru chcesz aktywnej trasy (łącznie z kanałem alfa)

Polyline line1 = map.addPolyline(new PolylineOptions() 
.add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) 
.width(5) 
.color(0xFFFF0000)); //non transparent red 

Polyline line2 = map.addPolyline(new PolylineOptions() 
.add(new LatLng(51.5, -0.1), new LatLng(40.8, -74.2)) 
.width(5) 
.color(0x7F0000FF)); //semi-transparent blue 

Uwaga jesteś dowolnie zmieniać kolor łamaną kiedy tylko chcesz (fI po kliknięciu przez użytkownika, lub coś)

chodzi o odpowiedzi JSON od Google - punkty trasy są kodowane, więc można odnieść do this question zrozumieć, jak odkodować to

+0

Dobrze, jeśli droga ma 10 punktów w nim, polilinia wyciągnie 10 (aktualnie 9) proste linie połączone ze sobą .. Ile punktów Twoja trasa ma i jakie są rzeczywiste współrzędne tych punktów - ta informacja jest zakodowana w polu 'points'. –

+0

Gotowy do pracy: D Dzięki! –

1

Istnieje proste rozwiązanie

dodać bibliotekę

kompilacji „com.google.maps.android:android-maps-utils:0.4+”

referencyjnyhttps://developers.google.com/maps/documentation/android-api/utility/setup

//Getting the points String from response of NavigationAPI call 
String polyz=routeSteps.get(0).getOverview_polyline().getPoints(); 
//Decoding the LatLng Points using PolyUtil Class used from above Library 
List<LatLng> points=PolyUtil.decode(polyz); 
polyline.addAll(points); 
googleMap.addPolyline(polyline);