EX10_02.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:8k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex10_02; 
  2. import java.text.DecimalFormat;
  3. import java.text.NumberFormat;
  4. import java.util.List;
  5. import android.app.AlertDialog;
  6. import android.content.Context;
  7. import android.content.DialogInterface;
  8. import android.os.Bundle; 
  9. import android.view.View; 
  10. import android.widget.Button; 
  11. import android.widget.TextView;
  12. import android.location.Criteria;
  13. import android.location.Location;
  14. import android.location.LocationListener;
  15. import android.location.LocationManager;
  16. import com.google.android.maps.GeoPoint;
  17. import com.google.android.maps.MapActivity;
  18. import com.google.android.maps.MapController;
  19. import com.google.android.maps.MapView;
  20. import com.google.android.maps.Overlay;
  21. public class EX10_02  extends MapActivity
  22. {
  23.   private TextView mTextView;
  24.   private Button mButton01;
  25.   private Button mButton02;
  26.   private Button mButton03;
  27.   private Button mButton04;
  28.   private MapView mMapView;
  29.   private MapController mMapController;
  30.   private LocationManager mLocationManager;
  31.   private Location mLocation;
  32.   private String mLocationPrivider="";
  33.   private int zoomLevel=0;
  34.   private GeoPoint gp1;
  35.   private GeoPoint gp2;
  36.   private boolean _run=false;
  37.   private double distance=0;
  38.   
  39.   @Override 
  40.   public void onCreate(Bundle savedInstanceState) 
  41.   { 
  42.     super.onCreate(savedInstanceState); 
  43.     setContentView(R.layout.main); 
  44.     
  45.     /* 创建MapView对象 */ 
  46.     mMapView = (MapView)findViewById(R.id.myMapView1); 
  47.     mMapController = mMapView.getController();
  48.     /* 对象初始化 */
  49.     mTextView = (TextView)findViewById(R.id.myText1);
  50.     mButton01 = (Button)findViewById(R.id.myButton1);
  51.     mButton02 = (Button)findViewById(R.id.myButton2);
  52.     mButton03 = (Button)findViewById(R.id.myButton3);
  53.     mButton04 = (Button)findViewById(R.id.myButton4);
  54.     /* 设置默认的放大层级 */
  55.     zoomLevel = 17; 
  56.     mMapController.setZoom(zoomLevel); 
  57.     /* Provider初始化 */
  58.     mLocationManager = (LocationManager)
  59.                        getSystemService(Context.LOCATION_SERVICE);
  60.     /* 取得Provider与Location */
  61.     getLocationPrivider();
  62.     if(mLocation!=null)
  63.     {
  64.       /* 取得目前的经纬度 */
  65.       gp1=getGeoByLocation(mLocation);
  66.       gp2=gp1;
  67.       /* 将MapView的中点移至目前位置 */
  68.       refreshMapView();
  69.       /* 设置事件的Listener */
  70.       mLocationManager.requestLocationUpdates(mLocationPrivider,
  71.           2000, 10, mLocationListener);
  72.     }
  73.     else
  74.     {
  75.       new AlertDialog.Builder(EX10_02.this).setTitle("系统信息")
  76.       .setMessage(getResources().getString(R.string.str_message))
  77.       .setNegativeButton("确定",new DialogInterface.OnClickListener()
  78.        {
  79.          public void onClick(DialogInterface dialog, int which)
  80.          {
  81.            EX10_02.this.finish();
  82.          }
  83.        })
  84.        .show();
  85.     }
  86.     
  87.     /* 开始记录的Button */
  88.     mButton01.setOnClickListener(new Button.OnClickListener() 
  89.     { 
  90.       @Override 
  91.       public void onClick(View v) 
  92.       { 
  93.         gp1=gp2;
  94.         /* 清除Overlay */
  95.         resetOverlay();
  96.         /* 画起点 */
  97.         setStartPoint();
  98.         /* 更新MapView */
  99.         refreshMapView();
  100.         /* 重设移动距离为0,并更新TextView */
  101.         distance=0;
  102.         mTextView.setText("移动距离:0M");
  103.         /* 启动画路线的机制 */
  104.         _run=true;
  105.       } 
  106.     });
  107.     
  108.     /* 结束记录的Button */
  109.     mButton02.setOnClickListener(new Button.OnClickListener() 
  110.     { 
  111.       @Override 
  112.       public void onClick(View v) 
  113.       { 
  114.         /* 画终点 */
  115.         setEndPoint();
  116.         /* 更新MapView */
  117.         refreshMapView();
  118.         /* 终止画路线的机制 */
  119.         _run=false;
  120.       }
  121.     });
  122.     
  123.     /* 缩小地图的Button */
  124.     mButton03.setOnClickListener(new Button.OnClickListener() 
  125.     { 
  126.       @Override 
  127.       public void onClick(View v) 
  128.       { 
  129.         zoomLevel--; 
  130.         if(zoomLevel<1) 
  131.         { 
  132.           zoomLevel = 1; 
  133.         } 
  134.         mMapController.setZoom(zoomLevel); 
  135.       } 
  136.     }); 
  137.     
  138.     /* 放大地图的Button */
  139.     mButton04.setOnClickListener(new Button.OnClickListener() 
  140.     { 
  141.       @Override 
  142.       public void onClick(View v) 
  143.       { 
  144.         zoomLevel++; 
  145.         if(zoomLevel>mMapView.getMaxZoomLevel()) 
  146.         { 
  147.           zoomLevel = mMapView.getMaxZoomLevel(); 
  148.         } 
  149.         mMapController.setZoom(zoomLevel); 
  150.       }
  151.     }); 
  152.   }
  153.   
  154.   /* MapView的Listener */
  155.   public final LocationListener mLocationListener = 
  156.     new LocationListener() 
  157.   { 
  158.     @Override 
  159.     public void onLocationChanged(Location location) 
  160.     { 
  161.       /* 如果记录进行中,就画路线并更新移动距离 */
  162.       if(_run)
  163.       {
  164.         /* 记下移动后的位置 */
  165.         gp2=getGeoByLocation(location);
  166.         /* 画路线 */
  167.         setRoute();
  168.         /* 更新MapView */
  169.         refreshMapView();
  170.         /* 取得移动距离 */
  171.         distance+=GetDistance(gp1,gp2);
  172.         mTextView.setText("移动距离:"+format(distance)+"M"); 
  173.         gp1=gp2;
  174.       }
  175.     } 
  176.      
  177.     @Override 
  178.     public void onProviderDisabled(String provider) 
  179.     { 
  180.     } 
  181.     @Override 
  182.     public void onProviderEnabled(String provider) 
  183.     { 
  184.     } 
  185.     @Override 
  186.     public void onStatusChanged(String provider,int status,
  187.                                 Bundle extras) 
  188.     { 
  189.     } 
  190.   }; 
  191.   /* 取得GeoPoint的方法 */ 
  192.   private GeoPoint getGeoByLocation(Location location) 
  193.   { 
  194.     GeoPoint gp = null; 
  195.     try 
  196.     { 
  197.       if (location != null) 
  198.       { 
  199.         double geoLatitude = location.getLatitude()*1E6; 
  200.         double geoLongitude = location.getLongitude()*1E6; 
  201.         gp = new GeoPoint((int) geoLatitude, (int) geoLongitude);
  202.       } 
  203.     } 
  204.     catch(Exception e) 
  205.     { 
  206.       e.printStackTrace(); 
  207.     }
  208.     return gp;
  209.   } 
  210.   
  211.   /* 取得LocationProvider */
  212.   public void getLocationPrivider() 
  213.   { 
  214.     Criteria mCriteria01 = new Criteria();
  215.     mCriteria01.setAccuracy(Criteria.ACCURACY_FINE); 
  216.     mCriteria01.setAltitudeRequired(false); 
  217.     mCriteria01.setBearingRequired(false); 
  218.     mCriteria01.setCostAllowed(true); 
  219.     mCriteria01.setPowerRequirement(Criteria.POWER_LOW); 
  220.     
  221.     mLocationPrivider = mLocationManager
  222.                         .getBestProvider(mCriteria01, true); 
  223.     mLocation = mLocationManager
  224.                 .getLastKnownLocation(mLocationPrivider);
  225.   }
  226.   /* 设置起点的方法 */
  227.   private void setStartPoint()
  228.   {
  229.     int mode=1;
  230.     MyOverLay mOverlay = new MyOverLay(gp1,gp2,mode);
  231.     List<Overlay> overlays = mMapView.getOverlays();
  232.     overlays.add(mOverlay);
  233.   }
  234.   /* 设置路线的方法 */
  235.   private void setRoute() 
  236.   {  
  237.     int mode=2;
  238.     MyOverLay mOverlay = new MyOverLay(gp1,gp2,mode);
  239.     List<Overlay> overlays = mMapView.getOverlays();
  240.     overlays.add(mOverlay);
  241.   }
  242.   /* 设置终点的方法 */
  243.   private void setEndPoint() 
  244.   {  
  245.     int mode=3;
  246.     MyOverLay mOverlay = new MyOverLay(gp1,gp2,mode);
  247.     List<Overlay> overlays = mMapView.getOverlays();
  248.     overlays.add(mOverlay);
  249.   }
  250.   /* 重设Overlay的方法 */
  251.   private void resetOverlay() 
  252.   {
  253.     List<Overlay> overlays = mMapView.getOverlays();
  254.     overlays.clear();
  255.   } 
  256.   /* 更新MapView的方法 */
  257.   public void refreshMapView() 
  258.   { 
  259.     mMapView.displayZoomControls(true); 
  260.     MapController myMC = mMapView.getController(); 
  261.     myMC.animateTo(gp2);
  262.     myMC.setZoom(zoomLevel); 
  263.     mMapView.setSatellite(false); 
  264.   } 
  265.   
  266.   /* 取得两点间的距离的方法 */
  267.   public double GetDistance(GeoPoint gp1,GeoPoint gp2)
  268.   {
  269.     double Lat1r = ConvertDegreeToRadians(gp1.getLatitudeE6()/1E6);
  270.     double Lat2r = ConvertDegreeToRadians(gp2.getLatitudeE6()/1E6);
  271.     double Long1r= ConvertDegreeToRadians(gp1.getLongitudeE6()/1E6);
  272.     double Long2r= ConvertDegreeToRadians(gp2.getLongitudeE6()/1E6);
  273.     /* 地球半径(KM) */
  274.     double R = 6371;
  275.     double d = Math.acos(Math.sin(Lat1r)*Math.sin(Lat2r)+
  276.                Math.cos(Lat1r)*Math.cos(Lat2r)*
  277.                Math.cos(Long2r-Long1r))*R;
  278.     return d*1000;
  279.   }
  280.   private double ConvertDegreeToRadians(double degrees)
  281.   {
  282.     return (Math.PI/180)*degrees;
  283.   }
  284.   
  285.   /* format移动距离的方法 */
  286.   public String format(double num)
  287.   {
  288.     NumberFormat formatter = new DecimalFormat("###");
  289.     String s=formatter.format(num);
  290.     return s;
  291.   }
  292.   
  293.   @Override
  294.   protected boolean isRouteDisplayed()
  295.   {
  296.     return false;
  297.   }
  298. }