6

पर एक निर्दिष्ट मार्ग को हाइलाइट करें, इसलिए मैं वर्तमान में दो स्थानों के बीच मार्ग पुनर्प्राप्त करने के लिए अपने ऐप में Google दिशा-निर्देश API का उपयोग कर रहा हूं।Google मानचित्र v2 एंड्रॉइड

जब मैं मार्ग दिशाओं के लिए अनुरोध भेजता हूं, तो मार्ग के साथ प्रत्येक सड़क के नाम सहित मार्ग के बारे में JSON में कई विवरण पुनर्प्राप्त करते हैं, उनके संबंधित प्रारंभ और अंत लैट-लम्बे समन्वय, और उनकी पॉलीलाइन मूल्य।

उदाहरण के लिए: यदि मैं दो सड़कों के बीच http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false अनुरोध भेजता हूं, तो मुझे निम्नलिखित JSON प्रतिक्रिया (मार्ग के साथ एक सड़क के लिए आउटपुट) मिलता है।

{ 
        "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"** 
        }, 

अब तक अपने आवेदन में इस जानकारी को पार्स करता है और केवल सड़कों और इस प्रकार की सूची को ध्यान में रखते निर्देश दिखाने वाले:

enter image description here

मैं इसे करने के लिए एक से पूरे मार्ग पर प्रकाश डाला आपकी क्या अपेक्षाएं हैं बी मानचित्र पर, हालांकि मुझे नए Google मानचित्र API v2 पर ऐसा करने के तरीके पर ऑनलाइन कुछ भी उपयोगी नहीं मिला है। मैं देखता हूं कि Google मानचित्र v2 पर लाइनों को आकर्षित करने के लिए ओवरले के बजाय पॉलीलाइन का उपयोग किया जाता है, हालांकि मैं जो कह सकता हूं उससे, वे केवल सीधी रेखाएं खींचते हैं जो मेरे लिए बेकार है। क्या मेरे पास मेरे पास मौजूद जानकारी का उपयोग कर मार्ग को हाइलाइट करने का कोई तरीका है (सड़क के नाम, & अंत लैट-लांग कोऑर्डिनेट्स, पॉलीलाइन पॉइंट्स? किसी भी मदद की सराहना की जाती है।

इसके अलावा, मुझे लगता है कि एक 'पॉलीलाइन है 'जवाब में मूल्य उपयोगी हो सकता है, लेकिन जो मैं बाहर काम नहीं कर सकता कैसे पार्स करने के लिए या जानकारी के इस बिट का उपयोग करें। किसी को भी पता है कि कैसे मैं यह मान का मतलब कर सकते हैं एक पॉलीलाइन साजिश?

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

संपादित करें : मेरा समाधान कोड नीचे दिए गए मेरे उत्तर में प्रदान किया गया है।

उत्तर

34

अंततः मैं बहुत परीक्षण और त्रुटि के बाद इसे काम करने में कामयाब रहा! यह अब मानचित्र पर ए से बी के निर्दिष्ट मार्ग को पूरी तरह से हाइलाइट करता है (जैसा कि नीचे मेरे स्क्रीनशॉट में देखा गया है)। मैंने अपने कोड में किसी भी ऐसे व्यक्ति के लिए फेंक दिया है जिसकी भविष्य में इसकी आवश्यकता हो सकती है।

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

इससे मुझे बहुत मदद मिलती है। धन्यवाद। यदि आप उसी मानचित्र का पुन: उपयोग करना चाहते हैं तो आपको पॉलीलाइन लाइन को ऐरे में सहेजने पर विचार करना चाहिए, जिसके साथ आप उस मानचित्र से लाइन्स हटा सकते हैं। –

+0

वैसे एक सह-घटनाएं हैं, मैंने आजकल यह पता लगाने की कोशिश की कि लाइन.remove() क्यों काम नहीं कर रही थी। धन्यवाद! –

+0

अपने कोड को जोड़ने के लिए धन्यवाद :) –

2

एंड्रॉइड मैप्स एपीआई 2 के साथ आपको वास्तव मेंका उपयोग करने की आवश्यकता है मानचित्र पर मार्ग खींचने के लिएवर्ग (कम से कम यह एक आसान तरीका है :))। आपको क्या करना है - अपने मार्ग के साथ बिंदुओं की सूची प्रदान करना है।

सक्रिय मार्ग पर प्रकाश डाला के लिए के रूप में - वहाँ Polyline वर्ग setColor में एक आसान इंटरफेस है, तो आप सेट कर सकते हैं जो कुछ भी रंग आप सक्रिय मार्ग करना चाहते हैं (अल्फ़ा चैनल सहित)

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 

कृपया ध्यान दें आप कर रहे हैं पॉलीलाइन रंग किसी भी समय आप चाहते हैं (उपयोगकर्ता क्लिक पर फाई, या कुछ और)

गूगल से JSON प्रतिक्रिया के लिए के रूप में बदलने के लिए स्वतंत्र -, मार्ग बिंदुओं इनकोड ताकि आप this question का उल्लेख कर सकते को समझने के लिए डिकोड करने के लिए यह

+0

ठीक है, अगर आपके सड़क उस में 10 अंक है, पोलीलाइन 10 (वास्तव में 9) सीधे एक दूसरे से जुड़े लाइनों आकर्षित करेगा .. कितने अंक आपके मार्ग में और उन बिंदुओं के वास्तविक निर्देशांक हैं - यह जानकारी 'अंक' फ़ील्ड में एन्कोड की गई है –

+0

इसे काम करने के लिए मिला: डी धन्यवाद! –

1

एक सरल उपाय

एक पुस्तकालय

संकलन 'com.google.maps.android:android-maps-utils:0 जोड़े नहीं है। से 4 '

संदर्भ https://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); 
संबंधित मुद्दे