阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1069|回复: 0

[转帖] Android 在map上画出路线

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-5 11:20:07 | 显示全部楼层 |阅读模式
    package net.blogjava.mobile.map;   
    import java.util.List;   
    import Android.app.AlertDialog;   
    import android.graphics.Bitmap;   
    import android.graphics.BitmapFactory;   
    import android.graphics.Canvas;   
    import android.graphics.Color;   
    import android.graphics.Paint;   
    import android.graphics.Path;   
    import android.graphics.Point;   
    import android.location.Address;   
    import android.location.Geocoder;   
    import android.os.Bundle;   
    import android.view.Menu;   
    import com.google.android.maps.GeoPoint;   
    import com.google.android.maps.MapActivity;   
    import com.google.android.maps.MapController;   
    import com.google.android.maps.MapView;   
    import com.google.android.maps.Overlay;   
    import com.google.android.maps.Projection;   
    public class Main extends MapActivity {   
    private GeoPoint gpoint1, gpoint2, gpoint3;// 连线的点   
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        MapView mapView = (MapView) findViewById(R.id.mapview);   
        mapView.setClickable(true);   
        mapView.setBuiltInZoomControls(true);   
        MapController mapController = mapView.getController();   
        mapView.setTraffic(true);// 交通图   
        // mapView.setSatellite(true);//卫星图   
        // mapView.setStreetView(true);//街景   
        MyOverlay myOverlay = new MyOverlay();   
        mapView.getOverlays().add(myOverlay);   
        mapController.setZoom(15);// 初始放大倍数   
        gpoint1 = new GeoPoint((int) (24.477384 * 1000000),   
         (int) (118.158216 * 1000000));   
        gpoint2 = new GeoPoint((int) (24.488967 * 1000000),   
         (int) (118.144277 * 1000000));   
        gpoint3 = new GeoPoint((int) (24.491091 * 1000000),   
         (int) (118.136781 * 1000000));   
        mapController.animateTo(gpoint1);   
    }   
    @Override  
    protected boolean isRouteDisplayed() {   
        // TODO Auto-generated method stub   
        return false;   
    }   
    class MyOverlay extends Overlay {   
        @Override  
        public void draw(Canvas canvas, MapView mapView, boolean shadow) {   
    // TODO Auto-generated method stub   
    super.draw(canvas, mapView, shadow);   
    // 画笔   
    Paint paint = new Paint();   
    paint.setColor(Color.RED);   
    paint.setDither(true);   
    paint.setStyle(Paint.Style.STROKE);   
    paint.setStrokeJoin(Paint.Join.ROUND);   
    paint.setStrokeCap(Paint.Cap.ROUND);   
    paint.setStrokeWidth(2);   
    Projection projection = mapView.getProjection();   
    Point p1 = new Point();   
    Point p2 = new Point();   
    Point p3 = new Point();   
    projection.toPixels(gpoint1, p1);   
    projection.toPixels(gpoint2, p2);   
    projection.toPixels(gpoint3, p3);   
    Path path = new Path();   
    path.moveTo(p1.x, p1.y);   
    path.lineTo(p2.x, p2.y);   
    path.lineTo(p3.x, p3.y);   
    canvas.drawPath(path, paint);// 画出路径   
        }   
    }   
    }  
    [代码] main.xml<?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
    androidrientation="vertical" android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
    <com.google.android.maps.MapView  
      android:id="@+id/mapview" android:layout_width="fill_parent"  
      android:layout_height="fill_parent"   
      android:apiKey="0IB7Kn70qp1LT216Hhb-jmHJ8GLTie4p63O77KQ" />  
    </LinearLayout>  
    [代码] [其他]代码最后别忘了加权限 :
    <uses-permission Android:name="android.permission.INTERNET"/>
    在<applacation></applacation>之间加<uses-library Android:name="com.google.android.maps" />
    [代码] 绘制路线图   /**  
    * 通过解析google map返回的xml,在map中画路线图  
    */  
    public void drawRoute(){   
       
    String url = "http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802" +   
       "&destination=23.046604,113.397510&sensor=false&mode=walking";   
       
    HttpGet get = new HttpGet(url);   
    String strResult = "";   
    try {   
      HttpParams httpParameters = new BasicHttpParams();   
      HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);   
      HttpClient httpClient = new DefaultHttpClient(httpParameters);   
         
      HttpResponse httpResponse = null;   
      httpResponse = httpClient.execute(get);   
         
      if (httpResponse.getStatusLine().getStatusCode() == 200){   
       strResult = EntityUtils.toString(httpResponse.getEntity());   
      }   
    } catch (Exception e) {   
      return;   
    }   
       
    if (-1 == strResult.indexOf("<status>OK</status>")){   
      Toast.makeText(this, "获取导航路线失败!", Toast.LENGTH_SHORT).show();   
      this.finish();   
      return;   
    }   
       
    int pos = strResult.indexOf("<overview_polyline>");   
    pos = strResult.indexOf("<points>", pos + 1);   
    int pos2 = strResult.indexOf("</points>", pos);   
    strResult = strResult.substring(pos + 8, pos2);   
       
    List<GeoPoint> points = decodePoly(strResult);   
       
    MyOverLay mOverlay = new MyOverLay(points);   
    List<Overlay> overlays = mMapView.getOverlays();   
    overlays.add(mOverlay);   
       
    if (points.size() >= 2){   
      mMapController.animateTo(points.get(0));   
    }   
      
    mMapView.invalidate();   
    }   


    /**  
    * 解析返回xml中overview_polyline的路线编码  
    *   
    * @param encoded  
    * @return  
    */  
    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;   
    }  


    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表