2012-09-04 59 views
0

以下是執行2點(origin, current location){geoPoint, "current Location"}Destination.{geoPoint1, "Desti Location2"}之間道路路徑或路線路徑的代碼。它對我來說工作得很好。當前位置與搜索地點之間的公路/路線圖

我的問題是如何處理當前位置到搜索位置之間的路徑路徑。這裏我是按鈕搜索位置的onClick,它顯示完美,但是我在參考 - >{current location(scrgeoPoint) to searched location(destgeopointsearch)}之間的路線圖中出現錯誤。

有人有什麼想法嗎?

//search button onclick 
    mapLocationBtn = (Button) findViewById(R.id.locationbutton); 
    mapLocationBtn.setVisibility(View.INVISIBLE); 
    mapLocationBtn.setOnClickListener(new View.OnClickListener() {    
      @Override 
      public void onClick(View v) {   
       String usrLoc = autoCompletetextView.getText().toString(); 
       Geocoder gc = new Geocoder(PlacesMapActivity.this);     
       try { 
        addr=gc.getFromLocationName(usrLoc, 3);//maximum 2 results 
        if(addr.size()>0){ 
         address=addr.get(0);//get the first result 
         convertLongi=address.getLongitude(); 
         convertLati=address.getLatitude(); 
         geopointsearch = new GeoPoint((int)(convertLati * 1E6), (int)(convertLongi * 1E6));          

        // Map geopointsearch overlay item 
         itemizedOverlay2 = new AddItemizedOverlay(drawable_client, PlacesMapActivity.this);  
         overlayitem = new OverlayItem(geopointsearch, "Your Location3", "R u Searching For me!"); 
         itemizedOverlay2.addOverlay(overlayitem);  
         mapOverlays.add(itemizedOverlay2); 
         itemizedOverlay2.populateNow(); 
         mc.animateTo(geopointsearch); 
        // mc.zoomIn(); 
        }      
       } catch (IOException e) {     
        e.printStackTrace(); 
       } 
      }         
     }); 

    // Map overlay item 
    itemizedOverlay = new AddItemizedOverlay(drawable_user, this); 
    overlayitem = new OverlayItem(geoPoint, "Your Location","That is you!"); 
    itemizedOverlay.addOverlay(overlayitem);   
    mapOverlays.add(itemizedOverlay); 
    itemizedOverlay.populateNow();  
    // Map client overlay item 
    itemizedOverlay1 = new AddItemizedOverlay(drawable_client, this);  
    overlayitem1 = new OverlayItem(geoPoint1, "Your Location2", "I am ur client!"); 
    itemizedOverlay1.addOverlay(overlayitem1);    
    mapOverlays.add(itemizedOverlay1); 
    itemizedOverlay1.populateNow(); 
    // Map near overlay item  
    itemizedOverlay = new AddItemizedOverlay(drawable, this); 

    mc = mapView.getController(); 

    // These values are used to get map boundary area 
    // The area where you can see all the markers on screen 
    int minLat = Integer.MAX_VALUE; 
    int minLong = Integer.MAX_VALUE; 
    int maxLat = Integer.MIN_VALUE; 
    int maxLong = Integer.MIN_VALUE; 

    // check for null in case it is null 
    if (nearPlaces.results != null) { 
     // loop through all the places 
     for (Place place : nearPlaces.results) { 
      latitude = place.geometry.location.lat; // latitude 
      longitude = place.geometry.location.lng; // longitude 

      // Geopoint to place on map 
      geoPoin = new GeoPoint((int) (latitude * 1E6), 
        (int) (longitude * 1E6)); 

      // Map overlay item 
      overlayitem = new OverlayItem(geoPoin, place.name, 
        place.vicinity); 

      itemizedOverlay.addOverlay(overlayitem); 

      // calculating map boundary area 
      minLat = (int) Math.min(geoPoin.getLatitudeE6(), minLat); 
      minLong = (int) Math.min(geoPoin.getLongitudeE6(), minLong); 
      maxLat = (int) Math.max(geoPoin.getLatitudeE6(), maxLat); 
      maxLong = (int) Math.max(geoPoin.getLongitudeE6(), maxLong); 
     } 
     mapOverlays.add(itemizedOverlay); 

     // showing all overlay items 
     itemizedOverlay.populateNow(); 
    } 

    DrawPath(geoPoint, geoPoint1, geopointsearch, Color.GREEN, mapView); 

    // Adjusting the zoom level so that you can see all the markers on map 
    mapView.getController().zoomToSpan(Math.abs(minLat - maxLat), Math.abs(minLong - maxLong)); 

    // Showing the center of the map 
    mc.animateTo(new GeoPoint((maxLat + minLat)/2, (maxLong + minLong)/2)); 
    mc.animateTo(geoPoint1); 

    mapView.postInvalidate(); 

} 

