2013-07-02 75 views
38

tôi có mã số sau đây vẽ các polylines cho tôi và làm việc tốt, Nhưng vấn đề là nó không vẽ các đường tương tác, đường vẽ bị thiếu một số điểm ảnh!Làm thế nào để vẽ tương tác Polyline trên tuyến đường google maps v2 android

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.Polyline; 
import com.google.android.gms.maps.model.PolylineOptions; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.graphics.Color; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class testRoute extends FragmentActivity implements OnClickListener { 

    private GoogleMap myMap; 
    Polyline line; 
    Context context; 

    // Static LatLng 
    LatLng startLatLng = new LatLng(30.707104, 76.690749); 
    LatLng endLatLng = new LatLng(30.721419, 76.730017); 

    public void onCreate(Bundle bd) { 
     super.onCreate(bd); 
     setContentView(R.layout.passanger_home_call); 
     context = testRoute.this; 

     // Temp GetTrails Button 
     Button btntemp = (Button) findViewById(R.id.btn_pass_home_call_temp); 
     btntemp.setOnClickListener(this); 

     // GoogleMap myMap 
     myMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map_pass_home_call)).getMap(); 
     myMap.setMyLocationEnabled(true); 
     myMap.moveCamera(CameraUpdateFactory.newLatLng(startLatLng)); 
     myMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 

     // Now auto clicking the button 
     btntemp.performClick(); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 
     case R.id.btn_pass_home_call_temp: 
      String urlTopass = makeURL(startLatLng.latitude, 
        startLatLng.longitude, endLatLng.latitude, 
        endLatLng.longitude); 
      new connectAsyncTask(urlTopass).execute(); 
      break; 

     default: 
      break; 
     } 

    } 

    private class connectAsyncTask extends AsyncTask<Void, Void, String> { 
     private ProgressDialog progressDialog; 
     String url; 

     connectAsyncTask(String urlPass) { 
      url = urlPass; 
     } 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      progressDialog = new ProgressDialog(context); 
      progressDialog.setMessage("Fetching route, Please wait..."); 
      progressDialog.setIndeterminate(true); 
      progressDialog.show(); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      JSONParser jParser = new JSONParser(); 
      String json = jParser.getJSONFromUrl(url); 
      return json; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      progressDialog.hide(); 
      if (result != null) { 
       drawPath(result); 
      } 
     } 
    } 

    public String makeURL(double sourcelat, double sourcelog, double destlat, 
      double destlog) { 
     StringBuilder urlString = new StringBuilder(); 
     urlString.append("http://maps.googleapis.com/maps/api/directions/json"); 
     urlString.append("?origin=");// from 
     urlString.append(Double.toString(sourcelat)); 
     urlString.append(","); 
     urlString.append(Double.toString(sourcelog)); 
     urlString.append("&destination=");// to 
     urlString.append(Double.toString(destlat)); 
     urlString.append(","); 
     urlString.append(Double.toString(destlog)); 
     urlString.append("&sensor=false&mode=driving&alternatives=true"); 
     return urlString.toString(); 
    } 

    public class JSONParser { 

     InputStream is = null; 
     JSONObject jObj = null; 
     String json = ""; 

     // constructor 
     public JSONParser() { 
     } 

     public String getJSONFromUrl(String url) { 

      // Making HTTP request 
      try { 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(is, "iso-8859-1"), 8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 

       json = sb.toString(); 
       is.close(); 
      } catch (Exception e) { 
       Log.e("Buffer Error", "Error converting result " + e.toString()); 
      } 
      return json; 

     } 
    } 

    public void drawPath(String result) { 
     if (line != null) { 
      myMap.clear(); 
     } 
     myMap.addMarker(new MarkerOptions().position(endLatLng).icon(
       BitmapDescriptorFactory.fromResource(R.drawable.redpin_marker))); 
     myMap.addMarker(new MarkerOptions().position(startLatLng).icon(
       BitmapDescriptorFactory.fromResource(R.drawable.redpin_marker))); 
     try { 
      // Tranform the string into a json object 
      final JSONObject json = new JSONObject(result); 
      JSONArray routeArray = json.getJSONArray("routes"); 
      JSONObject routes = routeArray.getJSONObject(0); 
      JSONObject overviewPolylines = routes 
        .getJSONObject("overview_polyline"); 
      String encodedString = overviewPolylines.getString("points"); 
      List<LatLng> list = decodePoly(encodedString); 

      for (int z = 0; z < list.size() - 1; z++) { 
       LatLng src = list.get(z); 
       LatLng dest = list.get(z + 1); 
       line = myMap.addPolyline(new PolylineOptions() 
         .add(new LatLng(src.latitude, src.longitude), 
           new LatLng(dest.latitude, dest.longitude)) 
         .width(5).color(Color.BLUE).geodesic(true)); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    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; 
    } 
} 

Mã được làm việc tốt và Vẽ Route từ nơi này sang nơi khác nhưng không vẽ đường tương tác

Screent Shot: - enter image description here

Tôi nghĩ rằng vấn đề là với phương pháp drawPath() tôi:

public void drawPath(String result) { 
     if (line != null) { 
      myMap.clear(); 
     } 
     myMap.addMarker(new MarkerOptions().position(endLatLng).icon(
       BitmapDescriptorFactory.fromResource(R.drawable.redpin_marker))); 
     myMap.addMarker(new MarkerOptions().position(startLatLng).icon(
       BitmapDescriptorFactory.fromResource(R.drawable.redpin_marker))); 
     try { 
      // Tranform the string into a json object 
      final JSONObject json = new JSONObject(result); 
      JSONArray routeArray = json.getJSONArray("routes"); 
      JSONObject routes = routeArray.getJSONObject(0); 
      JSONObject overviewPolylines = routes 
        .getJSONObject("overview_polyline"); 
      String encodedString = overviewPolylines.getString("points"); 
      List<LatLng> list = decodePoly(encodedString); 

      for (int z = 0; z < list.size() - 1; z++) { 
       LatLng src = list.get(z); 
       LatLng dest = list.get(z + 1); 
       line = myMap.addPolyline(new PolylineOptions() 
         .add(new LatLng(src.latitude, src.longitude), 
           new LatLng(dest.latitude, dest.longitude)) 
         .width(5).color(Color.BLUE).geodesic(true)); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Bỏ qua Các điểm đánh dấu chỉ đề nghị tôi về việc thêm polyline tương tác?

+2

Bạn có ý gì khi nói các đường polylines/tuyến tương tác? –

+0

@ MaciejGórski cảm ơn bạn đã trả lời! tôi có nghĩa là dòng màu xanh đang được vẽ trên bản đồ là không tương tác, dòng màu xanh thiếu một số điểm ảnh! hãy nhìn vào màn hình Shot! –

+0

@Tarsem Tôi đang trong quá trình tạo một lớp tấm nồi hơi để mọi người dễ dàng thực hiện GDirection/polyline và tôi đã mượn một số mã của bạn. Xin vui lòng cho tôi biết nếu bạn không phiền nếu tôi sử dụng nó, tôi tất nhiên sẽ tín dụng bạn. Nếu bạn cần bạn có thể liên hệ với tôi trên Twitter: beckahsheeler Cảm ơn bạn! – beckah

Trả lời

58

Thay vì tạo ra quá nhiều ngắn Polyline s chỉ cần tạo một mặt hàng như ở đây:

PolylineOptions options = new PolylineOptions().width(5).color(Color.BLUE).geodesic(true); 
for (int z = 0; z < list.size(); z++) { 
    LatLng point = list.get(z); 
    options.add(point); 
} 
line = myMap.addPolyline(options); 

Tôi cũng không chắc chắn bạn nên sử dụng geodesic khi các điểm của bạn ở gần nhau.

+2

là nó có thể phát hiện nhấp chuột trên polyline? –

+3

tôi nghĩ cho câu trả lời có thể là 'Có' hoặc 'Không'. Không bao giờ là một ý tưởng hay khi tạo một câu hỏi mới. –

+4

@MuhammadBabar Sau đó, câu trả lời của tôi sẽ là 'Có'. –

25

tôi đã tạo ra một vài hướng dẫn bản đồ mà sẽ bao gồm những gì bạn cần

Animating the map mô tả howto tạo polylines dựa trên một tập hợp các LatLngs. Using Google APIs on your map : Directions and Places mô tả cách sử dụng API chỉ đường và tạo hoạt ảnh cho một điểm đánh dấu dọc theo đường dẫn.

Hãy xem hai hướng dẫn này và Github project chứa ứng dụng mẫu.

Nó chứa một số mẹo để làm cho mã sạch hơn và hiệu quả hơn:

  • Sử dụng Thư viện HTTP Google để truy cập API hiệu quả hơn và xử lý JSON dễ dàng.
  • Sử dụng google-map-utils thư viện cho các chức năng bản đồ liên quan đến (như giải mã polylines)
  • dấu hiệu ứng động
5

Bạn nên sử dụng options.addAll(allPoints); thay vì options.add(point);

6

Bạn có thể sử dụng phương pháp này để vẽ polyline on googlemap

// Draw polyline on map 
public void drawPolyLineOnMap(List<LatLng> list) { 
    PolylineOptions polyOptions = new PolylineOptions(); 
    polyOptions.color(Color.RED); 
    polyOptions.width(5); 
    polyOptions.addAll(list); 

    googleMap.clear(); 
    googleMap.addPolyline(polyOptions); 

    LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
    for (LatLng latLng : list) { 
     builder.include(latLng); 
    } 

    final LatLngBounds bounds = builder.build(); 

    //BOUND_PADDING is an int to specify padding of bound.. try 100. 
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, BOUND_PADDING); 
    googleMap.animateCamera(cu); 
} 

Bạn cần phải thêm dòng này trong gradle của bạn trong trường hợp bạn không có.

compile 'com.google.android.gms:play-services-maps:8.4.0' 
Các vấn đề liên quan