热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

supermapmysql_SuperMapiMobileforAndroid定位实现

作者:皇皇移动GIS经常需要获取当前位置信息,实现定位操作。用SuperMapiMoubleforAndroid如何去获取当前位置信息呢?

作者:皇皇

移动GIS经常需要获取当前位置信息,实现定位操作。用SuperMap iMouble for Android如何去获取当前位置信息呢?下面以“获取当前位置并显示在地图上”为例子,给大家演示实现步骤。

一、 获取位置信息

要想实现定位,首先要获取当前的坐标位置。Android中有GPS定位、WIFI定准、基站定位、AGPS定位4种方式,其中GPS定位和AGPS定位是常用。它们特点如下:

GPS定位:定位慢,准确度高,受环境影响大

Network(AGPS定位):定位快,准确度低,受环境影响小。

现在把它们两结合起来实现又快又准的定位

1. 添加权限

AndroidManifest.xml文件里需要添加的权限

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

结果图一

结果图二



推荐阅读
author-avatar
LIN-少爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有