作者:皇皇

        移动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, "行驶路线");

android ionic 定位 android定位功能实现_移动


                                                                                                结果图一

android ionic 定位 android定位功能实现_supermap_02


                                                                                                结果图二