作者:皇皇
移动GIS经常需要获取当前位置信息,实现定位操作。用SuperMap iMouble for Android如何去获取当前位置信息呢?下面以“获取当前位置并显示在地图上”为例子,给大家演示实现步骤。
一、 获取位置信息
要想实现定位,首先要获取当前的坐标位置。Android中有GPS定位、WIFI定准、基站定位、AGPS定位4种方式,其中GPS定位和AGPS定位是常用。它们特点如下:
GPS定位:定位慢,准确度高,受环境影响大
Network(AGPS定位):定位快,准确度低,受环境影响小。
现在把它们两结合起来实现又快又准的定位
1. 添加权限
AndroidManifest.xml文件里需要添加的权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2. 确保设备GPS定位服务开启或者网络可用
用代码检测到GPS定位服务未开启并且网络不可用时,提醒用户在设置里面开启GPS定位服务或者连通网络。
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// GPS定位服务是否开启
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// 网络是否可用
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
3. 获取当前位置
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
//同时开启GPS定位和网络定位 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000*2,50,GPSLocationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000*2, 50,NETWORKLocationListener);
//监听位置信息的改变
private final LocationListener GPSLocationListener =new LocationListener()
{
//当坐标改变时触发此函数
public void onLocationChanged(Location location)
{
updateWithNewLocation(location);
// 获得GPS服务后,移除network监听
if (location !=null) {
locationManager.removeUpdates(NETWORKLocationListener);
}
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider){}
//Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
public void onStatusChanged(String provider,int status,Bundle extras)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000*2, 50,NETWORKLocationListener);
}
};
在NETWORKLocationListener监听里面,除了不用移除GPSLocationListener,其他代码一样。
开始的时候我们同时开启了GPS定位和网络定位,GPS第一次定位反应慢就用网络定位,当GPS定位成功后移除网络定位。GPS定位断开又添加网络定位。
//监听到位置发生改变,对位置进行更新
private void updateWithNewLocation(Location location)
{
if(location !=null){
//获得经纬度
Point2D point2d0=new Point2D();
point2d0.setX(location.getLongitude());
point2d0.setY(location.getLatitude());
}
}
二、 坐标转换
用GPS获取到的坐标是地理坐标系WGS 1984下的Point2D点对象,但是很多情况地图的坐标系并不是这个,当坐标系不一致的时候,定位就会有偏差,所以需要进行投影转换。
CoordSysTranslator coordSysTranslator=new CoordSysTranslator();
//获取地图坐标系
PrjCoordSys prjCoordSys = mapControl.getMap().getPrjCoordSys();
//坐标系转换
Point2Ds point2ds=new Point2Ds();
point2ds.add(point2d0);
Boolean isOk=CoordSysTranslator.forward(point2ds,prjCoordSys);
Point2D point2d=point2ds.getItem(0);
对于那些经过加密平移的地图,就不能用上述的投影转换,需要地图供应商提供加密偏移的算法把Point2D点对象进行加密偏移.
三、 地图显示位置
根据项目需求显示位置信息,比如显示行驶路线
//把路途上定位的点构成线对象
Point2Ds point2ds=new Point2Ds();
point2ds.add(point2d);
point2ds.add(new Point2D(1.23456, 13456));
GeoLine geoline = new GeoLine();
geoline.addPart(point2ds);
//用红色线在地图显示行驶路线
GeoStyle geoStyle_L = new GeoStyle();
geoStyle_L.setLineColor(new Color(255,0,0));
geoStyle_L.setLineSymbolID(15);
geoStyle_L.setLineWidth(1.0);
geoline.setStyle(geoStyle_L);
mapControl.getMap().getTrackingLayer().add(geoline, "行驶路线");
结果图一
结果图二