private void DrawPath(GeoPoint scrgeoPoint, GeoPoint destgeoPoint, GeoPoint destgeopointsearch, int green, MapView mMapView) { 
    HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(makeUrl(scrgeoPoint, destgeoPoint, destgeopointsearch)); 
     HttpResponse response; 
     try { 
      response = httpclient.execute(httppost); 

      HttpEntity entity = response.getEntity(); 
      InputStream is = null; 
      is = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line = "0"; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      reader.close(); 
      String result = sb.toString(); 
      JSONObject jsonObject = new JSONObject(result); 
      JSONArray routeArray = jsonObject.getJSONArray("routes"); 
      JSONObject routes = routeArray.getJSONObject(0); 

      // calculate the distance between 2 point 
      JSONArray legs = routes.getJSONArray("legs"); 
      Log.d("JSON","legs: "+legs.toString()); 
      JSONObject steps = legs.getJSONObject(0); 
      Log.d("JSON","steps: "+steps.toString()); 
      JSONObject distance = steps.getJSONObject("distance"); 
      Log.d("JSON","distance: "+distance.toString()); 
      String sDistance = distance.getString("text"); 
      int iDistance = distance.getInt("value");       
      distextView = (TextView) findViewById(R.id.distextView); 
      distextView.setText(distance.getString("text")); 

      JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); 
      String encodedString = overviewPolylines.getString("points"); 
      List<GeoPoint> pointToDraw = decodePoly(encodedString); 
      mMapView.getOverlays().add(new MyOverLay(pointToDraw)); 

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

private List<GeoPoint> decodePoly(String encoded) { 
    List<GeoPoint> poly = new ArrayList<GeoPoint>(); 
     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; 

      GeoPoint p = new GeoPoint((int) (((double) lat/1E5) * 1E6), 
        (int) (((double) lng/1E5) * 1E6)); 
      poly.add(p); 
     } 
     return poly; 
    } 

private String makeUrl(GeoPoint scrgeoPoint, GeoPoint destgeoPoint, GeoPoint destgeopointsearch) { 
    StringBuilder urlString = new StringBuilder(); 

    //Origin 
    urlString.append("http://maps.googleapis.com/maps/api/directions/json"); 
    urlString.append("?origin=");// from 
    urlString.append(Double.toString((double) scrgeoPoint.getLatitudeE6()/1.0E6)); 
    urlString.append(","); 
    urlString.append(Double.toString((double) scrgeoPoint.getLongitudeE6()/1.0E6)); 
    //Destination 
    urlString.append("&destination=");// to 
    urlString.append(Double.toString((double) destgeoPoint.getLatitudeE6()/1.0E6)); 
    urlString.append(","); 
    urlString.append(Double.toString((double) destgeoPoint.getLongitudeE6()/1.0E6)); 
    //search location 
    urlString.append("&destination=");// to 
    urlString.append(Double.toString((double) destgeopointsearch.getLatitudeE6()/1.0E6)); 
    urlString.append(","); 
    urlString.append(Double.toString((double) destgeopointsearch.getLongitudeE6()/1.0E6)); 


    urlString.append("&mode=walking&sensor=true");    
    Log.d("xxx", "URL=" + urlString.toString()); 
    return urlString.toString(); 
} 
+0

任何一個可以說我有沒有其他的方法來創建當前位置之間的道路路徑和搜索的位置... –

+0

@Michal是否對當前位置到搜索位置之間的道路路徑有任何想法。 –

+0

讓我知道它是否有效。如果有,請不要忘記接受答案。 – Michal

回答

1

據我瞭解,你需要保存你的位置和目的地,然後問谷歌的方向,可能是這樣的:(從this後兩者)

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345")); 
startActivity(intent); 

然後,您需要在許多點(從Google獲得)之間繪製線條/路徑,以實現路徑而不會穿過建築物和拐角。也許這代碼可能是勵志您:

private List<Overlay> mapOverlays; 

private Projection projection; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

linearLayout = (LinearLayout) findViewById(R.id.zoomview); 
mapView = (MapView) findViewById(R.id.mapview); 
mapView.setBuiltInZoomControls(true); 

mapOverlays = mapView.getOverlays();   
projection = mapView.getProjection(); 
mapOverlays.add(new MyOverlay());   

} 

@Override 
protected boolean isRouteDisplayed() { 
return false; 
} 

class MyOverlay extends Overlay{ 

public MyOverlay(){ 

} 

public void draw(Canvas canvas, MapView mapv, boolean shadow){ 
    super.draw(canvas, mapv, shadow); 

    Paint mPaint = new Paint(); 
    mPaint.setDither(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(2); 

    GeoPoint gP1 = new GeoPoint(19240000,-99120000); 
    GeoPoint gP2 = new GeoPoint(37423157, -122085008); 

    Point p1 = new Point(); 
    Point p2 = new Point(); 
    Path path = new Path(); 

    projection.toPixels(gP1, p1); 
    projection.toPixels(gP2, p2); 

    path.moveTo(p2.x, p2.y); 
    path.lineTo(p1.x,p1.y); 

    canvas.drawPath(path, mPaint); 
} 

(從this後服用。)

相關問題