1、比较:
GPS准确度高但耗电多,网络定位耗电少但准确度低
2、代码
①添加权限:
AndroidManifest.xml:
<!-- 两种provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 仅网络定位的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
②Java代码:
public class MainActivity extends Activity { //定位都要通过LocationManager这个类实现 private LocationManager locationManager; private String provider; @SuppressWarnings("static-access") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取定位服务 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //获取当前可用的位置控制器 List<String> list = locationManager.getProviders(true); if (list.contains(LocationManager.GPS_PROVIDER)) { //是否为GPS位置控制器 provider = LocationManager.GPS_PROVIDER; } else if (list.contains(LocationManager.NETWORK_PROVIDER)) { //是否为网络位置控制器 provider = LocationManager.NETWORK_PROVIDER; } else { Toast.makeText(this, "请检查网络或GPS是否打开", Toast.LENGTH_LONG).show(); return; } Location location = locationManager.getLastKnownLocation(provider); if (location != null) { //获取当前位置,这里只用到了经纬度 String string = "纬度为:" + location.getLatitude() + ",经度为:" + location.getLongitude(); } //绑定定位事件,监听位置是否改变 //第一个参数为控制器类型第二个参数为监听位置变化的时间间隔(单位:毫秒) //第三个参数为位置变化的间隔(单位:米)第四个参数为位置监听器 locationManager.requestLocationUpdates(provider, 2000, 2, locationListener); } LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location arg0) { // TODO Auto-generated method stub // 更新当前经纬度 } }; //关闭时解除监听器 @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (locationManager != null) { locationManager.removeUpdates(locationListener); } } }
计算两点地图坐标的距离 C#
private static double CalcMil(double X1, double Y1, double X2, double Y2) { double PI = 3.1415926535898; double EARTH_RADIUS = 6378137; //地球半径 double CurRadLong = 0; //两点经纬度的弧度 double CurRadLat = 0; double PreRadLong = 0; double PreRadLat = 0; double a = 0, b = 0; //经纬度弧度差 double MilValue = 0; //将经纬度换算成弧度 CurRadLong = (double)(X1); CurRadLong = CurRadLong * PI / 180.0; PreRadLong = (double)(X2); PreRadLong = PreRadLong * PI / 180.0; CurRadLat = (double)(Y1); CurRadLat = CurRadLat * PI / 180.0f; PreRadLat = (double)(Y2); PreRadLat = PreRadLat * PI / 180.0f; //计算经纬度差值 if (CurRadLat > PreRadLat) { a = CurRadLat - PreRadLat; } else { a = PreRadLat - CurRadLat; } if (CurRadLong > PreRadLong) { b = CurRadLong - PreRadLong; } else { b = PreRadLong - CurRadLong; } MilValue = 2 * Math.Asin(Math.Sqrt(Math.Sin(a / 2.0) * Math.Sin(a / 2.0) + Math.Cos(CurRadLat) * Math.Cos(PreRadLat) * Math.Sin(b / 2.0) * Math.Sin(b / 2.0))); MilValue = (double)(EARTH_RADIUS * MilValue); return MilValue; }
计算两点地图坐标的距离 Java
/** * Created by yuliang on 2015/3/20. */ public class LocationUtils { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * 通过经纬度获取距离(单位:米) * @param lat1 * @param lng1 * @param lat2 * @param lng2 * @return */ public static double getDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.round(s * 10000d) / 10000d; s = s*1000; return s; } }